From d7214d137333b8145d35ce4c825ec6970dc157ee Mon Sep 17 00:00:00 2001 From: Emiel Bruijntjes Date: Mon, 1 May 2017 22:06:28 +0200 Subject: [PATCH] added Addresses class to parse a comma separated list of addresses --- include/addresses.h | 100 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 include/addresses.h diff --git a/include/addresses.h b/include/addresses.h new file mode 100644 index 0000000..3af0e76 --- /dev/null +++ b/include/addresses.h @@ -0,0 +1,100 @@ +/** + * Addresses.h + * + * Class that contains multiple addresses + * + * @author Emiel Bruijntjes + * @copyright 2017 Copernica BV + */ + +/** + * Include guard + */ +#pragma once + +/** + * Begin of namespace + */ +namespace AMQP { + +/** + * Class definition + */ +class Addresses +{ +private: + /** + * The actual addresses + * @var std::vector
+ */ + std::vector
_addresses; + +public: + /** + * Constructor for a comma separated list + * @param buffer + * @param size + * @throws std::runtime_error + */ + Addresses(const char *buffer, size_t size) + { + // keep looping + while (true) + { + // look for the comma + const char *comma = memchr(buffer, ',', size); + + // stop if there is no comma + if (comma == nullptr) break; + + // size of the address + size_t addresssize = comma - buffer - 1; + + // add address + _addresses.emplace_back(buffer, addresssize); + + // update for next iteration + buffer += addresssize + 1; + size -= addresssize + 1; + } + + // do we have more? + if (size > 0) _addresses.emplace_back(buffer, size); + + // was anything found? + if (_addresses.size() > 0) return; + + // no addresses found + throw std::runtime_error("no addresses"); + } + + /** + * Destructed + */ + virtual ~Addresses() = default; + + /** + * Number of addresses + * @return size_t + */ + size_t size() const + { + return _addresses.size(); + } + + /** + * Expose an address by index + * @param index + * @return Address + */ + const Address &operator[](size_t index) const + { + return _addresses.at(index); + } +}; + +/** + * End of namespace + */ +} +