1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: wxVariant class, container for any type
4 // Author: Julian Smart
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
12 #if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
13 #pragma implementation "variant.h"
16 // For compilers that support precompilation, includes "wx/wx.h".
17 #include "wx/wxprec.h"
23 #if wxUSE_STD_IOSTREAM
31 #if defined(__MWERKS__) && __MSL__ >= 0x6000
36 #include "wx/stream.h"
37 #include "wx/txtstrm.h"
40 #include "wx/string.h"
41 #include "wx/tokenzr.h"
43 #include "wx/variant.h"
45 IMPLEMENT_ABSTRACT_CLASS(wxVariantData, wxObject)
47 wxVariant WXDLLIMPEXP_BASE wxNullVariant;
53 class WXDLLIMPEXP_BASE wxVariantDataList: public wxVariantData
55 DECLARE_DYNAMIC_CLASS(wxVariantDataList)
57 wxVariantDataList() {}
58 wxVariantDataList(const wxList& list);
61 wxList& GetValue() const { return (wxList&) m_value; }
62 void SetValue(const wxList& value) ;
64 virtual void Copy(wxVariantData& data);
65 virtual bool Eq(wxVariantData& data) const;
66 #if wxUSE_STD_IOSTREAM
67 virtual bool Write(wxSTD ostream& str) const;
69 virtual bool Write(wxString& str) const;
70 #if wxUSE_STD_IOSTREAM
71 virtual bool Read(wxSTD istream& str);
73 virtual bool Read(wxString& str);
74 virtual wxString GetType() const { return wxT("list"); };
82 IMPLEMENT_DYNAMIC_CLASS(wxVariantDataList, wxVariantData)
84 wxVariantDataList::wxVariantDataList(const wxList& list)
89 wxVariantDataList::~wxVariantDataList()
94 void wxVariantDataList::SetValue(const wxList& value)
97 wxList::compatibility_iterator node = value.GetFirst();
100 wxVariant* var = (wxVariant*) node->GetData();
101 m_value.Append(new wxVariant(*var));
102 node = node->GetNext();
106 void wxVariantDataList::Clear()
108 wxList::compatibility_iterator node = m_value.GetFirst();
111 wxVariant* var = (wxVariant*) node->GetData();
113 node = node->GetNext();
118 void wxVariantDataList::Copy(wxVariantData& data)
120 wxASSERT_MSG( (data.GetType() == wxT("list")), wxT("wxVariantDataList::Copy: Can't copy to this type of data") );
122 wxVariantDataList& listData = (wxVariantDataList&) data;
125 wxList::compatibility_iterator node = m_value.GetFirst();
128 wxVariant* var = (wxVariant*) node->GetData();
129 listData.m_value.Append(new wxVariant(*var));
130 node = node->GetNext();
134 bool wxVariantDataList::Eq(wxVariantData& data) const
136 wxASSERT_MSG( (data.GetType() == wxT("list")), wxT("wxVariantDataList::Eq: argument mismatch") );
138 wxVariantDataList& listData = (wxVariantDataList&) data;
139 wxList::compatibility_iterator node1 = m_value.GetFirst();
140 wxList::compatibility_iterator node2 = listData.GetValue().GetFirst();
141 while (node1 && node2)
143 wxVariant* var1 = (wxVariant*) node1->GetData();
144 wxVariant* var2 = (wxVariant*) node2->GetData();
145 if ((*var1) != (*var2))
147 node1 = node1->GetNext();
148 node2 = node2->GetNext();
150 if (node1 || node2) return FALSE;
154 #if wxUSE_STD_IOSTREAM
155 bool wxVariantDataList::Write(wxSTD ostream& str) const
159 str << (const char*) s.mb_str();
164 bool wxVariantDataList::Write(wxString& str) const
167 wxList::compatibility_iterator node = m_value.GetFirst();
170 wxVariant* var = (wxVariant*) node->GetData();
171 if (node != m_value.GetFirst())
174 str += var->MakeString();
175 node = node->GetNext();
181 #if wxUSE_STD_IOSTREAM
182 bool wxVariantDataList::Read(wxSTD istream& WXUNUSED(str))
184 wxFAIL_MSG(wxT("Unimplemented"));
190 bool wxVariantDataList::Read(wxString& WXUNUSED(str))
192 wxFAIL_MSG(wxT("Unimplemented"));
198 * wxVariantDataStringList
201 class WXDLLIMPEXP_BASE wxVariantDataStringList: public wxVariantData
203 DECLARE_DYNAMIC_CLASS(wxVariantDataStringList)
205 wxVariantDataStringList() {}
206 wxVariantDataStringList(const wxStringList& list) { m_value = list; }
208 wxStringList& GetValue() const { return (wxStringList&) m_value; }
209 void SetValue(const wxStringList& value);
211 virtual void Copy(wxVariantData& data);
212 virtual bool Eq(wxVariantData& data) const;
213 #if wxUSE_STD_IOSTREAM
214 virtual bool Write(wxSTD ostream& str) const;
216 virtual bool Write(wxString& str) const;
217 #if wxUSE_STD_IOSTREAM
218 virtual bool Read(wxSTD istream& str);
220 virtual bool Read(wxString& str);
221 virtual wxString GetType() const { return wxT("stringlist"); };
224 wxStringList m_value;
227 IMPLEMENT_DYNAMIC_CLASS(wxVariantDataStringList, wxVariantData)
229 void wxVariantDataStringList::SetValue(const wxStringList& value)
234 void wxVariantDataStringList::Copy(wxVariantData& data)
236 wxASSERT_MSG( (data.GetType() == wxT("stringlist")), wxT("wxVariantDataStringList::Copy: Can't copy to this type of data") );
238 wxVariantDataStringList& listData = (wxVariantDataStringList&) data;
240 listData.m_value = m_value ;
243 bool wxVariantDataStringList::Eq(wxVariantData& data) const
245 wxASSERT_MSG( (data.GetType() == wxT("stringlist")), wxT("wxVariantDataStringList::Eq: argument mismatch") );
247 wxVariantDataStringList& listData = (wxVariantDataStringList&) data;
248 wxStringList::compatibility_iterator node1 = m_value.GetFirst();
249 wxStringList::compatibility_iterator node2 = listData.GetValue().GetFirst();
250 while (node1 && node2)
252 wxString str1 ( node1->GetData() );
253 wxString str2 ( node2->GetData() );
256 node1 = node1->GetNext();
257 node2 = node2->GetNext();
259 if (node1 || node2) return FALSE;
263 #if wxUSE_STD_IOSTREAM
264 bool wxVariantDataStringList::Write(wxSTD ostream& str) const
268 str << (const char*) s.mb_str();
273 bool wxVariantDataStringList::Write(wxString& str) const
276 wxStringList::compatibility_iterator node = m_value.GetFirst();
279 const wxChar* s = node->GetData();
280 if (node != m_value.GetFirst())
283 node = node->GetNext();
289 #if wxUSE_STD_IOSTREAM
290 bool wxVariantDataStringList::Read(wxSTD istream& WXUNUSED(str))
292 wxFAIL_MSG(wxT("Unimplemented"));
298 bool wxVariantDataStringList::Read(wxString& WXUNUSED(str))
300 wxFAIL_MSG(wxT("Unimplemented"));
309 class WXDLLIMPEXP_BASE wxVariantDataLong: public wxVariantData
311 DECLARE_DYNAMIC_CLASS(wxVariantDataLong)
313 wxVariantDataLong() { m_value = 0; }
314 wxVariantDataLong(long value) { m_value = value; }
316 inline long GetValue() const { return m_value; }
317 inline void SetValue(long value) { m_value = value; }
319 virtual void Copy(wxVariantData& data);
320 virtual bool Eq(wxVariantData& data) const;
322 virtual bool Read(wxString& str);
323 virtual bool Write(wxString& str) const;
324 #if wxUSE_STD_IOSTREAM
325 virtual bool Read(wxSTD istream& str);
326 virtual bool Write(wxSTD ostream& str) const;
329 virtual bool Read(wxInputStream& str);
330 virtual bool Write(wxOutputStream &str) const;
331 #endif // wxUSE_STREAMS
333 virtual wxString GetType() const { return wxT("long"); };
339 IMPLEMENT_DYNAMIC_CLASS(wxVariantDataLong, wxVariantData)
341 void wxVariantDataLong::Copy(wxVariantData& data)
343 wxASSERT_MSG( (data.GetType() == wxT("long")), wxT("wxVariantDataLong::Copy: Can't copy to this type of data") );
345 wxVariantDataLong& otherData = (wxVariantDataLong&) data;
347 otherData.m_value = m_value;
350 bool wxVariantDataLong::Eq(wxVariantData& data) const
352 wxASSERT_MSG( (data.GetType() == wxT("long")), wxT("wxVariantDataLong::Eq: argument mismatch") );
354 wxVariantDataLong& otherData = (wxVariantDataLong&) data;
356 return (otherData.m_value == m_value);
359 #if wxUSE_STD_IOSTREAM
360 bool wxVariantDataLong::Write(wxSTD ostream& str) const
364 str << (const char*) s.mb_str();
369 bool wxVariantDataLong::Write(wxString& str) const
371 str.Printf(wxT("%ld"), m_value);
375 #if wxUSE_STD_IOSTREAM
376 bool wxVariantDataLong::Read(wxSTD istream& str)
384 bool wxVariantDataLong::Write(wxOutputStream& str) const
386 wxTextOutputStream s(str);
388 s.Write32((size_t)m_value);
392 bool wxVariantDataLong::Read(wxInputStream& str)
394 wxTextInputStream s(str);
395 m_value = s.Read32();
398 #endif // wxUSE_STREAMS
400 bool wxVariantDataLong::Read(wxString& str)
402 m_value = wxAtol((const wxChar*) str);
410 class WXDLLIMPEXP_BASE wxVariantDataReal: public wxVariantData
412 DECLARE_DYNAMIC_CLASS(wxVariantDataReal)
414 wxVariantDataReal() { m_value = 0.0; }
415 wxVariantDataReal(double value) { m_value = value; }
417 inline double GetValue() const { return m_value; }
418 inline void SetValue(double value) { m_value = value; }
420 virtual void Copy(wxVariantData& data);
421 virtual bool Eq(wxVariantData& data) const;
422 virtual bool Read(wxString& str);
423 #if wxUSE_STD_IOSTREAM
424 virtual bool Write(wxSTD ostream& str) const;
426 virtual bool Write(wxString& str) const;
427 #if wxUSE_STD_IOSTREAM
428 virtual bool Read(wxSTD istream& str);
431 virtual bool Read(wxInputStream& str);
432 virtual bool Write(wxOutputStream &str) const;
433 #endif // wxUSE_STREAMS
434 virtual wxString GetType() const { return wxT("double"); };
440 IMPLEMENT_DYNAMIC_CLASS(wxVariantDataReal, wxVariantData)
442 void wxVariantDataReal::Copy(wxVariantData& data)
444 wxASSERT_MSG( (data.GetType() == wxT("double")), wxT("wxVariantDataReal::Copy: Can't copy to this type of data") );
446 wxVariantDataReal& otherData = (wxVariantDataReal&) data;
448 otherData.m_value = m_value;
451 bool wxVariantDataReal::Eq(wxVariantData& data) const
453 wxASSERT_MSG( (data.GetType() == wxT("double")), wxT("wxVariantDataReal::Eq: argument mismatch") );
455 wxVariantDataReal& otherData = (wxVariantDataReal&) data;
457 return (otherData.m_value == m_value);
460 #if wxUSE_STD_IOSTREAM
461 bool wxVariantDataReal::Write(wxSTD ostream& str) const
465 str << (const char*) s.mb_str();
470 bool wxVariantDataReal::Write(wxString& str) const
472 str.Printf(wxT("%.4f"), m_value);
476 #if wxUSE_STD_IOSTREAM
477 bool wxVariantDataReal::Read(wxSTD istream& str)
485 bool wxVariantDataReal::Write(wxOutputStream& str) const
487 wxTextOutputStream s(str);
488 s.WriteDouble((double)m_value);
492 bool wxVariantDataReal::Read(wxInputStream& str)
494 wxTextInputStream s(str);
495 m_value = (float)s.ReadDouble();
498 #endif // wxUSE_STREAMS
500 bool wxVariantDataReal::Read(wxString& str)
502 m_value = wxAtof((const wxChar*) str);
511 class WXDLLIMPEXP_BASE wxVariantDataBool: public wxVariantData
513 DECLARE_DYNAMIC_CLASS(wxVariantDataBool)
515 wxVariantDataBool() { m_value = 0; }
516 wxVariantDataBool(bool value) { m_value = value; }
518 inline bool GetValue() const { return m_value; }
519 inline void SetValue(bool value) { m_value = value; }
521 virtual void Copy(wxVariantData& data);
522 virtual bool Eq(wxVariantData& data) const;
523 #if wxUSE_STD_IOSTREAM
524 virtual bool Write(wxSTD ostream& str) const;
526 virtual bool Write(wxString& str) const;
527 virtual bool Read(wxString& str);
528 #if wxUSE_STD_IOSTREAM
529 virtual bool Read(wxSTD istream& str);
532 virtual bool Read(wxInputStream& str);
533 virtual bool Write(wxOutputStream& str) const;
534 #endif // wxUSE_STREAMS
535 virtual wxString GetType() const { return wxT("bool"); };
541 IMPLEMENT_DYNAMIC_CLASS(wxVariantDataBool, wxVariantData)
543 void wxVariantDataBool::Copy(wxVariantData& data)
545 wxASSERT_MSG( (data.GetType() == wxT("bool")), wxT("wxVariantDataBool::Copy: Can't copy to this type of data") );
547 wxVariantDataBool& otherData = (wxVariantDataBool&) data;
549 otherData.m_value = m_value;
552 bool wxVariantDataBool::Eq(wxVariantData& data) const
554 wxASSERT_MSG( (data.GetType() == wxT("bool")), wxT("wxVariantDataBool::Eq: argument mismatch") );
556 wxVariantDataBool& otherData = (wxVariantDataBool&) data;
558 return (otherData.m_value == m_value);
561 #if wxUSE_STD_IOSTREAM
562 bool wxVariantDataBool::Write(wxSTD ostream& str) const
566 str << (const char*) s.mb_str();
571 bool wxVariantDataBool::Write(wxString& str) const
573 str.Printf(wxT("%d"), (int) m_value);
577 #if wxUSE_STD_IOSTREAM
578 bool wxVariantDataBool::Read(wxSTD istream& WXUNUSED(str))
580 wxFAIL_MSG(wxT("Unimplemented"));
581 // str >> (long) m_value;
587 bool wxVariantDataBool::Write(wxOutputStream& str) const
589 wxTextOutputStream s(str);
595 bool wxVariantDataBool::Read(wxInputStream& str)
597 wxTextInputStream s(str);
599 m_value = s.Read8() != 0;
602 #endif // wxUSE_STREAMS
604 bool wxVariantDataBool::Read(wxString& str)
606 m_value = (wxAtol((const wxChar*) str) != 0);
615 class WXDLLIMPEXP_BASE wxVariantDataChar: public wxVariantData
617 DECLARE_DYNAMIC_CLASS(wxVariantDataChar)
619 wxVariantDataChar() { m_value = 0; }
620 wxVariantDataChar(char value) { m_value = value; }
622 inline char GetValue() const { return m_value; }
623 inline void SetValue(char value) { m_value = value; }
625 virtual void Copy(wxVariantData& data);
626 virtual bool Eq(wxVariantData& data) const;
627 #if wxUSE_STD_IOSTREAM
628 virtual bool Read(wxSTD istream& str);
629 virtual bool Write(wxSTD ostream& str) const;
631 virtual bool Read(wxString& str);
632 virtual bool Write(wxString& str) const;
634 virtual bool Read(wxInputStream& str);
635 virtual bool Write(wxOutputStream& str) const;
636 #endif // wxUSE_STREAMS
637 virtual wxString GetType() const { return wxT("char"); };
643 IMPLEMENT_DYNAMIC_CLASS(wxVariantDataChar, wxVariantData)
645 void wxVariantDataChar::Copy(wxVariantData& data)
647 wxASSERT_MSG( (data.GetType() == wxT("char")), wxT("wxVariantDataChar::Copy: Can't copy to this type of data") );
649 wxVariantDataChar& otherData = (wxVariantDataChar&) data;
651 otherData.m_value = m_value;
654 bool wxVariantDataChar::Eq(wxVariantData& data) const
656 wxASSERT_MSG( (data.GetType() == wxT("char")), wxT("wxVariantDataChar::Eq: argument mismatch") );
658 wxVariantDataChar& otherData = (wxVariantDataChar&) data;
660 return (otherData.m_value == m_value);
663 #if wxUSE_STD_IOSTREAM
664 bool wxVariantDataChar::Write(wxSTD ostream& str) const
668 str << (const char*) s.mb_str();
673 bool wxVariantDataChar::Write(wxString& str) const
675 str.Printf(wxT("%c"), m_value);
679 #if wxUSE_STD_IOSTREAM
680 bool wxVariantDataChar::Read(wxSTD istream& WXUNUSED(str))
682 wxFAIL_MSG(wxT("Unimplemented"));
689 bool wxVariantDataChar::Write(wxOutputStream& str) const
691 wxTextOutputStream s(str);
697 bool wxVariantDataChar::Read(wxInputStream& str)
699 wxTextInputStream s(str);
704 #endif // wxUSE_STREAMS
706 bool wxVariantDataChar::Read(wxString& str)
708 m_value = str[(size_t)0];
713 * wxVariantDataString
716 class WXDLLIMPEXP_BASE wxVariantDataString: public wxVariantData
718 DECLARE_DYNAMIC_CLASS(wxVariantDataString)
720 wxVariantDataString() { }
721 wxVariantDataString(const wxString& value) { m_value = value; }
723 inline wxString GetValue() const { return m_value; }
724 inline void SetValue(const wxString& value) { m_value = value; }
726 virtual void Copy(wxVariantData& data);
727 virtual bool Eq(wxVariantData& data) const;
728 #if wxUSE_STD_IOSTREAM
729 virtual bool Write(wxSTD ostream& str) const;
731 virtual bool Read(wxString& str);
732 virtual bool Write(wxString& str) const;
733 #if wxUSE_STD_IOSTREAM
734 virtual bool Read(wxSTD istream& str);
737 virtual bool Read(wxInputStream& str);
738 virtual bool Write(wxOutputStream& str) const;
739 #endif // wxUSE_STREAMS
740 virtual wxString GetType() const { return wxT("string"); };
746 void wxVariantDataString::Copy(wxVariantData& data)
748 wxASSERT_MSG( (data.GetType() == wxT("string")), wxT("wxVariantDataString::Copy: Can't copy to this type of data") );
750 wxVariantDataString& otherData = (wxVariantDataString&) data;
752 otherData.m_value = m_value;
755 bool wxVariantDataString::Eq(wxVariantData& data) const
757 wxASSERT_MSG( (data.GetType() == wxT("string")), wxT("wxVariantDataString::Eq: argument mismatch") );
759 wxVariantDataString& otherData = (wxVariantDataString&) data;
761 return (otherData.m_value == m_value);
764 #if wxUSE_STD_IOSTREAM
765 bool wxVariantDataString::Write(wxSTD ostream& str) const
767 str << (const char*) m_value.mb_str();
772 bool wxVariantDataString::Write(wxString& str) const
778 #if wxUSE_STD_IOSTREAM
779 bool wxVariantDataString::Read(wxSTD istream& str)
787 bool wxVariantDataString::Write(wxOutputStream& str) const
789 // why doesn't wxOutputStream::operator<< take "const wxString&"
790 wxTextOutputStream s(str);
791 s.WriteString(m_value);
795 bool wxVariantDataString::Read(wxInputStream& str)
797 wxTextInputStream s(str);
799 m_value = s.ReadString();
802 #endif // wxUSE_STREAMS
804 bool wxVariantDataString::Read(wxString& str)
810 IMPLEMENT_DYNAMIC_CLASS(wxVariantDataString, wxVariantData)
813 * wxVariantDataVoidPtr
816 class wxVariantDataVoidPtr: public wxVariantData
818 DECLARE_DYNAMIC_CLASS(wxVariantDataVoidPtr)
820 wxVariantDataVoidPtr() { }
821 wxVariantDataVoidPtr(void* value) { m_value = value; }
823 inline void* GetValue() const { return m_value; }
824 inline void SetValue(void* value) { m_value = value; }
826 virtual void Copy(wxVariantData& data);
827 virtual bool Eq(wxVariantData& data) const;
828 #if wxUSE_STD_IOSTREAM
829 virtual bool Write(wxSTD ostream& str) const;
831 virtual bool Write(wxString& str) const;
832 #if wxUSE_STD_IOSTREAM
833 virtual bool Read(wxSTD istream& str);
835 virtual bool Read(wxString& str);
836 virtual wxString GetType() const { return wxT("void*"); };
837 virtual wxVariantData* Clone() { return new wxVariantDataVoidPtr; }
842 DECLARE_NO_COPY_CLASS(wxVariantDataVoidPtr)
845 IMPLEMENT_DYNAMIC_CLASS(wxVariantDataVoidPtr, wxVariantData)
847 void wxVariantDataVoidPtr::Copy(wxVariantData& data)
849 wxASSERT_MSG( (data.GetType() == wxT("void*")), wxT("wxVariantDataVoidPtr::Copy: Can't copy to this type of data") );
851 wxVariantDataVoidPtr& otherData = (wxVariantDataVoidPtr&) data;
853 otherData.m_value = m_value;
856 bool wxVariantDataVoidPtr::Eq(wxVariantData& data) const
858 wxASSERT_MSG( (data.GetType() == wxT("void*")), wxT("wxVariantDataVoidPtr::Eq: argument mismatch") );
860 wxVariantDataVoidPtr& otherData = (wxVariantDataVoidPtr&) data;
862 return (otherData.m_value == m_value);
865 #if wxUSE_STD_IOSTREAM
866 bool wxVariantDataVoidPtr::Write(wxSTD ostream& str) const
870 str << (const char*) s.mb_str();
875 bool wxVariantDataVoidPtr::Write(wxString& str) const
877 str.Printf(wxT("%ld"), (long) m_value);
881 #if wxUSE_STD_IOSTREAM
882 bool wxVariantDataVoidPtr::Read(wxSTD istream& WXUNUSED(str))
889 bool wxVariantDataVoidPtr::Read(wxString& WXUNUSED(str))
896 * wxVariantDataWxObjectPtr
899 class wxVariantDataWxObjectPtr: public wxVariantData
901 DECLARE_DYNAMIC_CLASS(wxVariantDataWxObjectPtr)
903 wxVariantDataWxObjectPtr() { }
904 wxVariantDataWxObjectPtr(wxObject* value) { m_value = value; }
906 inline wxObject* GetValue() const { return m_value; }
907 inline void SetValue(wxObject* value) { m_value = value; }
909 virtual void Copy(wxVariantData& data);
910 virtual bool Eq(wxVariantData& data) const;
911 #if wxUSE_STD_IOSTREAM
912 virtual bool Write(wxSTD ostream& str) const;
914 virtual bool Write(wxString& str) const;
915 #if wxUSE_STD_IOSTREAM
916 virtual bool Read(wxSTD istream& str);
918 virtual bool Read(wxString& str);
919 virtual wxString GetType() const ;
920 virtual wxVariantData* Clone() { return new wxVariantDataWxObjectPtr; }
922 virtual wxClassInfo* GetValueClassInfo() ;
926 DECLARE_NO_COPY_CLASS(wxVariantDataWxObjectPtr)
929 IMPLEMENT_DYNAMIC_CLASS(wxVariantDataWxObjectPtr, wxVariantData)
931 void wxVariantDataWxObjectPtr::Copy(wxVariantData& data)
933 wxASSERT_MSG( wxIsKindOf((&data), wxVariantDataWxObjectPtr) ,\
934 wxT("wxVariantDataWxObjectPtr::Copy: Can't copy to this type of data") \
937 wxVariantDataWxObjectPtr& otherData = (wxVariantDataWxObjectPtr&) data;
939 otherData.m_value = m_value;
942 bool wxVariantDataWxObjectPtr::Eq(wxVariantData& data) const
944 wxASSERT_MSG( wxIsKindOf((&data), wxVariantDataWxObjectPtr), wxT("wxVariantDataWxObjectPtr::Eq: argument mismatch") );
946 wxVariantDataWxObjectPtr& otherData = (wxVariantDataWxObjectPtr&) data;
948 return (otherData.m_value == m_value);
951 wxString wxVariantDataWxObjectPtr::GetType() const
953 wxString returnVal(wxT("wxObject"));
955 returnVal = m_value->GetClassInfo()->GetClassName();
960 wxClassInfo* wxVariantDataWxObjectPtr::GetValueClassInfo()
962 wxClassInfo* returnVal=NULL;
964 if (m_value) returnVal = m_value->GetClassInfo();
969 #if wxUSE_STD_IOSTREAM
970 bool wxVariantDataWxObjectPtr::Write(wxSTD ostream& str) const
974 str << (const char*) s.mb_str();
979 bool wxVariantDataWxObjectPtr::Write(wxString& str) const
981 str.Printf(wxT("%s(%ld)"), GetType().c_str(), (long) m_value);
985 #if wxUSE_STD_IOSTREAM
986 bool wxVariantDataWxObjectPtr::Read(wxSTD istream& WXUNUSED(str))
993 bool wxVariantDataWxObjectPtr::Read(wxString& WXUNUSED(str))
1001 * wxVariantDataDateTime
1006 class wxVariantDataDateTime: public wxVariantData
1008 DECLARE_DYNAMIC_CLASS(wxVariantDataDateTime)
1011 wxVariantDataDateTime() { }
1012 wxVariantDataDateTime(const wxDateTime& value) { m_value = value; }
1014 wxVariantDataDateTime(const TIME_STRUCT* valptr)
1015 { m_value = wxDateTime(valptr->hour, valptr->minute, valptr->second); }
1016 wxVariantDataDateTime(const DATE_STRUCT* valptr)
1017 { m_value = wxDateTime(valptr->day, (wxDateTime::Month) (valptr->month - 1),valptr->year); }
1018 wxVariantDataDateTime(const TIMESTAMP_STRUCT* valptr)
1019 { m_value = wxDateTime(valptr->day, (wxDateTime::Month) (valptr->month - 1), valptr->year,
1020 valptr->hour, valptr->minute, valptr->second, valptr->fraction ); }
1023 inline wxDateTime GetValue() const { return m_value; }
1024 inline void SetValue(const wxDateTime& value) { m_value = value; }
1026 virtual void Copy(wxVariantData& data);
1027 virtual bool Eq(wxVariantData& data) const;
1028 #if wxUSE_STD_IOSTREAM
1029 virtual bool Write(wxSTD ostream& str) const;
1031 virtual bool Write(wxString& str) const;
1032 #if wxUSE_STD_IOSTREAM
1033 virtual bool Read(wxSTD istream& str);
1035 virtual bool Read(wxString& str);
1036 virtual wxString GetType() const { return wxT("datetime"); };
1037 virtual wxVariantData* Clone() { return new wxVariantDataDateTime; }
1044 IMPLEMENT_DYNAMIC_CLASS(wxVariantDataDateTime, wxVariantData)
1046 void wxVariantDataDateTime::Copy(wxVariantData& data)
1048 wxASSERT_MSG( (data.GetType() == wxT("datetime")), wxT("wxVariantDataDateTime::Copy: Can't copy to this type of data") );
1050 wxVariantDataDateTime& otherData = (wxVariantDataDateTime&) data;
1052 otherData.m_value = m_value;
1056 bool wxVariantDataDateTime::Eq(wxVariantData& data) const
1058 wxASSERT_MSG( (data.GetType() == wxT("datetime")), wxT("wxVariantDataDateTime::Eq: argument mismatch") );
1060 wxVariantDataDateTime& otherData = (wxVariantDataDateTime&) data;
1062 return (otherData.m_value == m_value);
1066 #if wxUSE_STD_IOSTREAM
1067 bool wxVariantDataDateTime::Write(wxSTD ostream& str) const
1075 bool wxVariantDataDateTime::Write(wxString& str) const
1077 str = m_value.Format();
1082 #if wxUSE_STD_IOSTREAM
1083 bool wxVariantDataDateTime::Read(wxSTD istream& WXUNUSED(str))
1091 bool wxVariantDataDateTime::Read(wxString& str)
1093 if(! m_value.ParseDateTime(str))
1098 #endif // wxUSE_DATETIME
1100 // ----------------------------------------------------------------------------
1101 // wxVariantDataArrayString
1102 // ----------------------------------------------------------------------------
1104 class wxVariantDataArrayString: public wxVariantData
1107 wxVariantDataArrayString() { }
1108 wxVariantDataArrayString(const wxArrayString& value) { m_value = value; }
1110 wxArrayString GetValue() const { return m_value; }
1111 void SetValue(const wxArrayString& value) { m_value = value; }
1113 virtual void Copy(wxVariantData& data);
1114 virtual bool Eq(wxVariantData& data) const;
1115 #if wxUSE_STD_IOSTREAM
1116 virtual bool Write(wxSTD ostream& str) const;
1118 virtual bool Write(wxString& str) const;
1119 #if wxUSE_STD_IOSTREAM
1120 virtual bool Read(wxSTD istream& str);
1122 virtual bool Read(wxString& str);
1123 virtual wxString GetType() const { return wxT("arrstring"); };
1124 virtual wxVariantData* Clone() { return new wxVariantDataArrayString; }
1127 wxArrayString m_value;
1129 DECLARE_DYNAMIC_CLASS(wxVariantDataArrayString)
1132 IMPLEMENT_DYNAMIC_CLASS(wxVariantDataArrayString, wxVariantData)
1134 void wxVariantDataArrayString::Copy(wxVariantData& data)
1136 wxASSERT_MSG( data.GetType() == GetType(), wxT("wxVariantDataArrayString::Copy: Can't copy to this type of data") );
1138 wxVariantDataArrayString& otherData = (wxVariantDataArrayString&) data;
1140 otherData.m_value = m_value;
1144 bool wxVariantDataArrayString::Eq(wxVariantData& data) const
1146 wxASSERT_MSG( data.GetType() == GetType(), wxT("wxVariantDataArrayString::Eq: argument mismatch") );
1148 wxVariantDataArrayString& otherData = (wxVariantDataArrayString&) data;
1150 return otherData.m_value == m_value;
1154 #if wxUSE_STD_IOSTREAM
1155 bool wxVariantDataArrayString::Write(wxSTD ostream& str) const
1163 bool wxVariantDataArrayString::Write(wxString& str) const
1165 size_t count = m_value.GetCount();
1166 for ( size_t n = 0; n < count; n++ )
1178 #if wxUSE_STD_IOSTREAM
1179 bool wxVariantDataArrayString::Read(wxSTD istream& WXUNUSED(str))
1187 bool wxVariantDataArrayString::Read(wxString& str)
1189 wxStringTokenizer tk(str, _T(";"));
1190 while ( tk.HasMoreTokens() )
1192 m_value.Add(tk.GetNextToken());
1204 IMPLEMENT_DYNAMIC_CLASS(wxVariant, wxObject)
1206 // Construction & destruction
1207 wxVariant::wxVariant()
1209 m_data = (wxVariantData*) NULL;
1212 wxVariant::wxVariant(double val, const wxString& name)
1214 m_data = new wxVariantDataReal(val);
1218 wxVariant::wxVariant(long val, const wxString& name)
1220 m_data = new wxVariantDataLong(val);
1225 wxVariant::wxVariant(bool val, const wxString& name)
1227 m_data = new wxVariantDataBool(val);
1232 wxVariant::wxVariant(char val, const wxString& name)
1234 m_data = new wxVariantDataChar(val);
1238 wxVariant::wxVariant(const wxString& val, const wxString& name)
1240 m_data = new wxVariantDataString(val);
1244 wxVariant::wxVariant(const wxChar* val, const wxString& name)
1246 m_data = new wxVariantDataString(wxString(val));
1250 wxVariant::wxVariant(const wxStringList& val, const wxString& name)
1252 m_data = new wxVariantDataStringList(val);
1256 wxVariant::wxVariant(const wxList& val, const wxString& name) // List of variants
1258 m_data = new wxVariantDataList(val);
1262 wxVariant::wxVariant( void* val, const wxString& name)
1264 m_data = new wxVariantDataVoidPtr(val);
1268 wxVariant::wxVariant( wxObject* val, const wxString& name)
1270 m_data = new wxVariantDataWxObjectPtr(val);
1275 wxVariant::wxVariant(const wxDateTime& val, const wxString& name) // Date
1277 m_data = new wxVariantDataDateTime(val);
1280 #endif // wxUSE_DATETIME
1283 wxVariant::wxVariant(const TIME_STRUCT* valptr, const wxString& name) // Date
1285 m_data = new wxVariantDataDateTime(valptr);
1289 wxVariant::wxVariant(const TIMESTAMP_STRUCT* valptr, const wxString& name) // Date
1291 m_data = new wxVariantDataDateTime(valptr);
1295 wxVariant::wxVariant(const DATE_STRUCT* valptr, const wxString& name) // Date
1297 m_data = new wxVariantDataDateTime(valptr);
1300 #endif // wxUSE_ODBC
1302 wxVariant::wxVariant(const wxArrayString& val, const wxString& name) // Strings
1304 m_data = new wxVariantDataArrayString(val);
1308 wxVariant::wxVariant(const wxVariant& variant)
1311 if (!variant.IsNull())
1313 m_data = (wxVariantData*) variant.GetData()->GetClassInfo()->CreateObject();
1314 variant.m_data->Copy(*m_data);
1317 m_data = (wxVariantData*) NULL;
1318 m_name = variant.m_name;
1321 wxVariant::wxVariant(wxVariantData* data, const wxString& name) // User-defined data
1327 wxVariant::~wxVariant()
1333 // Make NULL (i.e. delete the data)
1334 void wxVariant::MakeNull()
1340 // Generic operators
1342 void wxVariant::operator= (const wxVariant& variant)
1344 if (variant.IsNull())
1350 if (IsNull() || (GetType() != variant.GetType()))
1354 m_data = (wxVariantData*) variant.GetData()->GetClassInfo()->CreateObject();
1357 variant.GetData()->Copy(* GetData());
1359 m_name = variant.m_name;
1362 // Assignment using data, e.g.
1363 // myVariant = new wxStringVariantData("hello")
1364 void wxVariant::operator= (wxVariantData* variantData)
1367 m_data = variantData;
1370 bool wxVariant::operator== (const wxVariant& variant) const
1372 if (IsNull() || variant.IsNull())
1373 return (IsNull() == variant.IsNull());
1375 return (GetData()->Eq(* variant.GetData()));
1378 bool wxVariant::operator!= (const wxVariant& variant) const
1380 return (!(*this == variant));
1384 // Specific operators
1385 bool wxVariant::operator== (double value) const
1388 if (!Convert(&thisValue))
1391 return (value == thisValue);
1394 bool wxVariant::operator!= (double value) const
1396 return (!((*this) == value));
1399 void wxVariant::operator= (double value)
1401 if (GetType() == wxT("double"))
1403 ((wxVariantDataReal*)GetData())->SetValue(value);
1409 m_data = new wxVariantDataReal(value);
1413 bool wxVariant::operator== (long value) const
1416 if (!Convert(&thisValue))
1419 return (value == thisValue);
1422 bool wxVariant::operator!= (long value) const
1424 return (!((*this) == value));
1427 void wxVariant::operator= (long value)
1429 if (GetType() == wxT("long"))
1431 ((wxVariantDataLong*)GetData())->SetValue(value);
1437 m_data = new wxVariantDataLong(value);
1441 bool wxVariant::operator== (char value) const
1444 if (!Convert(&thisValue))
1447 return (value == thisValue);
1450 bool wxVariant::operator!= (char value) const
1452 return (!((*this) == value));
1455 void wxVariant::operator= (char value)
1457 if (GetType() == wxT("char"))
1459 ((wxVariantDataChar*)GetData())->SetValue(value);
1465 m_data = new wxVariantDataChar(value);
1470 bool wxVariant::operator== (bool value) const
1473 if (!Convert(&thisValue))
1476 return (value == thisValue);
1479 bool wxVariant::operator!= (bool value) const
1481 return (!((*this) == value));
1484 void wxVariant::operator= (bool value)
1486 if (GetType() == wxT("bool"))
1488 ((wxVariantDataBool*)GetData())->SetValue(value);
1494 m_data = new wxVariantDataBool(value);
1499 bool wxVariant::operator== (const wxString& value) const
1502 if (!Convert(&thisValue))
1505 return value == thisValue;
1508 bool wxVariant::operator!= (const wxString& value) const
1510 return (!((*this) == value));
1513 void wxVariant::operator= (const wxString& value)
1515 if (GetType() == wxT("string"))
1517 ((wxVariantDataString*)GetData())->SetValue(value);
1523 m_data = new wxVariantDataString(value);
1527 void wxVariant::operator= (const wxChar* value)
1529 if (GetType() == wxT("string"))
1531 ((wxVariantDataString*)GetData())->SetValue(wxString(value));
1537 m_data = new wxVariantDataString(wxString(value));
1541 bool wxVariant::operator== (const wxStringList& value) const
1543 wxASSERT_MSG( (GetType() == wxT("stringlist")), wxT("Invalid type for == operator") );
1545 wxVariantDataStringList other(value);
1546 return (m_data->Eq(other));
1549 bool wxVariant::operator!= (const wxStringList& value) const
1551 return (!((*this) == value));
1554 void wxVariant::operator= (const wxStringList& value)
1556 if (GetType() == wxT("stringlist"))
1558 ((wxVariantDataStringList*)GetData())->SetValue(value);
1564 m_data = new wxVariantDataStringList(value);
1568 bool wxVariant::operator== (const wxList& value) const
1570 wxASSERT_MSG( (GetType() == wxT("list")), wxT("Invalid type for == operator") );
1572 wxVariantDataList other(value);
1573 return (m_data->Eq(other));
1576 bool wxVariant::operator!= (const wxList& value) const
1578 return (!((*this) == value));
1581 void wxVariant::operator= (const wxList& value)
1583 if (GetType() == wxT("list"))
1585 ((wxVariantDataList*)GetData())->SetValue(value);
1591 m_data = new wxVariantDataList(value);
1595 bool wxVariant::operator== (void* value) const
1597 return (value == ((wxVariantDataVoidPtr*)GetData())->GetValue());
1600 bool wxVariant::operator!= (void* value) const
1602 return (!((*this) == (void*) value));
1605 void wxVariant::operator= (void* value)
1607 if (GetType() == wxT("void*"))
1609 ((wxVariantDataVoidPtr*)GetData())->SetValue(value);
1615 m_data = new wxVariantDataVoidPtr(value);
1620 bool wxVariant::operator== (const wxDateTime& value) const
1622 wxDateTime thisValue;
1623 if (!Convert(&thisValue))
1626 return value.IsEqualTo(thisValue);
1629 bool wxVariant::operator!= (const wxDateTime& value) const
1631 return (!((*this) == value));
1634 void wxVariant::operator= (const wxDateTime& value)
1636 if (GetType() == wxT("datetime"))
1638 ((wxVariantDataDateTime*)GetData())->SetValue(value);
1644 m_data = new wxVariantDataDateTime(value);
1647 #endif // wxUSE_DATETIME
1650 void wxVariant::operator= (const DATE_STRUCT* value)
1654 m_data = new wxVariantDataDateTime(value);
1658 void wxVariant::operator= (const TIME_STRUCT* value)
1662 m_data = new wxVariantDataDateTime(value);
1666 void wxVariant::operator= (const TIMESTAMP_STRUCT* value)
1670 m_data = new wxVariantDataDateTime(value);
1673 #endif // wxUSE_ODBC
1675 bool wxVariant::operator==(const wxArrayString& WXUNUSED(value)) const
1677 wxFAIL_MSG( _T("TODO") );
1682 bool wxVariant::operator!=(const wxArrayString& value) const
1684 return !(*this == value);
1687 void wxVariant::operator=(const wxArrayString& value)
1689 if (GetType() == wxT("arrstring"))
1691 ((wxVariantDataArrayString *)GetData())->SetValue(value);
1696 m_data = new wxVariantDataArrayString(value);
1700 wxArrayString wxVariant::GetArrayString() const
1702 if ( GetType() == wxT("arrstring") )
1703 return ((wxVariantDataArrayString *)GetData())->GetValue();
1705 return wxArrayString();
1709 // Treat a list variant as an array
1710 wxVariant wxVariant::operator[] (size_t idx) const
1712 wxASSERT_MSG( (GetType() == wxT("list") || GetType() == wxT("stringlist")), wxT("Invalid type for array operator") );
1714 if (GetType() == wxT("list"))
1716 wxVariantDataList* data = (wxVariantDataList*) m_data;
1717 wxASSERT_MSG( (idx < (size_t) data->GetValue().GetCount()), wxT("Invalid index for array") );
1718 return * (wxVariant*) (data->GetValue().Item(idx)->GetData());
1720 else if (GetType() == wxT("stringlist"))
1722 wxVariantDataStringList* data = (wxVariantDataStringList*) m_data;
1723 wxASSERT_MSG( (idx < (size_t) data->GetValue().GetCount()), wxT("Invalid index for array") );
1725 wxVariant variant( wxString( (const wxChar*) (data->GetValue().Item(idx)->GetData()) ));
1728 return wxNullVariant;
1731 wxVariant& wxVariant::operator[] (size_t idx)
1733 // We can't return a reference to a variant for a string list, since the string
1734 // is actually stored as a char*, not a variant.
1736 wxASSERT_MSG( (GetType() == wxT("list")), wxT("Invalid type for array operator") );
1738 wxVariantDataList* data = (wxVariantDataList*) m_data;
1739 wxASSERT_MSG( (idx < (size_t) data->GetValue().GetCount()), wxT("Invalid index for array") );
1741 return * (wxVariant*) (data->GetValue().Item(idx)->GetData());
1744 // Return the number of elements in a list
1745 int wxVariant::GetCount() const
1747 wxASSERT_MSG( (GetType() == wxT("list") || GetType() == wxT("stringlist")), wxT("Invalid type for GetCount()") );
1749 if (GetType() == wxT("list"))
1751 wxVariantDataList* data = (wxVariantDataList*) m_data;
1752 return data->GetValue().GetCount();
1754 else if (GetType() == wxT("stringlist"))
1756 wxVariantDataStringList* data = (wxVariantDataStringList*) m_data;
1757 return data->GetValue().GetCount();
1762 wxString wxVariant::MakeString() const
1767 if (GetData()->Write(str))
1770 return wxString(wxT(""));
1775 void wxVariant::SetData(wxVariantData* data)
1777 if (m_data) delete m_data;
1782 // Returns a string representing the type of the variant,
1783 // e.g. "string", "bool", "stringlist", "list", "double", "long"
1784 wxString wxVariant::GetType() const
1787 return wxString(wxT("null"));
1789 return m_data->GetType();
1793 bool wxVariant::IsType(const wxString& type) const
1795 return (GetType() == type);
1798 bool wxVariant::IsValueKindOf(const wxClassInfo* type) const
1800 wxClassInfo* info=m_data->GetValueClassInfo();
1801 return info ? info->IsKindOf(type) : false ;
1806 double wxVariant::GetReal() const
1809 if (Convert(& value))
1813 wxFAIL_MSG(wxT("Could not convert to a real number"));
1818 long wxVariant::GetInteger() const
1821 if (Convert(& value))
1825 wxFAIL_MSG(wxT("Could not convert to an integer"));
1830 char wxVariant::GetChar() const
1833 if (Convert(& value))
1837 wxFAIL_MSG(wxT("Could not convert to a char"));
1842 bool wxVariant::GetBool() const
1845 if (Convert(& value))
1849 wxFAIL_MSG(wxT("Could not convert to a bool"));
1854 wxString wxVariant::GetString() const
1857 if (!Convert(& value))
1859 wxFAIL_MSG(wxT("Could not convert to a string"));
1865 void* wxVariant::GetVoidPtr() const
1867 wxASSERT( (GetType() == wxT("void*")) );
1869 return (void*) ((wxVariantDataVoidPtr*) m_data)->GetValue();
1872 wxObject* wxVariant::GetWxObjectPtr()
1874 wxASSERT(wxIsKindOf(m_data, wxVariantDataWxObjectPtr));
1875 return (wxObject*) ((wxVariantDataWxObjectPtr*) m_data)->GetValue();
1879 wxDateTime wxVariant::GetDateTime() const
1882 if (!Convert(& value))
1884 wxFAIL_MSG(wxT("Could not convert to a datetime"));
1889 #endif // wxUSE_DATETIME
1891 wxList& wxVariant::GetList() const
1893 wxASSERT( (GetType() == wxT("list")) );
1895 return (wxList&) ((wxVariantDataList*) m_data)->GetValue();
1898 wxStringList& wxVariant::GetStringList() const
1900 wxASSERT( (GetType() == wxT("stringlist")) );
1902 return (wxStringList&) ((wxVariantDataStringList*) m_data)->GetValue();
1906 void wxVariant::NullList()
1908 SetData(new wxVariantDataList());
1912 void wxVariant::Append(const wxVariant& value)
1914 wxList& list = GetList();
1916 list.Append(new wxVariant(value));
1919 // Insert at front of list
1920 void wxVariant::Insert(const wxVariant& value)
1922 wxList& list = GetList();
1924 list.Insert(new wxVariant(value));
1927 // Returns TRUE if the variant is a member of the list
1928 bool wxVariant::Member(const wxVariant& value) const
1930 wxList& list = GetList();
1932 wxList::compatibility_iterator node = list.GetFirst();
1935 wxVariant* other = (wxVariant*) node->GetData();
1936 if (value == *other)
1938 node = node->GetNext();
1943 // Deletes the nth element of the list
1944 bool wxVariant::Delete(int item)
1946 wxList& list = GetList();
1948 wxASSERT_MSG( (item < (int) list.GetCount()), wxT("Invalid index to Delete") );
1949 wxList::compatibility_iterator node = list.Item(item);
1950 wxVariant* variant = (wxVariant*) node->GetData();
1957 void wxVariant::ClearList()
1959 if (!IsNull() && (GetType() == wxT("list")))
1961 ((wxVariantDataList*) m_data)->Clear();
1965 if (GetType() != wxT("list"))
1970 m_data = new wxVariantDataList;
1975 bool wxVariant::Convert(long* value) const
1977 wxString type(GetType());
1978 if (type == wxT("double"))
1979 *value = (long) (((wxVariantDataReal*)GetData())->GetValue());
1980 else if (type == wxT("long"))
1981 *value = ((wxVariantDataLong*)GetData())->GetValue();
1983 else if (type == wxT("bool"))
1984 *value = (long) (((wxVariantDataBool*)GetData())->GetValue());
1986 else if (type == wxT("string"))
1987 *value = wxAtol((const wxChar*) ((wxVariantDataString*)GetData())->GetValue());
1994 bool wxVariant::Convert(bool* value) const
1996 wxString type(GetType());
1997 if (type == wxT("double"))
1998 *value = ((int) (((wxVariantDataReal*)GetData())->GetValue()) != 0);
1999 else if (type == wxT("long"))
2000 *value = (((wxVariantDataLong*)GetData())->GetValue() != 0);
2002 else if (type == wxT("bool"))
2003 *value = ((wxVariantDataBool*)GetData())->GetValue();
2005 else if (type == wxT("string"))
2007 wxString val(((wxVariantDataString*)GetData())->GetValue());
2009 if (val == wxT("true") || val == wxT("yes"))
2011 else if (val == wxT("false") || val == wxT("no"))
2022 bool wxVariant::Convert(double* value) const
2024 wxString type(GetType());
2025 if (type == wxT("double"))
2026 *value = ((wxVariantDataReal*)GetData())->GetValue();
2027 else if (type == wxT("long"))
2028 *value = (double) (((wxVariantDataLong*)GetData())->GetValue());
2030 else if (type == wxT("bool"))
2031 *value = (double) (((wxVariantDataBool*)GetData())->GetValue());
2033 else if (type == wxT("string"))
2034 *value = (double) wxAtof((const wxChar*) ((wxVariantDataString*)GetData())->GetValue());
2041 bool wxVariant::Convert(char* value) const
2043 wxString type(GetType());
2044 if (type == wxT("char"))
2045 *value = ((wxVariantDataChar*)GetData())->GetValue();
2046 else if (type == wxT("long"))
2047 *value = (char) (((wxVariantDataLong*)GetData())->GetValue());
2049 else if (type == wxT("bool"))
2050 *value = (char) (((wxVariantDataBool*)GetData())->GetValue());
2058 bool wxVariant::Convert(wxString* value) const
2060 *value = MakeString();
2065 bool wxVariant::Convert(wxDateTime* value) const
2067 wxString type(GetType());
2068 if (type == wxT("datetime"))
2070 *value = ((wxVariantDataDateTime*)GetData())->GetValue();
2073 // Fallback to string conversion
2075 return Convert(&val) && (value->ParseDate(val));
2077 #endif // wxUSE_DATETIME