Main Page Class Hierarchy Compound List File List Compound Members File Members

NArray.h

Go to the documentation of this file.
00001 /*
00002 File: NArray.h
00003 
00004 Function: Defines an array type that manages its own storage space,
00005 and can be used as a stack or a list.
00006 This is the sister of the array class -- it, so
00007 it doesn't have to be instantiated for every new
00008 data type, at the cost of an extra word of storage.
00009 
00010 Array<> should be used just for standard data types
00011 (char, int, float, double) and NArray for everything else.
00012 
00013 
00014 Author(s): Andrew Willmott
00015 
00016 Copyright: (c) 1995-2000, Andrew Willmott
00017 */
00018 
00019 #ifndef __NArray__
00020 #define __NArray__
00021 
00022 #include <iostream.h>
00023 #include "cl/Basics.h"
00024 #include <stdio.h>
00025 
00026  const Int kFirstNAllocation = 16; 
00027 
00028 
00029 
00030  class NBaseArray
00031 {
00032 public:
00033 inline NBaseArray(UInt32 eltSize);
00034 NBaseArray(UInt32 eltSize, Int size, Int alloc = kFirstNAllocation); 
00035 NBaseArray(const NBaseArray &array);
00036 ~NBaseArray();
00037 
00038 // NBaseArray operators
00039 
00040 inline Int NumItems() const; 
00041 
00042 NBaseArray &operator = (const NBaseArray &array); 
00043 
00044 // Useful for stack implementations
00045 
00046 inline Void Pop(); 
00047 
00048 // List Operations
00049 
00050 Void Clear(); 
00051 
00052 Void PreAllocate(UInt32 numItems);
00053 Void SetSize(Int newSize); 
00054 Void Add(Int n = 1); 
00055 Void Shrink(Int n = 1); 
00056 Void Insert(Int i, Int n = 1); 
00057 Void Delete(Int i, Int n = 1); 
00058 Void ShrinkWrap(); 
00061 Void Append(const NBaseArray &a);
00062 Void SwapWith(NBaseArray &a); 
00063 Void Replace(NBaseArray &a); 
00066 Void MemMap(const Char* filename);
00067 Void WriteFile(const Char *filename);
00068 Void ReadFile(const Char *filename);
00069 
00070 Int FWrite(FILE *file);
00071 Int FRead(FILE *file);
00072 
00073 Void Attach(Void *ptr, Int numItems, Bool shared = false);
00074 
00075  UInt32 EltSize()
00076 { return(eltSize); };
00077 
00078 protected:
00079  Byte *item; 
00080  UInt32 items; 
00081  UInt32 allocated; 
00082  UInt32 eltSize;
00083 
00084 Void Grow();
00085 }; 
00086 
00087 
00088 
00089  #define TMPLArray template<class T>
00090  #define TNArray NArray<T>
00091 
00092  TMPLArray class NArray : public NBaseArray
00099 {
00100 public:
00101  NArray() : NBaseArray(sizeof(T)) {};
00102  NArray(Int size, Int alloc = kFirstNAllocation) :
00103 NBaseArray(sizeof(T), size, alloc) {};
00104 
00105 inline T &operator [] (Int i); 
00106 inline const T &operator [] (Int i) const; 
00107 
00108 inline Void Append(const T &t); 
00109 inline T &Last(); 
00110 
00111 inline T &Top(); 
00112 inline Void Push(const T &t); 
00113 
00114  const T &Item(Int i) const
00115 { return(SELF[i]); };
00116  T &Item(Int i)
00117 { return(SELF[i]); };
00118 
00119 Void ClearTo(const T &t); 
00120  Void Append(const TNArray &a) 
00121 { ((NBaseArray*) this)->Append(a); };
00122 // C++: can't live with it, pass the beer nuts.
00123 
00124 // Low level access
00125 
00126 inline T *Ref() const; 
00127 inline T *Detach(); 
00129 };
00130 
00131 TMPLArray ostream &operator << (ostream &s, TNArray &array);
00132 TMPLArray istream &operator >> (istream &s, TNArray &array);
00133 
00134 
00135 // --- Inlines ----------------------------------------------------------------
00136 
00137 
00138  inline NBaseArray::NBaseArray(UInt32 es) 
00139 : items(0), item(0), allocated(0), eltSize(es)
00140 {
00141 }
00142 
00143  inline Int NBaseArray::NumItems() const
00144 {
00145 return(items);
00146 }
00147 
00148  inline Void NBaseArray::Pop()
00149 { 
00150 items--;
00151 }
00152 
00153  inline Void NBaseArray::Clear()
00154 { 
00155 items = 0;
00156 allocated = 0;
00157 delete[] item;
00158 item = 0;
00159 }
00160 
00161 TMPLArray inline T &TNArray::operator [] (Int i)
00162 {
00163 CheckRange(i, 0, items, "(NArray::[]) index out of range");
00164 
00165 return(*((T*) (item + i * eltSize)));
00166 }
00167 
00168 TMPLArray inline const T &TNArray::operator [] (Int i) const
00169 {
00170 CheckRange(i, 0, items, "(NArray::[]) index out of range");
00171 
00172 return(*((T*) (item + i * eltSize)));
00173 }
00174 
00175 TMPLArray inline T &TNArray::Top()
00176 {
00177 return(*(((T*) item) + (items - 1)));
00178 }
00179 
00180 TMPLArray inline T &TNArray::Last()
00181 {
00182 return(*(((T*) item) + (items - 1)));
00183 }
00184 
00185 TMPLArray inline Void TNArray::Push(const T &t)
00186 {
00187 if (items >= allocated)
00188 Grow();
00189 
00190 *(((T*) item) + items++) = t;
00191 }
00192 
00193 TMPLArray inline Void TNArray::ClearTo(const T &t)
00194 {
00195 for (Int i = 0; i < items; i++)
00196 *(((T*) item) + i) = t;
00197 }
00198 
00199 TMPLArray inline Void TNArray::Append(const T &t)
00200 {
00201 if (items >= allocated)
00202 Grow();
00203 
00204 *(((T*) item) + items++) = t;
00205 }
00206 
00207 TMPLArray inline T *TNArray::Ref() const
00208 {
00209 return((T*) item);
00210 }
00211 
00212 TMPLArray inline T *TNArray::Detach()
00213 {
00214 T* result = (T*) item;
00215 
00216 items = 0;
00217 allocated = 0;
00218 item = 0;
00219 
00220 return(result);
00221 }
00222 
00223 // --- I/O --------------------------------------------------------------------
00224 
00225 // XXX convert these to generic NBaseArray routine with the stream
00226 // function handed in
00227 
00228  TMPLArray ostream &operator << (ostream &s, TNArray &array)
00229 { 
00230 Int i;
00231 Char sepChar;
00232 
00233 s << '[';
00234 if (array.NumItems() >= 16)
00235 sepChar = '\n';
00236 else
00237 sepChar = ' ';
00238 
00239 if (array.NumItems() > 0)
00240 {
00241 s << array[0];
00242 
00243 for (i = 1; i < array.NumItems(); i++)
00244 s << sepChar << array[i];
00245 }
00246 
00247 s << ']';
00248 
00249 return(s);
00250 }
00251 
00252  TMPLArray istream &operator >> (istream &s, TNArray &array)
00253 {
00254 Char c;
00255 
00256 // Expected format: [a b c d ...]
00257 
00258 while (isspace(s.peek())) // chomp white space
00259 s.get(c);
00260 
00261 if (s.peek() == '[') 
00262 {
00263 s.get(c);
00264 array.Clear();
00265 
00266 while (isspace(s.peek())) // chomp white space
00267 s.get(c);
00268 
00269 while (s.peek() != ']')
00270 { 
00271 array.Add(1);
00272 s >> array.Top(); // read an item
00273 
00274 if (!s)
00275 {
00276 _Warning("Couldn't read array component");
00277 return(s);
00278 }
00279 
00280 while (isspace(s.peek())) // chomp white space
00281 s.get(c);
00282 } 
00283 s.get(c);
00284 }
00285 else
00286 {
00287 s.clear(ios::failbit);
00288 _Warning("Error: Expected '[' while reading array");
00289 return(s);
00290 }
00291 
00292 return(s);
00293 }
00294 
00295 
00296 #endif

Generated at Sat Aug 5 00:16:32 2000 for Class Library by doxygen 1.1.0 written by Dimitri van Heesch, © 1997-2000

AltStyle によって変換されたページ (->オリジナル) /