home *** CD-ROM | disk | FTP | other *** search
/ Dream 57 / Amiga_Dream_57.iso / Amiga / Programmation / c / Extensions / APPSource.lha / APlusPlus / libsource / MapArray.cxx < prev    next >
Encoding:
C/C++ Source or Header  |  1994-08-29  |  2.1 KB  |  89 lines

  1. /******************************************************************************
  2.  **
  3.  **   C++ Class Library for the Amiga⌐ system software.
  4.  **
  5.  **   Copyright (C) 1994 by Armin Vogt  **  EMail: armin@uni-paderborn.de
  6.  **   All Rights Reserved.
  7.  **
  8.  **   $Source: apphome:RCS/libsource/MapArray.cxx,v $
  9.  **   $Revision: 1.7 $
  10.  **   $Date: 1994/08/27 13:22:03 $
  11.  **   $Author: Armin_Vogt $
  12.  **
  13.  ******************************************************************************/
  14.  
  15. extern "C"
  16. {
  17. #include <string.h>
  18. }
  19. #include <APlusPlus/environment/MapArray.h>
  20.  
  21. #define MAPARRAY_MINSIZE 4
  22. #define MAPARRAY_GROWSIZE 2
  23.  
  24. MapArray::Pair MapArray::empty = {0,0};
  25.  
  26.  
  27. static const char rcs_id[] = "$Id: MapArray.cxx,v 1.7 1994/08/27 13:22:03 Armin_Vogt Exp Armin_Vogt $";
  28.  
  29.  
  30. MapArray::MapArray()
  31. {
  32.    pairs = ∅
  33.    arraySize = 0;
  34. }
  35.  
  36. MapArray::~MapArray()
  37. {
  38.    if (arraySize)
  39.    delete[] pairs;
  40. }
  41.  
  42. MA_T& MapArray::operator [] (MapKey searchKey)
  43. {
  44.    if (pairs==NULL)
  45.    {
  46.       pairs = new Pair[MAPARRAY_MINSIZE];
  47.       arraySize = MAPARRAY_MINSIZE;
  48.       pairs->key = searchKey;
  49.       (pairs+1)->key = 0;
  50.       return pairs->entry;
  51.    }
  52.    else
  53.    {
  54.       int n = arraySize;
  55.       for (Pair *pair = pairs; pair->key!=0 && n>0; pair++,n--)
  56.          if (pair->key == searchKey) return pair->entry;
  57.  
  58.       n = arraySize-n;  // n is array index of first unused Pair
  59.       if (n >= arraySize-1)
  60.       {
  61.          Pair *_newPair = new Pair[arraySize+MAPARRAY_GROWSIZE];
  62.          memcpy(_newPair,pairs,arraySize*sizeof(Pair));
  63.          pairs = _newPair;
  64.          arraySize += MAPARRAY_GROWSIZE;
  65.       }
  66.  
  67.       pairs[n+1].key = 0;
  68.       pairs[n].key = searchKey;
  69.       return pairs[n].entry;
  70.    }
  71. }
  72.  
  73. MA_T MapArray::find(MapKey searchKey, MapArray_comp cf)
  74. {
  75.    int n = arraySize;
  76.    if (cf==NULL)
  77.    {
  78.       for (Pair *pair = pairs; n>0 && pair->key!=0; pair++,n--)
  79.          if (pair->key == searchKey) return pair->entry;
  80.    }
  81.    else  // a comparator function has been given
  82.    {
  83.       for (Pair *pair = pairs; n>0 && pair->key!=0; pair++,n--)
  84.          if ((*cf)(pair->key,searchKey)) return pair->entry;
  85.    }
  86.  
  87.    return NULL;
  88. }
  89.