diff options
Diffstat (limited to '')
-rw-r--r-- | private/utils/ulib/inc/array.hxx | 390 |
1 files changed, 390 insertions, 0 deletions
diff --git a/private/utils/ulib/inc/array.hxx b/private/utils/ulib/inc/array.hxx new file mode 100644 index 000000000..82626b173 --- /dev/null +++ b/private/utils/ulib/inc/array.hxx @@ -0,0 +1,390 @@ +/*++ + +Copyright (c) 1990 Microsoft Corporation + +Module Name: + + array.hxx + +Abstract: + + This module contains the declaration for the ARRAY class. + + ARRAY is a concrete implementation of a dynamic (i.e. growable) array + derived from the abstract class SORTABLE_CONTAINER. + + ARRAY's support one 'writer' (i.e. one client poutting OBJECTs into + the ARRAY) and multiple readers via an ITERATOR. It is the client's + responsibility to synchronize multiple writers. + + The ARRAY does not contain holes, i.e. all elements of the array (up + to QueryMemberCount() ) have objects. + + +Author: + + David J. Gilman (davegi) 31-Oct-1990 + +Environment: + + ULIB, User Mode + +Notes: + + +--*/ + +#if ! defined( _ARRAY_ ) + +#define _ARRAY_ + +#include "sortcnt.hxx" + +// +// Forward references +// +DECLARE_CLASS( ARRAY ); +DECLARE_CLASS( ARRAY_ITERATOR ); +DECLARE_CLASS( SORTED_LIST ); + +// +// Pointer to array of POBJECTs +// +typedef POBJECT* PPOBJECT; + +// +// Default values for an ARRAY object. +// +// - Capacity is the total number of elements that can be stored in an ARRAY +// - CapacityIncrement is the number of elemnts that the ARRAY's Capacity +// will be increased by when it's Capacity is exceeded +// +CONST ULONG DefaultCapacity = 50; +CONST ULONG DefaultCapacityIncrement = 25; + +// +// Invalid index within the array +// +CONST ULONG INVALID_INDEX = (ULONG)(-1); + + +class ARRAY : public SORTABLE_CONTAINER { + + friend ARRAY_ITERATOR; + friend SORTED_LIST; + + public: + + ULIB_EXPORT + DECLARE_CONSTRUCTOR( ARRAY ); + + DECLARE_CAST_MEMBER_FUNCTION( ARRAY ); + + VIRTUAL + ULIB_EXPORT + ~ARRAY( + ); + + NONVIRTUAL + ULIB_EXPORT + BOOLEAN + Initialize ( + IN ULONG Capacity DEFAULT DefaultCapacity, + IN ULONG CapacityIncrement DEFAULT DefaultCapacityIncrement + ); + + VIRTUAL + ULIB_EXPORT + BOOLEAN + DeleteAllMembers( + ); + + VIRTUAL + POBJECT + GetAt( + IN ULONG Index + ) CONST; + + VIRTUAL + ULONG + GetMemberIndex( + IN POBJECT Object + ) CONST; + + VIRTUAL + BOOLEAN + ULIB_EXPORT + Put( + IN OUT POBJECT Member + ); + + VIRTUAL + BOOLEAN + PutAt( + IN OUT POBJECT Member, + IN ULONG Index + ); + + NONVIRTUAL + ULONG + QueryCapacity ( + ) CONST; + + NONVIRTUAL + ULONG + QueryCapacityIncrement ( + ) CONST; + + VIRTUAL + ULIB_EXPORT + PITERATOR + QueryIterator( + ) CONST; + + VIRTUAL + ULONG + QueryMemberCount( + ) CONST; + + VIRTUAL + ULIB_EXPORT + POBJECT + Remove( + IN OUT PITERATOR Position + ); + + VIRTUAL + POBJECT + RemoveAt( + IN ULONG Index + ); + + NONVIRTUAL + ULONG + SetCapacity ( + IN ULONG Capacity + ); + + NONVIRTUAL + VOID + SetCapacityIncrement ( + IN ULONG CapacityIncrement + ); + + VIRTUAL + BOOLEAN + Sort( + IN BOOLEAN Ascending DEFAULT TRUE + ); + + NONVIRTUAL + BOOLEAN + Insert( + IN OUT POBJECT Member, + IN ULONG Index + ); + + + protected: + + STATIC + LONG + CompareAscDesc( + IN POBJECT Object1, + IN POBJECT Object2, + IN BOOLEAN Ascending DEFAULT TRUE + ); + + NONVIRTUAL + VOID + Construct ( + ); + + NONVIRTUAL + PPOBJECT + GetObjectArray ( + ); + + private: + + NONVIRTUAL + ULONG + SetArrayCapacity( + IN ULONG NumberOfElements + ); + + STATIC + int _CRTAPI1 + CompareAscending ( + IN const void * Object1, + IN const void * Object2 + ); + + STATIC + int _CRTAPI1 + CompareDescending ( + IN const void * Object1, + IN const void * Object2 + ); + + PPOBJECT _ObjectArray; // Array of pointers to OBJECTs + ULONG _PutIndex; // Put Index + ULONG _Capacity; // Capacity of the array + ULONG _CapacityIncrement; // Increment + +#if DBG==1 + ULONG _IteratorCount; // Count of iterators +#endif + +}; + + +INLINE +ULONG +ARRAY::QueryCapacity ( + ) CONST + +/*++ + +Routine Description: + + Return the current capacity (maximum number of members) of the ARRAY. + +Arguments: + + None. + +Return Value: + + ULONG - Current capacity. + + +--*/ + +{ + return( _Capacity ); +} + + + +INLINE +ULONG +ARRAY::QueryCapacityIncrement ( + ) CONST + +/*++ + +Routine Description: + + Return the current capacity increment (realloc amount) of the ARRAY. + +Arguments: + + None. + +Return Value: + + ULONG - Current capacity increment. + +--*/ + +{ + return( _CapacityIncrement ); +} + + + +INLINE +VOID +ARRAY::SetCapacityIncrement ( + IN ULONG CapacityIncrement + ) + +/*++ + +Routine Description: + + Set the capacity incement value. + +Arguments: + + CapacityIncrement - Supplies the new value for the capacity increment. + +Return Value: + + None. + +--*/ + +{ + _CapacityIncrement = CapacityIncrement; +} + + + +INLINE +LONG +ARRAY::CompareAscDesc( + IN POBJECT Object1, + IN POBJECT Object2, + IN BOOLEAN Ascending + ) +/*++ + +Routine Description: + + Compares two object accordint to an Ascending flag + +Arguments: + + Object1 - Supplies first object + Object2 - Supplies second object + Ascending - Supplies ascending flag + +Return Value: + + LONG - If Ascending: + <0 if Object1 is less that Object2 + 0 if Object1 is equal to Object2 + >0 if Object1 is greater than Object2 + + If !Ascending: + <0 if Object2 is less that Object1 + 0 if Object2 is equal to Object1 + >0 if Object2 is greater than Object1 + + +--*/ +{ + return ( Ascending ? CompareAscending( &Object1, &Object2 ) : + CompareDescending( &Object1, &Object2) ); +} + + + +INLINE +PPOBJECT +ARRAY::GetObjectArray ( + ) +/*++ + +Routine Description: + + Obtains pointer to the array of objects + +Arguments: + + None + +Return Value: + + PPOBJECT - Pointer to array of objects + +--*/ + +{ + return _ObjectArray; +} + +#endif // _ARRAY_ + |