183abbd6fSBrandon Wyman #pragma once 2*8c324c9cSPatrick Williams #include <cstdint> 33b090d14SMatt Spinler #include <sstream> 43b090d14SMatt Spinler #include <string> 53b090d14SMatt Spinler 6ab093328SLei YU namespace phosphor 73b090d14SMatt Spinler { 83b090d14SMatt Spinler namespace power 93b090d14SMatt Spinler { 103b090d14SMatt Spinler namespace util 113b090d14SMatt Spinler { 123b090d14SMatt Spinler 133b090d14SMatt Spinler /** 143b090d14SMatt Spinler * @class NamesValues 153b090d14SMatt Spinler * 163b090d14SMatt Spinler * Builds up a string of name=value pairs for use in 173b090d14SMatt Spinler * situations like error log metadata. 183b090d14SMatt Spinler * 193b090d14SMatt Spinler * Names and values can be added to an instance of this 203b090d14SMatt Spinler * class, and then calling get() will return a string 213b090d14SMatt Spinler * that appends them all together. 223b090d14SMatt Spinler * 233b090d14SMatt Spinler * Currently, just uint64_t values that will be displayed 243b090d14SMatt Spinler * in hex are supported. 253b090d14SMatt Spinler * 263b090d14SMatt Spinler * For example: 273b090d14SMatt Spinler * NamesValues m; 283b090d14SMatt Spinler * uint8_t d = 0xFF; 293b090d14SMatt Spinler * 303b090d14SMatt Spinler * m.add("STATUS_VOUT", d); 313b090d14SMatt Spinler * m.add("STATUS_WORD", 0xABCD); 323b090d14SMatt Spinler * 333b090d14SMatt Spinler * m.get() //returns: "STATUS_VOUT=0xFF|STATUS_WORD=0xABCD" 343b090d14SMatt Spinler */ 353b090d14SMatt Spinler class NamesValues 363b090d14SMatt Spinler { 373b090d14SMatt Spinler public: 383b090d14SMatt Spinler NamesValues() = default; 393b090d14SMatt Spinler NamesValues(const NamesValues&) = default; 403b090d14SMatt Spinler NamesValues& operator=(const NamesValues&) = default; 413b090d14SMatt Spinler NamesValues(NamesValues&&) = default; 423b090d14SMatt Spinler NamesValues& operator=(NamesValues&&) = default; 433b090d14SMatt Spinler 443b090d14SMatt Spinler /** 453b090d14SMatt Spinler * Adds a name/value pair to the object 463b090d14SMatt Spinler * 473b090d14SMatt Spinler * @param name - the name to add 483b090d14SMatt Spinler * @param value - the value to add 493b090d14SMatt Spinler */ add(const std::string & name,uint64_t value)503b090d14SMatt Spinler void add(const std::string& name, uint64_t value) 513b090d14SMatt Spinler { 523b090d14SMatt Spinler addDivider(); 533b090d14SMatt Spinler addName(name); 543b090d14SMatt Spinler addValue(value); 553b090d14SMatt Spinler } 563b090d14SMatt Spinler 573b090d14SMatt Spinler /** 583b090d14SMatt Spinler * Returns a formatted concatenation of all of the names and 593b090d14SMatt Spinler * their values. 603b090d14SMatt Spinler * 613b090d14SMatt Spinler * @return string - "<name1>=<value1>|<name2>=<value2>..etc" 623b090d14SMatt Spinler */ get() const633b090d14SMatt Spinler const std::string& get() const 643b090d14SMatt Spinler { 653b090d14SMatt Spinler return all; 663b090d14SMatt Spinler } 673b090d14SMatt Spinler 683b090d14SMatt Spinler private: 693b090d14SMatt Spinler /** 703b090d14SMatt Spinler * Adds a name to the object 713b090d14SMatt Spinler * 723b090d14SMatt Spinler * @param name - the name to add 733b090d14SMatt Spinler */ addName(const std::string & name)743b090d14SMatt Spinler void addName(const std::string& name) 753b090d14SMatt Spinler { 763b090d14SMatt Spinler all += name + '='; 773b090d14SMatt Spinler } 783b090d14SMatt Spinler 793b090d14SMatt Spinler /** 803b090d14SMatt Spinler * Adds a value to the object 813b090d14SMatt Spinler * 823b090d14SMatt Spinler * @param value - the value to add 833b090d14SMatt Spinler */ addValue(uint64_t value)843b090d14SMatt Spinler void addValue(uint64_t value) 853b090d14SMatt Spinler { 863b090d14SMatt Spinler std::ostringstream stream; 873b090d14SMatt Spinler stream << "0x" << std::hex << value; 883b090d14SMatt Spinler all += stream.str(); 893b090d14SMatt Spinler } 903b090d14SMatt Spinler 913b090d14SMatt Spinler /** 923b090d14SMatt Spinler * Adds a divider to the summary string to 933b090d14SMatt Spinler * break up the name/value pairs 943b090d14SMatt Spinler */ addDivider()953b090d14SMatt Spinler void addDivider() 963b090d14SMatt Spinler { 973b090d14SMatt Spinler if (!all.empty()) 983b090d14SMatt Spinler { 993b090d14SMatt Spinler all += '|'; 1003b090d14SMatt Spinler } 1013b090d14SMatt Spinler } 1023b090d14SMatt Spinler 1033b090d14SMatt Spinler /** 1043b090d14SMatt Spinler * The string containing all name/value pairs 1053b090d14SMatt Spinler */ 1063b090d14SMatt Spinler std::string all; 1073b090d14SMatt Spinler }; 1083b090d14SMatt Spinler 109f0f02b9aSMatt Spinler } // namespace util 110f0f02b9aSMatt Spinler } // namespace power 111ab093328SLei YU } // namespace phosphor 112