11 typedef __POSITION
* POSITION
;
22 #if (_AFX_PACKING >= 8)
26 static inline CAtlPlex
* Create(
27 _Inout_ CAtlPlex
*& Entry
,
28 _In_
size_t MaxElements
,
29 _In_
size_t ElementSize
34 ATLASSERT(MaxElements
> 0);
35 ATLASSERT(ElementSize
> 0);
37 size_t BufferSize
= sizeof(CAtlPlex
) + (MaxElements
* ElementSize
);
39 void *Buffer
= HeapAlloc(GetProcessHeap(), 0, BufferSize
);
40 if (Buffer
== NULL
) return NULL
;
42 Block
= static_cast< CAtlPlex
* >(Buffer
);
43 Block
->m_Next
= Entry
;
64 HeapFree(GetProcessHeap(), 0, Block
);
72 class CElementTraitsBase
75 typedef const T
& INARGTYPE
;
76 typedef T
& OUTARGTYPE
;
78 static void CopyElements(
79 _Out_writes_all_(NumElements
) T
* Dest
,
80 _In_reads_(NumElements
) const T
* Source
,
81 _In_
size_t NumElements
)
83 for (size_t i
= 0; i
< NumElements
; i
++)
89 static void RelocateElements(
90 _Out_writes_all_(NumElements
) T
* Dest
,
91 _In_reads_(NumElements
) T
* Source
,
92 _In_
size_t NumElements
)
94 memmove_s(Dest
, NumElements
* sizeof(T
), Source
, NumElements
* sizeof(T
));
99 class CDefaultCompareTraits
102 static bool CompareElements(
106 return (Val1
== Val2
);
109 static int CompareElementsOrdered(
117 else if (Val1
> Val2
)
127 class CDefaultElementTraits
:
128 public CElementTraitsBase
<T
>,
129 public CDefaultCompareTraits
<T
>
135 class CElementTraits
:
136 public CDefaultElementTraits
<T
>
141 template<typename E
, class ETraits
= CElementTraits
<E
>>
145 typedef typename
ETraits::INARGTYPE INARGTYPE
;
148 class CNode
: public __POSITION
156 CNode(INARGTYPE Element
) :
168 size_t m_NumElements
;
171 CAtlList(_In_ UINT nBlockSize
= 10);
174 bool IsEmpty() const;
176 POSITION
GetHeadPosition() const;
179 _Inout_ POSITION
&Position
192 _In_opt_ CNode
* pPrev
,
193 _In_opt_ CNode
* pNext
207 // CAtlist public methods
210 template<typename E
, class ETraits
>
211 CAtlList
< E
, ETraits
>::CAtlList(_In_ UINT nBlockSize
) :
218 m_BlockSize(nBlockSize
)
220 ATLASSERT(nBlockSize
> 0);
223 template<typename E
, class ETraits
>
224 CAtlList
<E
, ETraits
>::~CAtlList(void)
229 template<typename E
, class ETraits
>
230 inline bool CAtlList
< E
, ETraits
>::IsEmpty(void) const
232 return (m_NumElements
== 0);
235 template<typename E
, class ETraits
>
236 inline POSITION CAtlList
<E
, ETraits
>::GetHeadPosition(void) const
238 return (POSITION
)m_HeadNode
;
241 template<typename E
, class ETraits
>
242 inline E
& CAtlList
< E
, ETraits
>::GetNext(
243 _Inout_ POSITION
& Position
246 CNode
* Node
= (CNode
*)Position
;
247 Position
= (POSITION
)Node
->m_Next
;
248 return Node
->m_Element
;
251 template<typename E
, class ETraits
>
252 POSITION CAtlList
<E
, ETraits
>::AddTail(
256 CNode
* Node
= CreateNode(element
, m_TailNode
, NULL
);
259 m_TailNode
->m_Next
= Node
;
267 return (POSITION
)Node
;
270 template<typename E
, class ETraits
>
271 E CAtlList
<E
, ETraits
>::RemoveTail(void)
273 CNode
* Node
= m_TailNode
;
275 E
Element(Node
->m_Element
);
277 m_TailNode
= Node
->m_Prev
;
280 m_TailNode
->m_Next
= NULL
;
291 template<typename E
, class ETraits
>
292 void CAtlList
<E
, ETraits
>::RemoveAll(void)
294 while (m_NumElements
> 0)
296 CNode
* Node
= m_HeadNode
;
297 m_HeadNode
= m_HeadNode
->m_Next
;
314 // CAtlist private methods
317 template<typename E
, class ETraits
>
318 typename CAtlList
<E
, ETraits
>::CNode
* CAtlList
<E
, ETraits
>::CreateNode(
320 _In_opt_ CNode
* Prev
,
326 CNode
* NewNode
= GetFreeNode();
327 CNode
* NextFree
= m_FreeNode
->m_Next
;
329 NewNode
= new CNode(element
);
331 m_FreeNode
= NextFree
;
332 NewNode
->m_Prev
= Prev
;
333 NewNode
->m_Next
= Next
;
339 template<typename E
, class ETraits
>
340 void CAtlList
<E
, ETraits
>::FreeNode(
345 pNode
->m_Next
= m_FreeNode
;
349 if (m_NumElements
== 0)
355 template<typename E
, class ETraits
>
356 typename CAtlList
<E
, ETraits
>::CNode
* CAtlList
< E
, ETraits
>::GetFreeNode(void)
363 CAtlPlex
* Block
= CAtlPlex::Create(m_Blocks
, m_BlockSize
, sizeof(CNode
));
366 throw(E_OUTOFMEMORY
);
369 CNode
* Node
= (CNode
*)Block
->GetData();
370 Node
+= (m_BlockSize
- 1);
371 for (int i
= m_BlockSize
- 1; i
>= 0; i
--)
373 Node
->m_Next
= m_FreeNode
;