]>
git.saurik.com Git - wxWidgets.git/blob - interface/wx/variant.h
   1 ///////////////////////////////////////////////////////////////////////////// 
   3 // Purpose:     interface of wxVariant 
   4 // Author:      wxWidgets team 
   6 // Licence:     wxWindows license 
   7 ///////////////////////////////////////////////////////////////////////////// 
  12     The wxVariant class represents a container for any type. A variant's value 
  13     can be changed at run time, possibly to a different type of value. 
  15     As standard, wxVariant can store values of type bool, wxChar, double, long, 
  16     string, string list, time, date, void pointer, list of strings, and list of 
  17     variants. However, an application can extend wxVariant's capabilities by 
  18     deriving from the class wxVariantData and using the wxVariantData form of 
  19     the wxVariant constructor or assignment operator to assign this data to a 
  20     variant. Actual values for user-defined types will need to be accessed via 
  21     the wxVariantData object, unlike the case for basic data types where 
  22     convenience functions such as GetLong() can be used. 
  24     Pointers to any wxObject derived class can also easily be stored in a 
  25     wxVariant. wxVariant will then use wxWidgets' built-in RTTI system to set 
  26     the type name  (returned by GetType()) and to perform type-safety checks at 
  29     This class is useful for reducing the programming for certain tasks, such 
  30     as an editor for different data types, or a remote procedure call protocol. 
  32     An optional name member is associated with a wxVariant. This might be used, 
  33     for example, in CORBA or OLE automation classes, where named parameters are 
  36     Note that as of wxWidgets 2.7.1, wxVariant is 
  37     @ref overview_refcount "reference counted". Additionally, the convenience 
  38     macros DECLARE_VARIANT_OBJECT() and IMPLEMENT_VARIANT_OBJECT() were added 
  39     so that adding (limited) support for conversion to and from wxVariant can 
  40     be very easily implemented without modifying either wxVariant or the class 
  41     to be stored by wxVariant. Since assignment operators cannot be declared 
  42     outside the class, the shift left operators are used like this: 
  46     DECLARE_VARIANT_OBJECT(MyClass) 
  48     // in the implementation file 
  49     IMPLEMENT_VARIANT_OBJECT(MyClass) 
  60     For this to work, MyClass must derive from wxObject, implement the 
  61     @ref overview_rtti "wxWidgets RTTI system" and support the assignment 
  62     operator and equality operator for itself. Ideally, it should also be 
  63     reference counted to make copying operations cheap and fast. This can be 
  64     most easily implemented using the reference counting support offered by 
  65     wxObject itself. By default, wxWidgets already implements the shift 
  66     operator conversion for a few of its drawing related classes: 
  69     IMPLEMENT_VARIANT_OBJECT(wxColour) 
  70     IMPLEMENT_VARIANT_OBJECT(wxImage) 
  71     IMPLEMENT_VARIANT_OBJECT(wxIcon) 
  72     IMPLEMENT_VARIANT_OBJECT(wxBitmap) 
  75     Note that as of wxWidgets 2.9.0, wxVariantData no longer inherits from 
  76     wxObject and wxVariant no longer uses the type-unsafe wxList class for list 
  77     operations but the type-safe wxVariantList class. Also, wxVariantData now 
  78     supports the wxVariantData::Clone() function for implementing the Unshare() 
  79     function. wxVariantData::Clone() is implemented automatically by 
  80     IMPLEMENT_VARIANT_OBJECT(). 
  82     Since wxVariantData no longer derives from wxObject, any code that tests 
  83     the type of the data using wxDynamicCast() will require adjustment. You can 
  84     use the macro wxDynamicCastVariantData() with the same arguments as 
  85     wxDynamicCast(), to use C++ RTTI type information instead of wxWidgets 
  93 class wxVariant 
: public wxObject
 
 102         Constructs a variant directly with a wxVariantData object. wxVariant 
 103         will take ownership of the wxVariantData and will not increase its 
 106     wxVariant(wxVariantData
* data
, const wxString
& name 
= wxEmptyString
); 
 109         Constructs a variant from another variant by increasing the reference 
 112     wxVariant(const wxVariant
& variant
); 
 115         Constructs a variant from a wide string literal. 
 117     wxVariant(const wxChar
* value
, const wxString
& name 
= wxEmptyString
); 
 120         Constructs a variant from a string. 
 122     wxVariant(const wxString
& value
, const wxString
& name 
= wxEmptyString
); 
 125         Constructs a variant from a wide char. 
 127     wxVariant(wxChar value
, const wxString
& name 
= wxEmptyString
); 
 130         Constructs a variant from a long. 
 132     wxVariant(long value
, const wxString
& name 
= wxEmptyString
); 
 135         Constructs a variant from a bool. 
 137     wxVariant(bool value
, const wxString
& name 
= wxEmptyString
); 
 140         Constructs a variant from a double. 
 142     wxVariant(double value
, const wxString
& name 
= wxEmptyString
); 
 145         Constructs a variant from a list of variants 
 147     wxVariant(const wxVariantList
& value
, const wxString
& name 
= wxEmptyString
); 
 150         Constructs a variant from a void pointer. 
 152     wxVariant(void* value
, const wxString
& name 
= wxEmptyString
); 
 155         Constructs a variant from a pointer to an wxObject 
 158     wxVariant(wxObject
* value
, const wxString
& name 
= wxEmptyString
); 
 161         Constructs a variant from a wxDateTime. 
 163     wxVariant(const wxDateTime
& val
, const wxString
& name 
= wxEmptyString
); 
 166         Constructs a variant from a wxArrayString. 
 168     wxVariant(const wxArrayString
& val
, const wxString
& name 
= wxEmptyString
); 
 173         @note wxVariantData's destructor is protected, so wxVariantData cannot 
 174               usually be deleted. Instead, wxVariantData::DecRef() should be 
 175               called. See @ref overview_refcount_destruct 
 176               "reference-counted object destruction" for more info. 
 178     virtual ~wxVariant(); 
 182         @name List Functionality 
 187         Returns the value at @a idx (zero-based). 
 189     wxVariant 
