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>