1 | #ifndef BOOST_TYPE_TRAITS_IS_NOTHROW_SWAPPABLE_HPP_INCLUDED |
2 | #define BOOST_TYPE_TRAITS_IS_NOTHROW_SWAPPABLE_HPP_INCLUDED |
3 | |
4 | // Copyright 2017 Peter Dimov |
5 | // |
6 | // Distributed under the Boost Software License, Version 1.0. |
7 | // See accompanying file LICENSE_1_0.txt or copy at |
8 | // http://www.boost.org/LICENSE_1_0.txt |
9 | |
10 | #include <boost/config.hpp> |
11 | #include <boost/config/workaround.hpp> |
12 | |
13 | #if defined(BOOST_NO_SFINAE_EXPR) || defined(BOOST_NO_CXX11_NOEXCEPT) || defined(BOOST_NO_CXX11_DECLTYPE) \ |
14 | || defined(BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS) || BOOST_WORKAROUND(BOOST_GCC, < 40700) |
15 | |
16 | #include <boost/type_traits/is_scalar.hpp> |
17 | #include <boost/type_traits/is_const.hpp> |
18 | #include <boost/type_traits/integral_constant.hpp> |
19 | |
20 | namespace boost |
21 | { |
22 | template <class T> struct is_nothrow_swappable : boost::integral_constant<bool, |
23 | boost::is_scalar<T>::value && !boost::is_const<T>::value> {}; |
24 | |
25 | template <class T, class U> struct is_nothrow_swappable_with : false_type {}; |
26 | template <class T> struct is_nothrow_swappable_with<T, T> : is_nothrow_swappable<T> {}; |
27 | } |
28 | |
29 | #else |
30 | |
31 | #include <boost/type_traits/declval.hpp> |
32 | #include <boost/type_traits/integral_constant.hpp> |
33 | #include <algorithm> |
34 | |
35 | namespace boost |
36 | { |
37 | |
38 | namespace type_traits_swappable_detail |
39 | { |
40 | |
41 | using std::swap; |
42 | |
43 | template<class T, class U, bool B = noexcept(swap(declval<T>(), declval<U>()))> integral_constant<bool, B> is_nothrow_swappable_with_impl( int ); |
44 | template<class T, class U> false_type is_nothrow_swappable_with_impl( ... ); |
45 | template<class T, class U> |
46 | struct is_nothrow_swappable_with_helper { typedef decltype( type_traits_swappable_detail::is_nothrow_swappable_with_impl<T, U>(0) ) type; }; |
47 | |
48 | template<class T, bool B = noexcept(swap(declval<T&>(), declval<T&>()))> integral_constant<bool, B> is_nothrow_swappable_impl( int ); |
49 | template<class T> false_type is_nothrow_swappable_impl( ... ); |
50 | template<class T> |
51 | struct is_nothrow_swappable_helper { typedef decltype( type_traits_swappable_detail::is_nothrow_swappable_impl<T>(0) ) type; }; |
52 | |
53 | } // namespace type_traits_swappable_detail |
54 | |
55 | template<class T, class U> struct is_nothrow_swappable_with: type_traits_swappable_detail::is_nothrow_swappable_with_helper<T, U>::type |
56 | { |
57 | }; |
58 | |
59 | template<class T> struct is_nothrow_swappable: type_traits_swappable_detail::is_nothrow_swappable_helper<T>::type |
60 | { |
61 | }; |
62 | |
63 | } // namespace boost |
64 | |
65 | #endif |
66 | |
67 | #endif // #ifndef BOOST_TYPE_TRAITS_IS_NOTHROW_SWAPPABLE_HPP_INCLUDED |
68 | |