1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
//////////////////////////////////////////////////////////////////////// // 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 //////////////////////////////////////////////////////////////////////// #ifndef MARKUPHOLDER_H_ #define MARKUPHOLDER_H_ #include "Describer.h" namespace nw { struct MarkupReaderArray { std::stack<Tag*> tags; bool isValueArray; bool hasWrapperTag; }; class MarkupReader : public Describer { public: MarkupReader(); virtual ~MarkupReader(); void init(const String filepath); void init(); void close(); bool push(const String tagName); void pop(); void describeArray(const String arrayName, const String elementsName, unsigned int size); void describeValueArray(const String arrayName, unsigned int size); bool enterNextElement(unsigned int iterator); bool isInWriteMode(); /* Serialize functions */ void describeName(const String name); void describeValue(bool&); void describeValue(char&); void describeValue(unsigned char&); void describeValue(signed char&); void describeValue(short&); void describeValue(unsigned short&); void describeValue(int&); void describeValue(unsigned int&); void describeValue(long&); void describeValue(unsigned long&); void describeValue(float&); void describeValue(Pointer); void describeValue(double&); void describeValue(long long&); void describeValue(long double&); void describeValue(String&); void describeBlob(const String childName,nw::Pointer binaryBlob, unsigned int blobSize); // void describeBlob(String childName,void* binaryBlob, unsigned int blobSize); void comment(const String text); /// return the motherTag and set it to NULL in the Markupholder to prevent it from being deleted in the destructor Tag* extractMotherTag(); /// return a new Tag holding the current tag's children and remove them from the currentTag. Tag* extractTags(); protected: virtual int readWholeDocument(std::istream& filename) = 0; ///< reads the whole document and parses it into the motherTag tree Tag* parentTag; ///< marks the current position in the document, tags inside this tag can be selected, by describeName Tag* selectedTag; ///< values from this tag will be read by describe(valueReference); Tag* motherTag; ///< The root Tag that doesn't have a parentTag std::stack<MarkupReaderArray> tagArrays; //contains unpassedTags template<class T> inline void getTagValue(T& value); }; } // namespace nw #endif /* MARKUPHOLDER_H_ */