From 21e521fb829be98b8a54a2df5afb309c0bb8c09f Mon Sep 17 00:00:00 2001 From: alex Date: Thu, 26 Sep 1996 15:32:16 +0000 Subject: [PATCH] Terminati (spero) i variable records git-svn-id: svn://10.65.10.50/trunk@3677 c028cbd2-c16b-5b4b-a496-9718f37d4682 --- include/varrec.cpp | 152 ++++++++++++++------------------------------- include/varrec.h | 77 ++++++++++++++++++++--- 2 files changed, 115 insertions(+), 114 deletions(-) diff --git a/include/varrec.cpp b/include/varrec.cpp index 7d0acd7a1..c5665e62b 100755 --- a/include/varrec.cpp +++ b/include/varrec.cpp @@ -4,60 +4,13 @@ #include #endif -// @doc INTERNAL -// -// @class TVariable_field | Oggetto campo virtuale -// -// @base public | TObject -class TVariable_field : public TObject - -// @author:(INTERNAL) Sandro - -{ - TVariable_rectype * _rec; - TString _name; - TExpression * _e; - TString _value; - TToken_string * _put_string; - VIRTUAL_GET_FUNCTION _getfunc; - bool _destroy_expression; - -public: - // @access Public Member - // @cmember Duplica il campo - virtual TObject* dup() const; - -// @cmember ritorna il nome del campo - const char * name() const { return _name;} -// @cmember ritorna il valore del campo - TString & get() const; -// @cmember aggiorna il valore del campo utilizzando

