123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- // Copyright (C) 2017 Andrzej Krzemienski.
- //
- // Use, modification, and distribution is 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/optional for documentation.
- //
- // You are welcome to contact the author at:
- // akrzemi1@gmail.com
- #ifndef BOOST_OPTIONAL_DETAIL_EXPERIMENTAL_TRAITS_04NOV2017_HPP
- #define BOOST_OPTIONAL_DETAIL_EXPERIMENTAL_TRAITS_04NOV2017_HPP
- #include <boost/config.hpp>
- #include <boost/detail/workaround.hpp>
- #include <boost/predef.h>
- #include <boost/type_traits.hpp>
-
- // The condition to use POD implementation
- #ifdef BOOST_OPTIONAL_CONFIG_NO_POD_SPEC
- # define BOOST_OPTIONAL_DETAIL_NO_SPEC_FOR_TRIVIAL_TYPES
- #elif defined BOOST_OPTIONAL_CONFIG_NO_SPEC_FOR_TRIVIAL_TYPES
- # define BOOST_OPTIONAL_DETAIL_NO_SPEC_FOR_TRIVIAL_TYPES
- #elif !defined BOOST_HAS_TRIVIAL_CONSTRUCTOR
- # define BOOST_OPTIONAL_DETAIL_NO_SPEC_FOR_TRIVIAL_TYPES
- #elif !defined BOOST_HAS_TRIVIAL_MOVE_ASSIGN
- # define BOOST_OPTIONAL_DETAIL_NO_SPEC_FOR_TRIVIAL_TYPES
- #elif !defined BOOST_HAS_TRIVIAL_MOVE_CONSTRUCTOR
- # define BOOST_OPTIONAL_DETAIL_NO_SPEC_FOR_TRIVIAL_TYPES
- #elif !defined BOOST_HAS_TRIVIAL_COPY
- # define BOOST_OPTIONAL_DETAIL_NO_SPEC_FOR_TRIVIAL_TYPES
- #elif !defined BOOST_HAS_TRIVIAL_ASSIGN
- # define BOOST_OPTIONAL_DETAIL_NO_SPEC_FOR_TRIVIAL_TYPES
- #elif !defined BOOST_HAS_TRIVIAL_DESTRUCTOR
- # define BOOST_OPTIONAL_DETAIL_NO_SPEC_FOR_TRIVIAL_TYPES
- #elif BOOST_WORKAROUND(BOOST_GCC, < 50000)
- # define BOOST_OPTIONAL_DETAIL_NO_SPEC_FOR_TRIVIAL_TYPES
- #endif
- // GCC 5 or higher, or clang with libc++ or clang with libstdc++ 5 or higher
- #if __cplusplus >= 201103L
- # if BOOST_WORKAROUND(BOOST_GCC, >= 50000)
- # define BOOST_OPTIONAL_DETAIL_USE_STD_TYPE_TRAITS
- # elif (defined BOOST_CLANG)
- # if BOOST_LIB_STD_CXX > 0
- # define BOOST_OPTIONAL_DETAIL_USE_STD_TYPE_TRAITS
- # elif BOOST_LIB_STD_GNU >= 441200023 && BOOST_LIB_STD_GNU != 450600023 && BOOST_LIB_STD_GNU != 450600026 && BOOST_LIB_STD_GNU != 460800003 && BOOST_LIB_STD_GNU != 450400026 && BOOST_LIB_STD_GNU != 460700026
- # define BOOST_OPTIONAL_DETAIL_USE_STD_TYPE_TRAITS
- # endif
- # endif
- #endif
- #ifndef BOOST_OPTIONAL_DETAIL_USE_STD_TYPE_TRAITS
- # define BOOST_OPTIONAL_DETAIL_HAS_TRIVIAL_CTOR(T) BOOST_HAS_TRIVIAL_CONSTRUCTOR(T)
- #else
- # include <type_traits>
- # define BOOST_OPTIONAL_DETAIL_HAS_TRIVIAL_CTOR(T) std::is_trivially_default_constructible<T>::value
- #endif
-
-
- namespace boost { namespace optional_detail {
-
- #ifndef BOOST_OPTIONAL_DETAIL_NO_SPEC_FOR_TRIVIAL_TYPES
- template <typename T>
- struct is_type_trivially_copyable
- : boost::conditional<(boost::has_trivial_copy_constructor<T>::value &&
- boost::has_trivial_move_constructor<T>::value &&
- boost::has_trivial_destructor<T>::value &&
- boost::has_trivial_move_assign<T>::value &&
- boost::has_trivial_assign<T>::value),
- boost::true_type, boost::false_type>::type
- {};
- #else
- template <typename T>
- struct is_type_trivially_copyable
- : boost::conditional<(boost::is_scalar<T>::value && !boost::is_const<T>::value && !boost::is_volatile<T>::value),
- boost::true_type, boost::false_type>::type
- {};
- #endif
- #ifndef BOOST_OPTIONAL_DETAIL_NO_SPEC_FOR_TRIVIAL_TYPES
- template <typename T>
- struct optional_uses_direct_storage_for_
- : boost::conditional< (is_type_trivially_copyable<T>::value && BOOST_OPTIONAL_DETAIL_HAS_TRIVIAL_CTOR(T)) ||
- (boost::is_scalar<T>::value && !boost::is_const<T>::value && !boost::is_volatile<T>::value)
- , boost::true_type, boost::false_type>::type
- {};
- #else
- template <typename T>
- struct optional_uses_direct_storage_for_
- : boost::conditional<(boost::is_scalar<T>::value && !boost::is_const<T>::value && !boost::is_volatile<T>::value)
- , boost::true_type, boost::false_type>::type
- {};
- #endif
- }} // boost::optional_detail
- #endif
|