| #pragma once | 
 | #include <cstdint> | 
 | #include <sstream> | 
 | #include <string> | 
 |  | 
 | namespace phosphor | 
 | { | 
 | namespace power | 
 | { | 
 | namespace util | 
 | { | 
 |  | 
 | /** | 
 |  * @class NamesValues | 
 |  * | 
 |  * Builds up a string of name=value pairs for use in | 
 |  * situations like error log metadata. | 
 |  * | 
 |  * Names and values can be added to an instance of this | 
 |  * class, and then calling get() will return a string | 
 |  * that appends them all together. | 
 |  * | 
 |  * Currently, just uint64_t values that will be displayed | 
 |  * in hex are supported. | 
 |  * | 
 |  * For example: | 
 |  *     NamesValues m; | 
 |  *     uint8_t d = 0xFF; | 
 |  * | 
 |  *     m.add("STATUS_VOUT", d); | 
 |  *     m.add("STATUS_WORD", 0xABCD); | 
 |  * | 
 |  *     m.get() //returns: "STATUS_VOUT=0xFF|STATUS_WORD=0xABCD" | 
 |  */ | 
 | class NamesValues | 
 | { | 
 |   public: | 
 |     NamesValues() = default; | 
 |     NamesValues(const NamesValues&) = default; | 
 |     NamesValues& operator=(const NamesValues&) = default; | 
 |     NamesValues(NamesValues&&) = default; | 
 |     NamesValues& operator=(NamesValues&&) = default; | 
 |  | 
 |     /** | 
 |      * Adds a name/value pair to the object | 
 |      * | 
 |      * @param name - the name to add | 
 |      * @param value - the value to add | 
 |      */ | 
 |     void add(const std::string& name, uint64_t value) | 
 |     { | 
 |         addDivider(); | 
 |         addName(name); | 
 |         addValue(value); | 
 |     } | 
 |  | 
 |     /** | 
 |      * Returns a formatted concatenation of all of the names and | 
 |      * their values. | 
 |      * | 
 |      * @return string - "<name1>=<value1>|<name2>=<value2>..etc" | 
 |      */ | 
 |     const std::string& get() const | 
 |     { | 
 |         return all; | 
 |     } | 
 |  | 
 |   private: | 
 |     /** | 
 |      * Adds a name to the object | 
 |      * | 
 |      * @param name - the name to add | 
 |      */ | 
 |     void addName(const std::string& name) | 
 |     { | 
 |         all += name + '='; | 
 |     } | 
 |  | 
 |     /** | 
 |      * Adds a value to the object | 
 |      * | 
 |      * @param value - the value to add | 
 |      */ | 
 |     void addValue(uint64_t value) | 
 |     { | 
 |         std::ostringstream stream; | 
 |         stream << "0x" << std::hex << value; | 
 |         all += stream.str(); | 
 |     } | 
 |  | 
 |     /** | 
 |      * Adds a divider to the summary string to | 
 |      * break up the name/value pairs | 
 |      */ | 
 |     void addDivider() | 
 |     { | 
 |         if (!all.empty()) | 
 |         { | 
 |             all += '|'; | 
 |         } | 
 |     } | 
 |  | 
 |     /** | 
 |      * The string containing all name/value pairs | 
 |      */ | 
 |     std::string all; | 
 | }; | 
 |  | 
 | } // namespace util | 
 | } // namespace power | 
 | } // namespace phosphor |