Main Page   Class Hierarchy   Compound List   File List   Compound Members  

mrefarray.h

00001 /***************************************************************************
00002  *   This file is part of the MagiC++ library.                             *
00003  *                                                                         *
00004  *   Copyright (C) 1998-2001 Marko Grönroos <magi@iki.fi>                  *
00005  *                                                                         *
00006  ***************************************************************************
00007  *                                                                         *
00008  *  This library is free software; you can redistribute it and/or          *
00009  *  modify it under the terms of the GNU Library General Public            *
00010  *  License as published by the Free Software Foundation; either           *
00011  *  version 2 of the License, or (at your option) any later version.       *
00012  *                                                                         *
00013  *  This library is distributed in the hope that it will be useful,        *
00014  *  but WITHOUT ANY WARRANTY; without even the implied warranty of         *
00015  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU      *
00016  *  Library General Public License for more details.                       *
00017  *                                                                         *
00018  *  You should have received a copy of the GNU Library General Public      *
00019  *  License along with this library; see the file COPYING.LIB.  If         *
00020  *  not, write to the Free Software Foundation, Inc., 59 Temple Place      *
00021  *  - Suite 330, Boston, MA 02111-1307, USA.                               *
00022  *                                                                         *
00023  ***************************************************************************/
00024 
00025 #ifndef __REFARRAY_H__
00026 #define __REFARRAY_H__
00027 
00029 //                                                                          //
00030 //           ----              _                         /    \             //
00031 //           |   )  ___   __  / \           ___         /      \            //
00032 //           |---  /   ) /   /   \ |/\ |/\  ___| \   | <        >           //
00033 //           | \   |---  +-- |---| |   |   (   |  \  |  \      /            //
00034 //           |  \   \__  |   |   | |   |    \__|   \_/   \    /             //
00035 //                       |                        \_/                       //
00037 
00038 template <class TYPE>
00039 // Sisältää viittauksia, ei oikeita objekteja. Tämän merkitys on lähinnä
00040 // siinä, ettei objekteja destruktoida vektorin tuhoutuessa
00041 class RefArray {
00042   public:
00043     TYPE**  rep;
00044     int     lower, upper, size;
00045 
00046     RefArray    () {
00047         lower   = 0,
00048         upper   = -1,
00049         size    = 0,
00050         rep     = NULL;
00051     }
00052 
00053     // Create the reference array to refer to a real container array
00054     RefArray    (const Array<TYPE>& orig) {
00055         lower   = 0;
00056         upper   = -1;
00057         size    = 0;
00058         rep     = NULL;
00059         operator= (orig);
00060     }
00061 
00062     // Copy constructor
00063     RefArray    (const RefArray<TYPE>& orig) {
00064         lower   = 0;
00065         upper   = -1;
00066         size    = 0;
00067         rep     = NULL;
00068         operator= (orig);
00069     }
00070     
00071     RefArray    (int low, int upp) {
00072         size    = 0;
00073         make (low, upp);
00074     }
00075 
00076     void    make    (int low, int upp) {
00077         PRE (low <= upp);
00078         lower   = low,
00079         upper   = upp,
00080         size    = upper-lower+1;
00081 
00082         delete rep;
00083         rep     = new TYPE* [size];
00084         
00085         for (int i=0; i<size; i++)
00086             rep [i] = NULL;
00087     }
00088 
00089     void    operator=   (const Array<TYPE>& orig) {
00090         make (orig.lower, orig.upper);
00091         for (int i=0; i<size; i++)
00092             rep [i] = (TYPE*) orig.getp (i);
00093     }
00094 
00095     void    operator=   (const RefArray<TYPE>& orig) {
00096         make (orig.lower, orig.upper);
00097         for (int i=0; i<size; i++)
00098             rep [i] = orig.rep[i];
00099     }
00100 
00101     virtual ~RefArray () {
00102         delete rep;
00103     }
00104 
00105     // Tyhjentää vektorin
00106     void    empty   () {
00107         delete rep;
00108         rep = NULL;
00109         size = 0;
00110         upper=lower-1;
00111         //if (rep)
00112         //  for (int i=0;i<size;i++)
00113         //      rep[i] = NULL;
00114     }
00115 
00116     void    add (TYPE* i) {
00117         /* Lis„„ alkion taulukon loppuun, matalakopioi! */
00118         resize (lower, upper+1);
00119         rep[upper-lower] = i;
00120     }
00121 
00122     void    put (TYPE* i, int loc) {
00123         /* Lis„„ alkion annettuun vaikkaan taulukoss, ei kopioi, tuhoaa vanhan */
00124         PRE (i != NULL && loc>= lower && loc<=upper);
00125         delete rep [loc-lower];
00126         rep [loc-lower] = i;
00127     }
00128 
00129     // Palauttaa viittauksen taulukon haluttuun alkioon
00130     TYPE&   operator[]  (int loc) {
00131         PRE (loc>= lower && loc<=upper);
00132         return *rep [loc-lower];
00133     }
00134 
00135     // Edellisen const-versio
00136     const TYPE& operator[]  (int loc) const {
00137         PRE (loc>= lower && loc<=upper);
00138         return *rep [loc-lower];
00139     }
00140 
00141     void    resize  (int low, int upp) {
00142         /* Muuttaa taulukon kokoa, old[lower] = new[lower] */
00143         PRE (low <= upp);
00144         int nsize = upp-low+1;
00145         if (nsize < size) { /* Pienennet„„n */
00146             rep = (TYPE**) renew (rep, sizeof (TYPE*)*(nsize));
00147         } else { /* Suurennetaan */
00148             rep = (TYPE**) renew (rep, sizeof (TYPE*)*(nsize));
00149             for (int i=size; i<nsize; i++)
00150                 rep [i] = NULL;
00151         }
00152         lower   = low,
00153         upper   = upp,
00154         size    = nsize;
00155     }
00156 
00157     // Sorts the references... WOW!
00158     // The contained class MUST inherit Comparable...
00159     void    quicksort   () {
00160         qsort (rep, size, sizeof (TYPE*), compareComparable);
00161     }
00162 };
00163 
00164 #define CRefArray RefArray
00165 
00166 #endif

Generated at Tue Dec 4 19:53:27 2001 for MagiC++ by doxygen1.2.6 written by Dimitri van Heesch, © 1997-2001