1 ///////////////////////////////////////////////////////////////////////////// 
   2 // Name:        src/common/variant.cpp 
   3 // Purpose:     wxVariant class, container for any type 
   4 // Author:      Julian Smart 
   9 // Licence:     wxWindows licence 
  10 ///////////////////////////////////////////////////////////////////////////// 
  12 // For compilers that support precompilation, includes "wx/wx.h". 
  13 #include "wx/wxprec.h" 
  19 #include "wx/variant.h" 
  24     #include "wx/string.h" 
  28         #include "wx/stream.h" 
  32 #if wxUSE_STD_IOSTREAM 
  40 #if defined(__MWERKS__) && __MSL__ >= 0x6000 
  46     #include "wx/txtstrm.h" 
  49 #include "wx/string.h" 
  50 #include "wx/tokenzr.h" 
  52 wxVariant WXDLLIMPEXP_BASE wxNullVariant
; 
  55 #include "wx/listimpl.cpp" 
  56 WX_DEFINE_LIST(wxVariantList
) 
  62 IMPLEMENT_DYNAMIC_CLASS(wxVariant
, wxObject
) 
  64 wxVariant::wxVariant() 
  69 bool wxVariant::IsNull() const 
  71      return (m_refData 
== NULL
); 
  74 void wxVariant::MakeNull() 
  79 void wxVariant::Clear() 
  81     m_name 
= wxEmptyString
; 
  84 wxVariant::wxVariant(const wxVariant
& variant
) 
  87     if (!variant
.IsNull()) 
  90     m_name 
= variant
.m_name
; 
  93 wxVariant::wxVariant(wxVariantData
* data
, const wxString
& name
) // User-defined data 
 100 wxVariant::~wxVariant() 
 104 wxObjectRefData 
*wxVariant::CreateRefData() const 
 106     // We cannot create any particular wxVariantData. 
 107     wxFAIL_MSG("wxVariant::CreateRefData() cannot be implemented"); 
 111 wxObjectRefData 
*wxVariant::CloneRefData(const wxObjectRefData 
*data
) const 
 113     return ((wxVariantData
*) data
)->Clone(); 
 117 void wxVariant::operator= (const wxVariant
& variant
) 
 120     m_name 
= variant
.m_name
; 
 123 // myVariant = new wxStringVariantData("hello") 
 124 void wxVariant::operator= (wxVariantData
* variantData
) 
 127     m_refData 
= variantData
; 
 130 bool wxVariant::operator== (const wxVariant
& variant
) const 
 132     if (IsNull() || variant
.IsNull()) 
 133         return (IsNull() == variant
.IsNull()); 
 135     if (GetType() != variant
.GetType()) 
 138     return (GetData()->Eq(* variant
.GetData())); 
 141 bool wxVariant::operator!= (const wxVariant
& variant
) const 
 143     return (!(*this == variant
)); 
 146 wxString 
wxVariant::MakeString() const 
 151         if (GetData()->Write(str
)) 
 154     return wxEmptyString
; 
 157 void wxVariant::SetData(wxVariantData
* data
) 
 163 bool wxVariant::Unshare() 
 165     if ( !m_refData 
|| m_refData
->GetRefCount() == 1 ) 
 170     return (m_refData 
&& m_refData
->GetRefCount() == 1); 
 174 // Returns a string representing the type of the variant, 
 175 // e.g. "string", "bool", "list", "double", "long" 
 176 wxString 
wxVariant::GetType() const 
 179         return wxString(wxT("null")); 
 181         return GetData()->GetType(); 
 185 bool wxVariant::IsType(const wxString
& type
) const 
 187     return (GetType() == type
); 
 190 bool wxVariant::IsValueKindOf(const wxClassInfo
* type
) const 
 192     wxClassInfo
* info
=GetData()->GetValueClassInfo(); 
 193     return info 
? info
->IsKindOf(type
) : false ; 
 196 // ----------------------------------------------------------------- 
 197 // wxVariant <-> wxAny conversion code 
 198 // ----------------------------------------------------------------- 
 202 wxAnyToVariantRegistration:: 
 203     wxAnyToVariantRegistration(wxVariantDataFactory factory
) 
 206     wxPreRegisterAnyToVariant(this); 
 209 wxAnyToVariantRegistration::~wxAnyToVariantRegistration() 
 213 wxVariant::wxVariant(const wxAny
& any
) 
 217     if ( !any
.GetAs(&variant
) ) 
 219         wxFAIL_MSG("wxAny of this type cannot be converted to wxVariant"); 
 226 wxAny 
wxVariant::GetAny() const 
 233     wxVariantData
* data 
= GetData(); 
 235     if ( data
->GetAsAny(&any
) ) 
 238     // If everything else fails, wrap the whole wxVariantData 
 244 // ----------------------------------------------------------------- 
 246 // ----------------------------------------------------------------- 
 248 class WXDLLIMPEXP_BASE wxVariantDataLong
: public wxVariantData
 
 251     wxVariantDataLong() { m_value 
= 0; } 
 252     wxVariantDataLong(long value
) { m_value 
= value
; } 
 254     inline long GetValue() const { return m_value
; } 
 255     inline void SetValue(long value
) { m_value 
= value
; } 
 257     virtual bool Eq(wxVariantData
& data
) const; 
 259     virtual bool Read(wxString
& str
); 
 260     virtual bool Write(wxString
& str
) const; 
 261 #if wxUSE_STD_IOSTREAM 
 262     virtual bool Read(wxSTD istream
& str
); 
 263     virtual bool Write(wxSTD ostream
& str
) const; 
 266     virtual bool Read(wxInputStream
& str
); 
 267     virtual bool Write(wxOutputStream 
&str
) const; 
 268 #endif // wxUSE_STREAMS 
 270     wxVariantData
* Clone() const { return new wxVariantDataLong(m_value
); } 
 272     virtual wxString 
GetType() const { return wxT("long"); } 
 274     // Since wxAny does not have separate type for integers shorter than 
 275     // longlong, we do not usually implement wxVariant->wxAny conversion 
 276     // here (but in wxVariantDataLongLong instead). 
 278     DECLARE_WXANY_CONVERSION() 
 280     bool GetAsAny(wxAny
* any
) const 
 292 IMPLEMENT_TRIVIAL_WXANY_CONVERSION(long, wxVariantDataLong
) 
 295 bool wxVariantDataLong::Eq(wxVariantData
& data
) const 
 297     wxASSERT_MSG( (data
.GetType() == wxT("long")), wxT("wxVariantDataLong::Eq: argument mismatch") ); 
 299     wxVariantDataLong
& otherData 
= (wxVariantDataLong
&) data
; 
 301     return (otherData
.m_value 
== m_value
); 
 304 #if wxUSE_STD_IOSTREAM 
 305 bool wxVariantDataLong::Write(wxSTD ostream
& str
) const 
 309     str 
<< (const char*) s
.mb_str(); 
 314 bool wxVariantDataLong::Write(wxString
& str
) const 
 316     str
.Printf(wxT("%ld"), m_value
); 
 320 #if wxUSE_STD_IOSTREAM 
 321 bool wxVariantDataLong::Read(wxSTD istream
& str
) 
 329 bool wxVariantDataLong::Write(wxOutputStream
& str
) const 
 331     wxTextOutputStream 
s(str
); 
 333     s
.Write32((size_t)m_value
); 
 337 bool wxVariantDataLong::Read(wxInputStream
& str
) 
 339    wxTextInputStream 
s(str
); 
 340    m_value 
= s
.Read32(); 
 343 #endif // wxUSE_STREAMS 
 345 bool wxVariantDataLong::Read(wxString
& str
) 
 347     m_value 
= wxAtol(str
); 
 353 wxVariant::wxVariant(long val
, const wxString
& name
) 
 355     m_refData 
= new wxVariantDataLong(val
); 
 359 wxVariant::wxVariant(int val
, const wxString
& name
) 
 361     m_refData 
= new wxVariantDataLong((long)val
); 
 365 wxVariant::wxVariant(short val
, const wxString
& name
) 
 367     m_refData 