operator [](size_t idx
) const; 
 191         Returns a reference to the value at @a idx (zero-based). This can be 
 192         used to change the value at this index. 
 194     wxVariant
& operator [](size_t idx
); 
 197         Appends a value to the list. 
 199     void Append(const wxVariant
& value
); 
 202         Makes the variant null by deleting the internal data and set the name 
 208         Deletes the contents of the list. 
 213         Deletes the zero-based @a item from the list. 
 215     bool Delete(size_t item
); 
 218         Returns the number of elements in the list. 
 220     size_t GetCount() const; 
 223         Returns a reference to the wxVariantList class used by wxVariant if 
 224         this wxVariant is currently a list of variants. 
 226     wxVariantList
& GetList() const; 
 229         Inserts a value at the front of the list. 
 231     void Insert(const wxVariant
& value
); 
 234         Makes an empty list. This differs from a null variant which has no 
 235         data; a null list is of type list, but the number of elements in the 
 245         Retrieves and converts the value of this variant to the type that 
 248     bool Convert(long* value
) const; 
 249     bool Convert(bool* value
) const; 
 250     bool Convert(double* value
) const; 
 251     bool Convert(wxString
* value
) const; 
 252     bool Convert(wxChar
* value
) const; 
 253     bool Convert(wxDateTime
* value
) const; 
 257         Returns the string array value. 
 259     wxArrayString 
GetArrayString() const; 
 262         Returns the boolean value. 
 264     bool GetBool() const; 
 267         Returns the character value. 
 269     wxUniChar 
GetChar() const; 
 272         Returns a pointer to the internal variant data. To take ownership of 
 273         this data, you must call its wxVariantData::IncRef() method. When you 
 274         stop using it, wxVariantData::DecRef() must be called as well. 
 276     wxVariantData
* GetData() const; 
 279         Returns the date value. 
 281     wxDateTime 
GetDateTime() const; 
 284         Returns the floating point value. 
 286     double GetDouble() const; 
 289         Returns the integer value. 
 291     long GetLong() const; 
 294         Returns a constant reference to the variant name. 
 296     const wxString
& GetName() const; 
 299         Gets the string value. 
 301     wxString 
GetString() const; 
 304         Returns the value type as a string. 
 306         The built-in types are: 
 317         If the variant is null, the value type returned is the string "null" 
 318         (not the empty string). 
 320     wxString 
GetType() const; 
 323         Gets the void pointer value. 
 325     void* GetVoidPtr() const; 
 328         Gets the wxObject pointer value. 
 330     wxObject
* GetWxObjectPtr() const; 
 333         Returns @true if there is no data associated with this variant, @false 
 339         Returns @true if @a type matches the type of the variant, @false 
 342     bool IsType(const wxString
& type
) const; 
 345         Returns @true if the data is derived from the class described by 
 346         @a type, @false otherwise. 
 348     bool IsValueKindOf(const wxClassInfo
* type
) const; 
 351         Makes the variant null by deleting the internal data. 
 356         Makes a string representation of the variant value (for any type). 
 358     wxString 
