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
1.2.6 written by Dimitri van Heesch,
© 1997-2001