00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #ifndef IXE_metaclass_H
00026 #define IXE_metaclass_H
00027
00028
00029 #include "platform.h"
00030
00031
00032 #include <cassert>
00033 #include <cstdio>
00034 #include <iostream>
00035 #include <vector>
00036 #include <string>
00037 #include <typeinfo>
00038 #include <limits.h>
00039
00040 #if defined(__GNUC__) && __GNUC__ > 2
00041 #include <ext/algorithm>
00042 namespace std {
00043 using __gnu_cxx::copy_n;
00044 }
00045 #else
00046 #include <algorithm>
00047 #endif
00048
00049
00050 #include "include/ixe.h"
00051 #include "include/sql.h"
00052 #include "Common/item.h"
00053 #include "text/Normalizer.h"
00054
00055 namespace IXE {
00056
00066 #if defined(_WIN32) || defined(__DECCXX) || defined(__GNUC__)
00067
00068 #pragma pack(push, 4)
00069 #endif
00070
00071
00072
00073
00079 class Array {
00080 protected:
00081 public:
00082 Array() : len(0) { }
00083
00084 Size len;
00085
00086 Size length() const { return len; }
00087 void const* base() const { return *(void**)(this+1); }
00088 };
00089
00090 template<class T>
00091 class ArrayOf : public Array {
00092 public:
00093 typedef T elementType;
00094
00095 ArrayOf() : data(0) { }
00096
00097 T const& operator [](Size index) const {
00098 assert(index < this->len);
00099 return data[index];
00100 }
00101
00102 ~ArrayOf() { delete [] data; }
00103
00104 T* data;
00105 };
00106
00112 template <class T>
00113 class Indexable {
00114 public:
00115 virtual T operator [](int) const = 0;
00116 };
00117
00123 template <class T>
00124 class Reference {
00125 public:
00126 Indexable<T>* table;
00127 DocID id;
00128
00129
00130 Reference(DocID id = 0, byte* table = 0) :
00131 table((Indexable<T>*)table), id(id) { }
00132
00133 Reference& operator = (Reference const& ref) {
00134 table = ref.table;
00135 id = ref.id;
00136 return *this;
00137 }
00138
00139
00140 T* operator ->() { return &table[id]; }
00141 };
00142
00143
00144
00145
00146
00147 struct NullType {};
00148 struct TrueType {};
00149
00150
00151 template <class Cond, class Positive, class Negative = NullType>
00152 struct If { typedef Positive VAL; };
00153
00154 template <class Positive, class Negative>
00155 struct If<NullType, Positive, Negative> { typedef Negative VAL; };
00156
00157
00158 template <class T> struct isPointer { typedef NullType VAL; };
00159 template <class T> struct isPointer<T*> { typedef TrueType VAL; };
00160
00161
00162 template <class T> struct isReference { typedef NullType VAL; };
00163 template <class T> struct isReference<Reference<T> > { typedef TrueType VAL; };
00164
00165
00166
00167 template <class T> struct isClass { typedef TrueType VAL; };
00168 template <class T> struct isClass<T*> { typedef NullType VAL; };
00169 template <> struct isClass<bool> { typedef NullType VAL; };
00170 template <> struct isClass<char> { typedef NullType VAL; };
00171 template <> struct isClass<signed char> { typedef NullType VAL; };
00172 template <> struct isClass<short int> { typedef NullType VAL; };
00173 template <> struct isClass<int> { typedef NullType VAL; };
00174 template <> struct isClass<long int> { typedef NullType VAL; };
00175 template <> struct isClass<float> { typedef NullType VAL; };
00176 template <> struct isClass<double> { typedef NullType VAL; };
00177 template <> struct isClass<long double> { typedef NullType VAL; };
00178
00179 template <> struct isClass<unsigned char> { typedef NullType VAL; };
00180 template <> struct isClass<unsigned short int> { typedef NullType VAL; };
00181 template <> struct isClass<unsigned int> { typedef NullType VAL; };
00182 template <> struct isClass<unsigned long int> { typedef NullType VAL; };
00183
00184 template <> struct isClass<const bool> { typedef NullType VAL; };
00185 template <> struct isClass<const char> { typedef NullType VAL; };
00186 template <> struct isClass<const short int> { typedef NullType VAL; };
00187 template <> struct isClass<const int> { typedef NullType VAL; };
00188 template <> struct isClass<const long int> { typedef NullType VAL; };
00189 template <> struct isClass<const float> { typedef NullType VAL; };
00190 template <> struct isClass<const double> { typedef NullType VAL; };
00191 template <> struct isClass<const long double> { typedef NullType VAL; };
00192
00193 template <> struct isClass<const unsigned char> { typedef NullType VAL; };
00194 template <> struct isClass<const unsigned short int> { typedef NullType VAL; };
00195 template <> struct isClass<const unsigned int> { typedef NullType VAL; };
00196 template <> struct isClass<const unsigned long int> { typedef NullType VAL; };
00197
00198 #ifdef _MSC_VER
00199 template <> struct isClass<signed __int64> { typedef NullType VAL; };
00200 template <> struct isClass<unsigned __int64> { typedef NullType VAL; };
00201
00202 template <> struct isClass<const signed __int64> { typedef NullType VAL; };
00203 template <> struct isClass<const unsigned __int64> { typedef NullType VAL; };
00204 #else
00205 template <> struct isClass<signed long long int> { typedef NullType VAL; };
00206 template <> struct isClass<unsigned long long int> { typedef NullType VAL; };
00207
00208 template <> struct isClass<const signed long long int> { typedef NullType VAL; };
00209 template <> struct isClass<const unsigned long long int> { typedef NullType VAL; };
00210 #endif
00211
00212
00213 template <class T> struct isClass<std::vector<T> > { typedef NullType VAL; };
00214 template <> struct isClass<std::string> { typedef NullType VAL; };
00215
00216
00217 template <class T>
00218 struct isArray { typedef NullType VAL; };
00219
00220 template <class T> struct ArrayType { typedef NullType VAL; };
00221
00222 template <class T>
00223 struct isArray<ArrayOf<T> > { typedef TrueType VAL; };
00224 template <class T> struct ArrayType<ArrayOf<T> > { typedef T VAL; };
00225 template <class T> struct ArrayType<std::vector<T> > { typedef T VAL; };
00226
00227 template <class T>
00228 struct isArray<std::vector<T> > { typedef TrueType VAL; };
00229
00230
00231 template <class P> struct deref { typedef NullType VAL; };
00232 template <class T> struct deref<T*> { typedef T VAL; };
00233
00234
00235
00236
00237
00238
00239 #if (__GNUC__ >= 3)
00240
00241
00242
00243
00244
00245 # define offsetOf(type, field) (((size_t)&((type *)8)->field) - 8)
00246 #else
00247 # define offsetOf(type, field) (static_cast<IXE::Size>(((size_t)&((type *)0)->field)))
00248 #endif
00249
00250
00251
00252
00253
00254
00255 #define KEY0(x, varsize, index, merge) \
00256 createField(#x, varsize, offsetOf(_CLASS_, x), &((_CLASS_*)64)->x, index, merge)
00257
00258 #define KEY(x, index) KEY0(x, 0, index, 0)
00259 #define KEYMERGE(x, index, merge) KEY0(x, 0, index, #merge)
00260 #define FIELD(x) KEY0(x, 0, Field::none, 0)
00261 #define VARFIELD(x, varsize) KEY0(x, varsize, Field::none, 0)
00262 #define VARKEY(x, s, index) KEY0(x, s, index, 0)
00263 #define VARKEYMERGE(x, s, index, merge) KEY0(x, s, index, #merge)
00264
00265 #define META(class, fields) \
00266 META_DEFS(class) \
00267 static Field* _createFields() { return &fields; }
00268
00269 #define META_DEFS(class) \
00270 typedef class _CLASS_; \
00271 static void _factory(void* dst) { *(class*)dst = class(); } \
00272 static MetaClass _metaClass; \
00273 \
00274 int _serialize(char* dst) {byte* p=(byte*)dst; return _metaClass.store(p, (byte*)this) - (byte*)dst; } \
00275 \
00276 int _deserialize(char* src) {byte* p=(byte*)src; return _metaClass.fetch((byte*)this, p) - (byte*)src; } \
00277 \
00278 void _clear() { \
00279 for (Field* fd = _metaClass.fields(); fd; fd = fd->next) \
00280 fd->clear((void**)FieldOf(this, fd)); \
00281 } \
00282 virtual MetaClass* metaClass() const { return &_metaClass; }
00283
00284 #define META_DECL(class) \
00285 META_DEFS(class) \
00286 static Field* _createFields();
00287
00288 #define META_DEF(class, fields) \
00289 Field* class::_createFields() { return &fields; }
00290
00291 #define SUPERCLASS(class) (*class::_createFields())
00292
00293 #define CLASS_OF(class) (&class::_metaClass)
00294
00295 #ifdef _MSC_VER
00296 #define REGISTER(class) \
00297 IXE::MetaClass class::_metaClass(#class, \
00298 class::_createFields(), \
00299 sizeof(class), \
00300 class::_factory)
00301 #else
00302 #define REGISTER(class) \
00303 template<> IXE::MetaClass class::_metaClass(#class, \
00304 class::_createFields(), \
00305 sizeof(class), \
00306 class::_factory)
00307 #endif
00308
00314 template <typename T>
00315 class HasMetaClass
00316 {
00317 typedef char one;
00318 typedef struct { char a[2]; } two;
00319
00320 template <typename U> static two test(...);
00321 template <typename U> static one test(typename U::_CLASS_*);
00322 public:
00323 enum { VAL = sizeof(test<T>(0)) == 1 };
00324 };
00325
00326 class MetaClass;
00327
00328 template <typename T, int>
00329 struct MetaClassOf {
00330 static MetaClass* get() { return 0; }
00331 };
00332 template <typename T>
00333 struct MetaClassOf<T, 1> {
00334 static MetaClass* get() { return CLASS_OF(T); }
00335 };
00341 template <typename T>
00342 static MetaClass* classOf() {
00343 return MetaClassOf<T, HasMetaClass<T>::VAL>::get();
00344 }
00345
00354 class Field {
00355 public:
00356
00357 enum Type {
00358 Int,
00359 Float,
00360 String,
00361 Pointer,
00362 Composite,
00363 Date,
00364 Array
00365 };
00366
00367 enum IndexType {
00368 none = 0,
00369 primary,
00370 autoincrement,
00371 mapped,
00372
00373 fulltext = 4,
00374 fulltextMerged = 5,
00375 facet = 6,
00376
00377 indexed = 8,
00378 unique = 9,
00379 uniqueHash = 10
00380 };
00381
00382 Field* next;
00383 char const* name;
00384 std::type_info const* type;
00385 IndexType indexType;
00386 Size offset;
00387 Count position;
00388 char const* merge;
00389 Text::Normalizer* normalizer;
00390
00398 Field(char const* name, Size offset, IndexType indexType,
00399 char const* merge = 0) :
00400 next(0), name(name), indexType(indexType),
00401 offset(offset), position(0), merge(merge),
00402 maxLength_(1), normalizer(0)
00403 {
00404
00405
00406 if (indexType == Field::fulltext && merge)
00407 this->indexType = Field::fulltextMerged;
00408 if (indexType & Field::fulltext)
00409 normalizer = Text::Normalizer::Default;
00410 }
00411
00412 Field() { }
00413
00414 virtual Field* clone() const = 0;
00415
00416 virtual ~Field() { delete next; }
00417
00419 virtual void clear(void** fieldPtr) { if (isPointer()) *fieldPtr = 0; }
00420
00424 virtual Size size() = 0;
00425
00429 virtual inline Size length(byte* base) { return size(); }
00430
00435 Size maxLength_;
00436 inline Size& maxLength() { return maxLength_; }
00437
00445 virtual Size packSize(byte* base) = 0;
00446
00452 virtual std::ostream& print(std::ostream& out) = 0;
00453
00457 virtual bool isType(Type t) {
00458 switch (t) {
00459 case Int:
00460 return (*type == typeid(short) ||
00461 *type == typeid(unsigned short) ||
00462 *type == typeid(int) ||
00463 *type == typeid(unsigned int) ||
00464 *type == typeid(long) ||
00465 *type == typeid(unsigned long));
00466 case Float:
00467 return (*type == typeid(float) ||
00468 *type == typeid(double));
00469 case Date:
00470 return (*type == typeid(int) ||
00471 *type == typeid(time_t));
00472 }
00473 return false;
00474 }
00475
00479 virtual bool isReference() { return false; }
00480
00484 virtual bool isPointer() { return false; }
00485
00489 virtual Item* item() = 0;
00490
00494 virtual MetaClass* itemClass() const { return 0; }
00495
00499 virtual inline Size itemSize() { return 0; }
00500
00509 virtual byte* fetch(byte* dst, byte*& src) = 0;
00510
00519 virtual byte* fetchKey(byte* dst, byte* src) = 0;
00520
00530 virtual byte* store(byte*& dst, byte* src) = 0;
00531
00540 virtual Size storeKey(byte* dst, byte* src) = 0;
00541
00548 virtual void setKey(byte* row, int8 const value) { }
00554 virtual void setKey(byte* row, byte const* value, Size& len,
00555 Size maxLen) {
00556 ::memcpy(row, value, len);
00557 }
00558
00559
00560 Field& operator,(Field& field) {
00561
00562 Field *fd = this;
00563 while (fd->next) fd = fd->next;
00564 fd->next = &field;
00565
00566 return *this;
00567 }
00568
00569
00570 static MetaClass _metaClass;
00571 };
00572
00573 #define FieldOf(obj, fd) ((byte*)(obj) + fd->offset)
00574
00575
00581
00582
00583
00584
00585 class CompositeField : public Field {
00586
00587 public:
00588 CompositeField(char const* name, Size offset, Size fsize,
00589 IndexType indexType, MetaClass* metaClass,
00590 std::type_info const* type, char const* merge = 0) :
00591 Field(name, offset, indexType, merge),
00592 metaClass(metaClass),
00593 fsize(fsize)
00594 {
00595 this->type = type;
00596 }
00597
00598 virtual Field* clone() const { return new CompositeField(*this); }
00599
00601 virtual void clear(void** fieldPtr);
00602
00603 virtual inline Size size() { return fsize; }
00604
00605 virtual Size packSize(byte*);
00606
00607 virtual bool isType(Type t) { return (t == Composite); }
00608
00609 virtual Item* item() { return 0; }
00610
00611 virtual MetaClass* itemClass() const { return metaClass; }
00612
00613 virtual byte* store(byte*& dst, byte* src);
00614 virtual Size storeKey(byte* dst, byte* src) {
00615 return 0;
00616 }
00617
00618 virtual byte* fetch(byte* dst, byte*& src);
00619 virtual byte* fetchKey(byte* dst, byte* src) {
00620 return dst = src;
00621 }
00622
00623 virtual std::ostream& print(std::ostream &out);
00624
00625 protected:
00626
00627 MetaClass* metaClass;
00628 Size fsize;
00629 };
00630
00631
00632
00633
00634
00635 template <Size size>
00636 inline void storeBigEndian(byte* dst, byte* src) { ::memcpy(dst, src, size); }
00637 template <> inline void storeBigEndian<1>(byte* dst, byte* src) {
00638 *dst = *src;
00639 }
00640 template <> inline void storeBigEndian<2>(byte* dst, byte* src) {
00641 #ifdef WORDS_BIGENDIAN
00642
00643
00644
00645 dst[0] = src[0]; dst[1] = src[1];
00646 #else
00647 dst[1] = src[0]; dst[0] = src[1];
00648 #endif
00649 }
00650 template <> inline void storeBigEndian<4>(byte* dst, byte* src) {
00651 #ifdef WORDS_BIGENDIAN
00652 dst[0] = *src++; dst[1] = *src++; dst[2] = *src++; dst[3] = *src;
00653 #else
00654 dst[3] = *src++; dst[2] = *src++; dst[1] = *src++; dst[0] = *src;
00655 #endif
00656 }
00657 #ifndef WORDS_BIGENDIAN
00658 template <> inline void storeBigEndian<8>(byte* dst, byte* src) {
00659 dst[7] = *src++; dst[6] = *src++; dst[5] = *src++; dst[4] = *src++;
00660 dst[3] = *src++; dst[2] = *src++; dst[1] = *src++; dst[0] = *src;
00661 }
00662 #endif
00663
00664
00665
00666
00667
00668 template <int size>
00669 inline void fetchBigEndian(byte* dst, byte* src) {
00670 storeBigEndian<size>(dst, src);
00671 }
00672
00673
00674
00675
00676
00677 template <int size>
00678 inline void storeLittleEndian(byte* dst, byte* src) {
00679 ::memcpy(dst, src, size); }
00680 template <> inline void storeLittleEndian<1>(byte* dst, byte* src) {
00681 *dst = *src; }
00682 template <> inline void storeLittleEndian<2>(byte* dst, byte* src) {
00683 #ifdef WORDS_BIGENDIAN
00684 dst[1] = src[0]; dst[0] = src[1];
00685 #else
00686 # ifdef BYTE_ALIGN
00687 *(ushort*)(dst) = *(ushort*)(src);
00688 # else
00689 dst[0] = src[0]; dst[1] = src[1];
00690 # endif
00691 #endif
00692 }
00693 template <> inline void storeLittleEndian<4>(byte* dst, byte* src) {
00694 #ifdef WORDS_BIGENDIAN
00695 dst[3] = *src++; dst[2] = *src++; dst[1] = *src++; dst[0] = *src;
00696 #else
00697 # ifdef BYTE_ALIGN
00698 *(uint*)(dst) = *(uint*)src;
00699 # else
00700 dst[0] = *src++; dst[1] = *src++; dst[2] = *src++; dst[3] = *src;
00701 # endif
00702 #endif
00703 }
00704 template <> inline void storeLittleEndian<8>(byte* dst, byte* src) {
00705 #ifdef WORDS_BIGENDIAN
00706 dst[7] = *src++; dst[6] = *src++; dst[5] = *src++; dst[4] = *src++;
00707 dst[3] = *src++; dst[2] = *src++; dst[1] = *src++; dst[0] = *src;
00708 #else
00709 # ifdef BYTE_ALIGN
00710 *(ulonglong*)(dst) = *(ulonglong*)(src);
00711 # else
00712 dst[0] = *src++; dst[1] = *src++; dst[2] = *src++; dst[3] = *src++;
00713 dst[4] = *src++; dst[5] = *src++; dst[6] = *src++; dst[7] = *src;
00714 # endif
00715 #endif
00716 }
00717
00718
00719
00720
00721
00722 template <int size>
00723 inline void fetchLittleEndian(byte* dst, byte* src) {
00724 storeLittleEndian<size>(dst, src);
00725 }
00726
00727
00734 template <class T>
00735 class FixedField : public Field {
00736 public:
00737
00738 typedef T value_type;
00739
00740 FixedField(char const* name, Size offset, Size maxLength,
00741 IndexType indexType, char const* merge = 0) :
00742 Field(name, offset, indexType, merge)
00743 {
00744 maxLength_ = 1;
00745 type = &typeid(T);
00746 }
00747
00748 virtual Field* clone() const { return new FixedField<T>(*this); }
00749
00750 virtual MetaClass* itemClass() const { return classOf<T>(); }
00751
00752 virtual inline Size size() { return sizeof(T); }
00753
00754
00755 virtual inline Size length(byte* base) { return size(); }
00756
00757
00758
00759 virtual Size packSize(byte*) { return sizeof(T); }
00760
00761 virtual std::ostream& print(std::ostream& out) {
00762 char buf[128];
00763 sprintf(buf, "%-16s%-14s %2d %4d %4d\n",
00764 name, type->name(), indexType, offset, size());
00765 return out << buf;
00766 }
00767
00768 virtual Item* item() { return new ItemOf<T>(); }
00769
00770 virtual byte* fetch(byte* dst, byte*& src) {
00771
00772 fetchLittleEndian<sizeof(T)>(dst, src);
00773 src += sizeof(T);
00774 return src;
00775 }
00776
00777 virtual byte* fetchKey(byte* dst, byte* src) {
00778
00779 fetchLittleEndian<sizeof(T)>(dst, src);
00780 return dst;
00781 }
00782
00783 virtual byte* store(byte*& dst, byte* src) {
00784 storeLittleEndian<sizeof(T)>(dst, src);
00785 dst += sizeof(T);
00786 return dst;
00787 }
00788
00789 virtual Size storeKey(byte* dst, byte* src) {
00790 storeLittleEndian<sizeof(T)>(dst, src);
00791 return sizeof(T);
00792 }
00793
00794
00795 virtual void setKey(byte* dst, int8 const value) {
00796 # ifdef _MSC_VER
00797 storeLittleEndian<sizeof(T)>(dst, (byte*)&value);
00798 # else
00799 T tmp = (T)value;
00800 storeLittleEndian<sizeof(T)>(dst, (byte*)&tmp);
00801 # endif
00802 }
00803 };
00804
00805 #ifdef _MSC_VER
00806 template <>
00807 void FixedField<int>::setKey(byte* dst, int8 const value) {
00808 int tmp = (int)value;
00809 storeLittleEndian<sizeof(int)>(dst, (byte*)&tmp);
00810 }
00811 #endif
00812
00813
00819
00820
00821 template <class T>
00822 class VarField : public Field {
00823
00824 public:
00825 VarField(char const* name, Size offset, Size maxLength,
00826 IndexType indexType, char const* merge = 0) :
00827 Field(name, offset, indexType, merge) {
00828 maxLength_ = maxLength;
00829 type = &typeid(T);
00830 }
00831
00832 virtual Field* clone() const { return new VarField<T>(*this); }
00833
00834 virtual bool isType(Type t) { return t == Pointer; }
00835
00836 virtual MetaClass* itemClass() const { return classOf<T>(); }
00837
00838 virtual bool isPointer() { return true; }
00839
00840 virtual inline Size size() { return sizeof(T*); }
00841 virtual inline Size itemSize() { return (Size)(size_t)&((T*)0)[1]; }
00842
00843 virtual inline Size length(byte* base) { return maxLength_; }
00844
00845
00846
00847 virtual Size packSize(byte* base) {
00848 Size maxlen = maxLength();
00849 Size len = base ? length(base + offset) : maxlen;
00850 if (len > maxlen) len = maxlen;
00851
00852 return ((maxlen < 256) ? 1 :
00853 (maxlen < 65536) ? 2 : 4) + len * sizeof(T);
00854 }
00855
00856 virtual std::ostream& print(std::ostream &out) {
00857 char line[128];
00858 sprintf(line, "%-16svar %s(%d) %2d %4d %4d\n",
00859 name, type->name(), maxLength_, indexType, offset, size());
00860 return out << line;
00861 }
00862
00863 virtual Item* item() { return new ItemOf<T*>(); }
00864
00865 virtual byte* fetch(byte* dst, byte*& src) {
00866 Size length;
00867 Size maxlen = maxLength();
00868 if (maxlen < 256) {
00869 length = *src;
00870 src += 1;
00871 } else if (maxlen < 65536) {
00872 length = uint2get(src);
00873 src += 2;
00874 } else {
00875 length = uint4get(src);
00876 src += 4;
00877 }
00878 if (length) {
00879 *(T**)(dst) = (T*)src;
00880 src += sizeof(T) * length;
00881 } else
00882 *(T**)(dst) = 0;
00883 return src;
00884 }
00885
00886 virtual byte* fetchKey(byte* dst, byte* src) {
00887 *(T**)(dst) = (T*)src;
00888 return dst;
00889 }
00890
00891 virtual byte* store(byte*& dst, byte* src) {
00892 Size len = length(src);
00893 Size maxlen = maxLength();
00894 if (len > maxlen) len = maxlen;
00895 if (maxlen < 256) {
00896 dst[0] = len;
00897 dst += 1;
00898 } else if (maxlen < 65536) {
00899 int2store(dst, len);
00900 dst += 2;
00901 } else {
00902 int4store(dst, len);
00903 dst += 4;
00904 }
00905 len *= sizeof(T);
00906 ::memcpy((void*)dst, *(void const **)(src), len);
00907 dst += len;
00908 return dst;
00909 }
00910
00911 virtual Size storeKey(byte* dst, byte* src) {
00912 Size len = length(src);
00913 len *= sizeof(T);
00914 ::memcpy((void*)dst, *(void const **)src, len);
00915 return len;
00916 }
00917
00918 virtual void setKey(byte* dst, byte const* value, Size& len,
00919 Size maxLen) {
00920 Size newLen = MIN(length((byte*)&value), maxLen);
00921 len = newLen * sizeof(T);
00922 ::memcpy((void*)dst, (void*)value, len);
00923 }
00924 };
00925
00926
00932
00933
00934
00935
00936
00937
00938 #ifdef _MSC_VER
00939
00940
00941 template <>
00942 Size FixedField<std::string>::length(byte* base) {
00943 return ((std::string*)base)->size();
00944 }
00945
00946 template <>
00947 byte* FixedField<std::string>::fetch(byte* dst, byte*& row)
00948 {
00949 Size length;
00950 Size maxlen = maxLength();
00951 if (maxlen < 256) {
00952 length = *row;
00953 row += 1;
00954 } else if (maxlen < 65536) {
00955 length = uint2get(row);
00956 row += 2;
00957 } else {
00958 length = uint4get(row);
00959 row += 4;
00960 }
00961 *(std::string*)(dst) = std::string((char*)row, length);
00962 row += sizeof(char) * length;
00963 return row;
00964 }
00965
00966 template <>
00967 byte* FixedField<std::string>::store(byte*& row, byte* src)
00968 {
00969 Size len = length(src);
00970 Size maxlen = maxLength();
00971 if (len > maxlen) len = maxlen;
00972 if (maxlen < 256) {
00973 row[0] = len;
00974 row += 1;
00975 } else if (maxlen < 65536) {
00976 int2store(row, len);
00977 row += 2;
00978 } else {
00979 int4store(row, len);
00980 row += 4;
00981 }
00982 len *= sizeof(char);
00983 ::memcpy((void*)row, ((std::string*)src)->c_str(), len);
00984 row += len;
00985 return row;
00986 }
00987
00988 template <>
00989 Size FixedField<std::string>::packSize(byte* base) {
00990 Size maxlen = maxLength();
00991 Size len = base ? length(base + offset) : maxlen;
00992 if (len > maxlen) len = maxlen;
00993
00994 return ((maxlen < 256) ? 1 :
00995 (maxlen < 65536) ? 2 : 4) + len * sizeof(value_type::value_type);
00996 }
00997
00998 #else // !MSC_VER
00999
01000 template <>
01001 Size FixedField<std::string>::length(byte* base);
01002
01003 template <>
01004 byte* FixedField<std::string>::fetch(byte* dst, byte*& row);
01005
01006 template <>
01007 byte* FixedField<std::string>::store(byte*& row, byte* src);
01008
01009 template <>
01010 Size FixedField<std::string>::packSize(byte* base);
01011 #endif
01012
01013
01014
01020
01021
01022 template <>
01023 bool VarField<char>::isType(Type t);
01024
01025 template <>
01026 bool VarField<char const>::isType(Type t);
01027
01028 template <>
01029 Size VarField<char>::length(byte* base);
01030
01031 template <>
01032 Size VarField<char const>::length(byte* base);
01033
01034
01040
01041
01042 template <class T>
01043 class ReferenceField : public Field {
01044
01045 public:
01046
01047 ReferenceField(char const* name, Size offset, Size maxLength,
01048 IndexType indexType, char const* merge = 0) :
01049 Field(name, offset, Field::mapped, merge) {
01050 type = &typeid(T*);
01051 }
01052
01053 virtual Field* clone() const { return new ReferenceField<T>(*this); }
01054
01055 virtual bool isType(Type t) { return false; }
01056
01057 virtual bool isReference() { return true; }
01058
01059 virtual bool isPointer() { return true; }
01060
01061 virtual MetaClass* itemClass() const { return classOf<T>(); }
01062
01063 virtual inline Size size() { return sizeof(T*); }
01064
01065 virtual inline Size itemSize() { return (Size)(size_t)&((T*)0)[1]; }
01066
01067 virtual inline Size length(byte* base) { return maxLength_; }
01068
01069
01070
01071 virtual Size packSize(byte*) { return 0; }
01072
01073 virtual std::ostream& print(std::ostream &out) {
01074 char line[128];
01075 sprintf(line, "%-16svar %s(%d) %2d %4d %4d\n",
01076 name, type->name(), maxLength_, indexType, offset, size());
01077 return out << line;
01078 }
01079
01080 virtual Item* item() { return new ItemOf<T*>(); }
01081
01082 virtual byte* fetch(byte* dst, byte*& src) {
01083 *(byte**)dst = src;
01084 return src;
01085 }
01086
01087 virtual byte* fetchKey(byte* dst, byte* src) {
01088 return dst = src;
01089 }
01090
01091
01092 virtual byte* store(byte*& dst, byte* src) { return dst; }
01093
01094 virtual Size storeKey(byte* dst, byte* src) { return 0; }
01095 };
01096
01097
01105
01106
01107 template <class ArrayType>
01108 class ArrayField : public Field {
01109 };
01110
01111 template <class T>
01112 class ArrayField<ArrayOf<T> > : public Field {
01113 typedef T elementType;
01114
01115 ArrayField() {}
01116 public:
01117 ArrayField(char const* name, Size offset, Size maxLength,
01118 IndexType indexType, char const* merge = 0) :
01119 Field(name, offset, indexType, merge) {
01120 maxLength_ = maxLength;
01121 type = &typeid(ArrayOf<T>);
01122 }
01123
01124 virtual Field* clone() const { return new ArrayField<ArrayOf<T> >(*this); }
01125
01127 virtual void clear(void** fieldPtr) { ((ArrayOf<T>*)fieldPtr)->data = 0; }
01128
01129 virtual bool isType(Type t) { return (t == Array); }
01130
01131 virtual inline Size size() { return sizeof(ArrayOf<T>); }
01132 virtual inline Size itemSize() { return sizeof(T); }
01133
01134 virtual inline Size length(byte* base) { return ((ArrayOf<T>*)base)->length(); }
01135
01136
01137
01138 virtual Size packSize(byte* base) {
01139 Size maxlen = maxLength();
01140 Size len = base ? length(base + offset) : maxlen;
01141 if (len > maxlen) len = maxlen;
01142
01143 return ((maxlen < 256) ? 1 :
01144 (maxlen < 65536) ? 2 : 4) + len * sizeof(elementType);
01145 }
01146
01147 virtual std::ostream& print(std::ostream &out) {
01148 char line[128];
01149 sprintf(line, "%-16svar %s(%d) %2d %4d %4d\n",
01150 name, type->name(), maxLength_, indexType, offset, size());
01151 return out << line;
01152 }
01153
01154 virtual Item* item() { return 0; }
01155
01156 virtual byte* fetch(byte* dst, byte*& src) {
01157 Size length;
01158 Size maxlen = maxLength();
01159 if (maxlen < 256) {
01160 length = *src;
01161 src += 1;
01162 } else if (maxlen < 65536) {
01163 length = uint2get(src);
01164 src += 2;
01165 } else {
01166 length = uint4get(src);
01167 src += 4;
01168 }
01169 ((ArrayOf<T>*)dst)->len = length;
01170 ((ArrayOf<T>*)dst)->data = (elementType*)src;
01171 src += sizeof(elementType) * length;
01172 return src;
01173 }
01174
01175 virtual byte* fetchKey(byte* dst, byte* src) {
01176 Size length;
01177 Size maxlen = maxLength();
01178 if (maxlen < 256) {
01179 length = *src;
01180 src += 1;
01181 } else if (maxlen < 65536) {
01182 length = uint2get(src);
01183 src += 2;
01184 } else {
01185 length = uint4get(src);
01186 src += 4;
01187 }
01188 ((ArrayOf<T>*)dst)->len = length / sizeof(elementType);
01189 ((ArrayOf<T>*)dst)->data = (elementType*)src;
01190 return dst;
01191 }
01192
01193 virtual byte* store(byte*& dst, byte* src) {
01194 Size len = length(src);
01195 Size maxlen = maxLength();
01196 if (len > maxlen) len = maxlen;
01197 if (maxlen < 256) {
01198 dst[0] = len;
01199 dst += 1;
01200 } else if (maxlen < 65536) {
01201 int2store(dst, len);
01202 dst += 2;
01203 } else {
01204 int4store(dst, len);
01205 dst += 4;
01206 }
01207 len *= sizeof(elementType);
01208 ::memcpy((void*)dst, ((ArrayOf<T>*)src)->data, len);
01209 dst += len;
01210 return dst;
01211 }
01212
01213 virtual Size storeKey(byte* dst, byte* src) {
01214 Size len = length(src);
01215 len *= sizeof(elementType);
01216 ::memcpy((void*)dst, ((ArrayOf<T>*)src)->data, len);
01217 return len;
01218 }
01219
01220 virtual void setKey(byte* dst, byte const* value, Size& len,
01221 Size maxSize) {
01222 Size newSize = MIN(Size(length((byte*)value) * sizeof(elementType)),
01223 maxSize);
01224 len = newSize;
01225 ::memcpy((void*)dst, ((ArrayOf<T>*)value)->data, newSize);
01226 }
01227 };
01228
01229
01230
01231
01232
01233
01234
01235
01236
01237
01238
01239
01240
01241
01242
01243
01244 template <class T>
01245 class ArrayField<std::vector<T> > : public Field {
01246 typedef T elementType;
01247
01248 public:
01252 ArrayField(char const* name, Size offset, Size maxLength,
01253 IndexType indexType, char const* merge = 0) :
01254 Field(name, offset, indexType, merge) {
01255 maxLength_ = maxLength;
01256 type = &typeid(std::vector<T>);
01257 }
01258
01259 virtual Field* clone() const { return new ArrayField<std::vector<T> >(*this); }
01260
01261 virtual bool isType(Type t) { return (t == Array); }
01262
01263 virtual inline Size size() { return sizeof(std::vector<T>); }
01264 virtual inline Size itemSize() { return sizeof(T); }
01265
01266 virtual inline Size length(byte* base) { return ((std::vector<T>*)base)->size(); }
01267
01268
01269
01270 virtual Size packSize(byte* base) {
01271 Size maxlen = maxLength();
01272 if (maxlen == 0)
01273 maxlen = UINT_MAX;
01274 Size len = base ? length(base + offset) : maxlen;
01275 if (len > maxlen) len = maxlen;
01276
01277 return ((maxlen < 256) ? 1 :
01278 (maxlen < 65536) ? 2 : 4) + len * sizeof(elementType);
01279 }
01280
01281 virtual std::ostream& print(std::ostream &out) {
01282 char line[128];
01283 sprintf(line, "%-16svar %s(%d) %2d %4d %4d\n",
01284 name, type->name(), maxLength_, indexType, offset, size());
01285 return out << line;
01286 }
01287
01288 virtual Item* item() { return 0; }
01289
01290 virtual byte* fetch(byte* dst, byte*& src) {
01291 Size length;
01292 Size maxlen = maxLength();
01293 if (maxlen == 0)
01294 maxlen = UINT_MAX;
01295 if (maxlen < 256) {
01296 length = *src;
01297 src += 1;
01298 } else if (maxlen < 65536) {
01299 length = uint2get(src);
01300 src += 2;
01301 } else {
01302 length = uint4get(src);
01303 src += 4;
01304 }
01305 ((std::vector<T>*)dst)->resize(length);
01306 std::copy((T*)src, (T*)src + length, ((std::vector<T>*)dst)->begin());
01307 src += sizeof(T) * length;
01308 return src;
01309 }
01310
01311 virtual byte* fetchKey(byte* dst, byte* src) {
01312 Size length;
01313 Size maxlen = maxLength();
01314 if (maxlen < 256) {
01315 length = *src;
01316 src += 1;
01317 } else if (maxlen < 65536) {
01318 length = uint2get(src);
01319 src += 2;
01320 } else {
01321 length = uint4get(src);
01322 src += 4;
01323 }
01324 std::copy((T*)src, (T*)src + length, ((std::vector<T>*)dst)->begin());
01325 return dst;
01326 }
01327
01328 virtual byte* store(byte*& dst, byte* src) {
01329 Size len = ((std::vector<T>*)src)->size();
01330 Size maxlen = maxLength();
01331 if (maxlen == 0)
01332 maxlen = UINT_MAX;
01333 if (len > maxlen) len = maxlen;
01334 if (maxlen < 256) {
01335 dst[0] = len;
01336 dst += 1;
01337 } else if (maxlen < 65536) {
01338 int2store(dst, len);
01339 dst += 2;
01340 } else {
01341 int4store(dst, len);
01342 dst += 4;
01343 }
01344 std::copy(((std::vector<T>*)src)->begin(), ((std::vector<T>*)src)->end(), (T*)dst);
01345 dst += len * sizeof(T);
01346 return dst;
01347 }
01348
01349 virtual Size storeKey(byte* dst, byte* src) {
01350 Size len = ((std::vector<T>*)src)->size();
01351 std::copy(((std::vector<T>*)src)->begin(), ((std::vector<T>*)src)->end(),(T*)dst);
01352 return len * sizeof(T);
01353 }
01354
01355 virtual void setKey(byte* dst, byte const* value, Size& len,
01356 Size maxSize) {
01357 len = MIN(length((byte*)&value), maxSize / Size(sizeof(T)));
01358 typename std::vector<T>::iterator begin = ((std::vector<T>*)value)->begin();
01359 std::copy(begin, begin + len, (T*)dst);
01360 }
01361 };
01362
01363
01364
01365
01366 template<>
01367 class ArrayField<std::vector<std::string> > : public Field {
01368 typedef std::string elementType;
01369
01370 ArrayField() {}
01371 public:
01372
01373 virtual Size packSize(byte* base) {
01374 Size maxlen = maxLength();
01375 Size len = base ? length(base + offset) : maxlen;
01376 if (len > maxlen) len = maxlen;
01377
01378 int tot = ((maxlen < 256) ? 1 :
01379 (maxlen < 65536) ? 2 : 4);
01380 std::vector<std::string>& v = *(std::vector<std::string>*)(base + offset);
01381 for (Size i = 0; i < len; i++)
01382 tot += packSize<2>(v[i]);
01383 return tot;
01384 }
01385
01386 template<int maxlen>
01387 static Size packSize(std::string& s) {
01388 Size len = s.size();
01389 return ((maxlen < 256) ? 1 :
01390 (maxlen < 65536) ? 2 : 4) + len * sizeof(std::string::value_type);
01391 }
01392
01393 virtual byte* fetch(byte* dst, byte*& src) {
01394 Size length;
01395 Size maxlen = maxLength();
01396 if (maxlen < 256) {
01397 length = *src;
01398 src += 1;
01399 } else if (maxlen < 65536) {
01400 length = uint2get(src);
01401 src += 2;
01402 } else {
01403 length = uint4get(src);
01404 src += 4;
01405 }
01406 ((std::vector<std::string>*)dst)->resize(length);
01407 std::vector<std::string>& v = *(std::vector<std::string>*)dst;
01408 for (Size i = 0; i < length; i++)
01409 src = fetch<2>(v[i], src);
01410 return src;
01411 }
01412
01413 template <int maxlen>
01414 byte* fetch(std::string& dst, byte*& row) {
01415 Size length;
01416 if (maxlen < 256) {
01417 length = *row;
01418 row += 1;
01419 } else if (maxlen < 65536) {
01420 length = uint2get(row);
01421 row += 2;
01422 } else {
01423 length = uint4get(row);
01424 row += 4;
01425 }
01426 dst = std::string((char*)row, length);
01427 row += sizeof(std::string::value_type) * length;
01428 return row;
01429 }
01430
01431 virtual byte* store(byte*& dst, byte* src) {
01432 Size len = ((std::vector<std::string>*)src)->size();
01433 Size maxlen = maxLength();
01434 if (len > maxlen) len = maxlen;
01435 if (maxlen < 256) {
01436 dst[0] = len;
01437 dst += 1;
01438 } else if (maxlen < 65536) {
01439 int2store(dst, len);
01440 dst += 2;
01441 } else {
01442 int4store(dst, len);
01443 dst += 4;
01444 }
01445 std::vector<std::string>& v = *(std::vector<std::string>*)src;
01446 for (Size i = 0; i < len; i++)
01447 dst = store<2>(dst, v[i]);
01448 return dst;
01449 }
01450
01451 template<int maxlen>
01452 byte* store(byte*& row, std::string& src) {
01453 Size len = src.size();
01454 if (maxlen < 256) {
01455 row[0] = len;
01456 row += 1;
01457 } else if (maxlen < 65536) {
01458 int2store(row, len);
01459 row += 2;
01460 } else {
01461 int4store(row, len);
01462 row += 4;
01463 }
01464 len *= sizeof(std::string::value_type);
01465 ::memcpy((void*)row, src.c_str(), len);
01466 row += len;
01467 return row;
01468 }
01469 };
01470
01471 template<>
01472 class ArrayField<std::vector<char const*> > : public Field {
01473 typedef char* elementType;
01474 typedef std::vector<char const*> T;
01475
01476 public:
01477 ArrayField(char const* name, Size offset, Size maxLength,
01478 IndexType indexType, char const* merge = 0) :
01479 Field(name, offset, indexType, merge) {
01480 maxLength_ = maxLength;
01481 type = &typeid(T);
01482 }
01483
01484 virtual Field* clone() const { return new ArrayField<std::vector<char const*> >(*this); }
01485
01486 virtual inline Size size() { return sizeof(std::vector<elementType>); }
01487 virtual inline Size itemSize() { return sizeof(T); }
01488 virtual byte* fetchKey(byte* dst, byte* src) { return 0; }
01489 virtual Size storeKey(byte*, byte*) { return 0; }
01490 virtual std::ostream& print(std::ostream &out) { return out; }
01491 virtual Item* item() { return 0; }
01492
01493 virtual Size packSize(byte* base) {
01494 Size maxlen = maxLength();
01495 Size len = base ? length(base + offset) : maxlen;
01496 if (len > maxlen) len = maxlen;
01497
01498 int tot = ((maxlen < 256) ? 1 :
01499 (maxlen < 65536) ? 2 : 4);
01500 if (base) {
01501 T& v = *(T*)(base + offset);
01502 for (size_t i = 0; i < v.size(); i++)
01503 tot += packSize<2>(v[i]);
01504 } else
01505 tot += len * 8;
01506 return tot;
01507 }
01508
01509 template<int maxlen>
01510 static Size packSize(char const* s) {
01511 Size len = strlen(s) + 1;
01512 return ((maxlen < 256) ? 1 :
01513 (maxlen < 65536) ? 2 : 4) + len;
01514 }
01515
01516 virtual byte* fetch(byte* dst, byte*& src) {
01517 Size length;
01518 Size maxlen = maxLength();
01519 if (maxlen < 256) {
01520 length = *src;
01521 src += 1;
01522 } else if (maxlen < 65536) {
01523 length = uint2get(src);
01524 src += 2;
01525 } else {
01526 length = uint4get(src);
01527 src += 4;
01528 }
01529 ((T*)dst)->resize(length);
01530 T& v = *(T*)dst;
01531 for (Size i = 0; i < length; i++)
01532 src = fetch<2>(v[i], src);
01533 return src;
01534 }
01535
01536 template <int maxlen>
01537 byte* fetch(char const*& dst, byte*& row) {
01538 Size length;
01539 if (maxlen < 256) {
01540 length = *row;
01541 row += 1;
01542 } else if (maxlen < 65536) {
01543 length = uint2get(row);
01544 row += 2;
01545 } else {
01546 length = uint4get(row);
01547 row += 4;
01548 }
01549 dst = (char const*)row;
01550 row += length;
01551 return row;
01552 }
01553
01554 virtual byte* store(byte*& dst, byte* src) {
01555 Size len = ((T*)src)->size();
01556 Size maxlen = maxLength();
01557 if (len > maxlen) len = maxlen;
01558 if (maxlen < 256) {
01559 dst[0] = len;
01560 dst += 1;
01561 } else if (maxlen < 65536) {
01562 int2store(dst, len);
01563 dst += 2;
01564 } else {
01565 int4store(dst, len);
01566 dst += 4;
01567 }
01568 std::vector<char*>& v = *(std::vector<char*>*)src;
01569 for (Size i = 0; i < len; i++)
01570 dst = store<2>(dst, v[i]);
01571 return dst;
01572 }
01573
01574 template<int maxlen>
01575 byte* store(byte*& row, char const* src) {
01576 Size len = strlen(src) + 1;
01577 if (maxlen < 256) {
01578 row[0] = len;
01579 row += 1;
01580 } else if (maxlen < 65536) {
01581 int2store(row, len);
01582 row += 2;
01583 } else {
01584 int4store(row, len);
01585 row += 4;
01586 }
01587 ::memcpy((void*)row, src, len);
01588 row += len;
01589 return row;
01590 }
01591 };
01592
01593
01599
01600
01601 template <class T>
01602 struct CompositeBuilder {
01603 static Field& factory(char const* name, Size offset, Size size,
01604 Field::IndexType indexType, char const* merge)
01605 { return *new CompositeField(name, offset, sizeof(T), indexType,
01606 CLASS_OF(T), &typeid(T), merge); }
01607 };
01608
01609 template <class T>
01610 struct FieldBuilder {
01611 static Field& factory(char const* name, Size offset, Size maxLength,
01612 Field::IndexType indexType, char const* merge)
01613 {
01614 return *new T(name, offset, maxLength, indexType, merge); }
01615 };
01616
01617
01618
01619
01620
01621
01622
01623
01624
01625
01626
01627
01628
01629
01630
01631
01632
01633 template <class T>
01634 inline Field& createField(char const* name, Size maxLength, Size offs,
01635 T*, Field::IndexType const indexType,
01636 char const* merge = 0)
01637 {
01638
01639 if (maxLength)
01640 return
01641 If<typename isPointer<T>::VAL,
01642 FieldBuilder<VarField<typename deref<T>::VAL> >,
01643 typename If<typename isArray<T>::VAL,
01644 FieldBuilder<ArrayField<T> >,
01645 typename If<typename isClass<T>::VAL,
01646 CompositeBuilder<T>,
01647 FieldBuilder<FixedField<T> > >::VAL
01648 >::VAL
01649 >::VAL::
01650 factory(name, offs, maxLength, indexType, merge);
01651
01652 return
01653 If<typename isPointer<T>::VAL,
01654 FieldBuilder<ReferenceField<typename deref<T>::VAL> >,
01655 typename If<typename isArray<T>::VAL,
01656 FieldBuilder<ArrayField<T> >,
01657 typename If<typename isClass<T>::VAL,
01658 CompositeBuilder<T>,
01659 FieldBuilder<FixedField<T> > >::VAL
01660 >::VAL
01661 >::VAL::
01662 factory(name, offs, 0, indexType, merge);
01663 }
01664
01665 Field* makeField(char const* name, char const* typeName, Size& offs, Size maxLength);
01666
01667 class AnyObject;
01668
01669
01676
01677
01678 class MetaClass {
01679 friend class AnyObject;
01680
01681 protected:
01682
01683 char const* name_;
01684 Field* columns;
01685 Count nColumns;
01686 Size instanceSize;
01687 void (*factory)(void* dst);
01688
01689 public:
01690
01691 META(MetaClass,
01692 (VARFIELD(name_, 2048),
01693 FIELD(columns),
01694 FIELD(nColumns),
01695 FIELD(instanceSize)));
01696
01697 MetaClass() { }
01698
01699 MetaClass(char const* name, Field* columns, Size instanceSize,
01700 void (*factory)(void* dst) = 0);
01701
01703 MetaClass(MetaClass const& mc) {
01704 *this = mc;
01705 Field** newfd = &columns;
01706 for (Field const* fd = mc.fields(); fd; fd = fd->next) {
01707 *newfd = fd->clone();
01708 newfd = &(*newfd)->next;
01709 }
01710 }
01711
01712 ~MetaClass() {
01713 delete columns;
01714
01715 }
01716
01717 char const* name() { return name_; }
01718
01719 Field* fields() const { return columns; }
01720
01721 Count fieldCount() const { return nColumns; }
01722
01726 void* createInstance(void* dst) { factory(dst); }
01727
01730 Size size() { return instanceSize; }
01731
01734 Size recordSize(byte* base = 0);
01735 Size recordSize(AnyObject const * obj);
01736
01737 Field* find(char const* name);
01738
01739
01740
01741
01742
01743
01744
01745
01746 byte* store(byte*& dst, byte* src) {
01747 for (Field* fd = columns; fd != NULL; fd = fd->next)
01748 dst = fd->store(dst, FieldOf(src, fd));
01749 return dst;
01750 }
01751
01752 byte* fetch(byte* dst, byte*& src) {
01753 for (Field* fd = columns; fd != NULL; fd = fd->next)
01754 src = fd->fetch(FieldOf(dst, fd), src);
01755 return src;
01756 }
01757
01758 std::ostream& print(std::ostream &out) const {
01759 out << "\nClass: " << name_ << std::endl;
01760 out << "Field Type Key Offs Size\n";
01761 out << "-------------------------------------------\n";
01762 for (Field *fd = columns; fd; fd = fd->next)
01763 fd->print(out);
01764 return out;
01765 }
01766 };
01767
01768 inline std::ostream& operator <<(std::ostream& s, const MetaClass& m)
01769 {
01770 return m.print(s);
01771 }
01772
01773
01779
01780
01781 class AnyObject {
01782 public:
01783 MetaClass* _metaClass;
01784
01785 std::vector<Item*> values;
01786
01790 AnyObject(MetaClass* table) : _metaClass(table) {
01791 values.reserve(table->nColumns);
01792 for (Field* fd = table->fields(); fd; fd = fd->next)
01793 values.push_back(fd->item());
01794 }
01795
01796
01797 AnyObject() { }
01798
01799 MetaClass* metaClass() const { return _metaClass; }
01800
01801 bool operator ==(AnyObject const &other) {
01802 std::vector<Item*>::const_iterator lv1 = values.begin();
01803 std::vector<Item*>::const_iterator lv2 = other.values.begin();
01804 std::vector<Item*>::const_iterator end1 = values.end();
01805 std::vector<Item*>::const_iterator end2 = other.values.end();
01806 for (; lv1 != end1 && lv2 != end2 ; lv1++, lv2++)
01807 if (*lv1 != *lv2)
01808 return false;
01809 return true;
01810 }
01811
01812 void _clear() {
01813
01814 for (Field* fd = _metaClass->fields(); fd; fd = fd->next) {
01815 fd->clear((void**)FieldOf(this, fd));
01816 }
01817 }
01818
01822 std::ostream& print(std::ostream& out) {
01823 for (std::vector<Item*>::const_iterator lv = values.begin();
01824 lv != values.end(); lv++) {
01825 out << (*lv) << '\t';
01826 }
01827 return out;
01828 }
01829
01833 template <class T>
01834 ItemOf<T>& field(char* fieldName) {
01835 std::vector<Item*>::const_iterator lv = values.begin();
01836 for (Field* fd = _metaClass->columns; fd; fd = fd->next, lv++)
01837 if (::strcmp(fieldName, fd->name) == 0)
01838 return *(ItemOf<T>*)*lv;
01839 return 0;
01840 }
01841
01845 template <class T>
01846 ItemOf<T>& field(int i) {
01847 return *(ItemOf<T>*)values[i];
01848 }
01849
01850 Item& operator [](int i) {
01851 return *values[i];
01852 }
01853 };
01854
01855 #if defined(_WIN32) || defined(__DECCXX) || defined(__GNUC__)
01856 #pragma pack(pop)
01857 #endif
01858
01859 }
01860
01861 #endif // IXE_metaclass_H