diff options
Diffstat (limited to 'boost/optional/detail/experimental_traits.hpp')
-rw-r--r-- | boost/optional/detail/experimental_traits.hpp | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/boost/optional/detail/experimental_traits.hpp b/boost/optional/detail/experimental_traits.hpp new file mode 100644 index 0000000000..6eded5886e --- /dev/null +++ b/boost/optional/detail/experimental_traits.hpp @@ -0,0 +1,98 @@ +// 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/type_traits.hpp> + +namespace boost { namespace optional_detail { + +// 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 + +#if __cplusplus >= 201103L +# if BOOST_WORKAROUND(BOOST_GCC, >= 50000) +# define BOOST_OPTIONAL_DETAIL_USE_STD_TYPE_TRAITS +# elif (defined BOOST_CLANG) +# define BOOST_OPTIONAL_DETAIL_USE_STD_TYPE_TRAITS +# endif +#endif + + +#ifndef BOOST_OPTIONAL_DETAIL_USE_STD_TYPE_TRAITS +# define BOOST_OPTIONAL_DETAIL_HAS_TRIVIAL_CTOR(T) BOOST_HAS_TRIVIAL_CONSTRUCTOR(T) +#else +# define BOOST_OPTIONAL_DETAIL_HAS_TRIVIAL_CTOR(T) std::is_trivially_default_constructible<T>::value +#endif + + + +#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 |