1717#include < list>
1818#include < map>
1919#include < shared_mutex>
20+ #include < variant>
2021#include < vector>
2122
2223#include " ExclusiveAccess.h"
@@ -122,7 +123,8 @@ struct InfoTreeNode {
122123 static constexpr uint64_t IndentSize = 4 ;
123124
124125 std::string Key;
125- std::string Value;
126+ using VariantType = std::variant<uint64_t , std::string, bool , std::monostate>;
127+ VariantType Value;
126128 std::string Units;
127129 // Need to specify a default value number of elements here as `InfoTreeNode`'s
128130 // size is unknown. This is a vector (rather than a Key->Value map) since:
@@ -131,31 +133,31 @@ struct InfoTreeNode {
131133 // * The same key can appear multiple times
132134 std::unique_ptr<llvm::SmallVector<InfoTreeNode, 8 >> Children;
133135
134- InfoTreeNode () : InfoTreeNode(" " , " " , " " ) {}
135- InfoTreeNode (std::string Key, std::string Value, std::string Units)
136+ InfoTreeNode () : InfoTreeNode(" " , std::monostate{} , " " ) {}
137+ InfoTreeNode (std::string Key, VariantType Value, std::string Units)
136138 : Key(Key), Value(Value), Units(Units) {}
137139
138140 // / Add a new info entry as a child of this node. The entry requires at least
139141 // / a key string in \p Key. The value in \p Value is optional and can be any
140142 // / type that is representable as a string. The units in \p Units is optional
141143 // / and must be a string.
142- template <typename T = std::string >
144+ template <typename T = std::monostate >
143145 InfoTreeNode *add (std::string Key, T Value = T(),
144146 const std::string &Units = std::string()) {
145147 assert (!Key.empty () && " Invalid info key" );
146148
147149 if (!Children)
148150 Children = std::make_unique<llvm::SmallVector<InfoTreeNode, 8 >>();
149151
150- std::string ValueStr ;
151- if constexpr (std::is_same_v<T, bool >)
152- ValueStr = Value ? " Yes " : " No " ;
152+ VariantType ValueVariant ;
153+ if constexpr (std::is_same_v<T, bool > || std::is_same_v<T, std::monostate> )
154+ ValueVariant = Value;
153155 else if constexpr (std::is_arithmetic_v<T>)
154- ValueStr = std::to_string (Value);
156+ ValueVariant = static_cast < uint64_t > (Value);
155157 else
156- ValueStr = Value;
158+ ValueVariant = std::string{ Value} ;
157159
158- return &Children->emplace_back (Key, ValueStr , Units);
160+ return &Children->emplace_back (Key, ValueVariant , Units);
159161 }
160162
161163 std::optional<InfoTreeNode *> get (StringRef Key) {
@@ -184,8 +186,23 @@ struct InfoTreeNode {
184186 MaxKeySize - (Key.size () + KeyIndentSize) + IndentSize;
185187
186188 llvm::outs () << std::string (KeyIndentSize, ' ' ) << Key
187- << std::string (ValIndentSize, ' ' ) << Value
188- << (Units.empty () ? " " : " " ) << Units << " \n " ;
189+ << std::string (ValIndentSize, ' ' );
190+ std::visit (
191+ [](auto &&V) {
192+ using T = std::decay_t <decltype (V)>;
193+ if constexpr (std::is_same_v<T, std::string>)
194+ llvm::outs () << V;
195+ else if constexpr (std::is_same_v<T, bool >)
196+ llvm::outs () << (V ? " Yes" : " No" );
197+ else if constexpr (std::is_same_v<T, uint64_t >)
198+ llvm::outs () << V;
199+ else if constexpr (std::is_same_v<T, std::monostate>) {
200+ // Do nothing
201+ } else
202+ static_assert (false , " doPrint visit not exhaustive" );
203+ },
204+ Value);
205+ llvm::outs () << (Units.empty () ? " " : " " ) << Units << " \n " ;
189206 }
190207
191208 // Print children
0 commit comments