= new wxVariantDataLong((long)val
); 
 371 bool wxVariant::operator== (long value
) const 
 374     if (!Convert(&thisValue
)) 
 377         return (value 
== thisValue
); 
 380 bool wxVariant::operator!= (long value
) const 
 382     return (!((*this) == value
)); 
 385 void wxVariant::operator= (long value
) 
 387     if (GetType() == wxT("long") && 
 388         m_refData
->GetRefCount() == 1) 
 390         ((wxVariantDataLong
*)GetData())->SetValue(value
); 
 395         m_refData 
= new wxVariantDataLong(value
); 
 399 long wxVariant::GetLong() const 
 402     if (Convert(& value
)) 
 406         wxFAIL_MSG(wxT("Could not convert to a long")); 
 411 // ----------------------------------------------------------------- 
 412 // wxVariantDoubleData 
 413 // ----------------------------------------------------------------- 
 415 class WXDLLIMPEXP_BASE wxVariantDoubleData
: public wxVariantData
 
 418     wxVariantDoubleData() { m_value 
= 0.0; } 
 419     wxVariantDoubleData(double value
) { m_value 
= value
; } 
 421     inline double GetValue() const { return m_value
; } 
 422     inline void SetValue(double value
) { m_value 
= value
; } 
 424     virtual bool Eq(wxVariantData
& data
) const; 
 425     virtual bool Read(wxString
& str
); 
 426 #if wxUSE_STD_IOSTREAM 
 427     virtual bool Write(wxSTD ostream
& str
) const; 
 429     virtual bool Write(wxString
& str
) const; 
 430 #if wxUSE_STD_IOSTREAM 
 431     virtual bool Read(wxSTD istream
& str
); 
 434     virtual bool Read(wxInputStream
& str
); 
 435     virtual bool Write(wxOutputStream 
&str
) const; 
 436 #endif // wxUSE_STREAMS 
 437     virtual wxString 
GetType() const { return wxT("double"); } 
 439     wxVariantData
* Clone() const { return new wxVariantDoubleData(m_value
); } 
 441     DECLARE_WXANY_CONVERSION() 
 446 IMPLEMENT_TRIVIAL_WXANY_CONVERSION(double, wxVariantDoubleData
) 
 448 bool wxVariantDoubleData::Eq(wxVariantData
& data
) const 
 450     wxASSERT_MSG( (data
.GetType() == wxT("double")), wxT("wxVariantDoubleData::Eq: argument mismatch") ); 
 452     wxVariantDoubleData
& otherData 
= (wxVariantDoubleData
&) data
; 
 454     return wxIsSameDouble(otherData
.m_value
, m_value
); 
 457 #if wxUSE_STD_IOSTREAM 
 458 bool wxVariantDoubleData::Write(wxSTD ostream
& str
) const 
 462     str 
<< (const char*) s
.mb_str(); 
 467 bool wxVariantDoubleData::Write(wxString
& str
) const 
 469     str
.Printf(wxT("%.14g"), m_value
); 
 473 #if wxUSE_STD_IOSTREAM 
 474 bool wxVariantDoubleData::Read(wxSTD istream
& str
) 
 482 bool wxVariantDoubleData::Write(wxOutputStream
& str
) const 
 484     wxTextOutputStream 
s(str
); 
 485     s
.WriteDouble((double)m_value
); 
 489 bool wxVariantDoubleData::Read(wxInputStream
& str
) 
 491     wxTextInputStream 
s(str
); 
 492     m_value 
= (float)s
.ReadDouble(); 
 495 #endif // wxUSE_STREAMS 
 497 bool wxVariantDoubleData::Read(wxString
& str
) 
 499     m_value 
= wxAtof(str
); 
 503 //  wxVariant double code 
 505 wxVariant::wxVariant(double val
, const wxString
& name
) 
 507     m_refData 
= new wxVariantDoubleData(val
); 
 511 bool wxVariant::operator== (double value
) const 
 514     if (!Convert(&thisValue
)) 
 517     return wxIsSameDouble(value
, thisValue
); 
 520 bool wxVariant::operator!= (double value
) const 
 522     return (!((*this) == value
)); 
 525 void wxVariant::operator= (double value
) 
 527     if (GetType() == wxT("double") && 
 528         m_refData
->GetRefCount() == 1) 
 530         ((wxVariantDoubleData
*)GetData())->SetValue(value
); 
 535         m_refData 
= new wxVariantDoubleData(value
); 
 539 double wxVariant::GetDouble() const 
 542     if (Convert(& value
)) 
 546         wxFAIL_MSG(wxT("Could not convert to a double number")); 
 551 // ----------------------------------------------------------------- 
 553 // ----------------------------------------------------------------- 
 555 class WXDLLIMPEXP_BASE wxVariantDataBool
: public wxVariantData
 
 558     wxVariantDataBool() { m_value 
= 0; } 
 559     wxVariantDataBool(bool value
) { m_value 
= value
; } 
 561     inline bool GetValue() const { return m_value
; } 
 562     inline void SetValue(bool value
) { m_value 
= value
; } 
 564     virtual bool Eq(wxVariantData
& data
) const; 
 565 #if wxUSE_STD_IOSTREAM 
 566     virtual bool Write(wxSTD ostream
& str
) const; 
 568     virtual bool Write(wxString
& str
) const; 
 569     virtual bool Read(wxString
& str
); 
 570 #if wxUSE_STD_IOSTREAM 
 571     virtual bool Read(wxSTD istream
& str
); 
 574     virtual bool Read(wxInputStream
& str
); 
 575     virtual bool Write(wxOutputStream
& str
) const; 
 576 #endif // wxUSE_STREAMS 
 577     virtual wxString 
GetType() const { return wxT("bool"); } 
 579     wxVariantData
* Clone() const { return new wxVariantDataBool(m_value
); } 
 581     DECLARE_WXANY_CONVERSION() 
 586 IMPLEMENT_TRIVIAL_WXANY_CONVERSION(bool, wxVariantDataBool
) 
 588 bool wxVariantDataBool::Eq(wxVariantData
& data
) const 
 590     wxASSERT_MSG( (data
.GetType() == wxT("bool")), wxT("wxVariantDataBool::Eq: argument mismatch") ); 
 592     wxVariantDataBool
& otherData 
= (wxVariantDataBool
&) data
; 
 594     return (otherData
.m_value 
== m_value
); 
 597 #if wxUSE_STD_IOSTREAM 
 598 bool wxVariantDataBool::Write(wxSTD ostream
& str
) const 
 602     str 
<< (const char*) s
.mb_str(); 
 607 bool wxVariantDataBool::Write(wxString
& str
) const 
 609     str
.Printf(wxT("%d"), (int) m_value
); 
 613 #if wxUSE_STD_IOSTREAM 
 614 bool wxVariantDataBool::Read(wxSTD istream
& WXUNUSED(str
)) 
 616     wxFAIL_MSG(wxT("Unimplemented")); 
 617 //    str >> (long) m_value; 
 623 bool wxVariantDataBool::Write(wxOutputStream
& str
) const 
 625     wxTextOutputStream 
s(str
); 
 631 bool wxVariantDataBool::Read(wxInputStream
& str
) 
 633     wxTextInputStream 
s(str
); 
 635     m_value 
= s
.Read8() != 0; 
 638 #endif // wxUSE_STREAMS 
 640 bool wxVariantDataBool::Read(wxString
& str
) 
 642     m_value 
= (wxAtol(str
) != 0); 
 648 wxVariant::wxVariant(bool val
, const wxString
& name
) 
 650     m_refData 
= new wxVariantDataBool(val
); 
 654 bool wxVariant::operator== (bool value
) const 
 657     if (!Convert(&thisValue
)) 
 660         return (value 
== thisValue
); 
 663 bool wxVariant::operator!= (bool value
) const 
 665     return (!((*this) == value
)); 
 668 void wxVariant::operator= (bool value
) 
 670     if (GetType() == wxT("bool") && 
 671         m_refData
->GetRefCount() == 1) 
 673         ((wxVariantDataBool
*)GetData())->SetValue(value
); 
 678         m_refData 
= new wxVariantDataBool(value
); 
 682 bool wxVariant::GetBool() const 
 685     if (Convert(& value
)) 
 689         wxFAIL_MSG(wxT("Could not convert to a bool")); 
 694 // ----------------------------------------------------------------- 
 696 // ----------------------------------------------------------------- 
 698 class WXDLLIMPEXP_BASE wxVariantDataChar
: public wxVariantData
 
 701     wxVariantDataChar() { m_value 
= 0; } 
 702     wxVariantDataChar(const wxUniChar
& value
) { m_value 
= value
; } 
 704     inline wxUniChar 