MakeString() const; 
 361         Returns @true if @a value matches an element in the list. 
 363     bool Member(const wxVariant
& value
) const; 
 366         Sets the internal variant data, deleting the existing data if there is 
 369     void SetData(wxVariantData
* data
); 
 372         Makes sure that any data associated with this variant is not shared 
 373         with other variants. For this to work, wxVariantData::Clone() must be 
 374         implemented for the data types you are working with. 
 375         wxVariantData::Clone() is implemented for all the default data types. 
 381         Inequality test operator. 
 383     bool operator !=(const wxVariant
& value
) const; 
 384     bool operator !=(const wxString
& value
) const; 
 385     bool operator !=(const wxChar
* value
) const; 
 386     bool operator !=(wxChar value
) const; 
 387     bool operator !=(long value
) const; 
 388     bool operator !=(bool value
) const; 
 389     bool operator !=(double value
) const; 
 390     bool operator !=(void* value
) const; 
 391     bool operator !=(wxObject
* value
) const; 
 392     bool operator !=(const wxVariantList
& value
) const; 
 393     bool operator !=(const wxArrayString
& value
) const; 
 394     bool operator !=(const wxDateTime
& value
) const; 
 399         Assignment operator, using @ref overview_refcount "reference counting" 
 402     void operator =(const wxVariant
& value
); 
 403     void operator =(wxVariantData
* value
); 
 404     void operator =(const wxString
& value
); 
 405     void operator =(const wxChar
* value
); 
 406     void operator =(wxChar value
); 
 407     void operator =(long value
); 
 408     void operator =(bool value
); 
 409     void operator =(double value
); 
 410     void operator =(void* value
); 
 411     void operator =(wxObject
* value
); 
 412     void operator =(const wxVariantList
& value
); 
 413     void operator =(const wxDateTime
& value
); 
 414     void operator =(const wxArrayString
& value
); 
 419         Equality test operator. 
 421     bool operator ==(const wxVariant
& value
) const; 
 422     bool operator ==(const wxString
& value
) const; 
 423     bool operator ==(const wxChar
* value
) const; 
 424     bool operator ==(wxChar value
) const; 
 425     bool operator ==(long value
) const; 
 426     bool operator ==(bool value
) const; 
 427     bool operator ==(double value
) const; 
 428     bool operator ==(void* value
) const; 
 429     bool operator ==(wxObject
* value
) const; 
 430     bool operator ==(const wxVariantList
& value
) const; 
 431     bool operator ==(const wxArrayString
& value
) const; 
 432     bool operator ==(const wxDateTime
& value
) const; 
 437         Operator for implicit conversion to a long, using GetLong(). 
 439     double operator double() const; 
 440     long operator long() const; 
 444         Operator for implicit conversion to a pointer to a void, using 
 447     void* operator void*() const; 
 450         Operator for implicit conversion to a wxChar, using GetChar(). 
 452     char operator wxChar() const; 
 455         Operator for implicit conversion to a pointer to a wxDateTime, using 
 458     void* operator wxDateTime() const; 
 461         Operator for implicit conversion to a string, using MakeString(). 
 463     wxString 
operator wxString() const; 
 471     The wxVariantData class is used to implement a new type for wxVariant. 
 472     Derive from wxVariantData, and override the pure virtual functions. 
 474     wxVariantData is @ref overview_refcount "reference counted", but you don't 
 475     normally have to care about this, as wxVariant manages the count 
 476     automatically. However, in case your application needs to take ownership of 
 477     wxVariantData, be aware that the object is created with a reference count 
 478     of 1, and passing it to wxVariant will not increase this. In other words, 
 479     IncRef() needs to be called only if you both take ownership of 
 480     wxVariantData and pass it to a wxVariant. Also note that the destructor is 
 481     protected, so you can never explicitly delete a wxVariantData instance. 
 482     Instead, DecRef() will delete the object automatically when the reference 
 488     @see wxVariant, wxGetVariantCast() 
 499         This function can be overridden to clone the data. You must implement 
 500         this function in order for wxVariant::Unshare() to work for your data. 
 501         This function is implemented for all built-in data types. 
 503     virtual wxVariantData
* Clone() const; 
 506         Decreases reference count. If the count reaches zero, the object is 
 507         automatically deleted. 
 509         @note The destructor of wxVariantData is protected, so delete cannot be 
 510               used as normal. Instead, DecRef() should be called. 
 515         Returns @true if this object is equal to @a data. 
 517     virtual bool Eq(wxVariantData
& data
) const = 0; 
 520         Returns the string type of the data. 
 522     virtual wxString 
GetType() const = 0; 
 525         If the data is a wxObject returns a pointer to the objects wxClassInfo 
 526         structure, if the data isn't a wxObject the method returns @NULL. 
 528     virtual wxClassInfo
* GetValueClassInfo(); 
 531         Increases reference count. Note that initially wxVariantData has 
 532         reference count of 1. 
 537         Reads the data from @a stream. 
 539     virtual bool Read(istream
& stream
); 
 542         Reads the data from @a string. 
 544     virtual bool Read(wxString
& string
); 
 547         Writes the data to @a stream. 
 549     virtual bool Write(ostream
& stream
) const; 
 551         Writes the data to @a string. 
 553     virtual bool Write(wxString
& string
) const; 
 558 // ============================================================================ 
 559 // Global functions/macros 
 560 // ============================================================================ 
 562 /** @ingroup group_funcmacro_rtti */ 
 566     This macro returns a pointer to the data stored in @a var (wxVariant) cast 
 567     to the type @a classname if the data is of this type (the check is done 
 568     during the run-time) or @NULL otherwise. 
 570     @header{wx/variant.h} 
 572     @see @ref overview_rtti, wxDynamicCast() 
 574 #define wxGetVariantCast(var, classname)