summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCsaba Hruska <csaba.hruska@gmail.com>2015-09-18 10:03:23 +0200
committerCsaba Hruska <csaba.hruska@gmail.com>2015-09-18 10:03:23 +0200
commit9ae5fb17b9dd2f7bea8b9297402ed110b41cf2ed (patch)
tree25cde05847346feadbb5e2594ebe28d73293014a
parent51b1558a427c4b8dd80dda206a9e560d3e894015 (diff)
ddl: working C++ backend
-rw-r--r--Language.hs4
-rw-r--r--lib/RT.cpp11
-rw-r--r--lib/RT.hpp69
-rw-r--r--templates/data.cpp.ede30
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
236hasFieldNames :: [Field] -> Bool 238hasFieldNames :: [Field] -> Bool
diff --git a/lib/RT.cpp b/lib/RT.cpp
index 741596c..97701b2 100644
--- a/lib/RT.cpp
+++ b/lib/RT.cpp
@@ -21,23 +21,22 @@ template<> json toJSON<unsigned int>(unsigned int &v) {
21} 21}
22 22
23template<> String fromJSON<String>(W<String> v, json &obj) { 23template<> String fromJSON<String>(W<String> v, json &obj) {
24 String s; 24 return obj.get<String>();
25 return s;
26} 25}
27 26
28template<> Float fromJSON<Float>(W<Float> v, json &obj) { 27template<> Float fromJSON<Float>(W<Float> v, json &obj) {
29 return 0.0; 28 return obj.get<Float>();
30} 29}
31 30
32template<> bool fromJSON<bool>(W<bool> v, json &obj) { 31template<> bool fromJSON<bool>(W<bool> v, json &obj) {
33 return false; 32 return obj.get<bool>();
34} 33}
35 34
36template<> int fromJSON<int>(W<int> v, json &obj) { 35template<> int fromJSON<int>(W<int> v, json &obj) {
37 return 0; 36 return obj.get<int>();
38} 37}
39 38
40template<> unsigned int fromJSON<unsigned int>(W<unsigned int> v, json &obj) { 39template<> unsigned int fromJSON<unsigned int>(W<unsigned int> v, json &obj) {
41 return 0; 40 return obj.get<unsigned int>();
42} 41}
43 42
diff --git a/lib/RT.hpp b/lib/RT.hpp
index d34557e..2e1e652 100644
--- a/lib/RT.hpp
+++ b/lib/RT.hpp
@@ -63,23 +63,38 @@ template<typename T>
63json toJSON(T &v); 63json toJSON(T &v);
64 64
65template<typename any> 65template<typename any>
66json toJSON(Maybe<any> &value) { 66json toJSON(Maybe<any> &v) {
67 if (v.valid) {
68 return toJSON(v.data);
69 }
67 return json(); 70 return json();
68} 71}
69 72
70template<typename any> 73template<typename any>
71json toJSON(V2<any> &value) { 74json 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
75template<typename any> 81template<typename any>
76json toJSON(V3<any> &value) { 82json 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
80template<typename any> 90template<typename any>
81json toJSON(V4<any> &value) { 91json 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
85template<typename any> 100template<typename any>
@@ -91,9 +106,13 @@ json toJSON(std::vector<any> &v) {
91 return obj; 106 return obj;
92} 107}
93 108
94template<typename k, typename v> 109template<typename v>
95json toJSON(std::map<k,v> &value) { 110json 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
99template<typename T> 118template<typename T>
@@ -105,37 +124,65 @@ T fromJSON(W<T> w, json &obj);
105template<typename any> 124template<typename any>
106Maybe<any> fromJSON(W<Maybe<any>> v, json &obj) { 125Maybe<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
111template<typename any> 136template<typename any>
112V2<any> fromJSON(W<V2<any>> v, json &obj) { 137V2<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
117template<typename any> 144template<typename any>
118V3<any> fromJSON(W<V3<any>> v, json &obj) { 145V3<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
123template<typename any> 153template<typename any>
124V4<any> fromJSON(W<V4<any>> v, json &obj) { 154V4<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
129template<typename any> 163template<typename any>
130std::vector<any> fromJSON(W<std::vector<any>> v, json &obj) { 164std::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
172template<typename v>
173std::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/*
135template<typename k, typename v> 182template<typename k, typename v>
136std::map<k,v> fromJSON(W<std::map<k,v>> value, json &obj) { 183std::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 %}
10template<> json toJSON<{{ t.value.dataName }}>({{ t.value.dataName }} &v) { 6template<> 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
25template<> {{ t.value.dataName }} fromJSON<{{ t.value.dataName }}>(W<{{ t.value.dataName }}> v, json &obj) { 21template<> 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