1
2// (C) Copyright Dave Abrahams, Steve Cleary, Beman Dawes, Howard
3// Hinnant & John Maddock 2000.
4// Use, modification and distribution are subject to the Boost Software License,
5// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
6// http://www.boost.org/LICENSE_1_0.txt).
7//
8// See http://www.boost.org/libs/type_traits for most recent version including documentation.
9
10
11#ifndef BOOST_TT_REMOVE_CONST_HPP_INCLUDED
12#define BOOST_TT_REMOVE_CONST_HPP_INCLUDED
13
14#include <boost/type_traits/is_volatile.hpp>
15#include <boost/type_traits/detail/cv_traits_impl.hpp>
16#include <boost/config.hpp>
17#include <boost/detail/workaround.hpp>
18
19#include <cstddef>
20
21// should be the last #include
22#include <boost/type_traits/detail/type_trait_def.hpp>
23
24namespace boost {
25
26
27namespace detail {
28
29template <typename T, bool is_vol>
30struct remove_const_helper
31{
32 typedef T type;
33};
34
35template <typename T>
36struct remove_const_helper<T, true>
37{
38 typedef T volatile type;
39};
40
41
42template <typename T>
43struct remove_const_impl
44{
45 typedef typename remove_const_helper<
46 typename cv_traits_imp<BOOST_TT_AUX_CV_TRAITS_IMPL_PARAM(T)>::unqualified_type
47 , ::boost::is_volatile<T>::value
48 >::type type;
49};
50
51#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
52//
53// We can't filter out rvalue_references at the same level as
54// references or we get ambiguities from msvc:
55//
56template <typename T>
57struct remove_const_impl<T&&>
58{
59 typedef T&& type;
60};
61#endif
62
63} // namespace detail
64
65// * convert a type T to non-const type - remove_const<T>
66
67BOOST_TT_AUX_TYPE_TRAIT_DEF1(remove_const,T,typename boost::detail::remove_const_impl<T>::type)
68BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,remove_const,T&,T&)
69#if !defined(BOOST_NO_ARRAY_TYPE_SPECIALIZATIONS)
70BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_2(typename T,std::size_t N,remove_const,T const[N],T type[N])
71BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_2(typename T,std::size_t N,remove_const,T const volatile[N],T volatile type[N])
72#endif
73
74
75} // namespace boost
76
77#include <boost/type_traits/detail/type_trait_undef.hpp>
78
79#endif // BOOST_TT_REMOVE_CONST_HPP_INCLUDED
80