variant.cpp
来自「A*算法 A*算法 A*算法 A*算法A*算法A*算法」· C++ 代码 · 共 2,112 行 · 第 1/4 页
CPP
2,112 行
wxASSERT_MSG( (GetType() == wxT("list")), wxT("Invalid type for == operator") );
wxVariantDataList other(value);
return (m_data->Eq(other));
}
bool wxVariant::operator!= (const wxList& value) const
{
return (!((*this) == value));
}
void wxVariant::operator= (const wxList& value)
{
if (GetType() == wxT("list"))
{
((wxVariantDataList*)GetData())->SetValue(value);
}
else
{
if (m_data)
delete m_data;
m_data = new wxVariantDataList(value);
}
}
bool wxVariant::operator== (void* value) const
{
return (value == ((wxVariantDataVoidPtr*)GetData())->GetValue());
}
bool wxVariant::operator!= (void* value) const
{
return (!((*this) == (void*) value));
}
void wxVariant::operator= (void* value)
{
if (GetType() == wxT("void*"))
{
((wxVariantDataVoidPtr*)GetData())->SetValue(value);
}
else
{
if (m_data)
delete m_data;
m_data = new wxVariantDataVoidPtr(value);
}
}
#if wxUSE_DATETIME
bool wxVariant::operator== (const wxDateTime& value) const
{
wxDateTime thisValue;
if (!Convert(&thisValue))
return false;
return value.IsEqualTo(thisValue);
}
bool wxVariant::operator!= (const wxDateTime& value) const
{
return (!((*this) == value));
}
void wxVariant::operator= (const wxDateTime& value)
{
if (GetType() == wxT("datetime"))
{
((wxVariantDataDateTime*)GetData())->SetValue(value);
}
else
{
if (m_data)
delete m_data;
m_data = new wxVariantDataDateTime(value);
}
}
#endif // wxUSE_DATETIME
#if wxUSE_ODBC
void wxVariant::operator= (const DATE_STRUCT* value)
{
if (m_data)
delete m_data;
m_data = new wxVariantDataDateTime(value);
}
void wxVariant::operator= (const TIME_STRUCT* value)
{
if (m_data)
delete m_data;
m_data = new wxVariantDataDateTime(value);
}
void wxVariant::operator= (const TIMESTAMP_STRUCT* value)
{
if (m_data)
delete m_data;
m_data = new wxVariantDataDateTime(value);
}
#endif // wxUSE_ODBC
bool wxVariant::operator==(const wxArrayString& WXUNUSED(value)) const
{
wxFAIL_MSG( _T("TODO") );
return false;
}
bool wxVariant::operator!=(const wxArrayString& value) const
{
return !(*this == value);
}
void wxVariant::operator=(const wxArrayString& value)
{
if (GetType() == wxT("arrstring"))
{
((wxVariantDataArrayString *)GetData())->SetValue(value);
}
else
{
delete m_data;
m_data = new wxVariantDataArrayString(value);
}
}
wxArrayString wxVariant::GetArrayString() const
{
if ( GetType() == wxT("arrstring") )
return ((wxVariantDataArrayString *)GetData())->GetValue();
return wxArrayString();
}
// 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") );
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") );
wxString str( (const wxChar*) (data->GetValue().Item(idx)->GetData()) );
wxVariant variant( str );
return variant;
}
#endif
return wxNullVariant;
}
wxVariant& wxVariant::operator[] (size_t idx)
{
// We can't return a reference to a variant for a string list, since the string
// is actually stored as a char*, not a variant.
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") );
return * (wxVariant*) (data->GetValue().Item(idx)->GetData());
}
// Return the number of elements in a list
int 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;
}
wxString wxVariant::MakeString() const
{
if (!IsNull())
{
wxString str;
if (GetData()->Write(str))
return str;
}
return wxEmptyString;
}
// Accessors
void wxVariant::SetData(wxVariantData* data)
{
if (m_data) delete m_data;
m_data = data;
}
// Returns a string representing the type of the variant,
// e.g. "string", "bool", "list", "double", "long"
wxString wxVariant::GetType() const
{
if (IsNull())
return wxString(wxT("null"));
else
return m_data->GetType();
}
bool wxVariant::IsType(const wxString& type) const
{
return (GetType() == type);
}
bool wxVariant::IsValueKindOf(const wxClassInfo* type) const
{
wxClassInfo* info=m_data->GetValueClassInfo();
return info ? info->IsKindOf(type) : false ;
}
// Value accessors
double wxVariant::GetReal() const
{
double value;
if (Convert(& value))
return value;
else
{
wxFAIL_MSG(wxT("Could not convert to a real number"));
return 0.0;
}
}
long wxVariant::GetInteger() const
{
long value;
if (Convert(& value))
return value;
else
{
wxFAIL_MSG(wxT("Could not convert to an integer"));
return 0;
}
}
char wxVariant::GetChar() const
{
char value;
if (Convert(& value))
return value;
else
{
wxFAIL_MSG(wxT("Could not convert to a char"));
return 0;
}
}
bool wxVariant::GetBool() const
{
bool value;
if (Convert(& value))
return value;
else
{
wxFAIL_MSG(wxT("Could not convert to a bool"));
return 0;
}
}
wxString wxVariant::GetString() const
{
wxString value;
if (!Convert(& value))
{
wxFAIL_MSG(wxT("Could not convert to a string"));
}
return value;
}
void* wxVariant::GetVoidPtr() const
{
wxASSERT( (GetType() == wxT("void*")) );
return (void*) ((wxVariantDataVoidPtr*) m_data)->GetValue();
}
wxObject* wxVariant::GetWxObjectPtr()
{
wxASSERT(wxIsKindOf(m_data, wxVariantDataWxObjectPtr));
return (wxObject*) ((wxVariantDataWxObjectPtr*) m_data)->GetValue();
}
#if wxUSE_DATETIME
wxDateTime wxVariant::GetDateTime() const
{
wxDateTime value;
if (!Convert(& value))
{
wxFAIL_MSG(wxT("Could not convert to a datetime"));
}
return value;
}
#endif // wxUSE_DATETIME
wxList& wxVariant::GetList() const
{
wxASSERT( (GetType() == wxT("list")) );
return (wxList&) ((wxVariantDataList*) m_data)->GetValue();
}
#if WXWIN_COMPATIBILITY_2_4
wxStringList& wxVariant::GetStringList() const
{
wxASSERT( (GetType() == wxT("stringlist")) );
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)
{
wxList& list = GetList();
list.Append(new wxVariant(value));
}
// Insert at front of list
void wxVariant::Insert(const wxVariant& value)
{
wxList& list = GetList();
list.Insert(new wxVariant(value));
}
// Returns true if the variant is a member of the list
bool wxVariant::Member(const wxVariant& value) const
{
wxList& list = GetList();
wxList::compatibility_iterator node = list.GetFirst();
while (node)
{
wxVariant* other = (wxVariant*) node->GetData();
if (value == *other)
return true;
node = node->GetNext();
}
return false;
}
// Deletes the nth element of the list
bool wxVariant::Delete(int item)
{
wxList& list = GetList();
wxASSERT_MSG( (item < (int) list.GetCount()), wxT("Invalid index to Delete") );
wxList::compatibility_iterator node = list.Item(item);
wxVariant* variant = (wxVariant*) node->GetData();
delete variant;
list.Erase(node);
return true;
}
// Clear list
void wxVariant::ClearList()
{
if (!IsNull() && (GetType() == wxT("list")))
{
((wxVariantDataList*) m_data)->Clear();
}
else
{
if (!GetType().IsSameAs(wxT("list")))
{
delete m_data;
m_data = NULL;
}
m_data = new wxVariantDataList;
}
}
// Type conversion
bool wxVariant::Convert(long* value) const
{
wxString type(GetType());
if (type == wxT("double"))
*value = (long) (((wxVariantDataReal*)GetData())->GetValue());
else if (type == wxT("long"))
*value = ((wxVariantDataLong*)GetData())->GetValue();
#ifdef HAVE_BOOL
else if (type == wxT("bool"))
*value = (long) (((wxVariantDataBool*)GetData())->GetValue());
#endif
else if (type == wxT("string"))
*value = wxAtol((const wxChar*) ((wxVariantDataString*)GetData())->GetValue());
else
return false;
return true;
}
bool wxVariant::Convert(bool* value) const
{
wxString type(GetType());
if (type == wxT("double"))
*value = ((int) (((wxVariantDataReal*)GetData())->GetValue()) != 0);
else if (type == wxT("long"))
*value = (((wxVariantDataLong*)GetData())->GetValue() != 0);
#ifdef HAVE_BOOL
else if (type == wxT("bool"))
*value = ((wxVariantDataBool*)GetData())->GetValue();
#endif
else if (type == wxT("string"))
{
wxString val(((wxVariantDataString*)GetData())->GetValue());
val.MakeLower();
if (val == wxT("true") || val == wxT("yes") || val == wxT('1') )
*value = true;
else if (val == wxT("false") || val == wxT("no") || val == wxT('0') )
*value = false;
else
return false;
}
else
return false;
return true;
}
bool wxVariant::Convert(double* value) const
{
wxString type(GetType());
if (type == wxT("double"))
*value = ((wxVariantDataReal*)GetData())->GetValue();
else if (type == wxT("long"))
*value = (double) (((wxVariantDataLong*)GetData())->GetValue());
#ifdef HAVE_BOOL
else if (type == wxT("bool"))
*value = (double) (((wxVariantDataBool*)GetData())->GetValue());
#endif
else if (type == wxT("string"))
*value = (double) wxAtof((const wxChar*) ((wxVariantDataString*)GetData())->GetValue());
else
return false;
return true;
}
bool wxVariant::Convert(char* value) const
{
wxString type(GetType());
if (type == wxT("char"))
*value = ((wxVariantDataChar*)GetData())->GetValue();
else if (type == wxT("long"))
*value = (char) (((wxVariantDataLong*)GetData())->GetValue());
#ifdef HAVE_BOOL
else if (type == wxT("bool"))
*value = (char) (((wxVariantDataBool*)GetData())->GetValue());
#endif
else
return false;
return true;
}
bool wxVariant::Convert(wxString* value) const
{
*value = MakeString();
return true;
}
#if wxUSE_DATETIME
bool wxVariant::Convert(wxDateTime* value) const
{
wxString type(GetType());
if (type == wxT("datetime"))
{
*value = ((wxVariantDataDateTime*)GetData())->GetValue();
return true;
}
// Fallback to string conversion
wxString val;
return Convert(&val) &&
(value->ParseDateTime(val) || value->ParseDate(val));
}
#endif // wxUSE_DATETIME
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?