17 #ifndef INC_KY_Kernel_Array_H
18 #define INC_KY_Kernel_Array_H
33 struct ArrayDefaultPolicy
35 ArrayDefaultPolicy() : Capacity(0) {}
36 ArrayDefaultPolicy(
const ArrayDefaultPolicy&) : Capacity(0) {}
38 UPInt GetMinCapacity()
const {
return 0; }
39 UPInt GetGranularity()
const {
return 4; }
40 bool NeverShrinking()
const {
return 0; }
42 UPInt GetCapacity()
const {
return Capacity; }
43 void SetCapacity(UPInt capacity) { Capacity = capacity; }
54 template<
int MinCapacity=0,
int Granularity=4,
bool NeverShrink=false>
55 struct ArrayConstPolicy
57 typedef ArrayConstPolicy<MinCapacity, Granularity, NeverShrink> SelfType;
59 ArrayConstPolicy() : Capacity(0) {}
60 ArrayConstPolicy(
const SelfType&) : Capacity(0) {}
62 UPInt GetMinCapacity()
const {
return MinCapacity; }
63 UPInt GetGranularity()
const {
return Granularity; }
64 bool NeverShrinking()
const {
return NeverShrink; }
66 UPInt GetCapacity()
const {
return Capacity; }
67 void SetCapacity(UPInt capacity) { Capacity = capacity; }
78 template<
class T,
class Allocator,
class SizePolicy>
struct ArrayDataBase
81 typedef Allocator AllocatorType;
82 typedef SizePolicy SizePolicyType;
83 typedef ArrayDataBase<T, Allocator, SizePolicy> SelfType;
86 : Data(0), Size(0), Policy() {}
88 ArrayDataBase(
const SizePolicy& p)
89 : Data(0), Size(0), Policy(p) {}
93 Allocator::DestructArray(Data, Size);
94 Allocator::Free(Data);
97 void StealFrom(SelfType& other)
99 Allocator::DestructArray(Data, Size);
100 Allocator::Free(Data);
104 Policy = other.Policy;
110 UPInt GetCapacity()
const
112 return Policy.GetCapacity();
115 void ClearAndRelease()
117 Allocator::DestructArray(Data, Size);
118 Allocator::Free(Data);
121 Policy.SetCapacity(0);
124 void Reserve(
const void* pheapAddr, UPInt newCapacity)
126 if (Policy.NeverShrinking() && newCapacity < GetCapacity())
129 if (newCapacity < Policy.GetMinCapacity())
130 newCapacity = Policy.GetMinCapacity();
133 if (newCapacity == 0)
137 Allocator::Free(Data);
140 Policy.SetCapacity(0);
144 UPInt gran = Policy.GetGranularity();
145 newCapacity = (newCapacity + gran - 1) / gran * gran;
148 if (Allocator::IsMovable())
153 Data = (T*)Allocator::Realloc(pheapAddr, Data,
sizeof(T) * newCapacity, __FILE__, __LINE__);
157 T* newData = (T*)Allocator::Alloc(pheapAddr,
sizeof(T) * newCapacity, __FILE__, __LINE__);
159 s = (Size < newCapacity) ? Size : newCapacity;
160 for (i = 0; i < s; ++i)
162 Allocator::Construct(&newData[i], Data[i]);
163 Allocator::Destruct(&Data[i]);
165 for (i = s; i < Size; ++i)
167 Allocator::Destruct(&Data[i]);
169 Allocator::Free(Data);
175 Data = (T*)Allocator::Alloc(pheapAddr,
sizeof(T) * newCapacity, __FILE__, __LINE__);
178 Policy.SetCapacity(newCapacity);
186 void ResizeNoConstruct(
const void* pheapAddr, UPInt newSize)
188 UPInt oldSize = Size;
190 if (newSize < oldSize)
192 Allocator::DestructArray(Data + newSize, oldSize - newSize);
193 if (newSize < (Policy.GetCapacity() >> 1))
195 Reserve(pheapAddr, newSize);
198 else if(newSize > Policy.GetCapacity())
200 Reserve(pheapAddr, newSize + (newSize >> 2));
221 template<
class T,
class Allocator,
class SizePolicy>
struct ArrayData :
222 ArrayDataBase<T, Allocator, SizePolicy>
225 typedef Allocator AllocatorType;
226 typedef SizePolicy SizePolicyType;
227 typedef ArrayDataBase<T, Allocator, SizePolicy> BaseType;
228 typedef ArrayData <T, Allocator, SizePolicy> SelfType;
234 : BaseType() { Resize(size); }
236 ArrayData(
const SelfType& a)
237 : BaseType(a.Policy) { Append(a.Data, a.Size); }
239 void Reserve(UPInt newCapacity)
241 BaseType::Reserve(
this, newCapacity);
244 void Resize(UPInt newSize)
246 UPInt oldSize = this->Size;
247 BaseType::ResizeNoConstruct(
this, newSize);
248 if(newSize > oldSize)
249 Allocator::ConstructArray(this->Data + oldSize, newSize - oldSize);
252 void PushBack(
const ValueType& val)
254 BaseType::ResizeNoConstruct(
this, this->Size + 1);
255 Allocator::Construct(this->Data + this->Size - 1, val);
259 void PushBackAlt(
const S& val)
261 BaseType::ResizeNoConstruct(
this, this->Size + 1);
262 Allocator::ConstructAlt(this->Data + this->Size - 1, val);
266 void Append(
const ValueType other[], UPInt count)
270 UPInt oldSize = this->Size;
271 BaseType::ResizeNoConstruct(
this, this->Size + count);
272 Allocator::ConstructArray(this->Data + oldSize, count, other);
285 template<
class T,
class Allocator,
class SizePolicy>
struct ArrayDataDH :
286 ArrayDataBase<T, Allocator, SizePolicy>
289 typedef Allocator AllocatorType;
290 typedef SizePolicy SizePolicyType;
291 typedef ArrayDataBase<T, Allocator, SizePolicy> BaseType;
292 typedef ArrayDataDH <T, Allocator, SizePolicy> SelfType;
294 ArrayDataDH(MemoryHeap* heap)
295 : BaseType(), pHeap(heap) { }
297 ArrayDataDH(MemoryHeap* heap,
int size)
298 : BaseType(), pHeap(heap) { Resize(size); }
300 ArrayDataDH(
const SelfType& a)
301 : BaseType(a.Policy), pHeap(a.pHeap) { Append(a.Data, a.Size); }
303 void Reserve(UPInt newCapacity)
305 BaseType::Reserve(pHeap, newCapacity);
308 void Resize(UPInt newSize)
310 UPInt oldSize = this->Size;
311 BaseType::ResizeNoConstruct(pHeap, newSize);
312 if(newSize > oldSize)
313 Allocator::ConstructArray(this->Data + oldSize, newSize - oldSize);
316 void PushBack(
const ValueType& val)
318 BaseType::ResizeNoConstruct(pHeap, this->Size + 1);
319 Allocator::Construct(this->Data + this->Size - 1, val);
323 void PushBackAlt(
const S& val)
325 BaseType::ResizeNoConstruct(pHeap, this->Size + 1);
326 Allocator::ConstructAlt(this->Data + this->Size - 1, val);
330 void Append(
const ValueType other[], UPInt count)
334 UPInt oldSize = this->Size;
335 BaseType::ResizeNoConstruct(pHeap, this->Size + count);
336 Allocator::ConstructArray(this->Data + oldSize, count, other);
340 const MemoryHeap* pHeap;
351 template<
class T,
class Allocator,
class SizePolicy>
struct ArrayDataCC :
352 ArrayDataBase<T, Allocator, SizePolicy>
355 typedef Allocator AllocatorType;
356 typedef SizePolicy SizePolicyType;
357 typedef ArrayDataBase<T, Allocator, SizePolicy> BaseType;
358 typedef ArrayDataCC <T, Allocator, SizePolicy> SelfType;
360 ArrayDataCC(
const ValueType& defval)
361 : BaseType(), DefaultValue(defval) { }
363 ArrayDataCC(
const ValueType& defval,
int size)
364 : BaseType(), DefaultValue(defval) { Resize(size); }
366 ArrayDataCC(
const SelfType& a)
367 : BaseType(a.Policy), DefaultValue(a.DefaultValue) { Append(a.Data, a.Size); }
369 void Reserve(UPInt newCapacity)
371 BaseType::Reserve(
this, newCapacity);
374 void Resize(UPInt newSize)
376 UPInt oldSize = this->Size;
377 BaseType::ResizeNoConstruct(
this, newSize);
378 if(newSize > oldSize)
379 Allocator::ConstructArray(this->Data + oldSize, newSize - oldSize, DefaultValue);
382 void PushBack(
const ValueType& val)
384 BaseType::ResizeNoConstruct(
this, this->Size + 1);
385 Allocator::Construct(this->Data + this->Size - 1, val);
389 void PushBackAlt(
const S& val)
391 BaseType::ResizeNoConstruct(
this, this->Size + 1);
392 Allocator::ConstructAlt(this->Data + this->Size - 1, val);
396 void Append(
const ValueType other[], UPInt count)
400 UPInt oldSize = this->Size;
401 BaseType::ResizeNoConstruct(
this, this->Size + count);
402 Allocator::ConstructArray(this->Data + oldSize, count, other);
406 ValueType DefaultValue;
431 template<
class ArrayData>
class ArrayBase
434 typedef typename ArrayData::ValueType ValueType;
435 typedef typename ArrayData::AllocatorType AllocatorType;
436 typedef typename ArrayData::SizePolicyType SizePolicyType;
437 typedef ArrayBase<ArrayData> SelfType;
439 KY_MEMORY_REDEFINE_NEW(ArrayBase, AllocatorType::StatId)
445 ArrayBase(
const SelfType& a)
448 ArrayBase(MemoryHeap* heap)
450 ArrayBase(MemoryHeap* heap,
int size)
451 : Data(heap, size) {}
453 ArrayBase(
const ValueType& defval)
455 ArrayBase(
const ValueType& defval,
int size)
456 : Data(defval, size) {}
458 SizePolicyType* GetSizePolicy()
const {
return Data.Policy; }
459 void SetSizePolicy(
const SizePolicyType& p) { Data.Policy = p; }
461 bool NeverShrinking()
const {
return Data.Policy.NeverShrinking(); }
462 UPInt GetSize()
const {
return Data.Size; }
463 bool IsEmpty()
const {
return Data.Size == 0; }
464 UPInt GetCapacity()
const {
return Data.GetCapacity(); }
465 UPInt GetNumBytes()
const {
return Data.GetCapacity() *
sizeof(ValueType); }
467 void ClearAndRelease() { Data.ClearAndRelease(); }
468 void Clear() { Data.Resize(0); }
469 void Resize(UPInt newSize) { Data.Resize(newSize); }
472 void Reserve(UPInt newCapacity)
474 if (newCapacity > Data.GetCapacity())
475 Data.Reserve(newCapacity);
479 ValueType& At(UPInt index)
481 KY_ASSERT(index < Data.Size);
482 return Data.Data[index];
484 const ValueType& At(UPInt index)
const
486 KY_ASSERT(index < Data.Size);
487 return Data.Data[index];
490 ValueType ValueAt(UPInt index)
const
492 KY_ASSERT(index < Data.Size);
493 return Data.Data[index];
497 ValueType& operator [] (UPInt index)
499 KY_ASSERT(index < Data.Size);
500 return Data.Data[index];
502 const ValueType& operator [] (UPInt index)
const
504 KY_ASSERT(index < Data.Size);
505 return Data.Data[index];
509 const ValueType* GetDataPtr()
const {
return Data.Data; }
510 ValueType* GetDataPtr() {
return Data.Data; }
513 void PushBack(
const ValueType& val)
523 void PushBackAlt(
const S& val)
525 Data.PushBackAlt(val);
529 void PopBack(UPInt count = 1)
531 KY_ASSERT(Data.Size >= count);
532 Data.Resize(Data.Size - count);
535 ValueType& PushDefault()
537 Data.PushBack(ValueType());
543 ValueType t = Back();
550 ValueType& Front() {
return At(0); }
551 const ValueType& Front()
const {
return At(0); }
554 ValueType& Back() {
return At(Data.Size - 1); }
555 const ValueType& Back()
const {
return At(Data.Size - 1); }
558 const SelfType& operator = (
const SelfType& a)
561 for (UPInt i = 0; i < Data.Size; i++) {
562 *(Data.Data + i) = a[i];
568 void RemoveMultipleAt(UPInt index, UPInt num)
570 KY_ASSERT(index + num <= Data.Size);
571 if (Data.Size == num)
577 AllocatorType::DestructArray(Data.Data + index, num);
578 AllocatorType::CopyArrayForward(
580 Data.Data + index + num,
581 Data.Size - num - index);
588 void RemoveAt(UPInt index)
590 KY_ASSERT(index < Data.Size);
597 AllocatorType::Destruct(Data.Data + index);
598 AllocatorType::CopyArrayForward(
600 Data.Data + index + 1,
601 Data.Size - 1 - index);
607 void InsertAt(UPInt index,
const ValueType& val = ValueType())
609 KY_ASSERT(index <= Data.Size);
611 Data.Resize(Data.Size + 1);
612 if (index < Data.Size - 1)
614 AllocatorType::CopyArrayBackward(
615 Data.Data + index + 1,
617 Data.Size - 1 - index);
619 AllocatorType::Construct(Data.Data + index, val);
623 void InsertMultipleAt(UPInt index, UPInt num,
const ValueType& val = ValueType())
625 KY_ASSERT(index <= Data.Size);
627 Data.Resize(Data.Size + num);
628 if (index < Data.Size - num)
630 AllocatorType::CopyArrayBackward(
631 Data.Data + index + num,
633 Data.Size - num - index);
635 for (UPInt i = 0; i < num; ++i)
636 AllocatorType::Construct(Data.Data + index + i, val);
640 void Append(
const SelfType& other)
642 Append(other.Data.Data, other.GetSize());
646 void Append(
const ValueType other[], UPInt count)
648 Data.Append(other, count);
657 Iterator() : pArray(0), CurIndex(-1) {}
658 Iterator(SelfType* parr, SPInt idx = 0) : pArray(parr), CurIndex(idx) {}
660 bool operator==(
const Iterator& it)
const {
return pArray == it.pArray && CurIndex == it.CurIndex; }
661 bool operator!=(
const Iterator& it)
const {
return pArray != it.pArray || CurIndex != it.CurIndex; }
663 Iterator& operator++()
667 if (CurIndex < (SPInt)pArray->GetSize())
672 Iterator operator++(
int)
678 Iterator& operator--()
687 Iterator operator--(
int)
693 Iterator operator+(
int delta)
const
695 return Iterator(pArray, CurIndex + delta);
697 Iterator operator-(
int delta)
const
699 return Iterator(pArray, CurIndex - delta);
701 SPInt operator-(
const Iterator& right)
const
703 KY_ASSERT(pArray == right.pArray);
704 return CurIndex - right.CurIndex;
706 ValueType&
operator*()
const { KY_ASSERT(pArray);
return (*pArray)[CurIndex]; }
707 ValueType* operator->()
const { KY_ASSERT(pArray);
return &(*pArray)[CurIndex]; }
708 ValueType* GetPtr()
const { KY_ASSERT(pArray);
return &(*pArray)[CurIndex]; }
710 bool IsFinished()
const {
return !pArray || CurIndex < 0 || CurIndex >= (int)pArray->GetSize(); }
715 pArray->RemoveAt(CurIndex);
718 SPInt GetIndex()
const {
return CurIndex; }
721 Iterator Begin() {
return Iterator(
this); }
722 Iterator End() {
return Iterator(
this, (SPInt)GetSize()); }
723 Iterator Last() {
return Iterator(
this, (SPInt)GetSize() - 1); }
727 const SelfType* pArray;
731 ConstIterator() : pArray(0), CurIndex(-1) {}
732 ConstIterator(
const SelfType* parr, SPInt idx = 0) : pArray(parr), CurIndex(idx) {}
734 bool operator==(
const ConstIterator& it)
const {
return pArray == it.pArray && CurIndex == it.CurIndex; }
735 bool operator!=(
const ConstIterator& it)
const {
return pArray != it.pArray || CurIndex != it.CurIndex; }
737 ConstIterator& operator++()
741 if (CurIndex < (
int)pArray->GetSize())
746 ConstIterator operator++(
int)
748 ConstIterator it(*
this);
752 ConstIterator& operator--()
761 ConstIterator operator--(
int)
763 ConstIterator it(*
this);
767 ConstIterator operator+(
int delta)
const
769 return ConstIterator(pArray, CurIndex + delta);
771 ConstIterator operator-(
int delta)
const
773 return ConstIterator(pArray, CurIndex - delta);
775 SPInt operator-(
const ConstIterator& right)
const
777 KY_ASSERT(pArray == right.pArray);
778 return CurIndex - right.CurIndex;
780 const ValueType&
operator*()
const { KY_ASSERT(pArray);
return (*pArray)[CurIndex]; }
781 const ValueType* operator->()
const { KY_ASSERT(pArray);
return &(*pArray)[CurIndex]; }
782 const ValueType* GetPtr()
const { KY_ASSERT(pArray);
return &(*pArray)[CurIndex]; }
784 bool IsFinished()
const {
return !pArray || CurIndex < 0 || CurIndex >= (int)pArray->GetSize(); }
786 SPInt GetIndex()
const {
return CurIndex; }
788 ConstIterator Begin()
const {
return ConstIterator(
this); }
789 ConstIterator End()
const {
return ConstIterator(
this, (SPInt)GetSize()); }
790 ConstIterator Last()
const {
return ConstIterator(
this, (SPInt)GetSize() - 1); }
804 template<
class T,
int SID=Stat_Default_Mem,
class SizePolicy=ArrayDefaultPolicy>
805 class Array :
public ArrayBase<ArrayData<T, AllocatorGH<T, SID>, SizePolicy> >
809 typedef AllocatorGH<T, SID> AllocatorType;
810 typedef SizePolicy SizePolicyType;
811 typedef Array<T, SID, SizePolicy> SelfType;
812 typedef ArrayBase<ArrayData<T, AllocatorGH<T, SID>, SizePolicy> > BaseType;
814 Array() : BaseType() {}
815 Array(
int size) : BaseType(size) {}
816 Array(
const SizePolicyType& p) : BaseType() { SetSizePolicy(p); }
817 Array(
const SelfType& a) : BaseType(a) {}
818 const SelfType& operator=(
const SelfType& a) { BaseType::operator=(a);
return *
this; }
828 template<
class T,
int SID=Stat_Default_Mem,
class SizePolicy=ArrayDefaultPolicy>
829 class ArrayPOD :
public ArrayBase<ArrayData<T, AllocatorGH_POD<T, SID>, SizePolicy> >
833 typedef AllocatorGH<T, SID> AllocatorType;
834 typedef SizePolicy SizePolicyType;
835 typedef ArrayPOD<T, SID, SizePolicy> SelfType;
836 typedef ArrayBase<ArrayData<T, AllocatorGH_POD<T, SID>, SizePolicy> > BaseType;
838 ArrayPOD() : BaseType() {}
839 ArrayPOD(
int size) : BaseType(size) {}
840 ArrayPOD(
const SizePolicyType& p) : BaseType() { SetSizePolicy(p); }
841 ArrayPOD(
const SelfType& a) : BaseType(a) {}
842 const SelfType& operator=(
const SelfType& a) { BaseType::operator=(a);
return *
this; }
851 template<
class T,
int SID=Stat_Default_Mem,
class SizePolicy=ArrayDefaultPolicy>
852 class ArrayCPP :
public ArrayBase<ArrayData<T, AllocatorGH_CPP<T, SID>, SizePolicy> >
856 typedef AllocatorGH<T, SID> AllocatorType;
857 typedef SizePolicy SizePolicyType;
858 typedef ArrayCPP<T, SID, SizePolicy> SelfType;
859 typedef ArrayBase<ArrayData<T, AllocatorGH_CPP<T, SID>, SizePolicy> > BaseType;
861 ArrayCPP() : BaseType() {}
862 ArrayCPP(
int size) : BaseType(size) {}
863 ArrayCPP(
const SizePolicyType& p) : BaseType() { SetSizePolicy(p); }
864 ArrayCPP(
const SelfType& a) : BaseType(a) {}
865 const SelfType& operator=(
const SelfType& a) { BaseType::operator=(a);
return *
this; }
874 template<
class T,
int SID=Stat_Default_Mem,
class SizePolicy=ArrayDefaultPolicy>
875 class ArrayLH :
public ArrayBase<ArrayData<T, AllocatorLH<T, SID>, SizePolicy> >
879 typedef AllocatorLH<T, SID> AllocatorType;
880 typedef SizePolicy SizePolicyType;
881 typedef ArrayLH<T, SID, SizePolicy> SelfType;
882 typedef ArrayBase<ArrayData<T, AllocatorLH<T, SID>, SizePolicy> > BaseType;
884 ArrayLH() : BaseType() {}
885 ArrayLH(
int size) : BaseType(size) {}
886 ArrayLH(
const SizePolicyType& p) : BaseType() { SetSizePolicy(p); }
887 ArrayLH(
const SelfType& a) : BaseType(a) {}
888 const SelfType& operator=(
const SelfType& a) { BaseType::operator=(a);
return *
this; }
896 template<
class T,
int SID=Stat_Default_Mem,
class SizePolicy=ArrayDefaultPolicy>
897 class ArrayLH_CPP :
public ArrayBase<ArrayData<T, AllocatorLH_CPP<T, SID>, SizePolicy> >
901 typedef AllocatorLH<T, SID> AllocatorType;
902 typedef SizePolicy SizePolicyType;
903 typedef ArrayLH_CPP<T, SID, SizePolicy> SelfType;
904 typedef ArrayBase<ArrayData<T, AllocatorLH_CPP<T, SID>, SizePolicy> > BaseType;
906 ArrayLH_CPP() : BaseType() {}
907 ArrayLH_CPP(
int size) : BaseType(size) {}
908 ArrayLH_CPP(
const SizePolicyType& p) : BaseType() { SetSizePolicy(p); }
909 ArrayLH_CPP(
const SelfType& a) : BaseType(a) {}
910 const SelfType& operator=(
const SelfType& a) { BaseType::operator=(a);
return *
this; }
919 template<
class T,
int SID=Stat_Default_Mem,
class SizePolicy=ArrayDefaultPolicy>
920 class ArrayLH_POD :
public ArrayBase<ArrayData<T, AllocatorLH_POD<T, SID>, SizePolicy> >
924 typedef AllocatorLH<T, SID> AllocatorType;
925 typedef SizePolicy SizePolicyType;
926 typedef ArrayLH_POD<T, SID, SizePolicy> SelfType;
927 typedef ArrayBase<ArrayData<T, AllocatorLH_POD<T, SID>, SizePolicy> > BaseType;
929 ArrayLH_POD() : BaseType() {}
930 ArrayLH_POD(
int size) : BaseType(size) {}
931 ArrayLH_POD(
const SizePolicyType& p) : BaseType() { SetSizePolicy(p); }
932 ArrayLH_POD(
const SelfType& a) : BaseType(a) {}
933 const SelfType& operator=(
const SelfType& a) { BaseType::operator=(a);
return *
this; }
941 template<
class T,
int SID=Stat_Default_Mem,
class SizePolicy=ArrayDefaultPolicy>
942 class ArrayDH :
public ArrayBase<ArrayDataDH<T, AllocatorDH<T, SID>, SizePolicy> >
946 typedef AllocatorDH<T, SID> AllocatorType;
947 typedef SizePolicy SizePolicyType;
948 typedef ArrayDH<T, SID, SizePolicy> SelfType;
949 typedef ArrayBase<ArrayDataDH<T, AllocatorDH<T, SID>, SizePolicy> > BaseType;
951 ArrayDH(MemoryHeap* heap) : BaseType(heap) {}
952 ArrayDH(MemoryHeap* heap,
int size) : BaseType(heap, size) {}
953 ArrayDH(MemoryHeap* heap,
const SizePolicyType& p) : BaseType(heap) { SetSizePolicy(p); }
954 ArrayDH(
const SelfType& a) : BaseType(a) {}
955 const SelfType& operator=(
const SelfType& a) { BaseType::operator=(a);
return *
this; }
964 template<
class T,
int SID=Stat_Default_Mem,
class SizePolicy=ArrayDefaultPolicy>
965 class ArrayDH_CPP :
public ArrayBase<ArrayDataDH<T, AllocatorDH_CPP<T, SID>, SizePolicy> >
969 typedef AllocatorDH_CPP<T, SID> AllocatorType;
970 typedef SizePolicy SizePolicyType;
971 typedef ArrayDH_CPP<T, SID, SizePolicy> SelfType;
972 typedef ArrayBase<ArrayDataDH<T, AllocatorDH_CPP<T, SID>, SizePolicy> > BaseType;
974 ArrayDH_CPP(MemoryHeap* heap) : BaseType(heap) {}
975 ArrayDH_CPP(MemoryHeap* heap,
int size) : BaseType(heap, size) {}
976 ArrayDH_CPP(MemoryHeap* heap,
const SizePolicyType& p) : BaseType(heap) { SetSizePolicy(p); }
977 ArrayDH_CPP(
const SelfType& a) : BaseType(a) {}
978 const SelfType& operator=(
const SelfType& a) { BaseType::operator=(a);
return *
this; }
987 template<
class T,
int SID=Stat_Default_Mem,
class SizePolicy=ArrayDefaultPolicy>
988 class ArrayDH_POD :
public ArrayBase<ArrayDataDH<T, AllocatorDH_POD<T, SID>, SizePolicy> >
992 typedef AllocatorDH<T, SID> AllocatorType;
993 typedef SizePolicy SizePolicyType;
994 typedef ArrayDH_POD<T, SID, SizePolicy> SelfType;
995 typedef ArrayBase<ArrayDataDH<T, AllocatorDH_POD<T, SID>, SizePolicy> > BaseType;
997 ArrayDH_POD(MemoryHeap* heap) : BaseType(heap) {}
998 ArrayDH_POD(MemoryHeap* heap,
int size) : BaseType(heap, size) {}
999 ArrayDH_POD(MemoryHeap* heap,
const SizePolicyType& p) : BaseType(heap) { SetSizePolicy(p); }
1000 ArrayDH_POD(
const SelfType& a) : BaseType(a) {}
1001 const SelfType& operator=(
const SelfType& a) { BaseType::operator=(a);
return *
this; }
1012 template<
class T,
int SID=Stat_Default_Mem,
class SizePolicy=ArrayDefaultPolicy>
1013 class ArrayCC :
public ArrayBase<ArrayDataCC<T, AllocatorLH<T, SID>, SizePolicy> >
1016 typedef T ValueType;
1017 typedef AllocatorLH<T, SID> AllocatorType;
1018 typedef SizePolicy SizePolicyType;
1019 typedef ArrayCC<T, SID, SizePolicy> SelfType;
1020 typedef ArrayBase<ArrayDataCC<T, AllocatorLH<T, SID>, SizePolicy> > BaseType;
1022 ArrayCC(
const ValueType& defval) : BaseType(defval) {}
1023 ArrayCC(
const ValueType& defval,
int size) : BaseType(defval, size) {}
1024 ArrayCC(
const ValueType& defval,
const SizePolicyType& p) : BaseType(defval) { SetSizePolicy(p); }
1025 ArrayCC(
const SelfType& a) : BaseType(a) {}
1026 const SelfType& operator=(
const SelfType& a) { BaseType::operator=(a);
return *
this; }
1032 #if defined(KY_DEFINE_NEW)
1033 #define new KY_DEFINE_NEW
The Autodesk Navigation namespace.
Definition: gamekitcrowddispersion.cpp:17
Vec2f operator*(KyFloat32 s, const Vec2f &v)
scalar * vec operator
Definition: vec2f.h:120