2 * Copyright (C) 2003-2006 Gabest
3 * http://www.gabest.org
5 * This Program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2, or (at your option)
10 * This Program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with GNU Make; see the file COPYING. If not, write to
17 * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
18 * http://www.gnu.org/copyleft/gpl.html
26 // simple array class for simple types without constructors,
27 // and it doesn't free its reserves on SetCount(0)
38 Array() {m_pData
= NULL
; m_nSize
= m_nMaxSize
= 0; m_nGrowBy
= 4096;}
39 virtual ~Array() {if(m_pData
) _aligned_free(m_pData
);}
41 void SetCount(size_t nSize
, size_t nGrowBy
= 0)
48 if(nSize
> m_nMaxSize
)
50 m_nMaxSize
= nSize
+ max(m_nGrowBy
, m_nSize
);
51 size_t nBytes
= m_nMaxSize
* sizeof(T
);
52 m_pData
= m_pData
? (T
*)_aligned_realloc(m_pData
, nBytes
, 16) : (T
*)_aligned_malloc(nBytes
, 16);
58 size_t GetCount() const {return m_nSize
;}
60 void RemoveAll() {m_nSize
= 0;}
61 bool IsEmpty() const {return m_nSize
== 0;}
63 T
* GetData() {return m_pData
;}
67 size_t nPos
= m_nSize
;
72 void Append(const Array
& a
, size_t nGrowBy
= 0)
74 Append(a
.m_pData
, a
.m_nSize
, nGrowBy
);
77 void Append(const T
* ptr
, size_t nSize
, size_t nGrowBy
= 0)
80 size_t nOldSize
= m_nSize
;
81 SetCount(nOldSize
+ nSize
);
82 memcpy(m_pData
+ nOldSize
, ptr
, nSize
* sizeof(T
));
85 const T
& operator [] (size_t i
) const {return m_pData
[i
];}
86 T
& operator [] (size_t i
) {return m_pData
[i
];}
88 void Copy(const Array
& v
)
90 SetCount(v
.GetCount());
91 memcpy(m_pData
, v
.m_pData
, m_nSize
* sizeof(T
));
102 T
* pData
= m_pData
; m_pData
= v
.m_pData
; v
.m_pData
= pData
;
103 size_t nSize
= m_nSize
; m_nSize
= v
.m_nSize
; v
.m_nSize
= nSize
;
104 size_t nMaxSize
= m_nMaxSize
; m_nMaxSize
= v
.m_nMaxSize
; v
.m_nMaxSize
= nMaxSize
;
105 size_t nGrowBy
= m_nGrowBy
; m_nGrowBy
= v
.m_nGrowBy
; v
.m_nGrowBy
= nGrowBy
;