diff options
author | Csaba Hruska <csaba.hruska@gmail.com> | 2015-09-18 10:03:23 +0200 |
---|---|---|
committer | Csaba Hruska <csaba.hruska@gmail.com> | 2015-09-18 10:03:23 +0200 |
commit | 9ae5fb17b9dd2f7bea8b9297402ed110b41cf2ed (patch) | |
tree | 25cde05847346feadbb5e2594ebe28d73293014a | |
parent | 51b1558a427c4b8dd80dda206a9e560d3e894015 (diff) |
ddl: working C++ backend
-rw-r--r-- | Language.hs | 4 | ||||
-rw-r--r-- | lib/RT.cpp | 11 | ||||
-rw-r--r-- | lib/RT.hpp | 69 | ||||
-rw-r--r-- | templates/data.cpp.ede | 30 |
4 files changed, 78 insertions, 36 deletions
diff --git a/Language.hs b/Language.hs index 6a5cc33..e7ef163 100644 --- a/Language.hs +++ b/Language.hs | |||
@@ -230,7 +230,9 @@ cppType aliasMap = \case | |||
230 | Maybe t -> "Maybe<" ++ cppType aliasMap t ++ ">" | 230 | Maybe t -> "Maybe<" ++ cppType aliasMap t ++ ">" |
231 | Map k v -> "std::map<" ++ cppType aliasMap k ++ ", " ++ cppType aliasMap v ++ ">" | 231 | Map k v -> "std::map<" ++ cppType aliasMap k ++ ", " ++ cppType aliasMap v ++ ">" |
232 | -- user defined | 232 | -- user defined |
233 | Data t -> "::" ++ t | 233 | Data t -> case normalize aliasMap (Data t) of |
234 | Data n -> "std::shared_ptr<::" ++ n ++ ">" | ||
235 | _ -> "::" ++ t | ||
234 | x -> error $ "unknown type: " ++ show x | 236 | x -> error $ "unknown type: " ++ show x |
235 | 237 | ||
236 | hasFieldNames :: [Field] -> Bool | 238 | hasFieldNames :: [Field] -> Bool |
@@ -21,23 +21,22 @@ template<> json toJSON<unsigned int>(unsigned int &v) { | |||
21 | } | 21 | } |
22 | 22 | ||
23 | template<> String fromJSON<String>(W<String> v, json &obj) { | 23 | template<> String fromJSON<String>(W<String> v, json &obj) { |
24 | String s; | 24 | return obj.get<String>(); |
25 | return s; | ||
26 | } | 25 | } |
27 | 26 | ||
28 | template<> Float fromJSON<Float>(W<Float> v, json &obj) { | 27 | template<> Float fromJSON<Float>(W<Float> v, json &obj) { |
29 | return 0.0; | 28 | return obj.get<Float>(); |
30 | } | 29 | } |
31 | 30 | ||
32 | template<> bool fromJSON<bool>(W<bool> v, json &obj) { | 31 | template<> bool fromJSON<bool>(W<bool> v, json &obj) { |
33 | return false; | 32 | return obj.get<bool>(); |
34 | } | 33 | } |
35 | 34 | ||
36 | template<> int fromJSON<int>(W<int> v, json &obj) { | 35 | template<> int fromJSON<int>(W<int> v, json &obj) { |
37 | return 0; | 36 | return obj.get<int>(); |
38 | } | 37 | } |
39 | 38 | ||
40 | template<> unsigned int fromJSON<unsigned int>(W<unsigned int> v, json &obj) { | 39 | template<> unsigned int fromJSON<unsigned int>(W<unsigned int> v, json &obj) { |
41 | return 0; | 40 | return obj.get<unsigned int>(); |
42 | } | 41 | } |
43 | 42 | ||
@@ -63,23 +63,38 @@ template<typename T> | |||
63 | json toJSON(T &v); | 63 | json toJSON(T &v); |
64 | 64 | ||
65 | template<typename any> | 65 | template<typename any> |
66 | json toJSON(Maybe<any> &value) { | 66 | json toJSON(Maybe<any> &v) { |
67 | if (v.valid) { | ||
68 | return toJSON(v.data); | ||
69 | } | ||
67 | return json(); | 70 | return json(); |
68 | } | 71 | } |
69 | 72 | ||
70 | template<typename any> | 73 | template<typename any> |
71 | json toJSON(V2<any> &value) { | 74 | json toJSON(V2<any> &v) { |
72 | return json(); | 75 | json obj({}); |
76 | obj["x"] = toJSON(v.x); | ||
77 | obj["y"] = toJSON(v.y); | ||
78 | return obj; | ||
73 | } | 79 | } |
74 | 80 | ||
75 | template<typename any> | 81 | template<typename any> |
76 | json toJSON(V3<any> &value) { | 82 | json toJSON(V3<any> &v) { |
77 | return json(); | 83 | json obj({}); |
84 | obj["x"] = toJSON(v.x); | ||
85 | obj["y"] = toJSON(v.y); | ||
86 | obj["z"] = toJSON(v.z); | ||
87 | return obj; | ||
78 | } | 88 | } |
79 | 89 | ||
80 | template<typename any> | 90 | template<typename any> |
81 | json toJSON(V4<any> &value) { | 91 | json toJSON(V4<any> &v) { |
82 | return json(); | 92 | json obj({}); |
93 | obj["x"] = toJSON(v.x); | ||
94 | obj["y"] = toJSON(v.y); | ||
95 | obj["z"] = toJSON(v.z); | ||
96 | obj["w"] = toJSON(v.w); | ||
97 | return obj; | ||
83 | } | 98 | } |
84 | 99 | ||
85 | template<typename any> | 100 | template<typename any> |
@@ -91,9 +106,13 @@ json toJSON(std::vector<any> &v) { | |||
91 | return obj; | 106 | return obj; |
92 | } | 107 | } |
93 | 108 | ||
94 | template<typename k, typename v> | 109 | template<typename v> |
95 | json toJSON(std::map<k,v> &value) { | 110 | json toJSON(std::map<String,v> &value) { |
96 | return json(); | 111 | json obj({}); |
112 | for(auto i : value) { | ||
113 | obj[i.first] = toJSON(i.second); | ||
114 | } | ||
115 | return obj; | ||
97 | } | 116 | } |
98 | 117 | ||
99 | template<typename T> | 118 | template<typename T> |
@@ -105,37 +124,65 @@ T fromJSON(W<T> w, json &obj); | |||
105 | template<typename any> | 124 | template<typename any> |
106 | Maybe<any> fromJSON(W<Maybe<any>> v, json &obj) { | 125 | Maybe<any> fromJSON(W<Maybe<any>> v, json &obj) { |
107 | Maybe<any> a; | 126 | Maybe<any> a; |
127 | if (obj.is_null()) { | ||
128 | a.valid = false; | ||
129 | } else { | ||
130 | a.valid = true; | ||
131 | a.data = fromJSON(W<any>(),obj); | ||
132 | } | ||
108 | return a; | 133 | return a; |
109 | } | 134 | } |
110 | 135 | ||
111 | template<typename any> | 136 | template<typename any> |
112 | V2<any> fromJSON(W<V2<any>> v, json &obj) { | 137 | V2<any> fromJSON(W<V2<any>> v, json &obj) { |
113 | V2<any> a; | 138 | V2<any> a; |
139 | a.x = fromJSON(W<any>(), obj["x"]); | ||
140 | a.y = fromJSON(W<any>(), obj["y"]); | ||
114 | return a; | 141 | return a; |
115 | } | 142 | } |
116 | 143 | ||
117 | template<typename any> | 144 | template<typename any> |
118 | V3<any> fromJSON(W<V3<any>> v, json &obj) { | 145 | V3<any> fromJSON(W<V3<any>> v, json &obj) { |
119 | V3<any> a; | 146 | V3<any> a; |
147 | a.x = fromJSON(W<any>(), obj["x"]); | ||
148 | a.y = fromJSON(W<any>(), obj["y"]); | ||
149 | a.z = fromJSON(W<any>(), obj["z"]); | ||
120 | return a; | 150 | return a; |
121 | } | 151 | } |
122 | 152 | ||
123 | template<typename any> | 153 | template<typename any> |
124 | V4<any> fromJSON(W<V4<any>> v, json &obj) { | 154 | V4<any> fromJSON(W<V4<any>> v, json &obj) { |
125 | V4<any> a; | 155 | V4<any> a; |
156 | a.x = fromJSON(W<any>(), obj["x"]); | ||
157 | a.y = fromJSON(W<any>(), obj["y"]); | ||
158 | a.z = fromJSON(W<any>(), obj["z"]); | ||
159 | a.w = fromJSON(W<any>(), obj["w"]); | ||
126 | return a; | 160 | return a; |
127 | } | 161 | } |
128 | 162 | ||
129 | template<typename any> | 163 | template<typename any> |
130 | std::vector<any> fromJSON(W<std::vector<any>> v, json &obj) { | 164 | std::vector<any> fromJSON(W<std::vector<any>> v, json &obj) { |
131 | std::vector<any> a; | 165 | std::vector<any> a; |
166 | for (json::iterator it = obj.begin(); it != obj.end(); ++it) { | ||
167 | a.push_back(fromJSON(W<any>(),*it)); | ||
168 | } | ||
132 | return a; | 169 | return a; |
133 | } | 170 | } |
134 | 171 | ||
172 | template<typename v> | ||
173 | std::map<String,v> fromJSON(W<std::map<String,v>> value, json &obj) { | ||
174 | std::map<String,v> a; | ||
175 | for (json::iterator it = obj.begin(); it != obj.end(); ++it) { | ||
176 | a[it.key()] = fromJSON(W<v>(),it.value()); | ||
177 | } | ||
178 | return a; | ||
179 | } | ||
180 | |||
181 | /* | ||
135 | template<typename k, typename v> | 182 | template<typename k, typename v> |
136 | std::map<k,v> fromJSON(W<std::map<k,v>> value, json &obj) { | 183 | std::map<k,v> fromJSON(W<std::map<k,v>> value, json &obj) { |
137 | std::map<k,v> a; | 184 | std::map<k,v> a; |
138 | return a; | 185 | return a; |
139 | } | 186 | } |
140 | 187 | */ | |
141 | #endif \ No newline at end of file | 188 | #endif \ No newline at end of file |
diff --git a/templates/data.cpp.ede b/templates/data.cpp.ede index 2b3e865..39bf39d 100644 --- a/templates/data.cpp.ede +++ b/templates/data.cpp.ede | |||
@@ -1,46 +1,40 @@ | |||
1 | // generated file, do not modify! | 1 | // generated file, do not modify! |
2 | // {{ dateTime }} | 2 | // {{ dateTime }} |
3 | 3 | ||
4 | #include <string> | ||
5 | #include <iostream> | ||
6 | |||
7 | #include "{{ moduleName }}.hpp" | 4 | #include "{{ moduleName }}.hpp" |
8 | |||
9 | {% for t in definitions %} | 5 | {% for t in definitions %} |
10 | template<> json toJSON<{{ t.value.dataName }}>({{ t.value.dataName }} &v) { | 6 | template<> json toJSON<std::shared_ptr<{{ t.value.dataName }}>>(std::shared_ptr<{{ t.value.dataName }}> &v) { |
11 | json obj; | 7 | json obj({}); |
12 | switch (v.tag) { {% for c in t.value.constructors %} | 8 | switch (v->tag) { {% for c in t.value.constructors %} |
13 | case ::{{ t.value.dataName }}::tag::{{ c.value.name }}: | 9 | case ::{{ t.value.dataName }}::tag::{{ c.value.name }}: |
14 | obj["tag"] = "{{ c.value.name }}";{% if !(c.value.fields | empty) %} | 10 | obj["tag"] = "{{ c.value.name }}";{% if !(c.value.fields | empty) %} |
15 | { | 11 | { |
16 | auto tv = static_cast<::data::{{ c.value.name }}&>(v);{% for f in c.value.fields %}{% if c.value.fields | hasFieldNames %} | 12 | std::shared_ptr<data::{{ c.value.name }}> tv = std::static_pointer_cast<data::{{ c.value.name }}>(v);{% for f in c.value.fields %}{% if c.value.fields | hasFieldNames %} |
17 | obj["{{ f.value.fieldName }}"] = toJSON(tv.{{ f.value.fieldName }});{% else %} | 13 | obj["{{ f.value.fieldName }}"] = toJSON(tv->{{ f.value.fieldName }});{% else %} |
18 | obj["arg{{ f.index0 }}"] = toJSON(tv._{{ f.index0 }});{% endif %}{% endfor %} | 14 | obj["arg{{ f.index0 }}"] = toJSON(tv->_{{ f.index0 }});{% endif %}{% endfor %} |
19 | }{% endif %} | 15 | }{% endif %} |
20 | break;{% endfor %} | 16 | break;{% endfor %} |
21 | } | 17 | } |
22 | return obj; | 18 | return obj; |
23 | } | 19 | } |
24 | 20 | ||
25 | template<> {{ t.value.dataName }} fromJSON<{{ t.value.dataName }}>(W<{{ t.value.dataName }}> v, json &obj) { | 21 | template<> std::shared_ptr<{{ t.value.dataName }}> fromJSON<std::shared_ptr<{{ t.value.dataName }}>>(W<std::shared_ptr<{{ t.value.dataName }}>> v, json &obj) { |
26 | std::cout << "fromJSON: {{ t.value.dataName }}\n"; | ||
27 | enum ::{{ t.value.dataName }}::tag tagType; | 22 | enum ::{{ t.value.dataName }}::tag tagType; |
28 | std::string tag = obj["tag"]; | 23 | std::string tag = obj["tag"]; |
29 | {% for c in t.value.constructors %} | 24 | {% for c in t.value.constructors %} |
30 | {% if !c.first %}else {% endif %}if (tag == "{{ c.value.name }}") { | 25 | {% if !c.first %}else {% endif %}if (tag == "{{ c.value.name }}") { |
31 | tagType = ::{{ t.value.dataName }}::tag::{{ c.value.name }}; | 26 | tagType = ::{{ t.value.dataName }}::tag::{{ c.value.name }}; |
32 | {% if !(c.value.fields | empty) %} | 27 | {% if !(c.value.fields | empty) %} |
33 | ::data::{{ c.value.name }} tv; | 28 | std::shared_ptr<data::{{ c.value.name }}> tv(new data::{{ c.value.name }}());{% for f in c.value.fields %}{% if c.value.fields | hasFieldNames %} |
34 | tv.tag = tagType;{% for f in c.value.fields %}{% if c.value.fields | hasFieldNames %} | 29 | tv->{{ f.value.fieldName }} = fromJSON(W<{{ f.value.fieldType | cppType }}>(), obj["{{ f.value.fieldName }}"]);{% else %} |
35 | tv.{{ f.value.fieldName }} = fromJSON(W<{{ f.value.fieldType | cppType }}>(), obj["{{ f.value.fieldName }}"]);{% else %} | 30 | tv->_{{ f.index0 }} = fromJSON(W<{{ f.value.fieldType | cppType }}>(), obj["arg{{ f.index0 }}"]);{% endif %}{% endfor %} |
36 | tv._{{ f.index0 }} = fromJSON(W<{{ f.value.fieldType | cppType }}>(), obj["arg{{ f.index0 }}"]);{% endif %}{% endfor %} | ||
37 | return tv; | 31 | return tv; |
38 | {% endif %} | 32 | {% endif %} |
39 | } | 33 | } |
40 | {% endfor %} | 34 | {% endfor %} |
41 | else throw "unknown constructor: " + tag; | 35 | else throw "unknown constructor: " + tag; |
42 | {{ t.value.dataName }} o; | 36 | std::shared_ptr<::{{ t.value.dataName }}> o(new ::{{ t.value.dataName }}()); |
43 | o.tag = tagType; | 37 | o->tag = tagType; |
44 | return o; | 38 | return o; |
45 | } | 39 | } |
46 | 40 | ||