Home My Page Projects Code Snippets Project Openings diderot
Summary Activity Tracker Tasks SCM

SCM Repository

[diderot] Diff of /branches/vis15/src/debugger/engine/json.hxx
ViewVC logotype

Diff of /branches/vis15/src/debugger/engine/json.hxx

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 5125, Wed Jul 19 18:32:51 2017 UTC revision 5126, Wed Jul 19 21:04:31 2017 UTC
# Line 26  Line 26 
26      enum Type {      enum Type {
27          T_OBJECT,       //!< object consisting of name-value pairs          T_OBJECT,       //!< object consisting of name-value pairs
28          T_ARRAY,        //!< arrays of JSON values          T_ARRAY,        //!< arrays of JSON values
29            T_INTEGER,      //!< integer numbers
30          T_NUMBER,       //!< numbers (represented as doubles)          T_NUMBER,       //!< numbers (represented as doubles)
31          T_STRING,       //!< strings          T_STRING,       //!< strings
32          T_BOOL,         //!< booleans          T_BOOL,         //!< booleans
33          T_NULL          //!< the null value          T_NULL          //!< the null value
34      };      };
35    
36      class Value;      class value;
37      class Object;      class object;
38      class Array;      class array;
39      class Number;      class number;
40      class String;      class string;
41      class Bool;      class boolean;
42      class Null;      class null;
43    
44    // parse a JSON file; this returns nullptr if there is a parsing error    // parse a JSON file; this returns nullptr if there is a parsing error
45      Value *ParseFile (std::string filename);      value *parse_file (std::string filename);
46    
47    // virtual base class of JSON values    // virtual base class of JSON values
48      class Value {      class value {
49        public:        public:
50    
51        //! return the type of this JSON value        //! return the type of this JSON value
52          Type type() const { return this->_ty; }          Type type() const { return this->_ty; }
53    
54        //! return true if this value is an object        //! return true if this value is an object
55          bool isObject() const { return (this->_ty == T_OBJECT); }          bool isObject() const { return (this->type() == T_OBJECT); }
56    
57        //! return true if this value is an array        //! return true if this value is an array
58          bool isArray() const { return (this->_ty == T_ARRAY); }          bool isArray() const { return (this->type() == T_ARRAY); }
59    
60          //! return true if this value is an integer
61            bool isInteger() const { return (this->type() == T_INTEGER); }
62    
63        //! return true if this value is a number        //! return true if this value is a number
64          bool isNumber() const { return (this->_ty == T_NUMBER); }          bool isNumber() const { return (this->type() == T_NUMBER); }
65    
66        //! return true if this value is a string        //! return true if this value is a string
67          bool isString() const { return (this->_ty == T_STRING); }          bool isString() const { return (this->type() == T_STRING); }
68    
69        //! return true if this value is a boolean        //! return true if this value is a boolean
70          bool isBool() const { return (this->_ty == T_BOOL); }          bool isBool() const { return (this->type() == T_BOOL); }
71    
72        //! return true if this value is the null value        //! return true if this value is the null value
73          bool isNull() const { return (this->_ty == T_NULL); }          bool isNull() const { return (this->type() == T_NULL); }
74    
75        //! dynamic cast to JSON object        //! dynamic cast to JSON object
76          const Object *asObject () const;          const object *asObject () const;
77    
78        //! dynamic cast to JSON object        //! dynamic cast to JSON object
79          const Array *asArray () const;          const array *asArray () const;
80    
81        //! dynamic cast to JSON object        //! dynamic cast to JSON object
82          const Number *asNumber () const;          const number *asNumber () const;
83    
84        //! dynamic cast to JSON object        //! dynamic cast to JSON object
85          const String *asString () const;          const string *asString () const;
86    
87        //! dynamic cast to JSON object        //! dynamic cast to JSON object
88          const Bool *asBool () const;          const boolean *asBool () const;
89    
90          virtual ~Value() = 0;          size_t hash () const
91            {
92                if (this->_hashed) {
93                    return this->_hash;
94                }
95                else {
96                    return this->computeHash();
97                }
98            }
99    
100            virtual ~value() = 0;
101          virtual std::string toString() = 0;          virtual std::string toString() = 0;
102    
103        protected:        protected:
104    
         explicit Value (Type ty) : _ty(ty) { };  
   
105          Type    _ty;          Type    _ty;
106            mutable bool _hashed;
107            mutable size_t _hash;
108    
109            explicit value (Type ty) : _ty(ty) { };
110    
111            virtual size_t computeHash () const = 0;
112    
113      };      };
114    
115      inline std::ostream& operator<< (std::ostream& s, Value *v)      inline std::ostream& operator<< (std::ostream& s, value *v)
116      {      {
117          return s << v->toString();          return s << v->toString();
118      }      }
119    
120    //! JSON objects    //! JSON objects
121      class Object : public Value {      class object : public value {
122        public:        public:
123          Object ();          object ();
124          ~Object ();          ~object ();
125    
126        //! return the number of fields in the object        //! return the number of fields in the object
127          int size () const { return this->_value.size(); }          int size () const { return this->_value.size(); }
128    
129        //! insert a key-value pair into the object        //! insert a key-value pair into the object
130          void insert (std::string key, Value *val);          void insert (std::string key, value *val);
131    
132        //! return the value corresponding to the given key.        //! return the value corresponding to the given key.
133        //! \returns nil if the key is not defined in the object        //! \returns nil if the key is not defined in the object
134          Value *operator[] (std::string key) const;          value *operator[] (std::string key) const;
135    
136          std::string toString();          std::string toString();
137    
138        private:        private:
139          std::map<std::string, Value *> _value;          std::map<std::string, value *> _value;
140      };      };
141    
142    //! JSON arrays    //! JSON arrays
143      class Array : public Value {      class array : public value {
144        public:        public:
145          Array ();          array ();
146          ~Array ();          ~array ();
147    
148          int length () const { return static_cast<int>(this->_value.size()); }          int length () const { return static_cast<int>(this->_value.size()); }
149          void add (Value *v) { this->_value.push_back(v); }          void add (value *v) { this->_value.push_back(v); }
150    
151          Value *operator[] (int idx) const { return this->_value[idx]; }          value *operator[] (int idx) const { return this->_value[idx]; }
152    
153          std::string toString();          std::string toString();
154    
155        private:        private:
156          std::vector<Value *> _value;          std::vector<value *> _value;
157      };      };
158    
159      class Number : public Value {  /* FIXME: integer vs. real */
160        class number : public value {
161        public:        public:
162          Number (double v);          number (double v);
163          ~Number ();          ~number ();
164    
165          double value () const { return this->_value; }          double value () const { return this->_value; }
166    
# Line 150  Line 170 
170          double _value;          double _value;
171      };      };
172    
173      class String : public Value {      class integer : public value {
174          public:
175            integer (int64_t v);
176            ~integer ();
177    
178            int64_t value () const { return this->_value; }
179    
180            std::string toString();
181    
182          private:
183            int64_t _value;
184        };
185    
186        class string : public value {
187        public:        public:
188          String (std::string v);          string (std::string v);
189          ~String ();          ~string ();
190    
191          std::string value () const { return this->_value; }          std::string value () const { return this->_value; }
192    
# Line 163  Line 196 
196          std::string _value;          std::string _value;
197      };      };
198    
199      class Bool : public Value {      class boolean : public value {
200        public:        public:
201          Bool (bool v);          boolean (bool v);
202          ~Bool ();          ~boolean ();
203    
204          bool value () const { return this->_value; }          bool value () const { return this->_value; }
205    
# Line 176  Line 209 
209          bool _value;          bool _value;
210      };      };
211    
212      class Null : public Value {      class Null : public value {
213        public:        public:
214          Null ();          Null ();
215          ~Null ();          ~Null ();

Legend:
Removed from v.5125  
changed lines
  Added in v.5126

root@smlnj-gforge.cs.uchicago.edu
ViewVC Help
Powered by ViewVC 1.0.0