From b37e93ca37142375ef8243d740f7a5e5ac603abc Mon Sep 17 00:00:00 2001 From: Edouard DUPIN Date: Tue, 24 May 2016 21:47:00 +0200 Subject: [PATCH] [DEV] add a machine generation of json (remove the space and indentation ...) --- ejson/Object.cpp | 10 ---------- ejson/Object.h | 6 ------ ejson/Value.cpp | 20 ++++++++++++++++++++ ejson/Value.h | 11 +++++++++++ ejson/internal/Array.cpp | 16 ++++++++++++++++ ejson/internal/Array.h | 1 + ejson/internal/Boolean.cpp | 10 +++++++++- ejson/internal/Boolean.h | 1 + ejson/internal/Null.cpp | 4 ++++ ejson/internal/Null.h | 1 + ejson/internal/Number.cpp | 13 +++++++++++-- ejson/internal/Number.h | 1 + ejson/internal/Object.cpp | 16 ++++++++++++++++ ejson/internal/Object.h | 2 ++ ejson/internal/String.cpp | 8 +++++++- ejson/internal/String.h | 9 +++++---- ejson/internal/Value.h | 8 +++++++- ejson/valueType.cpp | 18 +++++++++--------- 18 files changed, 121 insertions(+), 34 deletions(-) diff --git a/ejson/Object.cpp b/ejson/Object.cpp index 8152d52..e7f464a 100644 --- a/ejson/Object.cpp +++ b/ejson/Object.cpp @@ -155,16 +155,6 @@ const ejson::Object::iterator ejson::Object::end() const { return ejson::Object::iterator(*this, size()); } -std::string ejson::Object::generate() const { - std::string out; - if (m_data == nullptr) { - EJSON_ERROR("Can not remove (nullptr) ..."); - return out; - } - static_cast(m_data.get())->iGenerate(out, 0); - return out; -} - #include template class ejson::iterator; diff --git a/ejson/Object.h b/ejson/Object.h index cd217e4..8839654 100644 --- a/ejson/Object.h +++ b/ejson/Object.h @@ -137,12 +137,6 @@ namespace ejson { * @return New valid iterator on the next element or this.end() */ iterator remove(const iterator& _it); - public: - /** - * @brief generate a string that contain the created XML - * @return generated data - */ - std::string generate() const; }; } diff --git a/ejson/Value.cpp b/ejson/Value.cpp index 6b9e6fc..d40497e 100644 --- a/ejson/Value.cpp +++ b/ejson/Value.cpp @@ -42,6 +42,26 @@ bool ejson::Value::exist() const { return true; } +std::string ejson::Value::generateHumanString() const { + std::string out; + if (m_data == nullptr) { + EJSON_ERROR("Can not remove (nullptr) ..."); + return out; + } + static_cast(m_data.get())->iGenerate(out, 0); + return out; +} + +std::string ejson::Value::generateMachineString() const { + std::string out; + if (m_data == nullptr) { + EJSON_ERROR("Can not remove (nullptr) ..."); + return out; + } + static_cast(m_data.get())->iMachineGenerate(out); + return out; +} + /* ejson::FilePos ejson::Value::getPos() const { if (m_data == nullptr) { diff --git a/ejson/Value.h b/ejson/Value.h index 2e68fe0..3c03a7b 100644 --- a/ejson/Value.h +++ b/ejson/Value.h @@ -187,6 +187,17 @@ namespace ejson { * @return nullptr in an error occured, the pointer on the element otherwise */ ejson::Value clone() const; + public: + /** + * @brief generate a string that contain the created JSON + * @return generated data + */ + std::string generateHumanString() const; + /** + * @brief generate a string that contain the created JSON + * @return generated data + */ + std::string generateMachineString() const; }; //! @not_in_doc std::ostream& operator <<(std::ostream& _os, const ejson::Value& _obj); diff --git a/ejson/internal/Array.cpp b/ejson/internal/Array.cpp index 8a1c71d..f13c528 100644 --- a/ejson/internal/Array.cpp +++ b/ejson/internal/Array.cpp @@ -206,6 +206,22 @@ bool ejson::internal::Array::iGenerate(std::string& _data, size_t _indent) const return true; } +void ejson::internal::Array::iMachineGenerate(std::string& _data) const { + _data += "["; + bool needComa = false; + for (size_t iii=0; iiiiMachineGenerate(_data); + needComa = true; + } + _data += "]"; +} + size_t ejson::internal::Array::size() const { return m_value.size(); } diff --git a/ejson/internal/Array.h b/ejson/internal/Array.h index 8f1d6ca..f302714 100644 --- a/ejson/internal/Array.h +++ b/ejson/internal/Array.h @@ -61,6 +61,7 @@ namespace ejson { public: bool iParse(const std::string& _data, size_t& _pos, ejson::FilePos& _filePos, ejson::internal::Document& _doc) override; bool iGenerate(std::string& _data, size_t _indent) const override; + void iMachineGenerate(std::string& _data) const override; void clear() override; bool transfertIn(ememory::SharedPtr _obj) override; ememory::SharedPtr clone() const override; diff --git a/ejson/internal/Boolean.cpp b/ejson/internal/Boolean.cpp index 7638bb7..aadf26d 100644 --- a/ejson/internal/Boolean.cpp +++ b/ejson/internal/Boolean.cpp @@ -55,7 +55,7 @@ bool ejson::internal::Boolean::iParse(const std::string& _data, size_t& _pos, ej bool ejson::internal::Boolean::iGenerate(std::string& _data, size_t _indent) const { - if (true == m_value) { + if (m_value == true) { _data += "true"; } else { _data += "false"; @@ -63,6 +63,14 @@ bool ejson::internal::Boolean::iGenerate(std::string& _data, size_t _indent) con return true; } +void ejson::internal::Boolean::iMachineGenerate(std::string& _data) const { + if (m_value == true) { + _data += "true"; + } else { + _data += "false"; + } +} + bool ejson::internal::Boolean::transfertIn(ememory::SharedPtr _obj) { if (_obj == nullptr) { diff --git a/ejson/internal/Boolean.h b/ejson/internal/Boolean.h index 4171de0..efdd314 100644 --- a/ejson/internal/Boolean.h +++ b/ejson/internal/Boolean.h @@ -43,6 +43,7 @@ namespace ejson { public: bool iParse(const std::string& _data, size_t& _pos, ejson::FilePos& _filePos, ejson::internal::Document& _doc) override; bool iGenerate(std::string& _data, size_t _indent) const override; + void iMachineGenerate(std::string& _data) const override; bool transfertIn(ememory::SharedPtr _obj) override; ememory::SharedPtr clone() const override; }; diff --git a/ejson/internal/Null.cpp b/ejson/internal/Null.cpp index 64e49e5..587feea 100644 --- a/ejson/internal/Null.cpp +++ b/ejson/internal/Null.cpp @@ -40,6 +40,10 @@ bool ejson::internal::Null::iGenerate(std::string& _data, size_t _indent) const return true; } +void ejson::internal::Null::iMachineGenerate(std::string& _data) const { + _data += "null"; +} + bool ejson::internal::Null::transfertIn(ememory::SharedPtr _obj) { if (_obj == nullptr) { diff --git a/ejson/internal/Null.h b/ejson/internal/Null.h index e2bfb0a..5866187 100644 --- a/ejson/internal/Null.h +++ b/ejson/internal/Null.h @@ -28,6 +28,7 @@ namespace ejson { public: bool iParse(const std::string& _data, size_t& _pos, ejson::FilePos& _filePos, ejson::internal::Document& _doc) override; bool iGenerate(std::string& _data, size_t _indent) const override; + void iMachineGenerate(std::string& _data) const override; bool transfertIn(ememory::SharedPtr _obj) override; ememory::SharedPtr clone() const override; }; diff --git a/ejson/internal/Number.cpp b/ejson/internal/Number.cpp index 2bb9294..daafcb1 100644 --- a/ejson/internal/Number.cpp +++ b/ejson/internal/Number.cpp @@ -40,8 +40,18 @@ bool ejson::internal::Number::iParse(const std::string& _data, size_t& _pos, ejs return false; } - bool ejson::internal::Number::iGenerate(std::string& _data, size_t _indent) const { + // special thing to remove .000000 at the end of perfect number ... + int64_t tmpVal = m_value; + if (double(tmpVal) == m_value) { + _data += etk::to_string(tmpVal); + } else { + _data += etk::to_string(m_value); + } + return true; +} + +void ejson::internal::Number::iMachineGenerate(std::string& _data) const { // special thing to remove .000000 at the end of perfect number ... int64_t tmpVal = m_value; if ((double)tmpVal == m_value) { @@ -49,7 +59,6 @@ bool ejson::internal::Number::iGenerate(std::string& _data, size_t _indent) cons } else { _data += etk::to_string(m_value); } - return true; } diff --git a/ejson/internal/Number.h b/ejson/internal/Number.h index 1b1471c..1d48954 100644 --- a/ejson/internal/Number.h +++ b/ejson/internal/Number.h @@ -43,6 +43,7 @@ namespace ejson { public: bool iParse(const std::string& _data, size_t& _pos, ejson::FilePos& _filePos, ejson::internal::Document& _doc) override; bool iGenerate(std::string& _data, size_t _indent) const override; + void iMachineGenerate(std::string& _data) const override; bool transfertIn(ememory::SharedPtr _obj) override; ememory::SharedPtr clone() const override; }; diff --git a/ejson/internal/Object.cpp b/ejson/internal/Object.cpp index 0373c5f..c37a584 100644 --- a/ejson/internal/Object.cpp +++ b/ejson/internal/Object.cpp @@ -272,6 +272,22 @@ bool ejson::internal::Object::iGenerate(std::string& _data, size_t _indent) cons return true; } +void ejson::internal::Object::iMachineGenerate(std::string& _data) const { + _data += "{"; + bool needComa = false; + for (int32_t iii=0; iiiiMachineGenerate(_data); + } + _data += "}"; +} + bool ejson::internal::Object::exist(const std::string& _name) const { return m_value.exist(_name); } diff --git a/ejson/internal/Object.h b/ejson/internal/Object.h index 7c9020d..33c63e9 100644 --- a/ejson/internal/Object.h +++ b/ejson/internal/Object.h @@ -36,6 +36,7 @@ namespace ejson { */ static ememory::SharedPtr create(const std::string& _data); protected: + // TODO : Change this with a generic methode ... etk::Hash > m_value; //!< value of the node (for element this is the name, for text it is the inside text ...) public: /** @@ -117,6 +118,7 @@ namespace ejson { public: bool iParse(const std::string& _data, size_t& _pos, ejson::FilePos& _filePos, ejson::internal::Document& _doc) override; bool iGenerate(std::string& _data, size_t _indent) const override; + void iMachineGenerate(std::string& _data) const override; void clear() override; bool transfertIn(ememory::SharedPtr _obj) override; ememory::SharedPtr clone() const override; diff --git a/ejson/internal/String.cpp b/ejson/internal/String.cpp index 4eeb443..22b0f96 100644 --- a/ejson/internal/String.cpp +++ b/ejson/internal/String.cpp @@ -53,11 +53,17 @@ bool ejson::internal::String::iParse(const std::string& _data, size_t& _pos, ejs bool ejson::internal::String::iGenerate(std::string& _data, size_t _indent) const { _data += "\"";; + // TODO : Manage the \" elements .... _data += m_value; _data += "\"";; return true; } - +void ejson::internal::String::iMachineGenerate(std::string& _data) const { + _data += "\"";; + // TODO : Manage the \" elements .... + _data += m_value; + _data += "\"";; +} bool ejson::internal::String::transfertIn(ememory::SharedPtr _obj) { if (_obj == nullptr) { diff --git a/ejson/internal/String.h b/ejson/internal/String.h index cb8ffcd..fbff743 100644 --- a/ejson/internal/String.h +++ b/ejson/internal/String.h @@ -41,10 +41,11 @@ namespace ejson { */ const std::string& get() const; public: - virtual bool iParse(const std::string& _data, size_t& _pos, ejson::FilePos& _filePos, ejson::internal::Document& _doc) override; - virtual bool iGenerate(std::string& _data, size_t _indent) const override; - virtual bool transfertIn(ememory::SharedPtr _obj) override; - virtual ememory::SharedPtr clone() const override; + bool iParse(const std::string& _data, size_t& _pos, ejson::FilePos& _filePos, ejson::internal::Document& _doc) override; + bool iGenerate(std::string& _data, size_t _indent) const override; + void iMachineGenerate(std::string& _data) const override; + bool transfertIn(ememory::SharedPtr _obj) override; + ememory::SharedPtr clone() const override; }; } } diff --git a/ejson/internal/Value.h b/ejson/internal/Value.h index 622b555..c0685e6 100644 --- a/ejson/internal/Value.h +++ b/ejson/internal/Value.h @@ -74,13 +74,19 @@ namespace ejson { ejson::FilePos& _filePos, ejson::internal::Document& _doc) = 0; /** - * @brief generate a string with the tree of the xml + * @brief generate a string with the tree of the json * @param[in,out] _data string where to add the elements * @param[in] _indent current indentation of the file * @return false if an error occured. */ virtual bool iGenerate(std::string& _data, size_t _indent) const = 0; + /** + * @brief generate a string with the tree of the json (not human readable ==> for computer transfer) + * @param[in,out] _data string where to add the elements + * @return false if an error occured. + */ + virtual void iMachineGenerate(std::string& _data) const = 0; /** * @brief Display the Document on console */ diff --git a/ejson/valueType.cpp b/ejson/valueType.cpp index 2918b94..52c486d 100644 --- a/ejson/valueType.cpp +++ b/ejson/valueType.cpp @@ -12,31 +12,31 @@ std::ostream& ejson::operator <<(std::ostream& _os, enum ejson::valueType _obj) { switch (_obj) { case ejson::valueType::unknow: - _os << "exml::valueType::unknow"; + _os << "ejson::valueType::unknow"; break; case ejson::valueType::value: - _os << "exml::valueType::value"; + _os << "ejson::valueType::value"; break; case ejson::valueType::document: - _os << "exml::valueType::document"; + _os << "ejson::valueType::document"; break; case ejson::valueType::array: - _os << "exml::valueType::array"; + _os << "ejson::valueType::array"; break; case ejson::valueType::object: - _os << "exml::valueType::object"; + _os << "ejson::valueType::object"; break; case ejson::valueType::string: - _os << "exml::valueType::string"; + _os << "ejson::valueType::string"; break; case ejson::valueType::number: - _os << "exml::valueType::number"; + _os << "ejson::valueType::number"; break; case ejson::valueType::null: - _os << "exml::valueType::null"; + _os << "ejson::valueType::null"; break; case ejson::valueType::boolean: - _os << "exml::valueType::boolean"; + _os << "ejson::valueType::boolean"; break; } return _os;