//接上面
, H4 e# j3 f, Wtemplate<class TYPE, class ARG_TYPE>
% I" |2 ?- @, N% Z( q; Z, E9 z$ uYCArray<TYPE, ARG_TYPE>::~YCArray()! Z+ }& A0 p' N% e* |
{+ i: R+ {% u u, u7 Q
ASSERT_VALID(this); if (Ym_pData != NULL)1 M: u9 u! ~6 Z# \0 r7 }
{5 D: Y: @4 S& j- _4 W2 v8 b' w
DestructAllElement(0,m_nSize);6 L4 g5 j- f9 n7 F+ u: S- g; [
//DestructElements<TYPE>(Ym_pData, m_nSize);& d6 v' F; W, E4 {6 D* m8 x
delete[] (BYTE*)Ym_pData;
4 r# \" ?* q) \& z }. _9 f/ z5 W e; t
}% Z7 K1 c% D! U3 Q1 S
template<class TYPE, class ARG_TYPE>
2 q$ r7 d, k5 q+ X) v( k) s9 y& ?% OCString YCArray<TYPE, ARG_TYPE>::GetSign()$ l# L( l& S( p- x( ] ^
{
* V" q7 [+ c8 ?- I lock_sign=0;
' D$ A- ~, M! t return Sign;
. h" X6 q; w- \6 W8 n6 o8 g}
z6 n: x# C" o7 f& E dtemplate<class TYPE, class ARG_TYPE>: Y0 i/ G7 {, _ g
int YCArray<TYPE, ARG_TYPE>::SetSign(CString& sign)$ l$ r( p* Q. D; _( {. }7 W5 P
{6 w% E9 M/ e7 d+ A0 U% E5 [7 ^# u
int i=0;% k% U& r$ }$ G; s4 y3 h' q
while(lock_sign&&i<MAXSIGNTIME){8 Y; o( T# h( _' S! O7 B3 `& M
Sleep(1);, N1 ^4 F7 P5 [6 j) J1 F# i
i++;
9 E# O9 d" K; _; y4 ? }
# S, N( z+ }# @* B1 `1 q$ E lock_sign=1;
0 t5 Z; F* x7 v Sign=sign;0 I" l% N. ^4 e' q0 \1 {
return TRUE;$ T1 }9 h+ G; ~: w# {) e0 Q9 e0 p K
}( f3 }8 i: O$ l7 A6 ?" T
//用与把 nindex 后的索引往后推 nCount ,自动调整好buffer+ i8 v" I8 p V+ d0 l- }
template<class TYPE, class ARG_TYPE>
4 x% b( }& Z- a0 z9 P8 _0 i: `* l2 ZBOOL YCArray<TYPE, ARG_TYPE>::SetIndexSize(int nNewSize)
) ^2 g0 C3 _2 T4 b: @. d* M{
; c7 z3 T* u* E) M6 w' w; h5 f if(strIndexNum < nNewSize){! ~$ V3 h2 e' c, m; n' y v1 c
CString* tp = new CString[nNewSize];//新的buffer
4 R% E! l2 }& a, G for(int i=0;i<strIndexNum;i++){//把老索引复制过来
: M! M2 x/ `9 ?6 H3 J7 Z5 f tp = strIndex;
3 s7 l; q4 @$ c. \ }# \: F. O/ v7 K* ~
for(i=strIndexNum;i<nNewSize;i++){3 t! b M5 E6 n, Y; j, h: o
tp = "" ;2 b' }. v8 ?9 p8 r
}
! Z* q2 X; [" T' j9 Q, ` delete[] strIndex ;' s" g1 |: e5 c9 I& k/ T, H
strIndex = tp ;8 I t/ m0 e- q/ L
strIndexNum = nNewSize ;6 p1 c* \% X/ X0 |; t) K, k* i
}else if(strIndexNum < nNewSize){
5 g) }" v* E% W6 ~9 j for(int i=nNewSize;i<strIndexNum;i++){- O0 P8 Q# d- F9 f, U+ h0 f+ t
strIndex = "" ;
( m$ y) u4 i4 L g' m* u }
* ^# U- J3 F) R ]1 O* R }0 o1 S) ]5 b( ~$ w6 m
return TRUE;* R8 ?+ m/ x$ q* o
}
. F4 w0 K/ z7 U$ {& ?8 itemplate<class TYPE, class ARG_TYPE>
/ `5 p/ R. V* R* B$ a( @BOOL YCArray<TYPE, ARG_TYPE>::INSERTIndex(int nIndex,int nCount /*=1*/)" X, }& j- C( J! T+ F+ {7 Y
{
# [( a# g% @( O! t* P CString* tp = new CString[m_nSize+nCount];//新的buffer% t4 i; o" [# P6 M+ A9 d1 U8 a# l
for(int i=0;i<nIndex;i++){//把老索引复制过来
; m; J( B+ U& Q2 Y tp = strIndex;* z+ j) t7 d4 o/ i# d
}int j =0 ;
- ~/ f% X0 R8 c# ^! e+ d, O% G for(i=nIndex+nCount;i<m_nSize;i++){//把老索引复制过来
1 {0 \. j, h$ y$ r tp = strIndex[nIndex+j];
% b1 R$ i" l- N5 I' @, L& l j++;
$ S/ _! Z6 B7 d0 G }/ I( d; }9 f! d' t
delete[] strIndex ;5 S6 n! c8 O6 a1 t1 C0 H, g
strIndex = tp ;
( e, }# p7 l( a# W2 c7 } return TRUE;" J7 z O0 \3 N: f* c
}
: B7 V: Y& {# ?; w, h Itemplate<class TYPE, class ARG_TYPE>& b. _9 ?) [" g0 ]1 v
BOOL YCArray<TYPE, ARG_TYPE>::SETIndex(CString cIndex,int nIndex)
+ i. E% i. h" c8 L{//在 nIndex 后面添加一个 字符串索引
: h7 A' n4 I# ~4 \ strIndex[nIndex] = cIndex ;
9 ^! [3 ]8 I2 {3 |4 f return TRUE;. @4 _. g% u- D4 J* q1 e3 }) C
}+ R4 p1 a2 L: Z. f3 x! G
template<class TYPE, class ARG_TYPE>8 f; [) G" j5 Q K
BOOL YCArray<TYPE, ARG_TYPE>:ELIndex(int nIndex,int nCount /*=1*/)
) a/ Z$ S' B8 b6 E) B) }{//需要在 m_nSize 变化之前调用!!
# k: ^4 u8 y9 P4 M5 Q `/ r ASSERT(nIndex >= 0);; l) q6 u& u; c' e+ u( | x
ASSERT(nCount >= 0);
& X5 G$ f- D$ |; P/ ~ ASSERT(nIndex + nCount <= m_nSize);/ P9 x4 O& H7 E' z& J3 h3 s
int j =0 ;
% X! i1 B7 T9 ]; ~" R for(int i=nIndex+nCount;i<m_nSize;i++){//把老索引复制过来+ H5 t5 a% _+ I7 M( J6 l7 W: W, j
strIndex[nIndex+j] = strIndex;+ @, o; X4 `9 X7 o6 v4 M
j++;- G2 v) l0 X2 b% o$ K" w# @4 ~
}
2 d/ K+ } i" {. ?- F$ o* n return TRUE;9 }0 `- O7 H! ~+ Q/ D
}
% ~6 |' j; B, \! E9 L2 h7 Rtemplate<class TYPE, class ARG_TYPE>
2 F- J2 B0 @+ R+ a. IBOOL YCArray<TYPE, ARG_TYPE>:ELIndex(CString cIndex,int nCount /*=1*/)
4 |/ t% x3 k! P6 p2 ?{
& v B: l- E3 I# I' S/ ^, Z; F int nIndex=this->GetIndex(cIndex);' P: x+ y1 }8 C5 n6 F
return this->DELIndex(nIndex,nCount);
4 }( e) g7 |* m$ F}$ z! J1 ?1 w8 W5 C' u& h G! Y
template<class TYPE, class ARG_TYPE>/ \, o9 V: G5 p1 E6 Z' ?/ Y
int YCArray<TYPE, ARG_TYPE>::GetIndex(CString cIndex)" t8 s; x# f6 G, G( r- L
{//得到 cIndex 的数字索引! o7 y. g) |5 v& ?
int nPos = -1;" Q9 [+ ]0 D" G- X% e5 K4 j
for(int i=0;i<m_nSize;i++){/ E* B; I! V/ o' j
if(strIndex == cIndex){
* ^1 Z! _+ ]& X7 M" |0 F5 K. E nPos = i ;break;
$ V2 E* H3 |& X0 B& \8 e% Y }
8 b' v8 l7 X. T0 O }
# N2 y5 \+ ^0 K- Y& t+ C; E return nPos;
1 c% _- g: ]3 M/ j6 n3 a}
# u2 n6 E9 O, I6 M- btemplate<class TYPE, class ARG_TYPE>
4 z8 K* m! E4 b4 lCString YCArray<TYPE, ARG_TYPE>::GetIndex(int nIndex)( |( t! @- j6 C
{//返回 nIndex 的字符串索引
5 U) k9 B4 ^9 w5 n: u& U+ S return strIndex[nIndex];
: P" D; m; n7 {1 z w: Z( q}
4 F5 i. k% i' p; ~% ~/////////////////////////////////////////////////////////////////////////////
- l* q6 l. U* I8 q7 P// YCArray<TYPE, ARG_TYPE> inline functions template<class TYPE, class ARG_TYPE>
7 W8 }4 ~; C! y. k& x" DAFX_INLINE int YCArray<TYPE, ARG_TYPE>::GetSize() const7 y9 t" \5 O& N# j
{ return m_nSize; }
( ^/ `/ D9 _0 m+ B7 ]template<class TYPE, class ARG_TYPE>! ]4 a! _) Y( c# h4 `
AFX_INLINE int YCArray<TYPE, ARG_TYPE>::GetUpperBound() const
2 j0 i) Z4 M q- ^* T { return m_nSize-1; }
, m. O4 z& v ztemplate<class TYPE, class ARG_TYPE>
: Y' h( }" g$ e" E |AFX_INLINE void YCArray<TYPE, ARG_TYPE>::RemoveAll()- H, i2 n& o1 N
{ SetSize(0, -1); }
6 R2 H. l# m% \) G# `$ ]9 _template<class TYPE, class ARG_TYPE>
9 r0 t7 c6 {2 IAFX_INLINE TYPE YCArray<TYPE, ARG_TYPE>::GetAt(int nIndex) const
( R4 y+ F( g$ I) D8 b5 ` { ASSERT(nIndex >= 0 && nIndex < m_nSize);
! M3 X1 r" B- A6 u% v return *Ym_pData[nIndex]; }
: }8 U0 A: F* I( d0 |2 rtemplate<class TYPE, class ARG_TYPE>
+ g, v, I4 V# q& K+ M9 k' [6 cAFX_INLINE void YCArray<TYPE, ARG_TYPE>::SetAt(int nIndex, ARG_TYPE newElement)/ e9 S- D8 h4 s. z, y! Y
{ ASSERT(nIndex >= 0 && nIndex < m_nSize);1 S. ?+ Y0 ]1 o4 |
*(Ym_pData[nIndex]) = newElement; } template<class TYPE, class ARG_TYPE>! F: h& x, H. k6 z# @' d
AFX_INLINE TYPE& YCArray<TYPE, ARG_TYPE>::ElementAt(int nIndex)
t4 ]( S1 j/ q4 i8 C: o7 I { ASSERT(nIndex >= 0 && nIndex < m_nSize);1 C2 E: O: H0 A, M2 c
return *Ym_pData[nIndex]; } template<class TYPE, class ARG_TYPE>
# V- T2 K* G; l8 j: L6 `1 D6 r1 S* rTYPE YCArray<TYPE, ARG_TYPE>::GetAt(CString cIndex) const
" _, A8 A/ W3 w4 S' t5 E. D$ y+ K* u{
6 j: v& s, w* |/ T int nIndex=GetIndex(cIndex);0 G6 n( U) |$ p- j" [; G4 s0 O5 ?! S
return GetAt(nIndex);. Y4 b9 Z* M4 m, g# P+ c" p! M8 k
}
* d* j( F$ Z& V3 j( z7 V6 C" Gtemplate<class TYPE, class ARG_TYPE>
g0 ?; p5 i0 yvoid YCArray<TYPE, ARG_TYPE>::SetAt(CString cIndex, ARG_TYPE newElement)
7 c$ n: Q2 T' {/ g7 K& j{2 @0 @7 v, X, D, W
int nIndex=GetIndex(cIndex);
# E' H6 o! U+ v return SetAt(nIndex, newElement);
( I0 G6 s r; b2 G6 B9 U5 _" J}9 ?& @2 V) h9 ]4 H4 c4 C
template<class TYPE, class ARG_TYPE>% [& j8 q; V* O' H
TYPE& YCArray<TYPE, ARG_TYPE>::ElementAt(CString cIndex)
, {% ]) N' u, @0 l& A/ @{
* z/ |" G7 k* }5 W int nIndex=GetIndex(cIndex);. A8 ?2 ~+ v+ M- [, x+ r" J7 S9 }
return ElementAt(nIndex);
/ w1 f9 i& i* V- J9 E}' h6 A% l# F0 S, V4 i1 [ V5 f
template<class TYPE, class ARG_TYPE>
7 d; A( o4 ?4 x4 cAFX_INLINE const TYPE** YCArray<TYPE, ARG_TYPE>::GetData() const l/ K3 v, M8 t. R5 R
{ return (const TYPE**)Ym_pData; }
9 X" u K j4 A" y5 F0 z3 dtemplate<class TYPE, class ARG_TYPE>
1 y, E( U. a3 p% `, ^" O" D0 v) j% EAFX_INLINE TYPE** YCArray<TYPE, ARG_TYPE>::GetData()
, A8 ^7 B* ~6 y% x { return (TYPE**)Ym_pData; }* K1 h4 A7 P8 f) m, c
template<class TYPE, class ARG_TYPE>+ q, u5 H- }0 u7 M: [
AFX_INLINE int YCArray<TYPE, ARG_TYPE>::Add(ARG_TYPE newElement,CString cIndex /* ="" */); G8 e7 T: E. Q
{ int nIndex = m_nSize;
8 g( Z' w" O2 H4 Q6 \ SetAtGrow(nIndex, newElement);
& h4 y) C8 |+ J$ i; b SETIndex(cIndex,nIndex);
, }# t# K$ w* \5 j return nIndex; }& H$ C5 S* n6 o1 E; r
template<class TYPE, class ARG_TYPE>
7 Y2 C+ p- r1 W5 v( QAFX_INLINE TYPE YCArray<TYPE, ARG_TYPE>:perator[](int nIndex) const* Q7 j2 R8 ~: |, G
{ return GetAt(nIndex); } E- u2 w5 j9 @2 v5 V5 F
template<class TYPE, class ARG_TYPE>
+ O6 X$ R( \# I2 wAFX_INLINE TYPE& YCArray<TYPE, ARG_TYPE>:perator[](int nIndex)8 n) [) n/ J# D! F) X
{ return ElementAt(nIndex); }
3 @$ g: S8 y7 @: Dtemplate<class TYPE, class ARG_TYPE>
5 |# n/ v- ]9 t! C6 P+ B2 ZAFX_INLINE TYPE YCArray<TYPE, ARG_TYPE>:perator[](CString cIndex) const1 Z/ N0 m% _2 u. @
{6 k' `& z8 e# e
int nIndex=GetIndex(cIndex); return operator[](nIndex);
+ t9 ?# }, g& N1 s6 f$ g1 d}& ]* ^) M3 d, g3 I( y
template<class TYPE, class ARG_TYPE>
1 P4 ~! Q; x; b' {AFX_INLINE TYPE& YCArray<TYPE, ARG_TYPE>:perator[](CString cIndex)1 g/ Z* v& t* S& c, R5 U
{# O/ g' |& s# n1 G
int nIndex=GetIndex(cIndex);% |* v& ^( Y. _( H
return operator[](nIndex);
$ x; j l8 @3 ~% z}
# f1 ^# F" P7 D, I- o/ k4 c/*
- a. q; S, k6 v8 H: \template<class TYPE, class ARG_TYPE>8 L4 R2 z' x/ t" K2 i8 F
AFX_INLINE YCArray<TYPE,ARG_TYPE> YCArray<TYPE, ARG_TYPE>:perator=(YCArray<TYPE,ARG_TYPE>& tparr) const
. ?! g9 |: d$ z. l) y7 V{
) |0 u `; ]% E! _% q, N int i,j;1 {' G; S' U/ o8 |: y
for(i=0;i<tparr.GetSize();i++){
( z! z, ~& |8 c1 o0 g j = GetIndex(tparr.GetIndex(i));, A0 r4 [7 N. \0 d4 |& F) o- V
if(j>-1){" u. y5 [6 x4 m# I9 i H, G
operator[](tparr.GetIndex(i)) = tparr;
( t. M$ a* n1 Q& \! g }else{
- j8 C! x4 C& J3 |3 w' Z1 q! w3 N Add(tparr,tparr.GetIndex(i));
7 T! {0 L% h1 ]& g4 \* s }2 ^, Z! Y- K2 U$ `8 C9 S
}
: s: Y- [3 V4 b7 J& h2 } A return this;& k0 q( b/ S# Q
}3 S- a, f% M& D! y* |1 h3 ]
*/) D5 w; E: F. S: o
template<class TYPE, class ARG_TYPE>
! Z1 t/ W# L V( R9 rAFX_INLINE YCArray<TYPE,ARG_TYPE>& YCArray<TYPE, ARG_TYPE>:perator=(YCArray<TYPE,ARG_TYPE>& src)
3 p3 `( v2 z3 m" e! }/ W{3 `8 w' l9 V6 M$ U% v
ASSERT_VALID(this);
! c6 T3 \1 O! R9 s ASSERT(this != &src); // cannot append to itself SetSize(src.m_nSize);
6 Q" x( E& I& ?( j2 }/ K9 T( L for(int i=0;i<m_nSize;i++){8 ` w4 t7 t, I: F/ {0 J( x1 @/ s$ B
/*将此句修改为内存拷贝*///
6 n' d9 ~2 x1 \ *Ym_pData = *src.Ym_pData ; P' D0 y& k1 Y* s+ w
//memcpy(Ym_pData,src.Ym_pData,sizeof(TYPE));( F; |( I* s$ X e; ]3 ~7 W( d
SETIndex(src.GetIndex(i),i);
) d+ A9 E o) k& a! }7 Y }
( i: M8 \. Q& D) w. h3 _* b7 m return *this;0 u- I" t9 u3 S# p
}
2 R% [9 f$ p* y' D4 A+ s/////////////////////////////////////////////////////////////////////////////' g# Z$ N9 a, w( a: l U
// YCArray<TYPE, ARG_TYPE> out-of-line functions template<class TYPE, class ARG_TYPE>! Y' T7 x/ X6 z5 _" I* H& [- k& ?
YCArray<TYPE, ARG_TYPE>::YCArray()6 [3 ?8 }# B& D6 I/ j
{
, W1 ]# s5 L+ Y! K Ym_pData = NULL;
; ]7 N* }2 G/ k( A strIndexNum = m_nSize = m_nMaxSize = m_nGrowBy = 0;
) E: w4 a/ [2 z+ z strIndex=NULL;MAXSIGNTIME=10;
. Q9 `# _8 n/ O; X" _' q- E}+ D1 Q ?- h8 ?4 P. E. _/ u
template<class TYPE, class ARG_TYPE>
7 ?" K6 G+ f1 w; I" h* x+ AYCArray<TYPE, ARG_TYPE>::YCArray(YCArray<TYPE, ARG_TYPE>& tp)3 u' \8 m5 U* W7 `, }% x1 n
{
8 B8 J+ b' }1 V& F6 D8 f$ Z9 ] Ym_pData = NULL;
; L+ E5 d) D. F5 {% Q0 f% T, B strIndexNum = m_nSize = m_nMaxSize = m_nGrowBy = 0;, u3 `9 o8 N7 U
strIndex=NULL;MAXSIGNTIME=10;
" @4 A2 S; a. ?+ Z! L6 Z: a7 F operator=(tp);- g$ `0 `1 {7 w' a6 t9 I
} template<class TYPE, class ARG_TYPE>
- z, T' W y) Y0 y, [void YCArray<TYPE, ARG_TYPE>::SetSize(int nNewSize, int nGrowBy)/ k7 l$ x, K7 \! C1 v0 l3 e
{6 @( _% R2 T5 L( @1 f4 ` M; a
ASSERT_VALID(this);
' l% Q& X: ]* L/ [% O* [9 M9 c ASSERT(nNewSize >= 0); if (nGrowBy != -1)
% f* n; r2 n3 V; \5 |; i4 T3 I m_nGrowBy = nGrowBy; // set new size if (nNewSize == 0){1 S9 q+ K! K& w! q4 I- h* K' g0 w& \
// shrink to nothing
/ M4 I4 \# C! o# T if (Ym_pData != NULL){+ y/ c; Y. ?* e& I
DestructAllElement(0,m_nSize);+ } x( w0 F" ]5 y( m
//DestructElements<TYPE>(Ym_pData, m_nSize);$ z0 \% T# Y( A& e
delete[] (BYTE*)Ym_pData;
5 f% x; P! ~" g( o5 H Ym_pData = NULL;+ `1 r# H! e: T
}1 J! n- w2 D. O7 t# W: n3 f2 C
m_nSize = m_nMaxSize = 0;
4 Z4 ]: x& N5 h/ Z1 e! z } else if (Ym_pData == NULL){. d5 F( l- s9 N8 s7 h
// create one with exact size! ]( d: g6 v3 A$ ]
#ifdef SIZE_T_MAX
; S9 k9 c+ _- G0 V8 }" o ASSERT(nNewSize <= SIZE_T_MAX/sizeof(TYPE*)); // no overflow; S8 ^; \. g# l: W
#endif7 z! {3 J( Z+ F& U/ t% w0 x
Ym_pData = (TYPE**) new BYTE[nNewSize * sizeof(TYPE*)];* X- H( N9 J" d- f1 u' U, F
ConstructAllElements(0,nNewSize);//ConstructElements<TYPE>(Ym_pData, nNewSize);
7 m; t0 `2 i0 a1 z m_nSize = m_nMaxSize = nNewSize;1 z3 {; F. S* V5 _, e, r
} else if (nNewSize <= m_nMaxSize){/ @8 ?$ I2 P- H7 ]( U
// it fits2 @" L0 D- F$ c. A8 V2 [! {. w& O' |
if (nNewSize > m_nSize), |/ Q" f# B$ Y2 R2 S3 `
{
+ o7 K2 v" b ^/ h // initialize the new elements
! U: ?8 k: h: ?4 c) Q' _6 w- W ConstructAllElements(m_nSize,nNewSize-m_nSize);//ConstructElements<TYPE>(&Ym_pData[m_nSize], nNewSize-m_nSize);
5 B* o* ^* O" r0 x0 d }9 G+ }! r% N. O& V: J d
else if (m_nSize > nNewSize)
9 P" a* C g( {; U- M8 h {! f5 c! i/ a, u- X3 t1 C
// destroy the old elements
# Q9 Y2 P1 |8 c1 l DestructAllElement(nNewSize,m_nSize-nNewSize);
' u) z) X+ h% Y* d //DestructElements<TYPE>(&Ym_pData[nNewSize], m_nSize-nNewSize);( A7 S: e8 g6 \) D" x4 u+ ~# D
}
5 k) e/ c6 y1 n. R2 s m_nSize = nNewSize;
& d5 o3 h- U* V) ~* o }
5 e( Q% S6 d9 z0 D! y7 \ else$ w, y# d( e9 Q
{
* ^, P4 g7 o# g // otherwise, grow array/ q8 ~# d5 A5 }5 D ]; O% B
int nGrowBy = m_nGrowBy;
( M- _8 U8 Z0 C: r/ H( j if (nGrowBy == 0). C0 X. I1 t" y$ k( E( S4 o
{
1 O% f+ n2 v6 g // heuristically determine growth when nGrowBy == 0
7 n9 ^! E% G) }. \) u2 Q // (this avoids heap fragmentation in many situations)
! w' I0 N2 [/ v+ n% N( P nGrowBy = m_nSize / 8;
9 z8 Z5 Y0 K0 E6 I9 ` u5 O( P$ a nGrowBy = (nGrowBy < 4) ? 4 : ((nGrowBy > 1024) ? 1024 : nGrowBy);
" X m1 M: ~- W. B }( x2 U6 m9 }) _
int nNewMax;2 s7 \0 X" |# H) q0 w M7 g
if (nNewSize < m_nMaxSize + nGrowBy)0 v5 [( [& G6 J& _3 n
nNewMax = m_nMaxSize + nGrowBy; // granularity" G) o. |& |# n! b6 R: ?
else0 s- o# R7 `8 M, g
nNewMax = nNewSize; // no slush ASSERT(nNewMax >= m_nMaxSize); // no wrap around
& d/ N7 F* s& G* j- ]9 z#ifdef SIZE_T_MAX
- q q4 w- [" k* R& u1 a5 ]2 @ ASSERT(nNewMax <= SIZE_T_MAX/sizeof(TYPE)); // no overflow
: v! Y% z1 ^3 O1 @% H#endif" m U/ m) ]3 R2 D
TYPE** pNewData = (TYPE**) new BYTE[nNewMax * sizeof(TYPE*)];//TYPE* pNewData = (TYPE*) new BYTE[nNewMax * sizeof(TYPE)]; // copy new data from old) r9 g9 m1 Z% z, O5 P# k! G
memcpy(pNewData, Ym_pData, m_nSize * sizeof(TYPE*)); // construct remaining elements
6 ]+ G( }5 F9 X; J ASSERT(nNewSize > m_nSize); //throw("/*wait for me --- yzhlinux*/");
9 R" }3 q) [0 d' h delete[] (BYTE*)Ym_pData;5 R# T7 q/ z2 z0 p7 _) l
Ym_pData = pNewData;, J0 g; Y x; V' R8 ]/ K+ s
ConstructAllElements(m_nSize,nNewSize-m_nSize);//ConstructElements<TYPE>(&pNewData[m_nSize], nNewSize-m_nSize); // get rid of old stuff (note: no destructors called)
. ?0 L6 Q. K2 X; ]9 ` m_nSize = nNewSize;
. D5 n; d: a& w2 q m_nMaxSize = nNewMax;
) ?6 h8 k1 y! O8 e% P g, @! E }
2 E' \0 M. R5 P8 R7 \, u SetIndexSize(nNewSize);. ?: U7 o9 C* e9 ]
}
7 K, k$ Y/ q( [( @: L" s |