//
//suxiaojack 2011.05
//pack any struct and class instance object to MemBlock
//for visual studio 6 C++
//if you have some changes ,please Notify suxiaojack@163.com ,Thanks!
class DataHolderInterface
{
public:
//DataHolderInterface(){};
virtual ~DataHolderInterface(){};
virtual DataHolderInterface* clone(){return NULL;};
virtual const std::type_info& type(){return typeid(void);};
};
template <typename T>
class DataHolder:public DataHolderInterface
{
DataHolder();
public:
DataHolder(T d);
T data;
virtual ~DataHolder();
DataHolderInterface* clone();
virtual const std::type_info& type();
};
template <typename T>
const std::type_info& DataHolder<T>::type(){return typeid(T);};
template <typename T>
DataHolderInterface* DataHolder<T>::clone(){return new DataHolder<T>(data);};
template <typename T>
DataHolder<T>::DataHolder(T d){data=d;};
template <typename T>
DataHolder<T>::DataHolder(){};
template <typename T>
DataHolder<T>::~DataHolder(){};
//
template <typename T> struct TypeWapper{};
#define AS(type) TypeWapper<type>()
//
//使用MemBlock,默认初始化个对象MemBlock mb;
//然后再用等于符号赋值mb=any_value;
//取出时采用type value=mb.get(AS(type));
//取值前用mb.empty()测试一下最好.
class MemBlock
{
DataHolderInterface* pdataHolder;
public:
MemBlock():pdataHolder(NULL){
pdataHolder=NULL;
};
MemBlock(const MemBlock& a):pdataHolder(NULL){
if(a.pdataHolder!=NULL)
pdataHolder=a.pdataHolder->clone();
}
~MemBlock(){
reset();
};
void reset(){
if(pdataHolder!=NULL)
{
delete pdataHolder;
pdataHolder=NULL;
}
};
template <typename T>
MemBlock& operator=(const T& v){
reset();
pdataHolder = new DataHolder<T>((T)v);
return *this;
};
template<>
MemBlock& operator=(const MemBlock& a){
reset();
pdataHolder=a.pdataHolder->clone();
return *this;
};
template <typename T>
T get(TypeWapper<T>){
if(pdataHolder!=NULL&&pdataHolder->type()==typeid(T))
return (reinterpret_cast<DataHolder<T>*>(pdataHolder))->data;
else
{
#ifdef _DEBUG
AfxTrace("!!MemBlock get Failed!!Want %s type data,but %s./n",typeid(T).name(),pdataHolder->type().name());
#endif
return T();
}
};
//test ok?
bool empty(){
return pdataHolder==NULL;
};
};