variant.cpp
来自「A*算法 A*算法 A*算法 A*算法A*算法A*算法」· C++ 代码 · 共 2,112 行 · 第 1/4 页
CPP
2,112 行
}
bool wxVariantDataDateTime::Eq(wxVariantData& data) const
{
wxASSERT_MSG( (data.GetType() == wxT("datetime")), wxT("wxVariantDataDateTime::Eq: argument mismatch") );
wxVariantDataDateTime& otherData = (wxVariantDataDateTime&) data;
return (otherData.m_value == m_value);
}
#if wxUSE_STD_IOSTREAM
bool wxVariantDataDateTime::Write(wxSTD ostream& WXUNUSED(str)) const
{
// Not implemented
return false;
}
#endif
bool wxVariantDataDateTime::Write(wxString& str) const
{
str = m_value.Format();
return true;
}
#if wxUSE_STD_IOSTREAM
bool wxVariantDataDateTime::Read(wxSTD istream& WXUNUSED(str))
{
// Not implemented
return false;
}
#endif
bool wxVariantDataDateTime::Read(wxString& str)
{
if(! m_value.ParseDateTime(str))
return false;
return true;
}
#endif // wxUSE_DATETIME
// ----------------------------------------------------------------------------
// wxVariantDataArrayString
// ----------------------------------------------------------------------------
class wxVariantDataArrayString: public wxVariantData
{
public:
wxVariantDataArrayString() { }
wxVariantDataArrayString(const wxArrayString& value) { m_value = value; }
wxArrayString GetValue() const { return m_value; }
void SetValue(const wxArrayString& 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;
#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("arrstring"); };
virtual wxVariantData* Clone() { return new wxVariantDataArrayString; }
protected:
wxArrayString m_value;
DECLARE_DYNAMIC_CLASS(wxVariantDataArrayString)
};
IMPLEMENT_DYNAMIC_CLASS(wxVariantDataArrayString, wxVariantData)
void wxVariantDataArrayString::Copy(wxVariantData& data)
{
wxASSERT_MSG( data.GetType() == GetType(), wxT("wxVariantDataArrayString::Copy: Can't copy to this type of data") );
wxVariantDataArrayString& otherData = (wxVariantDataArrayString&) data;
otherData.m_value = m_value;
}
bool wxVariantDataArrayString::Eq(wxVariantData& data) const
{
wxASSERT_MSG( data.GetType() == GetType(), wxT("wxVariantDataArrayString::Eq: argument mismatch") );
wxVariantDataArrayString& otherData = (wxVariantDataArrayString&) data;
return otherData.m_value == m_value;
}
#if wxUSE_STD_IOSTREAM
bool wxVariantDataArrayString::Write(wxSTD ostream& WXUNUSED(str)) const
{
// Not implemented
return false;
}
#endif
bool wxVariantDataArrayString::Write(wxString& str) const
{
size_t count = m_value.GetCount();
for ( size_t n = 0; n < count; n++ )
{
if ( n )
str += _T(';');
str += m_value[n];
}
return true;
}
#if wxUSE_STD_IOSTREAM
bool wxVariantDataArrayString::Read(wxSTD istream& WXUNUSED(str))
{
// Not implemented
return false;
}
#endif
bool wxVariantDataArrayString::Read(wxString& str)
{
wxStringTokenizer tk(str, _T(";"));
while ( tk.HasMoreTokens() )
{
m_value.Add(tk.GetNextToken());
}
return true;
}
/*
* wxVariant
*/
IMPLEMENT_DYNAMIC_CLASS(wxVariant, wxObject)
// Construction & destruction
wxVariant::wxVariant()
{
m_data = (wxVariantData*) NULL;
}
wxVariant::wxVariant(double val, const wxString& name)
{
m_data = new wxVariantDataReal(val);
m_name = name;
}
wxVariant::wxVariant(long val, const wxString& name)
{
m_data = new wxVariantDataLong(val);
m_name = name;
}
#ifdef HAVE_BOOL
wxVariant::wxVariant(bool val, const wxString& name)
{
m_data = new wxVariantDataBool(val);
m_name = name;
}
#endif
wxVariant::wxVariant(char val, const wxString& name)
{
m_data = new wxVariantDataChar(val);
m_name = name;
}
wxVariant::wxVariant(const wxString& val, const wxString& name)
{
m_data = new wxVariantDataString(val);
m_name = name;
}
wxVariant::wxVariant(const wxChar* val, const wxString& name)
{
m_data = new wxVariantDataString(wxString(val));
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);
m_name = name;
}
wxVariant::wxVariant( void* val, const wxString& name)
{
m_data = new wxVariantDataVoidPtr(val);
m_name = name;
}
wxVariant::wxVariant( wxObject* val, const wxString& name)
{
m_data = new wxVariantDataWxObjectPtr(val);
m_name = name;
}
#if wxUSE_DATETIME
wxVariant::wxVariant(const wxDateTime& val, const wxString& name) // Date
{
m_data = new wxVariantDataDateTime(val);
m_name = name;
}
#endif // wxUSE_DATETIME
#if wxUSE_ODBC
wxVariant::wxVariant(const TIME_STRUCT* valptr, const wxString& name) // Date
{
m_data = new wxVariantDataDateTime(valptr);
m_name = name;
}
wxVariant::wxVariant(const TIMESTAMP_STRUCT* valptr, const wxString& name) // Date
{
m_data = new wxVariantDataDateTime(valptr);
m_name = name;
}
wxVariant::wxVariant(const DATE_STRUCT* valptr, const wxString& name) // Date
{
m_data = new wxVariantDataDateTime(valptr);
m_name = name;
}
#endif // wxUSE_ODBC
wxVariant::wxVariant(const wxArrayString& val, const wxString& name) // Strings
{
m_data = new wxVariantDataArrayString(val);
m_name = name;
}
wxVariant::wxVariant(const wxVariant& variant)
: wxObject()
{
if (!variant.IsNull())
{
m_data = (wxVariantData*) variant.GetData()->GetClassInfo()->CreateObject();
variant.m_data->Copy(*m_data);
}
else
m_data = (wxVariantData*) NULL;
m_name = variant.m_name;
}
wxVariant::wxVariant(wxVariantData* data, const wxString& name) // User-defined data
{
m_data = data;
m_name = name;
}
wxVariant::~wxVariant()
{
delete m_data;
}
// Make NULL (i.e. delete the data)
void wxVariant::MakeNull()
{
delete m_data;
m_data = NULL;
}
// Generic operators
// Assignment
void wxVariant::operator= (const wxVariant& variant)
{
if (variant.IsNull())
{
MakeNull();
return;
}
if (IsNull() || (GetType() != variant.GetType()))
{
if (m_data)
delete m_data;
m_data = (wxVariantData*) variant.GetData()->GetClassInfo()->CreateObject();
}
variant.GetData()->Copy(* GetData());
m_name = variant.m_name;
}
// Assignment using data, e.g.
// myVariant = new wxStringVariantData("hello")
void wxVariant::operator= (wxVariantData* variantData)
{
MakeNull();
m_data = variantData;
}
bool wxVariant::operator== (const wxVariant& variant) const
{
if (IsNull() || variant.IsNull())
return (IsNull() == variant.IsNull());
return (GetData()->Eq(* variant.GetData()));
}
bool wxVariant::operator!= (const wxVariant& variant) const
{
return (!(*this == variant));
}
// Specific operators
bool wxVariant::operator== (double value) const
{
double thisValue;
if (!Convert(&thisValue))
return false;
else
return (value == thisValue);
}
bool wxVariant::operator!= (double value) const
{
return (!((*this) == value));
}
void wxVariant::operator= (double value)
{
if (GetType() == wxT("double"))
{
((wxVariantDataReal*)GetData())->SetValue(value);
}
else
{
if (m_data)
delete m_data;
m_data = new wxVariantDataReal(value);
}
}
bool wxVariant::operator== (long value) const
{
long thisValue;
if (!Convert(&thisValue))
return false;
else
return (value == thisValue);
}
bool wxVariant::operator!= (long value) const
{
return (!((*this) == value));
}
void wxVariant::operator= (long value)
{
if (GetType() == wxT("long"))
{
((wxVariantDataLong*)GetData())->SetValue(value);
}
else
{
if (m_data)
delete m_data;
m_data = new wxVariantDataLong(value);
}
}
bool wxVariant::operator== (char value) const
{
char thisValue;
if (!Convert(&thisValue))
return false;
else
return (value == thisValue);
}
bool wxVariant::operator!= (char value) const
{
return (!((*this) == value));
}
void wxVariant::operator= (char value)
{
if (GetType() == wxT("char"))
{
((wxVariantDataChar*)GetData())->SetValue(value);
}
else
{
if (m_data)
delete m_data;
m_data = new wxVariantDataChar(value);
}
}
#ifdef HAVE_BOOL
bool wxVariant::operator== (bool value) const
{
bool thisValue;
if (!Convert(&thisValue))
return false;
else
return (value == thisValue);
}
bool wxVariant::operator!= (bool value) const
{
return (!((*this) == value));
}
void wxVariant::operator= (bool value)
{
if (GetType() == wxT("bool"))
{
((wxVariantDataBool*)GetData())->SetValue(value);
}
else
{
if (m_data)
delete m_data;
m_data = new wxVariantDataBool(value);
}
}
#endif // HAVE_BOOL
bool wxVariant::operator== (const wxString& value) const
{
wxString thisValue;
if (!Convert(&thisValue))
return false;
return value == thisValue;
}
bool wxVariant::operator!= (const wxString& value) const
{
return (!((*this) == value));
}
void wxVariant::operator= (const wxString& value)
{
if (GetType() == wxT("string"))
{
((wxVariantDataString*)GetData())->SetValue(value);
}
else
{
if (m_data)
delete m_data;
m_data = new wxVariantDataString(value);
}
}
void wxVariant::operator= (const wxChar* value)
{
if (GetType() == wxT("string"))
{
((wxVariantDataString*)GetData())->SetValue(wxString(value));
}
else
{
if (m_data)
delete m_data;
m_data = new wxVariantDataString(wxString(value));
}
}
#if WXWIN_COMPATIBILITY_2_4
bool wxVariant::operator== (const wxStringList& value) const
{
wxASSERT_MSG( (GetType() == wxT("stringlist")), wxT("Invalid type for == operator") );
wxVariantDataStringList other(value);
return (m_data->Eq(other));
}
bool wxVariant::operator!= (const wxStringList& value) const
{
wxASSERT_MSG( (GetType() == wxT("stringlist")), wxT("Invalid type for == operator") );
wxVariantDataStringList other(value);
return !(m_data->Eq(other));
}
void wxVariant::operator= (const wxStringList& value)
{
if (GetType() == wxT("stringlist"))
{
((wxVariantDataStringList*)GetData())->SetValue(value);
}
else
{
if (m_data)
delete m_data;
m_data = new wxVariantDataStringList(value);
}
}
#endif
bool wxVariant::operator== (const wxList& value) const
{
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?