/*------------------------------------------------------------------------*/ /* */ /* BINIMP.H */ /* */ /* Copyright (c) 1993, 1994 Borland International */ /* All Rights Reserved */ /* */ /*------------------------------------------------------------------------*/ #if !defined( CLASSLIB_BINIMP_H ) #define CLASSLIB_BINIMP_H #if !defined( CLASSLIB_DEFS_H ) #include #endif #if !defined( CLASSLIB_VOIDP_H ) #include #endif #if !defined( CLASSLIB_STACKS_H ) #include #endif #pragma option -Vo- #if defined( BI_CLASSLIB_NO_po ) #pragma option -po- #endif /*------------------------------------------------------------------------*/ /* */ /* class TBinarySearchTreeBase */ /* */ /* Base class for binary search tree templates. */ /* */ /*------------------------------------------------------------------------*/ class _BIDSCLASS TBinarySearchTreeBase { friend class _BIDSCLASS TBinaryTreeInternalIteratorBase; friend class _BIDSCLASS TBinaryTreeExternalIteratorBase; friend class _BIDSCLASS TBinaryTreeKiller; public: enum IteratorOrder { PreOrder, InOrder, PostOrder }; class _BIDSCLASS BinNode { public: BinNode() : Left(0), Right(0) {} BinNode _BIDSFAR *Left; BinNode _BIDSFAR *Right; }; void Flush( int del = 0 ); unsigned GetItemsInContainer() const { return ItemsInContainer; } int IsEmpty() const { return Root == 0; } protected: TBinarySearchTreeBase(); int InsertNode( BinNode _BIDSFAR *node ); int RemoveNode( BinNode _BIDSFAR *node, int del ); BinNode _BIDSFAR *FindNode( BinNode _BIDSFAR *node ); int RemNode( BinNode _BIDSFAR *node, BinNode _BIDSFAR *parent, int del ); virtual int EqualTo( BinNode _BIDSFAR *n1, BinNode _BIDSFAR *n2 ) = 0; virtual int LessThan( BinNode _BIDSFAR *n1, BinNode _BIDSFAR *n2 ) = 0; virtual void DeleteNode( BinNode _BIDSFAR *node, int del ) = 0; BinNode _BIDSFAR *Root; private: unsigned ItemsInContainer; TBinarySearchTreeBase( const TBinarySearchTreeBase _BIDSFAR & ); const TBinarySearchTreeBase _BIDSFAR & operator = ( const TBinarySearchTreeBase _BIDSFAR & ); }; /*------------------------------------------------------------------------*/ /* */ /* class TBinaryTreeInternalIteratorBase */ /* class TBinaryTreeExternalIteratorBase */ /* */ /* Base classes for binary search tree iterator templates. */ /* */ /*------------------------------------------------------------------------*/ class _BIDSCLASS TBinaryTreeInternalIteratorBase { public: TBinaryTreeInternalIteratorBase( TBinarySearchTreeBase _BIDSFAR & tree, TBinarySearchTreeBase::IteratorOrder order ) : _tree(tree), Node(tree.Root), Order(order) { } void Iterate(); protected: TBinarySearchTreeBase _BIDSFAR &Tree() { return _tree; } private: virtual void Apply( TBinarySearchTreeBase::BinNode _BIDSFAR *Node, TBinarySearchTreeBase::BinNode _BIDSFAR *Parent ) = 0; TBinarySearchTreeBase _BIDSFAR &_tree; TBinarySearchTreeBase::BinNode _BIDSFAR *Node; TBinarySearchTreeBase::IteratorOrder Order; TBinaryTreeInternalIteratorBase( const TBinaryTreeInternalIteratorBase _BIDSFAR & ); const TBinaryTreeInternalIteratorBase _BIDSFAR & operator = ( const TBinaryTreeInternalIteratorBase _BIDSFAR & ); }; class _BIDSCLASS TBinaryTreeExternalIteratorBase { public: void Restart(); protected: TBinaryTreeExternalIteratorBase( TBinarySearchTreeBase _BIDSFAR & tree, TBinarySearchTreeBase::IteratorOrder order = TBinarySearchTreeBase::InOrder ); ~TBinaryTreeExternalIteratorBase(); TBinarySearchTreeBase::BinNode _BIDSFAR *GetCurrent() const { return Current; } TBinarySearchTreeBase::BinNode _BIDSFAR *Next(); private: TStackAsList *Stack; TBinarySearchTreeBase _BIDSFAR *Tree; TBinarySearchTreeBase::BinNode _BIDSFAR *Current; TBinarySearchTreeBase::IteratorOrder Order; int LeftVisited; int RightVisited; int Processed; int IsInOrder() const; TBinaryTreeExternalIteratorBase( const TBinaryTreeExternalIteratorBase _BIDSFAR & ); const TBinaryTreeExternalIteratorBase _BIDSFAR & operator = ( const TBinaryTreeExternalIteratorBase _BIDSFAR & ); }; inline int TBinaryTreeExternalIteratorBase::IsInOrder() const { return (Current->Left == 0 || LeftVisited != 0) && (Current->Right == 0 || RightVisited == 0); } /*------------------------------------------------------------------------*/ /* */ /* template class TBinaryNodeImp */ /* */ /* Node for use with binary trees */ /* */ /*------------------------------------------------------------------------*/ template class _BIDSCLASS TBinaryNodeImp : public TBinarySearchTreeBase::BinNode { public: TBinaryNodeImp( const T& t ) : Data(t) {} T Data; } /*------------------------------------------------------------------------*/ /* */ /* template class TBinarySearchTreeImp */ /* template class TBinaryTreeInternalIterator */ /* template class TBinarySearchTreeIteratorImp */ /* */ /* Standard unbalanced binary tree and iterators */ /* */ /*------------------------------------------------------------------------*/ template class _BIDSCLASS TBinarySearchTreeImp : public TBinarySearchTreeBase { typedef TBinarySearchTreeBase Parent; public: typedef void (_BIDSFAR *IterFunc)(T _BIDSFAR&, void _BIDSFAR*); ~TBinarySearchTreeImp() { Flush(); } int Add( const T& t ) { return Parent::InsertNode( new TBinaryNodeImp(t) ); } int Detach( const T& t ) { return Parent::RemoveNode( &TBinaryNodeImp(t), 0 ); } T _BIDSFAR * Find( const T& t ) const { TBinaryNodeImp _BIDSFAR *res = Promote(Parent::FindNode( &TBinaryNodeImp(t) )); return res == 0 ? 0 : &Promote(res)->Data; } void ForEach( IterFunc iter, void _BIDSFAR * args, IteratorOrder order = InOrder ); void Flush() { Parent::Flush(); } Parent::GetItemsInContainer; Parent::IsEmpty; protected: virtual int EqualTo( BinNode _BIDSFAR *n1, BinNode _BIDSFAR *n2 ) { return Promote(n1)->Data == Promote(n2)->Data; } virtual int LessThan( BinNode _BIDSFAR *n1, BinNode _BIDSFAR *n2 ) { return Promote(n1)->Data < Promote(n2)->Data; } virtual void DeleteNode( BinNode _BIDSFAR *node, int ) { delete Promote(node); } private: static TBinaryNodeImp _BIDSFAR _BIDSFAR *Promote( BinNode _BIDSFAR *node ) { return STATIC_CAST(TBinaryNodeImp_BIDSFAR *,node); } static const TBinaryNodeImp _BIDSFAR *Promote( const BinNode _BIDSFAR *node ) { return STATIC_CAST(const TBinaryNodeImp_BIDSFAR *,node); } }; template class _BIDSCLASS TBinaryTreeInternalIterator : public TBinaryTreeInternalIteratorBase { public: typedef void (_BIDSFAR *IterFunc)(T _BIDSFAR&, void _BIDSFAR*); TBinaryTreeInternalIterator( TBinarySearchTreeBase& tree, IterFunc iter, void _BIDSFAR * args, TBinarySearchTreeBase::IteratorOrder order ); private: virtual void Apply( TBinarySearchTreeBase::BinNode _BIDSFAR *Node, TBinarySearchTreeBase::BinNode _BIDSFAR * ); IterFunc Iter; void _BIDSFAR *Args; }; template TBinaryTreeInternalIterator::TBinaryTreeInternalIterator( TBinarySearchTreeBase _BIDSFAR & tree, IterFunc iter, void _BIDSFAR *args, TBinarySearchTreeBase::IteratorOrder order ) : TBinaryTreeInternalIteratorBase( tree, order ), Iter(iter), Args(args) { } template void TBinaryTreeInternalIterator::Apply( TBinarySearchTreeBase::BinNode *Node, TBinarySearchTreeBase::BinNode _BIDSFAR * ) { Iter( STATIC_CAST(TBinaryNodeImp*,Node)->Data, Args ); } template void TBinarySearchTreeImp::ForEach( IterFunc iter, void _BIDSFAR * args, TBinarySearchTreeBase::IteratorOrder order = TBinarySearchTreeBase::InOrder ) { if( Root != 0 ) TBinaryTreeInternalIterator( *this, iter, args, order ).Iterate(); } template class _BIDSCLASS TBinarySearchTreeIteratorImp : private TBinaryTreeExternalIteratorBase { public: TBinarySearchTreeIteratorImp( TBinarySearchTreeImp& tree, TBinarySearchTreeBase::IteratorOrder order = TBinarySearchTreeBase::InOrder ) : TBinaryTreeExternalIteratorBase( tree, order ), CurNode(STATIC_CAST(TBinaryNodeImp_BIDSFAR *,Next())) { } operator int() const { return CurNode != 0; } const T& Current() const { PRECONDITION( CurNode != 0 ); return CurNode->Data; } const T& operator ++ ( int ) { PRECONDITION( CurNode != 0 ); const T& t = Current(); CurNode = STATIC_CAST(TBinaryNodeImp_BIDSFAR *,Next()); return t; } const T& operator ++ () { PRECONDITION( CurNode != 0 ); CurNode = STATIC_CAST(TBinaryNodeImp_BIDSFAR *,Next()); return Current(); } void Restart() { TBinaryTreeExternalIteratorBase::Restart(); CurNode = STATIC_CAST(TBinaryNodeImp_BIDSFAR *,Next()); } private: TBinaryNodeImp_BIDSFAR * CurNode; }; /*------------------------------------------------------------------------*/ /* */ /* template class TIBinarySearchTreeImp */ /* template class TIBinarySearchTreeIteratorImp */ /* */ /* Standard indirect unbalanced binary tree and iterators */ /* */ /*------------------------------------------------------------------------*/ template class _BIDSCLASS TIBinarySearchTreeIteratorImp; template class _BIDSCLASS TIBinarySearchTreeImp : private TBinarySearchTreeImp { public: typedef void (_BIDSFAR *IterFunc)(T _BIDSFAR&, void _BIDSFAR*); typedef TBinarySearchTreeImp Parent; friend class _BIDSCLASS TIBinarySearchTreeIteratorImp; int Add( T _BIDSFAR * t ) { return Parent::Add( t ); } int Detach( T _BIDSFAR *t, int del = 0 ) { return Parent::RemoveNode( &TBinaryNodeImp(t), del ); } void Flush( int del = 0 ) { TBinarySearchTreeBase::Flush(del); } T _BIDSFAR * Find( T _BIDSFAR * t ) const { TVoidPointer *res = Parent::Find(t); return res == 0 ? 0 : STATIC_CAST(T _BIDSFAR *,STATIC_CAST(void _BIDSFAR *,*res)); } void ForEach( IterFunc iter, void _BIDSFAR * args, IteratorOrder order = InOrder ) { if( Root != 0 ) TIBinaryTreeInternalIterator( *this, iter, args, order ).Iterate(); } Parent::GetItemsInContainer; Parent::IsEmpty; protected: virtual int EqualTo( BinNode _BIDSFAR *n1, BinNode _BIDSFAR *n2 ) { return *GetData(n1) == *GetData(n2); } virtual int LessThan( BinNode _BIDSFAR *n1, BinNode _BIDSFAR *n2 ) { return *GetData(n1) < *GetData(n2); } virtual void DeleteNode( BinNode _BIDSFAR *node, int del ) { if( del ) delete GetData(node); delete Promote(node); } private: static TBinaryNodeImp _BIDSFAR *Promote( BinNode _BIDSFAR *node ) { return STATIC_CAST(TBinaryNodeImp _BIDSFAR *,node); } static const TBinaryNodeImp _BIDSFAR *Promote( const BinNode _BIDSFAR *node ) { return STATIC_CAST(const TBinaryNodeImp _BIDSFAR *,node); } static T _BIDSFAR *GetData( BinNode _BIDSFAR *node ) { return STATIC_CAST(T _BIDSFAR *,STATIC_CAST(void _BIDSFAR *,Promote(node)->Data)); } }; template class _BIDSCLASS TIBinaryTreeInternalIterator : public TBinaryTreeInternalIteratorBase { public: typedef void (_BIDSFAR *IterFunc)(T _BIDSFAR&, void _BIDSFAR*); TIBinaryTreeInternalIterator( TBinarySearchTreeBase& tree, IterFunc iter, void _BIDSFAR * args, TBinarySearchTreeBase::IteratorOrder order ) : TBinaryTreeInternalIteratorBase( tree, order ), Iter(iter), Args(args) { } private: virtual void Apply( TBinarySearchTreeBase::BinNode _BIDSFAR *Node, TBinarySearchTreeBase::BinNode _BIDSFAR * ); IterFunc Iter; void _BIDSFAR *Args; }; template void TIBinaryTreeInternalIterator::Apply( TBinarySearchTreeBase::BinNode _BIDSFAR *Node, TBinarySearchTreeBase::BinNode _BIDSFAR * ) { Iter( *(T _BIDSFAR *)(void _BIDSFAR *)(STATIC_CAST(TBinaryNodeImp*,Node)->Data), Args ); } template class _BIDSCLASS TIBinarySearchTreeIteratorImp : private TBinarySearchTreeIteratorImp { typedef TBinarySearchTreeIteratorImp Parent; public: TIBinarySearchTreeIteratorImp( TIBinarySearchTreeImp& tree, TBinarySearchTreeBase::IteratorOrder order = TBinarySearchTreeBase::InOrder ) : TBinarySearchTreeIteratorImp(tree,order) { } Parent::operator int; T _BIDSFAR *Current() const { return (T _BIDSFAR *)(void _BIDSFAR *)(Parent::Current()); } T _BIDSFAR *operator ++ ( int i ) { return (T _BIDSFAR *)(void _BIDSFAR *)(Parent::operator++(i)); } T _BIDSFAR *operator ++ () { return (T _BIDSFAR *)(void _BIDSFAR *)(Parent::operator++()); } Parent::Restart; }; #if defined( BI_CLASSLIB_NO_po ) #pragma option -po. #endif #pragma option -Vo. #endif // CLASSLIB_BINIMP_H