diff options
| author | maxim-yurchuk <[email protected]> | 2024-10-09 12:29:46 +0300 |
|---|---|---|
| committer | maxim-yurchuk <[email protected]> | 2024-10-09 13:14:22 +0300 |
| commit | 9731d8a4bb7ee2cc8554eaf133bb85498a4c7d80 (patch) | |
| tree | a8fb3181d5947c0d78cf402aa56e686130179049 /contrib/libs/antlr3_cpp_runtime/include | |
| parent | a44b779cd359f06c3ebbef4ec98c6b38609d9d85 (diff) | |
publishFullContrib: true for ydb
<HIDDEN_URL>
commit_hash:c82a80ac4594723cebf2c7387dec9c60217f603e
Diffstat (limited to 'contrib/libs/antlr3_cpp_runtime/include')
3 files changed, 671 insertions, 0 deletions
diff --git a/contrib/libs/antlr3_cpp_runtime/include/antlr3.inl b/contrib/libs/antlr3_cpp_runtime/include/antlr3.inl new file mode 100644 index 00000000000..b2d223398d5 --- /dev/null +++ b/contrib/libs/antlr3_cpp_runtime/include/antlr3.inl @@ -0,0 +1,9 @@ +namespace antlr3 { + +//static +ANTLR_INLINE void GenericStream::displayRecognitionError( const StringType& str ) +{ + fprintf(stderr, str.c_str() ); +} + +} diff --git a/contrib/libs/antlr3_cpp_runtime/include/antlr3rewritestreams.hpp b/contrib/libs/antlr3_cpp_runtime/include/antlr3rewritestreams.hpp new file mode 100644 index 00000000000..a8d73966432 --- /dev/null +++ b/contrib/libs/antlr3_cpp_runtime/include/antlr3rewritestreams.hpp @@ -0,0 +1,299 @@ +#ifndef ANTLR3REWRITESTREAM_HPP +#define ANTLR3REWRITESTREAM_HPP + +// [The "BSD licence"] +// Copyright (c) 2005-2009 Gokulakannan Somasundaram, ElectronDB + +// +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// 3. The name of the author may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +// IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +/// A generic list of elements tracked in an alternative to be used in +/// a -> rewrite rule. +/// +/// In the C implementation, all tree oriented streams return a pointer to +/// the same type: pANTLR3_BASE_TREE. Anything that has subclassed from this +/// still passes this type, within which there is a super pointer, which points +/// to it's own data and methods. Hence we do not need to implement this as +/// the equivalent of an abstract class, but just fill in the appropriate interface +/// as usual with this model. +/// +/// Once you start next()ing, do not try to add more elements. It will +/// break the cursor tracking I believe. +/// +/// +/// \see #pANTLR3_REWRITE_RULE_NODE_STREAM +/// \see #pANTLR3_REWRITE_RULE_ELEMENT_STREAM +/// \see #pANTLR3_REWRITE_RULE_SUBTREE_STREAM +/// +/// TODO: add mechanism to detect/puke on modification after reading from stream +/// +namespace antlr3 { + +template<class ImplTraits, class ElementType> +//template<class ImplTraits> +class RewriteRuleElementStream : public ImplTraits::AllocPolicyType +{ +public: + //typedef typename ElementTypePtr::element_type ElementType; unique_ptr + //typedef typename ImplTraits::TreeType TreeType; + typedef typename ImplTraits::AllocPolicyType AllocPolicyType; + typedef typename ImplTraits::TreeAdaptorType TreeAdaptorType; + + //typedef typename ImplTraits::template RecognizerType< typename SuperType::StreamType > RecognizerType; + typedef typename ImplTraits::StringType StringType; + typedef typename AllocPolicyType::template VectorType< ElementType* > ElementsType; + +protected: + /// The list of tokens or subtrees we are tracking + /// + ElementsType m_elements; + + /// The element or stream description; usually has name of the token or + /// rule reference that this list tracks. Can include rulename too, but + /// the exception would track that info. + /// + StringType m_elementDescription; + +private: + ElementType* dupImpl(typename ImplTraits::CommonTokenType* el); + ElementType* dupImpl(typename ImplTraits::TreeTypePtr el); + + + /// Pointer to the tree adaptor in use for this stream + /// + TreeAdaptorType* m_adaptor; + + /// Cursor 0..n-1. If singleElement!=NULL, cursor is 0 until you next(), + /// which bumps it to 1 meaning no more elements. + /// + ANTLR_UINT32 m_cursor; + + /// Once a node / subtree has been used in a stream, it must be dup'ed + /// from then on. Streams are reset after sub rules so that the streams + /// can be reused in future sub rules. So, reset must set a dirty bit. + /// If dirty, then next() always returns a dup. + /// + bool m_dirty; + +public: + RewriteRuleElementStream(TreeAdaptorType* adaptor, const char* description); + RewriteRuleElementStream(TreeAdaptorType* adaptor, const char* description, const ElementType* oneElement); + RewriteRuleElementStream(TreeAdaptorType* adaptor, const char* description, const ElementsType& elements); + + ~RewriteRuleElementStream(); + // Methods + + /// Reset the condition of this stream so that it appears we have + /// not consumed any of its elements. Elements themselves are untouched. + /// + void reset(); + + /// Add a new pANTLR3_BASE_TREE to this stream + /// + void add(ElementType* el); + + /// Return the next element in the stream. If out of elements, throw + /// an exception unless size()==1. If size is 1, then return elements[0]. + /// + //TokenType* next(); + ElementType nextTree(); + //TokenType* nextToken(); + ElementType* _next(); + + /// When constructing trees, sometimes we need to dup a token or AST + /// subtree. Dup'ing a token means just creating another AST node + /// around it. For trees, you must call the adaptor.dupTree(). + /// + ElementType* dup( ElementType* el ); + + /// Ensure stream emits trees; tokens must be converted to AST nodes. + /// AST nodes can be passed through unmolested. + /// + ElementType* toTree(ElementType* el); + + /// Returns true if there is a next element available + /// + bool hasNext(); + + /// Treat next element as a single node even if it's a subtree. + /// This is used instead of next() when the result has to be a + /// tree root node. Also prevents us from duplicating recently-added + /// children; e.g., ^(type ID)+ adds ID to type and then 2nd iteration + /// must dup the type node, but ID has been added. + /// + /// Referencing to a rule result twice is ok; dup entire tree as + /// we can't be adding trees; e.g., expr expr. + /// + //TreeTypePtr nextNode(); + + /// Number of elements available in the stream + /// + ANTLR_UINT32 size(); + + /// Returns the description string if there is one available (check for NULL). + /// + StringType getDescription(); + +protected: + void init(TreeAdaptorType* adaptor, const char* description); +}; + +/// This is an implementation of a token stream, which is basically an element +/// stream that deals with tokens only. +/// +template<class ImplTraits> +//class RewriteRuleTokenStream : public ImplTraits::template RewriteRuleElementStreamType< typename ImplTraits::ParserType> +class RewriteRuleTokenStream + //: public ImplTraits::template RewriteStreamType< const typename ImplTraits::CommonTokenType > +{ +public: + typedef typename ImplTraits::AllocPolicyType AllocPolicyType; + typedef typename ImplTraits::TreeAdaptorType TreeAdaptorType; + typedef typename ImplTraits::ParserType ComponentType; + typedef typename ComponentType::StreamType StreamType; + typedef typename ImplTraits::CommonTokenType TokenType; + typedef typename ImplTraits::TreeType TreeType; + typedef typename ImplTraits::TreeTypePtr TreeTypePtr; + typedef typename AllocPolicyType::template VectorType< TokenType* > ElementsType; + typedef typename ImplTraits::template RecognizerType< StreamType > RecognizerType; + typedef typename ImplTraits::template RewriteStreamType< const typename ImplTraits::CommonTokenType > BaseType; + +public: + RewriteRuleTokenStream(TreeAdaptorType* adaptor, const char* description); + RewriteRuleTokenStream(TreeAdaptorType* adaptor, const char* description, const TokenType* oneElement); + RewriteRuleTokenStream(TreeAdaptorType* adaptor, const char* description, const ElementsType& elements); + + TreeTypePtr nextNode(); + TokenType* nextToken(); + + /// TODO copied from RewriteRuleElementStreamType + /// Add a new pANTLR3_BASE_TREE to this stream + /// + typedef typename ImplTraits::CommonTokenType ElementType; + void add(const ElementType* el); + /// Pointer to the tree adaptor in use for this stream + /// + TreeAdaptorType* m_adaptor; + ElementType* _next(); + +private: + //TreeTypePtr nextNodeToken(); +}; + +/// This is an implementation of a subtree stream which is a set of trees +/// modeled as an element stream. +/// +template<class ImplTraits> +//class RewriteRuleSubtreeStream : public ImplTraits::template RewriteStreamType< typename ImplTraits::TreeParserType> +class RewriteRuleSubtreeStream + //: public ImplTraits::template RewriteStreamType< typename ImplTraits::TreeType > +{ +public: + typedef typename ImplTraits::AllocPolicyType AllocPolicyType; + typedef typename ImplTraits::TreeAdaptorType TreeAdaptorType; + typedef typename ImplTraits::TreeParserType ComponentType; + typedef typename ComponentType::StreamType StreamType; + typedef typename ImplTraits::TreeType TreeType; + typedef typename ImplTraits::TreeTypePtr TreeTypePtr; + typedef TreeType TokenType; + typedef typename ImplTraits::template RecognizerType< StreamType > RecognizerType; + typedef typename AllocPolicyType::template VectorType< TokenType* > ElementsType; + typedef typename ImplTraits::template RewriteStreamType< typename ImplTraits::TreeType > BaseType; + + RewriteRuleSubtreeStream(TreeAdaptorType* adaptor, const char* description); + RewriteRuleSubtreeStream(TreeAdaptorType* adaptor, const char* description, TreeTypePtr& oneElement); + RewriteRuleSubtreeStream(TreeAdaptorType* adaptor, const char* description, const ElementsType& elements); + + TreeTypePtr nextNode(TreeTypePtr); + + /// TODO copied from RewriteRuleElementStreamType + /// Add a new pANTLR3_BASE_TREE to this stream + /// + void add(TreeTypePtr& el); + bool hasNext(); + TreeTypePtr& nextTree(); + void reset(); + +protected: + TreeTypePtr dup( TreeTypePtr el ); + +private: + TreeTypePtr dupTree( TreeTypePtr el ); +}; + +/* TODO This class is probably used in TreeParser only + * Notes about Java target + * - these classes reimplement only dup and toTree methods: + * base ElementStr + * abstract dup + * toTree(Object e) { return e; } + * TokenStr + * dup { throw } + * toTree(Object e) { return e; } + * SubTreeStr + * dup(Object e) { return adaptor.dupTree } + * NodeStr + * dup { throw } + * toTree(Object e) { return adaptor.dupNode } + * See: RewriteRuleElementStream::dup, RewriteRuleElementStream::dupImpl + * + * There should 3 types of specializations for RewriteRuleElementStreamType (which is not defined yet) + * ATM: RewriteRuleElementStreamType is replaced with ImplTraits::template RewriteStreamType + * +/// This is an implementation of a node stream, which is basically an element +/// stream that deals with tree nodes only. +/// +template<class ImplTraits> +//class RewriteRuleNodeStream : public ImplTraits::template RewriteStreamType< typename ImplTraits::TreeParserType> +class RewriteRuleNodeStream : public ImplTraits::template RewriteStreamType< typename ImplTraits::TreeType > +{ +public: + typedef typename ImplTraits::AllocPolicyType AllocPolicyType; + typedef typename ImplTraits::TreeAdaptorType TreeAdaptorType; + typedef typename ImplTraits::TreeParserType ComponentType; + typedef typename ComponentType::StreamType StreamType; + typedef typename ImplTraits::TreeType TreeType; + typedef TreeType TokenType; + typedef typename ImplTraits::template RecognizerType< StreamType > RecognizerType; + typedef typename AllocPolicyType::template VectorType< TokenType* > ElementsType; + typedef typename ImplTraits::template RewriteRuleElementStreamType< typename ImplTraits::TreeType > BaseType; + +public: + RewriteRuleNodeStream(TreeAdaptorType* adaptor, const char* description); + RewriteRuleNodeStream(TreeAdaptorType* adaptor, const char* description, TokenType* oneElement); + RewriteRuleNodeStream(TreeAdaptorType* adaptor, const char* description, const ElementsType& elements); + +protected: + TreeTypePtr toTree(TreeTypePtr element); + +private: + TreeTypePtr toTreeNode(TreeTypePtr element); +}; +*/ +} + +#include "antlr3rewritestreams.inl" + +#endif diff --git a/contrib/libs/antlr3_cpp_runtime/include/antlr3rewritestreams.inl b/contrib/libs/antlr3_cpp_runtime/include/antlr3rewritestreams.inl new file mode 100644 index 00000000000..47568da6498 --- /dev/null +++ b/contrib/libs/antlr3_cpp_runtime/include/antlr3rewritestreams.inl @@ -0,0 +1,363 @@ +namespace antlr3 { + +template<class ImplTraits, class ElementType> +RewriteRuleElementStream<ImplTraits, ElementType>::RewriteRuleElementStream(TreeAdaptorType* adaptor, + const char* description) +{ + this->init(adaptor, description); +} + +template<class ImplTraits, class ElementType> +RewriteRuleElementStream<ImplTraits, ElementType>::RewriteRuleElementStream(TreeAdaptorType* adaptor, + const char* description, + const ElementType* oneElement) +{ + this->init(adaptor, description); + if( oneElement != NULL ) + this->add( oneElement ); +} + +template<class ImplTraits, class ElementType> +RewriteRuleElementStream<ImplTraits, ElementType>::RewriteRuleElementStream(TreeAdaptorType* adaptor, + const char* description, + const ElementsType& elements) + : m_elements(elements) +{ + this->init(adaptor, description); +} + +template<class ImplTraits, class ElementType> +void RewriteRuleElementStream<ImplTraits, ElementType>::init(TreeAdaptorType* adaptor, + const char* description) +{ + m_adaptor = adaptor; + m_cursor = 0; + m_dirty = false; +} + +template<class ImplTraits> +RewriteRuleTokenStream<ImplTraits>::RewriteRuleTokenStream(TreeAdaptorType* adaptor, + const char* description) + //: BaseType(adaptor, description) +{ +} + +template<class ImplTraits> +RewriteRuleTokenStream<ImplTraits>::RewriteRuleTokenStream(TreeAdaptorType* adaptor, + const char* description, + const TokenType* oneElement) + //: BaseType(adaptor, description, oneElement) +{ +} + +template<class ImplTraits> +RewriteRuleTokenStream<ImplTraits>::RewriteRuleTokenStream(TreeAdaptorType* adaptor, + const char* description, + const ElementsType& elements) + //: BaseType(adaptor, description, elements) +{ +} + +template<class ImplTraits> +RewriteRuleSubtreeStream<ImplTraits>::RewriteRuleSubtreeStream(TreeAdaptorType* adaptor, + const char* description) + //: BaseType(adaptor, description) +{ +} + +template<class ImplTraits> +RewriteRuleSubtreeStream<ImplTraits>::RewriteRuleSubtreeStream(TreeAdaptorType* adaptor, + const char* description, + TreeTypePtr& oneElement) + //: BaseType(adaptor, description, oneElement) +{ +} + +template<class ImplTraits> +RewriteRuleSubtreeStream<ImplTraits>::RewriteRuleSubtreeStream(TreeAdaptorType* adaptor, + const char* description, + const ElementsType& elements) + //: BaseType(adaptor, description, elements) +{ +} + +/* +template<class ImplTraits> +RewriteRuleNodeStream<ImplTraits>::RewriteRuleNodeStream(TreeAdaptorType* adaptor, + const char* description) + : BaseType(adaptor, description) +{ +} + +template<class ImplTraits> +RewriteRuleNodeStream<ImplTraits>::RewriteRuleNodeStream(TreeAdaptorType* adaptor, + const char* description, + TokenType* oneElement) + : BaseType(adaptor, description, oneElement) +{ +} + +template<class ImplTraits> +RewriteRuleNodeStream<ImplTraits>::RewriteRuleNodeStream(TreeAdaptorType* adaptor, + const char* description, + const ElementsType& elements) + : BaseType(adaptor, description, elements) +{ +} +*/ + +template<class ImplTraits, class ElementType> +void RewriteRuleElementStream<ImplTraits, ElementType>::reset() +{ + m_cursor = 0; + m_dirty = true; +} + +template<class ImplTraits, class ElementType> +void RewriteRuleElementStream<ImplTraits, ElementType>::add(ElementType* el) +{ + if ( el== NULL ) + return; + + m_elements.push_back(el); +} + +template<class ImplTraits, class ElementType> +ElementType* RewriteRuleElementStream<ImplTraits, ElementType>::_next() +{ + ANTLR_UINT32 n = this->size(); + + if (n == 0) + { + // This means that the stream is empty + return NULL; // Caller must cope with this (TODO throw RewriteEmptyStreamException) + } + + // Traversed all the available elements already? + if ( m_cursor >= n) // out of elements? + { + if (n == 1) + { + // Special case when size is single element, it will just dup a lot + //return this->toTree(m_singleElement); + return this->toTree(m_elements.at(0)); + } + + // Out of elements and the size is not 1, so we cannot assume + // that we just duplicate the entry n times (such as ID ent+ -> ^(ID ent)+) + // This means we ran out of elements earlier than was expected. + // + return NULL; // Caller must cope with this (TODO throw RewriteEmptyStreamException) + } + + // More than just a single element so we extract it from the + // vector. + ElementType* t = this->toTree(m_elements.at(m_cursor)); + m_cursor++; + return t; +} + +template<class ImplTraits, class ElementType> +ElementType +RewriteRuleElementStream<ImplTraits, ElementType>::nextTree() +{ + ANTLR_UINT32 n = this->size(); + if ( m_dirty || ( (m_cursor >=n) && (n==1)) ) + { + // if out of elements and size is 1, dup + ElementType* el = this->_next(); + return this->dup(el); + } + + // test size above then fetch + ElementType* el = this->_next(); + return el; +} + +/* +template<class ImplTraits, class SuperType> +typename RewriteRuleElementStream<ImplTraits, SuperType>::TokenType* +RewriteRuleElementStream<ImplTraits, SuperType>::nextToken() +{ + return this->_next(); +} + +template<class ImplTraits, class SuperType> +typename RewriteRuleElementStream<ImplTraits, SuperType>::TokenType* +RewriteRuleElementStream<ImplTraits, SuperType>::next() +{ + ANTLR_UINT32 s; + s = this->size(); + if ( (m_cursor >= s) && (s == 1) ) + { + TreeTypePtr el; + el = this->_next(); + return this->dup(el); + } + return this->_next(); +} + +*/ + +template<class ImplTraits, class ElementType> +ElementType* +RewriteRuleElementStream<ImplTraits, ElementType>::dup( ElementType* element) +{ + return dupImpl(element); +} + +template<class ImplTraits, class ElementType> +ElementType* +RewriteRuleElementStream<ImplTraits, ElementType>::dupImpl( typename ImplTraits::CommonTokenType* element) +{ + return NULL; // TODO throw here +} + +template<class ImplTraits, class ElementType> +ElementType* +RewriteRuleElementStream<ImplTraits, ElementType>::dupImpl( typename ImplTraits::TreeTypePtr element) +{ + return m_adaptor->dupTree(element); +} + +template<class ImplTraits> +typename RewriteRuleSubtreeStream<ImplTraits>::TreeTypePtr +RewriteRuleSubtreeStream<ImplTraits>::dup(TreeTypePtr element) +{ + return this->dupTree(element); +} + +template<class ImplTraits> +typename RewriteRuleSubtreeStream<ImplTraits>::TreeTypePtr +RewriteRuleSubtreeStream<ImplTraits>::dupTree(TreeTypePtr element) +{ + return BaseType::m_adaptor->dupNode(element); +} + +template<class ImplTraits, class ElementType> +ElementType* +RewriteRuleElementStream<ImplTraits, ElementType>::toTree( ElementType* element) +{ + return element; +} + +/* +template<class ImplTraits> +typename RewriteRuleNodeStream<ImplTraits>::TreeTypePtr +RewriteRuleNodeStream<ImplTraits>::toTree(TreeTypePtr element) +{ + return this->toTreeNode(element); +} + +template<class ImplTraits> +typename RewriteRuleNodeStream<ImplTraits>::TreeTypePtr +RewriteRuleNodeStream<ImplTraits>::toTreeNode(TreeTypePtr element) +{ + return BaseType::m_adaptor->dupNode(element); +} +*/ + +template<class ImplTraits, class ElementType> +bool RewriteRuleElementStream<ImplTraits, ElementType>::hasNext() +{ + if ( !m_elements.empty() && m_cursor < m_elements.size()) + { + return true; + } + else + { + return false; + } +} + +template<class ImplTraits > +typename RewriteRuleTokenStream<ImplTraits>::TreeTypePtr +RewriteRuleTokenStream<ImplTraits>::nextNode() +{ + TokenType *Token = this->nextToken(); + //return BaseType::m_adaptor->create(Token); + return m_adaptor->create(Token); +} + +/* +template<class ImplTraits> +typename RewriteRuleTokenStream<ImplTraits>::TreeTypePtr +RewriteRuleTokenStream<ImplTraits>::nextNodeToken() +{ + return BaseType::m_adaptor->create(this->_next()); +} +*/ + +/// Number of elements available in the stream +/// +template<class ImplTraits, class ElementType> +ANTLR_UINT32 RewriteRuleElementStream<ImplTraits, ElementType>::size() +{ + return (ANTLR_UINT32)(m_elements.size()); +} + +template<class ImplTraits, class ElementType> +typename RewriteRuleElementStream<ImplTraits, ElementType>::StringType +RewriteRuleElementStream<ImplTraits, ElementType>::getDescription() +{ + if ( m_elementDescription.empty() ) + { + m_elementDescription = "<unknown source>"; + } + return m_elementDescription; +} + +template<class ImplTraits, class ElementType> +RewriteRuleElementStream<ImplTraits, ElementType>::~RewriteRuleElementStream() +{ + // Before placing the stream back in the pool, we + // need to clear any vector it has. This is so any + // free pointers that are associated with the + // entries are called. However, if this particular function is called + // then we know that the entries in the stream are definitely + // tree nodes. Hence we check to see if any of them were nilNodes as + // if they were, we can reuse them. + // + // We have some elements to traverse + // + for (ANTLR_UINT32 i = 0; i < m_elements.size(); i++) + { + ElementType *tree = m_elements.at(i); + //if ( (tree != NULL) && tree->isNilNode() ) + { + // Had to remove this for now, check is not comprehensive enough + // tree->reuse(tree); + } + } + m_elements.clear(); +} + +template<class ImplTraits> +typename RewriteRuleTokenStream<ImplTraits>::TokenType* +RewriteRuleTokenStream<ImplTraits>::nextToken() +{ + return this->_next(); +} + +template<class ImplTraits> +typename RewriteRuleSubtreeStream<ImplTraits>::TreeTypePtr +RewriteRuleSubtreeStream<ImplTraits>::nextNode(TreeTypePtr element) +{ + //System.out.println("nextNode: elements="+elements+", singleElement="+((Tree)singleElement).toStringTree()); + ANTLR_UINT32 n = this->size(); + if ( BaseType::m_dirty || (BaseType::m_cursor>=n && n==1) ) { + // if out of elements and size is 1, dup (at most a single node + // since this is for making root nodes). + TreeTypePtr el = this->_next(); + return BaseType::m_adaptor->dupNode(el); + } + // test size above then fetch + TreeType *tree = this->_next(); + while (BaseType::m_adaptor.isNil(tree) && BaseType::m_adaptor.getChildCount(tree) == 1) + tree = BaseType::m_adaptor->getChild(tree, 0); + //System.out.println("_next="+((Tree)tree).toStringTree()); + TreeType *el = BaseType::m_adaptor->dupNode(tree); // dup just the root (want node here) + return el; +} + +} |
