windows-nt/Source/XPSP1/NT/admin/netui/common/h/treeiter.hxx

150 lines
3.5 KiB
C++
Raw Normal View History

2020-09-26 03:20:57 -05:00
/**********************************************************************/
/** Microsoft Windows/NT **/
/** Copyright(c) Microsoft Corp., 1991 **/
/**********************************************************************/
/*
TREEITER.HXX
DFS Iterator for the generic tree package
This file implements a DFS iterator for the generic tree package (see
tree.hxx & tree.cxx).
Usage:
#include <tree.hxx>
#include <treeiter.hxx>
DECLARE_TREE_OF(TEST);
DECLARE_DFSITER_TREE_OF(TEST);
VOID main()
{
TEST * pTest = new TEST;
pTest->Set(20);
TREE_OF_TEST treeTest( pTest );
for ( int i = 0; i < 10; i++ )
{
TREE_OF_TEST *ptreeTest = new TREE_OF_TEST( new TEST( i ) );
if ( ptreeTest != NULL )
if ( ptreeTest->QueryProp() != NULL )
treeTest.JoinSubtreeLeft( ptreeTest );
else
delete ptreeTest;
}
DFSITER_TREE_OF_TEST dfsitertreeTest( treeTest, 5 );
while ( ( pTest = dfsitertreeTest()) != NULL )
pTest->Print();
}
FILE HISTORY:
Johnl Oct. 15, 1990 Created
*/
#if !defined(_TREEITER_HXX_)
#define _TREEITER_HXX_
/*************************************************************************
NAME: DFSITER_TREE
SYNOPSIS: DFS Iter for generic tree class
INTERFACE:
DFSITER_TREE()
Create an iterator starting on this tree node and
traverse to a max depth of usDepth in a DFS fashion.
DFSITER_TREE()
Create a new iterator using the passed iterator's pos.
and depth.
~DFSITER_TREE()
Destructor
Reset()
Reset this iterators position and depth info.
Next()
Return the Next node in the DFS iteration, returns NULL
when there are no more nodes to return
operator()()
Synonym for Next()
USES: TREE
HISTORY:
Johnl 06-Sep-1990 Created
beng 26-Sep-1991 C7 delta
KeithMo 09-Oct-1991 Win32 Conversion.
**************************************************************************/
DLL_CLASS DFSITER_TREE
{
public:
DFSITER_TREE( const TREE * pt, const UINT uDepth );
DFSITER_TREE( const DFSITER_TREE * pdfsitertree );
~DFSITER_TREE();
VOID Reset();
VOID* Next();
VOID* operator()() { return Next(); }
protected:
const TREE * QueryNode() const { return _ptreeCurrent; }
const TREE * QueryStartNode() const { return _ptreeStart; }
UINT QueryMaxDepth() const { return _uMaxDepth; }
UINT QueryCurDepth() const { return _uCurDepth; }
private:
const TREE * _ptreeCurrent, *_ptreeStart;
UINT _uMaxDepth, _uCurDepth;
VOID SetNode( const TREE * pt )
{ _ptreeCurrent = pt; }
VOID SetStartNode( const TREE * pt )
{ _ptreeStart = pt; }
VOID SetMaxDepth( const UINT uMaxDepth )
{ _uMaxDepth = uMaxDepth; }
VOID SetCurDepth( const UINT uCurDepth )
{ _uCurDepth = uCurDepth; }
};
#define DFSITER_TREE_OF(type) DFSITER_TREE_OF_##type
#define DECL_DFSITER_TREE_OF(type,dec) \
class dec DFSITER_TREE_OF(type) : public DFSITER_TREE \
{ \
public: \
DFSITER_TREE_OF(type)( const TREE_OF(type) * pt, \
const UINT uDepth = (UINT)-1) \
: DFSITER_TREE( pt, uDepth ) {; } \
DFSITER_TREE_OF(type)( const DFSITER_TREE_OF(type) * pdfsiter ) \
: DFSITER_TREE( pdfsiter ) {; } \
~DFSITER_TREE_OF(type)() {; } \
\
type* Next() \
{ return (type *)DFSITER_TREE::Next(); } \
\
type* operator()() \
{ return Next(); } \
};
#define DECLARE_DFSITER_TREE_OF(type) \
DECL_DFSITER_TREE_OF(type,DLL_TEMPLATE)
#endif