17 #ifndef AWALI_JSON_NODE_HH 
   18 #define AWALI_JSON_NODE_HH 
   23 #include<unordered_map> 
   61   : 
i(uos.
i), 
str(std::move(uos.
str)) {}
 
   71   inline std::string 
const& 
string()
 const {
return str;}
 
   74   inline operator std::string&() {
return str;}
 
   75   inline operator std::string()
 const {
return str;}
 
   76   inline operator unsigned()
 const {
return i;}
 
   79   { 
if (
this != &uos) { 
i = uos.
i; 
str = uos.
str;} 
return *
this;}
 
   82   { 
i = uos.i, 
str = std::move(uos.str); 
return *
this;}
 
   85 typedef std::vector<uint_or_string_t> 
path_t;
 
  128   virtual const char* 
what() const noexcept
 override  
  176                 std::initializer_list<node_kind_t> types);
 
  181                                      std::initializer_list<node_kind_t> types);
 
  227   virtual inline null_t const* 
null() 
const 
  264   inline virtual unsigned height()
 const {
return 0;}
 
  283   virtual node_t const* 
at(std::string 
const& key) 
const;
 
  350   inline bool is(std::vector<node_kind_t>
const& v)
 const 
  351   {
for(
auto k:v) 
if (this->
is(k)) 
return true; 
return false;}
 
  355   virtual inline unsigned arity()
 const {
return 0u;}
 
  380   inline virtual bool has_child(std::string 
const& key)
 const override 
  383   virtual node_t* 
at(std::string 
const& key) 
override;
 
  385   virtual node_t const* 
at(std::string 
const& key) 
const override;
 
  392     std::string key, 
node_t* node);
 
  395     std::string key, 
