DCL 4.0
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 static const char_t __szListT_h__[] = __T("dcl/__ListT-MSC.h");
22 #undef __THIS_FILE__
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
444
445template<typename ELEMENT>
446inline
448List<ELEMENT>::addHead(const ELEMENT& _element)
449{
450 insert(begin(), _element);
451 return *this;
452}
453
454template<typename ELEMENT>
455inline
457List<ELEMENT>::addTail(const ELEMENT& _element)
458{
459 insert(end(), _element);
460 return *this;
461}
462
463template<typename ELEMENT>
464inline
466List<ELEMENT>::add(const ELEMENT& _element)
467{
468 insert(end(), _element);
469 return *this;
470}
472
473// IMPLEMENT_CLASSINFO(List<ELEMENT>, Object)
474#ifdef __DCL_NO_RTTI
475template<typename ELEMENT>
476const Object::ClassInfo List<ELEMENT>::m_classInfo =
477{
478 __DCL_NAMESPACE_STRING __S(List),
479 sizeof(class List),
480 &Object::m_classInfo
481};
482
483template<typename ELEMENT>
484const Object::ClassInfo* List<ELEMENT>::classInfo() const
485{
486 return CLASSINFO(class_name);
487}
488#else
489template<typename ELEMENT>
490const std::type_info& List<ELEMENT>::typeInfo() const
491{
492 return typeid(List);
493}
494#endif
495
496template<typename ELEMENT>
498{
499 if (!isEmpty())
500 clear();
501 free(__pMasterNode);
502}
503
504template<typename ELEMENT>
506{
507 __pMasterNode = (NodeBase*) malloc(sizeof(NodeBase));
508 // FIXME!
509 // if (pNode == NULL)
510 // throw new BadAllocException(sizeof(HashNode), __THIS_FILE__, __LINE__);
512
515 __size = 0;
516}
517
518template<typename ELEMENT>
520{
521 __pMasterNode = (NodeBase*) malloc(sizeof(NodeBase));
522 // FIXME!
523 // if (pNode == NULL)
524 // throw new BadAllocException(sizeof(HashNode), __THIS_FILE__, __LINE__);
526
529 __size = 0;
530
531 insert(end(), _src.begin(), _src.end());
532}
533
534template<typename ELEMENT>
535const
538{
539 if (&_src != this)
540 {
541 if (!isEmpty())
542 clear();
543 insert(end(), _src.begin(), _src.end());
544 }
545 return *this;
546}
547
548template<typename ELEMENT>
550List<ELEMENT>::createNode(const ELEMENT& _element)
551{
552 ListNode* pNode = (ListNode*) malloc(sizeof(ListNode));
553 // FIXME!
554 // if (pNode == NULL)
555 // throw new BadAllocException(sizeof(HashNode), __THIS_FILE__, __LINE__);
556
557#if __DCL_HAVE_ALLOC_DEBUG
558#undef new
559#endif
560
561 new(&(pNode->data)) ELEMENT;
562
563#if __DCL_HAVE_ALLOC_DEBUG
564#define new __DCL_DEBUG_NEW
565#endif
566
567 pNode->data = _element;
568 return pNode;
569}
570
571template<typename ELEMENT>
572void
573List<ELEMENT>::destroyNode(ListNode* _pNode)
574{
575 _pNode->data.~ELEMENT();
576 free(_pNode);
577}
578
579template<typename ELEMENT>
580typename List<ELEMENT>::Iterator
581List<ELEMENT>::insert(Iterator _pos, const ELEMENT& _element)
582{
583 ListNode* pNewNode = createNode(_element);
584 pNewNode->pPrev = _pos.__pNode->pPrev;
585 pNewNode->pNext = _pos.__pNode;
586 _pos.__pNode->pPrev->pNext = pNewNode;
587 _pos.__pNode->pPrev = pNewNode;
588
589 __size++;
590
591 return (ListNode*)pNewNode;
592}
593
594template<typename ELEMENT>
595void
596List<ELEMENT>::insert(Iterator _pos, ConstIterator _first, ConstIterator _last)
597{
598 for(; _first != _last; _first++)
599 {
600 insert(_pos, *_first);
601 }
602}
603
604template<typename ELEMENT>
605void
607{
608 ListNode* pNodeTemp = NULL;
609 NodeBase* pNode = __pMasterNode->pNext;
610 while(pNode != __pMasterNode)
611 {
612 pNodeTemp = (ListNode*)pNode;
613 pNode = pNode->pNext;
614 destroyNode(pNodeTemp);
615 }
618 __size = 0;
619}
620
621template<typename ELEMENT>
622typename List<ELEMENT>::Iterator
623List<ELEMENT>::erase(Iterator _pos)
624{
625 __DCL_ASSERT(_pos != end());
626 ListNode* pNodeTemp = (ListNode*)_pos.__pNode;
627 NodeBase* pNext = pNodeTemp->pNext;
628 pNodeTemp->pPrev->pNext = pNodeTemp->pNext;
629 pNodeTemp->pNext->pPrev = pNodeTemp->pPrev;
630 destroyNode(pNodeTemp);
631 __size--;
632 return (ListNode*)pNext;
633}
634
635template<typename ELEMENT>
636ELEMENT
638{
640 ELEMENT result = *begin();
641 erase(begin());
642 return result;
643}
644
645template<typename ELEMENT>
646ELEMENT
648{
650 Iterator it = end();
651 ELEMENT result = *(--it);
652 erase(it);
653 return result;
654}
655
656template<typename ELEMENT>
657void
658List<ELEMENT>::move(Iterator _pos, Iterator _first, Iterator _last)
659{
660 if (_pos != _last)
661 {
662 _last.__pNode->pPrev->pNext = _pos.__pNode;
663 _first.__pNode->pPrev->pNext = _last.__pNode;
664 _pos.__pNode->pPrev->pNext = _first.__pNode;
665
666 NodeBase* pTemp = _pos.__pNode->pPrev;
667 _pos.__pNode->pPrev = _last.__pNode->pPrev;
668 _last.__pNode->pPrev = _first.__pNode->pPrev;
669 _first.__pNode->pPrev = pTemp;
670 }
671}
672
673template<typename ELEMENT>
674void
675List<ELEMENT>::splice(Iterator _pos,
676 List<ELEMENT>& _other, Iterator _otherFirst, Iterator _otherLast)
677{
678 size_t nMoveCount = size((ListNode*)(_otherFirst.__pNode),
679 (ListNode*)(_otherLast.__pNode));
680 __size += nMoveCount;
681 _other.__size -= nMoveCount;
682
683 move(_pos, _otherFirst, _otherLast);
684}
685
686template<typename ELEMENT>
687size_t
688List<ELEMENT>::size(ConstIterator _first, ConstIterator _last) const
689{
690 int nCount = 0;
691 for(; _first != _last; _first++)
692 nCount++;
693 return nCount;
694}
695
696#if __DCL_HAVE_THIS_FILE__
697 #undef __THIS_FILE__
698 #define __THIS_FILE__ __T(__FILE__)
699#endif
700
701__DCL_END_NAMESPACE
#define NULL
Definition Config.h:340
wchar_t char_t
Definition Config.h:275
#define DECLARE_CLASSINFO(class_name)
Definition Object.h:210
#define CLASSINFO(class_name)
Definition Object.h:209
#define __DCL_ASSERT(expr)
Definition Object.h:371
#define __T(str)
Definition Object.h:44
return result
void CharsetConvertException *__fields clear()
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