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
232 wxVariantData
* data
= GetData();
234 if ( data
->GetAsAny(&any
) )
237 // If everything else fails, wrap the whole wxVariantData
243 // -----------------------------------------------------------------
245 // -----------------------------------------------------------------
247 class WXDLLIMPEXP_BASE wxVariantDataLong
: public wxVariantData
250 wxVariantDataLong() { m_value
= 0; }
251 wxVariantDataLong(long value
) { m_value
= value
; }
253 inline long GetValue() const { return m_value
; }
254 inline void SetValue(long value
) { m_value
= value
; }
256 virtual bool Eq(wxVariantData
& data
) const;
258 virtual bool Read(wxString
& str
);
259 virtual bool Write(wxString
& str
) const;
260 #if wxUSE_STD_IOSTREAM
261 virtual bool Read(wxSTD istream
& str
);
262 virtual bool Write(wxSTD ostream
& str
) const;
265 virtual bool Read(wxInputStream
& str
);
266 virtual bool Write(wxOutputStream
&str
) const;
267 #endif // wxUSE_STREAMS
269 wxVariantData
* Clone() const { return new wxVariantDataLong(m_value
); }
271 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
293 IMPLEMENT_TRIVIAL_WXANY_CONVERSION(long, wxVariantDataLong
)
296 bool wxVariantDataLong::Eq(wxVariantData
& data
) const
298 wxASSERT_MSG( (data
.GetType() == wxT("long")), wxT("wxVariantDataLong::Eq: argument mismatch") );
300 wxVariantDataLong
& otherData
= (wxVariantDataLong
&) data
;
302 return (otherData
.m_value
== m_value
);
305 #if wxUSE_STD_IOSTREAM
306 bool wxVariantDataLong::Write(wxSTD ostream
& str
) const
310 str
<< (const char*) s
.mb_str();
315 bool wxVariantDataLong::Write(wxString
& str
) const
317 str
.Printf(wxT("%ld"), m_value
);
321 #if wxUSE_STD_IOSTREAM
322 bool wxVariantDataLong::Read(wxSTD istream
& str
)
330 bool wxVariantDataLong::Write(wxOutputStream
& str
) const
332 wxTextOutputStream
s(str
);
334 s
.Write32((size_t)m_value
);
338 bool wxVariantDataLong::Read(wxInputStream
& str
)
340 wxTextInputStream
s(str
);
341 m_value
= s
.Read32();
344 #endif // wxUSE_STREAMS
346 bool wxVariantDataLong::Read(wxString
& str
)
348 m_value
= wxAtol(str
);
354 wxVariant::wxVariant(long val
, const wxString
& name
)
356 m_refData
= new wxVariantDataLong(val
);
360 wxVariant::wxVariant(int val
, const wxString
& name
)
362 m_refData
= new wxVariantDataLong((long)val
);
366 wxVariant::wxVariant(short val
, const wxString
& name
)
368 m_refData
= new wxVariantDataLong((long)val
);
372 bool wxVariant::operator== (long value
) const
375 if (!Convert(&thisValue
))
378 return (value
== thisValue
);
381 bool wxVariant::operator!= (long value
) const
383 return (!((*this) == value
));
386 void wxVariant::operator= (long value
)
388 if (GetType() == wxT("long") &&
389 m_refData
->GetRefCount() == 1)
391 ((wxVariantDataLong
*)GetData())->SetValue(value
);
396 m_refData
= new wxVariantDataLong(value
);
400 long wxVariant::GetLong() const
403 if (Convert(& value
))
407 wxFAIL_MSG(wxT("Could not convert to a long"));
412 // -----------------------------------------------------------------
413 // wxVariantDoubleData
414 // -----------------------------------------------------------------
416 class WXDLLIMPEXP_BASE wxVariantDoubleData
: public wxVariantData
419 wxVariantDoubleData() { m_value
= 0.0; }
420 wxVariantDoubleData(double value
) { m_value
= value
; }
422 inline double GetValue() const { return m_value
; }
423 inline void SetValue(double value
) { m_value
= value
; }
425 virtual bool Eq(wxVariantData
& data
) const;
426 virtual bool Read(wxString
& str
);
427 #if wxUSE_STD_IOSTREAM
428 virtual bool Write(wxSTD ostream
& str
) const;
430 virtual bool Write(wxString
& str
) const;
431 #if wxUSE_STD_IOSTREAM
432 virtual bool Read(wxSTD istream
& str
);
435 virtual bool Read(wxInputStream
& str
);
436 virtual bool Write(wxOutputStream
&str
) const;
437 #endif // wxUSE_STREAMS
438 virtual wxString
GetType() const { return wxT("double"); }
440 wxVariantData
* Clone() const { return new wxVariantDoubleData(m_value
); }
442 DECLARE_WXANY_CONVERSION()
447 IMPLEMENT_TRIVIAL_WXANY_CONVERSION(double, wxVariantDoubleData
)
449 bool wxVariantDoubleData::Eq(wxVariantData
& data
) const
451 wxASSERT_MSG( (data
.GetType() == wxT("double")), wxT("wxVariantDoubleData::Eq: argument mismatch") );
453 wxVariantDoubleData
& otherData
= (wxVariantDoubleData
&) data
;
455 return wxIsSameDouble(otherData
.m_value
, m_value
);
458 #if wxUSE_STD_IOSTREAM
459 bool wxVariantDoubleData::Write(wxSTD ostream
& str
) const
463 str
<< (const char*) s
.mb_str();
468 bool wxVariantDoubleData::Write(wxString
& str
) const
470 str
.Printf(wxT("%.14g"), m_value
);
474 #if wxUSE_STD_IOSTREAM
475 bool wxVariantDoubleData::Read(wxSTD istream
& str
)
483 bool wxVariantDoubleData::Write(wxOutputStream
& str
) const
485 wxTextOutputStream
s(str
);
486 s
.WriteDouble((double)m_value
);
490 bool wxVariantDoubleData::Read(wxInputStream
& str
)
492 wxTextInputStream
s(str
);
493 m_value
= (float)s
.ReadDouble();
496 #endif // wxUSE_STREAMS
498 bool wxVariantDoubleData::Read(wxString
& str
)
500 m_value
= wxAtof(str
);
504 // wxVariant double code
506 wxVariant::wxVariant(double val
, const wxString
& name
)
508 m_refData
= new wxVariantDoubleData(val
);
512 bool wxVariant::operator== (double value
) const
515 if (!Convert(&thisValue
))
518 return wxIsSameDouble(value
, thisValue
);
521 bool wxVariant::operator!= (double value
) const
523 return (!((*this) == value
));
526 void wxVariant::operator= (double value
)
528 if (GetType() == wxT("double") &&
529 m_refData
->GetRefCount() == 1)
531 ((wxVariantDoubleData
*)GetData())->SetValue(value
);
536 m_refData
= new wxVariantDoubleData(value
);
540 double wxVariant::GetDouble() const
543 if (Convert(& value
))
547 wxFAIL_MSG(wxT("Could not convert to a double number"));
552 // -----------------------------------------------------------------
554 // -----------------------------------------------------------------
556 class WXDLLIMPEXP_BASE wxVariantDataBool
: public wxVariantData
559 wxVariantDataBool() { m_value
= 0; }
560 wxVariantDataBool(bool value
) { m_value
= value
; }
562 inline bool GetValue() const { return m_value
; }
563 inline void SetValue(bool value
) { m_value
= value
; }
565 virtual bool Eq(wxVariantData
& data
) const;
566 #if wxUSE_STD_IOSTREAM
567 virtual bool Write(wxSTD ostream
& str
) const;
569 virtual bool Write(wxString
& str
) const;
570 virtual bool Read(wxString
& str
);
571 #if wxUSE_STD_IOSTREAM
572 virtual bool Read(wxSTD istream
& str
);
575 virtual bool Read(wxInputStream
& str
);
576 virtual bool Write(wxOutputStream
& str
) const;
577 #endif // wxUSE_STREAMS
578 virtual wxString
GetType() const { return wxT("bool"); }
580 wxVariantData
* Clone() const { return new wxVariantDataBool(m_value
); }
582 DECLARE_WXANY_CONVERSION()
587 IMPLEMENT_TRIVIAL_WXANY_CONVERSION(bool, wxVariantDataBool
)
589 bool wxVariantDataBool::Eq(wxVariantData
& data
) const
591 wxASSERT_MSG( (data
.GetType() == wxT("bool")), wxT("wxVariantDataBool::Eq: argument mismatch") );
593 wxVariantDataBool
& otherData
= (wxVariantDataBool
&) data
;
595 return (otherData
.m_value
== m_value
);
598 #if wxUSE_STD_IOSTREAM
599 bool wxVariantDataBool::Write(wxSTD ostream
& str
) const
603 str
<< (const char*) s
.mb_str();
608 bool wxVariantDataBool::Write(wxString
& str
) const
610 str
.Printf(wxT("%d"), (int) m_value
);
614 #if wxUSE_STD_IOSTREAM
615 bool wxVariantDataBool::Read(wxSTD istream
& WXUNUSED(str
))
617 wxFAIL_MSG(wxT("Unimplemented"));
618 // str >> (long) m_value;
624 bool wxVariantDataBool::Write(wxOutputStream
& str
) const
626 wxTextOutputStream
s(str
);
632 bool wxVariantDataBool::Read(wxInputStream
& str
)
634 wxTextInputStream
s(str
);
636 m_value
= s
.Read8() != 0;
639 #endif // wxUSE_STREAMS
641 bool wxVariantDataBool::Read(wxString
& str
)
643 m_value
= (wxAtol(str
) != 0);
649 wxVariant::wxVariant(bool val
, const wxString
& name
)
651 m_refData
= new wxVariantDataBool(val
);
655 bool wxVariant::operator== (bool value
) const
658 if (!Convert(&thisValue
))
661 return (value
== thisValue
);
664 bool wxVariant::operator!= (bool value
) const
666 return (!((*this) == value
));
669 void wxVariant::operator= (bool value
)
671 if (GetType() == wxT("bool") &&
672 m_refData
->GetRefCount() == 1)
674 ((wxVariantDataBool
*)GetData())->SetValue(value
);
679 m_refData
= new wxVariantDataBool(value
);
683 bool wxVariant::GetBool() const
686 if (Convert(& value
))
690 wxFAIL_MSG(wxT("Could not convert to a bool"));
695 // -----------------------------------------------------------------
697 // -----------------------------------------------------------------
699 class WXDLLIMPEXP_BASE wxVariantDataChar
: public wxVariantData
702 wxVariantDataChar() { m_value
= 0; }
703 wxVariantDataChar(const wxUniChar
& value
) { m_value
= value
; }
705 inline wxUniChar
GetValue() const { return m_value
; }
706 inline void SetValue(const wxUniChar
& value
) { m_value
= value
; }
708 virtual bool Eq(wxVariantData
& data
) const;
709 #if wxUSE_STD_IOSTREAM
710 virtual bool Read(wxSTD istream
& str
);
711 virtual bool Write(wxSTD ostream
& str
) const;
713 virtual bool Read(wxString
& str
);
714 virtual bool Write(wxString
& str
) const;
716 virtual bool Read(wxInputStream
& str
);
717 virtual bool Write(wxOutputStream
& str
) const;
718 #endif // wxUSE_STREAMS
719 virtual wxString
GetType() const { return wxT("char"); }
720 wxVariantData
* Clone() const { return new wxVariantDataChar(m_value
); }
722 DECLARE_WXANY_CONVERSION()
727 IMPLEMENT_TRIVIAL_WXANY_CONVERSION(wxUniChar
, wxVariantDataChar
)
729 bool wxVariantDataChar::Eq(wxVariantData
& data
) const
731 wxASSERT_MSG( (data
.GetType() == wxT("char")), wxT("wxVariantDataChar::Eq: argument mismatch") );
733 wxVariantDataChar
& otherData
= (wxVariantDataChar
&) data
;
735 return (otherData
.m_value
== m_value
);
738 #if wxUSE_STD_IOSTREAM
739 bool wxVariantDataChar::Write(wxSTD ostream
& str
) const
741 str
<< wxString(m_value
);
746 bool wxVariantDataChar::Write(wxString
& str
) const
752 #if wxUSE_STD_IOSTREAM
753 bool wxVariantDataChar::Read(wxSTD istream
& WXUNUSED(str
))
755 wxFAIL_MSG(wxT("Unimplemented"));
762 bool wxVariantDataChar::Write(wxOutputStream
& str
) const
764 wxTextOutputStream
s(str
);
766 // FIXME-UTF8: this should be just "s << m_value;" after removal of
767 // ANSI build and addition of wxUniChar to wxTextOutputStream:
768 s
<< (wxChar
)m_value
;
773 bool wxVariantDataChar::Read(wxInputStream
& str
)
775 wxTextInputStream
s(str
);
777 // FIXME-UTF8: this should be just "s >> m_value;" after removal of
778 // ANSI build and addition of wxUniChar to wxTextInputStream:
785 #endif // wxUSE_STREAMS
787 bool wxVariantDataChar::Read(wxString
& str
)
793 wxVariant::wxVariant(const wxUniChar
& val
, const wxString
& name
)
795 m_refData
= new wxVariantDataChar(val
);
799 wxVariant::wxVariant(char val
, const wxString
& name
)
801 m_refData
= new wxVariantDataChar(val
);
805 wxVariant::wxVariant(wchar_t val
, const wxString
& name
)
807 m_refData
= new wxVariantDataChar(val
);
811 bool wxVariant::operator==(const wxUniChar
& value
) const
814 if (!Convert(&thisValue
))
817 return (value
== thisValue
);
820 wxVariant
& wxVariant::operator=(const wxUniChar
& value
)
822 if (GetType() == wxT("char") &&
823 m_refData
->GetRefCount() == 1)
825 ((wxVariantDataChar
*)GetData())->SetValue(value
);
830 m_refData
= new wxVariantDataChar(value
);
836 wxUniChar
wxVariant::GetChar() const
839 if (Convert(& value
))
843 wxFAIL_MSG(wxT("Could not convert to a char"));
848 // ----------------------------------------------------------------------------
849 // wxVariantDataString
850 // ----------------------------------------------------------------------------
852 class WXDLLIMPEXP_BASE wxVariantDataString
: public wxVariantData
855 wxVariantDataString() { }
856 wxVariantDataString(const wxString
& value
) { m_value
= value
; }
858 inline wxString
GetValue() const { return m_value
; }
859 inline void SetValue(const wxString
& value
) { m_value
= value
; }
861 virtual bool Eq(wxVariantData
& data
) const;
862 #if wxUSE_STD_IOSTREAM
863 virtual bool Write(wxSTD ostream
& str
) const;
865 virtual bool Read(wxString
& str
);
866 virtual bool Write(wxString
& str
) const;
867 #if wxUSE_STD_IOSTREAM
868 virtual bool Read(wxSTD istream
& WXUNUSED(str
)) { return false; }
871 virtual bool Read(wxInputStream
& str
);
872 virtual bool Write(wxOutputStream
& str
) const;
873 #endif // wxUSE_STREAMS
874 virtual wxString
GetType() const { return wxT("string"); }
875 wxVariantData
* Clone() const { return new wxVariantDataString(m_value
); }
877 DECLARE_WXANY_CONVERSION()
882 IMPLEMENT_TRIVIAL_WXANY_CONVERSION(wxString
, wxVariantDataString
)
885 // This allows converting string literal wxAnys to string variants
886 wxVariantData
* wxVariantDataFromConstCharPAny(const wxAny
& any
)
888 return new wxVariantDataString(wxANY_AS(any
, const char*));
891 wxVariantData
* wxVariantDataFromConstWchar_tPAny(const wxAny
& any
)
893 return new wxVariantDataString(wxANY_AS(any
, const wchar_t*));
896 _REGISTER_WXANY_CONVERSION(const char*,
898 wxVariantDataFromConstCharPAny
)
899 _REGISTER_WXANY_CONVERSION(const wchar_t*,
901 wxVariantDataFromConstWchar_tPAny
)
904 bool wxVariantDataString::Eq(wxVariantData
& data
) const
906 wxASSERT_MSG( (data
.GetType() == wxT("string")), wxT("wxVariantDataString::Eq: argument mismatch") );
908 wxVariantDataString
& otherData
= (wxVariantDataString
&) data
;
910 return (otherData
.m_value
== m_value
);
913 #if wxUSE_STD_IOSTREAM
914 bool wxVariantDataString::Write(wxSTD ostream
& str
) const
916 str
<< (const char*) m_value
.mb_str();
921 bool wxVariantDataString::Write(wxString
& str
) const
928 bool wxVariantDataString::Write(wxOutputStream
& str
) const
930 // why doesn't wxOutputStream::operator<< take "const wxString&"
931 wxTextOutputStream
s(str
);
932 s
.WriteString(m_value
);
936 bool wxVariantDataString::Read(wxInputStream
& str
)
938 wxTextInputStream
s(str
);
940 m_value
= s
.ReadLine();
943 #endif // wxUSE_STREAMS
945 bool wxVariantDataString::Read(wxString
& str
)
953 wxVariant::wxVariant(const wxString
& val
, const wxString
& name
)
955 m_refData
= new wxVariantDataString(val
);
959 wxVariant::wxVariant(const char* val
, const wxString
& name
)
961 m_refData
= new wxVariantDataString(wxString(val
));
965 wxVariant::wxVariant(const wchar_t* val
, const wxString
& name
)
967 m_refData
= new wxVariantDataString(wxString(val
));
971 wxVariant::wxVariant(const wxCStrData
& val
, const wxString
& name
)
973 m_refData
= new wxVariantDataString(val
.AsString());
977 wxVariant::wxVariant(const wxScopedCharBuffer
& val
, const wxString
& name
)
979 m_refData
= new wxVariantDataString(wxString(val
));
983 wxVariant::wxVariant(const wxScopedWCharBuffer
& val
, const wxString
& name
)
985 m_refData
= new wxVariantDataString(wxString(val
));
989 bool wxVariant::operator== (const wxString
& value
) const
992 if (!Convert(&thisValue
))
995 return value
== thisValue
;
998 bool wxVariant::operator!= (const wxString
& value
) const
1000 return (!((*this) == value
));
1003 wxVariant
& wxVariant::operator= (const wxString
& value
)
1005 if (GetType() == wxT("string") &&
1006 m_refData
->GetRefCount() == 1)
1008 ((wxVariantDataString
*)GetData())->SetValue(value
);
1013 m_refData
= new wxVariantDataString(value
);
1018 wxString
wxVariant::GetString() const
1021 if (!Convert(& value
))
1023 wxFAIL_MSG(wxT("Could not convert to a string"));
1029 // ----------------------------------------------------------------------------
1030 // wxVariantDataWxObjectPtr
1031 // ----------------------------------------------------------------------------
1033 class wxVariantDataWxObjectPtr
: public wxVariantData
1036 wxVariantDataWxObjectPtr() { }
1037 wxVariantDataWxObjectPtr(wxObject
* value
) { m_value
= value
; }
1039 inline wxObject
* GetValue() const { return m_value
; }
1040 inline void SetValue(wxObject
* value
) { m_value
= value
; }
1042 virtual bool Eq(wxVariantData
& data
) const;
1043 #if wxUSE_STD_IOSTREAM
1044 virtual bool Write(wxSTD ostream
& str
) const;
1046 virtual bool Write(wxString
& str
) const;
1047 #if wxUSE_STD_IOSTREAM
1048 virtual bool Read(wxSTD istream
& str
);
1050 virtual bool Read(wxString
& str
);
1051 virtual wxString
GetType() const ;
1052 virtual wxVariantData
* Clone() const { return new wxVariantDataWxObjectPtr(m_value
); }
1054 virtual wxClassInfo
* GetValueClassInfo();
1056 DECLARE_WXANY_CONVERSION()
1061 IMPLEMENT_TRIVIAL_WXANY_CONVERSION(wxObject
*, wxVariantDataWxObjectPtr
)
1063 bool wxVariantDataWxObjectPtr::Eq(wxVariantData
& data
) const
1065 wxASSERT_MSG( data
.GetType() == GetType(), wxT("wxVariantDataWxObjectPtr::Eq: argument mismatch") );
1067 wxVariantDataWxObjectPtr
& otherData
= (wxVariantDataWxObjectPtr
&) data
;
1069 return (otherData
.m_value
== m_value
);
1072 wxString
wxVariantDataWxObjectPtr::GetType() const
1074 wxString
returnVal(wxT("wxObject*"));
1078 returnVal
= m_value
->GetClassInfo()->GetClassName();
1079 returnVal
+= wxT("*");
1085 wxClassInfo
* wxVariantDataWxObjectPtr::GetValueClassInfo()
1087 wxClassInfo
* returnVal
=NULL
;
1089 if (m_value
) returnVal
= m_value
->GetClassInfo();
1094 #if wxUSE_STD_IOSTREAM
1095 bool wxVariantDataWxObjectPtr::Write(wxSTD ostream
& str
) const
1099 str
<< (const char*) s
.mb_str();
1104 bool wxVariantDataWxObjectPtr::Write(wxString
& str
) const
1106 str
.Printf(wxT("%s(%p)"), GetType().c_str(), static_cast<void*>(m_value
));
1110 #if wxUSE_STD_IOSTREAM
1111 bool wxVariantDataWxObjectPtr::Read(wxSTD istream
& WXUNUSED(str
))
1118 bool wxVariantDataWxObjectPtr::Read(wxString
& WXUNUSED(str
))
1126 wxVariant::wxVariant( wxObject
* val
, const wxString
& name
)
1128 m_refData
= new wxVariantDataWxObjectPtr(val
);
1132 bool wxVariant::operator== (wxObject
* value
) const
1134 return (value
== ((wxVariantDataWxObjectPtr
*)GetData())->GetValue());
1137 bool wxVariant::operator!= (wxObject
* value
) const
1139 return (!((*this) == (wxObject
*) value
));
1142 void wxVariant::operator= (wxObject
* value
)
1145 m_refData
= new wxVariantDataWxObjectPtr(value
);
1148 wxObject
* wxVariant::GetWxObjectPtr() const
1150 return (wxObject
*) ((wxVariantDataWxObjectPtr
*) m_refData
)->GetValue();
1153 // ----------------------------------------------------------------------------
1154 // wxVariantDataVoidPtr
1155 // ----------------------------------------------------------------------------
1157 class wxVariantDataVoidPtr
: public wxVariantData
1160 wxVariantDataVoidPtr() { }
1161 wxVariantDataVoidPtr(void* value
) { m_value
= value
; }
1163 inline void* GetValue() const { return m_value
; }
1164 inline void SetValue(void* value
) { m_value
= value
; }
1166 virtual bool Eq(wxVariantData
& data
) const;
1167 #if wxUSE_STD_IOSTREAM
1168 virtual bool Write(wxSTD ostream
& str
) const;
1170 virtual bool Write(wxString
& str
) const;
1171 #if wxUSE_STD_IOSTREAM
1172 virtual bool Read(wxSTD istream
& str
);
1174 virtual bool Read(wxString
& str
);
1175 virtual wxString
GetType() const { return wxT("void*"); }
1176 virtual wxVariantData
* Clone() const { return new wxVariantDataVoidPtr(m_value
); }
1178 DECLARE_WXANY_CONVERSION()
1183 IMPLEMENT_TRIVIAL_WXANY_CONVERSION(void*, wxVariantDataVoidPtr
)
1185 bool wxVariantDataVoidPtr::Eq(wxVariantData
& data
) const
1187 wxASSERT_MSG( data
.GetType() == wxT("void*"), wxT("wxVariantDataVoidPtr::Eq: argument mismatch") );
1189 wxVariantDataVoidPtr
& otherData
= (wxVariantDataVoidPtr
&) data
;
1191 return (otherData
.m_value
== m_value
);
1194 #if wxUSE_STD_IOSTREAM
1195 bool wxVariantDataVoidPtr::Write(wxSTD ostream
& str
) const
1199 str
<< (const char*) s
.mb_str();
1204 bool wxVariantDataVoidPtr::Write(wxString
& str
) const
1206 str
.Printf(wxT("%p"), m_value
);
1210 #if wxUSE_STD_IOSTREAM
1211 bool wxVariantDataVoidPtr::Read(wxSTD istream
& WXUNUSED(str
))
1218 bool wxVariantDataVoidPtr::Read(wxString
& WXUNUSED(str
))
1226 wxVariant::wxVariant( void* val
, const wxString
& name
)
1228 m_refData
= new wxVariantDataVoidPtr(val
);
1232 bool wxVariant::operator== (void* value
) const
1234 return (value
== ((wxVariantDataVoidPtr
*)GetData())->GetValue());
1237 bool wxVariant::operator!= (void* value
) const
1239 return (!((*this) == (void*) value
));
1242 void wxVariant::operator= (void* value
)
1244 if (GetType() == wxT("void*") && (m_refData
->GetRefCount() == 1))
1246 ((wxVariantDataVoidPtr
*)GetData())->SetValue(value
);
1251 m_refData
= new wxVariantDataVoidPtr(value
);
1255 void* wxVariant::GetVoidPtr() const
1257 // handling this specially is convenient when working with COM, see #9873
1261 wxASSERT( GetType() == wxT("void*") );
1263 return (void*) ((wxVariantDataVoidPtr
*) m_refData
)->GetValue();
1266 // ----------------------------------------------------------------------------
1267 // wxVariantDataDateTime
1268 // ----------------------------------------------------------------------------
1272 class wxVariantDataDateTime
: public wxVariantData
1275 wxVariantDataDateTime() { }
1276 wxVariantDataDateTime(const wxDateTime
& value
) { m_value
= value
; }
1278 inline wxDateTime
GetValue() const { return m_value
; }
1279 inline void SetValue(const wxDateTime
& value
) { m_value
= value
; }
1281 virtual bool Eq(wxVariantData
& data
) const;
1282 #if wxUSE_STD_IOSTREAM
1283 virtual bool Write(wxSTD ostream
& str
) const;
1285 virtual bool Write(wxString
& str
) const;
1286 #if wxUSE_STD_IOSTREAM
1287 virtual bool Read(wxSTD istream
& str
);
1289 virtual bool Read(wxString
& str
);
1290 virtual wxString
GetType() const { return wxT("datetime"); }
1291 virtual wxVariantData
* Clone() const { return new wxVariantDataDateTime(m_value
); }
1293 DECLARE_WXANY_CONVERSION()
1298 IMPLEMENT_TRIVIAL_WXANY_CONVERSION(wxDateTime
, wxVariantDataDateTime
)
1300 bool wxVariantDataDateTime::Eq(wxVariantData
& data
) const
1302 wxASSERT_MSG( (data
.GetType() == wxT("datetime")), wxT("wxVariantDataDateTime::Eq: argument mismatch") );
1304 wxVariantDataDateTime
& otherData
= (wxVariantDataDateTime
&) data
;
1306 return (otherData
.m_value
== m_value
);
1310 #if wxUSE_STD_IOSTREAM
1311 bool wxVariantDataDateTime::Write(wxSTD ostream
& str
) const
1315 str
<< value
.c_str();
1321 bool wxVariantDataDateTime::Write(wxString
& str
) const
1323 if ( m_value
.IsValid() )
1324 str
= m_value
.Format();
1326 str
= wxS("Invalid");
1331 #if wxUSE_STD_IOSTREAM
1332 bool wxVariantDataDateTime::Read(wxSTD istream
& WXUNUSED(str
))
1340 bool wxVariantDataDateTime::Read(wxString
& str
)
1342 if ( str
== wxS("Invalid") )
1344 m_value
= wxInvalidDateTime
;
1348 wxString::const_iterator end
;
1349 return m_value
.ParseDateTime(str
, &end
) && end
== str
.end();
1354 wxVariant::wxVariant(const wxDateTime
& val
, const wxString
& name
) // Date
1356 m_refData
= new wxVariantDataDateTime(val
);
1360 bool wxVariant::operator== (const wxDateTime
& value
) const
1362 wxDateTime thisValue
;
1363 if (!Convert(&thisValue
))
1366 return value
.IsEqualTo(thisValue
);
1369 bool wxVariant::operator!= (const wxDateTime
& value
) const
1371 return (!((*this) == value
));
1374 void wxVariant::operator= (const wxDateTime
& value
)
1376 if (GetType() == wxT("datetime") &&
1377 m_refData
->GetRefCount() == 1)
1379 ((wxVariantDataDateTime
*)GetData())->SetValue(value
);
1384 m_refData
= new wxVariantDataDateTime(value
);
1388 wxDateTime
wxVariant::GetDateTime() const
1391 if (!Convert(& value
))
1393 wxFAIL_MSG(wxT("Could not convert to a datetime"));
1399 #endif // wxUSE_DATETIME
1401 // ----------------------------------------------------------------------------
1402 // wxVariantDataArrayString
1403 // ----------------------------------------------------------------------------
1405 class wxVariantDataArrayString
: public wxVariantData
1408 wxVariantDataArrayString() { }
1409 wxVariantDataArrayString(const wxArrayString
& value
) { m_value
= value
; }
1411 wxArrayString
GetValue() const { return m_value
; }
1412 void SetValue(const wxArrayString
& value
) { m_value
= value
; }
1414 virtual bool Eq(wxVariantData
& data
) const;
1415 #if wxUSE_STD_IOSTREAM
1416 virtual bool Write(wxSTD ostream
& str
) const;
1418 virtual bool Write(wxString
& str
) const;
1419 #if wxUSE_STD_IOSTREAM
1420 virtual bool Read(wxSTD istream
& str
);
1422 virtual bool Read(wxString
& str
);
1423 virtual wxString
GetType() const { return wxT("arrstring"); }
1424 virtual wxVariantData
* Clone() const { return new wxVariantDataArrayString(m_value
); }
1426 DECLARE_WXANY_CONVERSION()
1428 wxArrayString m_value
;
1431 IMPLEMENT_TRIVIAL_WXANY_CONVERSION(wxArrayString
, wxVariantDataArrayString
)
1433 bool wxVariantDataArrayString::Eq(wxVariantData
& data
) const
1435 wxASSERT_MSG( data
.GetType() == GetType(), wxT("wxVariantDataArrayString::Eq: argument mismatch") );
1437 wxVariantDataArrayString
& otherData
= (wxVariantDataArrayString
&) data
;
1439 return otherData
.m_value
== m_value
;
1442 #if wxUSE_STD_IOSTREAM
1443 bool wxVariantDataArrayString::Write(wxSTD ostream
& WXUNUSED(str
)) const
1450 bool wxVariantDataArrayString::Write(wxString
& str
) const
1452 size_t count
= m_value
.GetCount();
1453 for ( size_t n
= 0; n
< count
; n
++ )
1465 #if wxUSE_STD_IOSTREAM
1466 bool wxVariantDataArrayString::Read(wxSTD istream
& WXUNUSED(str
))
1474 bool wxVariantDataArrayString::Read(wxString
& str
)
1476 wxStringTokenizer
tk(str
, wxT(";"));
1477 while ( tk
.HasMoreTokens() )
1479 m_value
.Add(tk
.GetNextToken());
1487 wxVariant::wxVariant(const wxArrayString
& val
, const wxString
& name
) // Strings
1489 m_refData
= new wxVariantDataArrayString(val
);
1493 bool wxVariant::operator==(const wxArrayString
& WXUNUSED(value
)) const
1495 wxFAIL_MSG( wxT("TODO") );
1500 bool wxVariant::operator!=(const wxArrayString
& value
) const
1502 return !(*this == value
);
1505 void wxVariant::operator=(const wxArrayString
& value
)
1507 if (GetType() == wxT("arrstring") &&
1508 m_refData
->GetRefCount() == 1)
1510 ((wxVariantDataArrayString
*)GetData())->SetValue(value
);
1515 m_refData
= new wxVariantDataArrayString(value
);
1519 wxArrayString
wxVariant::GetArrayString() const
1521 if ( GetType() == wxT("arrstring") )
1522 return ((wxVariantDataArrayString
*)GetData())->GetValue();
1524 return wxArrayString();
1527 // ----------------------------------------------------------------------------
1528 // wxVariantDataLongLong
1529 // ----------------------------------------------------------------------------
1533 class WXDLLIMPEXP_BASE wxVariantDataLongLong
: public wxVariantData
1536 wxVariantDataLongLong() { m_value
= 0; }
1537 wxVariantDataLongLong(wxLongLong value
) { m_value
= value
; }
1539 wxLongLong
GetValue() const { return m_value
; }
1540 void SetValue(wxLongLong value
) { m_value
= value
; }
1542 virtual bool Eq(wxVariantData
& data
) const;
1544 virtual bool Read(wxString
& str
);
1545 virtual bool Write(wxString
& str
) const;
1546 #if wxUSE_STD_IOSTREAM
1547 virtual bool Read(wxSTD istream
& str
);
1548 virtual bool Write(wxSTD ostream
& str
) const;
1551 virtual bool Read(wxInputStream
& str
);
1552 virtual bool Write(wxOutputStream
&str
) const;
1553 #endif // wxUSE_STREAMS
1555 wxVariantData
* Clone() const
1557 return new wxVariantDataLongLong(m_value
);
1560 virtual wxString
GetType() const { return wxS("longlong"); }
1562 DECLARE_WXANY_CONVERSION()
1568 // wxLongLong type requires customized wxAny conversion code
1573 bool wxVariantDataLongLong::GetAsAny(wxAny
* any
) const
1575 *any
= m_value
.GetValue();
1579 wxVariantData
* wxVariantDataLongLong::VariantDataFactory(const wxAny
& any
)
1581 return new wxVariantDataLongLong(wxANY_AS(any
, wxLongLong_t
));
1584 REGISTER_WXANY_CONVERSION(wxLongLong_t
, wxVariantDataLongLong
)
1586 #else // if !defined(wxLongLong_t)
1588 bool wxVariantDataLongLong::GetAsAny(wxAny
* any
) const
1594 wxVariantData
* wxVariantDataLongLong::VariantDataFactory(const wxAny
& any
)
1596 return new wxVariantDataLongLong(wxANY_AS(any
, wxLongLong
));
1599 REGISTER_WXANY_CONVERSION(wxLongLong
, wxVariantDataLongLong
)
1601 #endif // defined(wxLongLong_t)/!defined(wxLongLong_t)
1604 bool wxVariantDataLongLong::Eq(wxVariantData
& data
) const
1606 wxASSERT_MSG( (data
.GetType() == wxS("longlong")),
1607 "wxVariantDataLongLong::Eq: argument mismatch" );
1609 wxVariantDataLongLong
& otherData
= (wxVariantDataLongLong
&) data
;
1611 return (otherData
.m_value
== m_value
);
1614 #if wxUSE_STD_IOSTREAM
1615 bool wxVariantDataLongLong::Write(wxSTD ostream
& str
) const
1619 str
<< (const char*) s
.mb_str();
1624 bool wxVariantDataLongLong::Write(wxString
& str
) const
1627 str
.Printf(wxS("%lld"), m_value
.GetValue());
1634 #if wxUSE_STD_IOSTREAM
1635 bool wxVariantDataLongLong::Read(wxSTD istream
& WXUNUSED(str
))
1637 wxFAIL_MSG(wxS("Unimplemented"));
1643 bool wxVariantDataLongLong::Write(wxOutputStream
& str
) const
1645 wxTextOutputStream
s(str
);
1646 s
.Write32(m_value
.GetLo());
1647 s
.Write32(m_value
.GetHi());
1651 bool wxVariantDataLongLong::Read(wxInputStream
& str
)
1653 wxTextInputStream
s(str
);
1654 unsigned long lo
= s
.Read32();
1655 long hi
= s
.Read32();
1656 m_value
= wxLongLong(hi
, lo
);
1659 #endif // wxUSE_STREAMS
1661 bool wxVariantDataLongLong::Read(wxString
& str
)
1664 wxLongLong_t value_t
;
1665 if ( !str
.ToLongLong(&value_t
) )
1676 wxVariant::wxVariant(wxLongLong val
, const wxString
& name
)
1678 m_refData
= new wxVariantDataLongLong(val
);
1682 bool wxVariant::operator==(wxLongLong value
) const
1684 wxLongLong thisValue
;
1685 if ( !Convert(&thisValue
) )
1688 return (value
== thisValue
);
1691 bool wxVariant::operator!=(wxLongLong value
) const
1693 return (!((*this) == value
));
1696 void wxVariant::operator=(wxLongLong value
)
1698 if ( GetType() == wxS("longlong") &&
1699 m_refData
->GetRefCount() == 1 )
1701 ((wxVariantDataLongLong
*)GetData())->SetValue(value
);
1706 m_refData
= new wxVariantDataLongLong(value
);
1710 wxLongLong
wxVariant::GetLongLong() const
1713 if ( Convert(&value
) )
1719 wxFAIL_MSG(wxT("Could not convert to a long long"));
1724 #endif // wxUSE_LONGLONG
1726 // ----------------------------------------------------------------------------
1727 // wxVariantDataULongLong
1728 // ----------------------------------------------------------------------------
1732 class WXDLLIMPEXP_BASE wxVariantDataULongLong
: public wxVariantData
1735 wxVariantDataULongLong() { m_value
= 0; }
1736 wxVariantDataULongLong(wxULongLong value
) { m_value
= value
; }
1738 wxULongLong
GetValue() const { return m_value
; }
1739 void SetValue(wxULongLong value
) { m_value
= value
; }
1741 virtual bool Eq(wxVariantData
& data
) const;
1743 virtual bool Read(wxString
& str
);
1744 virtual bool Write(wxString
& str
) const;
1745 #if wxUSE_STD_IOSTREAM
1746 virtual bool Read(wxSTD istream
& str
);
1747 virtual bool Write(wxSTD ostream
& str
) const;
1750 virtual bool Read(wxInputStream
& str
);
1751 virtual bool Write(wxOutputStream
&str
) const;
1752 #endif // wxUSE_STREAMS
1754 wxVariantData
* Clone() const
1756 return new wxVariantDataULongLong(m_value
);
1759 virtual wxString
GetType() const { return wxS("ulonglong"); }
1761 DECLARE_WXANY_CONVERSION()
1763 wxULongLong m_value
;
1767 // wxULongLong type requires customized wxAny conversion code
1772 bool wxVariantDataULongLong::GetAsAny(wxAny
* any
) const
1774 *any
= m_value
.GetValue();
1778 wxVariantData
* wxVariantDataULongLong::VariantDataFactory(const wxAny
& any
)
1780 return new wxVariantDataULongLong(wxANY_AS(any
, wxULongLong_t
));
1783 REGISTER_WXANY_CONVERSION(wxULongLong_t
, wxVariantDataULongLong
)
1785 #else // if !defined(wxLongLong_t)
1787 bool wxVariantDataULongLong::GetAsAny(wxAny
* any
) const
1793 wxVariantData
* wxVariantDataULongLong::VariantDataFactory(const wxAny
& any
)
1795 return new wxVariantDataULongLong(wxANY_AS(any
, wxULongLong
));
1798 REGISTER_WXANY_CONVERSION(wxULongLong
, wxVariantDataULongLong
)
1800 #endif // defined(wxLongLong_t)/!defined(wxLongLong_t)
1804 bool wxVariantDataULongLong::Eq(wxVariantData
& data
) const
1806 wxASSERT_MSG( (data
.GetType() == wxS("ulonglong")),
1807 "wxVariantDataULongLong::Eq: argument mismatch" );
1809 wxVariantDataULongLong
& otherData
= (wxVariantDataULongLong
&) data
;
1811 return (otherData
.m_value
== m_value
);
1814 #if wxUSE_STD_IOSTREAM
1815 bool wxVariantDataULongLong::Write(wxSTD ostream
& str
) const
1819 str
<< (const char*) s
.mb_str();
1824 bool wxVariantDataULongLong::Write(wxString
& str
) const
1827 str
.Printf(wxS("%llu"), m_value
.GetValue());
1834 #if wxUSE_STD_IOSTREAM
1835 bool wxVariantDataULongLong::Read(wxSTD istream
& WXUNUSED(str
))
1837 wxFAIL_MSG(wxS("Unimplemented"));
1843 bool wxVariantDataULongLong::Write(wxOutputStream
& str
) const
1845 wxTextOutputStream
s(str
);
1846 s
.Write32(m_value
.GetLo());
1847 s
.Write32(m_value
.GetHi());
1851 bool wxVariantDataULongLong::Read(wxInputStream
& str
)
1853 wxTextInputStream
s(str
);
1854 unsigned long lo
= s
.Read32();
1855 long hi
= s
.Read32();
1856 m_value
= wxULongLong(hi
, lo
);
1859 #endif // wxUSE_STREAMS
1861 bool wxVariantDataULongLong::Read(wxString
& str
)
1864 wxULongLong_t value_t
;
1865 if ( !str
.ToULongLong(&value_t
) )
1876 wxVariant::wxVariant(wxULongLong val
, const wxString
& name
)
1878 m_refData
= new wxVariantDataULongLong(val
);
1882 bool wxVariant::operator==(wxULongLong value
) const
1884 wxULongLong thisValue
;
1885 if ( !Convert(&thisValue
) )
1888 return (value
== thisValue
);
1891 bool wxVariant::operator!=(wxULongLong value
) const
1893 return (!((*this) == value
));
1896 void wxVariant::operator=(wxULongLong value
)
1898 if ( GetType() == wxS("ulonglong") &&
1899 m_refData
->GetRefCount() == 1 )
1901 ((wxVariantDataULongLong
*)GetData())->SetValue(value
);
1906 m_refData
= new wxVariantDataULongLong(value
);
1910 wxULongLong
wxVariant::GetULongLong() const
1913 if ( Convert(&value
) )
1919 wxFAIL_MSG(wxT("Could not convert to a long long"));
1924 #endif // wxUSE_LONGLONG
1926 // ----------------------------------------------------------------------------
1927 // wxVariantDataList
1928 // ----------------------------------------------------------------------------
1930 class WXDLLIMPEXP_BASE wxVariantDataList
: public wxVariantData
1933 wxVariantDataList() {}
1934 wxVariantDataList(const wxVariantList
& list
);
1935 virtual ~wxVariantDataList();
1937 wxVariantList
& GetValue() { return m_value
; }
1938 void SetValue(const wxVariantList
& value
) ;
1940 virtual bool Eq(wxVariantData
& data
) const;
1941 #if wxUSE_STD_IOSTREAM
1942 virtual bool Write(wxSTD ostream
& str
) const;
1944 virtual bool Write(wxString
& str
) const;
1945 #if wxUSE_STD_IOSTREAM
1946 virtual bool Read(wxSTD istream
& str
);
1948 virtual bool Read(wxString
& str
);
1949 virtual wxString
GetType() const { return wxT("list"); }
1953 wxVariantData
* Clone() const { return new wxVariantDataList(m_value
); }
1955 DECLARE_WXANY_CONVERSION()
1957 wxVariantList m_value
;
1963 // Convert to/from list of wxAnys
1966 WX_DEFINE_LIST(wxAnyList
)
1968 bool wxVariantDataList::GetAsAny(wxAny
* any
) const
1971 wxVariantList::compatibility_iterator node
= m_value
.GetFirst();
1974 wxVariant
* pVar
= node
->GetData();
1975 dst
.push_back(new wxAny(((const wxVariant
&)*pVar
)));
1976 node
= node
->GetNext();
1983 wxVariantData
* wxVariantDataList::VariantDataFactory(const wxAny
& any
)
1985 wxAnyList src
= wxANY_AS(any
, wxAnyList
);
1987 wxAnyList::compatibility_iterator node
= src
.GetFirst();
1990 wxAny
* pAny
= node
->GetData();
1991 dst
.push_back(new wxVariant(*pAny
));
1992 node
= node
->GetNext();
1995 return new wxVariantDataList(dst
);
1998 REGISTER_WXANY_CONVERSION(wxAnyList
, wxVariantDataList
)
2002 wxVariantDataList::wxVariantDataList(const wxVariantList
& list
)
2007 wxVariantDataList::~wxVariantDataList()
2012 void wxVariantDataList::SetValue(const wxVariantList
& value
)
2015 wxVariantList::compatibility_iterator node
= value
.GetFirst();
2018 wxVariant
* var
= node
->GetData();
2019 m_value
.Append(new wxVariant(*var
));
2020 node
= node
->GetNext();
2024 void wxVariantDataList::Clear()
2026 wxVariantList::compatibility_iterator node
= m_value
.GetFirst();
2029 wxVariant
* var
= node
->GetData();
2031 node
= node
->GetNext();
2036 bool wxVariantDataList::Eq(wxVariantData
& data
) const
2038 wxASSERT_MSG( (data
.GetType() == wxT("list")), wxT("wxVariantDataList::Eq: argument mismatch") );
2040 wxVariantDataList
& listData
= (wxVariantDataList
&) data
;
2041 wxVariantList::compatibility_iterator node1
= m_value
.GetFirst();
2042 wxVariantList::compatibility_iterator node2
= listData
.GetValue().GetFirst();
2043 while (node1
&& node2
)
2045 wxVariant
* var1
= node1
->GetData();
2046 wxVariant
* var2
= node2
->GetData();
2047 if ((*var1
) != (*var2
))
2049 node1
= node1
->GetNext();
2050 node2
= node2
->GetNext();
2052 if (node1
|| node2
) return false;
2056 #if wxUSE_STD_IOSTREAM
2057 bool wxVariantDataList::Write(wxSTD ostream
& str
) const
2061 str
<< (const char*) s
.mb_str();
2066 bool wxVariantDataList::Write(wxString
& str
) const
2068 str
= wxEmptyString
;
2069 wxVariantList::compatibility_iterator node
= m_value
.GetFirst();
2072 wxVariant
* var
= node
->GetData();
2073 if (node
!= m_value
.GetFirst())
2076 str
+= var
->MakeString();
2077 node
= node
->GetNext();
2083 #if wxUSE_STD_IOSTREAM
2084 bool wxVariantDataList::Read(wxSTD istream
& WXUNUSED(str
))
2086 wxFAIL_MSG(wxT("Unimplemented"));
2092 bool wxVariantDataList::Read(wxString
& WXUNUSED(str
))
2094 wxFAIL_MSG(wxT("Unimplemented"));
2101 wxVariant::wxVariant(const wxVariantList
& val
, const wxString
& name
) // List of variants
2103 m_refData
= new wxVariantDataList(val
);
2107 bool wxVariant::operator== (const wxVariantList
& value
) const
2109 wxASSERT_MSG( (GetType() == wxT("list")), wxT("Invalid type for == operator") );
2111 wxVariantDataList
other(value
);
2112 return (GetData()->Eq(other
));
2115 bool wxVariant::operator!= (const wxVariantList
& value
) const
2117 return (!((*this) == value
));
2120 void wxVariant::operator= (const wxVariantList
& value
)
2122 if (GetType() == wxT("list") &&
2123 m_refData
->GetRefCount() == 1)
2125 ((wxVariantDataList
*)GetData())->SetValue(value
);
2130 m_refData
= new wxVariantDataList(value
);
2134 wxVariantList
& wxVariant::GetList() const
2136 wxASSERT( (GetType() == wxT("list")) );
2138 return (wxVariantList
&) ((wxVariantDataList
*) m_refData
)->GetValue();
2142 void wxVariant::NullList()
2144 SetData(new wxVariantDataList());
2148 void wxVariant::Append(const wxVariant
& value
)
2150 wxVariantList
& list
= GetList();
2152 list
.Append(new wxVariant(value
));
2155 // Insert at front of list
2156 void wxVariant::Insert(const wxVariant
& value
)
2158 wxVariantList
& list
= GetList();
2160 list
.Insert(new wxVariant(value
));
2163 // Returns true if the variant is a member of the list
2164 bool wxVariant::Member(const wxVariant
& value
) const
2166 wxVariantList
& list
= GetList();
2168 wxVariantList::compatibility_iterator node
= list
.GetFirst();
2171 wxVariant
* other
= node
->GetData();
2172 if (value
== *other
)
2174 node
= node
->GetNext();
2179 // Deletes the nth element of the list
2180 bool wxVariant::Delete(size_t item
)
2182 wxVariantList
& list
= GetList();
2184 wxASSERT_MSG( (item
< list
.GetCount()), wxT("Invalid index to Delete") );
2185 wxVariantList::compatibility_iterator node
= list
.Item(item
);
2186 wxVariant
* variant
= node
->GetData();
2193 void wxVariant::ClearList()
2195 if (!IsNull() && (GetType() == wxT("list")))
2197 ((wxVariantDataList
*) m_refData
)->Clear();
2201 if (!GetType().IsSameAs(wxT("list")))
2204 m_refData
= new wxVariantDataList
;
2208 // Treat a list variant as an array
2209 wxVariant
wxVariant::operator[] (size_t idx
) const
2211 wxASSERT_MSG( GetType() == wxT("list"), wxT("Invalid type for array operator") );
2213 if (GetType() == wxT("list"))
2215 wxVariantDataList
* data
= (wxVariantDataList
*) m_refData
;
2216 wxASSERT_MSG( (idx
< data
->GetValue().GetCount()), wxT("Invalid index for array") );
2217 return *(data
->GetValue().Item(idx
)->GetData());
2219 return wxNullVariant
;
2222 wxVariant
& wxVariant::operator[] (size_t idx
)
2224 // We can't return a reference to a variant for a string list, since the string
2225 // is actually stored as a char*, not a variant.
2227 wxASSERT_MSG( (GetType() == wxT("list")), wxT("Invalid type for array operator") );
2229 wxVariantDataList
* data
= (wxVariantDataList
*) m_refData
;
2230 wxASSERT_MSG( (idx
< data
->GetValue().GetCount()), wxT("Invalid index for array") );
2232 return * (data
->GetValue().Item(idx
)->GetData());
2235 // Return the number of elements in a list
2236 size_t wxVariant::GetCount() const
2238 wxASSERT_MSG( GetType() == wxT("list"), wxT("Invalid type for GetCount()") );
2240 if (GetType() == wxT("list"))
2242 wxVariantDataList
* data
= (wxVariantDataList
*) m_refData
;
2243 return data
->GetValue().GetCount();
2248 // ----------------------------------------------------------------------------
2250 // ----------------------------------------------------------------------------
2252 bool wxVariant::Convert(long* value
) const
2254 wxString
type(GetType());
2255 if (type
== wxS("double"))
2256 *value
= (long) (((wxVariantDoubleData
*)GetData())->GetValue());
2257 else if (type
== wxS("long"))
2258 *value
= ((wxVariantDataLong
*)GetData())->GetValue();
2259 else if (type
== wxS("bool"))
2260 *value
= (long) (((wxVariantDataBool
*)GetData())->GetValue());
2261 else if (type
== wxS("string"))
2262 *value
= wxAtol(((wxVariantDataString
*)GetData())->GetValue());
2264 else if (type
== wxS("longlong"))
2266 wxLongLong v
= ((wxVariantDataLongLong
*)GetData())->GetValue();
2267 // Don't convert if return value would be vague
2268 if ( v
< LONG_MIN
|| v
> LONG_MAX
)
2270 *value
= v
.ToLong();
2272 else if (type
== wxS("ulonglong"))
2274 wxULongLong v
= ((wxVariantDataULongLong
*)GetData())->GetValue();
2275 // Don't convert if return value would be vague
2278 *value
= (long) v
.ToULong();
2287 bool wxVariant::Convert(bool* value
) const
2289 wxString
type(GetType());
2290 if (type
== wxT("double"))
2291 *value
= ((int) (((wxVariantDoubleData
*)GetData())->GetValue()) != 0);
2292 else if (type
== wxT("long"))
2293 *value
= (((wxVariantDataLong
*)GetData())->GetValue() != 0);
2294 else if (type
== wxT("bool"))
2295 *value
= ((wxVariantDataBool
*)GetData())->GetValue();
2296 else if (type
== wxT("string"))
2298 wxString
val(((wxVariantDataString
*)GetData())->GetValue());
2300 if (val
== wxT("true") || val
== wxT("yes") || val
== wxT('1') )
2302 else if (val
== wxT("false") || val
== wxT("no") || val
== wxT('0') )
2313 bool wxVariant::Convert(double* value
) const
2315 wxString
type(GetType());
2316 if (type
== wxT("double"))
2317 *value
= ((wxVariantDoubleData
*)GetData())->GetValue();
2318 else if (type
== wxT("long"))
2319 *value
= (double) (((wxVariantDataLong
*)GetData())->GetValue());
2320 else if (type
== wxT("bool"))
2321 *value
= (double) (((wxVariantDataBool
*)GetData())->GetValue());
2322 else if (type
== wxT("string"))
2323 *value
= (double) wxAtof(((wxVariantDataString
*)GetData())->GetValue());
2325 else if (type
== wxS("longlong"))
2327 *value
= ((wxVariantDataLongLong
*)GetData())->GetValue().ToDouble();
2329 else if (type
== wxS("ulonglong"))
2331 *value
= ((wxVariantDataULongLong
*)GetData())->GetValue().ToDouble();
2340 bool wxVariant::Convert(wxUniChar
* value
) const
2342 wxString
type(GetType());
2343 if (type
== wxT("char"))
2344 *value
= ((wxVariantDataChar
*)GetData())->GetValue();
2345 else if (type
== wxT("long"))
2346 *value
= (char) (((wxVariantDataLong
*)GetData())->GetValue());
2347 else if (type
== wxT("bool"))
2348 *value
= (char) (((wxVariantDataBool
*)GetData())->GetValue());
2355 bool wxVariant::Convert(char* value
) const
2358 if ( !Convert(&ch
) )
2364 bool wxVariant::Convert(wchar_t* value
) const
2367 if ( !Convert(&ch
) )
2373 bool wxVariant::Convert(wxString
* value
) const
2375 *value
= MakeString();
2380 bool wxVariant::Convert(wxLongLong
* value
) const
2382 wxString
type(GetType());
2383 if (type
== wxS("longlong"))
2384 *value
= ((wxVariantDataLongLong
*)GetData())->GetValue();
2385 else if (type
== wxS("long"))
2386 *value
= ((wxVariantDataLong
*)GetData())->GetValue();
2387 else if (type
== wxS("string"))
2389 wxString s
= ((wxVariantDataString
*)GetData())->GetValue();
2391 wxLongLong_t value_t
;
2392 if ( !s
.ToLongLong(&value_t
) )
2397 if ( !s
.ToLong(&l_value
) )
2402 else if (type
== wxS("bool"))
2403 *value
= (long) (((wxVariantDataBool
*)GetData())->GetValue());
2404 else if (type
== wxS("double"))
2406 value
->Assign(((wxVariantDoubleData
*)GetData())->GetValue());
2408 else if (type
== wxS("ulonglong"))
2409 *value
= ((wxVariantDataULongLong
*)GetData())->GetValue();
2416 bool wxVariant::Convert(wxULongLong
* value
) const
2418 wxString
type(GetType());
2419 if (type
== wxS("ulonglong"))
2420 *value
= ((wxVariantDataULongLong
*)GetData())->GetValue();
2421 else if (type
== wxS("long"))
2422 *value
= ((wxVariantDataLong
*)GetData())->GetValue();
2423 else if (type
== wxS("string"))
2425 wxString s
= ((wxVariantDataString
*)GetData())->GetValue();
2427 wxULongLong_t value_t
;
2428 if ( !s
.ToULongLong(&value_t
) )
2432 unsigned long l_value
;
2433 if ( !s
.ToULong(&l_value
) )
2438 else if (type
== wxS("bool"))
2439 *value
= (long) (((wxVariantDataBool
*)GetData())->GetValue());
2440 else if (type
== wxS("double"))
2442 double value_d
= ((wxVariantDoubleData
*)GetData())->GetValue();
2444 if ( value_d
< 0.0 )
2448 *value
= (wxULongLong_t
) value_d
;
2451 temp
.Assign(value_d
);
2455 else if (type
== wxS("longlong"))
2456 *value
= ((wxVariantDataLongLong
*)GetData())->GetValue();
2462 #endif // wxUSE_LONGLONG
2465 bool wxVariant::Convert(wxDateTime
* value
) const
2467 wxString
type(GetType());
2468 if (type
== wxT("datetime"))
2470 *value
= ((wxVariantDataDateTime
*)GetData())->GetValue();
2474 // Fallback to string conversion
2476 if ( !Convert(&val
) )
2479 // Try to parse this as either date and time, only date or only time
2480 // checking that the entire string was parsed
2481 wxString::const_iterator end
;
2482 if ( value
->ParseDateTime(val
, &end
) && end
== val
.end() )
2485 if ( value
->ParseDate(val
, &end
) && end
== val
.end() )
2488 if ( value
->ParseTime(val
, &end
) && end
== val
.end() )
2493 #endif // wxUSE_DATETIME
2495 #endif // wxUSE_VARIANT