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