1 #pragma once
2 #include <sstream>
3 #include <string>
4 
5 namespace witherspoon
6 {
7 namespace power
8 {
9 namespace util
10 {
11 
12 /**
13  * @class NamesValues
14  *
15  * Builds up a string of name=value pairs for use in
16  * situations like error log metadata.
17  *
18  * Names and values can be added to an instance of this
19  * class, and then calling get() will return a string
20  * that appends them all together.
21  *
22  * Currently, just uint64_t values that will be displayed
23  * in hex are supported.
24  *
25  * For example:
26  *     NamesValues m;
27  *     uint8_t d = 0xFF;
28  *
29  *     m.add("STATUS_VOUT", d);
30  *     m.add("STATUS_WORD", 0xABCD);
31  *
32  *     m.get() //returns: "STATUS_VOUT=0xFF|STATUS_WORD=0xABCD"
33  */
34 class NamesValues
35 {
36   public:
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      * Adds a name to the object
70      *
71      * @param name - the name to add
72      */
73     void addName(const std::string& name)
74     {
75         all += name + '=';
76     }
77 
78     /**
79      * Adds a value to the object
80      *
81      * @param value - the value to add
82      */
83     void addValue(uint64_t value)
84     {
85         std::ostringstream stream;
86         stream << "0x" << std::hex << value;
87         all += stream.str();
88     }
89 
90     /**
91      * Adds a divider to the summary string to
92      * break up the name/value pairs
93      */
94     void addDivider()
95     {
96         if (!all.empty())
97         {
98             all += '|';
99         }
100     }
101 
102     /**
103      * The string containing all name/value pairs
104      */
105     std::string all;
106 };
107 
108 } // namespace util
109 } // namespace power
110 } // namespace witherspoon
111