- void put(const char * val); -// @cmember azzera il valore del campo - void zero(); -// @cmember il campo non ha formule o funzioni collegate - bool plain() const - { return _e == NULL && _getfunc == NULL;} - -// @ cmember Costruttore con una espressione di calcolo - TVariable_field(const char * name, TVariable_rectype * rec = NULL, const char * expr = "", TTypeexp type = _strexpr); -// @ cmember Costruttore con una funzione - TVariable_field(const char * name, TVariable_rectype * rec, VIRTUAL_GET_FUNCTION getfunc); -// @ cmember Costruttore con una espressione di calcolo - TVariable_field(const char * name, TVariable_rectype * rec, TExpression * expr, TTypeexp type = _strexpr); -// @ cmember Costruttore con un variable_field - TVariable_field(const TVariable_field & f); -// @ cmember Distruttore - ~TVariable_field(); -}; - TVariable_field::TVariable_field( const char * name, // - TVariable_rectype * rec, // const char * expr, // TTypeexp type) // - : _rec(rec), _name(name), _e(NULL) , _getfunc(NULL), - _put_string(NULL), _destroy_expression(TRUE) + : _rec(NULL), _name(name), _e(NULL) , _getfunc(NULL), + _put_string(NULL), _destroy_expression(TRUE), + _in_get(FALSE) { if (expr && *expr) { @@ -68,33 +21,33 @@ TVariable_field::TVariable_field( TVariable_field::TVariable_field( const char * name, // - TVariable_rectype * rec, // VIRTUAL_GET_FUNCTION getfunc) // - : _name(name), _e(NULL) , _rec(rec), _getfunc(getfunc), - _put_string(NULL), _destroy_expression(FALSE) + : _name(name), _e(NULL) , _rec(NULL), _getfunc(getfunc), + _put_string(NULL), _destroy_expression(FALSE), + _in_get(FALSE) { CHECK(_getfunc, "You must pass a valid VIRTUAL_GET_FUNCTION"); } TVariable_field::TVariable_field( const char * name, // - TVariable_rectype * rec, // TExpression * expr, // TTypeexp type) // - : _rec(rec), _name(name), _e(expr) , _getfunc(NULL), - _put_string(NULL), _destroy_expression(FALSE) + : _rec(NULL), _name(name), _e(expr) , _getfunc(NULL), + _put_string(NULL), _destroy_expression(FALSE), + _in_get(FALSE) { } TVariable_field::TVariable_field(const TVariable_field & f) : _rec(f._rec), _name(f._name), _e(NULL) , _getfunc(f._getfunc), - _put_string(NULL), _destroy_expression(f._destroy_expression) + _put_string(NULL), _destroy_expression(f._destroy_expression), + _in_get(FALSE) { if (f._e) _e = (TExpression *) f._e->dup(); if (f._put_string) _put_string = new TToken_string(*f._put_string); - } TVariable_field::~TVariable_field() @@ -110,24 +63,30 @@ TObject* TVariable_field::dup() const } TString & TVariable_field::get() const -{ +{ TString & v = (TString &) _value; - if (_e) + if (dirty()) { - CHECK(_rec, "NULL Record pointer with an expression"); - const int items = _e->numvar(); - for (int i = 0; i < items; i++) - _e->setvar(i, _rec->get(_e->varname(i))); - -// v = _e->type() == _strexpr ? (const char *) (*_e) : ((const real &) (*_e)).string(); - v = *_e; - } - else - if (_getfunc) + if (_in_get) + fatal_box("Recursive get in %s", (const char *) _name); + ((TVariable_field *) this)->_in_get = TRUE; + if (_e) { - CHECK(_rec, "NULL Record pointer with a function"); - v = _getfunc(*_rec); + CHECK(_rec, "NULL Record pointer with an expression"); + const int items = _e->numvar(); + for (int i = 0; i < items; i++) + _e->setvar(i, _rec->get(_e->varname(i))); + v = *_e; } + else + if (_getfunc) + { + CHECK(_rec, "NULL Record pointer with a function"); + v = _getfunc(*_rec); + } + ((TVariable_field *) this)->_in_get = FALSE; + ((TVariable_field *) this)->set_clean(); + } return v; } @@ -222,32 +181,14 @@ void TVariable_rectype::write_memo(isdef * file, const TRecnotype recno) TRectype::write_memo(file, recno); } -TVariable_field * TVariable_rectype::add_field(const char * fieldname, const char * expr, TTypeexp type) -{ - CHECKS(!TRectype::exist(fieldname), "Field already exist ", fieldname); - TVariable_field * f = new TVariable_field(fieldname, this, expr, type); - _virtual_fields.add(fieldname, f, TRUE); - return f; +void TVariable_rectype::add_field(TVariable_field * f) +{ + CHECK(f, "Null field"); + CHECKS(!TRectype::exist(f->name()), "Field already exist ", f->name()); + f->set_rec(this); + _virtual_fields.add(f->name(), f, TRUE); } -TVariable_field * TVariable_rectype::add_field(const char * fieldname, TExpression * expr, - TTypeexp type) -{ - CHECKS(!TRectype::exist(fieldname), "Field already exist ", fieldname); - TVariable_field * f = new TVariable_field(fieldname, this, expr, type); - _virtual_fields.add(fieldname, f, TRUE); - return f; -} - -TVariable_field * TVariable_rectype::add_field(const char * fieldname, VIRTUAL_GET_FUNCTION getfunc) -{ - CHECKS(!TRectype::exist(fieldname), "Field already exist ", fieldname); - CHECK(getfunc, "You must pass a valid VIRTUAL_GET_FUNCTION"); - TVariable_field * f = new TVariable_field(fieldname, this, getfunc); - _virtual_fields.add(fieldname, f, TRUE); - return f; -} - void TVariable_rectype::remove_field(const char * fieldname) { if (fieldname) @@ -259,13 +200,6 @@ void TVariable_rectype::remove_field(const char * fieldname) _virtual_fields.destroy(); } -const char * TVariable_rectype::get_variable_field_names(bool restart) -{ - TVariable_field * f = (TVariable_field *) (restart ? _virtual_fields.first_item() : - _virtual_fields.succ_item()); - return f != NULL ? (const char *) f->name() : NULL; -} - void TVariable_rectype::set_memo_fld( const char * fieldname) { if (fieldname && *fieldname) @@ -344,9 +278,12 @@ const TString & TVariable_rectype::get_str(const char* fieldname) const { TVariable_field * v = (TVariable_field *) _virtual_fields.objptr(s); - if (v == NULL) - v = ((TVariable_rectype *) this)->add_field(s); - v->put(val); + if (v == NULL) + { + v = new TVariable_field(s); + ((TVariable_rectype *) this)->add_field(v); + } + v->force_value(val); } } } @@ -405,6 +342,9 @@ TVariable_rectype & TVariable_rectype::operator =(const TVariable_rectype & rec) { TRectype::operator =(rec); _virtual_fields = rec._virtual_fields; + for (TVariable_field * f = first_variable_field(); + f != NULL; f = succ_variable_field()) + f->set_rec(this); return *this; } diff --git a/include/varrec.h b/include/varrec.h index 2611a4b69..68e5b1697 100755 --- a/include/varrec.h +++ b/include/varrec.h @@ -10,7 +10,6 @@ #endif class TVariable_rectype; -class TVariable_field; // @doc EXTERNAL // @@ -18,6 +17,65 @@ class TVariable_field; // da definire quando non sia sufficente una semplice espressione typedef const char * (*VIRTUAL_GET_FUNCTION)(TVariable_rectype & r); +// @doc EXTERNAL +// +// @class TVariable_field | Oggetto campo virtuale +// +// @base public | TObject +class TVariable_field : public TObject + +// @author:(INTERNAL) Sandro + +{ + TVariable_rectype * _rec; + TString _name; + TExpression * _e; + TString _value; + TToken_string * _put_string; + VIRTUAL_GET_FUNCTION _getfunc; + bool _destroy_expression; + bool _in_get; + +public: + // @access Public Member + // @cmember Duplica il campo + virtual TObject* dup() const; +// @cmember segnala che il campo deve essere ricalcolato + virtual bool dirty() const { return TRUE;} +// @cmember assegna lo stato di campo da ricalcolare + virtual void set_dirty(bool on = TRUE) {} +// @cmember assegna lo stato di campo da non ricalcolare + void set_clean() { set_dirty(FALSE);} +// @cmember assegna il record a cui appartiene il campo + virtual void set_rec(TVariable_rectype * rec) { _rec = rec;} + + +// @cmember ritorna il nome del campo + const char * name() const { return _name;} +// @cmember ritorna il valore del campo + TString & get() const; +// @cmember aggiorna il valore del campo utilizzando

