promote_enum_test.cpp
来自「Boost provides free peer-reviewed portab」· C++ 代码 · 共 153 行
CPP
153 行
// Copyright 2005-2006 Alexander Nasonov.// Distributed under the Boost Software License, Version 1.0. (See// accompanying file LICENSE_1_0.txt or copy at// http://www.boost.org/LICENSE_1_0.txt)// Status of some compilers://// Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 13.10.3077 for 80x86// /Za (disable extentions) is totally broken.// /Ze (enable extentions) promotes UIntEnum incorrectly to int.// See http://lab.msdn.microsoft.com/ProductFeedback/viewfeedback.aspx?feedbackid=22b0a6b7-120f-4ca0-9136-fa1b25b26efe//// Intel 9.0.028 for Windows has a similar problem:// https://premier.intel.com/IssueDetail.aspx?IssueID=365073//// gcc 3.4.4 with -fshort-enums option on x86// Dummy value is required, otherwise gcc promotes Enum1// to unsigned int although USHRT_MAX <= INT_MAX.// http://gcc.gnu.org/bugzilla/show_bug.cgi?id=24063// // CC: Sun WorkShop 6 update 2 C++ 5.3 Patch 111685-20 2004/03/19// on SPARC V9 64-bit processor (-xarch=v9 flag)// Dummy values are required for LongEnum3 and LongEnum4.//// CC: Sun C++ 5.7 Patch 117830-03 2005/07/21// ICE in boost/type_traits/is_enum.hpp at line 67.#include <climits>#include "promote_util.hpp"#include <boost/detail/workaround.hpp>enum IntEnum1 { IntEnum1_min = -5 , IntEnum1_max = 5 };enum IntEnum2 { IntEnum2_min = SHRT_MIN, IntEnum2_max = SHRT_MAX };enum IntEnum3 { IntEnum3_min = INT_MIN , IntEnum3_max = INT_MAX };enum IntEnum4 { IntEnum4_value = INT_MAX };enum IntEnum5 { IntEnum5_value = INT_MIN };void test_promote_to_int(){ test_cv<IntEnum1,int>(); test_cv<IntEnum2,int>(); test_cv<IntEnum3,int>(); test_cv<IntEnum4,int>(); test_cv<IntEnum5,int>();}#if !(defined(__GNUC__) && __GNUC__ == 3 && __GNUC_MINOR__ == 4 && USHRT_MAX <= INT_MAX)enum Enum1 { Enum1_value = USHRT_MAX };#else// workaround for bug #24063 in gcc 3.4// http://gcc.gnu.org/bugzilla/show_bug.cgi?id=24063namespace gcc_short_enums_workaround {enum short_enum { value = 1 };template<bool ShortEnumsIsOn>struct select{ // Adding negative dummy value doesn't change // promoted type because USHRT_MAX <= INT_MAX. enum type { dummy = -1, value = USHRT_MAX };};template<>struct select<false>{ // No dummy value enum type { value = USHRT_MAX };};} // namespace gcc_short_enums_workaroundtypedef gcc_short_enums_workaround::select< sizeof(gcc_short_enums_workaround::short_enum) != sizeof(int) >::type Enum1;#endifvoid test_promote_to_int_or_uint(){#if USHRT_MAX <= INT_MAX test_cv<Enum1, int>();#else test_cv<Enum1, unsigned int>();#endif}#if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1500) ) || \ BOOST_WORKAROUND(BOOST_INTEL_WIN, BOOST_TESTED_AT(1000))// Don't test UIntEnum on VC++ 8.0 and Intel for Windows 9.0,// they are broken. More info is on top of this file.#elseenum UIntEnum { UIntEnum_max = UINT_MAX };void test_promote_to_uint(){ test_cv< UIntEnum, unsigned int >();}#endif// Enums can't be promoted to [unsigned] long if sizeof(int) == sizeof(long).#if INT_MAX < LONG_MAXenum LongEnum1 { LongEnum1_min = -1 , LongEnum1_max = UINT_MAX };enum LongEnum2 { LongEnum2_min = LONG_MIN, LongEnum2_max = LONG_MAX };enum LongEnum3{ LongEnum3_value = LONG_MAX#if defined(__SUNPRO_CC) && __SUNPRO_CC <= 0x530 , LongEnum3_dummy = -1#endif};enum LongEnum4{ LongEnum4_value = LONG_MIN#if defined(__SUNPRO_CC) && __SUNPRO_CC <= 0x530 , LongEnum4_dummy = 1#endif}; void test_promote_to_long(){ test_cv< LongEnum1, long >(); test_cv< LongEnum2, long >(); test_cv< LongEnum3, long >(); test_cv< LongEnum4, long >();}enum ULongEnum { ULongEnum_value = ULONG_MAX };void test_promote_to_ulong(){ test_cv< ULongEnum, unsigned long >();}#endif // #if INT_MAX < LONG_MAXint main(){ return 0;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?