/* ptaulukk.h */ /****************************************************************************/ /* ** P T A U L U K K . H ** ** Yleisen osoitin taulukko-luokan toteutus perimällä luokka cPerusTaulukko ** ** Tekijät: Vesa Lappalainen ** Ohjelmointikurssi 1996 ** Tehty: 04.02.1996 ** Muutettu: ** Mitä muutettu: ** ** cPTaulukko - luokan käyttö on järkevää silloin, kun alkiot ovat suuria. ** Näin taulukossa mahdollisesti oleva hukkatila ei haittaa ** suhteessa käytössä oleviian alkiohin. Seuraava käyttöesimerkissä ** alkiot ovat kokonaislukuja. Tässä tapauksessa olisi ollut tietysti ** järkevämpi käyttää luokkaa cTaulukko. ** ** Käyttö esimerkki: ** ================= ** ** cPTaulukko luvut(7); ** luvut.lisaa(10); ** luvut.lisaa(20); ** luvut.lisaa(175); ** for (int i=0; i| | ** | 3 | alkiot * | | | ------ ** | o--+------>|-----| | ------ | 20 | ** ------ | o--+-----| | | ** |-----| |----->| | ** | o--+------------| ------ ------ ** |-----| | 175| ** | o--+--------------------------->| | ** |-----| | | ** | o--+--? ------ ** |-----| ** | o--+--? ** |-----| ** | o--+--? ** |-----| ** | o--+--? ** |-----| ** ** *****************************************************************************/ #ifndef __PTAULUKK_H #define __PTAULUKK_H #include "taulukko.h" //---------------------------------------------------------------------------- // Vakiota //---------------------------------------------------------------------------- #define EI_SAA_ALKIOTA "Ei saada tilaa uudelle alkiolle" //---------------------------------------------------------------------------- // Taulukon määrittely ja käsittely: //---------------------------------------------------------------------------- template class cPTaulukko : public cPerusTaulukko { protected: cTYPE virhealkio; virtual void poista_alkiot(); public: cPTaulukko(int koko=0) : cPerusTaulukko(koko) {; } virtual const char *lisaa(const cTYPE &alkio); virtual const char *korvaa(int i,const cTYPE &alkio); virtual const cTYPE &anna(int i) const; virtual cTYPE *tee_uusi(const cTYPE &uusi) { return new cTYPE(uusi); } }; //---------------------------------------------------------------------------- template inline const cTYPE &cPTaulukko::anna(int i) const { if ( i < 0 || alkioita <= i ) i = alkioita-1; // Väärästä viimeinen alkio if ( i < 0 ) return virhealkio; // Paitsi jollei ole yhtään return *alkiot[rajoihin(i)]; } //---------------------------------------------------------------------------- template inline const char *cPTaulukko::lisaa(const cTYPE &uusi) /* ** Lisätään uusi alkio taulukkoon. EI tarkisteta esiintyykö ** jo ennestään. Mikäli tilaa ei ole, yritetään allokoida uutta ** tilaa 50% maksimimäärään nähden lisää. ** ** Algoritmi: Jos uudelle alkiolle saadaan varattua tilaa, lisätään ** uuden paikan osoite taulukkoon ja kopioidaan tiedot ** uuteen paikkaan. ----------------------------------------------------------------------------*/ { const char *virhe = NULL; if ( alkioita >= max_alkioita && ( virhe = kasvata_kokoa() ) != NULL ) return virhe; cTYPE *uusi_alkio = tee_uusi(uusi); if ( uusi_alkio == NULL ) return EI_SAA_ALKIOTA; muutettu = 1; alkiot[alkioita] = uusi_alkio; alkioita++; return NULL; } //---------------------------------------------------------------------------- template void cPTaulukko::poista_alkiot() { for (int i=0; i inline const char *cPTaulukko::korvaa(int i,const cTYPE &alkio) /* ** Korvataan paikassa i oleva alkio uudella alkiolla. ----------------------------------------------------------------------------*/ { if ( ulkona(i) ) return LAITON_INDEKSI; if ( *alkiot[i] == alkio ) return 0; muutettu = 1; *alkiot[i] = alkio; return NULL; } #endif