File: addresses.h

package info (click to toggle)
amqp-cpp 4.3.27-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 1,384 kB
  • sloc: cpp: 10,021; ansic: 191; makefile: 95
file content (119 lines) | stat: -rw-r--r-- 2,398 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
/**
 *  Addresses.h
 *  
 *  Class that contains multiple addresses
 * 
 *  @author Emiel Bruijntjes <emiel.bruijntjes@copernica.com>
 *  @copyright 2017 Copernica BV
 */

/**
 *  Include guard
 */
#pragma once

/**
 *  Dependencies
 */
#include <cstring>

/**
 *  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");
    }

    /**
     *  Constructor for a comma separated list
     *  @param  buffer
     *  @throws std::runtime_error
     */
    Addresses(const char *buffer) : Addresses(buffer, strlen(buffer)) {}

    /**
     *  Constructor for a comma separated list
     *  @param  buffer
     *  @throws std::runtime_error
     */
    Addresses(const std::string &buffer) : Addresses(buffer.data(), buffer.size()) {}

    /**
     *  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
 */
}