GetValue() const { return m_value
; } 
 705     inline void SetValue(const wxUniChar
& value
) { m_value 
= value
; } 
 707     virtual bool Eq(wxVariantData
& data
) const; 
 708 #if wxUSE_STD_IOSTREAM 
 709     virtual bool Read(wxSTD istream
& str
); 
 710     virtual bool Write(wxSTD ostream
& str
) const; 
 712     virtual bool Read(wxString
& str
); 
 713     virtual bool Write(wxString
& str
) const; 
 715     virtual bool Read(wxInputStream
& str
); 
 716     virtual bool Write(wxOutputStream
& str
) const; 
 717 #endif // wxUSE_STREAMS 
 718     virtual wxString 
GetType() const { return wxT("char"); } 
 719     wxVariantData
* Clone() const { return new wxVariantDataChar(m_value
); } 
 721     DECLARE_WXANY_CONVERSION() 
 726 IMPLEMENT_TRIVIAL_WXANY_CONVERSION(wxUniChar
, wxVariantDataChar
) 
 728 bool wxVariantDataChar::Eq(wxVariantData
& data
) const 
 730     wxASSERT_MSG( (data
.GetType() == wxT("char")), wxT("wxVariantDataChar::Eq: argument mismatch") ); 
 732     wxVariantDataChar
& otherData 
= (wxVariantDataChar
&) data
; 
 734     return (otherData
.m_value 
== m_value
); 
 737 #if wxUSE_STD_IOSTREAM 
 738 bool wxVariantDataChar::Write(wxSTD ostream
& str
) const 
 740     str 
<< wxString(m_value
); 
 745 bool wxVariantDataChar::Write(wxString
& str
) const 
 751 #if wxUSE_STD_IOSTREAM 
 752 bool wxVariantDataChar::Read(wxSTD istream
& WXUNUSED(str
)) 
 754     wxFAIL_MSG(wxT("Unimplemented")); 
 761 bool wxVariantDataChar::Write(wxOutputStream
& str
) const 
 763     wxTextOutputStream 
s(str
); 
 765     // FIXME-UTF8: this should be just "s << m_value;" after removal of 
 766     //             ANSI build and addition of wxUniChar to wxTextOutputStream: 
 767     s 
<< (wxChar
)m_value
; 
 772 bool wxVariantDataChar::Read(wxInputStream
& str
) 
 774     wxTextInputStream 
s(str
); 
 776     // FIXME-UTF8: this should be just "s >> m_value;" after removal of 
 777     //             ANSI build and addition of wxUniChar to wxTextInputStream: 
 784 #endif // wxUSE_STREAMS 
 786 bool wxVariantDataChar::Read(wxString
& str
) 
 792 wxVariant::wxVariant(const wxUniChar
& val
, const wxString
& name
) 
 794     m_refData 
= new wxVariantDataChar(val
); 
 798 wxVariant::wxVariant(char val
, const wxString
& name
) 
 800     m_refData 
= new wxVariantDataChar(val
); 
 804 wxVariant::wxVariant(wchar_t val
, const wxString
& name
) 
 806     m_refData 
= new wxVariantDataChar(val
); 
 810 bool wxVariant::operator==(const wxUniChar
& value
) const 
 813     if (!Convert(&thisValue
)) 
 816         return (value 
== thisValue
); 
 819 wxVariant
& wxVariant::operator=(const wxUniChar
& value
) 
 821     if (GetType() == wxT("char") && 
 822         m_refData
->GetRefCount() == 1) 
 824         ((wxVariantDataChar
*)GetData())->SetValue(value
); 
 829         m_refData 
= new wxVariantDataChar(value
); 
 835 wxUniChar 
wxVariant::GetChar() const 
 838     if (Convert(& value
)) 
 842         wxFAIL_MSG(wxT("Could not convert to a char")); 
 847 // ---------------------------------------------------------------------------- 
 848 // wxVariantDataString 
 849 // ---------------------------------------------------------------------------- 
 851 class WXDLLIMPEXP_BASE wxVariantDataString
: public wxVariantData
 
 854     wxVariantDataString() { } 
 855     wxVariantDataString(const wxString
& value
) { m_value 
= value
; } 
 857     inline wxString 
GetValue() const { return m_value
; } 
 858     inline void SetValue(const wxString
& value
) { m_value 
= value
; } 
 860     virtual bool Eq(wxVariantData
& data
) const; 
 861 #if wxUSE_STD_IOSTREAM 
 862     virtual bool Write(wxSTD ostream
& str
) const; 
 864     virtual bool Read(wxString
& str
); 
 865     virtual bool Write(wxString
& str
) const; 
 866 #if wxUSE_STD_IOSTREAM 
 867     virtual bool Read(wxSTD istream
& WXUNUSED(str
)) { return false; } 
 870     virtual bool Read(wxInputStream
& str
); 
 871     virtual bool Write(wxOutputStream
& str
) const; 
 872 #endif // wxUSE_STREAMS 
 873     virtual wxString 
GetType() const { return wxT("string"); } 
 874     wxVariantData
* Clone() const { return new wxVariantDataString(m_value
); } 
 876     DECLARE_WXANY_CONVERSION() 
 881 IMPLEMENT_TRIVIAL_WXANY_CONVERSION(wxString
, wxVariantDataString
) 
 883 bool wxVariantDataString::Eq(wxVariantData
& data
) const 
 885     wxASSERT_MSG( (data
.GetType() == wxT("string")), wxT("wxVariantDataString::Eq: argument mismatch") ); 
 887     wxVariantDataString
& otherData 
= (wxVariantDataString
&) data
; 
 889     return (otherData
.m_value 
== m_value
); 
 892 #if wxUSE_STD_IOSTREAM 
 893 bool wxVariantDataString::Write(wxSTD ostream
& str
) const 
 895     str 
<< (const char*) m_value
.mb_str(); 
 900 bool wxVariantDataString::Write(wxString
& str
) const 
 907 bool wxVariantDataString::Write(wxOutputStream
& str
) const 
 909   // why doesn't wxOutputStream::operator<< take "const wxString&" 
 910     wxTextOutputStream 
s(str
); 
 911     s
.WriteString(m_value
); 
 915 bool wxVariantDataString::Read(wxInputStream
& str
) 
 917     wxTextInputStream 
s(str
); 
 919     m_value 
= s
.ReadLine(); 
 922 #endif // wxUSE_STREAMS 
 924 bool wxVariantDataString::Read(wxString
& str
) 
 932 wxVariant::wxVariant(const wxString
& val
, const wxString
& name
) 
 934     m_refData 
= new wxVariantDataString(val
); 
 938 wxVariant::wxVariant(const char* val
, const wxString
& name
) 
 940     m_refData 
= new wxVariantDataString(wxString(val
)); 
 944 wxVariant::wxVariant(const wchar_t* val
, const wxString
& name
) 
 946     m_refData 
= new wxVariantDataString(wxString(val
)); 
 950 wxVariant::wxVariant(const wxCStrData
& val
, const wxString
& name
) 
 952     m_refData 
= new wxVariantDataString(val
.AsString()); 
 956 wxVariant::wxVariant(const wxScopedCharBuffer
& val
, const wxString
& name
) 
 958     m_refData 
= new wxVariantDataString(wxString(val
)); 
 962 wxVariant::wxVariant(const wxScopedWCharBuffer
& val
, const wxString
& name
) 
 964     m_refData 
= new wxVariantDataString(wxString(val
)); 
 968 bool wxVariant::operator== (const wxString
& value
) const 
 971     if (!Convert(&thisValue
)) 
 974     return value 
== thisValue
; 
 977 bool wxVariant::operator!= (const wxString
& value
) const 
 979     return (!((*this) == value
)); 
 982 wxVariant
& wxVariant::operator= (const wxString
& value
) 
 984     if (GetType() == wxT("string") && 
 985         m_refData
->GetRefCount() == 1) 
 987         ((wxVariantDataString
*)GetData())->SetValue(value
); 
 992         m_refData 
= new wxVariantDataString(value
); 
 997 wxString 
