variant.cpp
来自「A*算法 A*算法 A*算法 A*算法A*算法A*算法」· C++ 代码 · 共 2,112 行 · 第 1/4 页
CPP
2,112 行
/////////////////////////////////////////////////////////////////////////////
// Name: variant.cpp
// Purpose: wxVariant class, container for any type
// Author: Julian Smart
// Modified by:
// Created: 10/09/98
// RCS-ID: $Id: variant.cpp,v 1.68.2.2 2006/03/07 14:52:22 JS Exp $
// Copyright: (c)
// 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"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#if wxUSE_STD_IOSTREAM
#if wxUSE_IOSTREAMH
#include <fstream.h>
#else
#include <fstream>
#endif
#endif
#if defined(__MWERKS__) && __MSL__ >= 0x6000
namespace std {}
using namespace std ;
#endif
#if wxUSE_STREAMS
#include "wx/stream.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;
/*
* wxVariantDataList
*/
class WXDLLIMPEXP_BASE wxVariantDataList: public wxVariantData
{
DECLARE_DYNAMIC_CLASS(wxVariantDataList)
public:
wxVariantDataList() {}
wxVariantDataList(const wxList& list);
~wxVariantDataList();
wxList& GetValue() const { return (wxList&) m_value; }
void SetValue(const wxList& value) ;
virtual void Copy(wxVariantData& data);
virtual bool Eq(wxVariantData& data) const;
#if wxUSE_STD_IOSTREAM
virtual bool Write(wxSTD ostream& str) const;
#endif
virtual bool Write(wxString& str) const;
#if wxUSE_STD_IOSTREAM
virtual bool Read(wxSTD istream& str);
#endif
virtual bool Read(wxString& str);
virtual wxString GetType() const { return wxT("list"); };
void Clear();
protected:
wxList m_value;
};
IMPLEMENT_DYNAMIC_CLASS(wxVariantDataList, wxVariantData)
wxVariantDataList::wxVariantDataList(const wxList& list)
{
SetValue(list);
}
wxVariantDataList::~wxVariantDataList()
{
Clear();
}
void wxVariantDataList::SetValue(const wxList& value)
{
Clear();
wxList::compatibility_iterator node = value.GetFirst();
while (node)
{
wxVariant* var = (wxVariant*) node->GetData();
m_value.Append(new wxVariant(*var));
node = node->GetNext();
}
}
void wxVariantDataList::Clear()
{
wxList::compatibility_iterator node = m_value.GetFirst();
while (node)
{
wxVariant* var = (wxVariant*) node->GetData();
delete var;
node = node->GetNext();
}
m_value.Clear();
}
void wxVariantDataList::Copy(wxVariantData& data)
{
wxASSERT_MSG( (data.GetType() == wxT("list")), wxT("wxVariantDataList::Copy: Can't copy to this type of data") );
wxVariantDataList& listData = (wxVariantDataList&) data;
listData.Clear();
wxList::compatibility_iterator node = m_value.GetFirst();
while (node)
{
wxVariant* var = (wxVariant*) node->GetData();
listData.m_value.Append(new wxVariant(*var));
node = node->GetNext();
}
}
bool wxVariantDataList::Eq(wxVariantData& data) const
{
wxASSERT_MSG( (data.GetType() == wxT("list")), wxT("wxVariantDataList::Eq: argument mismatch") );
wxVariantDataList& listData = (wxVariantDataList&) data;
wxList::compatibility_iterator node1 = m_value.GetFirst();
wxList::compatibility_iterator node2 = listData.GetValue().GetFirst();
while (node1 && node2)
{
wxVariant* var1 = (wxVariant*) node1->GetData();
wxVariant* var2 = (wxVariant*) node2->GetData();
if ((*var1) != (*var2))
return false;
node1 = node1->GetNext();
node2 = node2->GetNext();
}
if (node1 || node2) return false;
return true;
}
#if wxUSE_STD_IOSTREAM
bool wxVariantDataList::Write(wxSTD ostream& str) const
{
wxString s;
Write(s);
str << (const char*) s.mb_str();
return true;
}
#endif
bool wxVariantDataList::Write(wxString& str) const
{
str = wxEmptyString;
wxList::compatibility_iterator node = m_value.GetFirst();
while (node)
{
wxVariant* var = (wxVariant*) node->GetData();
if (node != m_value.GetFirst())
str += wxT(" ");
wxString str1;
str += var->MakeString();
node = node->GetNext();
}
return true;
}
#if wxUSE_STD_IOSTREAM
bool wxVariantDataList::Read(wxSTD istream& WXUNUSED(str))
{
wxFAIL_MSG(wxT("Unimplemented"));
// TODO
return false;
}
#endif
bool wxVariantDataList::Read(wxString& WXUNUSED(str))
{
wxFAIL_MSG(wxT("Unimplemented"));
// TODO
return false;
}
#if WXWIN_COMPATIBILITY_2_4
/*
* wxVariantDataStringList
*/
class WXDLLIMPEXP_BASE wxVariantDataStringList: public wxVariantData
{
DECLARE_DYNAMIC_CLASS(wxVariantDataStringList)
public:
wxVariantDataStringList() {}
wxVariantDataStringList(const wxStringList& list) { m_value = list; }
wxStringList& GetValue() const { return (wxStringList&) m_value; }
void SetValue(const wxStringList& value);
virtual void Copy(wxVariantData& data);
virtual bool Eq(wxVariantData& data) const;
#if wxUSE_STD_IOSTREAM
virtual bool Write(wxSTD ostream& str) const;
#endif
virtual bool Write(wxString& str) const;
#if wxUSE_STD_IOSTREAM
virtual bool Read(wxSTD istream& str);
#endif
virtual bool Read(wxString& str);
virtual wxString GetType() const { return wxT("stringlist"); };
protected:
wxStringList m_value;
};
IMPLEMENT_DYNAMIC_CLASS(wxVariantDataStringList, wxVariantData)
void wxVariantDataStringList::SetValue(const wxStringList& value)
{
m_value = value;
}
void wxVariantDataStringList::Copy(wxVariantData& data)
{
wxASSERT_MSG( (data.GetType() == wxT("stringlist")), wxT("wxVariantDataStringList::Copy: Can't copy to this type of data") );
wxVariantDataStringList& listData = (wxVariantDataStringList&) data;
listData.m_value = m_value ;
}
bool wxVariantDataStringList::Eq(wxVariantData& data) const
{
wxASSERT_MSG( (data.GetType() == wxT("stringlist")), wxT("wxVariantDataStringList::Eq: argument mismatch") );
wxVariantDataStringList& listData = (wxVariantDataStringList&) data;
wxStringList::compatibility_iterator node1 = m_value.GetFirst();
wxStringList::compatibility_iterator node2 = listData.GetValue().GetFirst();
while (node1 && node2)
{
wxString str1 ( node1->GetData() );
wxString str2 ( node2->GetData() );
if (str1 != str2)
return false;
node1 = node1->GetNext();
node2 = node2->GetNext();
}
if (node1 || node2) return false;
return true;
}
#if wxUSE_STD_IOSTREAM
bool wxVariantDataStringList::Write(wxSTD ostream& str) const
{
wxString s;
Write(s);
str << (const char*) s.mb_str();
return true;
}
#endif
bool wxVariantDataStringList::Write(wxString& str) const
{
str.Empty();
wxStringList::compatibility_iterator node = m_value.GetFirst();
while (node)
{
const wxChar* s = node->GetData();
if (node != m_value.GetFirst())
str += wxT(" ");
str += s;
node = node->GetNext();
}
return true;
}
#if wxUSE_STD_IOSTREAM
bool wxVariantDataStringList::Read(wxSTD istream& WXUNUSED(str))
{
wxFAIL_MSG(wxT("Unimplemented"));
// TODO
return false;
}
#endif
bool wxVariantDataStringList::Read(wxString& WXUNUSED(str))
{
wxFAIL_MSG(wxT("Unimplemented"));
// TODO
return false;
}
#endif //2.4 compat
/*
* wxVariantDataLong
*/
class WXDLLIMPEXP_BASE wxVariantDataLong: public wxVariantData
{
DECLARE_DYNAMIC_CLASS(wxVariantDataLong)
public:
wxVariantDataLong() { m_value = 0; }
wxVariantDataLong(long value) { m_value = value; }
inline long GetValue() const { return m_value; }
inline void SetValue(long value) { m_value = value; }
virtual void Copy(wxVariantData& data);
virtual bool Eq(wxVariantData& data) const;
virtual bool Read(wxString& str);
virtual bool Write(wxString& str) const;
#if wxUSE_STD_IOSTREAM
virtual bool Read(wxSTD istream& str);
virtual bool Write(wxSTD ostream& str) const;
#endif
#if wxUSE_STREAMS
virtual bool Read(wxInputStream& str);
virtual bool Write(wxOutputStream &str) const;
#endif // wxUSE_STREAMS
virtual wxString GetType() const { return wxT("long"); };
protected:
long m_value;
};
IMPLEMENT_DYNAMIC_CLASS(wxVariantDataLong, wxVariantData)
void wxVariantDataLong::Copy(wxVariantData& data)
{
wxASSERT_MSG( (data.GetType() == wxT("long")), wxT("wxVariantDataLong::Copy: Can't copy to this type of data") );
wxVariantDataLong& otherData = (wxVariantDataLong&) data;
otherData.m_value = m_value;
}
bool wxVariantDataLong::Eq(wxVariantData& data) const
{
wxASSERT_MSG( (data.GetType() == wxT("long")), wxT("wxVariantDataLong::Eq: argument mismatch") );
wxVariantDataLong& otherData = (wxVariantDataLong&) data;
return (otherData.m_value == m_value);
}
#if wxUSE_STD_IOSTREAM
bool wxVariantDataLong::Write(wxSTD ostream& str) const
{
wxString s;
Write(s);
str << (const char*) s.mb_str();
return true;
}
#endif
bool wxVariantDataLong::Write(wxString& str) const
{
str.Printf(wxT("%ld"), m_value);
return true;
}
#if wxUSE_STD_IOSTREAM
bool wxVariantDataLong::Read(wxSTD istream& str)
{
str >> m_value;
return true;
}
#endif
#if wxUSE_STREAMS
bool wxVariantDataLong::Write(wxOutputStream& str) const
{
wxTextOutputStream s(str);
s.Write32((size_t)m_value);
return true;
}
bool wxVariantDataLong::Read(wxInputStream& str)
{
wxTextInputStream s(str);
m_value = s.Read32();
return true;
}
#endif // wxUSE_STREAMS
bool wxVariantDataLong::Read(wxString& str)
{
m_value = wxAtol((const wxChar*) str);
return true;
}
/*
* wxVariantDataReal
*/
class WXDLLIMPEXP_BASE wxVariantDataReal: public wxVariantData
{
DECLARE_DYNAMIC_CLASS(wxVariantDataReal)
public:
wxVariantDataReal() { m_value = 0.0; }
wxVariantDataReal(double value) { m_value = value; }
inline double GetValue() const { return m_value; }
inline void SetValue(double value) { m_value = value; }
virtual void Copy(wxVariantData& data);
virtual bool Eq(wxVariantData& data) const;
virtual bool Read(wxString& str);
#if wxUSE_STD_IOSTREAM
virtual bool Write(wxSTD ostream& str) const;
#endif
virtual bool Write(wxString& str) const;
#if wxUSE_STD_IOSTREAM
virtual bool Read(wxSTD istream& str);
#endif
#if wxUSE_STREAMS
virtual bool Read(wxInputStream& str);
virtual bool Write(wxOutputStream &str) const;
#endif // wxUSE_STREAMS
virtual wxString GetType() const { return wxT("double"); };
protected:
double m_value;
};
IMPLEMENT_DYNAMIC_CLASS(wxVariantDataReal, wxVariantData)
void wxVariantDataReal::Copy(wxVariantData& data)
{
wxASSERT_MSG( (data.GetType() == wxT("double")), wxT("wxVariantDataReal::Copy: Can't copy to this type of data") );
wxVariantDataReal& otherData = (wxVariantDataReal&) data;
otherData.m_value = m_value;
}
bool wxVariantDataReal::Eq(wxVariantData& data) const
{
wxASSERT_MSG( (data.GetType() == wxT("double")), wxT("wxVariantDataReal::Eq: argument mismatch") );
wxVariantDataReal& otherData = (wxVariantDataReal&) data;
return (otherData.m_value == m_value);
}
#if wxUSE_STD_IOSTREAM
bool wxVariantDataReal::Write(wxSTD ostream& str) const
{
wxString s;
Write(s);
str << (const char*) s.mb_str();
return true;
}
#endif
bool wxVariantDataReal::Write(wxString& str) const
{
str.Printf(wxT("%.14g"), m_value);
return true;
}
#if wxUSE_STD_IOSTREAM
bool wxVariantDataReal::Read(wxSTD istream& str)
{
str >> m_value;
return true;
}
#endif
#if wxUSE_STREAMS
bool wxVariantDataReal::Write(wxOutputStream& str) const
{
wxTextOutputStream s(str);
s.WriteDouble((double)m_value);
return true;
}
bool wxVariantDataReal::Read(wxInputStream& str)
{
wxTextInputStream s(str);
m_value = (float)s.ReadDouble();
return true;
}
#endif // wxUSE_STREAMS
bool wxVariantDataReal::Read(wxString& str)
{
m_value = wxAtof((const wxChar*) str);
return true;
}
#ifdef HAVE_BOOL
/*
* wxVariantDataBool
*/
class WXDLLIMPEXP_BASE wxVariantDataBool: public wxVariantData
{
DECLARE_DYNAMIC_CLASS(wxVariantDataBool)
public:
wxVariantDataBool() { m_value = 0; }
wxVariantDataBool(bool value) { m_value = value; }
inline bool GetValue() const { return m_value; }
inline void SetValue(bool value) { m_value = value; }
virtual void Copy(wxVariantData& data);
virtual bool Eq(wxVariantData& data) const;
#if wxUSE_STD_IOSTREAM
virtual bool Write(wxSTD ostream& str) const;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?