f4b80e5337
Don't support this compiler any more, this allows to get rid of tons of MSVC6-specific workarounds, in particular we can now use Bind() and natural template functions calls in the library code. Also remove MSVC6 project and solution files and don't generate them when bakefile_gen is ran any more (removing the remaining occurrences of msvc6prj from the bakefiles results in weird bake-time errors, so it's simpler to just leave them there). git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@76532 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
103 lines
3.0 KiB
C++
103 lines
3.0 KiB
C++
/////////////////////////////////////////////////////////////////////////////
|
|
// 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
|
|
{
|
|
|
|
template<typename T>
|
|
struct TypeHierarchy
|
|
{
|
|
// consider unknown types (e.g. objects, pointers) to be of highest
|
|
// level, always convert to them if they occur
|
|
static const int level = 9999;
|
|
};
|
|
|
|
#define WX_TYPE_HIERARCHY_LEVEL(level_num, type) \
|
|
template<> struct TypeHierarchy<type> \
|
|
{ \
|
|
static const int 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_
|