wxVariant::GetString() const 
1000     if (!Convert(& value
)) 
1002         wxFAIL_MSG(wxT("Could not convert to a string")); 
1008 // ---------------------------------------------------------------------------- 
1009 // wxVariantDataWxObjectPtr 
1010 // ---------------------------------------------------------------------------- 
1012 class wxVariantDataWxObjectPtr
: public wxVariantData
 
1015     wxVariantDataWxObjectPtr() { } 
1016     wxVariantDataWxObjectPtr(wxObject
* value
) { m_value 
= value
; } 
1018     inline wxObject
* GetValue() const { return m_value
; } 
1019     inline void SetValue(wxObject
* value
) { m_value 
= value
; } 
1021     virtual bool Eq(wxVariantData
& data
) const; 
1022 #if wxUSE_STD_IOSTREAM 
1023     virtual bool Write(wxSTD ostream
& str
) const; 
1025     virtual bool Write(wxString
& str
) const; 
1026 #if wxUSE_STD_IOSTREAM 
1027     virtual bool Read(wxSTD istream
& str
); 
1029     virtual bool Read(wxString
& str
); 
1030     virtual wxString 
GetType() const ; 
1031     virtual wxVariantData
* Clone() const { return new wxVariantDataWxObjectPtr(m_value
); } 
1033     virtual wxClassInfo
* GetValueClassInfo(); 
1035     DECLARE_WXANY_CONVERSION() 
1040 IMPLEMENT_TRIVIAL_WXANY_CONVERSION(wxObject
*, wxVariantDataWxObjectPtr
) 
1042 bool wxVariantDataWxObjectPtr::Eq(wxVariantData
& data
) const 
1044     wxASSERT_MSG( data
.GetType() == GetType(), wxT("wxVariantDataWxObjectPtr::Eq: argument mismatch") ); 
1046     wxVariantDataWxObjectPtr
& otherData 
= (wxVariantDataWxObjectPtr
&) data
; 
1048     return (otherData
.m_value 
== m_value
); 
1051 wxString 
wxVariantDataWxObjectPtr::GetType() const 
1053     wxString 
returnVal(wxT("wxObject*")); 
1057         returnVal 
= m_value
->GetClassInfo()->GetClassName(); 
1058         returnVal 
+= wxT("*"); 
1064 wxClassInfo
* wxVariantDataWxObjectPtr::GetValueClassInfo() 
1066     wxClassInfo
* returnVal
=NULL
; 
1068     if (m_value
) returnVal 
= m_value
->GetClassInfo(); 
1073 #if wxUSE_STD_IOSTREAM 
1074 bool wxVariantDataWxObjectPtr::Write(wxSTD ostream
& str
) const 
1078     str 
<< (const char*) s
.mb_str(); 
1083 bool wxVariantDataWxObjectPtr::Write(wxString
& str
) const 
1085     str
.Printf(wxT("%s(%p)"), GetType().c_str(), static_cast<void*>(m_value
)); 
1089 #if wxUSE_STD_IOSTREAM 
1090 bool wxVariantDataWxObjectPtr::Read(wxSTD istream
& WXUNUSED(str
)) 
1097 bool wxVariantDataWxObjectPtr::Read(wxString
& WXUNUSED(str
)) 
1105 wxVariant::wxVariant( wxObject
* val
, const wxString
& name
) 
1107     m_refData 
= new wxVariantDataWxObjectPtr(val
); 
1111 bool wxVariant::operator== (wxObject
* value
) const 
1113     return (value 
== ((wxVariantDataWxObjectPtr
*)GetData())->GetValue()); 
1116 bool wxVariant::operator!= (wxObject
* value
) const 
1118     return (!((*this) == (wxObject
*) value
)); 
1121 void wxVariant::operator= (wxObject
* value
) 
1124     m_refData 
= new wxVariantDataWxObjectPtr(value
); 
1127 wxObject
* wxVariant::GetWxObjectPtr() const 
1129     return (wxObject
*) ((wxVariantDataWxObjectPtr
*) m_refData
)->GetValue(); 
1132 // ---------------------------------------------------------------------------- 
1133 // wxVariantDataVoidPtr 
1134 // ---------------------------------------------------------------------------- 
1136 class wxVariantDataVoidPtr
: public wxVariantData
 
1139     wxVariantDataVoidPtr() { } 
1140     wxVariantDataVoidPtr(void* value
) { m_value 
= value
; } 
1142     inline void* GetValue() const { return m_value
; } 
1143     inline void SetValue(void* value
) { m_value 
= value
; } 
1145     virtual bool Eq(wxVariantData
& data
) const; 
1146 #if wxUSE_STD_IOSTREAM 
1147     virtual bool Write(wxSTD ostream
& str
) const; 
1149     virtual bool Write(wxString
& str
) const; 
1150 #if wxUSE_STD_IOSTREAM 
1151     virtual bool Read(wxSTD istream
& str
); 
1153     virtual bool Read(wxString
& str
); 
1154     virtual wxString 
GetType() const { return wxT("void*"); } 
1155     virtual wxVariantData
* Clone() const { return new wxVariantDataVoidPtr(m_value
); } 
1157     DECLARE_WXANY_CONVERSION() 
1162 IMPLEMENT_TRIVIAL_WXANY_CONVERSION(void*, wxVariantDataVoidPtr
) 
1164 bool wxVariantDataVoidPtr::Eq(wxVariantData
& data
) const 
1166     wxASSERT_MSG( data
.GetType() == wxT("void*"), wxT("wxVariantDataVoidPtr::Eq: argument mismatch") ); 
1168     wxVariantDataVoidPtr
& otherData 
= (wxVariantDataVoidPtr
&) data
; 
1170     return (otherData
.m_value 
== m_value
); 
1173 #if wxUSE_STD_IOSTREAM 
1174 bool wxVariantDataVoidPtr::Write(wxSTD ostream
& str
) const 
1178     str 
<< (const char*) s
.mb_str(); 
1183 bool wxVariantDataVoidPtr::Write(wxString
& str
) const 
1185     str
.Printf(wxT("%p"), m_value
); 
1189 #if wxUSE_STD_IOSTREAM 
1190 bool wxVariantDataVoidPtr::Read(wxSTD istream
& WXUNUSED(str
)) 
1197 bool wxVariantDataVoidPtr::Read(wxString
& WXUNUSED(str
)) 
1205 wxVariant::wxVariant( void* val
, const wxString
& name
) 
1207     m_refData 
= new wxVariantDataVoidPtr(val
); 
1211 bool wxVariant::operator== (void* value
) const 
1213     return (value 
== ((wxVariantDataVoidPtr
*)GetData())->GetValue()); 
1216 bool wxVariant::operator!= (void* value
) const 
1218     return (!((*this) == (void*) value
)); 
1221 void wxVariant::operator= (void* value
) 
1223     if (GetType() == wxT("void*") && (m_refData
->GetRefCount() == 1)) 
1225         ((wxVariantDataVoidPtr
*)GetData())->SetValue(value
); 
1230         m_refData 
= new wxVariantDataVoidPtr(value
); 
1234 void* wxVariant::GetVoidPtr() const 
1236     // handling this specially is convenient when working with COM, see #9873 
1240     wxASSERT( GetType() == wxT("void*") ); 
1242     return (void*) ((wxVariantDataVoidPtr
*) m_refData
)->GetValue(); 
1245 // ---------------------------------------------------------------------------- 
1246 // wxVariantDataDateTime 
1247 // ---------------------------------------------------------------------------- 
1251 class wxVariantDataDateTime
: public wxVariantData
 