node_t* node);
 
  397   inline void erase(std::string 
const& key) {
 
  398     auto it = _fields.find(key);
 
  399     if (it != _fields.end())
 
  409   inline virtual unsigned height()
 const override {
 
  412       unsigned x = p.second->height() + 1;
 
  424   inline virtual unsigned arity()
 const override {
return fields.size();}
 
  455   virtual node_t const* 
at(
unsigned i) 
const override;
 
  470   inline virtual bool has_child(
unsigned i)
 const override 
  471   {
return i < 
arity();}
 
  473   inline virtual unsigned height()
 const override {
 
  476       unsigned x = p->height()+1;
 
  584   inline virtual null_t* 
null() 
override {
return this;}
 
  586   inline virtual null_t const* 
null() 
const override {
return this;}
 
virtual node_t * at(unsigned i) override
 
const_iterator begin() const
Definition: node.hh:458
 
virtual unsigned height() const override
Definition: node.hh:473
 
const_iterator end() const
Definition: node.hh:461
 
virtual node_t const  * at(unsigned i) const override
 
std::vector< node_t * >::iterator iterator
Definition: node.hh:438
 
array_t * push_back(node_t *p)
 
array_t()
Definition: node.hh:441
 
virtual array_t * array() override
Casts this node to array_t.
Definition: node.hh:447
 
iterator end()
Definition: node.hh:460
 
array_t(std::vector< node_t * > v)
Definition: node.hh:442
 
virtual array_t * copy() const override
 
unsigned arity() const override
Definition: node.hh:465
 
std::vector< node_t * > _values
Definition: node.hh:433
 
virtual bool has_child(unsigned i) const override
Definition: node.hh:470
 
iterator begin()
Definition: node.hh:457
 
std::vector< node_t * >::const_iterator const_iterator
Definition: node.hh:439
 
virtual array_t const  * array() const override
Casts this node to array_t.
Definition: node.hh:448
 
std::vector< node_t * > const  & values
Definition: node.hh:436
 
unsigned empty() const
Definition: node.hh:467
 
bool value
Definition: node.hh:557
 
virtual bool to_bool() const override
Coerces this node_t to bool.
Definition: node.hh:568
 
bool_t(bool v)
Definition: node.hh:559
 
virtual bool_t * boolean() override
Casts this node to bool_t.
Definition: node.hh:564
 
virtual bool_t const  * boolean() const override
Casts this node to bool_t.
Definition: node.hh:565
 
virtual double to_double() const override
Coerces this node_t to a double
Definition: node.hh:570
 
virtual int to_int() const override
Coerces this node_t to int.
Definition: node.hh:569
 
virtual bool_t * copy() const override
Definition: node.hh:561
 
Exception used when trying to coerce a node to a given type.
Definition: node.hh:143
 
coercion_exception(std::string const &message, std::string const &caller, node_t const *node=nullptr)
Definition: node.hh:145
 
coercion_exception(std::string message, node_t const *node=nullptr)
Definition: node.hh:149
 
exception(std::string message, node_t const *node=nullptr)
Definition: node.hh:125
 
node_t const  * node
Definition: node.hh:114
 
virtual const char * what() const noexcept override
Definition: node.hh:128
 
exception(std::string const &message, std::string const &caller, node_t const *node=nullptr)
 
exception(std::string const &message, std::string const &caller, path_t path_to_root, int line, int col)
 
std::string caller
Definition: node.hh:113
 
std::string what_msg
Definition: node.hh:117
 
node_t * attempted_parsed_tree
Definition: node.hh:115
 
path_t path_to_root
Definition: node.hh:116
 
std::string message
Definition: node.hh:112
 
virtual float_t * floating() override
Casts this not to float_t.
Definition: node.hh:517
 
double value
Definition: node.hh:510
 
virtual double to_double() const override
Coerces this node_t to a double
Definition: node.hh:522
 
float_t(double v)
Definition: node.hh:512
 
virtual int to_int() const override
Coerces this node_t to int.
 
virtual float_t * copy() const override
Definition: node.hh:514
 
virtual float_t const  * floating() const override
Casts this not to float_t.
Definition: node.hh:518
 
virtual bool to_bool() const override
Coerces this node_t to bool.
 
virtual bool to_bool() const override
Coerces this node_t to bool.
 
virtual int_t * integer() override
Casts this node to int_t.
Definition: node.hh:496
 
virtual int to_int() const override
Coerces this node_t to int.
Definition: node.hh:500
 
int value
Definition: node.hh:490
 
virtual int_t * copy() const override
Definition: node.hh:494
 
virtual int_t const  * integer() const override
Casts this node to int_t.
Definition: node.hh:497
 
virtual double to_double() const override
Coerces this node_t to a double
Definition: node.hh:501
 
int_t(int v)
Definition: node.hh:492
 
std::vector< node_kind_t > expected_types
Definition: node.hh:170
 
static std::string message_builder(node_kind_t caller_kind, std::initializer_list< node_kind_t > types)
 
kind_mismatch(std::string const &caller, node_t const *node, std::initializer_list< node_kind_t > types)
 
kind_mismatch(std::string const &caller, node_t const *node, node_kind_t expected_type)
Definition: node.hh:171
 
bool is(node_kind_t k) const
Definition: node.hh:349
 
node_t const  * parent
Definition: node.hh:195
 
virtual float_t const  * floating() const
Casts this not to float_t.
Definition: node.hh:219
 
virtual node_t * at(std::string const &key)
 
node_t * at_path(path_t const &path, unsigned i=0)
 
virtual bool_t const  * boolean() const
Casts this node to bool_t.
Definition: node.hh:223
 
path_t path_to_root() const
 
virtual double to_double() const
Coerces this node_t to a double
Definition: node.hh:343
 
virtual std::string to_string() const
Coerces this node_t to an std::string.
Definition: node.hh:331
 
virtual node_t * at(unsigned i)
 
bool is(std::vector< node_kind_t >const &v) const
Definition: node.hh:350
 
virtual node_t const  * at(unsigned i) const
 
virtual array_t * array()
Casts this node to array_t.
Definition: node.hh:235
 
bool has_path(json::path_t const &path) const
 
virtual int_t const  * integer() const
Casts this node to int_t.
Definition: node.hh:211
 
virtual int to_int() const
Coerces this node_t to int.
Definition: node.hh:321
 
node_t const  * at_path(path_t const &path, unsigned i=0) const
 
virtual unsigned height() const
Definition: node.hh:264
 
virtual string_t * string()
Casts this node to string_t.
Definition: node.hh:243
 
virtual bool to_bool() const
Coerces this node_t to bool.
Definition: node.hh:306
 
virtual float_t * floating()
Casts this not to float_t.
Definition: node.hh:247
 
virtual string_t const  * string() const
Casts this node to string_t.
Definition: node.hh:215
 
virtual ~node_t()
Definition: node.hh:200
 
virtual bool has_child(std::string const &) const
Definition: node.hh:284
 
virtual node_t const  * at(std::string const &key) const
 
virtual object_t * object()
Casts this node to object_t.
Definition: node.hh:231
 
virtual object_t const  * object() const
Casts this node to object_t.
Definition: node.hh:203
 
node_kind_t const kind
Definition: node.hh:196
 
node_t(node_kind_t k)
Definition: node.hh:360
 
virtual node_t * copy() const =0
 
virtual bool has_child(unsigned) const
Definition: node.hh:291
 
virtual unsigned arity() const
Definition: node.hh:355
 
virtual bool_t * boolean()
Casts this node to bool_t.
Definition: node.hh:251
 
virtual int_t * integer()
Casts this node to int_t.
Definition: node.hh:239
 
bool is_leaf() const
Definition: node.hh:353
 
virtual array_t const  * array() const
Casts this node to array_t.
Definition: node.hh:207
 
null_t()
Definition: node.hh:580
 
virtual null_t * copy() const override
Definition: node.hh:582
 
const_iterator end() const
Definition: node.hh:422
 
virtual bool has_child(std::string const &key) const override
Definition: node.hh:380
 
linked_map_t< std::string, node_t * >::const_iterator const_iterator
Definition: node.hh:372
 
iterator begin()
Definition: node.hh:419
 
object_t(std::string key, node_t *child)
Definition: node.hh:375
 
virtual node_t * at(std::string const &key) override
 
object_t * insert_after(std::string const &ref_key, std::string key, node_t *node)
 
object_t * push_back(std::string key, node_t *node)
 
virtual object_t * object() override
Casts this node to object_t.
Definition: node.hh:404
 
object_t()
Definition: node.hh:374
 
iterator end()
Definition: node.hh:420
 
virtual unsigned height() const override
Definition: node.hh:409
 
const_iterator begin() const
Definition: node.hh:421
 
void erase(std::string const &key)
Definition: node.hh:397
 
virtual object_t const  * object() const override
Casts this node to object_t.
Definition: node.hh:405
 
linked_map_t< std::string, node_t * >::iterator iterator
Definition: node.hh:371
 
virtual object_t * copy() const override
 
object_t * insert_before(std::string const &ref_key, std::string key, node_t *node)
 
object_t * push_front(std::string key, node_t *node)
 
virtual node_t const  * at(std::string const &key) const override
 
virtual unsigned arity() const override
Definition: node.hh:424
 
linked_map_t< std::string, node_t * > const  & fields
Definition: node.hh:370
 
out_of_range(std::string const &message, node_t const *node=nullptr)
Definition: node.hh:161
 
out_of_range(std::string const &message, std::string const &caller, node_t const *node=nullptr)
Definition: node.hh:156
 
parse_exception(std::string const &message, std::string const &caller, path_t path_to_root, int line, int col)
Definition: node.hh:134
 
parse_exception(std::string const &message, std::string const &caller)
Definition: node.hh:137
 
virtual int to_int() const override
Coerces this node_t to int.
 
virtual std::string to_string() const override
Coerces this node_t to an std::string.
Definition: node.hh:548
 
virtual bool to_bool() const override
Coerces this node_t to bool.
 
std::string value
Definition: node.hh:531
 
virtual string_t * string() override
Casts this node to string_t.
Definition: node.hh:542
 
virtual string_t * copy() const override
Definition: node.hh:539
 
virtual double to_double() const override
Coerces this node_t to a double
 
virtual string_t const  * string() const override
Casts this node to string_t.
Definition: node.hh:543
 
string_t(std::string v)
Definition: node.hh:536
 
string_t(char c)
Definition: node.hh:533
 
uint_or_string_t & operator=(uint_or_string_t const &uos)
Definition: node.hh:78
 
unsigned integer() const
Definition: node.hh:69
 
uint_or_string_t(std::string s)
Definition: node.hh:55
 
uint_or_string_t(char const *s)
Definition: node.hh:63
 
bool is_string() const
Definition: node.hh:65
 
std::string str
Definition: node.hh:51
 
uint_or_string_t(uint_or_string_t const &uos)
Definition: node.hh:57
 
long i
Definition: node.hh:50
 
uint_or_string_t(unsigned integer)
Definition: node.hh:53
 
std::string const  & string() const
Definition: node.hh:71
 
bool is_integer() const
Definition: node.hh:67
 
uint_or_string_t & operator=(uint_or_string_t &&uos)
Definition: node.hh:81
 
uint_or_string_t(uint_or_string_t &&uos)
Definition: node.hh:60
 
Implemention of a linked hash-map.
Definition: linked_map.hxx:72
 
std::list< pair_t >::iterator iterator
Definition: linked_map.hxx:81
 
std::list< pair_t >::const_iterator const_iterator
Definition: linked_map.hxx:82
 
std::ostream & json(automaton_t aut, std::ostream &out)
 
std::vector< uint_or_string_t > path_t
Definition: node.hh:85
 
std::string const  & string_of(node_kind_t kind)
 
std::ostream & operator<<(std::ostream &o, node_kind_t kind)
 
node_kind_t
Definition: node.hh:92
 
@ OBJECT
Definition: node.hh:93
 
@ INTEGER
Definition: node.hh:95
 
@ ARRAY
Definition: node.hh:94
 
@ BOOLEAN
Definition: node.hh:98
 
@ STRING
Definition: node.hh:97
 
@ FLOATING
Definition: node.hh:96
 
@ _NULL
Definition: node.hh:99
 
Main namespace of Awali.
Definition: ato.hh:22