| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 |
- /////////////////////////////////////////////////////////////////////////////
- // Name: wx/meta/implicitconversion.h
- // Purpose: Determine resulting type from implicit conversion
- // Author: Vaclav Slavik
- // Created: 2010-10-22
- // Copyright: (c) 2010 Vaclav Slavik
- // Licence: wxWindows licence
- /////////////////////////////////////////////////////////////////////////////
- #ifndef _WX_META_IMPLICITCONVERSION_H_
- #define _WX_META_IMPLICITCONVERSION_H_
- #include "wx/defs.h"
- #include "wx/meta/if.h"
- // C++ hierarchy of data types is:
- //
- // Long double (highest)
- // Double
- // Float
- // Unsigned long int
- // Long int
- // Unsigned int
- // Int (lowest)
- //
- // Types lower in the hierarchy are converted into ones higher up if both are
- // involved e.g. in arithmetic expressions.
- namespace wxPrivate
- {
- // Helper macro to define a constant inside a template class: it's needed
- // because MSVC6 doesn't support initializing static integer members but the
- // usual workaround of using enums instead doesn't work for Borland (at least
- // in template classes).
- #ifdef __VISUALC6__
- #define wxDEFINE_CLASS_INT_CONST(name, value) enum { name = value }
- #else
- #define wxDEFINE_CLASS_INT_CONST(name, value) static const int name = value
- #endif
- template<typename T>
- struct TypeHierarchy
- {
- // consider unknown types (e.g. objects, pointers) to be of highest
- // level, always convert to them if they occur
- wxDEFINE_CLASS_INT_CONST( level, 9999 );
- };
- #define WX_TYPE_HIERARCHY_LEVEL(level_num, type) \
- template<> struct TypeHierarchy<type> \
- { \
- wxDEFINE_CLASS_INT_CONST( level, level_num ); \
- }
- WX_TYPE_HIERARCHY_LEVEL( 1, char);
- WX_TYPE_HIERARCHY_LEVEL( 2, unsigned char);
- WX_TYPE_HIERARCHY_LEVEL( 3, short);
- WX_TYPE_HIERARCHY_LEVEL( 4, unsigned short);
- WX_TYPE_HIERARCHY_LEVEL( 5, int);
- WX_TYPE_HIERARCHY_LEVEL( 6, unsigned int);
- WX_TYPE_HIERARCHY_LEVEL( 7, long);
- WX_TYPE_HIERARCHY_LEVEL( 8, unsigned long);
- #ifdef wxLongLong_t
- WX_TYPE_HIERARCHY_LEVEL( 9, wxLongLong_t);
- WX_TYPE_HIERARCHY_LEVEL(10, wxULongLong_t);
- #endif
- WX_TYPE_HIERARCHY_LEVEL(11, float);
- WX_TYPE_HIERARCHY_LEVEL(12, double);
- WX_TYPE_HIERARCHY_LEVEL(13, long double);
- #if wxWCHAR_T_IS_REAL_TYPE
- #if SIZEOF_WCHAR_T == SIZEOF_SHORT
- template<> struct TypeHierarchy<wchar_t> : public TypeHierarchy<short> {};
- #elif SIZEOF_WCHAR_T == SIZEOF_INT
- template<> struct TypeHierarchy<wchar_t> : public TypeHierarchy<int> {};
- #elif SIZEOF_WCHAR_T == SIZEOF_LONG
- template<> struct TypeHierarchy<wchar_t> : public TypeHierarchy<long> {};
- #else
- #error "weird wchar_t size, please update this code"
- #endif
- #endif
- #undef WX_TYPE_HIERARCHY_LEVEL
- } // namespace wxPrivate
- // Helper to determine resulting type of implicit conversion in
- // an expression with two arithmetic types.
- template<typename T1, typename T2>
- struct wxImplicitConversionType
- {
- typedef typename wxIf
- <
- // if T2 is "higher" type, convert to it
- (int)(wxPrivate::TypeHierarchy<T1>::level) < (int)(wxPrivate::TypeHierarchy<T2>::level),
- T2,
- // otherwise use T1
- T1
- >::value
- value;
- };
- template<typename T1, typename T2, typename T3>
- struct wxImplicitConversionType3 : public wxImplicitConversionType<
- T1,
- typename wxImplicitConversionType<T2,T3>::value>
- {
- };
- #endif // _WX_META_IMPLICITCONVERSION_H_
|