dcd927717e
Files correlati : Ricompilazione Demo : [ ] Commento : Ristrutturzione delle calssi TVariant e TAlex in modo da renderle completamente indipendenti dalle stampe e dai recordset git-svn-id: svn://10.65.10.50/trunk@12181 c028cbd2-c16b-5b4b-a496-9718f37d4682
324 lines
5.9 KiB
C++
Executable File
324 lines
5.9 KiB
C++
Executable File
#include <xvt.h>
|
|
#include <variant.h>
|
|
|
|
///////////////////////////////////////////////////////////
|
|
// TVariant
|
|
///////////////////////////////////////////////////////////
|
|
|
|
const TVariant NULL_VARIANT;
|
|
|
|
void TVariant::set_null()
|
|
{
|
|
if (_ptr != NULL)
|
|
{
|
|
if (_type != _nullfld && _type != _longfld)
|
|
delete (char *) _ptr;
|
|
_ptr = NULL;
|
|
}
|
|
_type = _nullfld;
|
|
}
|
|
|
|
void TVariant::set(const char* str)
|
|
{
|
|
if (str != NULL)
|
|
{
|
|
if (_type == _alfafld)
|
|
*((TString*)_ptr) = str;
|
|
else
|
|
{
|
|
set_null();
|
|
_type = _alfafld;
|
|
_ptr = new TString(str);
|
|
}
|
|
}
|
|
else
|
|
set_null();
|
|
}
|
|
|
|
void TVariant::set(const real& r)
|
|
{
|
|
if (_type == _realfld)
|
|
*((real*)_ptr) = r;
|
|
else
|
|
{
|
|
set_null();
|
|
_type = _realfld;
|
|
_ptr = new real(r);
|
|
}
|
|
}
|
|
|
|
void TVariant::set(const TDate& d)
|
|
{
|
|
if (_type == _datefld)
|
|
*((TDate*)_ptr) = d;
|
|
else
|
|
{
|
|
set_null();
|
|
_type = _datefld;
|
|
_ptr = new TDate(d);
|
|
}
|
|
}
|
|
|
|
void TVariant::set(const long n)
|
|
{
|
|
if (_type != _longfld)
|
|
set_null();
|
|
_type = _longfld;
|
|
_ptr = (void*)n;
|
|
}
|
|
|
|
bool TVariant::is_zero() const
|
|
{
|
|
switch (_type)
|
|
{
|
|
case _datefld: return !as_date().ok();
|
|
case _longfld: return _ptr == NULL;
|
|
case _realfld: return as_real().is_zero();
|
|
case _alfafld: return real::is_null(as_string());
|
|
default: break;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
bool TVariant::is_empty() const
|
|
{
|
|
if (_type == _alfafld)
|
|
return as_string().empty();
|
|
return is_zero();
|
|
}
|
|
|
|
TDate TVariant::as_date() const
|
|
{
|
|
if (_type == _datefld)
|
|
return *(TDate*)_ptr;
|
|
if (_type == _intfld || _type == _realfld)
|
|
return TDate(as_int());
|
|
return TDate(as_string());
|
|
}
|
|
|
|
long TVariant::as_int() const
|
|
{
|
|
long n = 0;
|
|
switch(_type)
|
|
{
|
|
case _datefld: n = as_date().date2ansi(); break;
|
|
case _longfld: n = (long)_ptr; break;
|
|
case _realfld: n = as_real().integer(); break;
|
|
case _alfafld: n = atoi(as_string()); break;
|
|
default : break;
|
|
}
|
|
return n;
|
|
}
|
|
|
|
bool TVariant::as_bool() const
|
|
{
|
|
bool ok = false;
|
|
if (_type == _alfafld)
|
|
ok = strchr("1XY", as_string()[0]) != NULL;
|
|
else
|
|
ok = as_int() != 0;
|
|
return ok;
|
|
}
|
|
|
|
COLOR TVariant::as_color() const
|
|
{
|
|
const unsigned long rgb = as_int();
|
|
unsigned char r = XVT_COLOR_GET_RED(rgb);
|
|
unsigned char g = XVT_COLOR_GET_GREEN(rgb);
|
|
unsigned char b = XVT_COLOR_GET_BLUE(rgb);
|
|
return MAKE_COLOR(r, g, b);
|
|
}
|
|
|
|
real TVariant::as_real() const
|
|
{
|
|
if (_type == _realfld)
|
|
return *(real*)_ptr;
|
|
switch(_type)
|
|
{
|
|
case _alfafld: return real(as_string()); break;
|
|
case _longfld: return real(as_int()); break;
|
|
default : break;
|
|
}
|
|
return ZERO;
|
|
}
|
|
|
|
bool TVariant::as_string(TString& tmp) const
|
|
{
|
|
tmp.cut(0);
|
|
switch(_type)
|
|
{
|
|
case _alfafld: tmp = *(TString*)_ptr; break;
|
|
case _datefld: tmp = as_date().string(); break;
|
|
case _longfld: tmp << as_int(); break;
|
|
case _realfld: tmp = as_real().string(); break;
|
|
default: break;
|
|
}
|
|
return !is_null();
|
|
}
|
|
|
|
const TString& TVariant::as_string() const
|
|
{
|
|
if (_type == _alfafld)
|
|
return *(TString*)_ptr;
|
|
TString& tmp = get_tmp_string();
|
|
as_string(tmp);
|
|
return tmp;
|
|
}
|
|
|
|
void TVariant::convert_to(TFieldtypes ft)
|
|
{
|
|
if (_type != ft)
|
|
{
|
|
switch (ft)
|
|
{
|
|
case _alfafld: set(as_string()); break;
|
|
case _datefld: set(as_date()); break;
|
|
case _longfld: set(as_int()); break;
|
|
case _realfld: set(as_real()); break;
|
|
default : set_null(); break;
|
|
}
|
|
}
|
|
}
|
|
|
|
void TVariant::copy(const TVariant& var)
|
|
{
|
|
switch (var._type)
|
|
{
|
|
case _datefld: set(var.as_date()); break;
|
|
case _longfld: set(var.as_int()); break;
|
|
case _realfld: set(var.as_real()); break;
|
|
case _alfafld: set(var.as_string()); break;
|
|
default : set_null(); break;
|
|
}
|
|
}
|
|
|
|
int TVariant::compare(const TSortable& s) const
|
|
{
|
|
const TVariant& var = (const TVariant&)s;
|
|
int cmp = 0;
|
|
switch (_type)
|
|
{
|
|
case _datefld: cmp = as_date() - var.as_date(); break;
|
|
case _longfld: cmp = as_int() - var.as_int(); break;
|
|
case _realfld:
|
|
{
|
|
const real n = as_real() - var.as_real();
|
|
cmp = n.sign();
|
|
}
|
|
break;
|
|
case _alfafld: cmp = as_string().compare(var.as_string()); break;
|
|
default : cmp = var.is_null() ? 0 : -1;
|
|
}
|
|
return cmp;
|
|
}
|
|
|
|
TVariant& TVariant::add(const TVariant& var)
|
|
{
|
|
switch (_type)
|
|
{
|
|
case _datefld: set(as_date() + var.as_int()); break;
|
|
case _longfld: set(as_int() + var.as_int()); break;
|
|
case _alfafld: *(TString*)_ptr << var.as_string(); break;
|
|
case _realfld: *(real*)_ptr += var.as_real(); break;
|
|
default: copy(var); break;
|
|
}
|
|
return *this;
|
|
}
|
|
|
|
TVariant& TVariant::sub(const TVariant& var)
|
|
{
|
|
switch (_type)
|
|
{
|
|
case _datefld: set(as_date() - var.as_int()); break;
|
|
case _longfld:
|
|
if (var.type() == _longfld)
|
|
{
|
|
set(as_int() - var.as_int());
|
|
break;
|
|
}
|
|
// Fall down
|
|
default:
|
|
{
|
|
real n = as_real();
|
|
n -= var.as_real();
|
|
set(n);
|
|
}
|
|
break;
|
|
}
|
|
return *this;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////
|
|
// TVariant_stack
|
|
///////////////////////////////////////////////////////////
|
|
|
|
TVariant& TVariant_stack::peek(int depth)
|
|
{
|
|
const int sp = _sp-depth-1;
|
|
return sp >= 0 ? (TVariant&)_var[sp] : (TVariant &)NULL_VARIANT;
|
|
}
|
|
|
|
bool TVariant_stack::drop()
|
|
{
|
|
if (_sp > 0)
|
|
{
|
|
_sp--;
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
TVariant& TVariant_stack::pop()
|
|
{
|
|
TVariant& var = peek(0);
|
|
drop();
|
|
return var;
|
|
}
|
|
|
|
void TVariant_stack::roll(int depth)
|
|
{
|
|
const int sp = _sp-depth-1;
|
|
if (sp >= 0)
|
|
{
|
|
TObject* var = _var.remove(sp, true);
|
|
_var.insert(var, _sp-1);
|
|
}
|
|
}
|
|
|
|
void TVariant_stack::push(const TVariant& var)
|
|
{
|
|
if (_var.objptr(_sp) == NULL)
|
|
_var.add(var, _sp);
|
|
else
|
|
(TVariant&)_var[_sp] = var;
|
|
_sp++;
|
|
}
|
|
|
|
void TVariant_stack::push(long n)
|
|
{
|
|
const TVariant var(n);
|
|
push(var);
|
|
}
|
|
|
|
void TVariant_stack::push(const real& n)
|
|
{
|
|
const TVariant var(n);
|
|
push(var);
|
|
}
|
|
|
|
void TVariant_stack::push(const char* str)
|
|
{
|
|
const TVariant var(str);
|
|
push(var);
|
|
}
|
|
|
|
void TVariant_stack::reset()
|
|
{
|
|
_sp = 0;
|
|
}
|
|
|
|
bool TVariant_stack::overflow() const
|
|
{
|
|
return _sp > 2048;
|
|
}
|