Add conversions to/from long long to wxUniChar.
Allow conversions to/from long long and unsigned long long values in wxUniChar for consistency with the other integral types. Also make the code shorter by using helper wxDO_FOR_INT_TYPES() and wxDO_FOR_CHAR_INT_TYPES() macros to avoid duplicating the same code for all of the integral types and having to handle wchar_t (and wxLongLong_t now) specially because sometimes we may need to overload on it and sometimes not. Finally, add more tests to check that all the wxUniChar methods compile and work with all the different types. Closes #15206. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@74029 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -35,17 +35,10 @@ public:
|
||||
wxUniChar(char c) { m_value = From8bit(c); }
|
||||
wxUniChar(unsigned char c) { m_value = From8bit((char)c); }
|
||||
|
||||
// Create the character from a wchar_t character value.
|
||||
#if wxWCHAR_T_IS_REAL_TYPE
|
||||
wxUniChar(wchar_t c) { m_value = c; }
|
||||
#endif
|
||||
|
||||
wxUniChar(int c) { m_value = c; }
|
||||
wxUniChar(unsigned int c) { m_value = c; }
|
||||
wxUniChar(long int c) { m_value = c; }
|
||||
wxUniChar(unsigned long int c) { m_value = c; }
|
||||
wxUniChar(short int c) { m_value = c; }
|
||||
wxUniChar(unsigned short int c) { m_value = c; }
|
||||
#define wxUNICHAR_DEFINE_CTOR(type) \
|
||||
wxUniChar(type c) { m_value = c; }
|
||||
wxDO_FOR_INT_TYPES(wxUNICHAR_DEFINE_CTOR)
|
||||
#undef wxUNICHAR_DEFINE_CTOR
|
||||
|
||||
wxUniChar(const wxUniCharRef& c);
|
||||
|
||||
@@ -94,15 +87,11 @@ public:
|
||||
// functions
|
||||
operator char() const { return To8bit(m_value); }
|
||||
operator unsigned char() const { return (unsigned char)To8bit(m_value); }
|
||||
#if wxWCHAR_T_IS_REAL_TYPE
|
||||
operator wchar_t() const { return (wchar_t)m_value; }
|
||||
#endif
|
||||
operator int() const { return (int)m_value; }
|
||||
operator unsigned int() const { return (unsigned int)m_value; }
|
||||
operator long int() const { return (long int)m_value; }
|
||||
operator unsigned long int() const { return (unsigned long)m_value; }
|
||||
operator short int() const { return (short int)m_value; }
|
||||
operator unsigned short int() const { return (unsigned short int)m_value; }
|
||||
|
||||
#define wxUNICHAR_DEFINE_OPERATOR_PAREN(type) \
|
||||
operator type() const { return (type)m_value; }
|
||||
wxDO_FOR_INT_TYPES(wxUNICHAR_DEFINE_OPERATOR_PAREN)
|
||||
#undef wxUNICHAR_DEFINE_OPERATOR_PAREN
|
||||
|
||||
// We need this operator for the "*p" part of expressions like "for (
|
||||
// const_iterator p = begin() + nStart; *p; ++p )". In this case,
|
||||
@@ -121,34 +110,27 @@ public:
|
||||
wxUniChar& operator=(const wxUniCharRef& c);
|
||||
wxUniChar& operator=(char c) { m_value = From8bit(c); return *this; }
|
||||
wxUniChar& operator=(unsigned char c) { m_value = From8bit((char)c); return *this; }
|
||||
#if wxWCHAR_T_IS_REAL_TYPE
|
||||
wxUniChar& operator=(wchar_t c) { m_value = c; return *this; }
|
||||
#endif
|
||||
wxUniChar& operator=(int c) { m_value = c; return *this; }
|
||||
wxUniChar& operator=(unsigned int c) { m_value = c; return *this; }
|
||||
wxUniChar& operator=(long int c) { m_value = c; return *this; }
|
||||
wxUniChar& operator=(unsigned long int c) { m_value = c; return *this; }
|
||||
wxUniChar& operator=(short int c) { m_value = c; return *this; }
|
||||
wxUniChar& operator=(unsigned short int c) { m_value = c; return *this; }
|
||||
|
||||
#define wxUNICHAR_DEFINE_OPERATOR_EQUAL(type) \
|
||||
wxUniChar& operator=(type c) { m_value = c; return *this; }
|
||||
wxDO_FOR_INT_TYPES(wxUNICHAR_DEFINE_OPERATOR_EQUAL)
|
||||
#undef wxUNICHAR_DEFINE_OPERATOR_EQUAL
|
||||
|
||||
// Comparison operators:
|
||||
#define wxDEFINE_UNICHAR_CMP_WITH_INT(T, op) \
|
||||
bool operator op(T c) const { return m_value op (value_type)c; }
|
||||
|
||||
// define the given comparison operator for all the types
|
||||
#define wxDEFINE_UNICHAR_OPERATOR(op) \
|
||||
bool operator op(const wxUniChar& c) const { return m_value op c.m_value; }\
|
||||
bool operator op(char c) const { return m_value op From8bit(c); } \
|
||||
bool operator op(unsigned char c) const { return m_value op From8bit((char)c); } \
|
||||
wxIF_WCHAR_T_TYPE( bool operator op(wchar_t c) const { return m_value op (value_type)c; } ) \
|
||||
bool operator op(int c) const { return m_value op (value_type)c; } \
|
||||
bool operator op(unsigned int c) const { return m_value op (value_type)c; } \
|
||||
bool operator op(short int c) const { return m_value op (value_type)c; } \
|
||||
bool operator op(unsigned short int c) const { return m_value op (value_type)c; } \
|
||||
bool operator op(long int c) const { return m_value op (value_type)c; } \
|
||||
bool operator op(unsigned long int c) const { return m_value op (value_type)c; }
|
||||
wxDO_FOR_INT_TYPES_1(wxDEFINE_UNICHAR_CMP_WITH_INT, op)
|
||||
|
||||
wxFOR_ALL_COMPARISONS(wxDEFINE_UNICHAR_OPERATOR)
|
||||
|
||||
#undef wxDEFINE_UNICHAR_OPERATOR
|
||||
#undef wxDEFINE_UNCHAR_CMP_WITH_INT
|
||||
|
||||
// this is needed for expressions like 'Z'-c
|
||||
int operator-(const wxUniChar& c) const { return m_value - c.m_value; }
|
||||
@@ -243,53 +225,35 @@ public:
|
||||
wxUniCharRef& operator=(const wxUniCharRef& c)
|
||||
{ if (&c != this) *this = c.UniChar(); return *this; }
|
||||
|
||||
wxUniCharRef& operator=(char c) { return *this = wxUniChar(c); }
|
||||
wxUniCharRef& operator=(unsigned char c) { return *this = wxUniChar(c); }
|
||||
#if wxWCHAR_T_IS_REAL_TYPE
|
||||
wxUniCharRef& operator=(wchar_t c) { return *this = wxUniChar(c); }
|
||||
#endif
|
||||
wxUniCharRef& operator=(int c) { return *this = wxUniChar(c); }
|
||||
wxUniCharRef& operator=(unsigned int c) { return *this = wxUniChar(c); }
|
||||
wxUniCharRef& operator=(short int c) { return *this = wxUniChar(c); }
|
||||
wxUniCharRef& operator=(unsigned short int c) { return *this = wxUniChar(c); }
|
||||
wxUniCharRef& operator=(long int c) { return *this = wxUniChar(c); }
|
||||
wxUniCharRef& operator=(unsigned long int c) { return *this = wxUniChar(c); }
|
||||
#define wxUNICHAR_REF_DEFINE_OPERATOR_EQUAL(type) \
|
||||
wxUniCharRef& operator=(type c) { return *this = wxUniChar(c); }
|
||||
wxDO_FOR_CHAR_INT_TYPES(wxUNICHAR_REF_DEFINE_OPERATOR_EQUAL)
|
||||
#undef wxUNICHAR_REF_DEFINE_OPERATOR_EQUAL
|
||||
|
||||
// Conversions to the same types as wxUniChar is convertible too:
|
||||
operator char() const { return UniChar(); }
|
||||
operator unsigned char() const { return UniChar(); }
|
||||
#if wxWCHAR_T_IS_REAL_TYPE
|
||||
operator wchar_t() const { return UniChar(); }
|
||||
#endif
|
||||
operator int() const { return UniChar(); }
|
||||
operator unsigned int() const { return UniChar(); }
|
||||
operator short int() const { return UniChar(); }
|
||||
operator unsigned short int() const { return UniChar(); }
|
||||
operator long int() const { return UniChar(); }
|
||||
operator unsigned long int() const { return UniChar(); }
|
||||
#define wxUNICHAR_REF_DEFINE_OPERATOR_PAREN(type) \
|
||||
operator type() const { return UniChar(); }
|
||||
wxDO_FOR_CHAR_INT_TYPES(wxUNICHAR_REF_DEFINE_OPERATOR_PAREN)
|
||||
#undef wxUNICHAR_REF_DEFINE_OPERATOR_PAREN
|
||||
|
||||
// see wxUniChar::operator bool etc. for explanation
|
||||
operator bool() const { return (bool)UniChar(); }
|
||||
bool operator!() const { return !UniChar(); }
|
||||
bool operator&&(bool v) const { return UniChar() && v; }
|
||||
|
||||
#define wxDEFINE_UNICHARREF_CMP_WITH_INT(T, op) \
|
||||
bool operator op(T c) const { return UniChar() op c; }
|
||||
|
||||
// Comparison operators:
|
||||
#define wxDEFINE_UNICHARREF_OPERATOR(op) \
|
||||
bool operator op(const wxUniCharRef& c) const { return UniChar() op c.UniChar(); }\
|
||||
bool operator op(const wxUniChar& c) const { return UniChar() op c; } \
|
||||
bool operator op(char c) const { return UniChar() op c; } \
|
||||
bool operator op(unsigned char c) const { return UniChar() op c; } \
|
||||
wxIF_WCHAR_T_TYPE( bool operator op(wchar_t c) const { return UniChar() op c; } ) \
|
||||
bool operator op(int c) const { return UniChar() op c; } \
|
||||
bool operator op(unsigned int c) const { return UniChar() op c; } \
|
||||
bool operator op(short int c) const { return UniChar() op c; } \
|
||||
bool operator op(unsigned short int c) const { return UniChar() op c; } \
|
||||
bool operator op(long int c) const { return UniChar() op c; } \
|
||||
bool operator op(unsigned long int c) const { return UniChar() op c; }
|
||||
wxDO_FOR_CHAR_INT_TYPES_1(wxDEFINE_UNICHARREF_CMP_WITH_INT, op)
|
||||
|
||||
wxFOR_ALL_COMPARISONS(wxDEFINE_UNICHARREF_OPERATOR)
|
||||
|
||||
#undef wxDEFINE_UNICHARREF_OPERATOR
|
||||
#undef wxDEFINE_UNICHARREF_CMP_WITH_INT
|
||||
|
||||
// for expressions like c-'A':
|
||||
int operator-(const wxUniCharRef& c) const { return UniChar() - c.UniChar(); }
|
||||
|
Reference in New Issue
Block a user