![]() |
VR-Forces 4.0.4 Class Documentation
|
00001 /******************************************************************************* 00002 ** Copyright (c) 2004 MaK Technologies, Inc. 00003 ** All rights reserved. 00004 *******************************************************************************/ 00005 /******************************************************************************* 00006 ** $RCSfile: recRscrIter.h,v $ $Revision: 1.3 $ $State: Exp $ 00007 Created: 4/5/04 MEM 00008 *******************************************************************************/ 00009 00012 00018 00019 #ifndef DtRecursiveResourceIterator_H_ 00020 #define DtRecursiveResourceIterator_H_ 00021 00022 #include "vrfutil/simRsrc.h" 00023 #include "vrfutil/rsrcList.h" 00024 #include "vrfutil/iteratorBase.h" 00025 00031 #include "vrfutil/vrfutilDefines.h" 00032 class DT_DLL_vrfutil DtRecursiveResourceIterator : public DtIteratorBase<DtSimResource> 00033 { 00034 private: 00036 DtRecursiveResourceIterator(); 00037 00039 DtRecursiveResourceIterator( 00040 const DtRecursiveResourceIterator& orig); 00041 00043 const DtRecursiveResourceIterator& operator=( 00044 const DtRecursiveResourceIterator& orig); 00045 00046 public: 00047 00049 DtRecursiveResourceIterator(const DtList& list) : 00050 DtIteratorBase<DtSimResource>(list), myChildIterator(NULL) {}; 00051 00053 virtual ~DtRecursiveResourceIterator() { delete myChildIterator; }; 00054 00057 DtSimResource* first(bool move=true) 00058 { 00059 return DtIteratorBase<DtSimResource>::first(move); 00060 } 00061 00063 DtSimResource* current() const 00064 { 00065 if (myChildIterator) 00066 { 00067 DtSimResource* currRep = myChildIterator->current(); 00068 00069 if (currRep) 00070 { 00071 return currRep; 00072 } 00073 00074 else 00075 { 00076 delete myChildIterator; 00077 DtRecursiveResourceIterator* pRsrcIter = 00078 (DtRecursiveResourceIterator*)this; 00079 pRsrcIter->myChildIterator = NULL; 00080 } 00081 } 00082 00083 if (myCursor) 00084 { 00085 return (DtSimResource*) myCursor->data(); 00086 } 00087 00089 return NULL; 00090 } 00091 00095 DtSimResource* next(bool move=true, bool recurse=false) 00096 { 00097 DtSimResource* currRep; 00098 00100 if (myChildIterator) 00101 { 00102 currRep = myChildIterator->next(move,recurse); 00103 00104 if (currRep) 00105 { 00106 return currRep; 00107 } 00108 00109 else 00110 { 00111 delete myChildIterator; 00112 myChildIterator = NULL; 00113 } 00114 } 00115 00116 else if ( recurse ) 00117 { 00118 DtSimResource* currRep = current(); 00119 00120 if (!currRep) 00121 { 00122 return NULL; 00123 } 00124 00125 if (currRep->subresources() && currRep->subresources()->count()) 00126 { 00128 myChildIterator = new DtRecursiveResourceIterator(*(currRep->subresources())); 00129 if (myChildIterator) 00130 { 00131 return myChildIterator->first(); 00132 } 00133 00134 else 00135 { 00137 return NULL; 00138 } 00139 } 00140 } 00141 00144 if (myCursor) 00145 { 00146 myCursor = myCursor->next(); 00147 } 00148 00149 return current(); 00150 } 00151 00154 void reset() 00155 { 00156 DtIteratorBase<DtSimResource>::reset(); 00157 00158 if (myChildIterator) 00159 { 00160 delete myChildIterator; 00161 myChildIterator = NULL; 00162 } 00163 } 00164 00165 protected: 00166 DtRecursiveResourceIterator* myChildIterator; 00167 00168 }; 00169 00170 #endif