00001 00002 // Name: variantref.h 00003 // Purpose: Base classes for reference-counted variant types 00004 // Author: Julian Smart 00005 // Modified by: 00006 // Created: 2006-05-11 00007 // RCS-ID: $$ 00008 // Copyright: (c) Julian Smart 00009 // Licence: New BSD License 00011 00012 #ifndef _WX_VARIANTREF_H_ 00013 #define _WX_VARIANTREF_H_ 00014 00015 #include "wx/defs.h" 00016 #include "wx/variant.h" 00017 00018 /* 00019 * wxVariantRefData is a wxVariantData object that is ref counted (holds and shares 00020 * the actual data). It doesn't get set directly into a wxVariant, but is stored 00021 * by a wxRefCountingVariantData object. 00022 * 00023 * We're not using the wxObject ref counting mechanism because we wish to 00024 * use RTTI in out referenced data, rather than deriving from wxObjectRefData. 00025 * Or could we derive from both? Possibly. 00026 00027 */ 00028 00029 class wxVariantRefData: public wxVariantData 00030 { 00031 DECLARE_CLASS(wxVariantRefData) 00032 public: 00033 00034 // Construction & destruction 00035 00036 wxVariantRefData():m_count(1) { } 00037 00038 virtual void Copy(wxVariantData& data) = 0; 00039 00040 // NEW OPERATIONS 00041 00042 int GetCount() const { return m_count; } 00043 void Inc() { m_count ++; } 00044 void Dec() { m_count --; } 00045 00046 private: 00047 00048 int m_count; 00049 }; 00050 00051 /* 00052 * wxRefCountingVariantData is a wxVariantData object that can do ref counting (points to a wxVariantRefData) 00053 */ 00054 00055 class wxRefCountingVariantData: public wxVariantData 00056 { 00057 DECLARE_CLASS(wxRefCountingVariantData) 00058 public: 00059 00060 // Construction & destruction 00061 00062 wxRefCountingVariantData(wxVariantRefData* data) { m_variantRefData = data; } 00063 wxRefCountingVariantData() { m_variantRefData = NULL; } 00064 ~wxRefCountingVariantData() { Unref(); } 00065 00066 // OVERRIDEABLES 00067 00069 virtual void Copy(wxVariantData& data); 00070 virtual bool Eq(wxVariantData& data) const; 00071 virtual bool Write(wxString& str) const; 00072 virtual bool Read(wxString& str); 00073 00074 // What type is it? Return a string name. 00075 virtual wxString GetType() const { return m_variantRefData ? m_variantRefData->GetType() : wxString(wxT("null")); } 00076 00077 // NEW OPERATIONS 00078 00079 void Ref(const wxRefCountingVariantData& data); 00080 void Unref(); 00081 virtual wxVariantRefData* CreateVariantRefData() = 0; 00082 wxVariantRefData* CloneVariantRefData(const wxVariantRefData* refData); 00083 00085 void AllocExclusive(); 00086 00087 wxVariantRefData* GetVariantRefData() const { return m_variantRefData; } 00088 00089 00090 private: 00091 00092 wxVariantRefData* m_variantRefData; 00093 }; 00094 00100 class wxClonableVariantData: public wxVariantData 00101 { 00102 DECLARE_CLASS(wxClonableVariantData) 00103 public: 00104 00105 // Construction & destruction 00106 00107 wxClonableVariantData() {} 00108 00109 virtual wxVariantData* Clone() = 0; 00110 }; 00111 00112 // wxWidgets is missing AllocExclusive for wxVariant 00113 void wxVariantAllocExclusive(wxVariant& variant); 00114 00115 #endif 00116 // _WX_VARIANTREF_H_