summary refs log tree commit diff stats
path: root/lib/selrestr.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/selrestr.cpp')
-rw-r--r--lib/selrestr.cpp102
1 files changed, 51 insertions, 51 deletions
diff --git a/lib/selrestr.cpp b/lib/selrestr.cpp index 74ea726..8646871 100644 --- a/lib/selrestr.cpp +++ b/lib/selrestr.cpp
@@ -1,7 +1,7 @@
1#include "selrestr.h" 1#include "selrestr.h"
2 2
3namespace verbly { 3namespace verbly {
4 4
5 selrestr::selrestr(nlohmann::json data) 5 selrestr::selrestr(nlohmann::json data)
6 { 6 {
7 if (data.find("children") != data.end()) 7 if (data.find("children") != data.end())
@@ -13,7 +13,7 @@ namespace verbly {
13 { 13 {
14 group_.children.emplace_back(child); 14 group_.children.emplace_back(child);
15 } 15 }
16 16
17 group_.orlogic = (data["logic"] == "or"); 17 group_.orlogic = (data["logic"] == "or");
18 } else if (data.find("type") != data.end()) 18 } else if (data.find("type") != data.end())
19 { 19 {
@@ -24,139 +24,139 @@ namespace verbly {
24 type_ = type::empty; 24 type_ = type::empty;
25 } 25 }
26 } 26 }
27 27
28 selrestr::selrestr(const selrestr& other) 28 selrestr::selrestr(const selrestr& other)
29 { 29 {
30 type_ = other.type_; 30 type_ = other.type_;
31 31
32 switch (type_) 32 switch (type_)
33 { 33 {
34 case type::singleton: 34 case type::singleton:
35 { 35 {
36 singleton_.pos = other.singleton_.pos; 36 singleton_.pos = other.singleton_.pos;
37 new(&singleton_.restriction) std::string(other.singleton_.restriction); 37 new(&singleton_.restriction) std::string(other.singleton_.restriction);
38 38
39 break; 39 break;
40 } 40 }
41 41
42 case type::group: 42 case type::group:
43 { 43 {
44 new(&group_.children) std::list<selrestr>(other.group_.children); 44 new(&group_.children) std::list<selrestr>(other.group_.children);
45 group_.orlogic = other.group_.orlogic; 45 group_.orlogic = other.group_.orlogic;
46 46
47 break; 47 break;
48 } 48 }
49 49
50 case type::empty: 50 case type::empty:
51 { 51 {
52 break; 52 break;
53 } 53 }
54 } 54 }
55 } 55 }
56 56
57 selrestr::selrestr(selrestr&& other) : selrestr() 57 selrestr::selrestr(selrestr&& other) : selrestr()
58 { 58 {
59 swap(*this, other); 59 swap(*this, other);
60 } 60 }
61 61
62 selrestr& selrestr::operator=(selrestr other) 62 selrestr& selrestr::operator=(selrestr other)
63 { 63 {
64 swap(*this, other); 64 swap(*this, other);
65 65
66 return *this; 66 return *this;
67 } 67 }
68 68
69 void swap(selrestr& first, selrestr& second) 69 void swap(selrestr& first, selrestr& second)
70 { 70 {
71 using type = selrestr::type; 71 using type = selrestr::type;
72 72
73 type tempType = first.type_; 73 type tempType = first.type_;
74 int tempPos; 74 int tempPos;
75 std::string tempRestriction; 75 std::string tempRestriction;
76 std::list<selrestr> tempChildren; 76 std::list<selrestr> tempChildren;
77 bool tempOrlogic; 77 bool tempOrlogic;
78 78
79 switch (tempType) 79 switch (tempType)
80 { 80 {
81 case type::singleton: 81 case type::singleton:
82 { 82 {
83 tempPos = first.singleton_.pos; 83 tempPos = first.singleton_.pos;
84 tempRestriction = std::move(first.singleton_.restriction); 84 tempRestriction = std::move(first.singleton_.restriction);
85 85
86 break; 86 break;
87 } 87 }
88 88
89 case type::group: 89 case type::group:
90 { 90 {
91 tempChildren = std::move(first.group_.children); 91 tempChildren = std::move(first.group_.children);
92 tempOrlogic = first.group_.orlogic; 92 tempOrlogic = first.group_.orlogic;
93 93
94 break; 94 break;
95 } 95 }
96 96
97 case type::empty: 97 case type::empty:
98 { 98 {
99 break; 99 break;
100 } 100 }
101 } 101 }
102 102
103 first.~selrestr(); 103 first.~selrestr();
104 104
105 first.type_ = second.type_; 105 first.type_ = second.type_;
106 106
107 switch (first.type_) 107 switch (first.type_)
108 { 108 {
109 case type::singleton: 109 case type::singleton:
110 { 110 {
111 first.singleton_.pos = second.singleton_.pos; 111 first.singleton_.pos = second.singleton_.pos;
112 new(&first.singleton_.restriction) std::string(std::move(second.singleton_.restriction)); 112 new(&first.singleton_.restriction) std::string(std::move(second.singleton_.restriction));
113 113
114 break; 114 break;
115 } 115 }
116 116
117 case type::group: 117 case type::group:
118 { 118 {
119 new(&first.group_.children) std::list<selrestr>(std::move(second.group_.children)); 119 new(&first.group_.children) std::list<selrestr>(std::move(second.group_.children));
120 first.group_.orlogic = second.group_.orlogic; 120 first.group_.orlogic = second.group_.orlogic;
121 121
122 break; 122 break;
123 } 123 }
124 124
125 case type::empty: 125 case type::empty:
126 { 126 {
127 break; 127 break;
128 } 128 }
129 } 129 }
130 130
131 second.~selrestr(); 131 second.~selrestr();
132 132
133 second.type_ = tempType; 133 second.type_ = tempType;
134 134
135 switch (second.type_) 135 switch (second.type_)
136 { 136 {
137 case type::singleton: 137 case type::singleton:
138 { 138 {
139 second.singleton_.pos = tempPos; 139 second.singleton_.pos = tempPos;
140 new(&second.singleton_.restriction) std::string(std::move(tempRestriction)); 140 new(&second.singleton_.restriction) std::string(std::move(tempRestriction));
141 141
142 break; 142 break;
143 } 143 }
144 144
145 case type::group: 145 case type::group:
146 { 146 {
147 new(&second.group_.children) std::list<selrestr>(std::move(tempChildren)); 147 new(&second.group_.children) std::list<selrestr>(std::move(tempChildren));
148 second.group_.orlogic = tempOrlogic; 148 second.group_.orlogic = tempOrlogic;
149 149
150 break; 150 break;
151 } 151 }
152 152
153 case type::empty: 153 case type::empty:
154 { 154 {
155 break; 155 break;
156 } 156 }
157 } 157 }
158 } 158 }
159 159
160 selrestr::~selrestr() 160 selrestr::~selrestr()
161 { 161 {
162 switch (type_) 162 switch (type_)
@@ -165,29 +165,29 @@ namespace verbly {
165 { 165 {
166 using string_type = std::string; 166 using string_type = std::string;
167 singleton_.restriction.~string_type(); 167 singleton_.restriction.~string_type();
168 168
169 break; 169 break;
170 } 170 }
171 171
172 case type::group: 172 case type::group:
173 { 173 {
174 using list_type = std::list<selrestr>; 174 using list_type = std::list<selrestr>;
175 group_.children.~list_type(); 175 group_.children.~list_type();
176 176
177 break; 177 break;
178 } 178 }
179 179
180 case type::empty: 180 case type::empty:
181 { 181 {
182 break; 182 break;
183 } 183 }
184 } 184 }
185 } 185 }
186 186
187 selrestr::selrestr() : type_(type::empty) 187 selrestr::selrestr() : type_(type::empty)
188 { 188 {
189 } 189 }
190 190
191 selrestr::selrestr( 191 selrestr::selrestr(
192 std::string restriction, 192 std::string restriction,
193 bool pos) : 193 bool pos) :
@@ -196,7 +196,7 @@ namespace verbly {
196 new(&singleton_.restriction) std::string(std::move(restriction)); 196 new(&singleton_.restriction) std::string(std::move(restriction));
197 singleton_.pos = pos; 197 singleton_.pos = pos;
198 } 198 }
199 199
200 std::string selrestr::getRestriction() const 200 std::string selrestr::getRestriction() const
201 { 201 {
202 if (type_ == type::singleton) 202 if (type_ == type::singleton)
@@ -206,7 +206,7 @@ namespace verbly {
206 throw std::domain_error("Only singleton selrestrs have restrictions"); 206 throw std::domain_error("Only singleton selrestrs have restrictions");
207 } 207 }
208 } 208 }
209 209
210 bool selrestr::getPos() const 210 bool selrestr::getPos() const
211 { 211 {
212 if (type_ == type::singleton) 212 if (type_ == type::singleton)
@@ -216,7 +216,7 @@ namespace verbly {
216 throw std::domain_error("Only singleton selrestrs have positivity flags"); 216 throw std::domain_error("Only singleton selrestrs have positivity flags");
217 } 217 }
218 } 218 }
219 219
220 selrestr::selrestr( 220 selrestr::selrestr(
221 std::list<selrestr> children, 221 std::list<selrestr> children,
222 bool orlogic) : 222 bool orlogic) :
@@ -225,7 +225,7 @@ namespace verbly {
225 new(&group_.children) std::list<selrestr>(std::move(children)); 225 new(&group_.children) std::list<selrestr>(std::move(children));
226 group_.orlogic = orlogic; 226 group_.orlogic = orlogic;
227 } 227 }
228 228
229 std::list<selrestr> selrestr::getChildren() const 229 std::list<selrestr> selrestr::getChildren() const
230 { 230 {
231 if (type_ == type::group) 231 if (type_ == type::group)
@@ -235,7 +235,7 @@ namespace verbly {
235 throw std::domain_error("Only group selrestrs have children"); 235 throw std::domain_error("Only group selrestrs have children");
236 } 236 }
237 } 237 }
238 238
239 std::list<selrestr>::const_iterator selrestr::begin() const 239 std::list<selrestr>::const_iterator selrestr::begin() const
240 { 240 {
241 if (type_ == type::group) 241 if (type_ == type::group)
@@ -245,7 +245,7 @@ namespace verbly {
245 throw std::domain_error("Only group selrestrs have children"); 245 throw std::domain_error("Only group selrestrs have children");
246 } 246 }
247 } 247 }
248 248
249 std::list<selrestr>::const_iterator selrestr::end() const 249 std::list<selrestr>::const_iterator selrestr::end() const
250 { 250 {
251 if (type_ == type::group) 251 if (type_ == type::group)
@@ -255,7 +255,7 @@ namespace verbly {
255 throw std::domain_error("Only group selrestrs have children"); 255 throw std::domain_error("Only group selrestrs have children");
256 } 256 }
257 } 257 }
258 258
259 bool selrestr::getOrlogic() const 259 bool selrestr::getOrlogic() const
260 { 260 {
261 if (type_ == type::group) 261 if (type_ == type::group)
@@ -265,7 +265,7 @@ namespace verbly {
265 throw std::domain_error("Only group selrestrs have logic"); 265 throw std::domain_error("Only group selrestrs have logic");
266 } 266 }
267 } 267 }
268 268
269 nlohmann::json selrestr::toJson() const 269 nlohmann::json selrestr::toJson() const
270 { 270 {
271 switch (type_) 271 switch (type_)
@@ -274,7 +274,7 @@ namespace verbly {
274 { 274 {
275 return {}; 275 return {};
276 } 276 }
277 277
278 case type::singleton: 278 case type::singleton:
279 { 279 {
280 return { 280 return {
@@ -282,7 +282,7 @@ namespace verbly {
282 {"pos", singleton_.pos} 282 {"pos", singleton_.pos}
283 }; 283 };
284 } 284 }
285 285
286 case type::group: 286 case type::group:
287 { 287 {
288 std::string logic; 288 std::string logic;
@@ -292,12 +292,12 @@ namespace verbly {
292 } else { 292 } else {
293 logic = "and"; 293 logic = "and";
294 } 294 }
295 295
296 std::list<nlohmann::json> children; 296 std::list<nlohmann::json> children;
297 std::transform(std::begin(group_.children), std::end(group_.children), std::back_inserter(children), [] (const selrestr& child) { 297 std::transform(std::begin(group_.children), std::end(group_.children), std::back_inserter(children), [] (const selrestr& child) {
298 return child.toJson(); 298 return child.toJson();
299 }); 299 });
300 300
301 return { 301 return {
302 {"logic", logic}, 302 {"logic", logic},
303 {"children", children} 303 {"children", children}