diff --git a/include/node.h b/include/node.h index f6a2ef6..3ddfb33 100644 --- a/include/node.h +++ b/include/node.h @@ -13,6 +13,8 @@ namespace YAML class Content; class Scanner; + enum CONTENT_TYPE { CT_NONE, CT_SCALAR, CT_SEQUENCE, CT_MAP }; + class Node { public: @@ -23,6 +25,8 @@ namespace YAML void Parse(Scanner *pScanner, const ParserState& state); void Write(std::ostream& out, int indent, bool startedLine, bool onlyOneCharOnLine) const; + CONTENT_TYPE GetType() const; + // accessors Iterator begin() const; Iterator end() const; diff --git a/src/content.h b/src/content.h index 3189478..9ea6a95 100644 --- a/src/content.h +++ b/src/content.h @@ -16,6 +16,8 @@ namespace YAML class Sequence; class Map; + enum CONTENT_TYPE; + class Content { public: @@ -31,6 +33,7 @@ namespace YAML virtual bool GetEnd(std::map ::const_iterator& it) const { return false; } virtual Node *GetNode(unsigned i) const { return 0; } virtual unsigned GetSize() const { return 0; } + virtual CONTENT_TYPE GetType() const = 0; // extraction virtual void Read(std::string& s) { throw InvalidScalar(); } diff --git a/src/map.cpp b/src/map.cpp index bfd8b6f..02c2da0 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -163,6 +163,11 @@ namespace YAML out << std::endl; } + CONTENT_TYPE Map::GetType() const + { + return CT_MAP; + } + int Map::Compare(Content *pContent) { return -pContent->Compare(this); diff --git a/src/map.h b/src/map.h index 3ebd3f4..5f34072 100644 --- a/src/map.h +++ b/src/map.h @@ -19,6 +19,8 @@ namespace YAML virtual void Parse(Scanner *pScanner, const ParserState& state); virtual void Write(std::ostream& out, int indent, bool startedLine, bool onlyOneCharOnLine); + virtual CONTENT_TYPE GetType() const; + // ordering virtual int Compare(Content *pContent); virtual int Compare(Scalar *pScalar) { return 1; } diff --git a/src/node.cpp b/src/node.cpp index f67ab55..e1f323d 100644 --- a/src/node.cpp +++ b/src/node.cpp @@ -144,6 +144,14 @@ namespace YAML } } + CONTENT_TYPE Node::GetType() const + { + if(!m_pContent) + return CT_NONE; + + return m_pContent->GetType(); + } + // begin // Returns an iterator to the beginning of this (sequence or map). Iterator Node::begin() const diff --git a/src/scalar.cpp b/src/scalar.cpp index e560fb8..622813e 100644 --- a/src/scalar.cpp +++ b/src/scalar.cpp @@ -3,6 +3,7 @@ #include "scanner.h" #include "token.h" #include "exceptions.h" +#include "node.h" #include namespace YAML @@ -37,6 +38,11 @@ namespace YAML out << "\"\n"; } + CONTENT_TYPE Scalar::GetType() const + { + return CT_SCALAR; + } + void Scalar::Read(std::string& s) { s = m_data; diff --git a/src/scalar.h b/src/scalar.h index 0da9df6..8367705 100644 --- a/src/scalar.h +++ b/src/scalar.h @@ -14,6 +14,8 @@ namespace YAML virtual void Parse(Scanner *pScanner, const ParserState& state); virtual void Write(std::ostream& out, int indent, bool startedLine, bool onlyOneCharOnLine); + virtual CONTENT_TYPE GetType() const; + // extraction virtual void Read(std::string& s); virtual void Read(int& i); diff --git a/src/sequence.cpp b/src/sequence.cpp index 2f4ff95..0c81ba4 100644 --- a/src/sequence.cpp +++ b/src/sequence.cpp @@ -150,6 +150,11 @@ namespace YAML out << std::endl; } + CONTENT_TYPE Sequence::GetType() const + { + return CT_SEQUENCE; + } + int Sequence::Compare(Content *pContent) { return -pContent->Compare(this); diff --git a/src/sequence.h b/src/sequence.h index 35b7765..8fe612c 100644 --- a/src/sequence.h +++ b/src/sequence.h @@ -22,6 +22,8 @@ namespace YAML virtual void Parse(Scanner *pScanner, const ParserState& state); virtual void Write(std::ostream& out, int indent, bool startedLine, bool onlyOneCharOnLine); + virtual CONTENT_TYPE GetType() const; + // ordering virtual int Compare(Content *pContent); virtual int Compare(Scalar *pScalar) { return 1; }