|
! U( p- Y: L* T0 O3 P9 m5 C偶在一个老外的文章的基础上写的,应该很有用的说,
# [$ e9 Q$ m& @- p2 T; b以前总是用STL的vector做替代,但是STL的用法实在不是很习惯
& q# G I9 e- V9 \; X. ^5 Q, q9 \
# J4 W7 X6 g3 _& x# o( Z% o//------------------------------------------------------------------------- ! c9 Y3 w) V) s. p
#ifndef TypedListH_0CBFE2E8-E7C5-4D88-9844-1F177F4B00E4
' `! R/ \+ I8 q#define TypedListH_0CBFE2E8-E7C5-4D88-9844-1F177F4B00E4
5 t F4 L: n/ H/ I7 f0 D$ m$ K//------------------------------------------------------------------------- & E$ o" c7 S. z' \% D e3 r1 H
#include <classes.hpp>
3 Q" k5 E! _: S5 ^# _& @//-------------------------------------------------------------------------
9 {2 J2 r5 ]5 b( `% Dtemplate <class T>
0 n8 G. x, t A( k; Y+ s/ Dclass TTypedList : public TList
* E& K8 M0 S4 m{ ! [. p; {0 o8 T' J( s# e4 \5 n0 a
typedef TList inherited; . h9 l1 B4 z. ]: X: _! h
private: ; I% e$ A z- k$ c' _8 D# ]
bool FAutoClear;
4 i& O2 P p! o, t) m( b& J TClass FItemClassType; , e& A" m+ z! F1 e2 O) u/ j* p
protected: . _4 C' n" Z4 s) T$ ~; q* Z
T* __fastcall Get(int Index) const " A$ p+ w* I s
{ ! ? Z! w6 @+ r- O8 O
return (T*)inherited::Get(Index); : F5 p- U y5 O- a: ~1 X: K
} % S0 z0 G4 b( e [, N
void __fastcall Put(int Index, T* Item) 5 Q# L0 i8 X& L) m1 K
{ - z3 }; z: n4 C) b
inherited: ut(Index, Item); 5 x% P" s( {, H; o+ A5 x
}
5 }5 z5 i. M; V3 @public: * q3 s+ A- i4 G/ V- m
__property T* Items[int Index] = {read=Get, write=Put};
* h# K6 | k0 ppublic:
5 ^8 S! L: R2 \7 |. h4 r, H+ ^ __fastcall TTypedList(bool bAutoClear = true) . k/ ]* m- g8 r* \0 R
: TList(), FAutoClear(bAutoClear), FItemClassType(__classid(T))
# ?$ Q: _; k7 W1 S0 f5 O1 q { } 9 X5 D0 I- a6 n- i
// no destructor needed
8 X) D+ N5 P( q! v1 E int __fastcall Add(T* Item) $ l( q ?6 J+ R* t" u$ T5 K
{
7 b( Z/ s8 p2 A8 v6 z- z0 Z return inherited::Add(Item); 3 H* ^$ u2 n3 |" E& G
}
7 W, {; o: L% M5 m4 ~( [ int __fastcall AddList(const TTypedList& List) # z! S. m6 ~8 l+ F+ d
{
+ f9 O$ S$ ~3 Y) M1 Z3 w2 f if(this == &List)
/ k' v9 I/ g5 N { , M$ l) w! B2 d7 Z) ]& g* W
throw EInvalidPointer("Can't add a TTypedList to himself!"); # b% n5 ]3 x" G6 B8 v+ M
}
# g" } D) Q# G0 A! p- d if(FItemClassType != List.FItemClassType)
5 j* [: c+ w9 ^ {
, [( @% N3 A9 }9 E& L; p" G throw EConvertError("Can't add a TTypedList with a different ItemClass
5 I) H2 H' f p3 W$ |Type!");
& a% z1 C1 I2 p% ]. P5 ~4 r }
0 Z3 B* V( P5 H, z" _ for(int i=0; i<List.Count; i++)
5 L ~6 G* z1 P# ? {
8 C w* D0 i* w! b4 p Add(List.Get(i)); ! l m6 Z& H7 o2 D& z
}
' e) w1 w' Y% ~4 K1 d9 ^7 x return List.Count; 4 r9 x0 p Y7 ]8 H5 w3 K
} " \3 p* l( b" I' I; E ^
virtual void __fastcall Clear(void)
4 Q+ I( L4 G% }+ b1 u {
; W& d, ~- p/ J4 z1 i3 M) j4 B if(FAutoClear)
; k5 Q) |% h$ B {
/ q' k0 a2 f1 B1 c2 f for(int i=0; i<Count; i++)
- }7 d5 P& v' c( X9 F3 N# b6 V { 6 s3 i9 A# O/ b; M5 W
delete Get(i); ) j: @4 P4 s2 H; N' o+ S
}
2 n; O" e, L# [2 Q }
$ J f: Z9 S( ?7 Y5 L% b! g9 m* C inherited::Clear();
3 {$ E3 V) A! K) v } 0 M4 h! X/ j& |; k, k
void __fastcall Delete(int Index, bool bAutoDelete = true) ; w( R {/ ~) L/ @ A& S
{
$ _4 m6 u7 j; Z0 t! i; ~ if(bAutoDelete) ! v9 s& C3 r/ X7 G
{ 2 U9 [2 P! c7 N# _8 S8 J3 _
delete Get(Index); 4 i j. d: @ w5 }
} ' \/ y# [3 [' u' Y- C7 D4 t
inherited: elete(Index); 9 q" h5 e4 p2 W3 [9 _( _+ a
} 7 ]. f1 E& V& g2 x& h# Z
T* __fastcall First(void) const ' G0 s" Y! [* f4 S! ^
{
: j( ?( d5 A- r' |4 k7 P return (T*)inherited::First();
# U2 B3 i$ P3 f! q1 G }
% Q9 b5 p% t9 x' d4 \8 ? int __fastcall IndexOf(T* Item) const
6 S. Y/ C0 L6 ~+ `$ y9 z { 2 w9 i! d! z$ i: T$ r( N9 p
return inherited::IndexOf(Item); 1 i* F! `( `1 t7 L
}
! }2 p+ O8 p0 L void __fastcall Insert(int Index, T* Item)
+ U% i( f9 {; Q7 @6 A' W! n { 1 [( D3 {5 Q! D8 j: m* S, F
inherited::Insert(Index, Item); + e$ n8 \, V p
} . [/ @5 ]8 [7 a7 C1 z
bool __fastcall IsEmpty(void) const
2 K2 V! ]6 G" e# I {
. c+ G$ f" ~9 X5 Y8 d% }4 O8 `1 z return Count == 0; 2 |) U6 _8 s' l0 _+ j! X
} - s8 @# k" U9 f1 f
T* __fastcall Last(void) const
" w! L7 |8 h1 Q* l2 q {
# C, F5 Y$ O+ q: F return (T*)inherited: ast();
4 K8 N* V# f2 a# `8 S }
7 Z8 i. M5 v1 j' n' h6 _+ e int __fastcall Remove(T* Item, bool bAutoDelete = true)
7 M6 \, N: N. ?9 E- }8 T: ~ { * i% t# a% g& e) K
int nIndex = inherited::Remove(Item);
. w' g# e% Q, r if(bAutoDelete && (nIndex != -1)) j ?& A R1 W; Y5 J! d7 S
{ 7 y6 v5 E! k- t8 f3 R
delete Item; , n3 W) ?+ z6 x! D3 D! Y
} & u8 ]! f' L+ R' |$ Q
return nIndex; # w% q% c( e' \* M$ N# `6 Z
}
6 I& w2 L) C8 Y# ], n void operator<<(T* Item)
) h I3 G8 k$ i1 _4 U4 [+ a {
! X5 B: B: o3 h+ m) P- y Add((T *)Item); # v4 h) ]# A6 U( r" T& Q: p. H; {, A
} + s9 t ?8 D4 v: z% _
void operator<<(const TTypedList& List)
8 u* Q# T! @. t E2 V/ S* h# A8 G
{
" h+ ?! r, e5 Z! m% U W. C$ F9 C AddList(List); 2 l$ k0 c) }4 s2 _
}
1 y% f6 v2 W& m: W7 q}; // end of TTypedList
* m/ g3 h0 d+ G: G( h3 J0 m* O//------------------------------------------------------------------------- + H7 M# N0 A8 h+ L, C! d
#endif |