X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=include%2Fllvm%2FSupport%2FYAMLParser.h;h=e3f4f003884a2a4c3a8717aaa1d52bd0d24aa04b;hb=a5bf44b0b396e8b9ae0db5c62c05ac6618aab5d3;hp=27d039164c16e880fbb23dbe5f04780cb9b5da4d;hpb=93210e847a1496b24cef881723e57c489082dcfe;p=oota-llvm.git diff --git a/include/llvm/Support/YAMLParser.h b/include/llvm/Support/YAMLParser.h index 27d039164c1..e3f4f003884 100644 --- a/include/llvm/Support/YAMLParser.h +++ b/include/llvm/Support/YAMLParser.h @@ -77,8 +77,13 @@ std::string escape(StringRef Input); /// documents. class Stream { public: + /// @brief This keeps a reference to the string referenced by \p Input. Stream(StringRef Input, SourceMgr &); + /// @brief This takes ownership of \p InputBuffer. + Stream(MemoryBuffer *InputBuffer, SourceMgr &); + ~Stream(); + document_iterator begin(); document_iterator end(); void skip(); @@ -113,7 +118,6 @@ public: }; Node(unsigned int Type, OwningPtr&, StringRef Anchor); - virtual ~Node(); /// @brief Get the value of the anchor attached to this node. If it does not /// have one, getAnchor().size() will be 0. @@ -130,10 +134,9 @@ public: void setError(const Twine &Message, Token &Location) const; bool failed() const; - virtual void skip() {}; + virtual void skip() {} unsigned int getType() const { return TypeID; } - static inline bool classof(const Node *) { return true; } void *operator new ( size_t Size , BumpPtrAllocator &Alloc @@ -149,6 +152,10 @@ protected: OwningPtr &Doc; SMRange SourceRange; + void operator delete(void *) throw() {} + + virtual ~Node() {} + private: unsigned int TypeID; StringRef Anchor; @@ -162,7 +169,6 @@ class NullNode : public Node { public: NullNode(OwningPtr &D) : Node(NK_Null, D, StringRef()) {} - static inline bool classof(const NullNode *) { return true; } static inline bool classof(const Node *N) { return N->getType() == NK_Null; } @@ -195,7 +201,6 @@ public: /// This happens with escaped characters and multi-line literals. StringRef getValue(SmallVectorImpl &Storage) const; - static inline bool classof(const ScalarNode *) { return true; } static inline bool classof(const Node *N) { return N->getType() == NK_Scalar; } @@ -208,25 +213,6 @@ private: , SmallVectorImpl &Storage) const; }; -static bool getAs(const ScalarNode *SN, bool &Result) { - SmallString<4> Storage; - StringRef Value = SN->getValue(Storage); - if (Value == "true") - Result = true; - else if (Value == "false") - Result = false; - else - return false; - return true; -} - -template -typename enable_if_c::is_integer, bool>::type -getAs(const ScalarNode *SN, T &Result) { - SmallString<4> Storage; - return !SN->getValue(Storage).getAsInteger(0, Result); -} - /// @brief A key and value pair. While not technically a Node under the YAML /// representation graph, it is easier to treat them this way. /// @@ -256,12 +242,11 @@ public: /// @returns The value, or nullptr if failed() == true. Node *getValue(); - virtual void skip() { + virtual void skip() LLVM_OVERRIDE { getKey()->skip(); getValue()->skip(); } - static inline bool classof(const KeyValueNode *) { return true; } static inline bool classof(const Node *N) { return N->getType() == NK_KeyValue; } @@ -351,7 +336,7 @@ public: enum MappingType { MT_Block, MT_Flow, - MT_Inline //< An inline mapping node is used for "[key: value]". + MT_Inline ///< An inline mapping node is used for "[key: value]". }; MappingNode(OwningPtr &D, StringRef Anchor, MappingType MT) @@ -373,11 +358,10 @@ public: iterator end() { return iterator(); } - virtual void skip() { + virtual void skip() LLVM_OVERRIDE { yaml::skip(*this); } - static inline bool classof(const MappingNode *) { return true; } static inline bool classof(const Node *N) { return N->getType() == NK_Mapping; } @@ -436,11 +420,10 @@ public: iterator end() { return iterator(); } - virtual void skip() { + virtual void skip() LLVM_OVERRIDE { yaml::skip(*this); } - static inline bool classof(const SequenceNode *) { return true; } static inline bool classof(const Node *N) { return N->getType() == NK_Sequence; } @@ -465,7 +448,6 @@ public: StringRef getName() const { return Name; } Node *getTarget(); - static inline bool classof(const ScalarNode *) { return true; } static inline bool classof(const Node *N) { return N->getType() == NK_Alias; } @@ -528,34 +510,44 @@ private: /// @brief Iterator abstraction for Documents over a Stream. class document_iterator { public: - document_iterator() : Doc(NullDoc) {} - document_iterator(OwningPtr &D) : Doc(D) {} + document_iterator() : Doc(0) {} + document_iterator(OwningPtr &D) : Doc(&D) {} + bool operator ==(const document_iterator &Other) { + if (isAtEnd() || Other.isAtEnd()) + return isAtEnd() && Other.isAtEnd(); + + return *Doc == *Other.Doc; + } bool operator !=(const document_iterator &Other) { - return Doc != Other.Doc; + return !(*this == Other); } document_iterator operator ++() { - if (!Doc->skip()) { - Doc.reset(0); + assert(Doc != 0 && "incrementing iterator past the end."); + if (!(*Doc)->skip()) { + Doc->reset(0); } else { - Stream &S = Doc->stream; - Doc.reset(new Document(S)); + Stream &S = (*Doc)->stream; + Doc->reset(new Document(S)); } return *this; } Document &operator *() { - return *Doc; + return *Doc->get(); } OwningPtr &operator ->() { - return Doc; + return *Doc; } private: - static OwningPtr NullDoc; - OwningPtr &Doc; + bool isAtEnd() const { + return Doc == 0 || *Doc == 0; + } + + OwningPtr *Doc; }; }