added Addresses class to parse a comma separated list of addresses
This commit is contained in:
parent
2a249ae7ea
commit
d7214d1373
|
|
@ -0,0 +1,100 @@
|
||||||
|
/**
|
||||||
|
* Addresses.h
|
||||||
|
*
|
||||||
|
* Class that contains multiple addresses
|
||||||
|
*
|
||||||
|
* @author Emiel Bruijntjes <emiel.bruijntjes@copernica.com>
|
||||||
|
* @copyright 2017 Copernica BV
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Include guard
|
||||||
|
*/
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Begin of namespace
|
||||||
|
*/
|
||||||
|
namespace AMQP {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class definition
|
||||||
|
*/
|
||||||
|
class Addresses
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
/**
|
||||||
|
* The actual addresses
|
||||||
|
* @var std::vector<Address>
|
||||||
|
*/
|
||||||
|
std::vector<Address> _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
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
Loading…
Reference in New Issue