#include "wx/arrstr.h"
#include "wx/list.h"
#include "wx/cpp.h"
+#include "wx/longlong.h"
#if wxUSE_DATETIME
#include "wx/datetime.h"
#endif // wxUSE_DATETIME
-#if wxUSE_ODBC
- #include "wx/db.h" // will #include sqltypes.h
-#endif //ODBC
-
#include "wx/iosfwrap.h"
/*
* 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
* overloading wxVariant with unnecessary functionality.
*/
-class WXDLLIMPEXP_BASE wxVariantData
+class WXDLLIMPEXP_BASE wxVariantData : public wxObjectRefData
{
friend class wxVariant;
public:
- wxVariantData() : m_count(1) { }
+ wxVariantData() { }
// Override these to provide common functionality
virtual bool Eq(wxVariantData& data) const = 0;
// If it based on wxObject return the ClassInfo.
virtual wxClassInfo* GetValueClassInfo() { return NULL; }
- void IncRef() { m_count++; }
- void DecRef()
- {
- if ( --m_count == 0 )
- delete this;
- }
-
- int GetRefCount() const { return m_count; }
+ // Implement this to make wxVariant::UnShare work. Returns
+ // a copy of the data.
+ virtual wxVariantData* Clone() const { return NULL; }
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;
};
/*
* built in.
*/
+class WXDLLIMPEXP_FWD_BASE wxVariant;
+
+WX_DECLARE_LIST_WITH_DECL(wxVariant, wxVariantList, class WXDLLIMPEXP_BASE);
+
class WXDLLIMPEXP_BASE wxVariant: public wxObject
{
public:
// For compatibility with wxWidgets <= 2.6, this doesn't increase
// reference count.
- wxVariantData* GetData() const { return m_data; }
+ wxVariantData* GetData() const
+ {
+ return (wxVariantData*) m_refData;
+ }
void SetData(wxVariantData* data) ;
// make a 'clone' of the object
- void Ref(const wxVariant& clone);
+ void Ref(const wxVariant& clone) { wxObject::Ref(clone); }
- // destroy a reference
- void UnRef();
+ // ensure that the data is exclusive to this variant, and not shared
+ bool Unshare();
// Make NULL (i.e. delete the data)
void MakeNull();
long GetLong() const;
// bool
-#ifdef HAVE_BOOL
wxVariant(bool val, const wxString& name = wxEmptyString);
bool operator== (bool value) const;
bool operator!= (bool value) const;
void operator= (bool value) ;
inline operator bool () const { return GetBool(); }
bool GetBool() const ;
-#endif
// wxDateTime
#if wxUSE_DATETIME
wxVariant(const wxDateTime& val, const wxString& name = wxEmptyString);
-#if wxUSE_ODBC
- wxVariant(const DATE_STRUCT* valptr, const wxString& name = wxEmptyString);
- wxVariant(const TIME_STRUCT* valptr, const wxString& name = wxEmptyString);
- wxVariant(const TIMESTAMP_STRUCT* valptr, const wxString& name = wxEmptyString);
-#endif
bool operator== (const wxDateTime& value) const;
bool operator!= (const wxDateTime& value) const;
void operator= (const wxDateTime& value) ;
-#if wxUSE_ODBC
- void operator= (const DATE_STRUCT* value) ;
- void operator= (const TIME_STRUCT* value) ;
- void operator= (const TIMESTAMP_STRUCT* value) ;
-#endif
inline operator wxDateTime () const { return GetDateTime(); }
wxDateTime GetDateTime() const;
#endif
wxVariant(const char* val, const wxString& name = wxEmptyString);
wxVariant(const wchar_t* val, const wxString& name = wxEmptyString);
wxVariant(const wxCStrData& val, const wxString& name = wxEmptyString);
- wxVariant(const wxCharBuffer& val, const wxString& name = wxEmptyString);
- wxVariant(const wxWCharBuffer& val, const wxString& name = wxEmptyString);
+ wxVariant(const wxScopedCharBuffer& val, const wxString& name = wxEmptyString);
+ wxVariant(const wxScopedWCharBuffer& val, const wxString& name = wxEmptyString);
bool operator== (const wxString& value) const;
bool operator!= (const wxString& value) const;
wxVariant& operator=(const wxCStrData& value)
{ return *this = value.AsString(); }
template<typename T>
- wxVariant& operator=(const wxCharTypeBuffer<T>& value)
+ wxVariant& operator=(const wxScopedCharTypeBuffer<T>& value)
{ return *this = value.data(); }
inline operator wxString () const { return MakeString(); }
void operator= (wxObject* value);
wxObject* GetWxObjectPtr() const;
+#if wxUSE_LONGLONG
+ // wxLongLong
+ wxVariant(wxLongLong, const wxString& name = wxEmptyString);
+ bool operator==(wxLongLong value) const;
+ bool operator!=(wxLongLong value) const;
+ void operator=(wxLongLong value);
+ operator wxLongLong() const { return GetLongLong(); }
+ wxLongLong GetLongLong() const;
+
+ // wxULongLong
+ wxVariant(wxULongLong, const wxString& name = wxEmptyString);
+ bool operator==(wxULongLong value) const;
+ bool operator!=(wxULongLong value) const;
+ void operator=(wxULongLong value);
+ operator wxULongLong() const { return GetULongLong(); }
+ wxULongLong GetULongLong() const;
+#endif
// ------------------------------
// list operations
// ------------------------------
- wxVariant(const wxList& val, const wxString& name = wxEmptyString); // List of variants
- bool operator== (const wxList& value) const;
- bool operator!= (const wxList& value) const;
- void operator= (const wxList& value) ;
+ wxVariant(const wxVariantList& val, const wxString& name = wxEmptyString); // List of variants
+ bool operator== (const wxVariantList& value) const;
+ bool operator!= (const wxVariantList& value) const;
+ void operator= (const wxVariantList& value) ;
// Treat a list variant as an array
wxVariant operator[] (size_t idx) const;
wxVariant& operator[] (size_t idx) ;
- wxList& GetList() const ;
+ wxVariantList& GetList() const ;
// Return the number of elements in a list
size_t GetCount() const;
#if wxUSE_DATETIME
bool Convert(wxDateTime* value) const;
#endif // wxUSE_DATETIME
+#if wxUSE_LONGLONG
+ bool Convert(wxLongLong* value) const;
+ bool Convert(wxULongLong* value) const;
+#endif // wxUSE_LONGLONG
// Attributes
protected:
- wxVariantData* m_data;
+ virtual wxObjectRefData *CreateRefData() const;
+ virtual wxObjectRefData *CloneRefData(const wxObjectRefData *data) const;
+
wxString m_name;
private:
\
virtual wxString GetType() const; \
virtual wxClassInfo* GetValueClassInfo(); \
+\
+ virtual wxVariantData* Clone() const { return new classname##VariantData(m_value); } \
\
protected:\
classname m_value; \
((classname*)(var.IsValueKindOf(&classname::ms_classInfo) ?\
var.GetWxObjectPtr() : NULL));
+// Replacement for using wxDynamicCast on a wxVariantData object
+#define wxDynamicCastVariantData(data, classname) dynamic_cast<classname*>(data)
+
extern wxVariant WXDLLIMPEXP_BASE wxNullVariant;
#endif // wxUSE_VARIANT