Browse Source

Empty object case

isundil 9 years ago
parent
commit
8ad44e866e
3 changed files with 21 additions and 58 deletions
  1. 8 36
      include/jsonPrimitive.hh
  2. 4 16
      src/jsonPrimitive.cpp
  3. 9 6
      src/streamConsumer.cpp

+ 8 - 36
include/jsonPrimitive.hh

@@ -9,47 +9,19 @@ class JSonPrimitive: public JSonElement
     public:
         JSonPrimitive(T const &v);
         virtual ~JSonPrimitive();
+        bool operator<(const JSonPrimitive<T> &other) const;
 
     protected:
         const T value;
 };
 
-template<> class JSonPrimitive<float>: public JSonElement
-{
-    public:
-        JSonPrimitive(const std::string &v);
-
-    protected:
-        const float value;
-};
-
-template<> class JSonPrimitive<long long int>: public JSonElement
-{
-    public:
-        JSonPrimitive(const std::string &v);
-
-    protected:
-        const bool value;
-};
+template<typename T>
+JSonPrimitive<T>::JSonPrimitive(T const &v): value(v)
+{ }
 
-template<> class JSonPrimitive<std::string>: public JSonElement
+template<typename T>
+bool JSonPrimitive<T>::operator<(const JSonPrimitive<T> &other) const
 {
-    public:
-        JSonPrimitive(const std::string &v);
-
-        virtual bool operator<(const JSonPrimitive<std::string> &other) const;
-
-    protected:
-        //TODO
-        const std::string value;
-};
-
-template<> class JSonPrimitive<bool>: public JSonElement
-{
-    public:
-        JSonPrimitive(bool v);
-
-    protected:
-        const bool value;
-};
+    return value < other.value;
+}
 

+ 4 - 16
src/jsonPrimitive.cpp

@@ -1,19 +1,7 @@
 #include "jsonPrimitive.hh"
 
-JSonPrimitive<std::string>::JSonPrimitive(std::string const &v): value(v)
-{ }
-
-bool JSonPrimitive<std::string>::operator<(const JSonPrimitive<std::string> &other) const
-{
-    return value < other.value;
-}
-
-JSonPrimitive<bool>::JSonPrimitive(bool v): value(v)
-{ }
-
-JSonPrimitive<float>::JSonPrimitive(const std::string &v): value(std::stof(v))
-{ }
-
-JSonPrimitive<long long int>::JSonPrimitive(const std::string &v): value(std::stol(v))
-{ }
+template<> JSonPrimitive<float>::~JSonPrimitive() {}
+template<> JSonPrimitive<bool>::~JSonPrimitive() {}
+template<> JSonPrimitive<long long>::~JSonPrimitive() {}
+template<> JSonPrimitive<std::string>::~JSonPrimitive() {}
 

+ 9 - 6
src/streamConsumer.cpp

@@ -41,21 +41,24 @@ JSonElement * const StreamConsumer::getRoot() const
 
 JSonObject *StreamConsumer::readObject()
 {
-    JSonObject *result = new JSonObject();
-    std::string buf;
     JSonElement *keyObj;
+    JSonObject *result = nullptr;
+    std::string buf;
 
     do
     {
         keyObj = consumeToken(buf);
-        //TODO empty object case
+        if (result == nullptr && keyObj == nullptr && buf == "}")
+            return new JSonObject();
         JSonPrimitive<std::string> *key = dynamic_cast<JSonPrimitive<std::string> *>(keyObj);
         if (key == nullptr)
             throw new JsonException(stream.tellg());
         if (consumeToken(buf) != nullptr || buf != ":")
             throw new JsonException(stream.tellg());
         JSonElement *child = readNext();
-        if (result->contains(*key))
+        if (result == nullptr)
+            result = new JSonObject();
+        else if (result->contains(*key))
             throw new JsonException(stream.tellg()); //Double key
         result->push(*key, child);
         delete keyObj;
@@ -133,8 +136,8 @@ JSonElement *StreamConsumer::consumeToken(std::string &buf)
             {
                 stream.unget();
                 if (numberIsFloat)
-                    return new JSonPrimitive<float>(buf);
-                return new JSonPrimitive<long long int>(buf);
+                    return new JSonPrimitive<float>(std::stof(buf));
+                return new JSonPrimitive<long long int>(std::stol(buf));
             }
         }
         else