is_enum.hpp

来自「CGAL is a collaborative effort of severa」· HPP 代码 · 共 171 行

HPP
171
字号
//  (C) Copyright Dave Abrahams, Steve Cleary, Beman Dawes, Howard//  Hinnant & John Maddock 2000.  //  Use, modification and distribution are subject to 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).////  See http://www.boost.org/libs/type_traits for most recent version including documentation.#ifndef BOOST_TT_IS_ENUM_HPP_INCLUDED#define BOOST_TT_IS_ENUM_HPP_INCLUDED#include "boost/type_traits/add_reference.hpp"#include "boost/type_traits/is_arithmetic.hpp"#include "boost/type_traits/is_reference.hpp"#include "boost/type_traits/is_convertible.hpp"#ifdef __GNUC__#include <boost/type_traits/is_function.hpp>#endif#include "boost/type_traits/config.hpp"#if defined(BOOST_TT_HAS_CONFORMING_IS_CLASS_IMPLEMENTATION) #  include <boost/type_traits/is_class.hpp>#  include <boost/type_traits/is_union.hpp>#endif// should be the last #include#include "boost/type_traits/detail/bool_trait_def.hpp"namespace boost {#if !(defined(__BORLANDC__) && (__BORLANDC__ <= 0x551))namespace detail {#if defined(BOOST_TT_HAS_CONFORMING_IS_CLASS_IMPLEMENTATION) template <typename T>struct is_class_or_union{   BOOST_STATIC_CONSTANT(bool, value =      (::boost::type_traits::ice_or<           ::boost::is_class<T>::value         , ::boost::is_union<T>::value      >::value));};#elsetemplate <typename T>struct is_class_or_union{# if BOOST_WORKAROUND(BOOST_MSVC, == 1200) || BOOST_WORKAROUND(__BORLANDC__, <= 0x570)// we simply can't detect it this way.    BOOST_STATIC_CONSTANT(bool, value = false);# else    template <class U> static ::boost::type_traits::yes_type is_class_or_union_tester(void(U::*)(void));#  if BOOST_WORKAROUND(BOOST_MSVC, == 1300)                 \    || BOOST_WORKAROUND(__MWERKS__, <= 0x3000) // no SFINAE    static ::boost::type_traits::no_type is_class_or_union_tester(...);    BOOST_STATIC_CONSTANT(        bool, value = sizeof(is_class_or_union_tester(0)) == sizeof(::boost::type_traits::yes_type));#  else    template <class U>    static ::boost::type_traits::no_type is_class_or_union_tester(...);    BOOST_STATIC_CONSTANT(        bool, value = sizeof(is_class_or_union_tester<T>(0)) == sizeof(::boost::type_traits::yes_type));#  endif# endif};#endifstruct int_convertible{    int_convertible(int);};// Don't evaluate convertibility to int_convertible unless the type// is non-arithmetic. This suppresses warnings with GCC.template <bool is_typename_arithmetic_or_reference = true>struct is_enum_helper{    template <typename T> struct type    {        BOOST_STATIC_CONSTANT(bool, value = false);    };};template <>struct is_enum_helper<false>{    template <typename T> struct type        : ::boost::is_convertible<T,::boost::detail::int_convertible>    {    };};template <typename T> struct is_enum_impl{   typedef ::boost::add_reference<T> ar_t;   typedef typename ar_t::type r_type;#if defined(__GNUC__)#ifdef BOOST_TT_HAS_CONFORMING_IS_CLASS_IMPLEMENTATION   BOOST_STATIC_CONSTANT(bool, selector =      (::boost::type_traits::ice_or<           ::boost::is_arithmetic<T>::value         , ::boost::is_reference<T>::value         , ::boost::is_function<T>::value         , is_class_or_union<T>::value      >::value));#else   BOOST_STATIC_CONSTANT(bool, selector =      (::boost::type_traits::ice_or<           ::boost::is_arithmetic<T>::value         , ::boost::is_reference<T>::value         , ::boost::is_function<T>::value      >::value));#endif // BOOST_TT_HAS_CONFORMING_IS_CLASS_IMPLEMENTATION#else   BOOST_STATIC_CONSTANT(bool, selector =      (::boost::type_traits::ice_or<           ::boost::is_arithmetic<T>::value         , ::boost::is_reference<T>::value         , is_class_or_union<T>::value       // However, not doing this on non-conforming compilers prevents       // a dependency recursion.      >::value));#endif#if BOOST_WORKAROUND(__BORLANDC__, < 0x600)    typedef ::boost::detail::is_enum_helper<          ::boost::detail::is_enum_impl<T>::selector        > se_t;#else    typedef ::boost::detail::is_enum_helper<selector> se_t;#endif    typedef typename se_t::template type<r_type> helper;    BOOST_STATIC_CONSTANT(bool, value = helper::value);};// these help on compilers with no partial specialization support:BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_enum,void,false)#ifndef BOOST_NO_CV_VOID_SPECIALIZATIONSBOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_enum,void const,false)BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_enum,void volatile,false)BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_enum,void const volatile,false)#endif} // namespace detailBOOST_TT_AUX_BOOL_TRAIT_DEF1(is_enum,T,::boost::detail::is_enum_impl<T>::value)#else // __BORLANDC__//// buggy is_convertible prevents working// implementation of is_enum:BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_enum,T,false)#endif} // namespace boost#include "boost/type_traits/detail/bool_trait_undef.hpp"#endif // BOOST_TT_IS_ENUM_HPP_INCLUDED

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?