is_empty.hpp

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

HPP
208
字号
// (C) Copyright 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_EMPTY_HPP_INCLUDED#define BOOST_TT_IS_EMPTY_HPP_INCLUDED#include "boost/type_traits/is_convertible.hpp"#include "boost/type_traits/detail/ice_or.hpp"#include "boost/type_traits/config.hpp"#include "boost/type_traits/intrinsics.hpp"#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION#   include "boost/type_traits/remove_cv.hpp"#   include "boost/type_traits/is_class.hpp"#   include "boost/type_traits/add_reference.hpp"#else#   include "boost/type_traits/is_reference.hpp"#   include "boost/type_traits/is_pointer.hpp"#   include "boost/type_traits/is_member_pointer.hpp"#   include "boost/type_traits/is_array.hpp"#   include "boost/type_traits/is_void.hpp"#   include "boost/type_traits/detail/ice_and.hpp"#   include "boost/type_traits/detail/ice_not.hpp"#endif// should be always the last #include directive#include "boost/type_traits/detail/bool_trait_def.hpp"namespace boost {namespace detail {#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATIONtemplate <typename T>struct empty_helper_t1 : public T{    empty_helper_t1();  // hh compiler bug workaround    int i[256];};struct empty_helper_t2 { int i[256]; };#if !BOOST_WORKAROUND(__BORLANDC__, < 0x600)template <typename T, bool is_a_class = false>struct empty_helper{    BOOST_STATIC_CONSTANT(bool, value = false);};template <typename T>struct empty_helper<T, true>{    BOOST_STATIC_CONSTANT(        bool, value = (sizeof(empty_helper_t1<T>) == sizeof(empty_helper_t2))        );};template <typename T>struct is_empty_impl{    typedef typename remove_cv<T>::type cvt;    BOOST_STATIC_CONSTANT(        bool, value = (            ::boost::type_traits::ice_or<              ::boost::detail::empty_helper<cvt,::boost::is_class<T>::value>::value              , BOOST_IS_EMPTY(cvt)            >::value            ));};#else // __BORLANDC__template <typename T, bool is_a_class, bool convertible_to_int>struct empty_helper{    BOOST_STATIC_CONSTANT(bool, value = false);};template <typename T>struct empty_helper<T, true, false>{    BOOST_STATIC_CONSTANT(bool, value = (        sizeof(empty_helper_t1<T>) == sizeof(empty_helper_t2)        ));};template <typename T>struct is_empty_impl{   typedef typename remove_cv<T>::type cvt;   typedef typename add_reference<T>::type r_type;   BOOST_STATIC_CONSTANT(       bool, value = (           ::boost::type_traits::ice_or<              ::boost::detail::empty_helper<                  cvt                , ::boost::is_class<T>::value                , ::boost::is_convertible< r_type,int>::value              >::value              , BOOST_IS_EMPTY(cvt)           >::value));};#endif // __BORLANDC__#else // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION#ifdef BOOST_MSVC6_MEMBER_TEMPLATEStemplate <typename T>struct empty_helper_t1 : public T{   empty_helper_t1();   int i[256];};struct empty_helper_t2 { int i[256]; };template <typename T>struct empty_helper_base{   enum { value = (sizeof(empty_helper_t1<T>) == sizeof(empty_helper_t2)) };};template <typename T>struct empty_helper_nonbase{   enum { value = false };};template <bool base>struct empty_helper_chooser{   template <typename T> struct result_   {      typedef empty_helper_nonbase<T> type;   };};template <>struct empty_helper_chooser<true>{   template <typename T> struct result_   {      typedef empty_helper_base<T> type;   };};template <typename T>struct is_empty_impl{   typedef ::boost::detail::empty_helper_chooser<      ::boost::type_traits::ice_and<         ::boost::type_traits::ice_not< ::boost::is_reference<T>::value >::value,         ::boost::type_traits::ice_not< ::boost::is_convertible<T,double>::value >::value,         ::boost::type_traits::ice_not< ::boost::is_pointer<T>::value >::value,         ::boost::type_traits::ice_not< ::boost::is_member_pointer<T>::value >::value,         ::boost::type_traits::ice_not< ::boost::is_array<T>::value >::value,         ::boost::type_traits::ice_not< ::boost::is_void<T>::value >::value,         ::boost::type_traits::ice_not<            ::boost::is_convertible<T,void const volatile*>::value            >::value      >::value > chooser;   typedef typename chooser::template result_<T> result;   typedef typename result::type eh_type;   BOOST_STATIC_CONSTANT(bool, value =      (::boost::type_traits::ice_or<eh_type::value, BOOST_IS_EMPTY(T)>::value));};#elsetemplate <typename T> struct is_empty_impl{    BOOST_STATIC_CONSTANT(bool, value = BOOST_IS_EMPTY(T));};#endif  // BOOST_MSVC6_MEMBER_TEMPLATES#endif  // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION// these help when the compiler has no partial specialization support:BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_empty,void,false)#ifndef BOOST_NO_CV_VOID_SPECIALIZATIONSBOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_empty,void const,false)BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_empty,void volatile,false)BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_empty,void const volatile,false)#endif} // namespace detailBOOST_TT_AUX_BOOL_TRAIT_DEF1(is_empty,T,::boost::detail::is_empty_impl<T>::value)} // namespace boost#include "boost/type_traits/detail/bool_trait_undef.hpp"#endif // BOOST_TT_IS_EMPTY_HPP_INCLUDED

⌨️ 快捷键说明

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