1254     wxVariantDataDateTime() { } 
1255     wxVariantDataDateTime(const wxDateTime
& value
) { m_value 
= value
; } 
1257     inline wxDateTime 
GetValue() const { return m_value
; } 
1258     inline void SetValue(const wxDateTime
& value
) { m_value 
= value
; } 
1260     virtual bool Eq(wxVariantData
& data
) const; 
1261 #if wxUSE_STD_IOSTREAM 
1262     virtual bool Write(wxSTD ostream
& str
) const; 
1264     virtual bool Write(wxString
& str
) const; 
1265 #if wxUSE_STD_IOSTREAM 
1266     virtual bool Read(wxSTD istream
& str
); 
1268     virtual bool Read(wxString
& str
); 
1269     virtual wxString 
GetType() const { return wxT("datetime"); } 
1270     virtual wxVariantData
* Clone() const { return new wxVariantDataDateTime(m_value
); } 
1272     DECLARE_WXANY_CONVERSION() 
1277 IMPLEMENT_TRIVIAL_WXANY_CONVERSION(wxDateTime
, wxVariantDataDateTime
) 
1279 bool wxVariantDataDateTime::Eq(wxVariantData
& data
) const 
1281     wxASSERT_MSG( (data
.GetType() == wxT("datetime")), wxT("wxVariantDataDateTime::Eq: argument mismatch") ); 
1283     wxVariantDataDateTime
& otherData 
= (wxVariantDataDateTime
&) data
; 
1285     return (otherData
.m_value 
== m_value
); 
1289 #if wxUSE_STD_IOSTREAM 
1290 bool wxVariantDataDateTime::Write(wxSTD ostream
& str
) const 
1294     str 
<< value
.c_str(); 
1300 bool wxVariantDataDateTime::Write(wxString
& str
) const 
1302     if ( m_value
.IsValid() ) 
1303         str 
= m_value
.Format(); 
1305         str 
= wxS("Invalid"); 
1310 #if wxUSE_STD_IOSTREAM 
1311 bool wxVariantDataDateTime::Read(wxSTD istream
& WXUNUSED(str
)) 
1319 bool wxVariantDataDateTime::Read(wxString
& str
) 
1321     if ( str 
== wxS("Invalid") ) 
1323         m_value 
= wxInvalidDateTime
; 
1327     wxString::const_iterator end
; 
1328     return m_value
.ParseDateTime(str
, &end
) && end 
== str
.end(); 
1333 wxVariant::wxVariant(const wxDateTime
& val
, const wxString
& name
) // Date 
1335     m_refData 
= new wxVariantDataDateTime(val
); 
1339 bool wxVariant::operator== (const wxDateTime
& value
) const 
1341     wxDateTime thisValue
; 
1342     if (!Convert(&thisValue
)) 
1345     return value
.IsEqualTo(thisValue
); 
1348 bool wxVariant::operator!= (const wxDateTime
& value
) const 
1350     return (!((*this) == value
)); 
1353 void wxVariant::operator= (const wxDateTime
& value
) 
1355     if (GetType() == wxT("datetime") && 
1356         m_refData
->GetRefCount() == 1) 
1358         ((wxVariantDataDateTime
*)GetData())->SetValue(value
); 
1363         m_refData 
= new wxVariantDataDateTime(value
); 
1367 wxDateTime 
wxVariant::GetDateTime() const 
1370     if (!Convert(& value
)) 
1372         wxFAIL_MSG(wxT("Could not convert to a datetime")); 
1378 #endif // wxUSE_DATETIME 
1380 // ---------------------------------------------------------------------------- 
1381 // wxVariantDataArrayString 
1382 // ---------------------------------------------------------------------------- 
1384 class wxVariantDataArrayString
: public wxVariantData
 
1387     wxVariantDataArrayString() { } 
1388     wxVariantDataArrayString(const wxArrayString
& value
) { m_value 
= value
; } 
1390     wxArrayString 
GetValue() const { return m_value
; } 
1391     void SetValue(const wxArrayString
& value
) { m_value 
= value
; } 
1393     virtual bool Eq(wxVariantData
& data
) const; 
1394 #if wxUSE_STD_IOSTREAM 
1395     virtual bool Write(wxSTD ostream
& str
) const; 
1397     virtual bool Write(wxString
& str
) const; 
1398 #if wxUSE_STD_IOSTREAM 
1399     virtual bool Read(wxSTD istream
& str
); 
1401     virtual bool Read(wxString
& str
); 
1402     virtual wxString 
GetType() const { return wxT("arrstring"); } 
1403     virtual wxVariantData
* Clone() const { return new wxVariantDataArrayString(m_value
); } 
1405     DECLARE_WXANY_CONVERSION() 
1407     wxArrayString m_value
; 
1410 IMPLEMENT_TRIVIAL_WXANY_CONVERSION(wxArrayString
, wxVariantDataArrayString
) 
1412 bool wxVariantDataArrayString::Eq(wxVariantData
& data
) const 
1414     wxASSERT_MSG( data
.GetType() == GetType(), wxT("wxVariantDataArrayString::Eq: argument mismatch") ); 
1416     wxVariantDataArrayString
& otherData 
= (wxVariantDataArrayString
&) data
; 
1418     return otherData
.m_value 
== m_value
; 
1421 #if wxUSE_STD_IOSTREAM 
1422 bool wxVariantDataArrayString::Write(wxSTD ostream
& WXUNUSED(str
)) const 
1429 bool wxVariantDataArrayString::Write(wxString
& str
) const 
1431     size_t count 
= m_value
.GetCount(); 
1432     for ( size_t n 
= 0; n 
< count
; n
++ ) 
1444 #if wxUSE_STD_IOSTREAM 
1445 bool wxVariantDataArrayString::Read(wxSTD istream
& WXUNUSED(str
)) 
1453 bool wxVariantDataArrayString::Read(wxString
& str
) 
1455     wxStringTokenizer 
tk(str
, wxT(";")); 
1456     while ( tk
.HasMoreTokens() ) 
1458         m_value
.Add(tk
.GetNextToken()); 
1466 wxVariant::wxVariant(const wxArrayString
& val
, const wxString
& name
) // Strings 
1468     m_refData 
= new wxVariantDataArrayString(val
); 
1472 bool wxVariant::operator==(const wxArrayString
& WXUNUSED(value
)) const 
1474     wxFAIL_MSG( wxT("TODO") ); 
1479 bool wxVariant::operator!=(const wxArrayString
& value
) const 
1481     return !(*this == value
); 
1484 void wxVariant::operator=(const wxArrayString
& value
) 
1486     if (GetType() == wxT("arrstring") && 
1487         m_refData
->GetRefCount() == 1) 
1489         ((wxVariantDataArrayString 
*)GetData())->SetValue(value
); 
1494         m_refData 
= new wxVariantDataArrayString(value
); 
1498 wxArrayString 
wxVariant::GetArrayString() const 
1500     if ( GetType() == wxT("arrstring") ) 
1501         return ((wxVariantDataArrayString 
*)GetData())->GetValue(); 
1503     return wxArrayString(); 
1506 // ---------------------------------------------------------------------------- 
1507 // wxVariantDataLongLong 
1508 // ---------------------------------------------------------------------------- 
1512 class WXDLLIMPEXP_BASE wxVariantDataLongLong 
: public wxVariantData
 
