/* 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