guy 6bac6177c4 Patch level : 2.0 nopatch
Files correlati     :
Ricompilazione Demo : [ ]
Commento            :

Aggiunte utili per gestione dizionario
assoc.cpp    Aggiunta possibilita' di selezionare un elemento causale di un assoc
controls.cpp Corretta gestione scrollbar dei listbox
diction.cpp  Migliorata selezione caratteri da trimmare dalle traduzioni
isam.cpp     Corretto azzeramento dei memo (non azzerava il TString_array corrispondente)
msksheet.cpp Resa personalizzabile la larghezza della colonna col numero di riga
netsock.cpp  Migliorata gestione "a capo" in protocollo soap
progind.cpp  Corretto posizionamento progind sovrapposte
relapp.cpp   Cambiato un messaggio di richiesta annullamento


git-svn-id: svn://10.65.10.50/trunk@11651 c028cbd2-c16b-5b4b-a496-9718f37d4682
2003-12-03 09:41:16 +00:00

183 lines
5.8 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
virtual ~THash_object();
};
// @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
{
// @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 _bucket;
// @access Protected member
protected:
TArray& bucket(int index);
// @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 un puntatore ad un THash_object casuale (anche NULL)
THash_object* random_hash_object();
// @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(); }
};
class TCache : public TObject
{
TArray _data;
protected:
virtual void discarding(const THash_object* obj);
virtual TObject* key2obj(const char* key) pure;
public:
TObject* objptr(const TString& key);
TObject* objptr(size_t nkey);
void destroy(); // Not very useful, but who knows?
TCache(size_t size = 0); // 883 assigned by default
virtual ~TCache();
};
#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()) != NULL, __obj && (__key = __obj->key()) != NULL); \
__obj = __ass.get_hashobj())
#define FOR_EACH_ASSOC_OBJECT(__ass, __obj, __key, __itm) \
const char *__key; TObject* __itm; __ass.restart(); \
for (THash_object* __obj = __ass.get_hashobj(); \
__obj && (__itm = &__obj->obj()) != NULL, __obj && (__key = __obj->key()) != NULL; \
__obj = __ass.get_hashobj())
#endif