| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697 |
- /////////////////////////////////////////////////////////////////////////////
- // Name: variant.h
- // Purpose: interface of wxVariant
- // Author: wxWidgets team
- // Licence: wxWindows licence
- /////////////////////////////////////////////////////////////////////////////
- /**
- @class wxVariant
- The wxVariant class represents a container for any type. A variant's value
- can be changed at run time, possibly to a different type of value.
- @note As of wxWidgets 2.9.1, wxAny has become the preferred variant class.
- While most controls still use wxVariant in their interface, you
- can start using wxAny in your code because of an implicit conversion
- layer. See below for more information.
- As standard, wxVariant can store values of type bool, wxChar, double, long,
- string, string list, time, date, void pointer, list of strings, and list of
- variants. However, an application can extend wxVariant's capabilities by
- deriving from the class wxVariantData and using the wxVariantData form of
- the wxVariant constructor or assignment operator to assign this data to a
- variant. Actual values for user-defined types will need to be accessed via
- the wxVariantData object, unlike the case for basic data types where
- convenience functions such as GetLong() can be used.
- Under Microsoft Windows, three additional wxVariantData-derived classes --
- wxVariantDataCurrency, wxVariantDataErrorCode and wxVariantDataSafeArray --
- are available for interoperation with OLE VARIANT when using wxAutomationObject.
- Pointers to any wxObject derived class can also easily be stored in a
- wxVariant. wxVariant will then use wxWidgets' built-in RTTI system to set
- the type name (returned by GetType()) and to perform type-safety checks at
- runtime.
- This class is useful for reducing the programming for certain tasks, such
- as an editor for different data types, or a remote procedure call protocol.
- An optional name member is associated with a wxVariant. This might be used,
- for example, in CORBA or OLE automation classes, where named parameters are
- required.
- Note that as of wxWidgets 2.7.1, wxVariant is
- @ref overview_refcount "reference counted". Additionally, the convenience
- macros DECLARE_VARIANT_OBJECT() and IMPLEMENT_VARIANT_OBJECT() were added
- so that adding (limited) support for conversion to and from wxVariant can
- be very easily implemented without modifying either wxVariant or the class
- to be stored by wxVariant. Since assignment operators cannot be declared
- outside the class, the shift left operators are used like this:
- @code
- // in the header file
- DECLARE_VARIANT_OBJECT(MyClass)
- // in the implementation file
- IMPLEMENT_VARIANT_OBJECT(MyClass)
- // in the user code
- wxVariant variant;
- MyClass value;
- variant << value;
- // or
- value << variant;
- @endcode
- For this to work, MyClass must derive from wxObject, implement the
- @ref overview_rtti "wxWidgets RTTI system" and support the assignment
- operator and equality operator for itself. Ideally, it should also be
- reference counted to make copying operations cheap and fast. This can be
- most easily implemented using the reference counting support offered by
- wxObject itself. By default, wxWidgets already implements the shift
- operator conversion for a few of its drawing related classes:
- @code
- IMPLEMENT_VARIANT_OBJECT(wxColour)
- IMPLEMENT_VARIANT_OBJECT(wxImage)
- IMPLEMENT_VARIANT_OBJECT(wxIcon)
- IMPLEMENT_VARIANT_OBJECT(wxBitmap)
- @endcode
- Note that as of wxWidgets 2.9.0, wxVariantData no longer inherits from
- wxObject and wxVariant no longer uses the type-unsafe wxList class for list
- operations but the type-safe wxVariantList class. Also, wxVariantData now
- supports the wxVariantData::Clone() function for implementing the Unshare()
- function. wxVariantData::Clone() is implemented automatically by
- IMPLEMENT_VARIANT_OBJECT().
- Since wxVariantData no longer derives from wxObject, any code that tests
- the type of the data using wxDynamicCast() will require adjustment. You can
- use the macro wxDynamicCastVariantData() with the same arguments as
- wxDynamicCast(), to use C++ RTTI type information instead of wxWidgets
- RTTI.
- @section variant_wxanyconversion wxVariant to wxAny Conversion Layer
- wxAny is a more modern, template-based variant class. It is not
- directly compatible with wxVariant, but there is a transparent conversion
- layer.
- Following is an example how to use these conversions with wxPropertyGrid's
- property class wxPGProperty (which currently uses wxVariants both
- internally and in the public API):
- @code
- // Get property value as wxAny instead of wxVariant
- wxAny value = property->GetValue();
- // Do something with it
- DoSomethingWithString(value.As<wxString>());
- // Write back new value to property
- value = "New Value";
- property->SetValue(value);
- @endcode
- Some caveats:
- @li In wxAny, there are no separate types for handling integers of
- different sizes, so converting wxAny with 'long long' value
- will yield wxVariant of "long" type when the value is small
- enough to fit in without overflow. Otherwise, variant type
- "longlong" is used. Also note that wxAny holding unsigned integer
- will always be converted to "ulonglong" wxVariant type.
- @li Unlike wxVariant, wxAny does not store a (rarely needed) name string.
- @li Because of implicit conversion of wxVariant to wxAny, wxAny cannot
- usually contain value of type wxVariant. In other words,
- any.CheckType<wxVariant>() can never return @true.
- Supplied conversion functions will automatically work with all
- built-in wxVariant types, and also with all user-specified types generated
- using IMPLEMENT_VARIANT_OBJECT(). For hand-built wxVariantData classes,
- you will need to use supplied macros in a following manner:
- @code
- // Declare wxVariantData for data type Foo
- class wxVariantDataFoo: public wxVariantData
- {
- public:
- // interface
- // ...
- DECLARE_WXANY_CONVERSION()
- protected:
- // data storage etc
- // ...
- };
- IMPLEMENT_TRIVIAL_WXANY_CONVERSION(Foo, wxVariantDataFoo)
- @endcode
- @library{wxbase}
- @category{data}
- @see wxVariantData, wxAny
- */
- class wxVariant : public wxObject
- {
- public:
- /**
- Default constructor.
- */
- wxVariant();
- /**
- Constructs a variant directly with a wxVariantData object. wxVariant
- will take ownership of the wxVariantData and will not increase its
- reference count.
- */
- wxVariant(wxVariantData* data, const wxString& name = wxEmptyString);
- /**
- Constructs a variant from another variant by increasing the reference
- count.
- */
- wxVariant(const wxVariant& variant);
- /**
- Constructs a variant by converting it from wxAny.
- */
- wxVariant(const wxAny& any);
- /**
- Constructs a variant from a wide string literal.
- */
- wxVariant(const wxChar* value, const wxString& name = wxEmptyString);
- /**
- Constructs a variant from a string.
- */
- wxVariant(const wxString& value, const wxString& name = wxEmptyString);
- /**
- Constructs a variant from a wide char.
- */
- wxVariant(wxChar value, const wxString& name = wxEmptyString);
- /**
- Constructs a variant from a long.
- */
- wxVariant(long value, const wxString& name = wxEmptyString);
- /**
- Constructs a variant from a bool.
- */
- wxVariant(bool value, const wxString& name = wxEmptyString);
- /**
- Constructs a variant from a double.
- */
- wxVariant(double value, const wxString& name = wxEmptyString);
- /**
- Constructs a variant from a wxLongLong.
- */
- wxVariant(wxLongLong value, const wxString& name = wxEmptyString);
- /**
- Constructs a variant from a wxULongLong.
- */
- wxVariant(wxULongLong value, const wxString& name = wxEmptyString);
- /**
- Constructs a variant from a list of variants
- */
- wxVariant(const wxVariantList& value, const wxString& name = wxEmptyString);
- /**
- Constructs a variant from a void pointer.
- */
- wxVariant(void* value, const wxString& name = wxEmptyString);
- /**
- Constructs a variant from a pointer to an wxObject
- derived class.
- */
- wxVariant(wxObject* value, const wxString& name = wxEmptyString);
- /**
- Constructs a variant from a wxDateTime.
- */
- wxVariant(const wxDateTime& val, const wxString& name = wxEmptyString);
- /**
- Constructs a variant from a wxArrayString.
- */
- wxVariant(const wxArrayString& val, const wxString& name = wxEmptyString);
- /**
- Destructor.
- @note wxVariantData's destructor is protected, so wxVariantData cannot
- usually be deleted. Instead, wxVariantData::DecRef() should be
- called. See @ref overview_refcount_destruct
- "reference-counted object destruction" for more info.
- */
- virtual ~wxVariant();
- /**
- @name List Functionality
- */
- //@{
- /**
- Returns the value at @a idx (zero-based).
- */
- wxVariant operator [](size_t idx) const;
- /**
- Returns a reference to the value at @a idx (zero-based). This can be
- used to change the value at this index.
- */
- wxVariant& operator [](size_t idx);
- /**
- Appends a value to the list.
- */
- void Append(const wxVariant& value);
- /**
- Makes the variant null by deleting the internal data and set the name
- to wxEmptyString.
- */
- void Clear();
- /**
- Deletes the contents of the list.
- */
- void ClearList();
- /**
- Deletes the zero-based @a item from the list.
- */
- bool Delete(size_t item);
- /**
- Returns the number of elements in the list.
- */
- size_t GetCount() const;
- /**
- Returns a reference to the wxVariantList class used by wxVariant if
- this wxVariant is currently a list of variants.
- */
- wxVariantList& GetList() const;
- /**
- Inserts a value at the front of the list.
- */
- void Insert(const wxVariant& value);
- /**
- Makes an empty list. This differs from a null variant which has no
- data; a null list is of type list, but the number of elements in the
- list is zero.
- */
- void NullList();
- //@}
- //@{
- /**
- Retrieves and converts the value of this variant to the type that
- @a value is.
- */
- bool Convert(long* value) const;
- bool Convert(bool* value) const;
- bool Convert(double* value) const;
- bool Convert(wxString* value) const;
- bool Convert(wxChar* value) const;
- bool Convert(wxLongLong* value) const;
- bool Convert(wxULongLong* value) const;
- bool Convert(wxDateTime* value) const;
- //@}
- /**
- Converts wxVariant into wxAny.
- */
- wxAny GetAny() const;
- /**
- Returns the string array value.
- */
- wxArrayString GetArrayString() const;
- /**
- Returns the boolean value.
- */
- bool GetBool() const;
- /**
- Returns the character value.
- */
- wxUniChar GetChar() const;
- /**
- Returns a pointer to the internal variant data. To take ownership of
- this data, you must call its wxVariantData::IncRef() method. When you
- stop using it, wxVariantData::DecRef() must be called as well.
- */
- wxVariantData* GetData() const;
- /**
- Returns the date value.
- */
- wxDateTime GetDateTime() const;
- /**
- Returns the floating point value.
- */
- double GetDouble() const;
- /**
- Returns the integer value.
- */
- long GetLong() const;
- /**
- Returns the signed 64-bit integer value.
- */
- wxLongLong GetLongLong() const;
- /**
- Returns a constant reference to the variant name.
- */
- const wxString& GetName() const;
- /**
- Gets the string value.
- */
- wxString GetString() const;
- /**
- Returns the value type as a string.
- The built-in types are:
- - "bool"
- - "char"
- - "datetime"
- - "double"
- - "list"
- - "long"
- - "longlong"
- - "string"
- - "ulonglong"
- - "arrstring"
- - "void*"
- If the variant is null, the value type returned is the string "null"
- (not the empty string).
- */
- wxString GetType() const;
- /**
- Returns the unsigned 64-bit integer value.
- */
- wxULongLong GetULongLong() const;
- /**
- Gets the void pointer value.
- Notice that this method can be used for null objects (i.e. those for
- which IsNull() returns @true) and will return @NULL for them.
- */
- void* GetVoidPtr() const;
- /**
- Gets the wxObject pointer value.
- */
- wxObject* GetWxObjectPtr() const;
- /**
- Returns @true if there is no data associated with this variant, @false
- if there is data.
- */
- bool IsNull() const;
- /**
- Returns @true if @a type matches the type of the variant, @false
- otherwise.
- */
- bool IsType(const wxString& type) const;
- /**
- Returns @true if the data is derived from the class described by
- @a type, @false otherwise.
- */
- bool IsValueKindOf(const wxClassInfo* type) const;
- /**
- Makes the variant null by deleting the internal data.
- */
- void MakeNull();
- /**
- Makes a string representation of the variant value (for any type).
- */
- wxString MakeString() const;
- /**
- Returns @true if @a value matches an element in the list.
- */
- bool Member(const wxVariant& value) const;
- /**
- Sets the internal variant data, deleting the existing data if there is
- any.
- */
- void SetData(wxVariantData* data);
- /**
- Makes sure that any data associated with this variant is not shared
- with other variants. For this to work, wxVariantData::Clone() must be
- implemented for the data types you are working with.
- wxVariantData::Clone() is implemented for all the default data types.
- */
- bool Unshare();
- //@{
- /**
- Inequality test operator.
- */
- bool operator !=(const wxVariant& value) const;
- bool operator !=(const wxString& value) const;
- bool operator !=(const wxChar* value) const;
- bool operator !=(wxChar value) const;
- bool operator !=(long value) const;
- bool operator !=(bool value) const;
- bool operator !=(double value) const;
- bool operator !=(wxLongLong value) const;
- bool operator !=(wxULongLong value) const;
- bool operator !=(void* value) const;
- bool operator !=(wxObject* value) const;
- bool operator !=(const wxVariantList& value) const;
- bool operator !=(const wxArrayString& value) const;
- bool operator !=(const wxDateTime& value) const;
- //@}
- //@{
- /**
- Assignment operator, using @ref overview_refcount "reference counting"
- if possible.
- */
- void operator =(const wxVariant& value);
- void operator =(wxVariantData* value);
- void operator =(const wxString& value);
- void operator =(const wxChar* value);
- void operator =(wxChar value);
- void operator =(long value);
- void operator =(bool value);
- void operator =(double value);
- bool operator =(wxLongLong value) const;
- bool operator =(wxULongLong value) const;
- void operator =(void* value);
- void operator =(wxObject* value);
- void operator =(const wxVariantList& value);
- void operator =(const wxDateTime& value);
- void operator =(const wxArrayString& value);
- //@}
- //@{
- /**
- Equality test operator.
- */
- bool operator ==(const wxVariant& value) const;
- bool operator ==(const wxString& value) const;
- bool operator ==(const wxChar* value) const;
- bool operator ==(wxChar value) const;
- bool operator ==(long value) const;
- bool operator ==(bool value) const;
- bool operator ==(double value) const;
- bool operator ==(wxLongLong value) const;
- bool operator ==(wxULongLong value) const;
- bool operator ==(void* value) const;
- bool operator ==(wxObject* value) const;
- bool operator ==(const wxVariantList& value) const;
- bool operator ==(const wxArrayString& value) const;
- bool operator ==(const wxDateTime& value) const;
- //@}
- //@{
- /**
- Operators for implicit conversion, using appropriate getter member
- function.
- */
- double operator double() const;
- long operator long() const;
- wxLongLong operator wxLongLong() const;
- wxULongLong operator wxULongLong() const;
- //@}
- /**
- Operator for implicit conversion to a pointer to a void, using
- GetVoidPtr().
- */
- void* operator void*() const;
- /**
- Operator for implicit conversion to a wxChar, using GetChar().
- */
- char operator wxChar() const;
- /**
- Operator for implicit conversion to a pointer to a wxDateTime, using
- GetDateTime().
- */
- void* operator wxDateTime() const;
- /**
- Operator for implicit conversion to a string, using MakeString().
- */
- wxString operator wxString() const;
- };
- /**
- @class wxVariantData
- The wxVariantData class is used to implement a new type for wxVariant.
- Derive from wxVariantData, and override the pure virtual functions.
- wxVariantData is @ref overview_refcount "reference counted", but you don't
- normally have to care about this, as wxVariant manages the count
- automatically. However, in case your application needs to take ownership of
- wxVariantData, be aware that the object is created with a reference count
- of 1, and passing it to wxVariant will not increase this. In other words,
- IncRef() needs to be called only if you both take ownership of
- wxVariantData and pass it to a wxVariant. Also note that the destructor is
- protected, so you can never explicitly delete a wxVariantData instance.
- Instead, DecRef() will delete the object automatically when the reference
- count reaches zero.
- @library{wxbase}
- @category{data}
- @see wxVariant, wxGetVariantCast()
- */
- class wxVariantData : public wxObjectRefData
- {
- public:
- /**
- Default constructor.
- */
- wxVariantData();
- /**
- This function can be overridden to clone the data. You must implement
- this function in order for wxVariant::Unshare() to work for your data.
- This function is implemented for all built-in data types.
- */
- virtual wxVariantData* Clone() const;
- /**
- Decreases reference count. If the count reaches zero, the object is
- automatically deleted.
- @note The destructor of wxVariantData is protected, so delete cannot be
- used as normal. Instead, DecRef() should be called.
- */
- void DecRef();
- /**
- Returns @true if this object is equal to @a data.
- */
- virtual bool Eq(wxVariantData& data) const = 0;
- /**
- Converts value to wxAny, if possible. Return @true if successful.
- */
- virtual bool GetAny(wxAny* any) const;
- /**
- Returns the string type of the data.
- */
- virtual wxString GetType() const = 0;
- /**
- If the data is a wxObject returns a pointer to the objects wxClassInfo
- structure, if the data isn't a wxObject the method returns @NULL.
- */
- virtual wxClassInfo* GetValueClassInfo();
- /**
- Increases reference count. Note that initially wxVariantData has
- reference count of 1.
- */
- void IncRef();
- /**
- Reads the data from @a stream.
- */
- virtual bool Read(istream& stream);
- /**
- Reads the data from @a string.
- */
- virtual bool Read(wxString& string);
- /**
- Writes the data to @a stream.
- */
- virtual bool Write(ostream& stream) const;
- /**
- Writes the data to @a string.
- */
- virtual bool Write(wxString& string) const;
- };
- // ============================================================================
- // Global functions/macros
- // ============================================================================
- /** @addtogroup group_funcmacro_rtti */
- //@{
- /**
- This macro returns a pointer to the data stored in @a var (wxVariant) cast
- to the type @a classname if the data is of this type (the check is done
- during the run-time) or @NULL otherwise.
- @header{wx/variant.h}
- @see @ref overview_rtti, wxDynamicCast()
- */
- #define wxGetVariantCast(var, classname)
- //@}
|