Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members   Related Pages  

Array.hpp

Go to the documentation of this file.
00001 /*==========================================================================
00002  * Copyright (c) 2001 Carnegie Mellon University.  All Rights Reserved.
00003  *
00004  * Use of the Lemur Toolkit for Language Modeling and Information Retrieval
00005  * is subject to the terms of the software license set forth in the LICENSE
00006  * file included with this software, and also available at
00007  * http://www.cs.cmu.edu/~lemur/license.html
00008  *
00009  *==========================================================================
00010 */
00011 
00012 
00013 #ifndef _ARRAYH_
00014 #define _ARRAYH_
00015 
00016 // 
00017 // Note: define ARRAY_BOUNDARY_CHECK for array boundary checking
00018 // 
00019 
00020 // #define ARRAY_BOUNDARY_CHECK
00021 #ifndef _WIN32
00022         #include <unistd.h>
00023 #endif
00024 #include <cassert>
00025 
00026 // basic array class, fixed size, not automatically growable
00027 template <class Type>
00028 class Array {
00029 
00030 public:
00031   // ***************** Constructors ********************
00032   // Constructor with maxsize parameter
00033   Array(unsigned int size=0) : realsize(size), maxsize(size)
00034     { if (size) array = new Type[size]; else array = (Type *) NULL; }
00035 
00036   // Copy method, uses equal operator
00037   Array(const Array<Type> &a)
00038     : realsize(a.realsize), maxsize(a.maxsize), array((Type *) NULL)
00039     { array = new Type[a.realsize]; *this = a; }
00040 
00041   // ***************** Destructor ********************
00042   ~Array() { if (array) delete [] array; }
00043 
00044   // ***************** operators ********************
00045   // Equal operator, copies array
00046   Array<Type> &operator=(const Array<Type> &a)
00047   {
00048     if (maxsize < a.maxsize) Grow(a.maxsize,0);
00049     assert(a.array != NULL);
00050     for (unsigned int i=0; i<a.maxsize; i++) array[i] = a.array[i];
00051     Grow(a.maxsize);     // ALB 10/29/97
00052     return *this;
00053   }
00054 
00055   Type &operator[](unsigned int idx) const
00056     {
00057 #ifdef ARRAY_BOUNDARY_CHECK
00058       assert((idx >= 0) && (idx < maxsize));
00059 #endif
00060       return array[idx];
00061     }
00062 
00063   // ***************** member functions ********************
00064   void Grow(unsigned int newsize, int copy=1) 
00065 
00066 {
00067   if (realsize >= (unsigned int) newsize) { maxsize = newsize; return; }
00068 
00069   Type * newarray;
00070   if (newsize == 0) {
00071      newarray = (Type *) NULL;
00072   }
00073   else {
00074      newarray = new Type[newsize];
00075      assert(newarray != NULL);
00076   }
00077 
00078   if (realsize)
00079     {
00080       if (copy) for (unsigned int i=0; i<maxsize; i++) newarray[i] = array[i];
00081       delete [] array;
00082     }
00083 
00084   array = newarray;
00085   maxsize = newsize;
00086   realsize = newsize;
00087 }
00088   Array<Type> Union     (const Array<Type> & B) const 
00089 {
00090   int length=0;
00091   int l1=Size();
00092   int l2=B.Size();   
00093   Array<Type> C(l1+l2);
00094   C.Grow(0);
00095 
00096   int i = 0;
00097   for (i=0; i<l1; i++)
00098     {
00099       const Type & var=array[i];
00100       if (C.Member(var)==0)
00101         {
00102           length++;
00103           C.Grow(length);
00104           C[length-1]=var;
00105         }
00106     }
00107   for (i=0; i<l2; i++)
00108     {
00109       const Type & var=B[i];
00110       if (C.Member(var)==0)
00111         {
00112           length++;
00113           C.Grow(length);
00114           C[length-1]=var;
00115         }
00116     }
00117   return C;
00118 }
00119 
00120   Array<Type> Intersect (const Array<Type> & B) const
00121 {
00122   int length = 0;
00123   int l1 = Size();
00124   int l2 = B.Size();
00125   if (l1 < l2)
00126   {
00127     Array<Type> C(l1);
00128     C.Grow(0);
00129     for (int i=0; i<l1; i++)
00130       {
00131         const Type & var = array[i];
00132         if ((C.Member(var)==0) && (B.Member(var)==1))
00133           {
00134             length++;
00135             C.Grow(length);
00136             C[length-1] = var;
00137           }
00138       }
00139     return C;
00140   }
00141   else
00142   {
00143     Array<Type> C(l2);
00144     C.Grow(0);
00145     for (int i=0; i<l2; i++)
00146       {
00147         const Type & var = B[i];
00148         if ((C.Member(var)==0) && (Member(var)==1))
00149           {
00150             length++;
00151             C.Grow(length);
00152             C[length-1] = var;
00153          }
00154       }
00155       return C;
00156     }
00157 }
00158 
00159   int Member (const Type & a) const
00160 {
00161   int l=Size();
00162   for (int i=0; i<l; i++)
00163     if (array[i] == a)
00164       return 1;
00165   return 0;
00166 }
00167 
00168   const Type *Get() const { return array; }
00169   Type *Get() { return array; }
00170 
00171   // ***************** accessors ********************
00172   unsigned int Size() const { return maxsize; }
00173 
00174   public:
00175     int operator==(const Array<Type> &) const
00176 {
00177   assert(0);
00178   /*
00179   if (Size() != rhs.Size())
00180     return 0;
00181   for (unsigned int i=0; i<Size(); i++)
00182   {
00183     const Type & var = array[i];
00184     if (var == rhs[i])   // quick test for sorted arrays
00185       continue;
00186     if (! (rhs.Member(var)) || ! (Member(rhs[i])))
00187         return 0;
00188   }
00189   */
00190   return 1;
00191 }
00192 
00193 
00194 protected:
00195   unsigned int RealSize() const { return realsize; }
00196 
00197 private:
00198   unsigned int realsize;        // actually memory allocation  
00199   unsigned int maxsize;         // maximum size of array 
00200   Type *array;  // array of Type
00201 
00202 };
00203 
00204 
00205 #endif

Generated at Fri Jul 26 18:22:25 2002 for LEMUR by doxygen1.2.4 written by Dimitri van Heesch, © 1997-2000