| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278 |
- /////////////////////////////////////////////////////////////////////////////
- // Name: wx/variantbase.h
- // Purpose: wxVariantBase class, a minimal version of wxVariant used by XTI
- // Author: Julian Smart
- // Modified by: Francesco Montorsi
- // Created: 10/09/98
- // Copyright: (c) Julian Smart
- // Licence: wxWindows licence
- /////////////////////////////////////////////////////////////////////////////
- #ifndef _WX_VARIANTBASE_H_
- #define _WX_VARIANTBASE_H_
- #include "wx/defs.h"
- #if wxUSE_VARIANT
- #include "wx/string.h"
- #include "wx/arrstr.h"
- #include "wx/cpp.h"
- #include <typeinfo>
- #if wxUSE_DATETIME
- #include "wx/datetime.h"
- #endif // wxUSE_DATETIME
- #include "wx/iosfwrap.h"
- class wxTypeInfo;
- class wxObject;
- class wxClassInfo;
- /*
- * wxVariantData stores the actual data in a wxVariant object,
- * to allow it to store any type of data.
- * Derive from this to provide custom data handling.
- *
- * NB: To prevent addition of extra vtbl pointer to wxVariantData,
- * we don't multiple-inherit from wxObjectRefData. Instead,
- * we simply replicate the wxObject ref-counting scheme.
- *
- * NB: When you construct a wxVariantData, it will have refcount
- * of one. Refcount will not be further increased when
- * it is passed to wxVariant. This simulates old common
- * scenario where wxVariant took ownership of wxVariantData
- * passed to it.
- * If you create wxVariantData for other reasons than passing
- * it to wxVariant, technically you are not required to call
- * DecRef() before deleting it.
- *
- * TODO: in order to replace wxPropertyValue, we would need
- * to consider adding constructors that take pointers to C++ variables,
- * or removing that functionality from the wxProperty library.
- * Essentially wxPropertyValue takes on some of the wxValidator functionality
- * by storing pointers and not just actual values, allowing update of C++ data
- * to be handled automatically. Perhaps there's another way of doing this without
- * overloading wxVariant with unnecessary functionality.
- */
- class WXDLLIMPEXP_BASE wxVariantData
- {
- friend class wxVariantBase;
- public:
- wxVariantData()
- : m_count(1)
- { }
- #if wxUSE_STD_IOSTREAM
- virtual bool Write(wxSTD ostream& WXUNUSED(str)) const { return false; }
- virtual bool Read(wxSTD istream& WXUNUSED(str)) { return false; }
- #endif
- virtual bool Write(wxString& WXUNUSED(str)) const { return false; }
- virtual bool Read(wxString& WXUNUSED(str)) { return false; }
- // Override these to provide common functionality
- virtual bool Eq(wxVariantData& data) const = 0;
- // What type is it? Return a string name.
- virtual wxString GetType() const = 0;
- // returns the type info of the content
- virtual const wxTypeInfo* GetTypeInfo() const = 0;
- // If it based on wxObject return the ClassInfo.
- virtual wxClassInfo* GetValueClassInfo() { return NULL; }
- int GetRefCount() const
- { return m_count; }
- void IncRef()
- { m_count++; }
- void DecRef()
- {
- if ( --m_count == 0 )
- delete this;
- }
- protected:
- // Protected dtor should make some incompatible code
- // break more louder. That is, they should do data->DecRef()
- // instead of delete data.
- virtual ~wxVariantData() {}
- private:
- int m_count;
- };
- template<typename T> class wxVariantDataT : public wxVariantData
- {
- public:
- wxVariantDataT(const T& d) : m_data(d) {}
- virtual ~wxVariantDataT() {}
- // get a ref to the stored data
- T & Get() { return m_data; }
- // get a const ref to the stored data
- const T & Get() const { return m_data; }
- // set the data
- void Set(const T& d) { m_data = d; }
- // Override these to provide common functionality
- virtual bool Eq(wxVariantData& WXUNUSED(data)) const
- { return false; /* FIXME!! */ }
- // What type is it? Return a string name.
- virtual wxString GetType() const
- { return GetTypeInfo()->GetTypeName(); }
- // return a heap allocated duplicate
- //virtual wxVariantData* Clone() const { return new wxVariantDataT<T>( Get() ); }
- // returns the type info of the contentc
- virtual const wxTypeInfo* GetTypeInfo() const { return wxGetTypeInfo( (T*) NULL ); }
- private:
- T m_data;
- };
- /*
- * wxVariantBase can store any kind of data, but has some basic types
- * built in.
- */
- class WXDLLIMPEXP_BASE wxVariantBase
- {
- public:
- wxVariantBase();
- wxVariantBase(const wxVariantBase& variant);
- wxVariantBase(wxVariantData* data, const wxString& name = wxEmptyString);
- template<typename T>
- wxVariantBase(const T& data, const wxString& name = wxEmptyString) :
- m_data(new wxVariantDataT<T>(data)), m_name(name) {}
- virtual ~wxVariantBase();
- // generic assignment
- void operator= (const wxVariantBase& variant);
- // Assignment using data, e.g.
- // myVariant = new wxStringVariantData("hello");
- void operator= (wxVariantData* variantData);
- bool operator== (const wxVariantBase& variant) const;
- bool operator!= (const wxVariantBase& variant) const;
- // Sets/gets name
- inline void SetName(const wxString& name) { m_name = name; }
- inline const wxString& GetName() const { return m_name; }
- // Tests whether there is data
- bool IsNull() const;
- // FIXME: used by wxVariantBase code but is nice wording...
- bool IsEmpty() const { return IsNull(); }
- // For compatibility with wxWidgets <= 2.6, this doesn't increase
- // reference count.
- wxVariantData* GetData() const { return m_data; }
- void SetData(wxVariantData* data) ;
- // make a 'clone' of the object
- void Ref(const wxVariantBase& clone);
- // destroy a reference
- void UnRef();
- // Make NULL (i.e. delete the data)
- void MakeNull();
- // write contents to a string (e.g. for debugging)
- wxString MakeString() const;
- // Delete data and name
- void Clear();
- // Returns a string representing the type of the variant,
- // e.g. "string", "bool", "stringlist", "list", "double", "long"
- wxString GetType() const;
- bool IsType(const wxString& type) const;
- bool IsValueKindOf(const wxClassInfo* type) const;
- // FIXME wxXTI methods:
- // get the typeinfo of the stored object
- const wxTypeInfo* GetTypeInfo() const
- {
- if (!m_data)
- return NULL;
- return m_data->GetTypeInfo();
- }
- // get a ref to the stored data
- template<typename T> T& Get(wxTEMPLATED_MEMBER_FIX(T))
- {
- wxVariantDataT<T> *dataptr =
- wx_dynamic_cast(wxVariantDataT<T>*, m_data);
- wxASSERT_MSG( dataptr,
- wxString::Format(wxT("Cast to %s not possible"), typeid(T).name()) );
- return dataptr->Get();
- }
- // get a const ref to the stored data
- template<typename T> const T& Get(wxTEMPLATED_MEMBER_FIX(T)) const
- {
- const wxVariantDataT<T> *dataptr =
- wx_dynamic_cast(const wxVariantDataT<T>*, m_data);
- wxASSERT_MSG( dataptr,
- wxString::Format(wxT("Cast to %s not possible"), typeid(T).name()) );
- return dataptr->Get();
- }
- template<typename T> bool HasData(wxTEMPLATED_MEMBER_FIX(T)) const
- {
- const wxVariantDataT<T> *dataptr =
- wx_dynamic_cast(const wxVariantDataT<T>*, m_data);
- return dataptr != NULL;
- }
- // returns this value as string
- wxString GetAsString() const;
- // gets the stored data casted to a wxObject*,
- // returning NULL if cast is not possible
- wxObject* GetAsObject();
- protected:
- wxVariantData* m_data;
- wxString m_name;
- };
- #include "wx/dynarray.h"
- WX_DECLARE_OBJARRAY_WITH_DECL(wxVariantBase, wxVariantBaseArray, class WXDLLIMPEXP_BASE);
- // templated streaming, every type must have their specialization for these methods
- template<typename T>
- void wxStringReadValue( const wxString &s, T &data );
- template<typename T>
- void wxStringWriteValue( wxString &s, const T &data);
- template<typename T>
- void wxToStringConverter( const wxVariantBase &v, wxString &s wxTEMPLATED_FUNCTION_FIX(T)) \
- { wxStringWriteValue( s, v.wxTEMPLATED_MEMBER_CALL(Get, T) ); }
- template<typename T>
- void wxFromStringConverter( const wxString &s, wxVariantBase &v wxTEMPLATED_FUNCTION_FIX(T)) \
- { T d; wxStringReadValue( s, d ); v = wxVariantBase(d); }
- #endif // wxUSE_VARIANT
- #endif // _WX_VARIANTBASE_H_
|