146 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			146 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #ifndef ARCHIVER_H_
 | |
| #define ARCHIVER_H_
 | |
| 
 | |
| #include <cstddef>
 | |
| #include <string>
 | |
| 
 | |
| /**
 | |
| \class Archiver
 | |
| \brief Archiver concept
 | |
| 
 | |
| Archiver can be a reader or writer for serialization or deserialization respectively.
 | |
| 
 | |
| class Archiver {
 | |
| public:
 | |
|     /// \returns true if the archiver is in normal state. false if it has errors.
 | |
|     operator bool() const;
 | |
| 
 | |
|     /// Starts an object
 | |
|     Archiver& StartObject();
 | |
|     
 | |
|     /// After calling StartObject(), assign a member with a name
 | |
|     Archiver& Member(const char* name);
 | |
| 
 | |
|     /// After calling StartObject(), check if a member presents
 | |
|     bool HasMember(const char* name) const;
 | |
| 
 | |
|     /// Ends an object
 | |
|     Archiver& EndObject();
 | |
| 
 | |
|     /// Starts an array
 | |
|     /// \param size If Archiver::IsReader is true, the size of array is written.
 | |
|     Archiver& StartArray(size_t* size = 0);
 | |
| 
 | |
|     /// Ends an array
 | |
|     Archiver& EndArray();
 | |
| 
 | |
|     /// Read/Write primitive types.
 | |
|     Archiver& operator&(bool& b);
 | |
|     Archiver& operator&(unsigned& u);
 | |
|     Archiver& operator&(int& i);
 | |
|     Archiver& operator&(double& d);
 | |
|     Archiver& operator&(std::string& s);
 | |
| 
 | |
|     /// Write primitive types.
 | |
|     Archiver& SetNull();
 | |
| 
 | |
|     //! Whether it is a reader.
 | |
|     static const bool IsReader;
 | |
| 
 | |
|     //! Whether it is a writer.
 | |
|     static const bool IsWriter;
 | |
| };
 | |
| */
 | |
| 
 | |
| /// Represents a JSON reader which implements Archiver concept.
 | |
| class JsonReader {
 | |
| public:
 | |
|     /// Constructor.
 | |
|     /**
 | |
|         \param json A non-const source json string for in-situ parsing.
 | |
|         \note in-situ means the source JSON string will be modified after parsing.
 | |
|     */
 | |
|     JsonReader(const char* json);
 | |
| 
 | |
|     /// Destructor.
 | |
|     ~JsonReader();
 | |
| 
 | |
|     // Archive concept
 | |
| 
 | |
|     operator bool() const { return !mError; }
 | |
| 
 | |
|     JsonReader& StartObject();
 | |
|     JsonReader& Member(const char* name);
 | |
|     bool HasMember(const char* name) const;
 | |
|     JsonReader& EndObject();
 | |
| 
 | |
|     JsonReader& StartArray(size_t* size = 0);
 | |
|     JsonReader& EndArray();
 | |
| 
 | |
|     JsonReader& operator&(bool& b);
 | |
|     JsonReader& operator&(unsigned& u);
 | |
|     JsonReader& operator&(int& i);
 | |
|     JsonReader& operator&(double& d);
 | |
|     JsonReader& operator&(std::string& s);
 | |
| 
 | |
|     JsonReader& SetNull();
 | |
| 
 | |
|     static const bool IsReader = true;
 | |
|     static const bool IsWriter = !IsReader;
 | |
| 
 | |
| private:
 | |
|     JsonReader(const JsonReader&);
 | |
|     JsonReader& operator=(const JsonReader&);
 | |
| 
 | |
|     void Next();
 | |
| 
 | |
|     // PIMPL
 | |
|     void* mDocument;              ///< DOM result of parsing.
 | |
|     void* mStack;                 ///< Stack for iterating the DOM
 | |
|     bool mError;                  ///< Whether an error has occurred.
 | |
| };
 | |
| 
 | |
| class JsonWriter {
 | |
| public:
 | |
|     /// Constructor.
 | |
|     JsonWriter();
 | |
| 
 | |
|     /// Destructor.
 | |
|     ~JsonWriter();
 | |
| 
 | |
|     /// Obtains the serialized JSON string.
 | |
|     const char* GetString() const;
 | |
| 
 | |
|     // Archive concept
 | |
| 
 | |
|     operator bool() const { return true; }
 | |
| 
 | |
|     JsonWriter& StartObject();
 | |
|     JsonWriter& Member(const char* name);
 | |
|     bool HasMember(const char* name) const;
 | |
|     JsonWriter& EndObject();
 | |
| 
 | |
|     JsonWriter& StartArray(size_t* size = 0);
 | |
|     JsonWriter& EndArray();
 | |
| 
 | |
|     JsonWriter& operator&(bool& b);
 | |
|     JsonWriter& operator&(unsigned& u);
 | |
|     JsonWriter& operator&(int& i);
 | |
|     JsonWriter& operator&(double& d);
 | |
|     JsonWriter& operator&(std::string& s);
 | |
|     JsonWriter& SetNull();
 | |
| 
 | |
|     static const bool IsReader = false;
 | |
|     static const bool IsWriter = !IsReader;
 | |
| 
 | |
| private:
 | |
|     JsonWriter(const JsonWriter&);
 | |
|     JsonWriter& operator=(const JsonWriter&);
 | |
| 
 | |
|     // PIMPL idiom
 | |
|     void* mWriter;      ///< JSON writer.
 | |
|     void* mStream;      ///< Stream buffer.
 | |
| };
 | |
| 
 | |
| #endif // ARCHIVER_H__
 |