Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(234)

Side by Side Diff: xfa/src/fgas/crt/fgas_utils.h

Issue 1803723002: Move xfa/src up to xfa/. (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@master
Patch Set: Rebase to master Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « xfa/src/fgas/crt/fgas_system.cpp ('k') | xfa/src/fgas/crt/fgas_utils.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright 2014 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6
7 #ifndef XFA_SRC_FGAS_CRT_FGAS_UTILS_H_
8 #define XFA_SRC_FGAS_CRT_FGAS_UTILS_H_
9
10 #include "core/include/fxcrt/fx_coordinates.h"
11 #include "xfa/src/fgas/crt/fgas_memory.h"
12
13 class FX_BASEARRAYDATA;
14
15 template <class baseType>
16 class CFX_CPLTree;
17
18 class CFX_BaseArray : public CFX_Target {
19 protected:
20 CFX_BaseArray(int32_t iGrowSize, int32_t iBlockSize);
21 ~CFX_BaseArray();
22 int32_t GetSize() const;
23 int32_t GetBlockSize() const;
24 uint8_t* AddSpaceTo(int32_t index);
25 uint8_t* GetAt(int32_t index) const;
26 uint8_t* GetBuffer() const;
27 int32_t Append(const CFX_BaseArray& src,
28 int32_t iStart = 0,
29 int32_t iCount = -1);
30 int32_t Copy(const CFX_BaseArray& src,
31 int32_t iStart = 0,
32 int32_t iCount = -1);
33 int32_t RemoveLast(int32_t iCount = -1);
34 void RemoveAll(FX_BOOL bLeaveMemory = FALSE);
35
36 FX_BASEARRAYDATA* m_pData;
37 };
38
39 template <class baseType>
40 class CFX_BaseArrayTemplate : public CFX_BaseArray {
41 public:
42 CFX_BaseArrayTemplate(int32_t iGrowSize = 100)
43 : CFX_BaseArray(iGrowSize, sizeof(baseType)) {}
44 CFX_BaseArrayTemplate(int32_t iGrowSize, int32_t iBlockSize)
45 : CFX_BaseArray(iGrowSize, iBlockSize) {}
46 int32_t GetSize() const { return CFX_BaseArray::GetSize(); }
47 int32_t GetBlockSize() const { return CFX_BaseArray::GetBlockSize(); }
48 baseType* AddSpace() {
49 return (baseType*)CFX_BaseArray::AddSpaceTo(CFX_BaseArray::GetSize());
50 }
51 int32_t Add(const baseType& element) {
52 int32_t index = CFX_BaseArray::GetSize();
53 *(baseType*)CFX_BaseArray::AddSpaceTo(index) = element;
54 return index;
55 }
56 baseType* GetBuffer() const { return (baseType*)CFX_BaseArray::GetBuffer(); }
57 baseType& GetAt(int32_t index) const {
58 return *(baseType*)CFX_BaseArray::GetAt(index);
59 }
60 baseType* GetPtrAt(int32_t index) const {
61 return (baseType*)CFX_BaseArray::GetAt(index);
62 }
63 void SetAt(int32_t index, const baseType& element) {
64 *(baseType*)CFX_BaseArray::GetAt(index) = element;
65 }
66 void SetAtGrow(int32_t index, const baseType& element) {
67 *(baseType*)CFX_BaseArray::AddSpaceTo(index) = element;
68 }
69 int32_t Append(const CFX_BaseArrayTemplate& src,
70 int32_t iStart = 0,
71 int32_t iCount = -1) {
72 return CFX_BaseArray::Append(src, iStart, iCount);
73 }
74 int32_t Copy(const CFX_BaseArrayTemplate& src,
75 int32_t iStart = 0,
76 int32_t iCount = -1) {
77 return CFX_BaseArray::Copy(src, iStart, iCount);
78 }
79 int32_t RemoveLast(int32_t iCount = -1) {
80 return CFX_BaseArray::RemoveLast(iCount);
81 }
82 void RemoveAll(FX_BOOL bLeaveMemory = FALSE) {
83 CFX_BaseArray::RemoveAll(bLeaveMemory);
84 }
85 };
86 typedef CFX_BaseArrayTemplate<void*> CFDE_PtrArray;
87 typedef CFX_BaseArrayTemplate<FX_DWORD> CFDE_DWordArray;
88 typedef CFX_BaseArrayTemplate<FX_WORD> CFDE_WordArray;
89
90 template <class baseType>
91 class CFX_ObjectBaseArrayTemplate : public CFX_BaseArray {
92 public:
93 CFX_ObjectBaseArrayTemplate(int32_t iGrowSize = 100)
94 : CFX_BaseArray(iGrowSize, sizeof(baseType)) {}
95 ~CFX_ObjectBaseArrayTemplate() { RemoveAll(FALSE); }
96 int32_t GetSize() const { return CFX_BaseArray::GetSize(); }
97 int32_t GetBlockSize() const { return CFX_BaseArray::GetBlockSize(); }
98 int32_t Add(const baseType& element) {
99 int32_t index = CFX_BaseArray::GetSize();
100 baseType* p = (baseType*)CFX_BaseArray::AddSpaceTo(index);
101 new ((void*)p) baseType(element);
102 return index;
103 }
104 baseType& GetAt(int32_t index) const {
105 return *(baseType*)CFX_BaseArray::GetAt(index);
106 }
107 baseType* GetPtrAt(int32_t index) const {
108 return (baseType*)CFX_BaseArray::GetAt(index);
109 }
110 int32_t Append(const CFX_ObjectBaseArrayTemplate& src,
111 int32_t iStart = 0,
112 int32_t iCount = -1) {
113 FXSYS_assert(GetBlockSize() == src.GetBlockSize());
114 if (iCount == 0) {
115 return 0;
116 }
117 int32_t iSize = src.GetSize();
118 FXSYS_assert(iStart > -1 && iStart < iSize);
119 if (iCount < 0) {
120 iCount = iSize;
121 }
122 if (iStart + iCount > iSize) {
123 iCount = iSize - iStart;
124 }
125 if (iCount < 1) {
126 return 0;
127 }
128 iSize = CFX_BaseArray::GetSize();
129 CFX_BaseArray::AddSpaceTo(iSize + iCount - 1);
130 uint8_t** pStart = CFX_BaseArray::GetAt(iSize);
131 int32_t iBlockSize = CFX_BaseArray::GetBlockSize();
132 iSize = iStart + iCount;
133 for (int32_t i = iStart; i < iSize; i++) {
134 FXTARGET_NewWith((void*)pStart) baseType(src.GetAt(i));
135 pStart += iBlockSize;
136 }
137 return iCount;
138 }
139 int32_t Copy(const CFX_ObjectBaseArrayTemplate& src,
140 int32_t iStart = 0,
141 int32_t iCount = -1) {
142 FXSYS_assert(GetBlockSize() == src.GetBlockSize());
143 if (iCount == 0) {
144 return 0;
145 }
146 int32_t iSize = src.GetSize();
147 FXSYS_assert(iStart > -1 && iStart < iSize);
148 if (iCount < 0) {
149 iCount = iSize;
150 }
151 if (iStart + iCount > iSize) {
152 iCount = iSize - iStart;
153 }
154 if (iCount < 1) {
155 return 0;
156 }
157 RemoveAll(TRUE);
158 CFX_BaseArray::AddSpaceTo(iCount - 1);
159 uint8_t** pStart = CFX_BaseArray::GetAt(0);
160 int32_t iBlockSize = CFX_BaseArray::GetBlockSize();
161 iSize = iStart + iCount;
162 for (int32_t i = iStart; i < iSize; i++) {
163 new ((void*)pStart) baseType(src.GetAt(i));
164 pStart += iBlockSize;
165 }
166 return iCount;
167 }
168 int32_t RemoveLast(int32_t iCount = -1) {
169 int32_t iSize = CFX_BaseArray::GetSize();
170 if (iCount < 0 || iCount > iSize) {
171 iCount = iSize;
172 }
173 if (iCount == 0) {
174 return iSize;
175 }
176 for (int32_t i = iSize - iCount; i < iSize; i++) {
177 ((baseType*)GetPtrAt(i))->~baseType();
178 }
179 return CFX_BaseArray::RemoveLast(iCount);
180 }
181 void RemoveAll(FX_BOOL bLeaveMemory = FALSE) {
182 int32_t iSize = CFX_BaseArray::GetSize();
183 for (int32_t i = 0; i < iSize; i++) {
184 ((baseType*)GetPtrAt(i))->~baseType();
185 }
186 CFX_BaseArray::RemoveAll(bLeaveMemory);
187 }
188 };
189
190 class CFX_BaseMassArrayImp : public CFX_Target {
191 public:
192 CFX_BaseMassArrayImp(int32_t iChunkSize, int32_t iBlockSize);
193 ~CFX_BaseMassArrayImp();
194 uint8_t* AddSpace() { return AddSpaceTo(m_iBlockCount); }
195 uint8_t* AddSpaceTo(int32_t index);
196 uint8_t* GetAt(int32_t index) const;
197 int32_t Append(const CFX_BaseMassArrayImp& src,
198 int32_t iStart = 0,
199 int32_t iCount = -1);
200 int32_t Copy(const CFX_BaseMassArrayImp& src,
201 int32_t iStart = 0,
202 int32_t iCount = -1);
203 int32_t RemoveLast(int32_t iCount = -1);
204 void RemoveAll(FX_BOOL bLeaveMemory = FALSE);
205 int32_t m_iChunkSize;
206 int32_t m_iBlockSize;
207 int32_t m_iChunkCount;
208 int32_t m_iBlockCount;
209 CFX_PtrArray* m_pData;
210
211 protected:
212 void Append(int32_t iDstStart,
213 const CFX_BaseMassArrayImp& src,
214 int32_t iSrcStart = 0,
215 int32_t iSrcCount = -1);
216 };
217
218 class CFX_BaseMassArray : public CFX_Target {
219 protected:
220 CFX_BaseMassArray(int32_t iChunkSize, int32_t iBlockSize);
221 ~CFX_BaseMassArray();
222 int32_t GetSize() const;
223 uint8_t* AddSpaceTo(int32_t index);
224 uint8_t* GetAt(int32_t index) const;
225 int32_t Append(const CFX_BaseMassArray& src,
226 int32_t iStart = 0,
227 int32_t iCount = -1);
228 int32_t Copy(const CFX_BaseMassArray& src,
229 int32_t iStart = 0,
230 int32_t iCount = -1);
231 int32_t RemoveLast(int32_t iCount = -1);
232 void RemoveAll(FX_BOOL bLeaveMemory = FALSE);
233 CFX_BaseMassArrayImp* m_pData;
234 };
235
236 template <class baseType>
237 class CFX_MassArrayTemplate : public CFX_BaseMassArray {
238 public:
239 CFX_MassArrayTemplate(int32_t iChunkSize = 100)
240 : CFX_BaseMassArray(iChunkSize, sizeof(baseType)) {}
241 CFX_MassArrayTemplate(int32_t iChunkSize, int32_t iBlockSize)
242 : CFX_BaseMassArray(iChunkSize, iBlockSize) {}
243 int32_t GetSize() const { return CFX_BaseMassArray::GetSize(); }
244 baseType* AddSpace() {
245 return (baseType*)CFX_BaseMassArray::AddSpaceTo(
246 CFX_BaseMassArray::GetSize());
247 }
248 int32_t Add(const baseType& element) {
249 int32_t index = CFX_BaseMassArray::GetSize();
250 *(baseType*)CFX_BaseMassArray::AddSpaceTo(index) = element;
251 return index;
252 }
253 baseType& GetAt(int32_t index) const {
254 return *(baseType*)CFX_BaseMassArray::GetAt(index);
255 }
256 baseType* GetPtrAt(int32_t index) const {
257 return (baseType*)CFX_BaseMassArray::GetAt(index);
258 }
259 void SetAt(int32_t index, const baseType& element) {
260 *(baseType*)CFX_BaseMassArray::GetAt(index) = element;
261 }
262 void SetAtGrow(int32_t index, const baseType& element) {
263 *(baseType*)CFX_BaseMassArray::AddSpaceTo(index) = element;
264 }
265 int32_t Append(const CFX_MassArrayTemplate& src,
266 int32_t iStart = 0,
267 int32_t iCount = -1) {
268 return CFX_BaseMassArray::Append(src, iStart, iCount);
269 }
270 int32_t Copy(const CFX_MassArrayTemplate& src,
271 int32_t iStart = 0,
272 int32_t iCount = -1) {
273 return CFX_BaseMassArray::Copy(src, iStart, iCount);
274 }
275 int32_t RemoveLast(int32_t iCount = -1) {
276 return CFX_BaseMassArray::RemoveLast(iCount);
277 }
278 void RemoveAll(FX_BOOL bLeaveMemory = FALSE) {
279 CFX_BaseMassArray::RemoveAll(bLeaveMemory);
280 }
281 };
282 typedef CFX_MassArrayTemplate<void*> CFX_PtrMassArray;
283 typedef CFX_MassArrayTemplate<int32_t> CFX_Int32MassArray;
284 typedef CFX_MassArrayTemplate<FX_DWORD> CFX_DWordMassArray;
285 typedef CFX_MassArrayTemplate<FX_WORD> CFX_WordMassArray;
286 typedef CFX_MassArrayTemplate<CFX_Rect> CFX_RectMassArray;
287 typedef CFX_MassArrayTemplate<CFX_RectF> CFX_RectFMassArray;
288
289 template <class baseType>
290 class CFX_ObjectMassArrayTemplate : public CFX_BaseMassArray {
291 public:
292 CFX_ObjectMassArrayTemplate(int32_t iChunkSize = 100)
293 : CFX_BaseMassArray(iChunkSize, sizeof(baseType)) {}
294 ~CFX_ObjectMassArrayTemplate() { RemoveAll(FALSE); }
295 int32_t GetSize() const { return CFX_BaseMassArray::GetSize(); }
296 int32_t Add(const baseType& element) {
297 int32_t index = CFX_BaseMassArray::GetSize();
298 baseType* p = (baseType*)CFX_BaseMassArray::AddSpaceTo(index);
299 new ((void*)p) baseType(element);
300 return index;
301 }
302 baseType& GetAt(int32_t index) const {
303 return *(baseType*)CFX_BaseMassArray::GetAt(index);
304 }
305 baseType* GetPtrAt(int32_t index) const {
306 return (baseType*)CFX_BaseMassArray::GetAt(index);
307 }
308 int32_t Append(const CFX_ObjectMassArrayTemplate& src,
309 int32_t iStart = 0,
310 int32_t iCount = -1) {
311 if (iCount == 0) {
312 return CFX_BaseMassArray::GetSize();
313 }
314 int32_t iSize = src.GetSize();
315 FXSYS_assert(iStart > -1 && iStart < iSize);
316 if (iCount < 0) {
317 iCount = iSize;
318 }
319 int32_t iEnd = iStart + iCount;
320 if (iEnd > iSize) {
321 iEnd = iSize;
322 }
323 for (int32_t i = iStart; i < iEnd; i++) {
324 Add(src.GetAt(i));
325 }
326 return CFX_BaseMassArray::GetSize();
327 }
328 int32_t Copy(const CFX_ObjectMassArrayTemplate& src,
329 int32_t iStart = 0,
330 int32_t iCount = -1) {
331 if (iCount == 0) {
332 return CFX_BaseMassArray::GetSize();
333 }
334 int32_t iSize = src.GetSize();
335 FXSYS_assert(iStart > -1 && iStart < iSize);
336 if (iCount < 0) {
337 iCount = iSize;
338 }
339 int32_t iEnd = iStart + iCount;
340 if (iEnd > iSize) {
341 iEnd = iSize;
342 }
343 RemoveAll(TRUE);
344 for (int32_t i = iStart; i < iEnd; i++) {
345 Add(src.GetAt(i));
346 }
347 return CFX_BaseMassArray::GetSize();
348 }
349 int32_t RemoveLast(int32_t iCount = -1) {
350 int32_t iSize = CFX_BaseMassArray::GetSize();
351 if (iCount < 0 || iCount > iSize) {
352 iCount = iSize;
353 }
354 if (iCount == 0) {
355 return iSize;
356 }
357 for (int32_t i = iSize - iCount; i < iSize; i++) {
358 ((baseType*)GetPtrAt(i))->~baseType();
359 }
360 return CFX_BaseMassArray::RemoveLast(iCount);
361 }
362 void RemoveAll(FX_BOOL bLeaveMemory = FALSE) {
363 int32_t iSize = CFX_BaseMassArray::GetSize();
364 for (int32_t i = 0; i < iSize; i++) {
365 ((baseType*)GetPtrAt(i))->~baseType();
366 }
367 CFX_BaseMassArray::RemoveAll(bLeaveMemory);
368 }
369 };
370
371 class CFX_BaseDiscreteArray : public CFX_Target {
372 protected:
373 CFX_BaseDiscreteArray(int32_t iChunkSize, int32_t iBlockSize);
374 ~CFX_BaseDiscreteArray();
375 uint8_t* AddSpaceTo(int32_t index);
376 uint8_t* GetAt(int32_t index) const;
377 void RemoveAll();
378 void* m_pData;
379 };
380
381 template <class baseType>
382 class CFX_DiscreteArrayTemplate : public CFX_BaseDiscreteArray {
383 public:
384 CFX_DiscreteArrayTemplate(int32_t iChunkSize = 100)
385 : CFX_BaseDiscreteArray(iChunkSize, sizeof(baseType)) {}
386 baseType& GetAt(int32_t index, const baseType& defValue) const {
387 baseType* p = (baseType*)CFX_BaseDiscreteArray::GetAt(index);
388 return p == NULL ? (baseType&)defValue : *p;
389 }
390 baseType* GetPtrAt(int32_t index) const {
391 return (baseType*)CFX_BaseDiscreteArray::GetAt(index);
392 }
393 void SetAtGrow(int32_t index, const baseType& element) {
394 *(baseType*)CFX_BaseDiscreteArray::AddSpaceTo(index) = element;
395 }
396 void RemoveAll() { CFX_BaseDiscreteArray::RemoveAll(); }
397 };
398 typedef CFX_DiscreteArrayTemplate<void*> CFX_PtrDiscreteArray;
399 typedef CFX_DiscreteArrayTemplate<FX_DWORD> CFX_DWordDiscreteArray;
400 typedef CFX_DiscreteArrayTemplate<FX_WORD> CFX_WordDiscreteArray;
401
402 class CFX_BaseStack : public CFX_Target {
403 protected:
404 CFX_BaseStack(int32_t iChunkSize, int32_t iBlockSize);
405 ~CFX_BaseStack();
406 uint8_t* Push();
407 void Pop();
408 uint8_t* GetTopElement() const;
409 int32_t GetSize() const;
410 uint8_t* GetAt(int32_t index) const;
411 void RemoveAll(FX_BOOL bLeaveMemory = FALSE);
412 CFX_BaseMassArrayImp* m_pData;
413 };
414
415 template <class baseType>
416 class CFX_StackTemplate : public CFX_BaseStack {
417 public:
418 CFX_StackTemplate(int32_t iChunkSize = 100)
419 : CFX_BaseStack(iChunkSize, sizeof(baseType)) {}
420 int32_t Push(const baseType& element) {
421 int32_t index = CFX_BaseStack::GetSize();
422 *(baseType*)CFX_BaseStack::Push() = element;
423 return index;
424 }
425 void Pop() { CFX_BaseStack::Pop(); }
426 baseType* GetTopElement() const {
427 return (baseType*)CFX_BaseStack::GetTopElement();
428 }
429 int32_t GetSize() const { return CFX_BaseStack::GetSize(); }
430 baseType* GetAt(int32_t index) const {
431 return (baseType*)CFX_BaseStack::GetAt(index);
432 }
433 void RemoveAll(FX_BOOL bLeaveMemory = FALSE) {
434 CFX_BaseStack::RemoveAll(bLeaveMemory);
435 }
436 };
437 typedef CFX_StackTemplate<void*> CFX_PtrStack;
438 typedef CFX_StackTemplate<FX_DWORD> CFX_DWordStack;
439 typedef CFX_StackTemplate<FX_WORD> CFX_WordStack;
440 typedef CFX_StackTemplate<int32_t> CFX_Int32Stack;
441
442 template <class baseType>
443 class CFX_ObjectStackTemplate : public CFX_BaseStack {
444 public:
445 CFX_ObjectStackTemplate(int32_t iChunkSize = 100)
446 : CFX_BaseStack(iChunkSize, sizeof(baseType)) {}
447 ~CFX_ObjectStackTemplate() { RemoveAll(); }
448 int32_t Push(const baseType& element) {
449 int32_t index = CFX_BaseStack::GetSize();
450 baseType* p = (baseType*)CFX_BaseStack::Push();
451 new ((void*)p) baseType(element);
452 return index;
453 }
454 void Pop() {
455 baseType* p = (baseType*)CFX_BaseStack::GetTopElement();
456 if (p != NULL) {
457 p->~baseType();
458 }
459 CFX_BaseStack::Pop();
460 }
461 baseType* GetTopElement() const {
462 return (baseType*)CFX_BaseStack::GetTopElement();
463 }
464 int32_t GetSize() const { return CFX_BaseStack::GetSize(); }
465 baseType* GetAt(int32_t index) const {
466 return (baseType*)CFX_BaseStack::GetAt(index);
467 }
468 void RemoveAll(FX_BOOL bLeaveMemory = FALSE) {
469 int32_t iSize = CFX_BaseStack::GetSize();
470 for (int32_t i = 0; i < iSize; i++) {
471 ((baseType*)CFX_BaseStack::GetAt(i))->~baseType();
472 }
473 CFX_BaseStack::RemoveAll(bLeaveMemory);
474 }
475 int32_t Copy(const CFX_ObjectStackTemplate& src,
476 int32_t iStart = 0,
477 int32_t iCount = -1) {
478 if (iCount == 0) {
479 return CFX_BaseStack::GetSize();
480 }
481 int32_t iSize = src.GetSize();
482 FXSYS_assert(iStart > -1 && iStart < iSize);
483 if (iCount < 0) {
484 iCount = iSize;
485 }
486 int32_t iEnd = iStart + iCount;
487 if (iEnd > iSize) {
488 iEnd = iSize;
489 }
490 RemoveAll(TRUE);
491 for (int32_t i = iStart; i < iEnd; i++) {
492 Push(*src.GetAt(i));
493 }
494 return CFX_BaseStack::GetSize();
495 }
496 };
497
498 template <class baseType>
499 class CFX_CPLTreeNode : public CFX_Target {
500 public:
501 typedef CFX_CPLTreeNode<baseType> CPLTreeNode;
502 CFX_CPLTreeNode()
503 : m_pParentNode(NULL),
504 m_pChildNode(NULL),
505 m_pPrevNode(NULL),
506 m_pNextNode(NULL),
507 m_Data() {}
508 enum TreeNode {
509 Root = 0,
510 Parent,
511 FirstSibling,
512 PreviousSibling,
513 NextSibling,
514 LastSibling,
515 FirstNeighbor,
516 PreviousNeighbor,
517 NextNeighbor,
518 LastNeighbor,
519 FirstChild,
520 LastChild
521 };
522 CPLTreeNode* GetNode(TreeNode eNode) const {
523 switch (eNode) {
524 case Root: {
525 CPLTreeNode* pParent = (CPLTreeNode*)this;
526 CPLTreeNode* pTemp;
527 while ((pTemp = pParent->m_pParentNode) != NULL) {
528 pParent = pTemp;
529 }
530 return pParent;
531 }
532 case Parent:
533 return m_pParentNode;
534 case FirstSibling: {
535 CPLTreeNode* pNode = (CPLTreeNode*)this;
536 CPLTreeNode* pTemp;
537 while ((pTemp = pNode->m_pPrevNode) != NULL) {
538 pNode = pTemp;
539 }
540 return pNode == (CPLTreeNode*)this ? NULL : pNode;
541 }
542 case PreviousSibling:
543 return m_pPrevNode;
544 case NextSibling:
545 return m_pNextNode;
546 case LastSibling: {
547 CPLTreeNode* pNode = (CPLTreeNode*)this;
548 CPLTreeNode* pTemp;
549 while ((pTemp = pNode->m_pNextNode) != NULL) {
550 pNode = pTemp;
551 }
552 return pNode == (CPLTreeNode*)this ? NULL : pNode;
553 }
554 case FirstNeighbor: {
555 CPLTreeNode* pParent = (CPLTreeNode*)this;
556 CPLTreeNode* pTemp;
557 while ((pTemp = pParent->m_pParentNode) != NULL) {
558 pParent = pTemp;
559 }
560 return pParent == (CPLTreeNode*)this ? NULL : pParent;
561 }
562 case PreviousNeighbor: {
563 if (m_pPrevNode == NULL) {
564 return m_pParentNode;
565 }
566 CPLTreeNode* pNode = m_pPrevNode;
567 CPLTreeNode* pTemp;
568 while ((pTemp = pNode->m_pChildNode) != NULL) {
569 pNode = pTemp;
570 while ((pTemp = pNode->m_pNextNode) != NULL) {
571 pNode = pTemp;
572 }
573 }
574 return pNode;
575 }
576 case NextNeighbor: {
577 if (m_pChildNode != NULL) {
578 return m_pChildNode;
579 }
580 if (m_pNextNode != NULL) {
581 return m_pNextNode;
582 }
583 CPLTreeNode* pNode = m_pParentNode;
584 while (pNode != NULL) {
585 if (pNode->m_pNextNode != NULL) {
586 return pNode->m_pNextNode;
587 }
588 pNode = pNode->m_pParentNode;
589 }
590 return NULL;
591 }
592 case LastNeighbor: {
593 CPLTreeNode* pNode = (CPLTreeNode*)this;
594 CPLTreeNode* pTemp;
595 while ((pTemp = pNode->m_pParentNode) != NULL) {
596 pNode = pTemp;
597 }
598 while (TRUE) {
599 CPLTreeNode* pTemp;
600 while ((pTemp = pNode->m_pNextNode) != NULL) {
601 pNode = pTemp;
602 }
603 if (pNode->m_pChildNode == NULL) {
604 break;
605 }
606 pNode = pNode->m_pChildNode;
607 }
608 return pNode == (CPLTreeNode*)this ? NULL : pNode;
609 }
610 case FirstChild:
611 return m_pChildNode;
612 case LastChild: {
613 if (m_pChildNode == NULL) {
614 return NULL;
615 }
616 CPLTreeNode* pChild = m_pChildNode;
617 CPLTreeNode* pTemp;
618 while ((pTemp = pChild->m_pNextNode) != NULL) {
619 pChild = pTemp;
620 }
621 return pChild;
622 }
623 default:
624 break;
625 }
626 return NULL;
627 }
628 void SetParentNode(CPLTreeNode* pNode) { m_pParentNode = pNode; }
629 int32_t CountChildNodes() const {
630 int32_t iCount = 0;
631 CPLTreeNode* pNode = m_pChildNode;
632 while (pNode) {
633 iCount++;
634 pNode = pNode->m_pNextNode;
635 }
636 return iCount;
637 }
638 CPLTreeNode* GetChildNode(int32_t iIndex) const {
639 int32_t iCount = 0;
640 CPLTreeNode* pNode = m_pChildNode;
641 while (pNode) {
642 if (iIndex == iCount) {
643 return pNode;
644 }
645 iCount++;
646 pNode = pNode->m_pNextNode;
647 }
648 return NULL;
649 }
650 int32_t GetNodeIndex() const {
651 int32_t index = 0;
652 CPLTreeNode* pNode = m_pPrevNode;
653 while (pNode != NULL) {
654 index++;
655 pNode = pNode->m_pPrevNode;
656 }
657 return index;
658 }
659 FX_BOOL IsParentNode(const CPLTreeNode* pNode) const {
660 CPLTreeNode* pParent = m_pParentNode;
661 while (pParent != NULL) {
662 if (pParent == pNode) {
663 return TRUE;
664 }
665 pParent = pParent->GetTreeNode(Parent);
666 }
667 return FALSE;
668 }
669 FX_BOOL IsChildNode(const CPLTreeNode* pNode) const {
670 if (pNode == NULL) {
671 return FALSE;
672 }
673 return pNode->IsParentNode((const CPLTreeNode*)this);
674 }
675 void SetChildNode(CPLTreeNode* pNode) { m_pChildNode = pNode; }
676 void SetPrevNode(CPLTreeNode* pNode) { m_pPrevNode = pNode; }
677 void SetNextNode(CPLTreeNode* pNode) { m_pNextNode = pNode; }
678 int32_t GetNodeLevel() const {
679 int32_t iLevel = 0;
680 CPLTreeNode* pNode = (CPLTreeNode*)this;
681 while ((pNode = pNode->m_pParentNode) != NULL) {
682 iLevel++;
683 }
684 return iLevel;
685 }
686 bool IsRootNode() const { return !m_pParentNode; }
687 baseType GetData() const { return m_Data; }
688 void SetData(baseType data) { m_Data = data; }
689
690 protected:
691 CPLTreeNode* m_pParentNode;
692 CPLTreeNode* m_pChildNode;
693 CPLTreeNode* m_pPrevNode;
694 CPLTreeNode* m_pNextNode;
695 baseType m_Data;
696 friend class CFX_CPLTree<baseType>;
697 };
698
699 template <class baseType>
700 class CFX_CPLTree {
701 public:
702 typedef CFX_CPLTreeNode<baseType> CPLTreeNode;
703 CFX_CPLTree() : m_Root() {}
704 ~CFX_CPLTree() {
705 CPLTreeNode* pNode = m_Root.GetNode(CPLTreeNode::LastNeighbor);
706 while (pNode != NULL) {
707 if (pNode->IsRootNode()) {
708 break;
709 }
710 CPLTreeNode* pTemp = pNode->GetNode(CPLTreeNode::PreviousNeighbor);
711 delete pNode;
712 pNode = pTemp;
713 }
714 }
715 CPLTreeNode* GetRoot() { return &m_Root; }
716 CPLTreeNode* AddChild(baseType data, CPLTreeNode* pParent = NULL) {
717 if (pParent == NULL) {
718 pParent = &m_Root;
719 }
720 CPLTreeNode* pChild = new CPLTreeNode;
721 pChild->SetParentNode(pParent);
722 pChild->SetData(data);
723 if (pParent->m_pChildNode == NULL) {
724 pParent->m_pChildNode = pChild;
725 } else {
726 CPLTreeNode* pLast = pParent->GetNode(CPLTreeNode::LastChild);
727 pChild->SetPrevNode(pLast);
728 pLast->SetNextNode(pChild);
729 }
730 return pChild;
731 }
732
733 protected:
734 CPLTreeNode m_Root;
735 };
736
737 #endif // XFA_SRC_FGAS_CRT_FGAS_UTILS_H_
OLDNEW
« no previous file with comments | « xfa/src/fgas/crt/fgas_system.cpp ('k') | xfa/src/fgas/crt/fgas_utils.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698