Advertisement
pushrbx

Untitled

Jan 17th, 2014
133
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.54 KB | None | 0 0
  1. #ifndef __DYNAMICAR_H__
  2. #define __DYNAMICAR_H__
  3. #include "stdafx.h"
  4. #include "SdiObject.h"
  5. #include "TypeInfo.h"
  6. #include "MemAlloc.h"
  7.  
  8. namespace SDICW
  9. {
  10.     // Base Dynamic array
  11.     class CDynamicAr : CSdiObject
  12.     {
  13.     public:
  14.         // constructors
  15.         CDynamicAr(void);
  16.         virtual ~CDynamicAr(void);
  17.  
  18.         // methods
  19.         sdVoid *GetData();
  20.         const sdVoid *GetData() const;
  21.  
  22.         sdBool IsValidIndex(sdInt i) const;
  23.         sdInt Count() const;
  24.  
  25.         sdVoid Insert(sdInt index, sdInt count, sdInt elementSize);
  26.         sdVoid InsertZeroed(sdInt index, sdInt count, sdInt elementSize);
  27.  
  28.         sdInt Add(sdInt count, sdInt elementSize);
  29.         sdInt AddZeroed(sdInt elementSize, sdInt count = 1);
  30.  
  31.         sdBool Shrink(sdInt elementSize);
  32.  
  33.         sdVoid Empty(sdInt elementSize, sdInt slack = 0);
  34.  
  35.         sdVoid Swap(sdInt elemA, sdInt elemB, sdInt elementSize);
  36.  
  37.         sdBool Remove(sdInt index, sdInt count, sdInt elementSize);
  38.     protected:
  39.         // reallocates the memory space on m_data
  40.         sdVoid ReAllocate(sdInt elementSize);
  41.         CDynamicAr(sdInt inNum, sdInt elementSize);
  42.  
  43.         // vars
  44.         sdVoid *m_data; // memory space where we store the elements
  45.         sdInt m_arrayNum; // number of elements in array
  46.         sdInt m_arrayMax; // array capacity
  47.     };
  48.  
  49.     typedef CDynamicAr ParentClass;
  50.  
  51.     // Dynamic array with template
  52.     template<class _T> class TDynamicAr : public CDynamicAr
  53.     {
  54.     public:
  55.         typedef _T ElementType;
  56.  
  57.         TDynamicAr() : ParentClass()
  58.         {
  59.         }
  60.  
  61.         TDynamicAr(sdInt num) : ParentClass(num, sizeof(ElementType)), m_iterator(NULL)
  62.         {
  63.         }
  64.  
  65.         TDynamicAr(const TDynamicAr &another)
  66.             : ParentClass(another.m_arrayNum, sizeof(ElementType)), m_iterator(NULL)
  67.         {
  68.             // if its class type
  69.             if(TTypeInfo<ElementType>::IsDestructorNeeded())
  70.             {
  71.                 m_arrayNum = 0;
  72.                 for(int i = 0; i < another.Count(); i++)
  73.                 {
  74.                     new(*this)ElementType(another[i]);
  75.                 }
  76.             }
  77.             else if(sizeof(ElementType) != 1) // if its not class type
  78.             {
  79.                 for(int i = 0; i < m_arrayNum; i++)
  80.                 {
  81.                     (*this)[i] = another[i];
  82.                 }
  83.             }
  84.             else // in another case copy the whole thing, we don't care
  85.             {
  86.                 memcpy(&(*this)[0], &another[0], m_arrayNum * sizeof(ElementType));
  87.             }
  88.         }
  89.  
  90.         ~TDynamicAr()
  91.         {
  92.             Remove(0, m_arrayNum);
  93.         }
  94.  
  95.         // operator overloads
  96.  
  97.         ElementType& operator[](sdInt i)
  98.         {
  99.             return ((ElementType *)m_data)[i];
  100.         }
  101.  
  102.         const ElementType& operator[](sdInt i) const
  103.         {
  104.             return ((ElementType *)m_data)[i];
  105.         }
  106.  
  107.         // concatenate with another dynamic array. e.g  arrayVar1 + arrayVar2
  108.         TDynamicAr& operator+(const TDynamicAr& another)
  109.         {
  110.             if(this != &another)
  111.             {
  112.                 for(sdInt i = 0; i < another.Count(); i++)
  113.                 {
  114.                     new(*this)ElementType(another[i]);
  115.                 }
  116.             }
  117.  
  118.             return *this;
  119.         }
  120.  
  121.         TDynamicAr& operator+=(const TDynamicAr& another)
  122.         {
  123.             if(this != &another)
  124.             {
  125.                 *this = *this + another;
  126.             }
  127.  
  128.             return *this;
  129.         }
  130.  
  131.         TDynamicAr& operator=(const TDynamicAr& another)
  132.         {
  133.             if(this != &another)
  134.             {
  135.                 Empty(another.Count());
  136.  
  137.                 for(sdInt i = 0; i < another.Count(); i++)
  138.                 {
  139.                     new(*this)ElementType(another[i]);
  140.                 }
  141.             }
  142.  
  143.             return *this;
  144.         }
  145.  
  146.         // methods
  147.  
  148.         sdInt AddItem(const ElementType& element)
  149.         {
  150.             new(*this) ElementType(element);
  151.             return Count() - 1; // return the index of the element
  152.         }
  153.  
  154.         sdInt AddZeroed(sdInt count = 1)
  155.         {
  156.             return ParentClass::AddZeroed(sizeof(ElementType), count);
  157.         }
  158.  
  159.         sdInt Add(sdInt count = 1)
  160.         {
  161.             return ParentClass::Add(count, sizeof(ElementType));
  162.         }
  163.  
  164.         sdInt AddUnique(const ElementType& element)
  165.         {
  166.             for(int i = 0; i < m_arrayNum; i++)
  167.             {
  168.                 // if its already in the array, return its index
  169.                 if((*this)[i] == element)
  170.                 {
  171.                     return i;
  172.                 }
  173.             }
  174.  
  175.             return AddItem(element);
  176.         }
  177.  
  178.         sdVoid InsertItem(const ElementType& element, sdInt index)
  179.         {
  180.             sdInt idx = Insert(index);
  181.             (*this)[idx] = element; // todo: debug this
  182.         }
  183.  
  184.         sdVoid Insert(sdInt index, sdInt count = 1)
  185.         {
  186.             return ParentClass::Insert(index, count, sizeof(ElementType));
  187.         }
  188.  
  189.         sdVoid InsertZeroed(sdInt index, sdInt count = 1)
  190.         {
  191.             return ParentClass::InsertZeroed(index, count, sizeof(ElementType));
  192.         }
  193.  
  194.         ElementType Pop()
  195.         {
  196.             ElementType result = ((ElementType *)m_data)[m_arrayNum - 1];
  197.             Remove(m_arrayNum - 1);
  198.             return result;
  199.         }
  200.  
  201.         ElementType& Last(sdInt c = 0)
  202.         {
  203.             return ((ElementType *)m_data)[m_arrayNum - count - 1];
  204.         }
  205.  
  206.         const ElementType& Last(sdInt c = 0) const
  207.         {
  208.             return ((ElementType *)m_data)[m_arrayNum - count - 1];
  209.         }
  210.  
  211.         sdVoid Shrink()
  212.         {
  213.             ParentClass::Shrink(sizeof(ElementType));
  214.         }
  215.  
  216.         sdBool FindItem(const ElementType& item, __out sdInt& index) const
  217.         {
  218.             for(index = 0; index < m_arrayNum; index++)
  219.             {
  220.                 if((*this)[index] == item)
  221.                     return TRUE;
  222.             }
  223.  
  224.             return FALSE;
  225.         }
  226.         sdInt FindItemIndex(const ElementType& item) const
  227.         {
  228.             for(sdInt index = 0; index < m_arrayNum; index++)
  229.             {
  230.                 if((*this)[index] == item)
  231.                     return index;
  232.             }
  233.  
  234.             return INDEX_NONE;
  235.         }
  236.  
  237.         sdBool Contains(const ElementType& item) const
  238.         {
  239.             return (FindItemIndex(item) != INDEX_NONE);
  240.         }
  241.  
  242.         sdBool Remove(sdInt index, sdInt count = 1)
  243.         {
  244.             // if its class type, then we need to call its destructor
  245.             if(TTypeInfo<ElementType>::IsDestructorNeeded())
  246.             {
  247.                 for(sdInt i = index; i < index + count; i++ )
  248.                 {
  249.                     (&(*this)[i])->~ElementType();
  250.                 }
  251.             }
  252.  
  253.             return ParentClass::Remove(index, count, sizeof(ElementType));
  254.         }
  255.  
  256.         sdBool Remove(const ElementType& element)
  257.         {
  258.             sdInt idx = FindItemIndex(element);
  259.             return Remove(idx);
  260.         }
  261.  
  262.         sdBool Empty(sdInt slack = 0)
  263.         {
  264.             if(TTypeInfo<ElementType>::IsDestructorNeeded())
  265.             {
  266.                 for(sdInt i = 0; i < m_arrayNum; i++ )
  267.                 {
  268.                     (&(*this)[i])->~ElementType();
  269.                 }
  270.             }
  271.  
  272.             return ParentClass::Empty(sizeof(ElementType), slack);
  273.         }
  274.  
  275.         sdVoid SwapItems(sdInt indexA, sdInt indexB)
  276.         {
  277.             ParentClass::Swap(indexA, indexB, sizeof(ElementType));
  278.         }
  279.  
  280.         class Iterator
  281.         {
  282.         public:
  283.             // constructor
  284.             Iterator(TDynamicAr<ElementType>& inArray)
  285.             {
  286.                 ++*this;
  287.             }
  288.  
  289.             // operator overloads
  290.  
  291.             sdVoid operator++()
  292.             {
  293.                 return m_array[m_index];
  294.             }
  295.  
  296.             ElementType& operator*()
  297.             {
  298.                 return m_array[m_index];
  299.             }
  300.  
  301.             ElementType* operator->()
  302.             {
  303.                 return &m_array[m_index];
  304.             }
  305.  
  306.             operator sdBool() const
  307.             {
  308.                 return m_index < m_array.Count();
  309.             }
  310.  
  311.             sdVoid RemoveCurrent()
  312.             {
  313.                 m_array.Remove(--m_index);
  314.             }
  315.  
  316.             ElementType& GetCurrent() const
  317.             {
  318.                 return m_index;
  319.             }
  320.  
  321.             sdInt GetIndex() const
  322.             {
  323.                 return m_array[m_index];
  324.             }
  325.  
  326.             ElementType& GetNext() const
  327.             {
  328.                 return m_array[m_index < m_array.Count() - 1 ? m_index + 1 : 0];
  329.             }
  330.             ElementType& GetPrev() const
  331.             {
  332.                 return m_array[m_index ? m_index - 1 : m_array.Count() - 1];
  333.             }
  334.         private:
  335.             TDynamicAr<ElementType>& m_array;
  336.             sdInt m_index;
  337.         };
  338.  
  339.         Iterator& GetIterator() const
  340.         {
  341.             if(m_iterator == NULL || !m_iterator)
  342.             {
  343.                 m_iterator = new Iterator(this);
  344.             }
  345.  
  346.             return m_iterator;
  347.         }
  348.     private:
  349.         Iterator *m_iterator;
  350.     };
  351.  
  352.     template<class T> sdVoid* operator new(size_t size, TDynamicAr<T>& ar)
  353.     {
  354.         int index = ar.CDynamicAr::Add(1, sizeof(T));
  355.         return &ar[index];
  356.     }
  357.     template<class T> sdVoid* operator new(size_t size, TDynamicAr<T>& ar, sdInt index)
  358.     {
  359.         ar.CDynamicAr::Insert(index, 1, sizeof(T));
  360.         return &ar[index];
  361.     }
  362.  
  363.     // array exchanger
  364.     template<class T> sdVoid ExchangeArray(TDynamicAr<T>& elemA, TDynamicAr<T>& elemB)
  365.     {
  366.         appMemorySwap(&elemA, &elemB, sizeof(CDynamicAr));
  367.     }
  368. }
  369. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement