guy 42bddb770f array.h Tolta riga vuota
assoc.h     Aggiunta macro di iterazione sugli elementi
golem.h     Aggiunta gestione della posta
golem.cpp   Suvvia c'e' la postaa, la posta eletrronicaaa
mailbox.h   Aggiunto vitrtual davanti al distruttore dei TMessage
msksheet.h  Aggiunte macro di iterazione sulle righe
regexp.h    Tolta #define di NULL
strings.cpp Aggiunti metodi a TFilename:
            is_absolute_path, is_relative_path e make_absolute_path
strings.h   Tolta #include <regexp.h> (-1K nel file .mak)


git-svn-id: svn://10.65.10.50/trunk@5626 c028cbd2-c16b-5b4b-a496-9718f37d4682
1997-11-17 10:28:04 +00:00

161 lines
5.0 KiB
C++
Executable File

#ifndef __ASSOC_H
#define __ASSOC_H
#ifndef __STRINGS_H
#include <strings.h>
#endif
// @doc INTERNAL
// @class THash_object | Classe per la definizione degli elementi di una tabella hash.
//
// @base public | TObject
class THash_object : public TObject
// @author:(INTERNAL) Guido
{
// @cfriend TAssoc_array
friend class TAssoc_array;
// @access:(INTERNAL) Private Member
// @cmember:(INTERNAL) Chiave d'ordinamento
TString _key;
// @cmember:(INTERNAL) Oggetto della tabella da ordinare
TObject* _obj;
// @access Public Member
public:
// @cmember Ritorna la chiave di ordinamento
const TString& key() const
{ return _key; }
// @cmember Ritorna l'oggetto
TObject& obj() const
{ return *_obj; }
// @cmember Costruttore (inizializza la chiave ed opzionalmente l'oggetto)
THash_object(const char* k, TObject* o = NULL) : _key(k), _obj(o)
{}
// @cmember Distruttore
~THash_object()
{ if (_obj != NULL) delete _obj; }
};
// @doc EXTERNAL
// @class TAssoc_array | Tabella hash di oggetti generici
//
// @base public |TObject
class TAssoc_array : public TContainer
// @author:(INTERNAL) Guido
//@access:(INTERNAL) Private Member
{
// @ccost:(INTERNAL) HASH_SIZE | 113 | Dimensione della tabella hash
enum { HASH_SIZE = 113 };
// @cmember:(INTERNAL) Numero di oggetti contenuti nella tabella
word _cnt;
// @cmember:(INTERNAL) Numero di righe della tabella hash
word _row;
// @cmember:(INTERNAL) Numero di colonne della tabella hash
word _col;
// @cmember:(INTERNAL) Numero di righe della tabella hash per i metodi _item
int _rowitem;
// @cmember:(INTERNAL) Numero di colonne della tabella hash per i metodi _item
int _colitem;
// @cmember:(INTERNAL) Array contenente i dati veri e propri
TArray _data[HASH_SIZE];
// @access Protected member
protected:
// @cmember Cerca l'oggetto con chiave k
THash_object* _lookup(const char* k, bool& isnew, bool insert = FALSE);
// @cmember Copia tutto l'array associativo e ne duplica gli elementi
TAssoc_array & copy(const TAssoc_array & a);
// @access Public Member
public:
// @cmember Duplica l'array associativo copiandone gli elementi.
virtual TObject* dup () const { return new TAssoc_array(*this);}
// @cmember Ritorna un puntatore al primo oggetto
virtual TObject* first_item( );
// @cmember Ritorna un puntatore all'ultimo oggetto
virtual TObject* last_item( );
// @cmember Ritorna un puntatore all'oggetto successivo al quello corrente
virtual TObject* succ_item( );
// @cmember Ritorna un puntatore all'oggetto che precede quello corrente
virtual TObject* pred_item( );
// @cmember Ritorna il numero di elementi presenti come long
virtual long objects() { return _cnt; }
// @cmember Ritorna il numero di elementi presenti
int items() const { return _cnt; }
// @cmember Cancella tutti gli elementi
virtual void destroy();
// @cmember Aggiunge un oggetto. Se era gia' presente guarda il parametro force
bool add(const char* key, TObject* obj = NULL, bool force = FALSE);
// @cmember Aggiunge una copia dell'oggetto
bool add(const char* key, const TObject& obj, bool force = FALSE);
// @cmember Elimina un oggetto
bool remove(const char* key);
// @cmember Controlla l'esistenza di una chiave
bool is_key(const char* key) const ;
// @cmember Ritorna l'oggetto con chiave key
TObject* objptr(const char* key) const ;
// @cmember Trova l'oggetto indicizzato
TObject& find(const char* key) const ;
// @cmember Ritorna l'indice del oggetto con chiave key (piu' intuitivo di <mf TAssoc_array::find>)
TObject& operator[] (const char* key) const
{ return find(key); }
// iterazione come TToken_string
// si puo' adoperare get() e get_hashobj() intercambiabilmente ma
// non sono indipendenti (entrambe avanzano gli stessi contatori)
// @cmember Azzera il numero di riga e colonna corrente della tabella hash
void restart()
{ _row = 0; _col = 0; }
// @cmember Ritorna solo l'oggetto
TObject* get();
// @cmember Ritorna l'oggetto e la relativa chiave
THash_object* get_hashobj();
// @cmember Mette chiavi e opzionalmente valori (come stringa) nel <c TString_array> passato
int get_keys(TString_array& kl, bool add_values = FALSE);
// @cmember Operatore di assegnamento tra array associativi
TAssoc_array & operator= (const TAssoc_array & a)
{ return copy(a); }
// @cmember Costruttore
TAssoc_array() : _cnt(0), _row(0), _col(0)
{}
// @cmember Costruttore. Copia tutto l'array associativo e ne duplica gli elementi
TAssoc_array(const TAssoc_array & a) : _cnt(0), _row(0), _col(0)
{ copy(a); }
// @cmember Distruttore
virtual ~TAssoc_array()
{ destroy(); }
};
#define FOR_EACH_ASSOC_STRING(__ass, __obj, __key, __str) \
const char *__key, *__str; __ass.restart; \
for (THash_object* __obj = __ass.get_hashobj(); \
__obj && (__str = (const TString&)__obj->obj(), __key = __obj->key()); \
__obj = __ass.get_hashobj())
#endif