|
8 x4 M' U7 _5 ~- L0 } M5 C2 ~偶在一个老外的文章的基础上写的,应该很有用的说, & O: S: B& |9 Z3 x3 K
以前总是用STL的vector做替代,但是STL的用法实在不是很习惯 ( E& Q$ t( `# z- Q9 h: P! T
6 F' Y5 M5 V! x& b$ I//------------------------------------------------------------------------- 4 \: T6 h# \$ H Q" c. R7 G* V
#ifndef TypedListH_0CBFE2E8-E7C5-4D88-9844-1F177F4B00E4
5 O* A# `) h$ N" x#define TypedListH_0CBFE2E8-E7C5-4D88-9844-1F177F4B00E4 ' T& m- Z7 v- R9 s1 ?/ e" H" m7 U
//------------------------------------------------------------------------- + r; y/ e t( V$ m! p3 b) i2 ]
#include <classes.hpp> % A# V9 ~% d8 ^+ Q
//------------------------------------------------------------------------- + [. q" Q8 ]! q# B; o( G6 h( N
template <class T> # {/ k3 s! }3 D, B+ G- m& r& G& | @
class TTypedList : public TList , e! _: e4 y- v" b! G# Y- V
{
[7 T& T& N, L! V1 U6 P typedef TList inherited; - Z, G6 l) n3 B# L* V: _* G7 [
private:
; ]! P! n/ l* A1 `( ~' I6 v+ o" c2 l bool FAutoClear; ( A9 v! d! b' Z. y
TClass FItemClassType; W) ]. x4 p9 \5 ~% l) ~
protected:
, D+ `/ i) u) ? T* __fastcall Get(int Index) const
8 [4 V g- _$ |; W, H0 H {
% G- {" N; \' J1 \0 V; f' z return (T*)inherited::Get(Index);
3 h1 p7 j' q& s V } " O+ H' ^" v' o! U) X2 B4 W
void __fastcall Put(int Index, T* Item) S: w8 d( k, E. l, j8 B6 l+ ?
{ * K$ c" C- ?" {+ Z8 D- k
inherited: ut(Index, Item);
1 I4 s8 x7 F k8 ~* e. T; ]4 W } 6 k/ @7 O4 r" r2 u& Y# R
public:
, V8 a* M% Y$ C! S __property T* Items[int Index] = {read=Get, write=Put}; . ^& j; i/ p7 b) R% j
public:
2 Y3 \6 s2 h% u% B __fastcall TTypedList(bool bAutoClear = true)
0 h5 g! q& S: N : TList(), FAutoClear(bAutoClear), FItemClassType(__classid(T))
! J5 L; ], [& r1 B5 L { }
1 w4 h7 z" W& ]1 H$ Z3 i5 ]& l // no destructor needed 1 ~: R) a& f' {7 c# W- p
int __fastcall Add(T* Item)
5 J1 B1 i# L5 U. e& V1 B" j {
' u! y* s F; t( c7 A z5 r return inherited::Add(Item); 3 c) k8 E0 c$ B! [
}
2 @1 l. ~$ ^+ j" M& I, E4 ` int __fastcall AddList(const TTypedList& List)
3 @7 A; ]0 c/ X { 4 V( z7 o' v+ B, }7 v
if(this == &List) " p& H8 J/ V+ g+ ^6 D! u- V
{ 6 G' j5 p7 P0 I2 }% n
throw EInvalidPointer("Can't add a TTypedList to himself!");
- K7 T" o9 z+ d5 |4 ~1 ~ }
4 g2 x) b. E. `: r7 \& t* m7 m if(FItemClassType != List.FItemClassType)
! _2 W) f" S+ T2 q {
7 n- P$ R1 q6 u# |" Y- e throw EConvertError("Can't add a TTypedList with a different ItemClass
! G0 R0 o. P* D, O3 K/ eType!");
! `7 b5 A& n- n }
7 a" G8 \! Y& ^. I) @3 x for(int i=0; i<List.Count; i++)
e" t5 h4 X8 f. p; o {
/ u4 ~7 m2 `$ d# O# e5 o ^$ O7 A Add(List.Get(i)); + {" }6 S2 |( ?8 M2 d- D9 ~: m2 X
} 9 z) g w, ~5 U v0 b; X; n+ }
return List.Count;
0 W [" \" t9 y) U5 A3 y }
# k/ i; x7 y) D- u+ b- O virtual void __fastcall Clear(void) * @ k7 X7 s; |2 V' A b
{ 1 j6 } @- N/ ?7 R* V' S7 I
if(FAutoClear) * C% b8 Y |: h0 e& J5 R7 r! }
{ - R+ S% U8 W1 U/ n
for(int i=0; i<Count; i++)
. a8 ?0 \* {. |0 r { ! K [5 d1 T$ w2 D) m
delete Get(i); 8 E! |! o8 J2 @- O$ f/ p
} % Z1 O7 ]: x/ _/ ~) d7 K
} ; Q# E; i# ]5 \6 p
inherited::Clear();
: P. n9 d7 P: \( Z% { }
; I7 `7 m- d1 k, Q0 [; ]# k; Y void __fastcall Delete(int Index, bool bAutoDelete = true) 8 e4 z9 F0 i% C2 j( W. Y9 Q: u
{ : G# d' d, I, M
if(bAutoDelete)
" i; W" @! K6 N# L {
3 h k( l1 B# @' }! j9 h delete Get(Index);
, W0 X( \# v6 L. A }
2 k ]% [+ Z6 O& B* J& S" i$ p inherited: elete(Index); 9 j0 \3 y# n, F" g3 X9 v n8 d
}
- D% M5 z6 @1 {, i2 M T* __fastcall First(void) const
6 b) C( S2 h2 F3 P6 B( y { 0 X% K2 t! L1 R9 @
return (T*)inherited::First(); 2 E7 J; k- w$ t7 T: w, {2 U
} ( g( R* L- |5 y3 G8 m/ I) W
int __fastcall IndexOf(T* Item) const
! g/ V- x5 ^& V: V( ] D' m { 9 h! K0 w; @9 ]: w! A+ p
return inherited::IndexOf(Item);
e" _" B1 k3 f }
0 a' E8 N1 D- ]0 t void __fastcall Insert(int Index, T* Item) / I4 Q# D: m9 Y! Y3 d
{
9 b% J' w; _2 H+ S inherited::Insert(Index, Item);
; N/ \( X- ~6 ~ }
0 j$ V' X' {$ W6 y8 _5 t bool __fastcall IsEmpty(void) const
$ Q8 b) B; `6 H3 _5 X9 Z {
' p2 I6 Q; X. m7 d* Y7 H return Count == 0; # E6 o* ?1 z6 `: q. e2 Q
} 7 ?( q! a- i2 t" Z
T* __fastcall Last(void) const , @3 \# J. S( N$ j9 n
{ * H. N! j5 H3 A+ i, k- E; S1 R
return (T*)inherited: ast();
- k8 Q) W6 o6 w6 J, @8 f8 E6 a } . t& D/ S U9 ]% Y! e
int __fastcall Remove(T* Item, bool bAutoDelete = true)
X$ G! l! ?& h0 k$ t' B- U8 f: [' Q+ L {
% F4 d) B( W! K$ n int nIndex = inherited::Remove(Item); ; B7 v$ J+ k% v3 c
if(bAutoDelete && (nIndex != -1)) 5 X, C) B( S4 L) b# n' T
{
( T- r# r+ Y2 m: i [8 y& P$ a delete Item; ' e4 d6 s" \/ ]. {
} # A8 k/ J- V& B& i
return nIndex; : V" L9 z' q @
}
' a* E2 v0 S2 h: p& @ void operator<<(T* Item) 2 a3 Q% s0 v) ]+ W* O8 `
{
, W/ `, \- m' G" U+ H$ K3 ?1 K Add((T *)Item);
- q( g( q% ~0 K* [ } 0 ]; k+ o9 s6 s' Z
void operator<<(const TTypedList& List)
- ]0 R1 \. {9 e& D* p# u: O( a+ z
{
( i8 X6 T3 t8 Y. Z Y1 ~ AddList(List);
8 I4 ` l y3 _8 {! K0 m& D }
* |5 W/ q# k/ B5 u}; // end of TTypedList 1 |% K6 x3 K# y
//-------------------------------------------------------------------------
. U$ I/ o" u7 p. ?- `; m#endif |