#ifndef HEADER_RT_H #define HEADER_RT_H #include #include #include #include "json.hpp" using json = nlohmann::json; typedef int Int; typedef int Int32; typedef unsigned int Word; typedef unsigned int Word32; typedef float Float; typedef bool Bool; typedef std::string String; template struct Maybe { T1 data; bool valid; }; template struct V2 { T x,y; }; template struct V3 { T x,y,z; }; template struct V4 { T x,y,z,w; }; typedef struct V2 V2I; typedef struct V2 V2U; typedef struct V2 V2F; typedef struct V2 V2B; typedef struct V3 V3I; typedef struct V3 V3U; typedef struct V3 V3F; typedef struct V3 V3B; typedef struct V4 V4I; typedef struct V4 V4U; typedef struct V4 V4F; typedef struct V4 V4B; typedef struct V2 M22F; typedef struct V2 M32F; typedef struct V2 M42F; typedef struct V3 M23F; typedef struct V3 M33F; typedef struct V3 M43F; typedef struct V4 M24F; typedef struct V4 M34F; typedef struct V4 M44F; template json toJSON(T &v); template json toJSON(Maybe &v) { if (v.valid) { return toJSON(v.data); } return json(); } template json toJSON(V2 &v) { json obj({}); obj["x"] = toJSON(v.x); obj["y"] = toJSON(v.y); return obj; } template json toJSON(V3 &v) { json obj({}); obj["x"] = toJSON(v.x); obj["y"] = toJSON(v.y); obj["z"] = toJSON(v.z); return obj; } template json toJSON(V4 &v) { json obj({}); obj["x"] = toJSON(v.x); obj["y"] = toJSON(v.y); obj["z"] = toJSON(v.z); obj["w"] = toJSON(v.w); return obj; } template json toJSON(std::vector &v) { json obj = json::array(); for (any i : v) { obj.push_back(toJSON(i)); } return obj; } template json toJSON(std::map &value) { json obj({}); for(auto i : value) { obj[i.first] = toJSON(i.second); } return obj; } template struct W {}; template T fromJSON(W w, json &obj); template Maybe fromJSON(W> v, json &obj) { Maybe a; if (obj.is_null()) { a.valid = false; } else { a.valid = true; a.data = fromJSON(W(),obj); } return a; } template V2 fromJSON(W> v, json &obj) { V2 a; a.x = fromJSON(W(), obj["x"]); a.y = fromJSON(W(), obj["y"]); return a; } template V3 fromJSON(W> v, json &obj) { V3 a; a.x = fromJSON(W(), obj["x"]); a.y = fromJSON(W(), obj["y"]); a.z = fromJSON(W(), obj["z"]); return a; } template V4 fromJSON(W> v, json &obj) { V4 a; a.x = fromJSON(W(), obj["x"]); a.y = fromJSON(W(), obj["y"]); a.z = fromJSON(W(), obj["z"]); a.w = fromJSON(W(), obj["w"]); return a; } template std::vector fromJSON(W> v, json &obj) { std::vector a; for (json::iterator it = obj.begin(); it != obj.end(); ++it) { a.push_back(fromJSON(W(),*it)); } return a; } template std::map fromJSON(W> value, json &obj) { std::map a; for (json::iterator it = obj.begin(); it != obj.end(); ++it) { a[it.key()] = fromJSON(W(),it.value()); } return a; } /* template std::map fromJSON(W> value, json &obj) { std::map a; return a; } */ #endif