iphreeqc/CVar.hxx
Darth Vader 05d97e8baf Squashed 'src/' changes from c0e62935..25f24721
25f24721 fixed compiler warnings except NAN
3f24bf17 moved enum to RMVARS.h
54045123 changed all double precision to real(kind=8) in all files. Compiles and runs test cases.

git-subtree-dir: src
git-subtree-split: 25f2472130c22c1a63e15f0fa58f1021c83a7b4a
2023-04-10 02:31:55 +00:00

163 lines
2.6 KiB
C++

#ifndef INC_CVAR_HXX
#define INC_CVAR_HXX
#include "Var.h"
#include <ostream> // std::ostream
class CVar : public VAR
{
// Constructors
public:
CVar(void) throw()
{
::VarInit(this);
}
~CVar(void) //throw()
{
Clear();
}
CVar(const VAR& varSrc)
{
this->type = TT_EMPTY;
InternalCopy(&varSrc);
}
CVar(const CVar& varSrc)
{
this->type = TT_EMPTY;
InternalCopy(&varSrc);
}
CVar(double dblSrc) throw()
{
this->type = TT_DOUBLE;
this->dVal = dblSrc;
}
CVar(const char* pszSrc)
{
this->type = TT_EMPTY;
*this = pszSrc;
}
CVar(long nSrc) throw()
{
this->type = TT_LONG;
this->lVal = nSrc;
}
// Assignment Operators
public:
CVar& operator=(const CVar& varSrc)
{
InternalCopy(&varSrc);
return *this;
}
CVar& operator=(const VAR& varSrc)
{
InternalCopy(&varSrc);
return *this;
}
CVar& operator=(double dblSrc) throw()
{
if (type != TT_DOUBLE)
{
Clear();
type = TT_DOUBLE;
}
this->dVal = dblSrc;
return *this;
}
CVar& operator=(const char* pszSrc)
{
Clear();
this->type = TT_STRING;
this->sVal = ::VarAllocString(pszSrc);
if (this->sVal == NULL && pszSrc != NULL)
{
this->type = TT_ERROR;
this->vresult = VR_OUTOFMEMORY;
}
return *this;
}
friend std::ostream& operator<< (std::ostream &os, const CVar &a);
// Operations
public:
VRESULT Clear(void) { return ::VarClear(this); }
VRESULT Copy(const VAR* pSrc) { return ::VarCopy(this, const_cast<VAR*>(pSrc)); }
// Implementation
public:
VRESULT InternalClear()
{
VRESULT vr = Clear();
if (vr != VR_OK)
{
this->type = TT_ERROR;
this->vresult = vr;
}
return vr;
}
void InternalCopy(const VAR* pSrc)
{
VRESULT vr = Copy(pSrc);
if (vr != VR_OK)
{
this->type = TT_ERROR;
this->vresult = vr;
}
}
};
inline std::ostream& operator<< (std::ostream &os, const CVar &a)
{
switch (a.type) {
case TT_EMPTY:
os << "(TT_EMPTY)";
break;
case TT_ERROR:
switch (a.vresult) {
case VR_OK:
os << "VR_OK";
break;
case VR_OUTOFMEMORY:
os << "VR_OUTOFMEMORY";
break;
case VR_BADVARTYPE:
os << "VR_BADVARTYPE";
break;
case VR_INVALIDARG:
os << "VR_INVALIDARG";
break;
case VR_INVALIDROW:
os << "VR_INVALIDROW";
break;
case VR_INVALIDCOL:
os << "VR_INVALIDCOL";
break;
}
os << "(TT_ERROR)";
break;
case TT_LONG:
os << a.lVal;
os << "(TT_LONG)";
break;
case TT_DOUBLE:
os << a.dVal;
os << "(TT_DOUBLE)";
break;
case TT_STRING:
os << "\"" << a.sVal << "\"";
os << "(TT_STRING)";
break;
default:
os << "(BAD)";
break;
}
return os;
}
#endif // INC_CVAR_HXX