222class vector :
public obj,
public vector_base {
225 vector(
const vector &) =
delete;
226 vector(vector &&) =
default;
228 for (
auto o : init) push_back(o.get().copy());
230 vector &operator=(
const vector &) & =
delete;
231 vector &operator=(vector &&) & =
default;
233 bool operator<(
const obj &a)
const override {
234 if (
const vector *b =
dynamic_cast<const vector *
>(&a)) {
235 auto p1 = begin(), p2 = b->begin();
236 while (p1 != end() && p2 != b->end()) {
237 if (**p1 < **p2)
return true;
238 if (**p1 != **p2)
return false;
242 return p2 != b->end();
244 return std::type_index(
typeid(*
this)) < std::type_index(
typeid(a));
246 using obj::operator<=;
247 using obj::operator>=;
248 using obj::operator>;
249 bool operator==(
const obj &a)
const override {
250 if (
const vector *b =
dynamic_cast<const vector *
>(&a)) {
251 auto p1 = begin(), p2 = b->begin();
252 while (p1 != end() && p2 != b->end()) {
253 if (**p1 != **p2)
return false;
257 return (p1 == end() && p2 == b->end());
261 using obj::operator!=;
262 void print_on(std::ostream &out,
int = 0,
int = 80,
263 const char * =
"")
const override;
264 bool test_width(
int &limit)
const override {
266 for (
auto &e : *
this) {
267 if (e ? !e->test_width(limit) : (limit -= 4) < 0)
return false;
268 if ((limit -= 2) < 0)
return false;
272 using vector_base::push_back;
273 void push_back(
decltype(
nullptr)) { push_back(std::unique_ptr<obj>()); }
274 void push_back(
bool t) {
276 push_back(mkuniq<True>(
True()));
278 push_back(mkuniq<False>(
False()));
280 void push_back(int64_t n) { push_back(mkuniq<number>(
number(n))); }
281 void push_back(
int n) { push_back((int64_t)n); }
282 void push_back(
unsigned int n) { push_back((int64_t)n); }
283 void push_back(uint64_t n) { push_back((int64_t)n); }
284 void push_back(
const char *s) { push_back(mkuniq<string>(
string(s))); }
285 void push_back(std::string s) { push_back(mkuniq<string>(
string(s))); }
286 void push_back(
string s) { push_back(mkuniq<string>(s)); }
287 void push_back(vector &&v) { push_back(mkuniq<vector>(std::move(v))); }
289 vector *as_vector()
override {
return this; }
290 const vector *as_vector()
const override {
return this; }
291 std::unique_ptr<obj> copy() &&
override {
return mkuniq<vector>(std::move(*
this)); }
292 std::unique_ptr<obj> clone()
const override {
293 vector *v =
new vector();
294 for (
auto &e : *
this) v->push_back(clone_ptr(e));
295 return std::unique_ptr<vector>(v);
300class map :
public obj,
public map_base {
303 map(
const map &) =
default;
304 map(map &&) =
default;
305 map(
const std::initializer_list<std::pair<std::string, obj &&>> &init) {
306 for (
auto &pair : init) (*this)[pair.first] = std::move(pair.second).copy();
308 map &operator=(
const map &) & =
default;
309 map &operator=(map &&) & =
default;
311 for (
auto &e : *
this)
delete e.first;
313 bool operator<(
const obj &a)
const override {
314 if (
const map *b =
dynamic_cast<const map *
>(&a)) {
315 auto p1 = begin(), p2 = b->begin();
316 while (p1 != end() && p2 != b->end()) {
317 if (*p1->first < *p2->first)
return true;
318 if (*p1->first != *p2->first)
return false;
319 if (*p1->second < *p2->second)
return true;
320 if (*p1->second != *p2->second)
return false;
324 return p2 != b->end();
326 return std::type_index(
typeid(*
this)) < std::type_index(
typeid(a));
328 using obj::operator<=;
329 using obj::operator>=;
330 using obj::operator>;
331 bool operator==(
const obj &a)
const override {
332 if (
const map *b =
dynamic_cast<const map *
>(&a)) {
333 auto p1 = begin(), p2 = b->begin();
334 while (p1 != end() && p2 != b->end()) {
335 if (*p1->first != *p2->first)
return false;
336 if (*p1->second != *p2->second)
return false;
340 return (p1 == end() && p2 == b->end());
344 using obj::operator!=;
345 std::unique_ptr<obj> remove(
const char *key) {
347 auto itr = find(&tmp);
349 std::unique_ptr<obj> val = std::move(itr->second);
353 return std::unique_ptr<obj>();
355 void print_on(std::ostream &out,
int = 0,
int = 80,
356 const char * =
"")
const override;
357 bool test_width(
int &limit)
const override {
359 for (
auto &e : *
this) {
360 if (!e.first->test_width(limit))
return false;
361 if (e.second ? !e.second->test_width(limit) : (limit -= 4) < 0)
return false;
362 if ((limit -= 4) < 0)
return false;
366 using map_base::count;
367 map_base::size_type count(
const char *str)
const {
371 map_base::size_type count(std::string &str)
const {
375 map_base::size_type count(int64_t n)
const {
380 obj *operator[](
const std::unique_ptr<obj> &i)
const {
381 auto rv = find(i.get());
382 if (rv != end())
return rv->second.get();
385 obj *operator[](
const char *str)
const {
387 auto rv = find(&tmp);
388 if (rv != end())
return rv->second.get();
391 obj *operator[](
const std::string &str)
const {
393 auto rv = find(&tmp);
394 if (rv != end())
return rv->second.get();
397 obj *operator[](int64_t n)
const {
399 auto rv = find(&tmp);
400 if (rv != end())
return rv->second.get();
407 std::unique_ptr<obj> key;
408 map_base::iterator iter;
411 element_ref(map &s,
const char *k) : self(s) {
413 iter = self.find(&tmp);
414 if (iter == self.end()) key.reset(
new string(std::move(tmp)));
416 element_ref(map &s, int64_t k) : self(s) {
418 iter = self.find(&tmp);
419 if (iter == self.end()) key.reset(
new number(std::move(tmp)));
421 element_ref(map &s, std::unique_ptr<obj> &&k) : self(s) {
422 iter = self.find(k.get());
423 if (iter == self.end()) key = std::move(k);
425 void operator=(
decltype(
nullptr)) {
427 iter = self.emplace(key.release(), std::unique_ptr<obj>()).first;
429 assert(iter != self.end());
430 iter->second.reset();
433 bool operator=(
bool t) {
435 iter = self.emplace(key.release(),
436 std::unique_ptr<obj>(t ?
static_cast<obj *
>(
new True())
437 :
static_cast<obj *
>(
new False())))
440 assert(iter != self.end());
441 iter->second.reset(t ?
static_cast<obj *
>(
new True())
442 :
static_cast<obj *
>(
new False()));
446 bool operator=(
void *);
447 bool operator==(
string &str) {
448 if (key)
return false;
449 assert(iter != self.end());
450 return *iter->second == str;
452 bool operator!=(
string &str) {
return !(*
this == str); }
453 bool operator==(
const std::string &str) {
454 if (key)
return false;
455 assert(iter != self.end());
456 return *iter->second == str;
458 bool operator!=(
const std::string &str) {
return !(*
this == str); }
459 bool operator==(int64_t v) {
460 if (key)
return false;
461 assert(iter != self.end());
462 return *iter->second == v;
464 bool operator!=(int64_t v) {
return !(*
this == v); }
465 const char *operator=(
const char *v) {
467 iter = self.emplace(key.release(), std::unique_ptr<obj>(
new string(v))).first;
469 assert(iter != self.end());
470 iter->second.reset(
new string(v));
474 const std::string &operator=(
const std::string &v) {
476 iter = self.emplace(key.release(), std::unique_ptr<obj>(
new string(v))).first;
478 assert(iter != self.end());
479 iter->second.reset(
new string(v));
483 int64_t operator=(int64_t v) {
485 iter = self.emplace(key.release(), std::unique_ptr<obj>(
new number(v))).first;
487 assert(iter != self.end());
488 iter->second.reset(
new number(v));
492 int operator=(
int v) {
return static_cast<int>(*
this =
static_cast<int64_t
>(v)); }
493 unsigned int operator=(
unsigned int v) {
return (
unsigned int)(*
this = (int64_t)v); }
494#if defined(__clang__) && defined(__APPLE__)
497 size_t operator=(
size_t v) {
return (
size_t)(*
this = (int64_t)v); }
499 uint64_t operator=(uint64_t v) {
return (uint64_t)(*
this = (int64_t)v); }
502 iter = self.emplace(key.release(), mkuniq<vector>(std::move(v))).first;
504 assert(iter != self.end());
505 iter->second = mkuniq<vector>(std::move(v));
507 return dynamic_cast<vector &
>(*iter->second);
509 map &operator=(map &&v) {
511 iter = self.emplace(key.release(), mkuniq<map>(std::move(v))).first;
513 assert(iter != self.end());
514 iter->second = mkuniq<map>(std::move(v));
516 return dynamic_cast<map &
>(*iter->second);
518 const std::unique_ptr<obj> &operator=(std::unique_ptr<obj> &&v) {
520 iter = self.emplace(key.release(), std::move(v)).first;
522 assert(iter != self.end());
523 iter->second = std::move(v);
528 assert(!key && iter != self.end());
529 return *iter->second;
531 explicit operator bool()
const {
return !key; }
532 obj *get()
const {
return key ? 0 : iter->second.get(); }
533 obj *operator->()
const {
return key ? 0 : iter->second.get(); }
535 if (key) iter = self.emplace(key.release(), mkuniq<vector>()).first;
536 return dynamic_cast<vector &
>(*iter->second);
539 if (key) iter = self.emplace(key.release(), mkuniq<map>()).first;
540 return dynamic_cast<map &
>(*iter->second);
542 element_ref operator[](
const char *str) {
543 if (key) iter = self.emplace(key.release(), mkuniq<map>()).first;
544 map *m =
dynamic_cast<map *
>(iter->second.get());
545 if (!m)
throw std::runtime_error(
"lookup in non-map json object");
546 return element_ref(*m, str);
548 element_ref operator[](
const std::string &str) {
549 if (key) iter = self.emplace(key.release(), mkuniq<map>()).first;
550 map *m =
dynamic_cast<map *
>(iter->second.get());
551 if (!m)
throw std::runtime_error(
"lookup in non-map json object");
552 return element_ref(*m, str.c_str());
554 element_ref operator[](int64_t n) {
555 if (key) iter = self.emplace(key.release(), mkuniq<map>()).first;
556 map *m =
dynamic_cast<map *
>(iter->second.get());
557 if (!m)
throw std::runtime_error(
"lookup in non-map json object");
558 return element_ref(*m, n);
560 element_ref operator[](std::unique_ptr<obj> &&i) {
561 if (key) iter = self.emplace(key.release(), mkuniq<map>()).first;
562 map *m =
dynamic_cast<map *
>(iter->second.get());
563 if (!m)
throw std::runtime_error(
"lookup in non-map json object");
564 return element_ref(*m, std::move(i));
567 void push_back(T &&v) {
569 vec.push_back(std::forward<T>(v));
573 return !key &&
dynamic_cast<T *
>(iter->second.get()) !=
nullptr;
577 if (key) iter = self.emplace(key.release(), mkuniq<T>()).first;
578 return dynamic_cast<T &
>(*iter->second);
581 friend std::ostream &operator<<(std::ostream &out,
const element_ref &el);
584 element_ref operator[](
const char *str) {
return element_ref(*
this, str); }
585 element_ref operator[](
const std::string &str) {
return element_ref(*
this, str.c_str()); }
586 element_ref operator[](int64_t n) {
return element_ref(*
this, n); }
587 element_ref operator[](std::unique_ptr<obj> &&i) {
return element_ref(*
this, std::move(i)); }
588 using map_base::erase;
589 map_base::size_type erase(
const char *str) {
591 return map_base::erase(&tmp);
593 map_base::size_type erase(int64_t n) {
595 return map_base::erase(&tmp);
597 map *as_map()
override {
return this; }
598 const map *as_map()
const override {
return this; }
599 std::unique_ptr<obj> copy() &&
override {
return mkuniq<map>(std::move(*
this)); }
600 std::unique_ptr<obj> clone()
const override {
602 for (
auto &e : *
this)
603 m->emplace(e.first ? e.first->clone().release() :
nullptr, clone_ptr(e.second));
604 return std::unique_ptr<map>(m);
611 map &
merge(
const map &a);