|
: }" Z# H( H5 H+ y
偶在一个老外的文章的基础上写的,应该很有用的说, , Y* |7 L: E! ], _2 [' P3 b
以前总是用STL的vector做替代,但是STL的用法实在不是很习惯 + W M/ k6 M# e) i4 U5 [
4 a3 g- d9 f% B; t: I//------------------------------------------------------------------------- . }; w7 t& O# X, n7 U7 J
#ifndef TypedListH_0CBFE2E8-E7C5-4D88-9844-1F177F4B00E4 6 ]4 k3 ^) L, H8 j j6 Y* x6 I
#define TypedListH_0CBFE2E8-E7C5-4D88-9844-1F177F4B00E4 ) Q: D6 P, Z9 n( D3 q& ^
//------------------------------------------------------------------------- . s0 Q2 z, O; x$ x8 K8 w* E9 g
#include <classes.hpp> 1 u& @5 A( N" n8 S* {
//-------------------------------------------------------------------------
* @- `2 C6 q* [4 ztemplate <class T> 2 ~3 ]- M" Y. h# m2 a! @8 a9 d
class TTypedList : public TList 9 D9 C% P2 e3 S8 X3 _
{
* D+ P+ O% X6 o ]9 @6 P typedef TList inherited;
3 \( a4 J5 p8 N7 lprivate: 9 Y& h/ ?& \* q P" |
bool FAutoClear; 1 Q2 _1 a: {( f; m
TClass FItemClassType;
' I/ k: X1 m" d3 ?3 a% `protected:
f3 L5 q6 Q0 B7 B6 K' U+ Z. t7 } T* __fastcall Get(int Index) const
% y1 e; [. |/ O; Q. }1 [- h* o, A { - D. c: W4 q7 w2 y8 `- T) t1 t/ ]
return (T*)inherited::Get(Index);
* R" _- G# F6 Y, j$ } } - n& ]9 R& M# R# D9 a2 O7 `
void __fastcall Put(int Index, T* Item) 8 `! F2 X+ B. }" r4 J4 f6 J; n
{
* d0 ^/ r' P% {' E, L inherited: ut(Index, Item); / q' N' a7 [) N7 W+ f) H4 }( `
}
5 U# y2 V |% E, M' j& q2 p1 W7 Rpublic:
0 Q8 w" N6 E0 M1 D# {3 V __property T* Items[int Index] = {read=Get, write=Put}; # ~# _9 ]8 [1 C7 e( S. l- J' G" S* q
public:
0 A& V1 f& e0 B; u$ ] __fastcall TTypedList(bool bAutoClear = true) & `, y' E+ e8 q" [1 |: L1 Y
: TList(), FAutoClear(bAutoClear), FItemClassType(__classid(T))
$ P3 l% ?0 I7 Y4 ]6 Q: K- M { }
! K9 G! k5 K, ?) c // no destructor needed
+ }2 O3 O$ k$ f: `4 y* m' d int __fastcall Add(T* Item) 9 y7 T4 D/ K8 Y T+ _2 i+ R
{
7 T! q/ l$ ~' v* C6 `* ^6 }% T return inherited::Add(Item);
! K( q( G& J- y# f! D } 8 Q/ D# }$ D# Z5 ^" D8 O
int __fastcall AddList(const TTypedList& List)
, K' R- l( `7 _. }! \ { : N: V+ t) }! ]* q
if(this == &List)
+ `5 j) \+ S. _) G) E {
/ J* r( s6 |9 S# o4 I throw EInvalidPointer("Can't add a TTypedList to himself!"); : [; m. [) P1 q
}
. ^0 N) ~. c% U9 X( X if(FItemClassType != List.FItemClassType)
9 @( R% b, R, F \7 p, v: ` {
+ H5 I* B* R8 ^6 f8 H throw EConvertError("Can't add a TTypedList with a different ItemClass 2 p$ X* }# h( g$ f
Type!");
8 |# {. v% ^- R% k } ' d0 V! O7 r. E" h- D4 V
for(int i=0; i<List.Count; i++)
/ J m) j5 `0 D6 ^( H$ v. B {
& k. g1 @3 \. a9 P3 l4 s Add(List.Get(i)); 2 ?4 U. V0 r0 V5 ^$ ]
} % z J W$ E* R( t; A' g
return List.Count;
% M c# ]0 p1 T! ^; E; s4 K } 7 s- j4 e; S) |4 g9 c' I: u) u
virtual void __fastcall Clear(void)
& J: g. U- D4 W0 w2 C+ J3 b( R6 Y2 b { 3 _: d! N5 `1 b" z; j
if(FAutoClear)
4 A+ _8 H# z9 J: f9 _8 q {
7 B% m' {2 [5 S* B for(int i=0; i<Count; i++)
! p. {+ V; ^4 l$ n, N. \ { - M6 v. W% b# J4 R d: W. j
delete Get(i);
. q K4 q% S' b6 K) g6 b* k } 6 x- t5 P1 T9 A. Q
}
9 J. [3 ?# t3 f R inherited::Clear();
x& G3 @$ u. h }
* b# C; J/ ~$ l+ L$ C/ m* V/ S- Z! f) { void __fastcall Delete(int Index, bool bAutoDelete = true) ( |2 o" l# _9 z8 A t5 s: F9 b4 T8 }
{ 9 W" K0 s5 J; w% A; `+ v1 e1 @
if(bAutoDelete)
3 `1 u( v' Q- b4 M0 o( _ {
% T2 u( J& E) S* k8 c delete Get(Index); ' U% H, e2 f+ d3 O; g8 a
}
# F" p$ L" A) L( T inherited: elete(Index); : O0 q9 x+ a7 H
}
: ]& u. B% L8 Q |0 \/ a T* __fastcall First(void) const 5 Y8 s2 ~* l6 N. b0 n# Z
{
% B! U6 c4 a4 i" U1 d return (T*)inherited::First(); : g1 ~1 R$ l+ O3 t$ z
}
) O1 W* S& w! L0 f" g int __fastcall IndexOf(T* Item) const
; u/ @. H% H. y) G {
" D' y. b) ^* F9 L B7 e5 y3 k8 A return inherited::IndexOf(Item);
* K# }, X& f2 e+ Z: K }
6 i) X5 Q6 d: {7 s+ V. o/ `1 g void __fastcall Insert(int Index, T* Item)
9 j- l# x" U2 q4 W6 `$ } {
) a9 a4 ~' @, w* z inherited::Insert(Index, Item);
# c0 @$ v- q/ _* l$ }2 G# o+ T, v }
% K9 R: g- E3 Y) p% F+ m bool __fastcall IsEmpty(void) const 2 m+ B, g) y; _+ s; h- F: A$ Y! I6 B
{ 7 @$ h# B$ P- f6 ]0 K: ~+ p
return Count == 0;
4 K8 F; n' R2 f) a o } * X# W, M/ S0 _' u* a: d7 B% e( v$ x
T* __fastcall Last(void) const
, B2 {8 _/ U$ J, b {
- \- z- h) n1 h5 t3 W return (T*)inherited: ast();
( V+ m0 C: x! K6 ~3 y: r7 \# I3 l }
& b% K# e$ y$ N int __fastcall Remove(T* Item, bool bAutoDelete = true)
! f; R9 `* o3 i1 a6 q# w! e& b6 V { 6 A+ [& Q9 L! T8 o9 q% r
int nIndex = inherited::Remove(Item); # Q! |3 Q( B# Y2 Y$ w' _' F
if(bAutoDelete && (nIndex != -1)) 9 G' {2 }; T* |1 M2 s
{ : w: h9 w1 A2 j% `3 r! q
delete Item;
. V6 v, E# |6 W9 J1 l } 8 K' o& T$ b: M1 L& P
return nIndex;
0 a" i+ ?- c& p9 D' b7 c5 l, F$ P }
. r& s! o5 K) v5 [/ _. K, ~8 a) T void operator<<(T* Item) # K t+ J6 A( m# d$ C; Z* J4 B# q' y- M
{
! A7 n$ L# y. F2 z Add((T *)Item); , B" H0 K+ E6 Y# t9 ], g) }
}
, y5 W8 F- x' C void operator<<(const TTypedList& List) ; F; V2 L$ s7 N
- g' S+ H0 A# Y2 {2 A$ P1 B( C' E { 3 q, e% m' L4 N/ [9 z% U
AddList(List);
) d( p7 W6 t8 N$ P9 B: ? } & @ b' Z. v6 s% q$ n% P
}; // end of TTypedList
8 D V+ U" ~" P C3 O! W//------------------------------------------------------------------------- # H) K7 y+ z2 }
#endif |