diff options
Diffstat (limited to 'src/third_party/boost-1.69.0/boost/container/detail/container_rebind.hpp')
-rw-r--r-- | src/third_party/boost-1.69.0/boost/container/detail/container_rebind.hpp | 258 |
1 files changed, 258 insertions, 0 deletions
diff --git a/src/third_party/boost-1.69.0/boost/container/detail/container_rebind.hpp b/src/third_party/boost-1.69.0/boost/container/detail/container_rebind.hpp new file mode 100644 index 00000000000..0ebb4789e40 --- /dev/null +++ b/src/third_party/boost-1.69.0/boost/container/detail/container_rebind.hpp @@ -0,0 +1,258 @@ +////////////////////////////////////////////////////////////////////////////// +// +// (C) Copyright Ion Gaztanaga 2017-2017. Distributed under 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/container for documentation. +// +////////////////////////////////////////////////////////////////////////////// +#ifndef BOOST_CONTAINER_DETAIL_CONTAINER_REBIND_HPP +#define BOOST_CONTAINER_DETAIL_CONTAINER_REBIND_HPP + +#ifndef BOOST_CONFIG_HPP +# include <boost/config.hpp> +#endif + +#if defined(BOOST_HAS_PRAGMA_ONCE) +# pragma once +#endif + +#include <boost/container/allocator_traits.hpp> + + +namespace boost { +namespace container { +namespace dtl { + + template <class Cont, class U> + struct container_rebind; + +#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) + + template <template <class, class, class...> class Cont, typename V, typename A, class... An, class U> + struct container_rebind<Cont<V, A, An...>, U> + { + typedef Cont<U, typename allocator_traits<A>::template portable_rebind_alloc<U>::type, An...> type; + }; + + //Needed for non-conforming compilers like GCC 4.3 + template <template <class, class> class Cont, typename V, typename A, class U> + struct container_rebind<Cont<V, A>, U> + { + typedef Cont<U, typename allocator_traits<A>::template portable_rebind_alloc<U>::type> type; + }; + + template <template <class> class Cont, typename V, class U> + struct container_rebind<Cont<V>, U> + { + typedef Cont<U> type; + }; + + //for small_vector,static_vector + + template <template <class, std::size_t, class, class...> class Cont, typename V, std::size_t N, typename A, class... An, class U> + struct container_rebind<Cont<V, N, A, An...>, U> + { + typedef Cont<U, N, typename allocator_traits<A>::template portable_rebind_alloc<U>::type, An...> type; + }; + + //Needed for non-conforming compilers like GCC 4.3 + template <template <class, std::size_t, class> class Cont, typename V, std::size_t N, typename A, class U> + struct container_rebind<Cont<V, N, A>, U> + { + typedef Cont<U, N, typename allocator_traits<A>::template portable_rebind_alloc<U>::type> type; + }; + + template <template <class, std::size_t> class Cont, typename V, std::size_t N, class U> + struct container_rebind<Cont<V, N>, U> + { + typedef Cont<U, N> type; + }; + +#else //C++03 compilers + + template <template <class> class Cont //0arg + , typename V + , class U> + struct container_rebind<Cont<V>, U> + { + typedef Cont<U> type; + }; + + template <template <class, class> class Cont //0arg + , typename V, typename A + , class U> + struct container_rebind<Cont<V, A>, U> + { + typedef Cont<U, typename allocator_traits<A>::template portable_rebind_alloc<U>::type> type; + }; + + template <template <class, class, class> class Cont //1arg + , typename V, typename A, class P0 + , class U> + struct container_rebind<Cont<V, A, P0>, U> + { + typedef Cont<U, typename allocator_traits<A>::template portable_rebind_alloc<U>::type, P0> type; + }; + + template <template <class, class, class, class> class Cont //2arg + , typename V, typename A, class P0, class P1 + , class U> + struct container_rebind<Cont<V, A, P0, P1>, U> + { + typedef Cont<U, typename allocator_traits<A>::template portable_rebind_alloc<U>::type, P0, P1> type; + }; + + template <template <class, class, class, class, class> class Cont //3arg + , typename V, typename A, class P0, class P1, class P2 + , class U> + struct container_rebind<Cont<V, A, P0, P1, P2>, U> + { + typedef Cont<U, typename allocator_traits<A>::template portable_rebind_alloc<U>::type, P0, P1, P2> type; + }; + + template <template <class, class, class, class, class, class> class Cont //4arg + , typename V, typename A, class P0, class P1, class P2, class P3 + , class U> + struct container_rebind<Cont<V, A, P0, P1, P2, P3>, U> + { + typedef Cont<U, typename allocator_traits<A>::template portable_rebind_alloc<U>::type, P0, P1, P2, P3> type; + }; + + template <template <class, class, class, class, class, class, class> class Cont //5arg + , typename V, typename A, class P0, class P1, class P2, class P3, class P4 + , class U> + struct container_rebind<Cont<V, A, P0, P1, P2, P3, P4>, U> + { + typedef Cont<U, typename allocator_traits<A>::template portable_rebind_alloc<U>::type, P0, P1, P2, P3, P4> type; + }; + + template <template <class, class, class, class, class, class, class, class> class Cont //6arg + , typename V, typename A, class P0, class P1, class P2, class P3, class P4, class P5 + , class U> + struct container_rebind<Cont<V, A, P0, P1, P2, P3, P4, P5>, U> + { + typedef Cont<U, typename allocator_traits<A>::template portable_rebind_alloc<U>::type, P0, P1, P2, P3, P4, P5> type; + }; + + template <template <class, class, class, class, class, class, class, class, class> class Cont //7arg + , typename V, typename A, class P0, class P1, class P2, class P3, class P4, class P5, class P6 + , class U> + struct container_rebind<Cont<V, A, P0, P1, P2, P3, P4, P5, P6>, U> + { + typedef Cont<U, typename allocator_traits<A>::template portable_rebind_alloc<U>::type, P0, P1, P2, P3, P4, P5, P6> type; + }; + + template <template <class, class, class, class, class, class, class, class, class, class> class Cont //8arg + , typename V, typename A, class P0, class P1, class P2, class P3, class P4, class P5, class P6, class P7 + , class U> + struct container_rebind<Cont<V, A, P0, P1, P2, P3, P4, P5, P6, P7>, U> + { + typedef Cont<U, typename allocator_traits<A>::template portable_rebind_alloc<U>::type, P0, P1, P2, P3, P4, P5, P6, P7> type; + }; + + template <template <class, class, class, class, class, class, class, class, class, class, class> class Cont //9arg + , typename V, typename A, class P0, class P1, class P2, class P3, class P4, class P5, class P6, class P7, class P8 + , class U> + struct container_rebind<Cont<V, A, P0, P1, P2, P3, P4, P5, P6, P7, P8>, U> + { + typedef Cont<U, typename allocator_traits<A>::template portable_rebind_alloc<U>::type, P0, P1, P2, P3, P4, P5, P6, P7, P8> type; + }; + + //For small_vector/static_vector + template <template <class, std::size_t> class Cont //0arg + , typename V, std::size_t N + , class U> + struct container_rebind<Cont<V, N>, U> + { + typedef Cont<U, N> type; + }; + + template <template <class, std::size_t, class> class Cont //0arg + , typename V, std::size_t N, typename A + , class U> + struct container_rebind<Cont<V, N, A>, U> + { + typedef Cont<U, N, typename allocator_traits<A>::template portable_rebind_alloc<U>::type> type; + }; + + template <template <class, std::size_t, class, class> class Cont //1arg + , typename V, std::size_t N, typename A, class P0 + , class U> + struct container_rebind<Cont<V, N, A, P0>, U> + { + typedef Cont<U, N, typename allocator_traits<A>::template portable_rebind_alloc<U>::type, P0> type; + }; + + template <template <class, std::size_t, class, class, class> class Cont //2arg + , typename V, std::size_t N, typename A, class P0, class P1 + , class U> + struct container_rebind<Cont<V, N, A, P0, P1>, U> + { + typedef Cont<U, N, typename allocator_traits<A>::template portable_rebind_alloc<U>::type, P0, P1> type; + }; + + template <template <class, std::size_t, class, class, class, class> class Cont //3arg + , typename V, std::size_t N, typename A, class P0, class P1, class P2 + , class U> + struct container_rebind<Cont<V, N, A, P0, P1, P2>, U> + { + typedef Cont<U, N, typename allocator_traits<A>::template portable_rebind_alloc<U>::type, P0, P1, P2> type; + }; + + template <template <class, std::size_t, class, class, class, class, class> class Cont //4arg + , typename V, std::size_t N, typename A, class P0, class P1, class P2, class P3 + , class U> + struct container_rebind<Cont<V, N, A, P0, P1, P2, P3>, U> + { + typedef Cont<U, N, typename allocator_traits<A>::template portable_rebind_alloc<U>::type, P0, P1, P2, P3> type; + }; + + template <template <class, std::size_t, class, class, class, class, class, class> class Cont //5arg + , typename V, std::size_t N, typename A, class P0, class P1, class P2, class P3, class P4 + , class U> + struct container_rebind<Cont<V, N, A, P0, P1, P2, P3, P4>, U> + { + typedef Cont<U, N, typename allocator_traits<A>::template portable_rebind_alloc<U>::type, P0, P1, P2, P3, P4> type; + }; + + template <template <class, std::size_t, class, class, class, class, class, class, class> class Cont //6arg + , typename V, std::size_t N, typename A, class P0, class P1, class P2, class P3, class P4, class P5 + , class U> + struct container_rebind<Cont<V, N, A, P0, P1, P2, P3, P4, P5>, U> + { + typedef Cont<U, N, typename allocator_traits<A>::template portable_rebind_alloc<U>::type, P0, P1, P2, P3, P4, P5> type; + }; + + template <template <class, std::size_t, class, class, class, class, class, class, class, class> class Cont //7arg + , typename V, std::size_t N, typename A, class P0, class P1, class P2, class P3, class P4, class P5, class P6 + , class U> + struct container_rebind<Cont<V, N, A, P0, P1, P2, P3, P4, P5, P6>, U> + { + typedef Cont<U, N, typename allocator_traits<A>::template portable_rebind_alloc<U>::type, P0, P1, P2, P3, P4, P5, P6> type; + }; + + template <template <class, std::size_t, class, class, class, class, class, class, class, class, class> class Cont //8arg + , typename V, std::size_t N, typename A, class P0, class P1, class P2, class P3, class P4, class P5, class P6, class P7 + , class U> + struct container_rebind<Cont<V, N, A, P0, P1, P2, P3, P4, P5, P6, P7>, U> + { + typedef Cont<U, N, typename allocator_traits<A>::template portable_rebind_alloc<U>::type, P0, P1, P2, P3, P4, P5, P6, P7> type; + }; + + template <template <class, std::size_t, class, class, class, class, class, class, class, class, class, class> class Cont //9arg + , typename V, std::size_t N, typename A, class P0, class P1, class P2, class P3, class P4, class P5, class P6, class P7, class P8 + , class U> + struct container_rebind<Cont<V, N, A, P0, P1, P2, P3, P4, P5, P6, P7, P8>, U> + { + typedef Cont<U, N, typename allocator_traits<A>::template portable_rebind_alloc<U>::type, P0, P1, P2, P3, P4, P5, P6, P7, P8> type; + }; + +#endif //!defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) + +} //namespace dtl { +} //namespace container { +} //namespace boost { + +#endif //#ifndef BOOST_CONTAINER_DETAIL_CONTAINER_REBIND_HPP |