//////////////////////////////////////////////////////////////////////// // Copyright (c) Nehmulos 2011-2014 // This file is part of N0 Strain Serialization Library. // // N0Strain-Serialization-Library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // N0Strain-Serialization-Library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with N0Strain-Serialization-Library. If not, see https://gnu.org/licenses/lgpl-3.0 //////////////////////////////////////////////////////////////////////// #pragma once #include "Writer.h" #include namespace nw { class MarkupWriter: public nw::Writer { public: MarkupWriter(std::ostream& output); MarkupWriter(const String filepath); virtual ~MarkupWriter(); /// open new file on given path, delete if already exists /// @return true if file was created, false on error bool openFile(const String filepath); /// MarkupWriter is lazy, it will just write something when you call Close. /// close() is also called by the destructor if it wasn't called before /// don't do anything if there is no valid open file virtual void close(); /// Returns true. Always. It does nothing else. bool isInWriteMode(); /// Returns a reference to its children std::vector& getChildren(); /// Adds a new valueless tag that should be used to contain other tags. bool push(const String tagName); /// Adds a New Tag with the ArrayName and prepares enterNextElement with elementsName and size void describeArray(const String arrayName, const String elementsName, unsigned int size); void describeValueArray(const String arrayName, unsigned int size); /// Creates a new Tag with elementsName on each call, returns true if it was often called than size bool enterNextElement(unsigned int iterator); /* Serialize functions */ void describeName(const String name); void describeValueConst(const bool&); ///< Adds a Tag to the currentTag void describeValueConst(const char&); ///< Adds a Tag to the currentTag void describeValueConst(const unsigned char&); ///< Adds a Tag to the currentTag void describeValueConst(const signed char&); ///< Adds a Tag to the currentTag void describeValueConst(const short&); ///< Adds a Tag to the currentTag void describeValueConst(const unsigned short&); ///< Adds a Tag to the currentTag void describeValueConst(const int&); ///< Adds a Tag to the currentTag void describeValueConst(const unsigned int&); ///< Adds a Tag to the currentTag void describeValueConst(const long&); ///< Adds a Tag to the currentTag void describeValueConst(const unsigned long&); ///< Adds a Tag to the currentTag void describeValueConst(const float&); ///< Adds a Tag to the currentTag void describeValueConst(const Pointer); ///< Adds a Tag to the currentTag void describeValueConst(const double&); ///< Adds a Tag to the currentTag void describeValueConst(const long long&); ///< Adds a Tag to the currentTag void describeValueConst(const long double&); ///< Adds a Tag to the currentTag void describeValueConst(const String&); ///< Adds a Tag to the currentTag void describeBlobConst(const String childName,nw::Pointer binaryBlob, unsigned int blobSize); ///< Adds a Tag with a base64 encoded Value void comment(const String text); ///< Adds a comment Tag to the currentTag Tag* getCurrentTag(); ///< Returns the currently opened Tag Tag* getMotherTag(); ///< Returns the highest tag from the hirarchy void pop(); ///< Closes the currently open Tag /// The Name of the Tag that will be used as motherTag. /// By Default "N0Slib" is used as Propaganda. static String motherTagName; protected: Tag* currentTag; Tag* selectedTag; Tag* motherTag; ///< The lowest tag in the hirarchy, also known as root std::vector states; std::stack openArrays; std::ostream& output; bool didWrite; virtual void writeToOutput() = 0; template inline void addTag(T& ref); inline void addTag(String& ref); private: std::fstream file; }; }