1515     wxVariantDataLongLong() { m_value 
= 0; } 
1516     wxVariantDataLongLong(wxLongLong value
) { m_value 
= value
; } 
1518     wxLongLong 
GetValue() const { return m_value
; } 
1519     void SetValue(wxLongLong value
) { m_value 
= value
; } 
1521     virtual bool Eq(wxVariantData
& data
) const; 
1523     virtual bool Read(wxString
& str
); 
1524     virtual bool Write(wxString
& str
) const; 
1525 #if wxUSE_STD_IOSTREAM 
1526     virtual bool Read(wxSTD istream
& str
); 
1527     virtual bool Write(wxSTD ostream
& str
) const; 
1530     virtual bool Read(wxInputStream
& str
); 
1531     virtual bool Write(wxOutputStream 
&str
) const; 
1532 #endif // wxUSE_STREAMS 
1534     wxVariantData
* Clone() const 
1536         return new wxVariantDataLongLong(m_value
); 
1539     virtual wxString 
GetType() const { return wxS("longlong"); } 
1541     DECLARE_WXANY_CONVERSION() 
1547 // wxLongLong type requires customized wxAny conversion code 
1552 bool wxVariantDataLongLong::GetAsAny(wxAny
* any
) const 
1554     *any 
= m_value
.GetValue(); 
1558 wxVariantData
* wxVariantDataLongLong::VariantDataFactory(const wxAny
& any
) 
1560     return new wxVariantDataLongLong(wxANY_AS(any
, wxLongLong_t
)); 
1563 REGISTER_WXANY_CONVERSION(wxLongLong_t
, wxVariantDataLongLong
) 
1565 #else // if !defined(wxLongLong_t) 
1567 bool wxVariantDataLongLong::GetAsAny(wxAny
* any
) const 
1573 wxVariantData
* wxVariantDataLongLong::VariantDataFactory(const wxAny
& any
) 
1575     return new wxVariantDataLongLong(wxANY_AS(any
, wxLongLong
)); 
1578 REGISTER_WXANY_CONVERSION(wxLongLong
, wxVariantDataLongLong
) 
1580 #endif // defined(wxLongLong_t)/!defined(wxLongLong_t) 
1583 bool wxVariantDataLongLong::Eq(wxVariantData
& data
) const 
1585     wxASSERT_MSG( (data
.GetType() == wxS("longlong")), 
1586                   "wxVariantDataLongLong::Eq: argument mismatch" ); 
1588     wxVariantDataLongLong
& otherData 
= (wxVariantDataLongLong
&) data
; 
1590     return (otherData
.m_value 
== m_value
); 
1593 #if wxUSE_STD_IOSTREAM 
1594 bool wxVariantDataLongLong::Write(wxSTD ostream
& str
) const 
1598     str 
<< (const char*) s
.mb_str(); 
1603 bool wxVariantDataLongLong::Write(wxString
& str
) const 
1606     str
.Printf(wxS("%lld"), m_value
.GetValue()); 
1613 #if wxUSE_STD_IOSTREAM 
1614 bool wxVariantDataLongLong::Read(wxSTD istream
& WXUNUSED(str
)) 
1616     wxFAIL_MSG(wxS("Unimplemented")); 
1622 bool wxVariantDataLongLong::Write(wxOutputStream
& str
) const 
1624     wxTextOutputStream 
s(str
); 
1625     s
.Write32(m_value
.GetLo()); 
1626     s
.Write32(m_value
.GetHi()); 
1630 bool wxVariantDataLongLong::Read(wxInputStream
& str
) 
1632    wxTextInputStream 
s(str
); 
1633    unsigned long lo 
= s
.Read32(); 
1634    long hi 
= s
.Read32(); 
1635    m_value 
= wxLongLong(hi
, lo
); 
1638 #endif // wxUSE_STREAMS 
1640 bool wxVariantDataLongLong::Read(wxString
& str
) 
1643     wxLongLong_t value_t
; 
1644     if ( !str
.ToLongLong(&value_t
) ) 
1655 wxVariant::wxVariant(wxLongLong val
, const wxString
& name
) 
1657     m_refData 
= new wxVariantDataLongLong(val
); 
1661 bool wxVariant::operator==(wxLongLong value
) const 
1663     wxLongLong thisValue
; 
1664     if ( !Convert(&thisValue
) ) 
1667         return (value 
== thisValue
); 
1670 bool wxVariant::operator!=(wxLongLong value
) const 
1672     return (!((*this) == value
)); 
1675 void wxVariant::operator=(wxLongLong value
) 
1677     if ( GetType() == wxS("longlong") && 
1678          m_refData
->GetRefCount() == 1 ) 
1680         ((wxVariantDataLongLong
*)GetData())->SetValue(value
); 
1685         m_refData 
= new wxVariantDataLongLong(value
); 
1689 wxLongLong 
wxVariant::GetLongLong() const 
1692     if ( Convert(&value
) ) 
1698         wxFAIL_MSG(wxT("Could not convert to a long long")); 
1703 #endif // wxUSE_LONGLONG 
1705 // ---------------------------------------------------------------------------- 
1706 // wxVariantDataULongLong 
1707 // ---------------------------------------------------------------------------- 
1711 class WXDLLIMPEXP_BASE wxVariantDataULongLong 
: public wxVariantData
 
1714     wxVariantDataULongLong() { m_value 
= 0; } 
1715     wxVariantDataULongLong(wxULongLong value
) { m_value 
= value
; } 
1717     wxULongLong 
GetValue() const { return m_value
; } 
1718     void SetValue(wxULongLong value
) { m_value 
= value
; } 
1720     virtual bool Eq(wxVariantData
& data
) const; 
1722     virtual bool Read(wxString
& str
); 
1723     virtual bool Write(wxString
& str
) const; 
1724 #if wxUSE_STD_IOSTREAM 
1725     virtual bool Read(wxSTD istream
& str
); 
1726     virtual bool Write(wxSTD ostream
& str
) const; 
1729     virtual bool Read(wxInputStream
& str
); 
1730     virtual bool Write(wxOutputStream 
&str
) const; 
1731 #endif // wxUSE_STREAMS 
1733     wxVariantData
* Clone() const 
1735         return new wxVariantDataULongLong(m_value
); 
1738     virtual wxString 
GetType() const { return wxS("ulonglong"); } 
1740     DECLARE_WXANY_CONVERSION() 
1742     wxULongLong m_value
; 
1746 // wxULongLong type requires customized wxAny conversion code 
1751 bool wxVariantDataULongLong::GetAsAny(wxAny
* any
) const 
1753     *any 
= m_value
.GetValue(); 
1757 wxVariantData
* wxVariantDataULongLong::VariantDataFactory(const wxAny
& any
) 
1759     return new wxVariantDataULongLong(wxANY_AS(any
, wxULongLong_t
)); 
1762 REGISTER_WXANY_CONVERSION(wxULongLong_t
, wxVariantDataULongLong
) 
1764 #else // if !defined(wxLongLong_t) 
1766 bool wxVariantDataULongLong::GetAsAny(wxAny
* any
) const 
1772 wxVariantData
* wxVariantDataULongLong::VariantDataFactory(const wxAny
& any
) 
1774     return new wxVariantDataULongLong(wxANY_AS(any
, wxULongLong
)); 
1777 REGISTER_WXANY_CONVERSION(wxULongLong
, wxVariantDataULongLong
) 
1779 #endif // defined(wxLongLong_t)/!defined(wxLongLong_t) 
1783 bool wxVariantDataULongLong::Eq(wxVariantData
& data
) const 
1785     wxASSERT_MSG( (data
.GetType() == wxS("ulonglong")), 
1786                   "wxVariantDataULongLong::Eq: argument mismatch" ); 
1788     wxVariantDataULongLong
& otherData 
= (wxVariantDataULongLong
&) data
; 
1790     return (otherData
.m_value 
== m_value
); 
1793 #if wxUSE_STD_IOSTREAM 
1794 bool wxVariantDataULongLong::Write(wxSTD ostream
& str
) const 
1798     str 
<< (const char*) s
.mb_str(); 
1803 bool wxVariantDataULongLong::Write(wxString
& str
) const 
1806     str
.Printf(wxS("%llu"), m_value
.GetValue()); 
1813 #if wxUSE_STD_IOSTREAM 
1814 bool wxVariantDataULongLong::Read(wxSTD istream
& WXUNUSED(str
)) 
1816     wxFAIL_MSG(wxS("Unimplemented")); 
1822 bool wxVariantDataULongLong::Write(wxOutputStream
& str
) const 
1824     wxTextOutputStream 
s(str
); 
1825     s
.Write32(m_value
.GetLo()); 
1826     s
.Write32(m_value
.GetHi()); 
1830 bool wxVariantDataULongLong::Read(wxInputStream
& str
) 
1832    wxTextInputStream 
s(str
); 
1833    unsigned long lo 
= s
.Read32(); 
1834    long hi 
= s
.Read32(); 
1835    m_value 
= wxULongLong(hi
, lo
); 
1838 #endif // wxUSE_STREAMS 
1840 bool wxVariantDataULongLong::Read(wxString
& str
) 
1843     wxULongLong_t value_t
; 
1844     if ( !str
.ToULongLong(&value_t
) ) 
1855 wxVariant::wxVariant(wxULongLong val
, const wxString
& name
) 
1857     m_refData 
= new wxVariantDataULongLong(val
); 
1861 bool wxVariant::operator==(wxULongLong value
) const 
1863     wxULongLong thisValue
; 
1864     if ( !Convert(&thisValue
) ) 
1867         return (value 
== thisValue
); 
1870 bool wxVariant::operator!=(wxULongLong value
) const 
1872     return (!((*this) == value
)); 
1875 void wxVariant::operator=(wxULongLong value
) 
1877     if ( GetType() == wxS("ulonglong") && 
1878          m_refData
->GetRefCount() == 1 ) 
1880         ((wxVariantDataULongLong
*)GetData())->SetValue(value
); 
1885         m_refData 
= new wxVariantDataULongLong(value
); 
1889 wxULongLong 
wxVariant::GetULongLong() const 
1892     if ( Convert(&value
) ) 
1898         wxFAIL_MSG(wxT("Could not convert to a long long")); 
1903 #endif // wxUSE_LONGLONG 
1905 // ---------------------------------------------------------------------------- 
1906 // wxVariantDataList 
1907 // ---------------------------------------------------------------------------- 
1909 class WXDLLIMPEXP_BASE wxVariantDataList
: public wxVariantData
 
