xref: /openbmc/witherspoon-pfault-analysis/names_values.hpp (revision 98473dbcff7fd397ab9d3b242470029733d345cd)
183abbd6fSBrandon Wyman #pragma once
2*98473dbcSPatrick Williams #include <cstdint>
33b090d14SMatt Spinler #include <sstream>
43b090d14SMatt Spinler #include <string>
53b090d14SMatt Spinler 
63b090d14SMatt Spinler namespace witherspoon
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
111f0f02b9aSMatt Spinler } // namespace witherspoon
112