00001 // /******************************************************************************\ 00002 // * 00003 // * File: HrefIdMap.h 00004 // * Creation date: June 11, 2001 11:05 00005 // * Author: ClassBuilder 00006 // * XXXX 00007 // * Purpose: Declaration of class 'HrefIdMap' 00008 // * 00009 // * Modifications: @INSERT_MODIFICATIONS(* ) 00010 // * June 12, 2001 09:22 WERS 00011 // * Added method 'RealNode' 00012 // * June 11, 2001 11:41 WERS 00013 // * Added method 'RealNode' 00014 // * June 11, 2001 11:09 WERS 00015 // * Added method 'Build' 00016 // * June 11, 2001 11:05 WERS 00017 // * Added method 'FindReverseHrefId' 00018 // * Added method 'FindHrefId' 00019 // * Added method 'FindEqualOrSmallerHrefId' 00020 // * Added method 'FindEqualOrBiggerHrefId' 00021 // * Added method 'DestructorInclude' 00022 // * Added method 'ConstructorInclude' 00023 // * Added method '~HrefIdMap' 00024 // * Added method 'HrefIdMap' 00025 // * Added relation 'HrefIdMap <>-->> HrefId' 00026 // * 00027 // * 00028 // \******************************************************************************/ 00029 #ifndef _HREFIDMAP_H 00030 #define _HREFIDMAP_H 00031 00032 //@START_USER1 00037 /* -------------------------------------------------------------- 00038 Copyright (C) 2001 LifeLine Networks BV <soap2corba@lifeline.nl> 00039 00040 This program is free software; you can redistribute it and/or 00041 modify it under the terms of the GNU General Public License 00042 as published by the Free Software Foundation; either 00043 version 2 of the License, or (at your option) any later 00044 version. 00045 00046 This program is distributed in the hope that it will be useful, 00047 but WITHOUT ANY WARRANTY; without even the implied warranty of 00048 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00049 GNU General Public License for more details. 00050 00051 You should have received a copy of the GNU General Public License 00052 along with this program; if not, write to the Free Software 00053 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 00054 -------------------------------------------------------------- */ 00055 //@END_USER1 00056 00057 00058 class HrefIdMap 00059 { 00060 // RELATION_AVLTREE_OWNED_ACTIVE(HrefIdMap, HrefIdMap, HrefId, HrefId) 00061 private: 00062 HrefId * _topHrefId; 00063 int _countHrefId; 00064 00065 protected: 00066 00067 public: 00068 void AddHrefId(HrefId* item); 00069 void RemoveHrefId(HrefId* item); 00070 void DeleteAllHrefId(); 00071 void ReplaceHrefId(HrefId* item, HrefId* newItem); 00072 HrefId* GetFirstHrefId() const; 00073 HrefId* GetLastHrefId() const; 00074 HrefId* GetNextHrefId(HrefId* pos) const; 00075 HrefId* GetPrevHrefId(HrefId* pos) const; 00076 int GetHrefIdCount() const; 00077 00078 class HrefIdIterator 00079 { 00080 private: 00081 HrefId* _refHrefId; 00082 HrefId* _prevHrefId; 00083 HrefId* _nextHrefId; 00084 const HrefIdMap* _iterHrefIdMap; 00085 00086 HrefIdIterator* _prev; 00087 HrefIdIterator* _next; 00088 00089 int (HrefId::*_method)() const; 00090 00091 static HrefIdIterator* _first; 00092 static HrefIdIterator* _last; 00093 00094 public: 00095 HrefIdIterator(const HrefIdMap* iterHrefIdMap, 00096 int (HrefId::*method)() const = 0, 00097 HrefId* refHrefId = 0); 00098 HrefIdIterator(const HrefIdMap& iterHrefIdMap, 00099 int (HrefId::*method)() const = 0, 00100 HrefId* refHrefId = 0); 00101 HrefIdIterator(const HrefIdIterator& iterator, 00102 int (HrefId::*method)() const = 0); 00103 ~HrefIdIterator(); 00104 00105 HrefIdIterator& operator= (const HrefIdIterator& iterator) 00106 { 00107 _iterHrefIdMap = iterator._iterHrefIdMap; 00108 _refHrefId = iterator._refHrefId; 00109 _prevHrefId = iterator._prevHrefId; 00110 _nextHrefId = iterator._nextHrefId; 00111 _method = iterator._method; 00112 return *this; 00113 } 00114 HrefId* operator++ () 00115 { 00116 _nextHrefId = _iterHrefIdMap->GetNextHrefId(_nextHrefId); 00117 if (_method != 0) 00118 { 00119 while (_nextHrefId && !(_nextHrefId->*_method)()) 00120 _nextHrefId = _iterHrefIdMap->GetNextHrefId(_nextHrefId); 00121 } 00122 _refHrefId = _prevHrefId = _nextHrefId; 00123 return _refHrefId; 00124 } 00125 HrefId* operator-- () 00126 { 00127 _prevHrefId = _iterHrefIdMap->GetPrevHrefId(_prevHrefId); 00128 if (_method != 0) 00129 { 00130 while (_prevHrefId && !(_prevHrefId->*_method)()) 00131 _prevHrefId = _iterHrefIdMap->GetPrevHrefId(_prevHrefId); 00132 } 00133 _refHrefId = _nextHrefId = _prevHrefId; 00134 return _refHrefId; 00135 } 00136 operator HrefId*() { return _refHrefId; } 00137 HrefId* operator-> () { return _refHrefId; } 00138 HrefId* Get() { return _refHrefId; } 00139 void Reset() { _refHrefId = _prevHrefId = _nextHrefId = (HrefId*)0; } 00140 00141 int IsLast() { return (_iterHrefIdMap->GetLastHrefId() == _refHrefId); } 00142 int IsFirst() { return (_iterHrefIdMap->GetFirstHrefId() == _refHrefId); } 00143 00144 static void Check(HrefId* itemHrefId); 00145 static void Check(HrefId* itemHrefId, HrefId* newItemHrefId); 00146 }; 00147 00148 //@START_USER2 00149 //@END_USER2 00150 00151 // Members 00152 private: 00153 00154 protected: 00155 00156 public: 00157 00158 // Methods 00159 private: 00160 void ConstructorInclude(); 00161 void DestructorInclude(); 00162 00163 protected: 00164 00165 public: 00166 HrefIdMap(); 00167 virtual ~HrefIdMap(); 00168 void Build(DOM_Node& rNode); 00169 void RealNode(DOM_Node& rRealNode, DOM_Node& rFakeNode); 00170 void RealNode(DOM_Element& rElement, DOM_Node& rFakeNode); 00171 HrefId* FindEqualOrBiggerHrefId(const CString& id); 00172 HrefId* FindEqualOrSmallerHrefId(const CString& id); 00173 HrefId* FindHrefId(const CString& id); 00174 HrefId* FindReverseHrefId(const CString& id); 00175 }; 00176 00177 #endif 00178 00179 00180 #ifdef CB_INLINES 00181 #ifndef _HREFIDMAP_H_INLINES 00182 #define _HREFIDMAP_H_INLINES 00183 00184 //@START_USER3 00185 //@END_USER3 00186 00187 #endif 00188 #endif 00189