DCL 3.7.4
Loading...
Searching...
No Matches
__ListT-MSC.h
Go to the documentation of this file.
1
2/*
3Visual C++ 의 경우 템클레이트 클래스의 맴버 클래스의 맴버들에
4대하여 코드를 생성하지 못하는 버그가 있다.
5
6BUG: LNK2001 on Member Function When Use Nested Class Template
7Last reviewed: July 24, 1997
8Article ID: Q128789
9The information in this article applies to:
10The Microsoft C/C++ Compiler (CL.EXE) included with:
11 - Microsoft Visual C++, 32-bit Edition, versions 2.0, 2.1, 4.0, 4.1, 4.2, 5.0
12*/
13
14#ifndef __DCL_LIST_T_H__
15#error "Never include <dcl/__ListT-GCC.h> directly; use <dcl/ListT.h> instead."
16#endif
17
18__DCL_BEGIN_NAMESPACE
19
20#if __DCL_HAVE_THIS_FILE__
21 #undef __THIS_FILE__
22 static const char_t __szListT_h__[] = __T("dcl/__ListT-MSC.h");
23 #define __THIS_FILE__ __szListT_h__
24#endif
25
26template<typename ELEMENT>
27class List : public Object
28{
30public:
31 struct ListNode : public NodeBase
32 {
33 ELEMENT data;
34 };
35
36 class ConstIterator;
37 class Iterator : public ListIteratorBase
38 {
39 public:
40 Iterator()
41 {
42 __pNode = NULL;
43 }
44
45 Iterator(NodeBase* _pNode)
46 {
47 __DCL_ASSERT(_pNode != NULL);
48 __pNode = _pNode;
49 }
50
51 Iterator(const Iterator& _it)
52 {
53 __DCL_ASSERT(_it.__pNode != NULL);
54 __pNode = _it.__pNode;
55 }
56
57 Iterator& operator=(const Iterator& _it)
58 {
59 __DCL_ASSERT(_it.__pNode != NULL);
60 __pNode = _it.__pNode;
61 return *this;
62 }
63
64 Iterator& operator++()
65 {
67 __pNode = __pNode->pNext;
68 return *this;
69 }
70
71 Iterator operator++(int)
72 {
74 NodeBase* pSaveNode = __pNode;
75 __pNode = __pNode->pNext;
76 return Iterator(pSaveNode);
77 }
78
79 Iterator& operator--()
80 {
82 __pNode = __pNode->pPrev;
83 return *this;
84 }
85
86 Iterator operator--(int)
87 {
89 NodeBase* pSaveNode = __pNode;
90 __pNode = __pNode->pPrev;
91 return Iterator(pSaveNode);
92 }
93
94 ELEMENT& operator*()
95 {
97 return ((ListNode*)__pNode)->data;
98 }
99
100 protected:
101 friend typename List<ELEMENT>;
102 friend class ConstIterator;
103 };
104
105 class ConstIterator : public ConstListIteratorBase
106 {
107 public:
108 ConstIterator()
109 {
110 __pNode = NULL;
111 }
112
113 ConstIterator(const NodeBase* _pNode)
114 {
115 __DCL_ASSERT(_pNode != NULL);
116 __pNode = _pNode;
117 }
118
119 ConstIterator(const ConstIterator& _it)
120 {
121 __DCL_ASSERT(_it.__pNode != NULL);
122 __pNode = _it.__pNode;
123 }
124
125 ConstIterator(const Iterator& _it)
126 {
127 __DCL_ASSERT(_it.__pNode != NULL);
128 __pNode = _it.__pNode;
129 }
130
131 ConstIterator& operator=(const ConstIterator& _it)
132 {
133 __DCL_ASSERT(_it.__pNode != NULL);
134 __pNode = _it.__pNode;
135 return *this;
136 }
137
138 ConstIterator& operator++()
139 {
141 __pNode = __pNode->pNext;
142 return *this;
143 }
144
145 ConstIterator operator++(int)
146 {
148 const NodeBase* pSaveNode = __pNode;
149 __pNode = __pNode->pNext;
150 return ConstIterator(pSaveNode);
151 }
152
153 ConstIterator& operator--()
154 {
156 __pNode = __pNode->pPrev;
157 return *this;
158 }
159
160 ConstIterator operator--(int)
161 {
163 const NodeBase* pSaveNode = __pNode;
164 __pNode = __pNode->pPrev;
165 return ConstIterator(pSaveNode);
166 }
167
168 const ELEMENT& operator*()
169 {
171 return ((ListNode*)__pNode)->data;
172 }
173 };
174
175 class ReverseConstIterator;
176 class ReverseIterator : public ListIteratorBase
177 {
178 public:
179 ReverseIterator()
180 {
181 __pNode = NULL;
182 }
183
184 ReverseIterator(NodeBase* _pNode)
185 {
186 __DCL_ASSERT(_pNode != NULL);
187 __pNode = _pNode;
188 }
189
190 ReverseIterator(const ReverseIterator& _it)
191 {
192 __DCL_ASSERT(_it.__pNode != NULL);
193 __pNode = _it.__pNode;
194 }
195
196 ReverseIterator& operator=(const ReverseIterator& _it)
197 {
198 __DCL_ASSERT(_it.__pNode != NULL);
199 __pNode = _it.__pNode;
200 return *this;
201 }
202
203 ReverseIterator& operator++()
204 {
206 __pNode = __pNode->pPrev;
207 return *this;
208 }
209
210 ReverseIterator operator++(int)
211 {
213 NodeBase* pSaveNode = __pNode;
214 __pNode = __pNode->pPrev;
215 return ReverseIterator(pSaveNode);
216 }
217
218 ReverseIterator& operator--()
219 {
221 __pNode = __pNode->pNext;
222 return *this;
223 }
224
225 ReverseIterator operator--(int)
226 {
228 NodeBase* pSaveNode = __pNode;
229 __pNode = __pNode->pNext;
230 return ReverseIterator(pSaveNode);
231 }
232
233 ELEMENT& operator*()
234 {
236 return ((ListNode*)__pNode)->data;
237 }
238
239 protected:
240 friend typename List<ELEMENT>;
241 friend class ReverseConstIterator;
242 };
243
244 class ReverseConstIterator : public ConstListIteratorBase
245 {
246 public:
247 ReverseConstIterator()
248 {
249 __pNode = NULL;
250 }
251
252 ReverseConstIterator(const NodeBase* _pNode)
253 {
254 __DCL_ASSERT(_pNode != NULL);
255 __pNode = _pNode;
256 }
257
258 ReverseConstIterator(const ReverseConstIterator& _it)
259 {
260 __DCL_ASSERT(_it.__pNode != NULL);
261 __pNode = _it.__pNode;
262 }
263
264 ReverseConstIterator(const ReverseIterator& _it)
265 {
266 __DCL_ASSERT(_it.__pNode != NULL);
267 __pNode = _it.__pNode;
268 }
269
270 ReverseConstIterator& operator=(const ReverseConstIterator& _it)
271 {
272 __DCL_ASSERT(_it.__pNode != NULL);
273 __pNode = _it.__pNode;
274 return *this;
275 }
276
277 ReverseConstIterator& operator++()
278 {
280 __pNode = __pNode->pPrev;
281 return *this;
282 }
283
284 ReverseConstIterator operator++(int)
285 {
287 const NodeBase* pSaveNode = __pNode;
288 __pNode = __pNode->pPrev;
289 return ReverseConstIterator(pSaveNode);
290 }
291
292 ReverseConstIterator& operator--()
293 {
295 __pNode = __pNode->pNext;
296 return *this;
297 }
298
299 ReverseConstIterator operator--(int)
300 {
302 const NodeBase* pSaveNode = __pNode;
303 __pNode = __pNode->pNext;
304 return ReverseConstIterator(pSaveNode);
305 }
306
307 const ELEMENT& operator*()
308 {
310 return ((ListNode*)__pNode)->data;
311 }
312 };
313
314public:
315 virtual ~List();
317 List(const List<ELEMENT>& _src);
319
320 ConstIterator begin() const;
321 ConstIterator end() const;
322 Iterator begin();
323 Iterator end();
324
325 ReverseConstIterator rbegin() const;
326 ReverseConstIterator rend() const;
327 ReverseIterator rbegin();
328 ReverseIterator rend();
329
330 // return is inserted element Iterator
331 Iterator insert(Iterator _pos, const ELEMENT& _element);
332 void insert(Iterator _pos, ConstIterator _first, ConstIterator _last);
333
334 // return is next Iterator
335 Iterator erase(Iterator _pos);
336 void splice(Iterator _pos,
337 List<ELEMENT>& _other, Iterator _otherFirst, Iterator _otherLast);
338
339 List<ELEMENT>& addHead(const ELEMENT& _element);
340 List<ELEMENT>& addTail(const ELEMENT& _element);
341 List<ELEMENT>& add(const ELEMENT& _element);
342
343 ELEMENT removeHead();
344 ELEMENT removeTail();
345
346 void clear();
347 bool isEmpty() const;
348 size_t size() const;
349
350protected:
352 size_t __size;
353
354 size_t size(ConstIterator _first, ConstIterator _last) const;
355 // _first ~ _last to posTo
356 void move(Iterator posTo, Iterator _first, Iterator _last);
357
358 ListNode* createNode(const ELEMENT& _element);
359 void destroyNode(ListNode* _pNode);
360};
361
363
364template<typename ELEMENT>
365inline
366typename List<ELEMENT>::ConstIterator
368{
369 return __pMasterNode->pNext;
370}
371
372template<typename ELEMENT>
373inline
374typename List<ELEMENT>::ConstIterator
375List<ELEMENT>::end() const
376{
377 return __pMasterNode;
378}
379
380template<typename ELEMENT>
381inline
382typename List<ELEMENT>::Iterator
384{
385 return __pMasterNode->pNext;
386}
387
388template<typename ELEMENT>
389inline
390typename List<ELEMENT>::Iterator
392{
393 return __pMasterNode;
394}
395
396template<typename ELEMENT>
397inline
398typename List<ELEMENT>::ReverseConstIterator
400{
401 return __pMasterNode->pPrev;
402}
403
404template<typename ELEMENT>
405inline
406typename List<ELEMENT>::ReverseConstIterator
408{
409 return __pMasterNode;
410}
411
412template<typename ELEMENT>
413inline
414typename List<ELEMENT>::ReverseIterator
416{
417 return __pMasterNode->pPrev;
418}
419
420template<typename ELEMENT>
421inline
422typename List<ELEMENT>::ReverseIterator
424{
425 return __pMasterNode;
426}
427
428template<typename ELEMENT>
429inline
430bool
432{
433 return __pMasterNode->pNext == __pMasterNode;
434}
435
436template<typename ELEMENT>
437inline
438size_t
440{
441 return __size;
442}
443
444template<typename ELEMENT>
445inline
447List<ELEMENT>::addHead(const ELEMENT& _element)
448{
449 insert(begin(), _element);
450 return *this;
451}
452
453template<typename ELEMENT>
454inline
456List<ELEMENT>::addTail(const ELEMENT& _element)
457{
458 insert(end(), _element);
459 return *this;
460}
461
462template<typename ELEMENT>
463inline
465List<ELEMENT>::add(const ELEMENT& _element)
466{
467 insert(end(), _element);
468 return *this;
469}
471
472// IMPLEMENT_CLASSINFO(List<ELEMENT>, Object)
473#ifdef __DCL_NO_RTTI
474template<typename ELEMENT>
475const Object::ClassInfo List<ELEMENT>::__classInfo =
476{
477 __DCL_NAMESPACE_STRING __S(List),
478 sizeof(class List),
479 &Object::__classInfo
480};
481
482template<typename ELEMENT>
483const Object::ClassInfo* List<ELEMENT>::classInfo() const
484{
485 return CLASSINFO(class_name);
486}
487#else
488template<typename ELEMENT>
489const std::type_info& List<ELEMENT>::typeInfo() const
490{
491 return typeid(List);
492}
493#endif
494
495template<typename ELEMENT>
497{
498 if (!isEmpty())
499 clear();
500 free(__pMasterNode);
501}
502
503template<typename ELEMENT>
505{
506 __pMasterNode = (NodeBase*) malloc(sizeof(NodeBase));
507 // FIXME!
508 // if (pNode == NULL)
509 // throw new BadAllocException(sizeof(HashNode), __THIS_FILE__, __LINE__);
511
514 __size = 0;
515}
516
517template<typename ELEMENT>
519{
520 __pMasterNode = (NodeBase*) malloc(sizeof(NodeBase));
521 // FIXME!
522 // if (pNode == NULL)
523 // throw new BadAllocException(sizeof(HashNode), __THIS_FILE__, __LINE__);
525
528 __size = 0;
529
530 insert(end(), _src.begin(), _src.end());
531}
532
533template<typename ELEMENT>
534const
537{
538 if (&_src != this)
539 {
540 if (!isEmpty())
541 clear();
542 insert(end(), _src.begin(), _src.end());
543 }
544 return *this;
545}
546
547template<typename ELEMENT>
549List<ELEMENT>::createNode(const ELEMENT& _element)
550{
551 ListNode* pNode = (ListNode*) malloc(sizeof(ListNode));
552 // FIXME!
553 // if (pNode == NULL)
554 // throw new BadAllocException(sizeof(HashNode), __THIS_FILE__, __LINE__);
555
556#if __DCL_HAVE_ALLOC_DEBUG
557#undef new
558#endif
559
560 new(&(pNode->data)) ELEMENT;
561
562#if __DCL_HAVE_ALLOC_DEBUG
563#define new __DCL_DEBUG_NEW
564#endif
565
566 pNode->data = _element;
567 return pNode;
568}
569
570template<typename ELEMENT>
571void
572List<ELEMENT>::destroyNode(ListNode* _pNode)
573{
574 _pNode->data.~ELEMENT();
575 free(_pNode);
576}
577
578template<typename ELEMENT>
579typename List<ELEMENT>::Iterator
580List<ELEMENT>::insert(Iterator _pos, const ELEMENT& _element)
581{
582 ListNode* pNewNode = createNode(_element);
583 pNewNode->pPrev = _pos.__pNode->pPrev;
584 pNewNode->pNext = _pos.__pNode;
585 _pos.__pNode->pPrev->pNext = pNewNode;
586 _pos.__pNode->pPrev = pNewNode;
587
588 __size++;
589
590 return (ListNode*)pNewNode;
591}
592
593template<typename ELEMENT>
594void
595List<ELEMENT>::insert(Iterator _pos, ConstIterator _first, ConstIterator _last)
596{
597 for(; _first != _last; _first++)
598 {
599 insert(_pos, *_first);
600 }
601}
602
603template<typename ELEMENT>
604void
606{
607 ListNode* pNodeTemp = NULL;
608 NodeBase* pNode = __pMasterNode->pNext;
609 while(pNode != __pMasterNode)
610 {
611 pNodeTemp = (ListNode*)pNode;
612 pNode = pNode->pNext;
613 destroyNode(pNodeTemp);
614 }
617 __size = 0;
618}
619
620template<typename ELEMENT>
621typename List<ELEMENT>::Iterator
622List<ELEMENT>::erase(Iterator _pos)
623{
624 __DCL_ASSERT(_pos != end());
625 ListNode* pNodeTemp = (ListNode*)_pos.__pNode;
626 NodeBase* pNext = pNodeTemp->pNext;
627 pNodeTemp->pPrev->pNext = pNodeTemp->pNext;
628 pNodeTemp->pNext->pPrev = pNodeTemp->pPrev;
629 destroyNode(pNodeTemp);
630 __size--;
631 return (ListNode*)pNext;
632}
633
634template<typename ELEMENT>
635ELEMENT
637{
639 ELEMENT result = *begin();
640 erase(begin());
641 return result;
642}
643
644template<typename ELEMENT>
645ELEMENT
647{
649 Iterator it = end();
650 ELEMENT result = *(--it);
651 erase(it);
652 return result;
653}
654
655template<typename ELEMENT>
656void
657List<ELEMENT>::move(Iterator _pos, Iterator _first, Iterator _last)
658{
659 if (_pos != _last)
660 {
661 _last.__pNode->pPrev->pNext = _pos.__pNode;
662 _first.__pNode->pPrev->pNext = _last.__pNode;
663 _pos.__pNode->pPrev->pNext = _first.__pNode;
664
665 NodeBase* pTemp = _pos.__pNode->pPrev;
666 _pos.__pNode->pPrev = _last.__pNode->pPrev;
667 _last.__pNode->pPrev = _first.__pNode->pPrev;
668 _first.__pNode->pPrev = pTemp;
669 }
670}
671
672template<typename ELEMENT>
673void
674List<ELEMENT>::splice(Iterator _pos,
675 List<ELEMENT>& _other, Iterator _otherFirst, Iterator _otherLast)
676{
677 size_t nMoveCount = size((ListNode*)(_otherFirst.__pNode),
678 (ListNode*)(_otherLast.__pNode));
679 __size += nMoveCount;
680 _other.__size -= nMoveCount;
681
682 move(_pos, _otherFirst, _otherLast);
683}
684
685template<typename ELEMENT>
686size_t
687List<ELEMENT>::size(ConstIterator _first, ConstIterator _last) const
688{
689 int nCount = 0;
690 for(; _first != _last; _first++)
691 nCount++;
692 return nCount;
693}
694
695#if __DCL_HAVE_THIS_FILE__
696 #undef __THIS_FILE__
697 #define __THIS_FILE__ __T(__FILE__)
698#endif
699
700__DCL_END_NAMESPACE
#define NULL
Definition Config.h:312
wchar_t char_t
Definition Config.h:247
#define DECLARE_CLASSINFO(class_name)
Definition Object.h:227
#define CLASSINFO(class_name)
Definition Object.h:226
#define __DCL_ASSERT(expr)
Definition Object.h:394
#define __T(str)
Definition Object.h:60
const NodeBase * __pNode
Definition ListBase.h:44
Iterator erase(Iterator _pos)
ELEMENT removeHead()
List< ELEMENT > & addHead(const ELEMENT &_element)
void clear()
ReverseIterator rend()
ConstIterator end() const
void destroyNode(ListNode *_pNode)
size_t size(ConstIterator _first, ConstIterator _last) const
ConstIterator end() const
void insert(Iterator _pos, ConstIterator _first, ConstIterator _last)
ELEMENT removeTail()
ListNode * createNode(const ELEMENT &_element)
virtual ~List()
void move(Iterator posTo, Iterator _first, Iterator _last)
List(const List< ELEMENT > &_src)
size_t size() const
void splice(Iterator _pos, List< ELEMENT > &_other, Iterator _otherFirst, Iterator _otherLast)
ConstIterator begin() const
ReverseConstIterator rend() const
Iterator insert(Iterator _pos, const ELEMENT &_element)
Iterator begin()
ReverseIterator rbegin()
virtual ~List()
const List< ELEMENT > & operator=(const List< ELEMENT > &_src)
List< ELEMENT > & add(const ELEMENT &_element)
Iterator erase(Iterator _pos)
ListNode * createNode(const ELEMENT &_element)
Iterator end()
ReverseConstIterator rend() const
NodeBase * __pMasterNode
bool isEmpty() const
ReverseConstIterator rbegin() const
ConstIterator begin() const
ReverseConstIterator rbegin() const
List< ELEMENT > & addTail(const ELEMENT &_element)
Iterator insert(Iterator _pos, const ELEMENT &_element)
NodeBase * __pNode
Definition ListBase.h:30
virtual const std::type_info & typeInfo() const
Definition Object.cpp:126
NodeBase * pPrev
Definition ListBase.h:18
NodeBase * pNext
Definition ListBase.h:19