45 static small test(
decltype(&C::fromJSON));
50 static const bool value =
sizeof(test<T>(0)) ==
sizeof(
char);
54 std::unordered_map<int, IR::Node *> &node_refs;
58 : node_refs(*(
new std::unordered_map<int, IR::Node *>())) {
63 : node_refs(*(
new std::unordered_map<int, IR::Node *>())), json(json) {}
66 : node_refs(refs), json(json) {}
69 : node_refs(unpacker.node_refs), json(
nullptr) {
70 if (
auto *obj = unpacker.json->
to<
JsonObject>()) json = get(obj, field);
78 if (node_refs.find(
id) == node_refs.end()) {
79 if (
auto fn = get(IR::unpacker_table, json->
as<
JsonObject>().get_type())) {
80 node_refs[id] = fn(*
this);
85 if (obj->hasSrcInfo() ==
true) {
86 node_refs[id]->srcInfo =
88 obj->get_column(), obj->get_sourceFragment());
108 template <
typename T>
109 void unpack_json(std::set<T> &v) {
117 template <
typename T>
126 template <
typename T>
130 template <
typename T>
134 template <
typename T>
138 template <
typename T>
142 template <
class T,
template <
class K,
class V,
class COMP,
class ALLOC>
class MAP,
class COMP,
147 template <
class T,
template <
class K,
class V,
class COMP,
class ALLOC>
class MAP,
class COMP,
153 template <
typename K,
typename V>
154 void unpack_json(std::map<K, V> &v) {
155 std::pair<K, V> temp;
159 load(e.second, temp.second);
163 template <
typename K,
typename V>
165 std::pair<K, V> temp;
169 load(e.second, temp.second);
173 template <
typename V>
175 std::pair<cstring, V> temp;
179 load(e.second, temp.second);
184 template <
typename K,
typename V>
185 void unpack_json(std::multimap<K, V> &v) {
186 std::pair<K, V> temp;
190 load(e.second, temp.second);
195 template <
typename T>
196 void unpack_json(std::vector<T> &v) {
204 template <
typename T,
typename U>
205 void unpack_json(std::pair<T, U> &v) {
207 load(::get(obj,
"first"), v.first);
208 load(::get(obj,
"second"), v.second);
211 template <
typename T>
212 void unpack_json(std::optional<T> &v) {
214 bool isValid =
false;
215 load(::get(obj,
"valid"), isValid);
221 load(::get(obj,
"value"), value), v = std::move(value);
226 template <
typename T>
227 typename std::enable_if<std::is_integral<T>::value>::type unpack_json(T &v) {
230 void unpack_json(big_int &v) { v = json->
as<
JsonNumber>().val; }
233 std::string::size_type p = 0;
234 while ((p = tmp.find(
'\\', p)) != std::string::npos) {
251 void unpack_json(
IR::ID &v) {
259 void unpack_json(
bitvec &v) {
263 template <
typename T>
264 typename std::enable_if<std::is_enum<T>::value>::type unpack_json(T &v) {
276 bool hasWidth =
false;
281 load(
"hasWidth", hasWidth);
286 template <
typename T>
287 typename std::enable_if<
288 has_fromJSON<T>::value && !std::is_base_of<IR::Node, T>::value &&
289 std::is_pointer<decltype(T::fromJSON(std::declval<JSONLoader &>()))>::value>::type
291 v = T::fromJSON(*
this);
294 template <
typename T>
295 typename std::enable_if<
296 has_fromJSON<T>::value && !std::is_base_of<IR::Node, T>::value &&
297 std::is_pointer<decltype(T::fromJSON(std::declval<JSONLoader &>()))>::value>::type
299 v = *(T::fromJSON(*
this));
302 template <
typename T>
303 typename std::enable_if<
304 has_fromJSON<T>::value && !std::is_base_of<IR::Node, T>::value &&
305 !std::is_pointer<decltype(T::fromJSON(std::declval<JSONLoader &>()))>::value>::type
307 v = T::fromJSON(*
this);
310 template <
typename T>
311 typename std::enable_if<std::is_base_of<IR::INode, T>::value>::type unpack_json(T &v) {
312 v = get_node()->
as<T>();
314 template <
typename T>
315 typename std::enable_if<std::is_base_of<IR::INode, T>::value>::type unpack_json(
const T *&v) {
316 v = get_node()->checkedTo<T>();
319 template <
typename T,
size_t N>
320 void unpack_json(T (&v)[N]) {
322 for (
size_t i = 0; i < N && i < j->size(); ++i) {
330 template <
typename T>
335 template <
typename T>
336 void load(
const std::string field, T *&v) {
338 if (loader.json ==
nullptr) {
341 loader.unpack_json(v);
345 template <
typename T>
346 void load(
const std::string field, T &v) {
348 if (loader.json ==
nullptr)
return;
349 loader.unpack_json(v);
352 template <
typename T>