|
9 j# A2 k& x% \: p偶在一个老外的文章的基础上写的,应该很有用的说,
/ I) P- j/ V6 w, O1 T1 _以前总是用STL的vector做替代,但是STL的用法实在不是很习惯
1 {, A8 Z( _' I! i
) t `9 F& l/ F0 I& }//------------------------------------------------------------------------- " B5 ?) n7 Y* p3 t7 O1 j
#ifndef TypedListH_0CBFE2E8-E7C5-4D88-9844-1F177F4B00E4 / [* l) |% S7 c" K7 K3 p) P5 X1 i
#define TypedListH_0CBFE2E8-E7C5-4D88-9844-1F177F4B00E4
+ Z4 i( k) B V2 G9 x) a- M//-------------------------------------------------------------------------
/ A- R8 O' I! g% h#include <classes.hpp> 7 j7 a$ ]" J2 F/ h' |
//-------------------------------------------------------------------------
8 ]5 i1 k. Q0 z7 d+ [template <class T>
2 W2 a6 u" {. t9 \class TTypedList : public TList
; y! e, m% |+ ^. P5 `{
4 A- o1 e, S8 I, J. n r5 n/ s+ i typedef TList inherited;
1 ~0 G1 n" Z1 `8 n) hprivate: ( S8 z& q) {) J" E2 e* c
bool FAutoClear; 8 n" ]. {7 I) a+ h2 W
TClass FItemClassType;
- ]- F9 X8 s; A" Q6 Fprotected: 9 M" G. K) ?( A( Z
T* __fastcall Get(int Index) const 2 q$ u. R7 D0 M( d9 f
{ * S3 X( ?, e/ y ?' v
return (T*)inherited::Get(Index); : {4 d- T2 ^$ X6 k
} 4 z2 O" t# a' Q. F* O0 R
void __fastcall Put(int Index, T* Item)
- e' j9 ]9 N/ O" A+ Q/ ]( m. P* H { : k& O7 _2 v' v- ]
inherited: ut(Index, Item);
/ ]' c0 }# [: R8 W/ s$ F h } ; K- D. k' K+ x$ [& D5 e
public: % ~/ B% f4 A$ g( z' G5 l6 l' v% V
__property T* Items[int Index] = {read=Get, write=Put};
. g6 V6 e5 n2 Z8 J# Upublic:
W. ]# z0 Q+ c7 ?5 |$ q; F __fastcall TTypedList(bool bAutoClear = true)
# X& F+ ~9 K! |% G: G* Q; | : TList(), FAutoClear(bAutoClear), FItemClassType(__classid(T)) , B" J) d* m9 R5 g
{ }
* @' E: Q, T1 | // no destructor needed 9 v: ^* V# E& }, @5 [/ S/ V
int __fastcall Add(T* Item)
' B! V, y0 f' H5 n' q3 [ { $ I. `9 l* J, a# ?' m) T9 A
return inherited::Add(Item); $ a$ R& f% K7 w& a* y, M- X2 N7 N
} 2 q5 N, `" D( T0 ]4 r
int __fastcall AddList(const TTypedList& List) 0 s- N' ]( {& V3 {1 `: f, W
{ ) L2 N* m5 r" ~( c8 G
if(this == &List) . Y: k2 ~) O0 R, b( V2 p' ]
{ . A! \8 s5 J" Y$ F9 Z
throw EInvalidPointer("Can't add a TTypedList to himself!");
1 T2 r/ ~' K- O8 j } 3 G. t P; z6 A$ v& S) s
if(FItemClassType != List.FItemClassType) ' @% E* P6 [# h4 L. [" p5 U0 P, _
{ & b" u& V7 [9 ^" B
throw EConvertError("Can't add a TTypedList with a different ItemClass
, V$ z+ `! S/ \0 f$ dType!"); 8 U) |* o" G6 E6 O7 [) ^5 N
}
7 g$ W0 _" `8 o for(int i=0; i<List.Count; i++) " H3 S3 u, h2 w, ^4 s% V) M
{ % W. M: A, A: X+ o' f8 c
Add(List.Get(i)); $ M5 T( t% p t
} $ w! U5 E9 \* N$ U L& r( j# v
return List.Count;
P5 r9 ~ z5 _2 z v* Y } 3 r" |9 {3 L* S% S+ r" N
virtual void __fastcall Clear(void) ' D3 Q8 {/ ?! S) k, R
{ 7 _ q8 ?2 d8 ^1 y
if(FAutoClear)
5 Y7 |" ]' \% ~+ y' ]+ ]+ i: o- q9 L { 9 q0 e3 y$ i% [, k* B9 p( h
for(int i=0; i<Count; i++)
3 W4 f. c! X' R- d! H! I {
# A. W! c; {3 n+ K delete Get(i);
. {9 }2 b3 h5 C' v/ J9 s' ?. P } $ |+ K& U1 y: t- ?+ g- b
} 2 V8 ^; @' o2 i
inherited::Clear();
0 Y a! p6 C1 z }
* L- V' @9 O) u: F7 m void __fastcall Delete(int Index, bool bAutoDelete = true) % A9 D4 Y. M; E/ W7 L
{
) K/ V+ V9 n8 c- I% L if(bAutoDelete) 2 K8 l5 |, s! C# t2 U
{ 5 u5 n2 F9 N7 K1 L2 Q
delete Get(Index);
2 W$ w0 e P( O% q5 ~0 N: e } ' Z+ ]- D) p5 I8 P- P6 x
inherited: elete(Index); 5 D; m* Q- f2 G4 g, Z s
} , H6 F, l* s' \ F3 g
T* __fastcall First(void) const . Z7 U6 _8 U L/ J0 N2 k# p, p
{
; R8 A. G6 t- G; e# Z return (T*)inherited::First(); / y/ z$ H& w1 |9 b
} ) H. _" b* K0 d& f8 B+ D. a
int __fastcall IndexOf(T* Item) const ' ^4 C& L2 I; D) J3 S) y
{ ; `/ ^5 h9 d" O3 G! C+ k1 H( y. ?
return inherited::IndexOf(Item);
, L, O- j9 U7 k! s0 s2 G } 4 B+ W/ }8 A o/ K5 Y6 v
void __fastcall Insert(int Index, T* Item)
4 O8 b& K! D2 n$ g {
! y+ G* h/ U1 k# f3 X* } inherited::Insert(Index, Item);
! o( [6 z. f& y3 w1 j# q4 {3 m }
0 d! |" F; ?3 b$ V- M' M* m% w& X bool __fastcall IsEmpty(void) const
# D; m$ r2 Y* r {
( M" E4 ~/ t- h. {, H. z' p; C return Count == 0; ( [; W0 Z7 e! a* w
} $ U; V, c" S( e" n4 z _+ ?
T* __fastcall Last(void) const
) r7 S* v `& K; b$ D4 h2 P {
8 u1 m7 _$ G5 Y2 V4 U return (T*)inherited: ast(); 9 X0 K. z, m4 s: V
} 9 y0 k" E8 v0 q
int __fastcall Remove(T* Item, bool bAutoDelete = true)
2 x/ f5 z5 v$ c/ k& V7 ? {
3 D# N% d8 J% E& f" H0 H$ w1 [ int nIndex = inherited::Remove(Item);
- y+ m2 E$ u- {. C/ { if(bAutoDelete && (nIndex != -1))
- q) [& V. l0 [! x9 W2 U7 M {
) E" v+ r6 J1 v5 j$ z1 G delete Item; 5 x$ i) t5 J/ L* d( W$ T4 g, D3 W
} * p% z u5 q$ T
return nIndex; + o2 ?1 y/ }/ s* @$ y& N3 P3 \
}
4 V4 }6 J4 C. k5 x* G void operator<<(T* Item) $ e7 P7 a( a3 ?
{ # F7 u6 i' G7 I, r# v1 t- d& y
Add((T *)Item); 7 u; w& c$ B* G2 P5 C
} & a; I' a- D' X6 v8 o& V
void operator<<(const TTypedList& List) 0 m8 l% ? H" a, \
4 _5 k" w8 }6 J- t5 _4 U4 N { ( p8 B/ c% i( r8 }& a5 i d" L. n
AddList(List);
5 P! s& s9 ^" M) R } : k* y0 |+ O+ u& v. B8 n
}; // end of TTypedList / h4 _" K- h" Z8 A
//------------------------------------------------------------------------- ! h* ]7 O2 Z; {$ y1 B9 Q: _
#endif |