47 static small test(
decltype(&C::fromJSON));
52 static const bool value =
sizeof(test<T>(0)) ==
sizeof(
char);
56 std::unordered_map<int, IR::Node *> &node_refs;
60 : node_refs(*(
new std::unordered_map<int, IR::Node *>())) {
65 : node_refs(*(
new std::unordered_map<int, IR::Node *>())), json(json) {}
68 : node_refs(refs), json(json) {}
71 : node_refs(unpacker.node_refs), json(
nullptr) {
72 if (
auto *obj = unpacker.json->
to<
JsonObject>()) json = get(obj, field);
80 if (node_refs.find(
id) == node_refs.end()) {
81 if (
auto fn = get(IR::unpacker_table, json->
as<
JsonObject>().get_type())) {
82 node_refs[id] = fn(*
this);
87 if (obj->hasSrcInfo() ==
true) {
88 node_refs[id]->srcInfo =
90 obj->get_column(), obj->get_sourceFragment());
101 template <
typename T>
110 template <
typename T>
111 void unpack_json(std::set<T> &v) {
119 template <
typename T>
128 template <
typename T>
132 template <
typename T>
136 template <
typename T>
140 template <
typename T>
144 template <
class T,
template <
class K,
class V,
class COMP,
class ALLOC>
class MAP,
class COMP,
149 template <
class T,
template <
class K,
class V,
class COMP,
class ALLOC>
class MAP,
class COMP,
155 template <
typename K,
typename V>
156 void unpack_json(std::map<K, V> &v) {
157 std::pair<K, V> temp;
161 load(e.second, temp.second);
165 template <
typename K,
typename V>
167 std::pair<K, V> temp;
171 load(e.second, temp.second);
175 template <
typename V>
177 std::pair<cstring, V> temp;
181 load(e.second, temp.second);
186 template <
typename K,
typename V>
187 void unpack_json(std::multimap<K, V> &v) {
188 std::pair<K, V> temp;
192 load(e.second, temp.second);
197 template <
typename T>
198 void unpack_json(std::vector<T> &v) {
206 template <
typename T,
typename U>
207 void unpack_json(std::pair<T, U> &v) {
209 load(::P4::get(obj,
"first"), v.first);
210 load(::P4::get(obj,
"second"), v.second);
213 template <
typename T>
214 void unpack_json(std::optional<T> &v) {
216 bool isValid =
false;
217 load(::P4::get(obj,
"valid"), isValid);
223 load(::P4::get(obj,
"value"), value), v = std::move(value);
228 template <
typename T>
229 typename std::enable_if<std::is_integral<T>::value>::type unpack_json(T &v) {
232 void unpack_json(big_int &v) { v = json->
as<
JsonNumber>().val; }
235 std::string::size_type p = 0;
236 while ((p = tmp.find(
'\\', p)) != std::string::npos) {
253 void unpack_json(
IR::ID &v) {
261 void unpack_json(
bitvec &v) {
265 template <
typename T>
266 typename std::enable_if<std::is_enum<T>::value>::type unpack_json(T &v) {
278 bool hasWidth =
false;
283 load(
"hasWidth", hasWidth);
288 template <
typename T>
289 typename std::enable_if<
290 has_fromJSON<T>::value && !std::is_base_of<IR::Node, T>::value &&
291 std::is_pointer<decltype(T::fromJSON(std::declval<JSONLoader &>()))>::value>::type
293 v = T::fromJSON(*
this);
296 template <
typename T>
297 typename std::enable_if<
298 has_fromJSON<T>::value && !std::is_base_of<IR::Node, T>::value &&
299 std::is_pointer<decltype(T::fromJSON(std::declval<JSONLoader &>()))>::value>::type
301 v = *(T::fromJSON(*
this));
304 template <
typename T>
305 typename std::enable_if<
306 has_fromJSON<T>::value && !std::is_base_of<IR::Node, T>::value &&
307 !std::is_pointer<decltype(T::fromJSON(std::declval<JSONLoader &>()))>::value>::type
309 v = T::fromJSON(*
this);
312 template <
typename T>
313 typename std::enable_if<std::is_base_of<IR::INode, T>::value>::type unpack_json(T &v) {
314 v = get_node()->
as<T>();
316 template <
typename T>
317 typename std::enable_if<std::is_base_of<IR::INode, T>::value>::type unpack_json(
const T *&v) {
318 v = get_node()->checkedTo<T>();
321 template <
typename T,
size_t N>
322 void unpack_json(T (&v)[N]) {
324 for (
size_t i = 0; i < N && i < j->size(); ++i) {
332 template <
typename T>
337 template <
typename T>
338 void load(
const std::string field, T *&v) {
340 if (loader.json ==
nullptr) {
343 loader.unpack_json(v);
347 template <
typename T>
348 void load(
const std::string field, T &v) {
350 if (loader.json ==
nullptr)
return;
351 loader.unpack_json(v);
354 template <
typename T>
386IR::NameMap<T, MAP, COMP, ALLOC> *IR::NameMap<T, MAP, COMP, ALLOC>::fromJSON(JSONLoader &json) {