blob: 1e03d5198d2fcdea86d3259e6e6c14bef6b29e4f [file] [log] [blame]
Brandon Wyman83abbd62017-09-25 16:41:39 -05001#pragma once
Matt Spinler3b090d12017-09-08 15:07:05 -05002#include <sstream>
3#include <string>
4
5namespace witherspoon
6{
7namespace power
8{
9namespace 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 */
34class NamesValues
35{
36 public:
37
38 NamesValues() = default;
39 NamesValues(const NamesValues&) = default;
40 NamesValues& operator=(const NamesValues&) = default;
41 NamesValues(NamesValues&&) = default;
42 NamesValues& operator=(NamesValues&&) = default;
43
44 /**
45 * Adds a name/value pair to the object
46 *
47 * @param name - the name to add
48 * @param value - the value to add
49 */
50 void add(const std::string& name, uint64_t value)
51 {
52 addDivider();
53 addName(name);
54 addValue(value);
55 }
56
57 /**
58 * Returns a formatted concatenation of all of the names and
59 * their values.
60 *
61 * @return string - "<name1>=<value1>|<name2>=<value2>..etc"
62 */
63 const std::string& get() const
64 {
65 return all;
66 }
67
68 private:
69
70 /**
71 * Adds a name to the object
72 *
73 * @param name - the name to add
74 */
75 void addName(const std::string& name)
76 {
77 all += name + '=';
78 }
79
80 /**
81 * Adds a value to the object
82 *
83 * @param value - the value to add
84 */
85 void addValue(uint64_t value)
86 {
87 std::ostringstream stream;
88 stream << "0x" << std::hex << value;
89 all += stream.str();
90 }
91
92 /**
93 * Adds a divider to the summary string to
94 * break up the name/value pairs
95 */
96 void addDivider()
97 {
98 if (!all.empty())
99 {
100 all += '|';
101 }
102 }
103
104 /**
105 * The string containing all name/value pairs
106 */
107 std::string all;
108};
109
110}
111}
112}