⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cvariant.cpp

📁 很好用的数据库连接组件
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include "stdafx.h"#include "CVariant.h"# if defined(_REENTRANT)static MyMutexPool zc_thread_mutexpool;# endifstatic string i_temp  = "" ;static const int ntypes = 12;//支持的类型数//类型对应的名字static const char *const type_map[ntypes] = {  0,  "bool",  "ushort",  "short",  "uint",  "int",  "ulong",  "long",  "float",  "double",  "char*" ,  "mydate"};CVariant::Private::Private ()//私有类的空构造函数{  typ = CVariant::Invalid;//将类型置为无效类型}CVariant::Private::Private (Private * d)//根据参数d的类型和值对当前类对象进行初始化{  switch (d->typ)  {  case CVariant::Invalid://无效类型    break;  case CVariant::Bool://Bool类型    value.b = d->value.b;//记录Bool值    break;  case CVariant::UShort://UShort类型    value.us = d->value.us;//记录UShort值    break;  case CVariant::Short://Short类型    value.s = d->value.s;//记录Short值    break;  case CVariant::UInt://UInt类型    value.ui = d->value.ui;//记录UInt值    break;    case CVariant::Int://Int类型    value.i = d->value.i;//记录Int值    break;  case CVariant::ULong://ULong类型    value.ul = d->value.ul;//记录ULong值    break;  case CVariant::Long://Long类型    value.l = d->value.l;//记录Long值    break;  case CVariant::Float://Float类型    value.f = d->value.f;//记录Float值    break;    case CVariant::Double://Double类型    value.d = d->value.d;//记录Double值    break;  case CVariant::Pchar://Pchar类型    value.ptr = new char [strlen ((char *) (d->value.ptr)) + 1];//分配字符串所需内存    strcpy ((char *) (value.ptr), (char *) (d->value.ptr));//拷贝字符串    break;  case CVariant::mydate:    value.date = new CDate_T(*(d->value.date)) ;    break;  }  typ = d->typ;//类型拷贝}CVariant::Private::~Private (){  clear ();//清除数据}voidCVariant::Private::clear (){  switch (typ)  {  case CVariant::Pchar:    delete[]value.ptr;//释放字符串内存    value.ptr=NULL;    break;  case CVariant::mydate:    delete value.date;//释放字符串内存    value.date=NULL;    break;  case CVariant::Invalid:  case CVariant::Bool:  case CVariant::UShort:  case CVariant::Short:  case CVariant::UInt:  case CVariant::Int:  case CVariant::ULong:  case CVariant::Long:  case CVariant::Float:  case CVariant::Double:    break;  }}CVariant::CVariant (const CVariant & p)//拷贝构造{  # if defined(_REENTRANT)  ZcMutexLocker locker (zc_thread_mutexpool.get (d));  # endif  p.d->ref ();//增加当前值的引用  d = p.d;//记录值地址}CVariant::CVariant ()//空构造{  d = new Private;//构造私有类  d->typ = Invalid;//类型为无效类型}//用bool型构造CVariant类型CVariant::CVariant (bool val){  d = new Private;//构造私有类  d->typ = Bool;//类型为Bool  d->value.b = val;//拷贝值}//用unsigned short  类型构造CVariant类型CVariant::CVariant (unsigned short val){  d = new Private;//构造私有类  d->typ = UShort;//类型为UShort  d->value.us = val;//拷贝值}//用short类型构造CVariant类型CVariant::CVariant (short val){  d = new Private;//构造私有类  d->typ = Short;//类型为Int  d->value.s = val;//拷贝值}//用unsigned int 类型构造CVariant类型CVariant::CVariant (unsigned int val){  d = new Private;//构造私有类  d->typ = UInt;//类型为UInt  d->value.ui = val;//拷贝值}//用int 类型构造CVariant类型CVariant::CVariant (int val){  d = new Private;//构造私有类  d->typ = Int;//类型为Int  d->value.i = val;//拷贝值}//用unsigned long 类型构造CVariant类型CVariant::CVariant (unsigned long val){  d = new Private;//构造私有类  d->typ = ULong;//类型为ULong  d->value.ul = val;//拷贝值}//用Long 类型构造CVariant类型CVariant::CVariant (long val){  d = new Private;//构造私有类  d->typ = Long;//类型为Long  d->value.l = val;//拷贝值}//用float 类型构造CVariant类型CVariant::CVariant (float val){  d = new Private;//构造私有类  d->typ = Float;//类型为Float  d->value.f = val;//拷贝值}//用double构造CVariant类型CVariant::CVariant (double val){  d = new Private;//构造私有类  d->typ = Double;//类型为Double  d->value.d = val;//拷贝值}//用字符串构造CVariant类型CVariant::CVariant (const char *val){  d = new Private;//构造私有类  d->typ = Pchar;//类型为Pchar  if(val!=NULL)  {    d->value.ptr = new char [ strlen (val) + 1 ];//分配内存    strcpy ((char *) (d->value.ptr), val);//字符串拷贝  }  else  {    d->value.ptr = NULL;  }}CVariant::CVariant (const CDate_T & val){  d = new Private;//构造私有类  d->typ = mydate;//类型为Pchar  d->value.date = new CDate_T( val );}CVariant::~CVariant (){  # if defined(_REENTRANT)  ZcMutexLocker locker (zc_thread_mutexpool.get (d));  # endif  if (d->deref ())//如果只有一个(自己)引用  {    delete d;//析构私有类    d=NULL;  }}//返回bool型值boolCVariant::toBool () const{  switch (d->typ)  {  case Bool://本身是bool无需转化    return d->value.b;  case UShort://UShort    return d->value.us != 0;    case Short://Short    return d->value.s != 0;  case UInt://UInt    return d->value.ui != 0;  case Int://Int    return d->value.i != 0;  case ULong://ULong    return d->value.ul != 0;  case Long://Long    return d->value.l != 0;  case Float://Float    return d->value.f != 0.0;//值为0.0则返回false    case Double://double    return d->value.d != 0.0;//值为0.0则返回false  default:    return false;////返回false  }}unsigned short CVariant::toUShort (bool * ok) const{  if (ok)    *ok = canCast (UShort);//是否能够转化  char * tmp;  switch (d->typ)//不同类型不同处理  {  case Bool:    return (unsigned short) d->value.b;	  case UShort:    return d->value.us;  case Short:    return (unsigned short) d->value.s;  case UInt:    return (unsigned short) d->value.ui;  case Int:    return (unsigned short) d->value.i;  case ULong:    return (unsigned short)d->value.ul;  case Long:    return (unsigned short) d->value.l;  case Float:    return (unsigned short) d->value.f;    case Double:    return (unsigned short) d->value.d;  case Pchar:    return (unsigned short) strtol ((const char *) (d->value.ptr), &tmp, 10);  default:    return 0;  }}shortCVariant::toShort (bool * ok) const{  if (ok)    *ok = canCast (Short);//是否能够转化  char *tmp;  switch (d->typ)//不同类型不同处理  {  case Bool:    return (short) d->value.b;	  case UShort:    return (short) d->value.us;  case Short:    return d->value.s;  case UInt:    return (short) d->value.ui;  case Int:    return (short) d->value.i;  case ULong:    return (short) d->value.ul;  case Long:    return (short) d->value.l;      case Float:    return (short) d->value.f;    case Double:    return (short) d->value.d;  case Pchar:    return (short) strtol ((const char *) (d->value.ptr), &tmp, 10);  default:    return 0;  }}unsigned int CVariant::toUInt (bool * ok) const{  if (ok)    *ok = canCast (UInt);//是否能够转化  char * tmp;  switch (d->typ)//不同类型不同处理  {  case Bool:    return (unsigned int) d->value.b;  case UShort:    return (unsigned int)d->value.us;  case Short:    return (unsigned int) d->value.s;  case UInt:    return d->value.ui;  case Int:    return (unsigned int) d->value.i;      case ULong:    return (unsigned int)d->value.ul;  case Long:    return (unsigned int) d->value.l;  case Float:    return (unsigned int) d->value.f;    case Double:    return (unsigned int) d->value.d;  case Pchar:    return (unsigned int) strtol ((const char *) (d->value.ptr), &tmp, 10);  default:    return 0;  }}intCVariant::toInt (bool * ok) const{  if (ok)    *ok = canCast (Int);//是否能够转化  char *tmp;  switch (d->typ)//不同类型不同处理  {  case Bool:    return (int) d->value.b;  case UShort:    return (int) d->value.us;  case Short:    return (int)d->value.s;  case UInt:    return (int) d->value.ui;  case Int:    return d->value.i;      case ULong:    return (int) d->value.ul;  case Long:    return (int) d->value.l;  case Float:    return (int) d->value.f;    case Double:    return (int) d->value.d;  case Pchar:    return (int) strtol ((const char *) (d->value.ptr), &tmp, 10);  default:    return 0;  }}unsigned long CVariant::toULong (bool * ok) const{  if (ok)    *ok = canCast (ULong);//是否能够转化  char * tmp;  switch (d->typ)//不同类型不同处理  {  case Bool:    return (unsigned long) d->value.b;  case UShort:    return (unsigned long) d->value.us;  case Short:    return (unsigned long) d->value.s;  case UInt:    return (unsigned long) d->value.ui;  case Int:    return (unsigned long) d->value.i;  case ULong:    return d->value.ul;  case Long:    return (unsigned long) d->value.l;   case Float:    return (unsigned long) d->value.f;  case Double:    return (unsigned long) d->value.d;  case Pchar:    return (unsigned long) strtol ((const char *) (d->value.ptr), &tmp, 10);  default:    return 0;  }}longCVariant::toLong (bool * ok) const{  if (ok)    *ok = canCast (Long);//是否能够转化  char *tmp;  switch (d->typ)//不同类型不同处理  {  case Bool:    return (long) d->value.b;  case UShort:    return (long) d->value.us;  case Short:    return (long) d->value.s;  case UInt:    return (long) d->value.ui;  case Int:    return (long) d->value.i;      case ULong:    return (long) d->value.ul;  case Long:    return d->value.l;  case Float:    return (long) d->value.f;  case Double:    return (long) d->value.d;  case Pchar:    return (long) strtol ((const char *) (d->value.ptr), &tmp, 10);  default:    return 0;  }}floatCVariant::toFloat (bool * ok) const{  if (ok)    *ok = canCast (Float);//是否能够转化  char *tmp;  switch (d->typ)//不同类型不同处理  {  case Bool:    return (float) d->value.b;  case UShort:    return (float) d->value.us;  case Short:    return (float) d->value.s;  case UInt:    return (float) d->value.ui;  case Int:    return (float) d->value.i;  case ULong:    return (float) d->value.ul;  case Long:    return (float) d->value.l;  case Float:    return d->value.f;  case Double:    return (float)d->value.d;  case Pchar:    return (float) strtod ((const char *) (d->value.ptr), &tmp);  default:    return 0.0;  }}doubleCVariant::toDouble (bool * ok) const{  if (ok)    *ok = canCast (Double);//是否能够转化  char *tmp;  switch (d->typ)//不同类型不同处理  {  case Bool:    return (double) d->value.b;  case UShort:    return (double) d->value.us;  case Short:    return (double) d->value.s;  case UInt:    return (double) d->value.ui;  case Int:    return (double) d->value.i;  case ULong:    return (double) d->value.ul;  case Long:    return (double) d->value.l;      case Float:    return (double) d->value.f;    case Double:    return d->value.d;  case Pchar:    return (double) strtod ((const char *) (d->value.ptr), &tmp);  default:    return 0.0;  }}const char *CVariant::toPchar (bool * ok) const{  # if defined(_REENTRANT)  ZcMutexLocker locker (zc_thread_mutexpool.get (&i_temp));  # endif  if (ok)    *ok = canCast (Pchar);//是否能够转化    char cTemp[64];  switch (d->typ)//不同类型不同处理  {  case UShort:    sprintf (cTemp, "%u", d->value.us);    i_temp = cTemp ;    return i_temp.c_str();  case Short:    sprintf (cTemp, "%d", d->value.s);    i_temp=cTemp;    return i_temp.c_str();  case UInt:    sprintf (cTemp, "%u", d->value.ui);    i_temp=cTemp;    return i_temp.c_str();  case Int:    sprintf (cTemp, "%d", d->value.i);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -