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 wxVariant::wxVariant(const wxAny
& any
)
213 if ( !any
.GetAs(&variant
) )
215 wxFAIL_MSG("wxAny of this type cannot be converted to wxVariant");
222 wxAny
wxVariant::GetAny() const
227 wxVariantData
* data
= GetData();
230 if ( data
->GetAsAny(&any
) )
233 // If everything else fails, wrap the whole wxVariantData
239 // -----------------------------------------------------------------
241 // -----------------------------------------------------------------
243 class WXDLLIMPEXP_BASE wxVariantDataLong
: public wxVariantData
246 wxVariantDataLong() { m_value
= 0; }
247 wxVariantDataLong(long value
) { m_value
= value
; }
249 inline long GetValue() const { return m_value
; }
250 inline void SetValue(long value
) { m_value
= value
; }
252 virtual bool Eq(wxVariantData
& data
) const;
254 virtual bool Read(wxString
& str
);
255 virtual bool Write(wxString
& str
) const;
256 #if wxUSE_STD_IOSTREAM
257 virtual bool Read(wxSTD istream
& str
);
258 virtual bool Write(wxSTD ostream
& str
) const;
261 virtual bool Read(wxInputStream
& str
);
262 virtual bool Write(wxOutputStream
&str
) const;
263 #endif // wxUSE_STREAMS
265 wxVariantData
* Clone() const { return new wxVariantDataLong(m_value
); }
267 virtual wxString
GetType() const { return wxT("long"); }
269 // Since wxAny does not have separate type for integers shorter than
270 // longlong, we do not usually implement wxVariant->wxAny conversion
271 // here (but in wxVariantDataLongLong instead).
273 DECLARE_WXANY_CONVERSION()
275 bool GetAsAny(wxAny
* any
) const
287 IMPLEMENT_TRIVIAL_WXANY_CONVERSION(long, wxVariantDataLong
)
290 bool wxVariantDataLong::Eq(wxVariantData
& data
) const
292 wxASSERT_MSG( (data
.GetType() == wxT("long")), wxT("wxVariantDataLong::Eq: argument mismatch") );
294 wxVariantDataLong
& otherData
= (wxVariantDataLong
&) data
;
296 return (otherData
.m_value
== m_value
);
299 #if wxUSE_STD_IOSTREAM
300 bool wxVariantDataLong::Write(wxSTD ostream
& str
) const
304 str
<< (const char*) s
.mb_str();
309 bool wxVariantDataLong::Write(wxString
& str
) const
311 str
.Printf(wxT("%ld"), m_value
);
315 #if wxUSE_STD_IOSTREAM
316 bool wxVariantDataLong::Read(wxSTD istream
& str
)
324 bool wxVariantDataLong::Write(wxOutputStream
& str
) const
326 wxTextOutputStream
s(str
);
328 s
.Write32((size_t)m_value
);
332 bool wxVariantDataLong::Read(wxInputStream
& str
)
334 wxTextInputStream
s(str
);
335 m_value
= s
.Read32();
338 #endif // wxUSE_STREAMS
340 bool wxVariantDataLong::Read(wxString
& str
)
342 m_value
= wxAtol(str
);
348 wxVariant::wxVariant(long val
, const wxString
& name
)
350 m_refData
= new wxVariantDataLong(val
);
354 wxVariant::wxVariant(int val
, const wxString
& name
)
356 m_refData
= new wxVariantDataLong((long)val
);
360 wxVariant::wxVariant(short val
, const wxString
& name
)
362 m_refData
= new wxVariantDataLong((long)val
);
366 bool wxVariant::operator== (long value
) const
369 if (!Convert(&thisValue
))
372 return (value
== thisValue
);
375 bool wxVariant::operator!= (long value
) const
377 return (!((*this) == value
));
380 void wxVariant::operator= (long value
)
382 if (GetType() == wxT("long") &&
383 m_refData
->GetRefCount() == 1)
385 ((wxVariantDataLong
*)GetData())->SetValue(value
);
390 m_refData
= new wxVariantDataLong(value
);
394 long wxVariant::GetLong() const
397 if (Convert(& value
))
401 wxFAIL_MSG(wxT("Could not convert to a long"));
406 // -----------------------------------------------------------------
407 // wxVariantDoubleData
408 // -----------------------------------------------------------------
410 class WXDLLIMPEXP_BASE wxVariantDoubleData
: public wxVariantData
413 wxVariantDoubleData() { m_value
= 0.0; }
414 wxVariantDoubleData(double value
) { m_value
= value
; }
416 inline double GetValue() const { return m_value
; }
417 inline void SetValue(double value
) { m_value
= value
; }
419 virtual bool Eq(wxVariantData
& data
) const;
420 virtual bool Read(wxString
& str
);
421 #if wxUSE_STD_IOSTREAM
422 virtual bool Write(wxSTD ostream
& str
) const;
424 virtual bool Write(wxString
& str
) const;
425 #if wxUSE_STD_IOSTREAM
426 virtual bool Read(wxSTD istream
& str
);
429 virtual bool Read(wxInputStream
& str
);
430 virtual bool Write(wxOutputStream
&str
) const;
431 #endif // wxUSE_STREAMS
432 virtual wxString
GetType() const { return wxT("double"); }
434 wxVariantData
* Clone() const { return new wxVariantDoubleData(m_value
); }
436 DECLARE_WXANY_CONVERSION()
441 IMPLEMENT_TRIVIAL_WXANY_CONVERSION(double, wxVariantDoubleData
)
443 bool wxVariantDoubleData::Eq(wxVariantData
& data
) const
445 wxASSERT_MSG( (data
.GetType() == wxT("double")), wxT("wxVariantDoubleData::Eq: argument mismatch") );
447 wxVariantDoubleData
& otherData
= (wxVariantDoubleData
&) data
;
449 return wxIsSameDouble(otherData
.m_value
, m_value
);
452 #if wxUSE_STD_IOSTREAM
453 bool wxVariantDoubleData::Write(wxSTD ostream
& str
) const
457 str
<< (const char*) s
.mb_str();
462 bool wxVariantDoubleData::Write(wxString
& str
) const
464 str
.Printf(wxT("%.14g"), m_value
);
468 #if wxUSE_STD_IOSTREAM
469 bool wxVariantDoubleData::Read(wxSTD istream
& str
)
477 bool wxVariantDoubleData::Write(wxOutputStream
& str
) const
479 wxTextOutputStream
s(str
);
480 s
.WriteDouble((double)m_value
);
484 bool wxVariantDoubleData::Read(wxInputStream
& str
)
486 wxTextInputStream
s(str
);
487 m_value
= (float)s
.ReadDouble();
490 #endif // wxUSE_STREAMS
492 bool wxVariantDoubleData::Read(wxString
& str
)
494 m_value
= wxAtof(str
);
498 // wxVariant double code
500 wxVariant::wxVariant(double val
, const wxString
& name
)
502 m_refData
= new wxVariantDoubleData(val
);
506 bool wxVariant::operator== (double value
) const
509 if (!Convert(&thisValue
))
512 return wxIsSameDouble(value
, thisValue
);
515 bool wxVariant::operator!= (double value
) const
517 return (!((*this) == value
));
520 void wxVariant::operator= (double value
)
522 if (GetType() == wxT("double") &&
523 m_refData
->GetRefCount() == 1)
525 ((wxVariantDoubleData
*)GetData())->SetValue(value
);
530 m_refData
= new wxVariantDoubleData(value
);
534 double wxVariant::GetDouble() const
537 if (Convert(& value
))
541 wxFAIL_MSG(wxT("Could not convert to a double number"));
546 // -----------------------------------------------------------------
548 // -----------------------------------------------------------------
550 class WXDLLIMPEXP_BASE wxVariantDataBool
: public wxVariantData
553 wxVariantDataBool() { m_value
= 0; }
554 wxVariantDataBool(bool value
) { m_value
= value
; }
556 inline bool GetValue() const { return m_value
; }
557 inline void SetValue(bool value
) { m_value
= value
; }
559 virtual bool Eq(wxVariantData
& data
) const;
560 #if wxUSE_STD_IOSTREAM
561 virtual bool Write(wxSTD ostream
& str
) const;
563 virtual bool Write(wxString
& str
) const;
564 virtual bool Read(wxString
& str
);
565 #if wxUSE_STD_IOSTREAM
566 virtual bool Read(wxSTD istream
& str
);
569 virtual bool Read(wxInputStream
& str
);
570 virtual bool Write(wxOutputStream
& str
) const;
571 #endif // wxUSE_STREAMS
572 virtual wxString
GetType() const { return wxT("bool"); }
574 wxVariantData
* Clone() const { return new wxVariantDataBool(m_value
); }
576 DECLARE_WXANY_CONVERSION()
581 IMPLEMENT_TRIVIAL_WXANY_CONVERSION(bool, wxVariantDataBool
)
583 bool wxVariantDataBool::Eq(wxVariantData
& data
) const
585 wxASSERT_MSG( (data
.GetType() == wxT("bool")), wxT("wxVariantDataBool::Eq: argument mismatch") );
587 wxVariantDataBool
& otherData
= (wxVariantDataBool
&) data
;
589 return (otherData
.m_value
== m_value
);
592 #if wxUSE_STD_IOSTREAM
593 bool wxVariantDataBool::Write(wxSTD ostream
& str
) const
597 str
<< (const char*) s
.mb_str();
602 bool wxVariantDataBool::Write(wxString
& str
) const
604 str
.Printf(wxT("%d"), (int) m_value
);
608 #if wxUSE_STD_IOSTREAM
609 bool wxVariantDataBool::Read(wxSTD istream
& WXUNUSED(str
))
611 wxFAIL_MSG(wxT("Unimplemented"));
612 // str >> (long) m_value;
618 bool wxVariantDataBool::Write(wxOutputStream
& str
) const
620 wxTextOutputStream
s(str
);
626 bool wxVariantDataBool::Read(wxInputStream
& str
)
628 wxTextInputStream
s(str
);
630 m_value
= s
.Read8() != 0;
633 #endif // wxUSE_STREAMS
635 bool wxVariantDataBool::Read(wxString
& str
)
637 m_value
= (wxAtol(str
) != 0);
643 wxVariant::wxVariant(bool val
, const wxString
& name
)
645 m_refData
= new wxVariantDataBool(val
);
649 bool wxVariant::operator== (bool value
) const
652 if (!Convert(&thisValue
))
655 return (value
== thisValue
);
658 bool wxVariant::operator!= (bool value
) const
660 return (!((*this) == value
));
663 void wxVariant::operator= (bool value
)
665 if (GetType() == wxT("bool") &&
666 m_refData
->GetRefCount() == 1)
668 ((wxVariantDataBool
*)GetData())->SetValue(value
);
673 m_refData
= new wxVariantDataBool(value
);
677 bool wxVariant::GetBool() const
680 if (Convert(& value
))
684 wxFAIL_MSG(wxT("Could not convert to a bool"));
689 // -----------------------------------------------------------------
691 // -----------------------------------------------------------------
693 class WXDLLIMPEXP_BASE wxVariantDataChar
: public wxVariantData
696 wxVariantDataChar() { m_value
= 0; }
697 wxVariantDataChar(const wxUniChar
& value
) { m_value
= value
; }
699 inline wxUniChar
GetValue() const { return m_value
; }
700 inline void SetValue(const wxUniChar
& value
) { m_value
= value
; }
702 virtual bool Eq(wxVariantData
& data
) const;
703 #if wxUSE_STD_IOSTREAM
704 virtual bool Read(wxSTD istream
& str
);
705 virtual bool Write(wxSTD ostream
& str
) const;
707 virtual bool Read(wxString
& str
);
708 virtual bool Write(wxString
& str
) const;
710 virtual bool Read(wxInputStream
& str
);
711 virtual bool Write(wxOutputStream
& str
) const;
712 #endif // wxUSE_STREAMS
713 virtual wxString
GetType() const { return wxT("char"); }
714 wxVariantData
* Clone() const { return new wxVariantDataChar(m_value
); }
716 DECLARE_WXANY_CONVERSION()
721 IMPLEMENT_TRIVIAL_WXANY_CONVERSION(wxUniChar
, wxVariantDataChar
)
723 bool wxVariantDataChar::Eq(wxVariantData
& data
) const
725 wxASSERT_MSG( (data
.GetType() == wxT("char")), wxT("wxVariantDataChar::Eq: argument mismatch") );
727 wxVariantDataChar
& otherData
= (wxVariantDataChar
&) data
;
729 return (otherData
.m_value
== m_value
);
732 #if wxUSE_STD_IOSTREAM
733 bool wxVariantDataChar::Write(wxSTD ostream
& str
) const
735 str
<< wxString(m_value
);
740 bool wxVariantDataChar::Write(wxString
& str
) const
746 #if wxUSE_STD_IOSTREAM
747 bool wxVariantDataChar::Read(wxSTD istream
& WXUNUSED(str
))
749 wxFAIL_MSG(wxT("Unimplemented"));
756 bool wxVariantDataChar::Write(wxOutputStream
& str
) const
758 wxTextOutputStream
s(str
);
760 // FIXME-UTF8: this should be just "s << m_value;" after removal of
761 // ANSI build and addition of wxUniChar to wxTextOutputStream:
762 s
<< (wxChar
)m_value
;
767 bool wxVariantDataChar::Read(wxInputStream
& str
)
769 wxTextInputStream
s(str
);
771 // FIXME-UTF8: this should be just "s >> m_value;" after removal of
772 // ANSI build and addition of wxUniChar to wxTextInputStream:
779 #endif // wxUSE_STREAMS
781 bool wxVariantDataChar::Read(wxString
& str
)
787 wxVariant::wxVariant(const wxUniChar
& val
, const wxString
& name
)
789 m_refData
= new wxVariantDataChar(val
);
793 wxVariant::wxVariant(char val
, const wxString
& name
)
795 m_refData
= new wxVariantDataChar(val
);
799 wxVariant::wxVariant(wchar_t val
, const wxString
& name
)
801 m_refData
= new wxVariantDataChar(val
);
805 bool wxVariant::operator==(const wxUniChar
& value
) const
808 if (!Convert(&thisValue
))
811 return (value
== thisValue
);
814 wxVariant
& wxVariant::operator=(const wxUniChar
& value
)
816 if (GetType() == wxT("char") &&
817 m_refData
->GetRefCount() == 1)
819 ((wxVariantDataChar
*)GetData())->SetValue(value
);
824 m_refData
= new wxVariantDataChar(value
);
830 wxUniChar
wxVariant::GetChar() const
833 if (Convert(& value
))
837 wxFAIL_MSG(wxT("Could not convert to a char"));
842 // ----------------------------------------------------------------------------
843 // wxVariantDataString
844 // ----------------------------------------------------------------------------
846 class WXDLLIMPEXP_BASE wxVariantDataString
: public wxVariantData
849 wxVariantDataString() { }
850 wxVariantDataString(const wxString
& value
) { m_value
= value
; }
852 inline wxString
GetValue() const { return m_value
; }
853 inline void SetValue(const wxString
& value
) { m_value
= value
; }
855 virtual bool Eq(wxVariantData
& data
) const;
856 #if wxUSE_STD_IOSTREAM
857 virtual bool Write(wxSTD ostream
& str
) const;
859 virtual bool Read(wxString
& str
);
860 virtual bool Write(wxString
& str
) const;
861 #if wxUSE_STD_IOSTREAM
862 virtual bool Read(wxSTD istream
& WXUNUSED(str
)) { return false; }
865 virtual bool Read(wxInputStream
& str
);
866 virtual bool Write(wxOutputStream
& str
) const;
867 #endif // wxUSE_STREAMS
868 virtual wxString
GetType() const { return wxT("string"); }
869 wxVariantData
* Clone() const { return new wxVariantDataString(m_value
); }
871 DECLARE_WXANY_CONVERSION()
876 IMPLEMENT_TRIVIAL_WXANY_CONVERSION(wxString
, wxVariantDataString
)
878 bool wxVariantDataString::Eq(wxVariantData
& data
) const
880 wxASSERT_MSG( (data
.GetType() == wxT("string")), wxT("wxVariantDataString::Eq: argument mismatch") );
882 wxVariantDataString
& otherData
= (wxVariantDataString
&) data
;
884 return (otherData
.m_value
== m_value
);
887 #if wxUSE_STD_IOSTREAM
888 bool wxVariantDataString::Write(wxSTD ostream
& str
) const
890 str
<< (const char*) m_value
.mb_str();
895 bool wxVariantDataString::Write(wxString
& str
) const
902 bool wxVariantDataString::Write(wxOutputStream
& str
) const
904 // why doesn't wxOutputStream::operator<< take "const wxString&"
905 wxTextOutputStream
s(str
);
906 s
.WriteString(m_value
);
910 bool wxVariantDataString::Read(wxInputStream
& str
)
912 wxTextInputStream
s(str
);
914 m_value
= s
.ReadLine();
917 #endif // wxUSE_STREAMS
919 bool wxVariantDataString::Read(wxString
& str
)
927 wxVariant::wxVariant(const wxString
& val
, const wxString
& name
)
929 m_refData
= new wxVariantDataString(val
);
933 wxVariant::wxVariant(const char* val
, const wxString
& name
)
935 m_refData
= new wxVariantDataString(wxString(val
));
939 wxVariant::wxVariant(const wchar_t* val
, const wxString
& name
)
941 m_refData
= new wxVariantDataString(wxString(val
));
945 wxVariant::wxVariant(const wxCStrData
& val
, const wxString
& name
)
947 m_refData
= new wxVariantDataString(val
.AsString());
951 wxVariant::wxVariant(const wxScopedCharBuffer
& val
, const wxString
& name
)
953 m_refData
= new wxVariantDataString(wxString(val
));
957 wxVariant::wxVariant(const wxScopedWCharBuffer
& val
, const wxString
& name
)
959 m_refData
= new wxVariantDataString(wxString(val
));
963 bool wxVariant::operator== (const wxString
& value
) const
966 if (!Convert(&thisValue
))
969 return value
== thisValue
;
972 bool wxVariant::operator!= (const wxString
& value
) const
974 return (!((*this) == value
));
977 wxVariant
& wxVariant::operator= (const wxString
& value
)
979 if (GetType() == wxT("string") &&
980 m_refData
->GetRefCount() == 1)
982 ((wxVariantDataString
*)GetData())->SetValue(value
);
987 m_refData
= new wxVariantDataString(value
);
992 wxString
wxVariant::GetString() const
995 if (!Convert(& value
))
997 wxFAIL_MSG(wxT("Could not convert to a string"));
1003 // ----------------------------------------------------------------------------
1004 // wxVariantDataWxObjectPtr
1005 // ----------------------------------------------------------------------------
1007 class wxVariantDataWxObjectPtr
: public wxVariantData
1010 wxVariantDataWxObjectPtr() { }
1011 wxVariantDataWxObjectPtr(wxObject
* value
) { m_value
= value
; }
1013 inline wxObject
* GetValue() const { return m_value
; }
1014 inline void SetValue(wxObject
* value
) { m_value
= value
; }
1016 virtual bool Eq(wxVariantData
& data
) const;
1017 #if wxUSE_STD_IOSTREAM
1018 virtual bool Write(wxSTD ostream
& str
) const;
1020 virtual bool Write(wxString
& str
) const;
1021 #if wxUSE_STD_IOSTREAM
1022 virtual bool Read(wxSTD istream
& str
);
1024 virtual bool Read(wxString
& str
);
1025 virtual wxString
GetType() const ;
1026 virtual wxVariantData
* Clone() const { return new wxVariantDataWxObjectPtr(m_value
); }
1028 virtual wxClassInfo
* GetValueClassInfo();
1030 DECLARE_WXANY_CONVERSION()
1035 IMPLEMENT_TRIVIAL_WXANY_CONVERSION(wxObject
*, wxVariantDataWxObjectPtr
)
1037 bool wxVariantDataWxObjectPtr::Eq(wxVariantData
& data
) const
1039 wxASSERT_MSG( data
.GetType() == GetType(), wxT("wxVariantDataWxObjectPtr::Eq: argument mismatch") );
1041 wxVariantDataWxObjectPtr
& otherData
= (wxVariantDataWxObjectPtr
&) data
;
1043 return (otherData
.m_value
== m_value
);
1046 wxString
wxVariantDataWxObjectPtr::GetType() const
1048 wxString
returnVal(wxT("wxObject*"));
1052 returnVal
= m_value
->GetClassInfo()->GetClassName();
1053 returnVal
+= wxT("*");
1059 wxClassInfo
* wxVariantDataWxObjectPtr::GetValueClassInfo()
1061 wxClassInfo
* returnVal
=NULL
;
1063 if (m_value
) returnVal
= m_value
->GetClassInfo();
1068 #if wxUSE_STD_IOSTREAM
1069 bool wxVariantDataWxObjectPtr::Write(wxSTD ostream
& str
) const
1073 str
<< (const char*) s
.mb_str();
1078 bool wxVariantDataWxObjectPtr::Write(wxString
& str
) const
1080 str
.Printf(wxT("%s(%p)"), GetType().c_str(), static_cast<void*>(m_value
));
1084 #if wxUSE_STD_IOSTREAM
1085 bool wxVariantDataWxObjectPtr::Read(wxSTD istream
& WXUNUSED(str
))
1092 bool wxVariantDataWxObjectPtr::Read(wxString
& WXUNUSED(str
))
1100 wxVariant::wxVariant( wxObject
* val
, const wxString
& name
)
1102 m_refData
= new wxVariantDataWxObjectPtr(val
);
1106 bool wxVariant::operator== (wxObject
* value
) const
1108 return (value
== ((wxVariantDataWxObjectPtr
*)GetData())->GetValue());
1111 bool wxVariant::operator!= (wxObject
* value
) const
1113 return (!((*this) == (wxObject
*) value
));
1116 void wxVariant::operator= (wxObject
* value
)
1119 m_refData
= new wxVariantDataWxObjectPtr(value
);
1122 wxObject
* wxVariant::GetWxObjectPtr() const
1124 return (wxObject
*) ((wxVariantDataWxObjectPtr
*) m_refData
)->GetValue();
1127 // ----------------------------------------------------------------------------
1128 // wxVariantDataVoidPtr
1129 // ----------------------------------------------------------------------------
1131 class wxVariantDataVoidPtr
: public wxVariantData
1134 wxVariantDataVoidPtr() { }
1135 wxVariantDataVoidPtr(void* value
) { m_value
= value
; }
1137 inline void* GetValue() const { return m_value
; }
1138 inline void SetValue(void* value
) { m_value
= value
; }
1140 virtual bool Eq(wxVariantData
& data
) const;
1141 #if wxUSE_STD_IOSTREAM
1142 virtual bool Write(wxSTD ostream
& str
) const;
1144 virtual bool Write(wxString
& str
) const;
1145 #if wxUSE_STD_IOSTREAM
1146 virtual bool Read(wxSTD istream
& str
);
1148 virtual bool Read(wxString
& str
);
1149 virtual wxString
GetType() const { return wxT("void*"); }
1150 virtual wxVariantData
* Clone() const { return new wxVariantDataVoidPtr(m_value
); }
1152 DECLARE_WXANY_CONVERSION()
1157 IMPLEMENT_TRIVIAL_WXANY_CONVERSION(void*, wxVariantDataVoidPtr
)
1159 bool wxVariantDataVoidPtr::Eq(wxVariantData
& data
) const
1161 wxASSERT_MSG( data
.GetType() == wxT("void*"), wxT("wxVariantDataVoidPtr::Eq: argument mismatch") );
1163 wxVariantDataVoidPtr
& otherData
= (wxVariantDataVoidPtr
&) data
;
1165 return (otherData
.m_value
== m_value
);
1168 #if wxUSE_STD_IOSTREAM
1169 bool wxVariantDataVoidPtr::Write(wxSTD ostream
& str
) const
1173 str
<< (const char*) s
.mb_str();
1178 bool wxVariantDataVoidPtr::Write(wxString
& str
) const
1180 str
.Printf(wxT("%p"), m_value
);
1184 #if wxUSE_STD_IOSTREAM
1185 bool wxVariantDataVoidPtr::Read(wxSTD istream
& WXUNUSED(str
))
1192 bool wxVariantDataVoidPtr::Read(wxString
& WXUNUSED(str
))
1200 wxVariant::wxVariant( void* val
, const wxString
& name
)
1202 m_refData
= new wxVariantDataVoidPtr(val
);
1206 bool wxVariant::operator== (void* value
) const
1208 return (value
== ((wxVariantDataVoidPtr
*)GetData())->GetValue());
1211 bool wxVariant::operator!= (void* value
) const
1213 return (!((*this) == (void*) value
));
1216 void wxVariant::operator= (void* value
)
1218 if (GetType() == wxT("void*") && (m_refData
->GetRefCount() == 1))
1220 ((wxVariantDataVoidPtr
*)GetData())->SetValue(value
);
1225 m_refData
= new wxVariantDataVoidPtr(value
);
1229 void* wxVariant::GetVoidPtr() const
1231 // handling this specially is convenient when working with COM, see #9873
1235 wxASSERT( GetType() == wxT("void*") );
1237 return (void*) ((wxVariantDataVoidPtr
*) m_refData
)->GetValue();
1240 // ----------------------------------------------------------------------------
1241 // wxVariantDataDateTime
1242 // ----------------------------------------------------------------------------
1246 class wxVariantDataDateTime
: public wxVariantData
1249 wxVariantDataDateTime() { }
1250 wxVariantDataDateTime(const wxDateTime
& value
) { m_value
= value
; }
1252 inline wxDateTime
GetValue() const { return m_value
; }
1253 inline void SetValue(const wxDateTime
& value
) { m_value
= value
; }
1255 virtual bool Eq(wxVariantData
& data
) const;
1256 #if wxUSE_STD_IOSTREAM
1257 virtual bool Write(wxSTD ostream
& str
) const;
1259 virtual bool Write(wxString
& str
) const;
1260 #if wxUSE_STD_IOSTREAM
1261 virtual bool Read(wxSTD istream
& str
);
1263 virtual bool Read(wxString
& str
);
1264 virtual wxString
GetType() const { return wxT("datetime"); }
1265 virtual wxVariantData
* Clone() const { return new wxVariantDataDateTime(m_value
); }
1267 DECLARE_WXANY_CONVERSION()
1272 IMPLEMENT_TRIVIAL_WXANY_CONVERSION(wxDateTime
, wxVariantDataDateTime
)
1274 bool wxVariantDataDateTime::Eq(wxVariantData
& data
) const
1276 wxASSERT_MSG( (data
.GetType() == wxT("datetime")), wxT("wxVariantDataDateTime::Eq: argument mismatch") );
1278 wxVariantDataDateTime
& otherData
= (wxVariantDataDateTime
&) data
;
1280 return (otherData
.m_value
== m_value
);
1284 #if wxUSE_STD_IOSTREAM
1285 bool wxVariantDataDateTime::Write(wxSTD ostream
& str
) const
1289 str
<< value
.c_str();
1295 bool wxVariantDataDateTime::Write(wxString
& str
) const
1297 if ( m_value
.IsValid() )
1298 str
= m_value
.Format();
1300 str
= wxS("Invalid");
1305 #if wxUSE_STD_IOSTREAM
1306 bool wxVariantDataDateTime::Read(wxSTD istream
& WXUNUSED(str
))
1314 bool wxVariantDataDateTime::Read(wxString
& str
)
1316 if ( str
== wxS("Invalid") )
1318 m_value
= wxInvalidDateTime
;
1322 wxString::const_iterator end
;
1323 return m_value
.ParseDateTime(str
, &end
) && end
== str
.end();
1328 wxVariant::wxVariant(const wxDateTime
& val
, const wxString
& name
) // Date
1330 m_refData
= new wxVariantDataDateTime(val
);
1334 bool wxVariant::operator== (const wxDateTime
& value
) const
1336 wxDateTime thisValue
;
1337 if (!Convert(&thisValue
))
1340 return value
.IsEqualTo(thisValue
);
1343 bool wxVariant::operator!= (const wxDateTime
& value
) const
1345 return (!((*this) == value
));
1348 void wxVariant::operator= (const wxDateTime
& value
)
1350 if (GetType() == wxT("datetime") &&
1351 m_refData
->GetRefCount() == 1)
1353 ((wxVariantDataDateTime
*)GetData())->SetValue(value
);
1358 m_refData
= new wxVariantDataDateTime(value
);
1362 wxDateTime
wxVariant::GetDateTime() const
1365 if (!Convert(& value
))
1367 wxFAIL_MSG(wxT("Could not convert to a datetime"));
1373 #endif // wxUSE_DATETIME
1375 // ----------------------------------------------------------------------------
1376 // wxVariantDataArrayString
1377 // ----------------------------------------------------------------------------
1379 class wxVariantDataArrayString
: public wxVariantData
1382 wxVariantDataArrayString() { }
1383 wxVariantDataArrayString(const wxArrayString
& value
) { m_value
= value
; }
1385 wxArrayString
GetValue() const { return m_value
; }
1386 void SetValue(const wxArrayString
& value
) { m_value
= value
; }
1388 virtual bool Eq(wxVariantData
& data
) const;
1389 #if wxUSE_STD_IOSTREAM
1390 virtual bool Write(wxSTD ostream
& str
) const;
1392 virtual bool Write(wxString
& str
) const;
1393 #if wxUSE_STD_IOSTREAM
1394 virtual bool Read(wxSTD istream
& str
);
1396 virtual bool Read(wxString
& str
);
1397 virtual wxString
GetType() const { return wxT("arrstring"); }
1398 virtual wxVariantData
* Clone() const { return new wxVariantDataArrayString(m_value
); }
1400 DECLARE_WXANY_CONVERSION()
1402 wxArrayString m_value
;
1405 IMPLEMENT_TRIVIAL_WXANY_CONVERSION(wxArrayString
, wxVariantDataArrayString
)
1407 bool wxVariantDataArrayString::Eq(wxVariantData
& data
) const
1409 wxASSERT_MSG( data
.GetType() == GetType(), wxT("wxVariantDataArrayString::Eq: argument mismatch") );
1411 wxVariantDataArrayString
& otherData
= (wxVariantDataArrayString
&) data
;
1413 return otherData
.m_value
== m_value
;
1416 #if wxUSE_STD_IOSTREAM
1417 bool wxVariantDataArrayString::Write(wxSTD ostream
& WXUNUSED(str
)) const
1424 bool wxVariantDataArrayString::Write(wxString
& str
) const
1426 size_t count
= m_value
.GetCount();
1427 for ( size_t n
= 0; n
< count
; n
++ )
1439 #if wxUSE_STD_IOSTREAM
1440 bool wxVariantDataArrayString::Read(wxSTD istream
& WXUNUSED(str
))
1448 bool wxVariantDataArrayString::Read(wxString
& str
)
1450 wxStringTokenizer
tk(str
, wxT(";"));
1451 while ( tk
.HasMoreTokens() )
1453 m_value
.Add(tk
.GetNextToken());
1461 wxVariant::wxVariant(const wxArrayString
& val
, const wxString
& name
) // Strings
1463 m_refData
= new wxVariantDataArrayString(val
);
1467 bool wxVariant::operator==(const wxArrayString
& WXUNUSED(value
)) const
1469 wxFAIL_MSG( wxT("TODO") );
1474 bool wxVariant::operator!=(const wxArrayString
& value
) const
1476 return !(*this == value
);
1479 void wxVariant::operator=(const wxArrayString
& value
)
1481 if (GetType() == wxT("arrstring") &&
1482 m_refData
->GetRefCount() == 1)
1484 ((wxVariantDataArrayString
*)GetData())->SetValue(value
);
1489 m_refData
= new wxVariantDataArrayString(value
);
1493 wxArrayString
wxVariant::GetArrayString() const
1495 if ( GetType() == wxT("arrstring") )
1496 return ((wxVariantDataArrayString
*)GetData())->GetValue();
1498 return wxArrayString();
1501 // ----------------------------------------------------------------------------
1502 // wxVariantDataLongLong
1503 // ----------------------------------------------------------------------------
1507 class WXDLLIMPEXP_BASE wxVariantDataLongLong
: public wxVariantData
1510 wxVariantDataLongLong() { m_value
= 0; }
1511 wxVariantDataLongLong(wxLongLong value
) { m_value
= value
; }
1513 wxLongLong
GetValue() const { return m_value
; }
1514 void SetValue(wxLongLong value
) { m_value
= value
; }
1516 virtual bool Eq(wxVariantData
& data
) const;
1518 virtual bool Read(wxString
& str
);
1519 virtual bool Write(wxString
& str
) const;
1520 #if wxUSE_STD_IOSTREAM
1521 virtual bool Read(wxSTD istream
& str
);
1522 virtual bool Write(wxSTD ostream
& str
) const;
1525 virtual bool Read(wxInputStream
& str
);
1526 virtual bool Write(wxOutputStream
&str
) const;
1527 #endif // wxUSE_STREAMS
1529 wxVariantData
* Clone() const
1531 return new wxVariantDataLongLong(m_value
);
1534 virtual wxString
GetType() const { return wxS("longlong"); }
1536 DECLARE_WXANY_CONVERSION()
1542 // wxLongLong type requires customized wxAny conversion code
1547 bool wxVariantDataLongLong::GetAsAny(wxAny
* any
) const
1549 *any
= m_value
.GetValue();
1553 wxVariantData
* wxVariantDataLongLong::VariantDataFactory(const wxAny
& any
)
1555 return new wxVariantDataLongLong(wxANY_AS(any
, wxLongLong_t
));
1558 REGISTER_WXANY_CONVERSION(wxLongLong_t
, wxVariantDataLongLong
)
1560 #else // if !defined(wxLongLong_t)
1562 bool wxVariantDataLongLong::GetAsAny(wxAny
* any
) const
1568 wxVariantData
* wxVariantDataLongLong::VariantDataFactory(const wxAny
& any
)
1570 return new wxVariantDataLongLong(wxANY_AS(any
, wxLongLong
));
1573 REGISTER_WXANY_CONVERSION(wxLongLong
, wxVariantDataLongLong
)
1575 #endif // defined(wxLongLong_t)/!defined(wxLongLong_t)
1578 bool wxVariantDataLongLong::Eq(wxVariantData
& data
) const
1580 wxASSERT_MSG( (data
.GetType() == wxS("longlong")),
1581 "wxVariantDataLongLong::Eq: argument mismatch" );
1583 wxVariantDataLongLong
& otherData
= (wxVariantDataLongLong
&) data
;
1585 return (otherData
.m_value
== m_value
);
1588 #if wxUSE_STD_IOSTREAM
1589 bool wxVariantDataLongLong::Write(wxSTD ostream
& str
) const
1593 str
<< (const char*) s
.mb_str();
1598 bool wxVariantDataLongLong::Write(wxString
& str
) const
1601 str
.Printf(wxS("%lld"), m_value
.GetValue());
1608 #if wxUSE_STD_IOSTREAM
1609 bool wxVariantDataLongLong::Read(wxSTD istream
& WXUNUSED(str
))
1611 wxFAIL_MSG(wxS("Unimplemented"));
1617 bool wxVariantDataLongLong::Write(wxOutputStream
& str
) const
1619 wxTextOutputStream
s(str
);
1620 s
.Write32(m_value
.GetLo());
1621 s
.Write32(m_value
.GetHi());
1625 bool wxVariantDataLongLong::Read(wxInputStream
& str
)
1627 wxTextInputStream
s(str
);
1628 unsigned long lo
= s
.Read32();
1629 long hi
= s
.Read32();
1630 m_value
= wxLongLong(hi
, lo
);
1633 #endif // wxUSE_STREAMS
1635 bool wxVariantDataLongLong::Read(wxString
& str
)
1638 wxLongLong_t value_t
;
1639 if ( !str
.ToLongLong(&value_t
) )
1650 wxVariant::wxVariant(wxLongLong val
, const wxString
& name
)
1652 m_refData
= new wxVariantDataLongLong(val
);
1656 bool wxVariant::operator==(wxLongLong value
) const
1658 wxLongLong thisValue
;
1659 if ( !Convert(&thisValue
) )
1662 return (value
== thisValue
);
1665 bool wxVariant::operator!=(wxLongLong value
) const
1667 return (!((*this) == value
));
1670 void wxVariant::operator=(wxLongLong value
)
1672 if ( GetType() == wxS("longlong") &&
1673 m_refData
->GetRefCount() == 1 )
1675 ((wxVariantDataLongLong
*)GetData())->SetValue(value
);
1680 m_refData
= new wxVariantDataLongLong(value
);
1684 wxLongLong
wxVariant::GetLongLong() const
1687 if ( Convert(&value
) )
1693 wxFAIL_MSG(wxT("Could not convert to a long long"));
1698 #endif // wxUSE_LONGLONG
1700 // ----------------------------------------------------------------------------
1701 // wxVariantDataULongLong
1702 // ----------------------------------------------------------------------------
1706 class WXDLLIMPEXP_BASE wxVariantDataULongLong
: public wxVariantData
1709 wxVariantDataULongLong() { m_value
= 0; }
1710 wxVariantDataULongLong(wxULongLong value
) { m_value
= value
; }
1712 wxULongLong
GetValue() const { return m_value
; }
1713 void SetValue(wxULongLong value
) { m_value
= value
; }
1715 virtual bool Eq(wxVariantData
& data
) const;
1717 virtual bool Read(wxString
& str
);
1718 virtual bool Write(wxString
& str
) const;
1719 #if wxUSE_STD_IOSTREAM
1720 virtual bool Read(wxSTD istream
& str
);
1721 virtual bool Write(wxSTD ostream
& str
) const;
1724 virtual bool Read(wxInputStream
& str
);
1725 virtual bool Write(wxOutputStream
&str
) const;
1726 #endif // wxUSE_STREAMS
1728 wxVariantData
* Clone() const
1730 return new wxVariantDataULongLong(m_value
);
1733 virtual wxString
GetType() const { return wxS("ulonglong"); }
1735 DECLARE_WXANY_CONVERSION()
1737 wxULongLong m_value
;
1741 // wxULongLong type requires customized wxAny conversion code
1746 bool wxVariantDataULongLong::GetAsAny(wxAny
* any
) const
1748 *any
= m_value
.GetValue();
1752 wxVariantData
* wxVariantDataULongLong::VariantDataFactory(const wxAny
& any
)
1754 return new wxVariantDataULongLong(wxANY_AS(any
, wxULongLong_t
));
1757 REGISTER_WXANY_CONVERSION(wxULongLong_t
, wxVariantDataULongLong
)
1759 #else // if !defined(wxLongLong_t)
1761 bool wxVariantDataULongLong::GetAsAny(wxAny
* any
) const
1767 wxVariantData
* wxVariantDataULongLong::VariantDataFactory(const wxAny
& any
)
1769 return new wxVariantDataULongLong(wxANY_AS(any
, wxULongLong
));
1772 REGISTER_WXANY_CONVERSION(wxULongLong
, wxVariantDataULongLong
)
1774 #endif // defined(wxLongLong_t)/!defined(wxLongLong_t)
1778 bool wxVariantDataULongLong::Eq(wxVariantData
& data
) const
1780 wxASSERT_MSG( (data
.GetType() == wxS("ulonglong")),
1781 "wxVariantDataULongLong::Eq: argument mismatch" );
1783 wxVariantDataULongLong
& otherData
= (wxVariantDataULongLong
&) data
;
1785 return (otherData
.m_value
== m_value
);
1788 #if wxUSE_STD_IOSTREAM
1789 bool wxVariantDataULongLong::Write(wxSTD ostream
& str
) const
1793 str
<< (const char*) s
.mb_str();
1798 bool wxVariantDataULongLong::Write(wxString
& str
) const
1801 str
.Printf(wxS("%llu"), m_value
.GetValue());
1808 #if wxUSE_STD_IOSTREAM
1809 bool wxVariantDataULongLong::Read(wxSTD istream
& WXUNUSED(str
))
1811 wxFAIL_MSG(wxS("Unimplemented"));
1817 bool wxVariantDataULongLong::Write(wxOutputStream
& str
) const
1819 wxTextOutputStream
s(str
);
1820 s
.Write32(m_value
.GetLo());
1821 s
.Write32(m_value
.GetHi());
1825 bool wxVariantDataULongLong::Read(wxInputStream
& str
)
1827 wxTextInputStream
s(str
);
1828 unsigned long lo
= s
.Read32();
1829 long hi
= s
.Read32();
1830 m_value
= wxULongLong(hi
, lo
);
1833 #endif // wxUSE_STREAMS
1835 bool wxVariantDataULongLong::Read(wxString
& str
)
1838 wxULongLong_t value_t
;
1839 if ( !str
.ToULongLong(&value_t
) )
1850 wxVariant::wxVariant(wxULongLong val
, const wxString
& name
)
1852 m_refData
= new wxVariantDataULongLong(val
);
1856 bool wxVariant::operator==(wxULongLong value
) const
1858 wxULongLong thisValue
;
1859 if ( !Convert(&thisValue
) )
1862 return (value
== thisValue
);
1865 bool wxVariant::operator!=(wxULongLong value
) const
1867 return (!((*this) == value
));
1870 void wxVariant::operator=(wxULongLong value
)
1872 if ( GetType() == wxS("ulonglong") &&
1873 m_refData
->GetRefCount() == 1 )
1875 ((wxVariantDataULongLong
*)GetData())->SetValue(value
);
1880 m_refData
= new wxVariantDataULongLong(value
);
1884 wxULongLong
wxVariant::GetULongLong() const
1887 if ( Convert(&value
) )
1893 wxFAIL_MSG(wxT("Could not convert to a long long"));
1898 #endif // wxUSE_LONGLONG
1900 // ----------------------------------------------------------------------------
1901 // wxVariantDataList
1902 // ----------------------------------------------------------------------------
1904 class WXDLLIMPEXP_BASE wxVariantDataList
: public wxVariantData
1907 wxVariantDataList() {}
1908 wxVariantDataList(const wxVariantList
& list
);
1909 virtual ~wxVariantDataList();
1911 wxVariantList
& GetValue() { return m_value
; }
1912 void SetValue(const wxVariantList
& value
) ;
1914 virtual bool Eq(wxVariantData
& data
) const;
1915 #if wxUSE_STD_IOSTREAM
1916 virtual bool Write(wxSTD ostream
& str
) const;
1918 virtual bool Write(wxString
& str
) const;
1919 #if wxUSE_STD_IOSTREAM
1920 virtual bool Read(wxSTD istream
& str
);
1922 virtual bool Read(wxString
& str
);
1923 virtual wxString
GetType() const { return wxT("list"); }
1927 wxVariantData
* Clone() const { return new wxVariantDataList(m_value
); }
1929 DECLARE_WXANY_CONVERSION()
1931 wxVariantList m_value
;
1937 // Convert to/from list of wxAnys
1940 WX_DEFINE_LIST(wxAnyList
)
1942 bool wxVariantDataList::GetAsAny(wxAny
* any
) const
1945 wxVariantList::compatibility_iterator node
= m_value
.GetFirst();
1948 wxVariant
* pVar
= node
->GetData();
1949 dst
.push_back(new wxAny(*pVar
));
1950 node
= node
->GetNext();
1957 wxVariantData
* wxVariantDataList::VariantDataFactory(const wxAny
& any
)
1959 wxAnyList src
= wxANY_AS(any
, wxAnyList
);
1961 wxAnyList::compatibility_iterator node
= src
.GetFirst();
1964 wxAny
* pAny
= node
->GetData();
1965 dst
.push_back(new wxVariant(*pAny
));
1966 node
= node
->GetNext();
1969 return new wxVariantDataList(dst
);
1972 REGISTER_WXANY_CONVERSION(wxAnyList
, wxVariantDataList
)
1976 wxVariantDataList::wxVariantDataList(const wxVariantList
& list
)
1981 wxVariantDataList::~wxVariantDataList()
1986 void wxVariantDataList::SetValue(const wxVariantList
& value
)
1989 wxVariantList::compatibility_iterator node
= value
.GetFirst();
1992 wxVariant
* var
= node
->GetData();
1993 m_value
.Append(new wxVariant(*var
));
1994 node
= node
->GetNext();
1998 void wxVariantDataList::Clear()
2000 wxVariantList::compatibility_iterator node
= m_value
.GetFirst();
2003 wxVariant
* var
= node
->GetData();
2005 node
= node
->GetNext();
2010 bool wxVariantDataList::Eq(wxVariantData
& data
) const
2012 wxASSERT_MSG( (data
.GetType() == wxT("list")), wxT("wxVariantDataList::Eq: argument mismatch") );
2014 wxVariantDataList
& listData
= (wxVariantDataList
&) data
;
2015 wxVariantList::compatibility_iterator node1
= m_value
.GetFirst();
2016 wxVariantList::compatibility_iterator node2
= listData
.GetValue().GetFirst();
2017 while (node1
&& node2
)
2019 wxVariant
* var1
= node1
->GetData();
2020 wxVariant
* var2
= node2
->GetData();
2021 if ((*var1
) != (*var2
))
2023 node1
= node1
->GetNext();
2024 node2
= node2
->GetNext();
2026 if (node1
|| node2
) return false;
2030 #if wxUSE_STD_IOSTREAM
2031 bool wxVariantDataList::Write(wxSTD ostream
& str
) const
2035 str
<< (const char*) s
.mb_str();
2040 bool wxVariantDataList::Write(wxString
& str
) const
2042 str
= wxEmptyString
;
2043 wxVariantList::compatibility_iterator node
= m_value
.GetFirst();
2046 wxVariant
* var
= node
->GetData();
2047 if (node
!= m_value
.GetFirst())
2050 str
+= var
->MakeString();
2051 node
= node
->GetNext();
2057 #if wxUSE_STD_IOSTREAM
2058 bool wxVariantDataList::Read(wxSTD istream
& WXUNUSED(str
))
2060 wxFAIL_MSG(wxT("Unimplemented"));
2066 bool wxVariantDataList::Read(wxString
& WXUNUSED(str
))
2068 wxFAIL_MSG(wxT("Unimplemented"));
2075 wxVariant::wxVariant(const wxVariantList
& val
, const wxString
& name
) // List of variants
2077 m_refData
= new wxVariantDataList(val
);
2081 bool wxVariant::operator== (const wxVariantList
& value
) const
2083 wxASSERT_MSG( (GetType() == wxT("list")), wxT("Invalid type for == operator") );
2085 wxVariantDataList
other(value
);
2086 return (GetData()->Eq(other
));
2089 bool wxVariant::operator!= (const wxVariantList
& value
) const
2091 return (!((*this) == value
));
2094 void wxVariant::operator= (const wxVariantList
& value
)
2096 if (GetType() == wxT("list") &&
2097 m_refData
->GetRefCount() == 1)
2099 ((wxVariantDataList
*)GetData())->SetValue(value
);
2104 m_refData
= new wxVariantDataList(value
);
2108 wxVariantList
& wxVariant::GetList() const
2110 wxASSERT( (GetType() == wxT("list")) );
2112 return (wxVariantList
&) ((wxVariantDataList
*) m_refData
)->GetValue();
2116 void wxVariant::NullList()
2118 SetData(new wxVariantDataList());
2122 void wxVariant::Append(const wxVariant
& value
)
2124 wxVariantList
& list
= GetList();
2126 list
.Append(new wxVariant(value
));
2129 // Insert at front of list
2130 void wxVariant::Insert(const wxVariant
& value
)
2132 wxVariantList
& list
= GetList();
2134 list
.Insert(new wxVariant(value
));
2137 // Returns true if the variant is a member of the list
2138 bool wxVariant::Member(const wxVariant
& value
) const
2140 wxVariantList
& list
= GetList();
2142 wxVariantList::compatibility_iterator node
= list
.GetFirst();
2145 wxVariant
* other
= node
->GetData();
2146 if (value
== *other
)
2148 node
= node
->GetNext();
2153 // Deletes the nth element of the list
2154 bool wxVariant::Delete(size_t item
)
2156 wxVariantList
& list
= GetList();
2158 wxASSERT_MSG( (item
< list
.GetCount()), wxT("Invalid index to Delete") );
2159 wxVariantList::compatibility_iterator node
= list
.Item(item
);
2160 wxVariant
* variant
= node
->GetData();
2167 void wxVariant::ClearList()
2169 if (!IsNull() && (GetType() == wxT("list")))
2171 ((wxVariantDataList
*) m_refData
)->Clear();
2175 if (!GetType().IsSameAs(wxT("list")))
2178 m_refData
= new wxVariantDataList
;
2182 // Treat a list variant as an array
2183 wxVariant
wxVariant::operator[] (size_t idx
) const
2185 wxASSERT_MSG( GetType() == wxT("list"), wxT("Invalid type for array operator") );
2187 if (GetType() == wxT("list"))
2189 wxVariantDataList
* data
= (wxVariantDataList
*) m_refData
;
2190 wxASSERT_MSG( (idx
< data
->GetValue().GetCount()), wxT("Invalid index for array") );
2191 return *(data
->GetValue().Item(idx
)->GetData());
2193 return wxNullVariant
;
2196 wxVariant
& wxVariant::operator[] (size_t idx
)
2198 // We can't return a reference to a variant for a string list, since the string
2199 // is actually stored as a char*, not a variant.
2201 wxASSERT_MSG( (GetType() == wxT("list")), wxT("Invalid type for array operator") );
2203 wxVariantDataList
* data
= (wxVariantDataList
*) m_refData
;
2204 wxASSERT_MSG( (idx
< data
->GetValue().GetCount()), wxT("Invalid index for array") );
2206 return * (data
->GetValue().Item(idx
)->GetData());
2209 // Return the number of elements in a list
2210 size_t wxVariant::GetCount() const
2212 wxASSERT_MSG( GetType() == wxT("list"), wxT("Invalid type for GetCount()") );
2214 if (GetType() == wxT("list"))
2216 wxVariantDataList
* data
= (wxVariantDataList
*) m_refData
;
2217 return data
->GetValue().GetCount();
2222 // ----------------------------------------------------------------------------
2224 // ----------------------------------------------------------------------------
2226 bool wxVariant::Convert(long* value
) const
2228 wxString
type(GetType());
2229 if (type
== wxS("double"))
2230 *value
= (long) (((wxVariantDoubleData
*)GetData())->GetValue());
2231 else if (type
== wxS("long"))
2232 *value
= ((wxVariantDataLong
*)GetData())->GetValue();
2233 else if (type
== wxS("bool"))
2234 *value
= (long) (((wxVariantDataBool
*)GetData())->GetValue());
2235 else if (type
== wxS("string"))
2236 *value
= wxAtol(((wxVariantDataString
*)GetData())->GetValue());
2238 else if (type
== wxS("longlong"))
2240 wxLongLong v
= ((wxVariantDataLongLong
*)GetData())->GetValue();
2241 // Don't convert if return value would be vague
2242 if ( v
< LONG_MIN
|| v
> LONG_MAX
)
2244 *value
= v
.ToLong();
2246 else if (type
== wxS("ulonglong"))
2248 wxULongLong v
= ((wxVariantDataULongLong
*)GetData())->GetValue();
2249 // Don't convert if return value would be vague
2252 *value
= (long) v
.ToULong();
2261 bool wxVariant::Convert(bool* value
) const
2263 wxString
type(GetType());
2264 if (type
== wxT("double"))
2265 *value
= ((int) (((wxVariantDoubleData
*)GetData())->GetValue()) != 0);
2266 else if (type
== wxT("long"))
2267 *value
= (((wxVariantDataLong
*)GetData())->GetValue() != 0);
2268 else if (type
== wxT("bool"))
2269 *value
= ((wxVariantDataBool
*)GetData())->GetValue();
2270 else if (type
== wxT("string"))
2272 wxString
val(((wxVariantDataString
*)GetData())->GetValue());
2274 if (val
== wxT("true") || val
== wxT("yes") || val
== wxT('1') )
2276 else if (val
== wxT("false") || val
== wxT("no") || val
== wxT('0') )
2287 bool wxVariant::Convert(double* value
) const
2289 wxString
type(GetType());
2290 if (type
== wxT("double"))
2291 *value
= ((wxVariantDoubleData
*)GetData())->GetValue();
2292 else if (type
== wxT("long"))
2293 *value
= (double) (((wxVariantDataLong
*)GetData())->GetValue());
2294 else if (type
== wxT("bool"))
2295 *value
= (double) (((wxVariantDataBool
*)GetData())->GetValue());
2296 else if (type
== wxT("string"))
2297 *value
= (double) wxAtof(((wxVariantDataString
*)GetData())->GetValue());
2299 else if (type
== wxS("longlong"))
2301 *value
= ((wxVariantDataLongLong
*)GetData())->GetValue().ToDouble();
2303 else if (type
== wxS("ulonglong"))
2305 *value
= ((wxVariantDataULongLong
*)GetData())->GetValue().ToDouble();
2314 bool wxVariant::Convert(wxUniChar
* value
) const
2316 wxString
type(GetType());
2317 if (type
== wxT("char"))
2318 *value
= ((wxVariantDataChar
*)GetData())->GetValue();
2319 else if (type
== wxT("long"))
2320 *value
= (char) (((wxVariantDataLong
*)GetData())->GetValue());
2321 else if (type
== wxT("bool"))
2322 *value
= (char) (((wxVariantDataBool
*)GetData())->GetValue());
2329 bool wxVariant::Convert(char* value
) const
2332 if ( !Convert(&ch
) )
2338 bool wxVariant::Convert(wchar_t* value
) const
2341 if ( !Convert(&ch
) )
2347 bool wxVariant::Convert(wxString
* value
) const
2349 *value
= MakeString();
2354 bool wxVariant::Convert(wxLongLong
* value
) const
2356 wxString
type(GetType());
2357 if (type
== wxS("longlong"))
2358 *value
= ((wxVariantDataLongLong
*)GetData())->GetValue();
2359 else if (type
== wxS("long"))
2360 *value
= ((wxVariantDataLong
*)GetData())->GetValue();
2361 else if (type
== wxS("string"))
2363 wxString s
= ((wxVariantDataString
*)GetData())->GetValue();
2365 wxLongLong_t value_t
;
2366 if ( !s
.ToLongLong(&value_t
) )
2371 if ( !s
.ToLong(&l_value
) )
2376 else if (type
== wxS("bool"))
2377 *value
= (long) (((wxVariantDataBool
*)GetData())->GetValue());
2378 else if (type
== wxS("double"))
2380 value
->Assign(((wxVariantDoubleData
*)GetData())->GetValue());
2382 else if (type
== wxS("ulonglong"))
2383 *value
= ((wxVariantDataULongLong
*)GetData())->GetValue();
2390 bool wxVariant::Convert(wxULongLong
* value
) const
2392 wxString
type(GetType());
2393 if (type
== wxS("ulonglong"))
2394 *value
= ((wxVariantDataULongLong
*)GetData())->GetValue();
2395 else if (type
== wxS("long"))
2396 *value
= ((wxVariantDataLong
*)GetData())->GetValue();
2397 else if (type
== wxS("string"))
2399 wxString s
= ((wxVariantDataString
*)GetData())->GetValue();
2401 wxULongLong_t value_t
;
2402 if ( !s
.ToULongLong(&value_t
) )
2406 unsigned long l_value
;
2407 if ( !s
.ToULong(&l_value
) )
2412 else if (type
== wxS("bool"))
2413 *value
= (long) (((wxVariantDataBool
*)GetData())->GetValue());
2414 else if (type
== wxS("double"))
2416 double value_d
= ((wxVariantDoubleData
*)GetData())->GetValue();
2418 if ( value_d
< 0.0 )
2422 *value
= (wxULongLong_t
) value_d
;
2425 temp
.Assign(value_d
);
2429 else if (type
== wxS("longlong"))
2430 *value
= ((wxVariantDataLongLong
*)GetData())->GetValue();
2436 #endif // wxUSE_LONGLONG
2439 bool wxVariant::Convert(wxDateTime
* value
) const
2441 wxString
type(GetType());
2442 if (type
== wxT("datetime"))
2444 *value
= ((wxVariantDataDateTime
*)GetData())->GetValue();
2448 // Fallback to string conversion
2450 if ( !Convert(&val
) )
2453 // Try to parse this as either date and time, only date or only time
2454 // checking that the entire string was parsed
2455 wxString::const_iterator end
;
2456 if ( value
->ParseDateTime(val
, &end
) && end
== val
.end() )
2459 if ( value
->ParseDate(val
, &end
) && end
== val
.end() )
2462 if ( value
->ParseTime(val
, &end
) && end
== val
.end() )
2467 #endif // wxUSE_DATETIME
2469 #endif // wxUSE_VARIANT