+ void put(const char * val); +// @cmember aggiorna il valore del campo utilizzando

indipendentemente dal tipo del campo variabile + void force_value(const char * val) { _value = val; set_clean(); } +// @cmember azzera il valore del campo + void zero(); +// @cmember il campo non ha formule o funzioni collegate + bool plain() const + { return _e == NULL && _getfunc == NULL;} + +// @ cmember Costruttore con una espressione di calcolo + TVariable_field(const char * name, const char * expr = "", TTypeexp type = _strexpr); +// @ cmember Costruttore con una funzione + TVariable_field(const char * name, VIRTUAL_GET_FUNCTION getfunc); +// @ cmember Costruttore con una espressione di calcolo + TVariable_field(const char * name, TExpression * expr, TTypeexp type = _strexpr); +// @ cmember Costruttore con un variable_field + TVariable_field(const TVariable_field & f); +// @ cmember Distruttore + ~TVariable_field(); +}; + // @doc EXTERNAL @@ -66,11 +124,11 @@ public: virtual void zero(char c = '\0'); // @cmember Assegnazione tra TVariable_rectype e TRectype - virtual TRectype& operator =(const TRectype& rec); + virtual TRectype & operator =(const TRectype& rec); // @cmember Assegnazione tra TVariable_rectype - virtual TVariable_rectype& operator =(const TVariable_rectype& rec); + virtual TVariable_rectype & operator =(const TVariable_rectype& rec); // @cmember Assegnazione tra TRectype const char * - virtual TRectype& operator =(const char* rec); + virtual TRectype & operator =(const char* rec); void set_memo_fld(const char * fieldname); @@ -78,11 +136,14 @@ public: virtual void init_memo(const TRecnotype recno = RECORD_NON_FISICO); virtual void write_memo(isdef * file, const TRecnotype recno); - virtual TVariable_field * add_field(const char * fieldname, const char * expr = "", TTypeexp type = _strexpr); - virtual TVariable_field * add_field(const char * fieldname, TExpression * expr, TTypeexp type = _strexpr); - virtual TVariable_field * add_field(const char * fieldname, VIRTUAL_GET_FUNCTION getfunc); + virtual void add_field(TVariable_field * f); virtual void remove_field(const char * fieldname = NULL); - virtual const char * get_variable_field_names(bool restart = FALSE) ; + + TVariable_field * first_variable_field() { return (TVariable_field *) _virtual_fields.first_item();} + TVariable_field * succ_variable_field() { return (TVariable_field *) _virtual_fields.succ_item();} + TVariable_field * pred_variable_field() { return (TVariable_field *) _virtual_fields.pred_item();} + TVariable_field * last_variable_field() { return (TVariable_field *) _virtual_fields.last_item();} +// virtual const char * get_variable_field_names(bool restart = FALSE) ; // @cmember Costruttore Costruisce un record staccato da un file. // Sarebbe meglio utilizzare una delle altre due