00001 
00002 
00003 
00004 
00009 #ifndef __MK4_H__
00010 #define __MK4_H__
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00031 
00032 
00033 
00034 
00035 
00036 
00037 
00038 
00039 
00040 
00041 
00042 
00043 
00044 
00046 #define d4_MetakitLibraryVersion 249    // 2.4.9.4 release, Jun 10, 2005
00047 #define d4_MetaKitLibraryVersion d4_MetakitLibraryVersion // compat, yuck
00048 
00049 
00050 
00051 
00052     class c4_View;                      
00053     class c4_Cursor;                    
00054     class c4_RowRef;                    
00055         class c4_Row;                   
00056     class c4_Bytes;                     
00057     class c4_Storage;                   
00058     class c4_CustomViewer;              
00059     class c4_Stream;                    
00060     class c4_Strategy;                  
00061 
00062     class c4_Property;                  
00063         class c4_IntProp;
00064         class c4_LongProp;
00065         class c4_FloatProp;
00066         class c4_DoubleProp;
00067         class c4_StringProp;
00068         class c4_BytesProp;
00069         class c4_ViewProp;
00070 
00071     
00072 
00073     class c4_Sequence;                  
00074 
00075     class c4_Reference;                 
00076         class c4_IntRef;
00077         class c4_LongRef;
00078         class c4_FloatRef;
00079         class c4_DoubleRef;
00080         class c4_BytesRef;
00081         class c4_StringRef;
00082         class c4_ViewRef;
00083 
00084     class c4_Dependencies;              
00085     class c4_Handler;                   
00086     class c4_Notifier;                  
00087     class c4_Persist;                   
00088 
00089 
00090 
00091     
00092 #if defined (MKDLL_EXPORTS) && !defined (q4_KITDLL)
00093 #define q4_KITDLL 1
00094 #endif
00095 
00096     
00097 #if defined (_DOS) && defined (_M_I86SM) && !defined (q4_TINY)
00098 #define q4_TINY 1
00099 #endif
00100 
00101     
00102 #if !defined (_WIN32) && !defined (q4_LONG64)
00103 #if defined (_PA_RISC2_0) || defined (__powerpc64__) || defined(__sparcv9) || \
00104     defined (__x86_64__) || defined (__s390x__) || defined (__alpha) || \
00105     (defined (__ia64) && (!defined (__HP_aCC) || defined(__LP64__)))
00106 #define q4_LONG64 1
00107 #endif
00108 #endif
00109 
00110     
00111 #if !defined (q4_INLINE)
00112 #define q4_INLINE 1
00113 #endif
00114 
00115 
00116 
00117     
00118 #if defined (__BORLANDC__)
00119     
00120 #if defined (_RTLDLL) && !defined (q4_KITDLL)
00121 #define q4_KITDLL 1
00122 #endif
00123 
00124     
00125 #if __BORLANDC__ >= 0x500
00126 #define q4_BOOL 1
00127 #endif
00128 #endif // __BORLANDC__
00129 
00130     
00131     
00132 #if defined (sgi)
00133 #define q4_BOOL 1
00134 #undef bool
00135 #undef true
00136 #undef false
00137 #endif
00138 
00139     
00140 #if defined (__GNUC__)
00141 #ifndef q4_BOOL
00142 #define q4_BOOL 1
00143 #endif
00144 #ifndef HAVE_LONG_LONG
00145 #define HAVE_LONG_LONG 1
00146 #endif
00147 #endif
00148 
00149     
00150 #if defined (__HP_aCC)
00151 #ifndef HAVE_LONG_LONG
00152 #define HAVE_LONG_LONG 1
00153 #endif
00154 #endif
00155 
00156     
00157 #if defined (__MWERKS__)
00158 #if __option(bool)
00159 #define q4_BOOL 1       // bool datatype is optionally supported
00160     
00161 #undef bool
00162 #undef true
00163 #undef false
00164 #endif
00165 #endif
00166 
00167     
00168 #if defined (_MSC_VER)
00169     
00170 #if _MSC_VER >= 1100
00171 #define q4_BOOL 1
00172 #define LONG_LONG __int64
00173 #else
00174 #define q4_NO_NS 1
00175 #endif
00176 
00177     
00178 #pragma warning(disable: 4273) // inconsistent dll linkage
00179 #endif // _MSC_VER
00180 
00181 
00182 
00183 
00184 #if !q4_BOOL && !q4_STD         // define a bool datatype
00185 #define false 0
00186 #define true 1
00187 #define bool int
00188 #endif
00189 
00190 #if q4_KITDLL                   // add declaration specifiers
00191 #include "mk4dll.h"
00192 #endif
00193 
00194 #if q4_INLINE                   // enable inline expansion
00195 #define d4_inline inline
00196 #else
00197 #define d4_inline
00198 #endif
00199 
00200 typedef unsigned char t4_byte;  
00201 
00202 #if q4_LONG64
00203 typedef int t4_i32;             
00204 #else
00205 typedef long t4_i32;            
00206 #endif
00207 
00208 #if q4_LONG64           // choose a way to represent 64b integers
00209 typedef long t4_i64;
00210 #elif defined (LONG_LONG)
00211 typedef LONG_LONG t4_i64;
00212 #elif HAVE_LONG_LONG
00213 typedef long long t4_i64;
00214 #else
00215 struct t4_i64 { long l1; long l2; };
00216 bool operator== (const t4_i64 a_, const t4_i64 b_);
00217 bool operator< (const t4_i64 a_, const t4_i64 b_);
00218 #endif
00219 
00220 
00221 
00222 class c4_View
00223 {
00224 protected:
00225   c4_Sequence* _seq;
00226 
00227 public:
00228 
00229   c4_View (c4_Sequence* =0);
00230   c4_View (c4_CustomViewer*);
00231   c4_View (c4_Stream*);
00232   c4_View (const c4_Property& property_);
00233   c4_View (const c4_View&);
00234   ~c4_View ();
00235   
00236   c4_View& operator= (const c4_View&);
00237   c4_Persist* Persist() const; 
00238 
00239 
00240   int GetSize() const;    
00241   void SetSize(int, int =-1); 
00242 
00243   void RemoveAll();
00244 
00245 
00246   c4_RowRef GetAt(int) const;
00247   c4_RowRef operator[] (int) const;
00248   
00249   void SetAt(int, const c4_RowRef&);
00250   c4_RowRef ElementAt(int);
00251 
00252   bool GetItem(int, int, c4_Bytes&) const;
00253   void SetItem(int, int, const c4_Bytes&) const;
00254 
00255 
00256   void SetAtGrow(int, const c4_RowRef&);   
00257   int Add(const c4_RowRef&);
00258 
00259 
00260   void InsertAt(int, const c4_RowRef&, int =1);
00261   void RemoveAt(int, int =1);
00262   void InsertAt(int, const c4_View&);
00263 
00264   bool IsCompatibleWith(const c4_View&) const;
00265   void RelocateRows(int, int, c4_View&, int);
00266 
00267 
00268   int NumProperties() const; 
00269   const c4_Property& NthProperty(int) const;
00270   int FindProperty(int);
00271   int FindPropIndexByName(const char*) const;
00272   c4_View Duplicate() const;
00273   c4_View Clone() const;
00274   int AddProperty(const c4_Property&);
00275   c4_View operator, (const c4_Property&) const;
00276 
00277   const char* Description() const;
00278   
00279 
00280   c4_View Sort() const;
00281   c4_View SortOn(const c4_View&) const;
00282   c4_View SortOnReverse(const c4_View&, const c4_View&) const;
00283 
00284   c4_View Select(const c4_RowRef&) const;
00285   c4_View SelectRange(const c4_RowRef&, const c4_RowRef&) const;
00286 
00287   c4_View Project(const c4_View&) const;
00288   c4_View ProjectWithout(const c4_View&) const;
00289 
00290   int GetIndexOf(const c4_RowRef&) const;
00291   int RestrictSearch(const c4_RowRef&, int&, int&);
00292 
00293 
00294   c4_View Slice(int, int =-1, int =1) const;
00295   c4_View Product(const c4_View&) const;
00296   c4_View RemapWith(const c4_View&) const;
00297   c4_View Pair(const c4_View&) const;
00298   c4_View Concat(const c4_View&) const;
00299   c4_View Rename(const c4_Property&, const c4_Property&) const;
00300 
00301   c4_View GroupBy(const c4_View&, const c4_ViewProp&) const;
00302   c4_View Counts(const c4_View&, const c4_IntProp&) const;
00303   c4_View Unique() const;
00304 
00305   c4_View Union(const c4_View&) const;
00306   c4_View Intersect(const c4_View&) const;
00307   c4_View Different(const c4_View&) const;
00308   c4_View Minus(const c4_View&) const;
00309 
00310   c4_View JoinProp(const c4_ViewProp&, bool =false) const;
00311   c4_View Join(const c4_View&, const c4_View&, bool =false) const;
00312 
00313   c4_View ReadOnly() const;
00314   c4_View Hash(const c4_View&, int =1) const;
00315   c4_View Blocked() const;
00316   c4_View Ordered(int =1) const;
00317   c4_View Indexed(const c4_View&, const c4_View&, bool =false) const;
00318 
00319 
00320   int Find(const c4_RowRef&, int =0) const;
00321   int Search(const c4_RowRef&) const;
00322   int Locate(const c4_RowRef&, int* =0) const;
00323   
00324 
00325   int Compare(const c4_View&) const;
00326 
00327   friend bool operator== (const c4_View&, const c4_View&);
00328   friend bool operator!= (const c4_View&, const c4_View&);
00329   friend bool operator< (const c4_View&, const c4_View&);
00330   friend bool operator> (const c4_View&, const c4_View&);
00331   friend bool operator<= (const c4_View&, const c4_View&);
00332   friend bool operator>= (const c4_View&, const c4_View&);
00333   
00334 protected:
00335   void _IncSeqRef();
00336   void _DecSeqRef();
00337 
00339   friend class c4_ViewRef;
00340 
00341   
00342   
00343 };
00344 
00345 
00346 
00347 #if defined(os_aix) && defined(compiler_ibmcxx) && (compiler_ibmcxx > 500)
00348   bool operator== (const c4_RowRef& a_, const c4_RowRef& b_);
00349   bool operator!= (const c4_RowRef& a_, const c4_RowRef& b_);
00350   bool operator<= (const c4_RowRef& a_, const c4_RowRef& b_);
00351   bool operator>= (const c4_RowRef& a_, const c4_RowRef& b_);
00352   bool operator> (const c4_RowRef& a_, const c4_RowRef& b_);
00353   bool operator< (const c4_RowRef& a_, const c4_RowRef& b_);
00354 #endif
00355 
00356 class c4_Cursor
00357 {
00358 public: 
00360   c4_Sequence* _seq;
00362   int _index;
00363 
00364 
00366   c4_Cursor (c4_Sequence&, int);
00367   
00369   c4_RowRef operator* () const;
00370   
00372   c4_RowRef operator[] (int) const;
00373 
00374 
00376   c4_Cursor& operator++ ();
00378   c4_Cursor operator++ (int);
00380   c4_Cursor& operator-- ();
00382   c4_Cursor operator-- (int);
00383 
00385   c4_Cursor& operator+= (int);
00387   c4_Cursor& operator-= (int);
00388 
00390   c4_Cursor operator- (int) const;
00392   int operator- (c4_Cursor) const;
00393   
00395   friend c4_Cursor operator+ (c4_Cursor, int);
00397   friend c4_Cursor operator+ (int, c4_Cursor);
00398 
00399 
00401   friend bool operator== (c4_Cursor, c4_Cursor);
00403   friend bool operator!= (c4_Cursor, c4_Cursor);
00405   friend bool operator< (c4_Cursor, c4_Cursor);
00407   friend bool operator> (c4_Cursor, c4_Cursor);
00409   friend bool operator<= (c4_Cursor, c4_Cursor);
00411   friend bool operator>= (c4_Cursor, c4_Cursor);
00412 
00413 
00415   friend bool operator== (const c4_RowRef&, const c4_RowRef&);
00417   friend bool operator!= (const c4_RowRef&, const c4_RowRef&);
00419   friend bool operator< (const c4_RowRef&, const c4_RowRef&);
00421   friend bool operator> (const c4_RowRef&, const c4_RowRef&);
00423   friend bool operator<= (const c4_RowRef&, const c4_RowRef&);
00425   friend bool operator>= (const c4_RowRef&, const c4_RowRef&);
00426 };
00427 
00428 
00429 
00430 class c4_RowRef
00431 {
00433   c4_Cursor _cursor;
00434 
00435 public: 
00436 
00438   c4_RowRef operator= (const c4_RowRef&);
00440   c4_Cursor operator& () const;
00442   c4_View Container() const;
00443 
00444 protected:
00446   c4_RowRef (c4_Cursor);
00447 
00448   friend class c4_Cursor;
00449   friend class c4_Row;
00450 };
00451 
00452 
00454 
00455 
00456 
00457 
00458 
00459 
00460 class c4_Row : public c4_RowRef 
00461 {
00462 public:
00464   c4_Row ();
00466   c4_Row (const c4_Row&);
00468   c4_Row (const c4_RowRef&);
00470   ~c4_Row ();
00471   
00473   c4_Row& operator= (const c4_Row&);
00475   c4_Row& operator= (const c4_RowRef&);
00476   
00478   void ConcatRow(const c4_RowRef&);
00480   friend c4_Row operator+ (const c4_RowRef&, const c4_RowRef&);
00481   
00482 private:
00483   static c4_Cursor Allocate();
00484   static void Release(c4_Cursor);
00485 };
00486 
00487 
00488 
00489 class c4_Bytes
00490 {
00491   union {
00492     t4_byte _buffer [16];
00493     double _aligner; 
00494   };
00495 
00496   t4_byte* _contents;
00497   int _size;
00498   bool _copy;
00499 
00500 public:
00501   c4_Bytes ();
00502   c4_Bytes (const void*, int);
00503   c4_Bytes (const void*, int, bool);
00504   c4_Bytes (const c4_Bytes&);
00505   ~c4_Bytes ();
00506   
00507   c4_Bytes& operator= (const c4_Bytes&);
00508   void Swap(c4_Bytes&);
00509   
00510   int Size() const;
00511   const t4_byte* Contents() const;
00512   
00513   t4_byte* SetBuffer(int);
00514   t4_byte* SetBufferClear(int);
00515 
00516   friend bool operator== (const c4_Bytes&, const c4_Bytes&);
00517   friend bool operator!= (const c4_Bytes&, const c4_Bytes&);
00518 
00519 private:
00520   void _MakeCopy();
00521   void _LoseCopy();
00522 };
00523 
00524 
00525 
00526 class c4_Storage : public c4_View
00527 {
00528 public:
00530   c4_Storage (); 
00532   c4_Storage (c4_Strategy&, bool =false, int =1); 
00534   c4_Storage (const char*, int);
00536   c4_Storage (const c4_View&);
00538   ~c4_Storage ();
00539   
00540   void SetStructure(const char*);
00541   bool AutoCommit(bool =true);
00542   c4_Strategy& Strategy() const;
00543   const char* Description(const char* =0);
00544   
00545   bool SetAside(c4_Storage&);
00546   c4_Storage* GetAside() const;
00547 
00548   bool Commit(bool =false);
00549   bool Rollback(bool =false);
00550   
00551   c4_ViewRef View(const char*);
00552   c4_View GetAs(const char*);
00553 
00554   bool LoadFrom(c4_Stream&);
00555   void SaveTo(c4_Stream&);
00556 
00557   t4_i32 FreeSpace(t4_i32* bytes_ =0);
00558 
00559   
00560   
00561   
00562   
00563 
00564 private:
00565   void Initialize(c4_Strategy&, bool, int);
00566 };
00567 
00568 
00569 
00570 class c4_Property
00571 {
00572   short _id;
00573   char _type;
00574 
00575 public:
00577   c4_Property (char, int);
00579   c4_Property (char, const char*);
00580   ~c4_Property ();
00581   
00582   c4_Property (const c4_Property&);
00583   void operator= (const c4_Property&);
00584 
00585   const char* Name() const;
00586   char Type() const;
00587 
00588   int GetId() const;
00589 
00590   c4_Reference operator() (const c4_RowRef&) const;
00591 
00592   void Refs(int) const;
00593 
00594   c4_View operator, (const c4_Property&) const;
00595 
00596   static void CleanupInternalData();
00597 };
00598 
00600 class c4_IntProp : public c4_Property 
00601 {
00602 public:
00604   c4_IntProp (const char*);
00606   ~c4_IntProp ();
00607   
00609   c4_IntRef operator() (const c4_RowRef&) const;
00611   t4_i32 Get(const c4_RowRef&) const;
00613   void Set(const c4_RowRef&, t4_i32) const;
00614 
00616   c4_Row operator[] (t4_i32) const;
00618   c4_Row AsRow(t4_i32) const;
00619 };
00620 
00621 #if !q4_TINY
00622 
00624 class c4_LongProp : public c4_Property 
00625 {
00626 public:
00628   c4_LongProp (const char*);
00630   ~c4_LongProp ();
00631   
00633   c4_LongRef operator() (const c4_RowRef&) const;
00635   t4_i64 Get(const c4_RowRef&) const;
00637   void Set(const c4_RowRef&, t4_i64) const;
00638 
00640   c4_Row operator[] (t4_i64) const;
00642   c4_Row AsRow(t4_i64) const;
00643 };
00644 
00646 class c4_FloatProp : public c4_Property 
00647 {
00648 public:
00650   c4_FloatProp (const char*);
00652   ~c4_FloatProp ();
00653   
00655   c4_FloatRef operator() (const c4_RowRef&) const;
00657   double Get(const c4_RowRef&) const;
00659   void Set(const c4_RowRef&, double) const;
00660 
00662   c4_Row operator[] (double) const;
00664   c4_Row AsRow(double) const;
00665 };
00666 
00668 class c4_DoubleProp : public c4_Property 
00669 {
00670 public:
00672   c4_DoubleProp (const char*);
00674   ~c4_DoubleProp ();
00675   
00677   c4_DoubleRef operator() (const c4_RowRef&) const;
00679   double Get(const c4_RowRef&) const;
00681   void Set(const c4_RowRef&, double) const;
00682 
00684   c4_Row operator[] (double) const;
00686   c4_Row AsRow(double) const;
00687 };
00688 #endif // !q4_TINY
00689 
00691 class c4_StringProp : public c4_Property
00692 {
00693 public:
00695   c4_StringProp (const char*);
00697   ~c4_StringProp ();
00698   
00700   c4_StringRef operator() (const c4_RowRef&) const;
00702   const char* Get(const c4_RowRef&) const;
00704   void Set(const c4_RowRef&, const char*) const;
00705 
00707   c4_Row operator[] (const char*) const;
00709   c4_Row AsRow(const char*) const;
00710 };
00711 
00713 class c4_BytesProp : public c4_Property
00714 {
00715 public:
00717   c4_BytesProp (const char*);
00719   ~c4_BytesProp ();
00720   
00722   c4_BytesRef operator() (const c4_RowRef&) const;
00724   c4_Bytes Get(const c4_RowRef&) const;
00726   void Set(const c4_RowRef&, const c4_Bytes&) const;
00727 
00729   c4_Row operator[] (const c4_Bytes&) const;
00731   c4_Row AsRow(const c4_Bytes&) const;
00732 };
00733 
00735 class c4_ViewProp : public c4_Property
00736 {
00737 public:
00739   c4_ViewProp (const char*);
00741   ~c4_ViewProp ();
00742   
00744   c4_ViewRef operator() (const c4_RowRef&) const;
00746   c4_View Get(const c4_RowRef&) const;
00748   void Set(const c4_RowRef&, const c4_View&) const;
00749 
00751   c4_Row operator[] (const c4_View&) const;
00753   c4_Row AsRow(const c4_View&) const;
00754 };
00755 
00756 
00757 
00758 class c4_CustomViewer
00759 {
00760 protected: 
00762   c4_CustomViewer ();
00763 public: 
00765   virtual ~c4_CustomViewer ();
00766   
00768   virtual c4_View GetTemplate() = 0;
00770   virtual int GetSize() = 0;
00771   int Lookup(const c4_RowRef&, int&);
00772   virtual int Lookup(c4_Cursor, int&);
00774   virtual bool GetItem(int, int, c4_Bytes&) = 0;
00775   virtual bool SetItem(int, int, const c4_Bytes&);
00776   bool InsertRows(int, const c4_RowRef&, int =1);
00777   virtual bool InsertRows(int, c4_Cursor, int =1);
00778   virtual bool RemoveRows(int, int =1);
00779 };
00780 
00781 
00783 
00784 class c4_Stream
00785 {
00786 public:
00787   virtual ~c4_Stream ();
00788 
00790   virtual int Read(void*, int) = 0;
00792   virtual bool Write(const void*, int) = 0;
00793 };
00794 
00795 
00797 
00798 class c4_Strategy
00799 {
00800 public:
00801   c4_Strategy ();
00802   virtual ~c4_Strategy ();
00803 
00804   virtual bool IsValid() const;
00805   virtual int  DataRead(t4_i32, void*, int);
00806   virtual void DataWrite(t4_i32, const void*, int);
00807   virtual void DataCommit(t4_i32);
00808   virtual void ResetFileMapping();
00809   virtual t4_i32 FileSize();
00810   virtual t4_i32 FreshGeneration();
00811 
00812   void SetBase(t4_i32);
00813   t4_i32 EndOfData(t4_i32 =-1);
00814 
00816   bool _bytesFlipped;
00818   int _failure;
00820   const t4_byte* _mapStart;
00822   t4_i32 _dataSize;
00824   t4_i32 _baseOffset;
00826   t4_i32 _rootPos;
00828   t4_i32 _rootLen;
00829 };
00830 
00831 
00833 
00834 
00835 
00836 
00837 
00838 class c4_Sequence
00839 {
00841   int _refCount;
00843   c4_Dependencies* _dependencies;
00844 
00845 protected:
00847   int _propertyLimit;
00849   short* _propertyMap; 
00851   c4_Bytes* _tempBuf;
00852 
00853 public: 
00854 
00856   c4_Sequence ();
00857   
00858   virtual int Compare(int, c4_Cursor) const;
00859   virtual bool RestrictSearch(c4_Cursor, int&, int&);
00860   void SetAt(int, c4_Cursor);
00861   virtual int RemapIndex(int, const c4_Sequence*) const;
00862   
00863 
00864   void IncRef();
00865   void DecRef();
00866   int NumRefs() const;
00867 
00868 
00870   virtual int NumRows() const = 0;
00871   void Resize(int, int =-1);
00872   
00873   virtual void InsertAt(int, c4_Cursor, int =1);
00874   virtual void RemoveAt(int, int =1);
00875   virtual void Move(int, int);
00876 
00877 
00878   int NthPropId(int) const;
00879   int PropIndex(int);
00880   int PropIndex(const c4_Property&);
00881   
00883   virtual int NumHandlers() const = 0;
00885   virtual c4_Handler& NthHandler(int) const = 0;
00887   virtual const c4_Sequence* HandlerContext(int) const = 0;
00889   virtual int AddHandler(c4_Handler*) = 0;
00891   virtual c4_Handler* CreateHandler(const c4_Property&) = 0;
00892 
00893   virtual const char* Description();
00894 
00895 
00897   virtual int ItemSize(int, int);
00899   virtual bool Get(int, int, c4_Bytes&);
00901   virtual void Set(int, const c4_Property&, const c4_Bytes&);
00902   
00903 
00904   void Attach(c4_Sequence*);
00905   void Detach(c4_Sequence*);
00907   c4_Dependencies* GetDependencies() const;
00908 
00909   virtual c4_Notifier* PreChange(c4_Notifier&);
00910   virtual void PostChange(c4_Notifier&);
00911   
00912   const char* UseTempBuffer(const char*);
00913 
00914 protected:
00915   virtual ~c4_Sequence ();
00916 
00917   void ClearCache();
00918 
00919 public: 
00920   virtual void SetNumRows(int) = 0;
00921   virtual c4_Persist* Persist() const;
00922 
00923   c4_Bytes& Buffer();
00924 
00925 private:
00926   c4_Sequence (const c4_Sequence&);   
00927   void operator= (const c4_Sequence&); 
00928 };
00929 
00930 
00932 
00933 
00934 
00935 
00936 
00937 class c4_Reference
00938 {
00939 protected:
00941   c4_Cursor _cursor;
00943   const c4_Property& _property;
00944 
00945 public:
00947   c4_Reference (const c4_RowRef&, const c4_Property&);
00948 
00950   c4_Reference& operator= (const c4_Reference&);
00951 
00953   int GetSize() const;
00955   bool GetData(c4_Bytes&) const;
00957   void SetData(const c4_Bytes&) const;
00958   
00960   friend bool operator== (const c4_Reference&, const c4_Reference&);
00962   friend bool operator!= (const c4_Reference&, const c4_Reference&);
00963 
00964 private:
00965   void operator& () const;            
00966 };
00967 
00968 
00969 
00971 class c4_IntRef : public c4_Reference
00972 {
00973 public:
00975   c4_IntRef (const c4_Reference&);
00977   operator t4_i32 () const;
00979   c4_IntRef& operator= (t4_i32);
00980 };
00981 
00982 #if !q4_TINY
00983 
00985 class c4_LongRef : public c4_Reference
00986 {
00987 public:
00989   c4_LongRef (const c4_Reference&);
00991   operator t4_i64 () const;
00993   c4_LongRef& operator= (t4_i64);
00994 };
00995 
00997 class c4_FloatRef : public c4_Reference
00998 {
00999 public:
01001   c4_FloatRef (const c4_Reference&);
01003   operator double () const;
01005   c4_FloatRef& operator= (double);
01006 };
01007 
01009 class c4_DoubleRef : public c4_Reference
01010 {
01011 public:
01013   c4_DoubleRef (const c4_Reference&);
01015   operator double () const;
01017   c4_DoubleRef& operator= (double);
01018 };
01019 
01020 #endif // !q4_TINY
01021 
01023 class c4_BytesRef : public c4_Reference
01024 {
01025 public:
01027   c4_BytesRef (const c4_Reference&);
01029   operator c4_Bytes () const;
01031   c4_BytesRef& operator= (const c4_Bytes&);
01032 
01034   c4_Bytes Access(t4_i32, int =0) const;
01036   bool Modify(const c4_Bytes&, t4_i32, int =0) const;
01037 };
01038 
01040 class c4_StringRef : public c4_Reference
01041 {
01042 public:
01044   c4_StringRef (const c4_Reference&);
01046   operator const char* () const;
01048   c4_StringRef& operator= (const char*);
01049 };
01050 
01052 class c4_ViewRef : public c4_Reference
01053 {
01054 public:
01056   c4_ViewRef (const c4_Reference&);
01058   operator c4_View () const;
01060   c4_ViewRef& operator= (const c4_View&);
01061 };
01062 
01063 
01064 
01065 
01066 #if q4_LOGPROPMODS
01067 FILE* f4_LogPropMods(FILE* fp_, int propId_);
01068 #else
01069 #define f4_LogPropMods(a,b) 0
01070 #endif
01071 
01072 
01073 
01074 #if q4_INLINE
01075 #include "mk4.inl"
01076 #endif
01077 
01078 
01079 
01080 #endif // __MK4_H__