template<class C> void BoaInterface::push(C& ptr,const std::string& fldName,int size){ bool hasName=!fldName.empty(); BoaElement* elem; // Определяем тип преременной. Обрабатываем только известные типы if(typeid(ptr)==typeid(bool)) elem=new BoolBoaElement(&ptr,hasName); else if(typeid(ptr)==typeid(char)) elem=new CharBoaElement(&ptr,hasName); else if(typeid(ptr)==typeid(short)) elem=new ShortBoaElement(&ptr,hasName); else if(typeid(ptr)==typeid(unsigned short)) elem=new ShortBoaElement(&ptr,hasName); else if(typeid(ptr)==typeid(int)) elem=new IntBoaElement(&ptr,hasName); else if(typeid(ptr)==typeid(long)) elem=new IntBoaElement(&ptr,hasName); else if(typeid(ptr)==typeid(unsigned)) elem=new IntBoaElement(&ptr,hasName); else if(typeid(ptr)==typeid(unsigned long)) elem=new IntBoaElement(&ptr,hasName); else if(typeid(ptr)==typeid(bigint)) elem=new BigIntBoaElement(&ptr,hasName); else if(typeid(ptr)==typeid(float)) elem=new FloatBoaElement(&ptr,hasName); else if(typeid(ptr)==typeid(double)) elem=new DoubleBoaElement(&ptr,hasName); else if(typeid(ptr)==typeid(std::string)) elem=new StringBoaElement(&ptr,hasName,size); else if(typeid(ptr)==typeid(BoaDataSet)) elem=new DataSetBoaElement(&ptr,hasName); else if(typeid(ptr)==typeid(BoaBinObject)) elem=new BinaryBoaElement(&ptr,hasName); else if(typeid(ptr)==typeid(BoaDateTime)) elem=new DateTimeBoaElement(&ptr,hasName,size); else if(typeid(ptr)==typeid(BoaBlob)) elem=new BlobBoaElement(&ptr,hasName); else if(strstr(typeid(ptr).name(),"BoaTable")) elem=new TableBoaElement(&ptr,hasName); else elem=new UnknownBoaElement(&ptr,hasName); data.push_back(elem);}
std::vector<BoaElement*> data; // список элементов данных
class BoaElement{public:... // скопировать данные объекта в буфер по адресу ptr virtual int objToBuf(char* ptr) = 0; // скопировать данные из буфера по адресу ptr в объект virtual int bufToObj(char* ptr) = 0;};
int IntBoaElement::objToBuf(char* ptr){ int dataLen=sizeof(int); if(ptr) memcpy(ptr,val,dataLen); return dataLen;}int IntBoaElement::bufToObj(char* ptr){ int dataLen=sizeof(int); memcpy(val,ptr,dataLen); return dataLen;}
push(boolField); push(charField); push(shortField);
C++ (Qt)class iarchive : public archive{...private: QDataStream m_stream;};
C++ (Qt)template <class BaseStream>class iarchive : public archive{...private: BaseStream * m_stream;};
C++ (Qt)class A { ... virtual void ReadWrite( archive & );}; class B : public A { ... virtual void ReadWrite( archive & );};
// записьclass TestRecord : public BoaInterface{public: bool boolField; char charField; short shortField; int intField; TestRecord();};// таблицаtypedef BoaTable<TestRecord> TestTable; // или для элементарных данных inttypedef BoaTable<Bint> TestTable;
C++ (Qt)template <class BaseStream>class iarchive : public archive{...private: BaseStream * m_stream; // Использовать голый указатель во всех местах дурной тон, тем более здесь. ;)};
C++ (Qt)irachive<QDomDocument> ar;
C++ (Qt)virtual void ReadWrite( archive & ar ) { ar & (*this); }
C++ (Qt)class Serialize{public: virtual void ReadWrite( archive &ar ) = 0;}; class A : public Base, public Serialize{public: virtual void ReadWrite( archive &ar );};
C++ (Qt)template <class BaseStream>class TArchive : public archive{ TArchive( BaseStream * stream, int mode ) : m_stream(stream), m_mode(mode) { } template<typename T> TArchive &operator&( T &data ) { switch (m_mode) { case mode_Read: m_stream >> data; break; case mode_Write: m_stream << data; break; } return *this; } private: BaseStream * m_stream; rw_mode m_mode, };