1912     wxVariantDataList() {} 
1913     wxVariantDataList(const wxVariantList
& list
); 
1914     virtual ~wxVariantDataList(); 
1916     wxVariantList
& GetValue() { return m_value
; } 
1917     void SetValue(const wxVariantList
& value
) ; 
1919     virtual bool Eq(wxVariantData
& data
) const; 
1920 #if wxUSE_STD_IOSTREAM 
1921     virtual bool Write(wxSTD ostream
& str
) const; 
1923     virtual bool Write(wxString
& str
) const; 
1924 #if wxUSE_STD_IOSTREAM 
1925     virtual bool Read(wxSTD istream
& str
); 
1927     virtual bool Read(wxString
& str
); 
1928     virtual wxString 
GetType() const { return wxT("list"); } 
1932     wxVariantData
* Clone() const { return new wxVariantDataList(m_value
); } 
1934     DECLARE_WXANY_CONVERSION() 
1936     wxVariantList  m_value
; 
1942 // Convert to/from list of wxAnys 
1945 WX_DEFINE_LIST(wxAnyList
) 
1947 bool wxVariantDataList::GetAsAny(wxAny
* any
) const 
1950     wxVariantList::compatibility_iterator node 
= m_value
.GetFirst(); 
1953         wxVariant
* pVar 
= node
->GetData(); 
1954         dst
.push_back(new wxAny(((const wxVariant
&)*pVar
))); 
1955         node 
= node
->GetNext(); 
1962 wxVariantData
* wxVariantDataList::VariantDataFactory(const wxAny
& any
) 
1964     wxAnyList src 
= wxANY_AS(any
, wxAnyList
); 
1966     wxAnyList::compatibility_iterator node 
= src
.GetFirst(); 
1969         wxAny
* pAny 
= node
->GetData(); 
1970         dst
.push_back(new wxVariant(*pAny
)); 
1971         node 
= node
->GetNext(); 
1974     return new wxVariantDataList(dst
); 
1977 REGISTER_WXANY_CONVERSION(wxAnyList
, wxVariantDataList
) 
1981 wxVariantDataList::wxVariantDataList(const wxVariantList
& list
) 
1986 wxVariantDataList::~wxVariantDataList() 
1991 void wxVariantDataList::SetValue(const wxVariantList
& value
) 
1994     wxVariantList::compatibility_iterator node 
= value
.GetFirst(); 
1997         wxVariant
* var 
= node
->GetData(); 
1998         m_value
.Append(new wxVariant(*var
)); 
1999         node 
= node
->GetNext(); 
2003 void wxVariantDataList::Clear() 
2005     wxVariantList::compatibility_iterator node 
= m_value
.GetFirst(); 
2008         wxVariant
* var 
= node
->GetData(); 
2010         node 
= node
->GetNext(); 
2015 bool wxVariantDataList::Eq(wxVariantData
& data
) const 
2017     wxASSERT_MSG( (data
.GetType() == wxT("list")), wxT("wxVariantDataList::Eq: argument mismatch") ); 
2019     wxVariantDataList
& listData 
= (wxVariantDataList
&) data
; 
2020     wxVariantList::compatibility_iterator node1 
= m_value
.GetFirst(); 
2021     wxVariantList::compatibility_iterator node2 
= listData
.GetValue().GetFirst(); 
2022     while (node1 
&& node2
) 
2024         wxVariant
* var1 
= node1
->GetData(); 
2025         wxVariant
* var2 
= node2
->GetData(); 
2026         if ((*var1
) != (*var2
)) 
2028         node1 
= node1
->GetNext(); 
2029         node2 
= node2
->GetNext(); 
2031     if (node1 
|| node2
) return false; 
2035 #if wxUSE_STD_IOSTREAM 
2036 bool wxVariantDataList::Write(wxSTD ostream
& str
) const 
2040     str 
<< (const char*) s
.mb_str(); 
2045 bool wxVariantDataList::Write(wxString
& str
) const 
2047     str 
= wxEmptyString
; 
2048     wxVariantList::compatibility_iterator node 
= m_value
.GetFirst(); 
2051         wxVariant
* var 
= node
->GetData(); 
2052         if (node 
!= m_value
.GetFirst()) 
2055         str 
+= var
->MakeString(); 
2056         node 
= node
->GetNext(); 
2062 #if wxUSE_STD_IOSTREAM 
2063 bool wxVariantDataList::Read(wxSTD istream
& WXUNUSED(str
)) 
2065     wxFAIL_MSG(wxT("Unimplemented")); 
2071 bool wxVariantDataList::Read(wxString
& WXUNUSED(str
)) 
2073     wxFAIL_MSG(wxT("Unimplemented")); 
2080 wxVariant::wxVariant(const wxVariantList
& val
, const wxString
& name
) // List of variants 
2082     m_refData 
= new wxVariantDataList(val
); 
2086 bool wxVariant::operator== (const wxVariantList
& value
) const 
2088     wxASSERT_MSG( (GetType() == wxT("list")), wxT("Invalid type for == operator") ); 
2090     wxVariantDataList 
other(value
); 
2091     return (GetData()->Eq(other
)); 
2094 bool wxVariant::operator!= (const wxVariantList
& value
) const 
2096     return (!((*this) == value
)); 
2099 void wxVariant::operator= (const wxVariantList
& value
) 
2101     if (GetType() == wxT("list") && 
2102         m_refData
->GetRefCount() == 1) 
2104         ((wxVariantDataList
*)GetData())->SetValue(value
); 
2109         m_refData 
= new wxVariantDataList(value
); 
2113 wxVariantList
& wxVariant::GetList() const 
2115     wxASSERT( (GetType() == wxT("list")) ); 
2117     return (wxVariantList
&) ((wxVariantDataList
*) m_refData
)->GetValue(); 
2121 void wxVariant::NullList() 
2123     SetData(new wxVariantDataList()); 
2127 void wxVariant::Append(const wxVariant
& value
) 
2129     wxVariantList
& list 
= GetList(); 
2131     list
.Append(new wxVariant(value
)); 
2134 // Insert at front of list 
2135 void wxVariant::Insert(const wxVariant
& value
) 
2137     wxVariantList
& list 
= GetList(); 
2139     list
.Insert(new wxVariant(value
)); 
2142 // Returns true if the variant is a member of the list 
2143 bool wxVariant::Member(const wxVariant
& value
) const 
2145     wxVariantList
& list 
= GetList(); 
2147     wxVariantList::compatibility_iterator node 
= list
.GetFirst(); 
2150         wxVariant
* other 
= node
->GetData(); 
2151         if (value 
== *other
) 
2153         node 
= node
->GetNext(); 
2158 // Deletes the nth element of the list 
2159 bool wxVariant::Delete(size_t item
) 
2161     wxVariantList
& list 
= GetList(); 
2163     wxASSERT_MSG( (item 
< list
.GetCount()), wxT("Invalid index to Delete") ); 
2164     wxVariantList::compatibility_iterator node 
= list
.Item(item
); 
2165     wxVariant
* variant 
= node
->GetData(); 
2172 void wxVariant::ClearList() 
2174     if (!IsNull() && (GetType() == wxT("list"))) 
2176         ((wxVariantDataList
*) m_refData
)->Clear(); 
2180         if (!GetType().IsSameAs(wxT("list"))) 
2183         m_refData 
= new wxVariantDataList
; 
2187 // Treat a list variant as an array 
2188 wxVariant 
wxVariant::operator[] (size_t idx
) const 
2190     wxASSERT_MSG( GetType() == wxT("list"), wxT("Invalid type for array operator") ); 
2192     if (GetType() == wxT("list")) 
2194         wxVariantDataList
* data 
= (wxVariantDataList
*) m_refData
; 
2195         wxASSERT_MSG( (idx 
< data
->GetValue().GetCount()), wxT("Invalid index for array") ); 
2196         return *(data
->GetValue().Item(idx
)->GetData()); 
2198     return wxNullVariant
; 
2201 wxVariant
& wxVariant::operator[] (size_t idx
) 
2203     // We can't return a reference to a variant for a string list, since the string 
2204     // is actually stored as a char*, not a variant. 
2206     wxASSERT_MSG( (GetType() == wxT("list")), wxT("Invalid type for array operator") ); 
2208     wxVariantDataList
* data 
= (wxVariantDataList
*) m_refData
; 
2209     wxASSERT_MSG( (idx 
< data
->GetValue().GetCount()), wxT("Invalid index for array") ); 
2211     return * (data
->GetValue().Item(idx
)->GetData()); 
2214 // Return the number of elements in a list 
2215 size_t wxVariant::GetCount() const 
2217     wxASSERT_MSG( GetType() == wxT("list"), wxT("Invalid type for GetCount()") ); 
2219     if (GetType() == wxT("list")) 
2221         wxVariantDataList
* data 
= (wxVariantDataList
*) m_refData
; 
2222         return data
->GetValue().GetCount(); 
2227 // ---------------------------------------------------------------------------- 
2229 // ---------------------------------------------------------------------------- 
2231 bool wxVariant::Convert(long* value
) const 
2233     wxString 
type(GetType()); 
2234     if (type 
== wxS("double")) 
2235         *value 
= (long) (((wxVariantDoubleData
*)GetData())->GetValue()); 
2236     else if (type 
== wxS("long")) 
2237         *value 
= ((wxVariantDataLong
*)GetData())->GetValue(); 
2238     else if (type 
== wxS("bool")) 
2239         *value 
= (long) (((wxVariantDataBool
*)GetData())->GetValue()); 
2240     else if (type 
== wxS("string")) 
2241         *value 
= wxAtol(((wxVariantDataString
*)GetData())->GetValue()); 
2243     else if (type 
== wxS("longlong")) 
2245         wxLongLong v 
= ((wxVariantDataLongLong
*)GetData())->GetValue(); 
2246         // Don't convert if return value would be vague 
2247         if ( v 
< LONG_MIN 
|| v 
> LONG_MAX 
) 
2249         *value 
= v
.ToLong(); 
2251     else if (type 
== wxS("ulonglong")) 
2253         wxULongLong v 
= ((wxVariantDataULongLong
*)GetData())->GetValue(); 
2254         // Don't convert if return value would be vague 
2257         *value 
= (long) v
.ToULong(); 
2266 bool wxVariant::Convert(bool* value
) const 
2268     wxString 
type(GetType()); 
2269     if (type 
== wxT("double")) 
2270         *value 
= ((int) (((wxVariantDoubleData
*)GetData())->GetValue()) != 0); 
2271     else if (type 
== wxT("long")) 
2272         *value 
= (((wxVariantDataLong
*)GetData())->GetValue() != 0); 
2273     else if (type 
== wxT("bool")) 
2274         *value 
= ((wxVariantDataBool
*)GetData())->GetValue(); 
2275     else if (type 
== wxT("string")) 
2277         wxString 
val(((wxVariantDataString
*)GetData())->GetValue()); 
2279         if (val 
== wxT("true") || val 
== wxT("yes") || val 
== wxT('1') ) 
2281         else if (val 
== wxT("false") || val 
== wxT("no") || val 
== wxT('0') ) 
2292 bool wxVariant::Convert(double* value
) const 
2294     wxString 
type(GetType()); 
2295     if (type 
== wxT("double")) 
2296         *value 
= ((wxVariantDoubleData
*)GetData())->GetValue(); 
2297     else if (type 
== wxT("long")) 
2298         *value 
= (double) (((wxVariantDataLong
*)GetData())->GetValue()); 
2299     else if (type 
== wxT("bool")) 
2300         *value 
= (double) (((wxVariantDataBool
*)GetData())->GetValue()); 
2301     else if (type 
== wxT("string")) 
2302         *value 
= (double) wxAtof(((wxVariantDataString
*)GetData())->GetValue()); 
2304     else if (type 
== wxS("longlong")) 
2306         *value 
= ((wxVariantDataLongLong
*)GetData())->GetValue().ToDouble(); 
2308     else if (type 
== wxS("ulonglong")) 
2310         *value 
= ((wxVariantDataULongLong
*)GetData())->GetValue().ToDouble(); 
2319 bool wxVariant::Convert(wxUniChar
* value
) const 
2321     wxString 
type(GetType()); 
2322     if (type 
== wxT("char")) 
2323         *value 
= ((wxVariantDataChar
*)GetData())->GetValue(); 
2324     else if (type 
== wxT("long")) 
2325         *value 
= (char) (((wxVariantDataLong
*)GetData())->GetValue()); 
2326     else if (type 
== wxT("bool")) 
2327         *value 
= (char) (((wxVariantDataBool
*)GetData())->GetValue()); 
2334 bool wxVariant::Convert(char* value
) const 
2337     if ( !Convert(&ch
) ) 
2343 bool wxVariant::Convert(wchar_t* value
) const 
2346     if ( !Convert(&ch
) ) 
2352 bool wxVariant::Convert(wxString
* value
) const 
2354     *value 
= MakeString(); 
2359 bool wxVariant::Convert(wxLongLong
* value
) const 
2361     wxString 
type(GetType()); 
2362     if (type 
== wxS("longlong")) 
2363         *value 
= ((wxVariantDataLongLong
*)GetData())->GetValue(); 
2364     else if (type 
== wxS("long")) 
2365         *value 
= ((wxVariantDataLong
*)GetData())->GetValue(); 
2366     else if (type 
== wxS("string")) 
2368         wxString s 
= ((wxVariantDataString
*)GetData())->GetValue(); 
2370         wxLongLong_t value_t
; 
2371         if ( !s
.ToLongLong(&value_t
) ) 
2376         if ( !s
.ToLong(&l_value
) ) 
2381     else if (type 
== wxS("bool")) 
2382         *value 
= (long) (((wxVariantDataBool
*)GetData())->GetValue()); 
2383     else if (type 
== wxS("double")) 
2385         value
->Assign(((wxVariantDoubleData
*)GetData())->GetValue()); 
2387     else if (type 
== wxS("ulonglong")) 
2388         *value 
= ((wxVariantDataULongLong
*)GetData())->GetValue(); 
2395 bool wxVariant::Convert(wxULongLong
* value
) const 
2397     wxString 
type(GetType()); 
2398     if (type 
== wxS("ulonglong")) 
2399         *value 
= ((wxVariantDataULongLong
*)GetData())->GetValue(); 
2400     else if (type 
== wxS("long")) 
2401         *value 
= ((wxVariantDataLong
*)GetData())->GetValue(); 
2402     else if (type 
== wxS("string")) 
2404         wxString s 
= ((wxVariantDataString
*)GetData())->GetValue(); 
2406         wxULongLong_t value_t
; 
2407         if ( !s
.ToULongLong(&value_t
) ) 
2411         unsigned long l_value
; 
2412         if ( !s
.ToULong(&l_value
) ) 
2417     else if (type 
== wxS("bool")) 
2418         *value 
= (long) (((wxVariantDataBool
*)GetData())->GetValue()); 
2419     else if (type 
== wxS("double")) 
2421         double value_d 
= ((wxVariantDoubleData
*)GetData())->GetValue(); 
2423         if ( value_d 
< 0.0 ) 
2427         *value 
= (wxULongLong_t
) value_d
; 
2430         temp
.Assign(value_d
); 
2434     else if (type 
== wxS("longlong")) 
2435         *value 
= ((wxVariantDataLongLong
*)GetData())->GetValue(); 
2441 #endif // wxUSE_LONGLONG 
2444 bool wxVariant::Convert(wxDateTime
* value
) const 
2446     wxString 
type(GetType()); 
2447     if (type 
== wxT("datetime")) 
2449         *value 
= ((wxVariantDataDateTime
*)GetData())->GetValue(); 
2453     // Fallback to string conversion 
2455     if ( !Convert(&val
) ) 
2458     // Try to parse this as either date and time, only date or only time 
2459     // checking that the entire string was parsed 
2460     wxString::const_iterator end
; 
2461     if ( value
->ParseDateTime(val
, &end
) && end 
== val
.end() ) 
2464     if ( value
->ParseDate(val
, &end
) && end 
== val
.end() ) 
2467     if ( value
->ParseTime(val
, &end
) && end 
== val
.end() ) 
2472 #endif // wxUSE_DATETIME 
2474 #endif // wxUSE_VARIANT