Sophie

Sophie

distrib > * > 2010.0 > * > by-pkgid > bd5e9d9a5b950be222fd802c845ee12b > files > 2

libgds-devel-1.4.5-1mdv2009.1.i586.rpm

// ==================================================================
// @(#)array.h
//
// @author Bruno Quoitin (bqu@info.ucl.ac.be)
// @date 10/04/2003
// @lastdate 20/12/2007
// ==================================================================

#ifndef __ARRAY_H__
#define __ARRAY_H__

#include <libgds/enumerator.h>
#include <libgds/types.h>

#define ARRAY_OPTION_SORTED  0x01
#define ARRAY_OPTION_UNIQUE  0x02

// ----- FArrayCompare ----------------------------------------------
/**
 * Warning: FArrayCompare is being passed pointers to the items to be
 * compared.
 */
typedef int (*FArrayCompare)(void * pItem1, void * pItem2,
			     unsigned int uEltSize);
// ----- FArrayDestroy ----------------------------------------------
typedef void (*FArrayDestroy) (void * pItem);
// ----- FArrayForEach ----------------------------------------------
typedef int (*FArrayForEach) (void * pItem, void * pContext);
// ----- FArrayCopyItem ---------------------------------------------
typedef void * (*FArrayCopyItem) (void * pItem);

typedef struct {
  char * data;
} SArray;

typedef struct {
  int * data;
} SIntArray;

#define int_array_create(O) \
          (SIntArray *) _array_create(sizeof(int), O, \
          _array_compare, NULL)
#define int_array_length(A) _array_length((SArray *) A)
#define int_array_set_length(A, L) _array_set_length((SArray *) A, L)
#define int_array_sorted_find_index(A, D, I) \
          _array_sorted_find_index((SArray *) A, D, I)
#define int_array_add(A, D) _array_add((SArray *) A, D)
#define int_array_append(A, D) _array_append((SArray *) A, D)
#define int_array_remove_at(A, I) _array_remove_at((SArray *) A, I)

typedef struct {
  uint32_t * data;
} SUInt32Array;
#define uint32_array_create(O) \
          (SUInt32Array *) _array_create(sizeof(uint32_t), O, \
          _array_compare, NULL)

typedef struct {
  uint16_t * data;
} SUInt16Array;
#define uint16_array_create(O) \
          (SUInt16Array *) _array_create(sizeof(uint16_t), O, \
          _array_compare, NULL)
#define uint16_array_length(A) _array_length((SArray *) A)

typedef struct {
  double * data;
} SDoubleArray;
#define double_array_create(O) \
          (SDoubleArray *) _array_create(sizeof(double), O, \
          _array_compare, NULL)
#define double_array_length(A) _array_length((SArray *) A)
#define double_array_set_length(A, L) _array_set_length((SArray *) A, L)
#define double_array_get_at(A, I, E) _array_get_at((SArray *) A, I, E)
#define double_array_remove_at(A, I) _array_remove_at((SArray *)A, I)
#define double_array_add(A, E) _array_add((SArray *)A, E)
#define double_array_sorted_find_index(A, E, I) _array_sorted_find_index(A, E, I)

typedef struct {
  void ** data;
} SPtrArray;
#define ptr_array_create_ref(O) \
          (SPtrArray *) _array_create(sizeof(void *), O, \
          _array_compare, NULL)
#define ptr_array_create(O, FC, FD) \
          (SPtrArray *) _array_create(sizeof(void *), O, FC, FD)
#define ptr_array_length(A) _array_length((SArray *) A)
#define ptr_array_set_length(A, L) _array_set_length((SArray *) A, L)
#define ptr_array_sorted_find_index(A, D, I) \
          _array_sorted_find_index((SArray *) A, D, I)
#define ptr_array_add(A, D) _array_add((SArray *) A, D)
#define ptr_array_append(A, D) _array_append((SArray *) A, &D)
#define ptr_array_remove_at(A, I) _array_remove_at((SArray *) A, I)
#define ptr_array_get_at(A, I, E) _array_get_at((SArray *) A, I, E)
#define ptr_array_set_fdestroy(A, F) _array_set_fdestroy((SArray *)A, F)

#ifdef __cplusplus
extern "C" {
#endif

  // ----- _array_create --------------------------------------------
  SArray * _array_create(unsigned int uEltSize,
				uint8_t uOptions,
				FArrayCompare fCompare,
				FArrayDestroy fDestroy);
  // ----- _array_set_fdestroy --------------------------------------
  void _array_set_fdestroy(SArray * pArray, FArrayDestroy fDestroy);
  // ----- _array_destroy -------------------------------------------
  void _array_destroy(SArray ** ppArray);
  // ----- _array_length --------------------------------------------
  unsigned int _array_length(SArray * pArray);
  // ----- _array_set_length ----------------------------------------
  void _array_set_length(SArray * pArray,
			 unsigned int uNewLength);
  // ----- _array_set_at --------------------------------------------
  int _array_set_at(SArray * pArray, unsigned int uIndex,
		    void * pData);
  // ----- _array_get_at --------------------------------------------
  int _array_get_at(SArray * pArray, unsigned int uIndex,
		    void * pData);
  // ----- _array_sorted_find_index ---------------------------------
  int _array_sorted_find_index(SArray * pArray, void * pData,
			       unsigned int * puIndex);
  // ----- _array_add -----------------------------------------------
  int _array_add(SArray * pArray, void * pData);
  // ----- _array_append --------------------------------------------
  int _array_append(SArray * pArray, void * pData);
  // ----- _array_insert_at -----------------------------------------
  int _array_insert_at(SArray * pArray, unsigned int uIndex, void * pData);
  // ----- _array_for_each ------------------------------------------
  int _array_for_each(SArray * pArray, FArrayForEach fForEach,
		      void * pContext);
  // ----- _array_copy ----------------------------------------------
  SArray * _array_copy(SArray * pArray);
  // ----- _array_remove_at -----------------------------------------
  int _array_remove_at(SArray * pArray, unsigned int uIndex);
  // ----- _array_compare -------------------------------------------
  int _array_compare(void * pItem1, void * pItem2,
		     unsigned int uEltSize);
  // ----- _array_sub -----------------------------------------------
  SArray * _array_sub(SArray * pArray, unsigned int iFirst,
		      unsigned int iLast);
  // ----- _array_add_array -----------------------------------------
  void _array_add_array(SArray * pArray, SArray * pSrcArray);
  // ----- _array_trim ----------------------------------------------
  void _array_trim(SArray * pArray, unsigned uMaxLength);
  // ----- _array_sort ----------------------------------------------
  int _array_sort(SArray * pArray, FArrayCompare fCompare);
  // ----- _array_get_enum ------------------------------------------
  SEnumerator * _array_get_enum(SArray * pArray);
  
#ifdef __cplusplus
}
#endif

#define ARRAY_DESTROY_TEMPLATE(P, T) \
inline static void P##_array_destroy(T ** ppArray) { \
  _array_destroy((SArray **) ppArray); }

ARRAY_DESTROY_TEMPLATE(double, SDoubleArray)
ARRAY_DESTROY_TEMPLATE(int, SIntArray)
ARRAY_DESTROY_TEMPLATE(ptr, SPtrArray)
ARRAY_DESTROY_TEMPLATE(uint16, SUInt16Array)
ARRAY_DESTROY_TEMPLATE(uint32, SUInt32Array)

#undef ARRAY_DESTROY_TEMPLATE

#endif