1 #include <sstream>
2 #include <string>
3 
4 namespace witherspoon
5 {
6 namespace power
7 {
8 namespace util
9 {
10 
11 /**
12  * @class NamesValues
13  *
14  * Builds up a string of name=value pairs for use in
15  * situations like error log metadata.
16  *
17  * Names and values can be added to an instance of this
18  * class, and then calling get() will return a string
19  * that appends them all together.
20  *
21  * Currently, just uint64_t values that will be displayed
22  * in hex are supported.
23  *
24  * For example:
25  *     NamesValues m;
26  *     uint8_t d = 0xFF;
27  *
28  *     m.add("STATUS_VOUT", d);
29  *     m.add("STATUS_WORD", 0xABCD);
30  *
31  *     m.get() //returns: "STATUS_VOUT=0xFF|STATUS_WORD=0xABCD"
32  */
33 class NamesValues
34 {
35     public:
36 
37         NamesValues() = default;
38         NamesValues(const NamesValues&) = default;
39         NamesValues& operator=(const NamesValues&) = default;
40         NamesValues(NamesValues&&) = default;
41         NamesValues& operator=(NamesValues&&) = default;
42 
43         /**
44          * Adds a name/value pair to the object
45          *
46          * @param name - the name to add
47          * @param value - the value to add
48          */
49         void add(const std::string& name, uint64_t value)
50         {
51             addDivider();
52             addName(name);
53             addValue(value);
54         }
55 
56         /**
57          * Returns a formatted concatenation of all of the names and
58          * their values.
59          *
60          * @return string - "<name1>=<value1>|<name2>=<value2>..etc"
61          */
62         const std::string& get() const
63         {
64             return all;
65         }
66 
67     private:
68 
69         /**
70          * Adds a name to the object
71          *
72          * @param name - the name to add
73          */
74         void addName(const std::string& name)
75         {
76             all += name + '=';
77         }
78 
79         /**
80          * Adds a value to the object
81          *
82          * @param value - the value to add
83          */
84         void addValue(uint64_t value)
85         {
86             std::ostringstream stream;
87             stream << "0x" << std::hex << value;
88             all += stream.str();
89         }
90 
91         /**
92          * Adds a divider to the summary string to
93          * break up the name/value pairs
94          */
95         void addDivider()
96         {
97            if (!all.empty())
98            {
99                 all += '|';
100            }
101         }
102 
103         /**
104          * The string containing all name/value pairs
105          */
106         std::string all;
107 };
108 
109 }
110 }
111 }
112