X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/9a8a9e994271ebbdb8b31671d0dd99b7ce13660b..10d878a9ea0b6bf66c469afe265735721c81a1f7:/src/common/variant.cpp diff --git a/src/common/variant.cpp b/src/common/variant.cpp index aed2105dfc..06ef8faf22 100644 --- a/src/common/variant.cpp +++ b/src/common/variant.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: variant.cpp +// Name: src/common/variant.cpp // Purpose: wxVariant class, container for any type // Author: Julian Smart // Modified by: @@ -9,10 +9,6 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) -#pragma implementation "variant.h" -#endif - // For compilers that support precompilation, includes "wx/wx.h". #include "wx/wxprec.h" @@ -20,6 +16,16 @@ #pragma hdrstop #endif +#include "wx/variant.h" + +#ifndef WX_PRECOMP + #include "wx/string.h" + #include "wx/math.h" + #if wxUSE_STREAMS + #include "wx/stream.h" + #endif +#endif + #if wxUSE_STD_IOSTREAM #if wxUSE_IOSTREAMH #include @@ -34,15 +40,12 @@ using namespace std ; #endif #if wxUSE_STREAMS -#include "wx/stream.h" -#include "wx/txtstrm.h" + #include "wx/txtstrm.h" #endif #include "wx/string.h" #include "wx/tokenzr.h" -#include "wx/variant.h" - IMPLEMENT_ABSTRACT_CLASS(wxVariantData, wxObject) wxVariant WXDLLIMPEXP_BASE wxNullVariant; @@ -59,7 +62,7 @@ public: wxVariantDataList(const wxList& list); ~wxVariantDataList(); - wxList& GetValue() const { return (wxList&) m_value; } + wxList& GetValue() { return m_value; } void SetValue(const wxList& value) ; virtual void Copy(wxVariantData& data); @@ -164,7 +167,7 @@ bool wxVariantDataList::Write(wxSTD ostream& str) const bool wxVariantDataList::Write(wxString& str) const { - str = wxT(""); + str = wxEmptyString; wxList::compatibility_iterator node = m_value.GetFirst(); while (node) { @@ -194,6 +197,7 @@ bool wxVariantDataList::Read(wxString& WXUNUSED(str)) // TODO return false; } +#if WXWIN_COMPATIBILITY_2_4 /* * wxVariantDataStringList @@ -303,6 +307,8 @@ bool wxVariantDataStringList::Read(wxString& WXUNUSED(str)) return false; } +#endif //2.4 compat + /* * wxVariantDataLong */ @@ -455,7 +461,7 @@ bool wxVariantDataReal::Eq(wxVariantData& data) const wxVariantDataReal& otherData = (wxVariantDataReal&) data; - return (otherData.m_value == m_value); + return wxIsSameDouble(otherData.m_value, m_value); } #if wxUSE_STD_IOSTREAM @@ -470,7 +476,7 @@ bool wxVariantDataReal::Write(wxSTD ostream& str) const bool wxVariantDataReal::Write(wxString& str) const { - str.Printf(wxT("%.4f"), m_value); + str.Printf(wxT("%.14g"), m_value); return true; } @@ -706,7 +712,7 @@ bool wxVariantDataChar::Read(wxInputStream& str) bool wxVariantDataChar::Read(wxString& str) { - m_value = str.ToAscii()[0u]; + m_value = str.ToAscii()[size_t(0)]; return true; } @@ -797,7 +803,7 @@ bool wxVariantDataString::Read(wxInputStream& str) { wxTextInputStream s(str); - m_value = s.ReadString(); + m_value = s.ReadLine(); return true; } #endif // wxUSE_STREAMS @@ -875,7 +881,7 @@ bool wxVariantDataVoidPtr::Write(wxSTD ostream& str) const bool wxVariantDataVoidPtr::Write(wxString& str) const { - str.Printf(wxT("%ld"), (long) m_value); + str.Printf(wxT("%p"), m_value); return true; } @@ -979,7 +985,7 @@ bool wxVariantDataWxObjectPtr::Write(wxSTD ostream& str) const bool wxVariantDataWxObjectPtr::Write(wxString& str) const { - str.Printf(wxT("%s(%ld)"), GetType().c_str(), (long) m_value); + str.Printf(wxT("%s(%p)"), GetType().c_str(), wx_static_cast(void*, m_value)); return true; } @@ -1065,7 +1071,7 @@ bool wxVariantDataDateTime::Eq(wxVariantData& data) const #if wxUSE_STD_IOSTREAM -bool wxVariantDataDateTime::Write(wxSTD ostream& str) const +bool wxVariantDataDateTime::Write(wxSTD ostream& WXUNUSED(str)) const { // Not implemented return false; @@ -1153,7 +1159,7 @@ bool wxVariantDataArrayString::Eq(wxVariantData& data) const #if wxUSE_STD_IOSTREAM -bool wxVariantDataArrayString::Write(wxSTD ostream& str) const +bool wxVariantDataArrayString::Write(wxSTD ostream& WXUNUSED(str)) const { // Not implemented return false; @@ -1248,12 +1254,16 @@ wxVariant::wxVariant(const wxChar* val, const wxString& name) m_name = name; } +#if WXWIN_COMPATIBILITY_2_4 + wxVariant::wxVariant(const wxStringList& val, const wxString& name) { m_data = new wxVariantDataStringList(val); m_name = name; } +#endif + wxVariant::wxVariant(const wxList& val, const wxString& name) // List of variants { m_data = new wxVariantDataList(val); @@ -1388,8 +1398,8 @@ bool wxVariant::operator== (double value) const double thisValue; if (!Convert(&thisValue)) return false; - else - return (value == thisValue); + + return wxIsSameDouble(value, thisValue); } bool wxVariant::operator!= (double value) const @@ -1539,6 +1549,8 @@ void wxVariant::operator= (const wxChar* value) } } +#if WXWIN_COMPATIBILITY_2_4 + bool wxVariant::operator== (const wxStringList& value) const { wxASSERT_MSG( (GetType() == wxT("stringlist")), wxT("Invalid type for == operator") ); @@ -1549,7 +1561,10 @@ bool wxVariant::operator== (const wxStringList& value) const bool wxVariant::operator!= (const wxStringList& value) const { - return (!((*this) == value)); + wxASSERT_MSG( (GetType() == wxT("stringlist")), wxT("Invalid type for == operator") ); + + wxVariantDataStringList other(value); + return !(m_data->Eq(other)); } void wxVariant::operator= (const wxStringList& value) @@ -1566,6 +1581,8 @@ void wxVariant::operator= (const wxStringList& value) } } +#endif + bool wxVariant::operator== (const wxList& value) const { wxASSERT_MSG( (GetType() == wxT("list")), wxT("Invalid type for == operator") ); @@ -1710,23 +1727,29 @@ wxArrayString wxVariant::GetArrayString() const // Treat a list variant as an array wxVariant wxVariant::operator[] (size_t idx) const { +#if WXWIN_COMPATIBILITY_2_4 wxASSERT_MSG( (GetType() == wxT("list") || GetType() == wxT("stringlist")), wxT("Invalid type for array operator") ); +#else + wxASSERT_MSG( GetType() == wxT("list"), wxT("Invalid type for array operator") ); +#endif if (GetType() == wxT("list")) { wxVariantDataList* data = (wxVariantDataList*) m_data; - wxASSERT_MSG( (idx < (size_t) data->GetValue().GetCount()), wxT("Invalid index for array") ); + wxASSERT_MSG( (idx < data->GetValue().GetCount()), wxT("Invalid index for array") ); return * (wxVariant*) (data->GetValue().Item(idx)->GetData()); } +#if WXWIN_COMPATIBILITY_2_4 else if (GetType() == wxT("stringlist")) { wxVariantDataStringList* data = (wxVariantDataStringList*) m_data; - wxASSERT_MSG( (idx < (size_t) data->GetValue().GetCount()), wxT("Invalid index for array") ); + wxASSERT_MSG( (idx < data->GetValue().GetCount()), wxT("Invalid index for array") ); wxString str( (const wxChar*) (data->GetValue().Item(idx)->GetData()) ); wxVariant variant( str ); return variant; } +#endif return wxNullVariant; } @@ -1738,26 +1761,32 @@ wxVariant& wxVariant::operator[] (size_t idx) wxASSERT_MSG( (GetType() == wxT("list")), wxT("Invalid type for array operator") ); wxVariantDataList* data = (wxVariantDataList*) m_data; - wxASSERT_MSG( (idx < (size_t) data->GetValue().GetCount()), wxT("Invalid index for array") ); + wxASSERT_MSG( (idx < data->GetValue().GetCount()), wxT("Invalid index for array") ); return * (wxVariant*) (data->GetValue().Item(idx)->GetData()); } // Return the number of elements in a list -int wxVariant::GetCount() const +size_t wxVariant::GetCount() const { +#if WXWIN_COMPATIBILITY_2_4 wxASSERT_MSG( (GetType() == wxT("list") || GetType() == wxT("stringlist")), wxT("Invalid type for GetCount()") ); +#else + wxASSERT_MSG( GetType() == wxT("list"), wxT("Invalid type for GetCount()") ); +#endif if (GetType() == wxT("list")) { wxVariantDataList* data = (wxVariantDataList*) m_data; return data->GetValue().GetCount(); } +#if WXWIN_COMPATIBILITY_2_4 else if (GetType() == wxT("stringlist")) { wxVariantDataStringList* data = (wxVariantDataStringList*) m_data; return data->GetValue().GetCount(); } +#endif return 0; } @@ -1769,7 +1798,7 @@ wxString wxVariant::MakeString() const if (GetData()->Write(str)) return str; } - return wxString(wxT("")); + return wxEmptyString; } // Accessors @@ -1782,7 +1811,7 @@ void wxVariant::SetData(wxVariantData* data) // Returns a string representing the type of the variant, -// e.g. "string", "bool", "stringlist", "list", "double", "long" +// e.g. "string", "bool", "list", "double", "long" wxString wxVariant::GetType() const { if (IsNull()) @@ -1897,6 +1926,8 @@ wxList& wxVariant::GetList() const return (wxList&) ((wxVariantDataList*) m_data)->GetValue(); } +#if WXWIN_COMPATIBILITY_2_4 + wxStringList& wxVariant::GetStringList() const { wxASSERT( (GetType() == wxT("stringlist")) ); @@ -1904,11 +1935,13 @@ wxStringList& wxVariant::GetStringList() const return (wxStringList&) ((wxVariantDataStringList*) m_data)->GetValue(); } +#endif + // Make empty list void wxVariant::NullList() { SetData(new wxVariantDataList()); -}; +} // Append to list void wxVariant::Append(const wxVariant& value) @@ -1943,11 +1976,11 @@ bool wxVariant::Member(const wxVariant& value) const } // Deletes the nth element of the list -bool wxVariant::Delete(int item) +bool wxVariant::Delete(size_t item) { wxList& list = GetList(); - wxASSERT_MSG( (item < (int) list.GetCount()), wxT("Invalid index to Delete") ); + wxASSERT_MSG( (item < list.GetCount()), wxT("Invalid index to Delete") ); wxList::compatibility_iterator node = list.Item(item); wxVariant* variant = (wxVariant*) node->GetData(); delete variant; @@ -1964,7 +1997,7 @@ void wxVariant::ClearList() } else { - if (GetType() != wxT("list")) + if (!GetType().IsSameAs(wxT("list"))) { delete m_data; m_data = NULL; @@ -2008,9 +2041,9 @@ bool wxVariant::Convert(bool* value) const { wxString val(((wxVariantDataString*)GetData())->GetValue()); val.MakeLower(); - if (val == wxT("true") || val == wxT("yes")) + if (val == wxT("true") || val == wxT("yes") || val == wxT('1') ) *value = true; - else if (val == wxT("false") || val == wxT("no")) + else if (val == wxT("false") || val == wxT("no") || val == wxT('0') ) *value = false; else return false; @@ -2078,4 +2111,3 @@ bool wxVariant::Convert(wxDateTime* value) const (value->ParseDateTime(val) || value->ParseDate(val)); } #endif // wxUSE_DATETIME -