386 lines
6.8 KiB
C++
386 lines
6.8 KiB
C++
/*++
|
||
|
||
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.
|
||
|
||
|
||
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 __cdecl
|
||
CompareAscending (
|
||
IN const void * Object1,
|
||
IN const void * Object2
|
||
);
|
||
|
||
STATIC
|
||
int __cdecl
|
||
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_
|