1 // This is the STL wrapper for classlib/arrays.h from Borland's web site
2 // It has been modified to be compatible with vc++ (Paul Branann 5/7/98)
7 #pragma warning(disable: 4786)
10 // #include <vector.h>
18 class TArrayAsVector
: public vector
<T
> {
20 const unsigned int growable
;
21 typedef size_t size_type
;
22 typedef typename vector
<T
>::const_iterator const_iterator
;
23 const size_type lowerbound
;
25 TArrayAsVector(size_type upper
,
31 { vector
<T
>::reserve(upper
-lower
+ 1);}
34 { // This call is unnecessary? (Paul Brannan 5/7/98)
35 // vector<T>::~vector( );
38 int Add(const T
& item
)
39 { if(!growable
&& vector
<T
>::size( ) == vector
<T
>::capacity( ))
42 vector
<T
>::insert(vector
<T
>::end( ), item
);
45 int AddAt(const T
& item
, size_type index
)
47 ((vector
<T
>::size( ) == vector
<T
>::capacity( )) ||
48 (ZeroBase(index
> vector
<T
>::capacity( )) )))
50 if(ZeroBase(index
) > vector
<T
>::capacity( )) // out of bounds
51 { vector
<T
>::insert(vector
<T
>::end( ),
52 ZeroBase(index
) - vector
<T
>::size( ), T( ));
53 vector
<T
>::insert(vector
<T
>::end( ), item
); }
55 { vector
<T
>::insert(vector
<T
>::begin( ) + ZeroBase(index
), item
); }
59 size_type
ArraySize( )
60 { return vector
<T
>::capacity( ); }
62 size_type
BoundBase(size_type location
) const
63 { if(location
== UINT_MAX
)
66 return location
+ lowerbound
; }
67 void Detach(size_type index
)
68 { vector
<T
>::erase(vector
<T
>::begin( ) + ZeroBase(index
)); }
70 void Detach(const T
& item
)
71 { Destroy(Find(item
)); }
73 void Destroy(size_type index
)
74 { vector
<T
>::erase(vector
<T
>::begin( ) + ZeroBase(index
)); }
76 void Destroy(const T
& item
)
77 { Destroy(Find(item
)); }
79 size_type
Find(const T
& item
) const
80 { const_iterator location
= find(vector
<T
>::begin( ),
81 vector
<T
>::end( ), item
);
82 if(location
!= vector
<T
>::end( ))
83 return BoundBase(size_type(location
-
84 vector
<T
>::begin( )));
88 size_type
GetItemsInContainer( )
89 { return vector
<T
>::size( ); }
91 void Grow(size_type index
)
92 { if( index
< lowerbound
)
93 Reallocate(ArraySize( ) + (index
-
95 else if( index
>= BoundBase(vector
<T
>::size( )))
96 Reallocate(ZeroBase(index
) ); }
98 int HasMember(const T
& item
)
99 { if(Find(item
) != INT_MAX
)
105 { return vector
<T
>::empty( ); }
110 if(vector
<T
>::size( ) == vector
<T
>::capacity( ))
115 size_type
LowerBound( )
116 { return lowerbound
; }
118 T
& operator[] (size_type index
)
120 operator[](ZeroBase(index
)); }
122 const T
& operator[] (size_type index
) const
124 operator[](ZeroBase(index
)); }
131 void Reallocate(size_type sz
,
132 size_type offset
= 0)
134 vector
<T
>::insert(vector
<T
>::begin( ), offset
, T( ));
135 vector
<T
>::reserve(sz
);
136 vector
<T
>::erase(vector
<T
>::end( ) - offset
, vector
<T
>::end( )); }
138 void RemoveEntry(size_type index
)
141 void SetData(size_type index
, const T
& item
)
142 { (*this)[index
] = item
; }
144 size_type
UpperBound( )
145 { return BoundBase(vector
<T
>::capacity( )) - 1; }
147 size_type
ZeroBase(size_type index
) const
148 { return index
- lowerbound
; }
150 // The assignment operator is not inherited (Paul Brannan 5/25/98)
151 TArrayAsVector
& operator=(const TArrayAsVector
& v
) {
152 vector
<T
>::operator=(v
);
153 // should growable and lowerbound be copied as well?