mirror of https://github.com/trapexit/mergerfs.git
Antonio SJ Musumeci
10 months ago
2054 changed files with 473146 additions and 1 deletions
-
69src/boost/bind/arg.hpp
-
2346src/boost/bind/bind.hpp
-
117src/boost/bind/bind_cc.hpp
-
228src/boost/bind/bind_mf2_cc.hpp
-
441src/boost/bind/bind_mf_cc.hpp
-
345src/boost/bind/bind_template.hpp
-
36src/boost/bind/detail/is_same.hpp
-
22src/boost/bind/detail/requires_cxx11.hpp
-
165src/boost/bind/detail/result_traits.hpp
-
404src/boost/bind/mem_fn.hpp
-
103src/boost/bind/mem_fn_cc.hpp
-
1047src/boost/bind/mem_fn_template.hpp
-
130src/boost/bind/mem_fn_vw.hpp
-
74src/boost/bind/placeholders.hpp
-
40src/boost/bind/std_placeholders.hpp
-
476src/boost/bind/storage.hpp
-
20src/boost/call_traits.hpp
-
502src/boost/container/allocator_traits.hpp
-
388src/boost/container/container_fwd.hpp
-
33src/boost/container/detail/addressof.hpp
-
542src/boost/container/detail/advanced_insert_int.hpp
-
185src/boost/container/detail/algorithm.hpp
-
60src/boost/container/detail/alloc_helpers.hpp
-
58src/boost/container/detail/allocation_type.hpp
-
162src/boost/container/detail/allocator_version_traits.hpp
-
134src/boost/container/detail/compare_functors.hpp
-
61src/boost/container/detail/config_begin.hpp
-
16src/boost/container/detail/config_end.hpp
-
98src/boost/container/detail/construct_in_place.hpp
-
53src/boost/container/detail/container_or_allocator_rebind.hpp
-
163src/boost/container/detail/container_rebind.hpp
-
1982src/boost/container/detail/copy_move_algo.hpp
-
502src/boost/container/detail/destroyers.hpp
-
1711src/boost/container/detail/flat_tree.hpp
-
72src/boost/container/detail/is_container.hpp
-
82src/boost/container/detail/is_contiguous_container.hpp
-
91src/boost/container/detail/is_pair.hpp
-
57src/boost/container/detail/is_sorted.hpp
-
94src/boost/container/detail/iterator.hpp
-
910src/boost/container/detail/iterators.hpp
-
37src/boost/container/detail/min_max.hpp
-
32src/boost/container/detail/minimal_char_traits_header.hpp
-
144src/boost/container/detail/mpl.hpp
-
307src/boost/container/detail/multiallocation_chain.hpp
-
98src/boost/container/detail/next_capacity.hpp
-
604src/boost/container/detail/node_alloc_holder.hpp
-
607src/boost/container/detail/pair.hpp
-
55src/boost/container/detail/pair_key_mapped_of_value.hpp
-
24src/boost/container/detail/placement_new.hpp
-
62src/boost/container/detail/std_fwd.hpp
-
180src/boost/container/detail/transform_iterator.hpp
-
1437src/boost/container/detail/tree.hpp
-
75src/boost/container/detail/type_traits.hpp
-
32src/boost/container/detail/value_functors.hpp
-
51src/boost/container/detail/value_init.hpp
-
163src/boost/container/detail/variadic_templates_tools.hpp
-
101src/boost/container/detail/version_type.hpp
-
190src/boost/container/detail/workaround.hpp
-
3067src/boost/container/flat_map.hpp
-
2315src/boost/container/map.hpp
-
201src/boost/container/new_allocator.hpp
-
445src/boost/container/node_handle.hpp
-
671src/boost/container/options.hpp
-
3625src/boost/container/string.hpp
-
295src/boost/container/throw_exception.hpp
-
3188src/boost/container/vector.hpp
-
126src/boost/core/demangle.hpp
-
128src/boost/core/enable_if.hpp
-
93src/boost/core/invoke_swap.hpp
-
345src/boost/core/ref.hpp
-
167src/boost/core/typeinfo.hpp
-
17src/boost/core/use_default.hpp
-
193src/boost/detail/allocator_utilities.hpp
-
21src/boost/detail/atomic_count.hpp
-
172src/boost/detail/call_traits.hpp
-
195src/boost/detail/indirect_traits.hpp
-
273src/boost/detail/interlocked.hpp
-
22src/boost/detail/lightweight_mutex.hpp
-
36src/boost/detail/select_type.hpp
-
74src/boost/detail/templated_streams.hpp
-
116src/boost/flyweight/assoc_container_factory.hpp
-
35src/boost/flyweight/assoc_container_factory_fwd.hpp
-
79src/boost/flyweight/detail/archive_constructed.hpp
-
84src/boost/flyweight/detail/default_value_policy.hpp
-
114src/boost/flyweight/detail/dyn_perfect_fwd.hpp
-
312src/boost/flyweight/detail/flyweight_core.hpp
-
65src/boost/flyweight/detail/is_placeholder_expr.hpp
-
39src/boost/flyweight/detail/nested_xxx_if_not_ph.hpp
-
63src/boost/flyweight/detail/not_placeholder_expr.hpp
-
90src/boost/flyweight/detail/perfect_fwd.hpp
-
172src/boost/flyweight/detail/pp_perfect_fwd.hpp
-
148src/boost/flyweight/detail/recursive_lw_mutex.hpp
-
98src/boost/flyweight/detail/serialization_helper.hpp
-
50src/boost/flyweight/detail/value_tag.hpp
-
44src/boost/flyweight/factory_tag.hpp
-
501src/boost/flyweight/flyweight.hpp
-
215src/boost/flyweight/flyweight_fwd.hpp
-
125src/boost/flyweight/hashed_factory.hpp
-
40src/boost/flyweight/hashed_factory_fwd.hpp
-
44src/boost/flyweight/holder_tag.hpp
@ -0,0 +1,69 @@ |
|||
#ifndef BOOST_BIND_ARG_HPP_INCLUDED
|
|||
#define BOOST_BIND_ARG_HPP_INCLUDED
|
|||
|
|||
// MS compatible compilers support #pragma once
|
|||
|
|||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
|
|||
# pragma once
|
|||
#endif
|
|||
|
|||
//
|
|||
// bind/arg.hpp
|
|||
//
|
|||
// Copyright (c) 2002 Peter Dimov and Multi Media Ltd.
|
|||
//
|
|||
// 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/bind/bind.html for documentation.
|
|||
//
|
|||
|
|||
#include <boost/config.hpp>
|
|||
#include <boost/is_placeholder.hpp>
|
|||
|
|||
namespace boost |
|||
{ |
|||
|
|||
template<bool Eq> struct _arg_eq |
|||
{ |
|||
}; |
|||
|
|||
template<> struct _arg_eq<true> |
|||
{ |
|||
typedef void type; |
|||
}; |
|||
|
|||
template< int I > struct arg |
|||
{ |
|||
BOOST_CONSTEXPR arg() |
|||
{ |
|||
} |
|||
|
|||
template< class T > BOOST_CONSTEXPR arg( T const & /* t */, typename _arg_eq< I == is_placeholder<T>::value >::type * = 0 ) |
|||
{ |
|||
} |
|||
}; |
|||
|
|||
template< int I > BOOST_CONSTEXPR bool operator==( arg<I> const &, arg<I> const & ) |
|||
{ |
|||
return true; |
|||
} |
|||
|
|||
#if !defined( BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION )
|
|||
|
|||
template< int I > struct is_placeholder< arg<I> > |
|||
{ |
|||
enum _vt { value = I }; |
|||
}; |
|||
|
|||
template< int I > struct is_placeholder< arg<I> (*) () > |
|||
{ |
|||
enum _vt { value = I }; |
|||
}; |
|||
|
|||
#endif
|
|||
|
|||
} // namespace boost
|
|||
|
|||
#endif // #ifndef BOOST_BIND_ARG_HPP_INCLUDED
|
2346
src/boost/bind/bind.hpp
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,117 @@ |
|||
//
|
|||
// bind/bind_cc.hpp - support for different calling conventions
|
|||
//
|
|||
// Do not include this header directly.
|
|||
//
|
|||
// Copyright (c) 2001 Peter Dimov and Multi Media Ltd.
|
|||
//
|
|||
// 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/bind/bind.html for documentation.
|
|||
//
|
|||
|
|||
template<class R> |
|||
_bi::bind_t<R, BOOST_BIND_ST R (BOOST_BIND_CC *) () BOOST_BIND_NOEXCEPT, _bi::list0> |
|||
BOOST_BIND(BOOST_BIND_ST R (BOOST_BIND_CC *f) () BOOST_BIND_NOEXCEPT) |
|||
{ |
|||
typedef BOOST_BIND_ST R (BOOST_BIND_CC *F) () BOOST_BIND_NOEXCEPT; |
|||
typedef _bi::list0 list_type; |
|||
return _bi::bind_t<R, F, list_type> (f, list_type()); |
|||
} |
|||
|
|||
template<class R, class B1, class A1> |
|||
_bi::bind_t<R, BOOST_BIND_ST R (BOOST_BIND_CC *) (B1) BOOST_BIND_NOEXCEPT, typename _bi::list_av_1<A1>::type> |
|||
BOOST_BIND(BOOST_BIND_ST R (BOOST_BIND_CC *f) (B1) BOOST_BIND_NOEXCEPT, A1 a1) |
|||
{ |
|||
typedef BOOST_BIND_ST R (BOOST_BIND_CC *F) (B1) BOOST_BIND_NOEXCEPT; |
|||
typedef typename _bi::list_av_1<A1>::type list_type; |
|||
return _bi::bind_t<R, F, list_type> (f, list_type(a1)); |
|||
} |
|||
|
|||
template<class R, class B1, class B2, class A1, class A2> |
|||
_bi::bind_t<R, BOOST_BIND_ST R (BOOST_BIND_CC *) (B1, B2) BOOST_BIND_NOEXCEPT, typename _bi::list_av_2<A1, A2>::type> |
|||
BOOST_BIND(BOOST_BIND_ST R (BOOST_BIND_CC *f) (B1, B2) BOOST_BIND_NOEXCEPT, A1 a1, A2 a2) |
|||
{ |
|||
typedef BOOST_BIND_ST R (BOOST_BIND_CC *F) (B1, B2) BOOST_BIND_NOEXCEPT; |
|||
typedef typename _bi::list_av_2<A1, A2>::type list_type; |
|||
return _bi::bind_t<R, F, list_type> (f, list_type(a1, a2)); |
|||
} |
|||
|
|||
template<class R, |
|||
class B1, class B2, class B3, |
|||
class A1, class A2, class A3> |
|||
_bi::bind_t<R, BOOST_BIND_ST R (BOOST_BIND_CC *) (B1, B2, B3) BOOST_BIND_NOEXCEPT, typename _bi::list_av_3<A1, A2, A3>::type> |
|||
BOOST_BIND(BOOST_BIND_ST R (BOOST_BIND_CC *f) (B1, B2, B3) BOOST_BIND_NOEXCEPT, A1 a1, A2 a2, A3 a3) |
|||
{ |
|||
typedef BOOST_BIND_ST R (BOOST_BIND_CC *F) (B1, B2, B3) BOOST_BIND_NOEXCEPT; |
|||
typedef typename _bi::list_av_3<A1, A2, A3>::type list_type; |
|||
return _bi::bind_t<R, F, list_type>(f, list_type(a1, a2, a3)); |
|||
} |
|||
|
|||
template<class R, |
|||
class B1, class B2, class B3, class B4, |
|||
class A1, class A2, class A3, class A4> |
|||
_bi::bind_t<R, BOOST_BIND_ST R (BOOST_BIND_CC *) (B1, B2, B3, B4) BOOST_BIND_NOEXCEPT, typename _bi::list_av_4<A1, A2, A3, A4>::type> |
|||
BOOST_BIND(BOOST_BIND_ST R (BOOST_BIND_CC *f) (B1, B2, B3, B4) BOOST_BIND_NOEXCEPT, A1 a1, A2 a2, A3 a3, A4 a4) |
|||
{ |
|||
typedef BOOST_BIND_ST R (BOOST_BIND_CC *F) (B1, B2, B3, B4) BOOST_BIND_NOEXCEPT; |
|||
typedef typename _bi::list_av_4<A1, A2, A3, A4>::type list_type; |
|||
return _bi::bind_t<R, F, list_type>(f, list_type(a1, a2, a3, a4)); |
|||
} |
|||
|
|||
template<class R, |
|||
class B1, class B2, class B3, class B4, class B5, |
|||
class A1, class A2, class A3, class A4, class A5> |
|||
_bi::bind_t<R, BOOST_BIND_ST R (BOOST_BIND_CC *) (B1, B2, B3, B4, B5) BOOST_BIND_NOEXCEPT, typename _bi::list_av_5<A1, A2, A3, A4, A5>::type> |
|||
BOOST_BIND(BOOST_BIND_ST R (BOOST_BIND_CC *f) (B1, B2, B3, B4, B5) BOOST_BIND_NOEXCEPT, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) |
|||
{ |
|||
typedef BOOST_BIND_ST R (BOOST_BIND_CC *F) (B1, B2, B3, B4, B5) BOOST_BIND_NOEXCEPT; |
|||
typedef typename _bi::list_av_5<A1, A2, A3, A4, A5>::type list_type; |
|||
return _bi::bind_t<R, F, list_type>(f, list_type(a1, a2, a3, a4, a5)); |
|||
} |
|||
|
|||
template<class R, |
|||
class B1, class B2, class B3, class B4, class B5, class B6, |
|||
class A1, class A2, class A3, class A4, class A5, class A6> |
|||
_bi::bind_t<R, BOOST_BIND_ST R (BOOST_BIND_CC *) (B1, B2, B3, B4, B5, B6) BOOST_BIND_NOEXCEPT, typename _bi::list_av_6<A1, A2, A3, A4, A5, A6>::type> |
|||
BOOST_BIND(BOOST_BIND_ST R (BOOST_BIND_CC *f) (B1, B2, B3, B4, B5, B6) BOOST_BIND_NOEXCEPT, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) |
|||
{ |
|||
typedef BOOST_BIND_ST R (BOOST_BIND_CC *F) (B1, B2, B3, B4, B5, B6) BOOST_BIND_NOEXCEPT; |
|||
typedef typename _bi::list_av_6<A1, A2, A3, A4, A5, A6>::type list_type; |
|||
return _bi::bind_t<R, F, list_type>(f, list_type(a1, a2, a3, a4, a5, a6)); |
|||
} |
|||
|
|||
template<class R, |
|||
class B1, class B2, class B3, class B4, class B5, class B6, class B7, |
|||
class A1, class A2, class A3, class A4, class A5, class A6, class A7> |
|||
_bi::bind_t<R, BOOST_BIND_ST R (BOOST_BIND_CC *) (B1, B2, B3, B4, B5, B6, B7) BOOST_BIND_NOEXCEPT, typename _bi::list_av_7<A1, A2, A3, A4, A5, A6, A7>::type> |
|||
BOOST_BIND(BOOST_BIND_ST R (BOOST_BIND_CC *f) (B1, B2, B3, B4, B5, B6, B7) BOOST_BIND_NOEXCEPT, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) |
|||
{ |
|||
typedef BOOST_BIND_ST R (BOOST_BIND_CC *F) (B1, B2, B3, B4, B5, B6, B7) BOOST_BIND_NOEXCEPT; |
|||
typedef typename _bi::list_av_7<A1, A2, A3, A4, A5, A6, A7>::type list_type; |
|||
return _bi::bind_t<R, F, list_type>(f, list_type(a1, a2, a3, a4, a5, a6, a7)); |
|||
} |
|||
|
|||
template<class R, |
|||
class B1, class B2, class B3, class B4, class B5, class B6, class B7, class B8, |
|||
class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8> |
|||
_bi::bind_t<R, BOOST_BIND_ST R (BOOST_BIND_CC *) (B1, B2, B3, B4, B5, B6, B7, B8) BOOST_BIND_NOEXCEPT, typename _bi::list_av_8<A1, A2, A3, A4, A5, A6, A7, A8>::type> |
|||
BOOST_BIND(BOOST_BIND_ST R (BOOST_BIND_CC *f) (B1, B2, B3, B4, B5, B6, B7, B8) BOOST_BIND_NOEXCEPT, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8) |
|||
{ |
|||
typedef BOOST_BIND_ST R (BOOST_BIND_CC *F) (B1, B2, B3, B4, B5, B6, B7, B8) BOOST_BIND_NOEXCEPT; |
|||
typedef typename _bi::list_av_8<A1, A2, A3, A4, A5, A6, A7, A8>::type list_type; |
|||
return _bi::bind_t<R, F, list_type>(f, list_type(a1, a2, a3, a4, a5, a6, a7, a8)); |
|||
} |
|||
|
|||
template<class R, |
|||
class B1, class B2, class B3, class B4, class B5, class B6, class B7, class B8, class B9, |
|||
class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9> |
|||
_bi::bind_t<R, BOOST_BIND_ST R (BOOST_BIND_CC *) (B1, B2, B3, B4, B5, B6, B7, B8, B9) BOOST_BIND_NOEXCEPT, typename _bi::list_av_9<A1, A2, A3, A4, A5, A6, A7, A8, A9>::type> |
|||
BOOST_BIND(BOOST_BIND_ST R (BOOST_BIND_CC *f) (B1, B2, B3, B4, B5, B6, B7, B8, B9) BOOST_BIND_NOEXCEPT, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9) |
|||
{ |
|||
typedef BOOST_BIND_ST R (BOOST_BIND_CC *F) (B1, B2, B3, B4, B5, B6, B7, B8, B9) BOOST_BIND_NOEXCEPT; |
|||
typedef typename _bi::list_av_9<A1, A2, A3, A4, A5, A6, A7, A8, A9>::type list_type; |
|||
return _bi::bind_t<R, F, list_type>(f, list_type(a1, a2, a3, a4, a5, a6, a7, a8, a9)); |
|||
} |
@ -0,0 +1,228 @@ |
|||
//
|
|||
// bind/bind_mf2_cc.hpp - member functions, type<> syntax
|
|||
//
|
|||
// Do not include this header directly.
|
|||
//
|
|||
// Copyright (c) 2001 Peter Dimov and Multi Media Ltd.
|
|||
// Copyright (c) 2008 Peter Dimov
|
|||
//
|
|||
// 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/bind/bind.html for documentation.
|
|||
//
|
|||
|
|||
// 0
|
|||
|
|||
template<class Rt2, class R, class T, |
|||
class A1> |
|||
_bi::bind_t<Rt2, _mfi::BOOST_BIND_MF_NAME(mf0)<R, T>, typename _bi::list_av_1<A1>::type> |
|||
BOOST_BIND(boost::type<Rt2>, R (BOOST_BIND_MF_CC T::*f) () BOOST_BIND_MF_NOEXCEPT, A1 a1) |
|||
{ |
|||
typedef _mfi::BOOST_BIND_MF_NAME(mf0)<R, T> F; |
|||
typedef typename _bi::list_av_1<A1>::type list_type; |
|||
return _bi::bind_t<Rt2, F, list_type>(F(f), list_type(a1)); |
|||
} |
|||
|
|||
template<class Rt2, class R, class T, |
|||
class A1> |
|||
_bi::bind_t<Rt2, _mfi::BOOST_BIND_MF_NAME(cmf0)<R, T>, typename _bi::list_av_1<A1>::type> |
|||
BOOST_BIND(boost::type<Rt2>, R (BOOST_BIND_MF_CC T::*f) () const BOOST_BIND_MF_NOEXCEPT, A1 a1) |
|||
{ |
|||
typedef _mfi::BOOST_BIND_MF_NAME(cmf0)<R, T> F; |
|||
typedef typename _bi::list_av_1<A1>::type list_type; |
|||
return _bi::bind_t<Rt2, F, list_type>(F(f), list_type(a1)); |
|||
} |
|||
|
|||
// 1
|
|||
|
|||
template<class Rt2, class R, class T, |
|||
class B1, |
|||
class A1, class A2> |
|||
_bi::bind_t<Rt2, _mfi::BOOST_BIND_MF_NAME(mf1)<R, T, B1>, typename _bi::list_av_2<A1, A2>::type> |
|||
BOOST_BIND(boost::type<Rt2>, R (BOOST_BIND_MF_CC T::*f) (B1) BOOST_BIND_MF_NOEXCEPT, A1 a1, A2 a2) |
|||
{ |
|||
typedef _mfi::BOOST_BIND_MF_NAME(mf1)<R, T, B1> F; |
|||
typedef typename _bi::list_av_2<A1, A2>::type list_type; |
|||
return _bi::bind_t<Rt2, F, list_type>(F(f), list_type(a1, a2)); |
|||
} |
|||
|
|||
template<class Rt2, class R, class T, |
|||
class B1, |
|||
class A1, class A2> |
|||
_bi::bind_t<Rt2, _mfi::BOOST_BIND_MF_NAME(cmf1)<R, T, B1>, typename _bi::list_av_2<A1, A2>::type> |
|||
BOOST_BIND(boost::type<Rt2>, R (BOOST_BIND_MF_CC T::*f) (B1) const BOOST_BIND_MF_NOEXCEPT, A1 a1, A2 a2) |
|||
{ |
|||
typedef _mfi::BOOST_BIND_MF_NAME(cmf1)<R, T, B1> F; |
|||
typedef typename _bi::list_av_2<A1, A2>::type list_type; |
|||
return _bi::bind_t<Rt2, F, list_type>(F(f), list_type(a1, a2)); |
|||
} |
|||
|
|||
// 2
|
|||
|
|||
template<class Rt2, class R, class T, |
|||
class B1, class B2, |
|||
class A1, class A2, class A3> |
|||
_bi::bind_t<Rt2, _mfi::BOOST_BIND_MF_NAME(mf2)<R, T, B1, B2>, typename _bi::list_av_3<A1, A2, A3>::type> |
|||
BOOST_BIND(boost::type<Rt2>, R (BOOST_BIND_MF_CC T::*f) (B1, B2) BOOST_BIND_MF_NOEXCEPT, A1 a1, A2 a2, A3 a3) |
|||
{ |
|||
typedef _mfi::BOOST_BIND_MF_NAME(mf2)<R, T, B1, B2> F; |
|||
typedef typename _bi::list_av_3<A1, A2, A3>::type list_type; |
|||
return _bi::bind_t<Rt2, F, list_type>(F(f), list_type(a1, a2, a3)); |
|||
} |
|||
|
|||
template<class Rt2, class R, class T, |
|||
class B1, class B2, |
|||
class A1, class A2, class A3> |
|||
_bi::bind_t<Rt2, _mfi::BOOST_BIND_MF_NAME(cmf2)<R, T, B1, B2>, typename _bi::list_av_3<A1, A2, A3>::type> |
|||
BOOST_BIND(boost::type<Rt2>, R (BOOST_BIND_MF_CC T::*f) (B1, B2) const BOOST_BIND_MF_NOEXCEPT, A1 a1, A2 a2, A3 a3) |
|||
{ |
|||
typedef _mfi::BOOST_BIND_MF_NAME(cmf2)<R, T, B1, B2> F; |
|||
typedef typename _bi::list_av_3<A1, A2, A3>::type list_type; |
|||
return _bi::bind_t<Rt2, F, list_type>(F(f), list_type(a1, a2, a3)); |
|||
} |
|||
|
|||
// 3
|
|||
|
|||
template<class Rt2, class R, class T, |
|||
class B1, class B2, class B3, |
|||
class A1, class A2, class A3, class A4> |
|||
_bi::bind_t<Rt2, _mfi::BOOST_BIND_MF_NAME(mf3)<R, T, B1, B2, B3>, typename _bi::list_av_4<A1, A2, A3, A4>::type> |
|||
BOOST_BIND(boost::type<Rt2>, R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3) BOOST_BIND_MF_NOEXCEPT, A1 a1, A2 a2, A3 a3, A4 a4) |
|||
{ |
|||
typedef _mfi::BOOST_BIND_MF_NAME(mf3)<R, T, B1, B2, B3> F; |
|||
typedef typename _bi::list_av_4<A1, A2, A3, A4>::type list_type; |
|||
return _bi::bind_t<Rt2, F, list_type>(F(f), list_type(a1, a2, a3, a4)); |
|||
} |
|||
|
|||
template<class Rt2, class R, class T, |
|||
class B1, class B2, class B3, |
|||
class A1, class A2, class A3, class A4> |
|||
_bi::bind_t<Rt2, _mfi::BOOST_BIND_MF_NAME(cmf3)<R, T, B1, B2, B3>, typename _bi::list_av_4<A1, A2, A3, A4>::type> |
|||
BOOST_BIND(boost::type<Rt2>, R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3) const BOOST_BIND_MF_NOEXCEPT, A1 a1, A2 a2, A3 a3, A4 a4) |
|||
{ |
|||
typedef _mfi::BOOST_BIND_MF_NAME(cmf3)<R, T, B1, B2, B3> F; |
|||
typedef typename _bi::list_av_4<A1, A2, A3, A4>::type list_type; |
|||
return _bi::bind_t<Rt2, F, list_type>(F(f), list_type(a1, a2, a3, a4)); |
|||
} |
|||
|
|||
// 4
|
|||
|
|||
template<class Rt2, class R, class T, |
|||
class B1, class B2, class B3, class B4, |
|||
class A1, class A2, class A3, class A4, class A5> |
|||
_bi::bind_t<Rt2, _mfi::BOOST_BIND_MF_NAME(mf4)<R, T, B1, B2, B3, B4>, typename _bi::list_av_5<A1, A2, A3, A4, A5>::type> |
|||
BOOST_BIND(boost::type<Rt2>, R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3, B4) BOOST_BIND_MF_NOEXCEPT, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) |
|||
{ |
|||
typedef _mfi::BOOST_BIND_MF_NAME(mf4)<R, T, B1, B2, B3, B4> F; |
|||
typedef typename _bi::list_av_5<A1, A2, A3, A4, A5>::type list_type; |
|||
return _bi::bind_t<Rt2, F, list_type>(F(f), list_type(a1, a2, a3, a4, a5)); |
|||
} |
|||
|
|||
template<class Rt2, class R, class T, |
|||
class B1, class B2, class B3, class B4, |
|||
class A1, class A2, class A3, class A4, class A5> |
|||
_bi::bind_t<Rt2, _mfi::BOOST_BIND_MF_NAME(cmf4)<R, T, B1, B2, B3, B4>, typename _bi::list_av_5<A1, A2, A3, A4, A5>::type> |
|||
BOOST_BIND(boost::type<Rt2>, R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3, B4) const BOOST_BIND_MF_NOEXCEPT, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) |
|||
{ |
|||
typedef _mfi::BOOST_BIND_MF_NAME(cmf4)<R, T, B1, B2, B3, B4> F; |
|||
typedef typename _bi::list_av_5<A1, A2, A3, A4, A5>::type list_type; |
|||
return _bi::bind_t<Rt2, F, list_type>(F(f), list_type(a1, a2, a3, a4, a5)); |
|||
} |
|||
|
|||
// 5
|
|||
|
|||
template<class Rt2, class R, class T, |
|||
class B1, class B2, class B3, class B4, class B5, |
|||
class A1, class A2, class A3, class A4, class A5, class A6> |
|||
_bi::bind_t<Rt2, _mfi::BOOST_BIND_MF_NAME(mf5)<R, T, B1, B2, B3, B4, B5>, typename _bi::list_av_6<A1, A2, A3, A4, A5, A6>::type> |
|||
BOOST_BIND(boost::type<Rt2>, R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3, B4, B5) BOOST_BIND_MF_NOEXCEPT, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) |
|||
{ |
|||
typedef _mfi::BOOST_BIND_MF_NAME(mf5)<R, T, B1, B2, B3, B4, B5> F; |
|||
typedef typename _bi::list_av_6<A1, A2, A3, A4, A5, A6>::type list_type; |
|||
return _bi::bind_t<Rt2, F, list_type>(F(f), list_type(a1, a2, a3, a4, a5, a6)); |
|||
} |
|||
|
|||
template<class Rt2, class R, class T, |
|||
class B1, class B2, class B3, class B4, class B5, |
|||
class A1, class A2, class A3, class A4, class A5, class A6> |
|||
_bi::bind_t<Rt2, _mfi::BOOST_BIND_MF_NAME(cmf5)<R, T, B1, B2, B3, B4, B5>, typename _bi::list_av_6<A1, A2, A3, A4, A5, A6>::type> |
|||
BOOST_BIND(boost::type<Rt2>, R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3, B4, B5) const BOOST_BIND_MF_NOEXCEPT, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) |
|||
{ |
|||
typedef _mfi::BOOST_BIND_MF_NAME(cmf5)<R, T, B1, B2, B3, B4, B5> F; |
|||
typedef typename _bi::list_av_6<A1, A2, A3, A4, A5, A6>::type list_type; |
|||
return _bi::bind_t<Rt2, F, list_type>(F(f), list_type(a1, a2, a3, a4, a5, a6)); |
|||
} |
|||
|
|||
// 6
|
|||
|
|||
template<class Rt2, class R, class T, |
|||
class B1, class B2, class B3, class B4, class B5, class B6, |
|||
class A1, class A2, class A3, class A4, class A5, class A6, class A7> |
|||
_bi::bind_t<Rt2, _mfi::BOOST_BIND_MF_NAME(mf6)<R, T, B1, B2, B3, B4, B5, B6>, typename _bi::list_av_7<A1, A2, A3, A4, A5, A6, A7>::type> |
|||
BOOST_BIND(boost::type<Rt2>, R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3, B4, B5, B6) BOOST_BIND_MF_NOEXCEPT, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) |
|||
{ |
|||
typedef _mfi::BOOST_BIND_MF_NAME(mf6)<R, T, B1, B2, B3, B4, B5, B6> F; |
|||
typedef typename _bi::list_av_7<A1, A2, A3, A4, A5, A6, A7>::type list_type; |
|||
return _bi::bind_t<Rt2, F, list_type>(F(f), list_type(a1, a2, a3, a4, a5, a6, a7)); |
|||
} |
|||
|
|||
template<class Rt2, class R, class T, |
|||
class B1, class B2, class B3, class B4, class B5, class B6, |
|||
class A1, class A2, class A3, class A4, class A5, class A6, class A7> |
|||
_bi::bind_t<Rt2, _mfi::BOOST_BIND_MF_NAME(cmf6)<R, T, B1, B2, B3, B4, B5, B6>, typename _bi::list_av_7<A1, A2, A3, A4, A5, A6, A7>::type> |
|||
BOOST_BIND(boost::type<Rt2>, R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3, B4, B5, B6) const BOOST_BIND_MF_NOEXCEPT, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) |
|||
{ |
|||
typedef _mfi::BOOST_BIND_MF_NAME(cmf6)<R, T, B1, B2, B3, B4, B5, B6> F; |
|||
typedef typename _bi::list_av_7<A1, A2, A3, A4, A5, A6, A7>::type list_type; |
|||
return _bi::bind_t<Rt2, F, list_type>(F(f), list_type(a1, a2, a3, a4, a5, a6, a7)); |
|||
} |
|||
|
|||
// 7
|
|||
|
|||
template<class Rt2, class R, class T, |
|||
class B1, class B2, class B3, class B4, class B5, class B6, class B7, |
|||
class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8> |
|||
_bi::bind_t<Rt2, _mfi::BOOST_BIND_MF_NAME(mf7)<R, T, B1, B2, B3, B4, B5, B6, B7>, typename _bi::list_av_8<A1, A2, A3, A4, A5, A6, A7, A8>::type> |
|||
BOOST_BIND(boost::type<Rt2>, R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3, B4, B5, B6, B7) BOOST_BIND_MF_NOEXCEPT, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8) |
|||
{ |
|||
typedef _mfi::BOOST_BIND_MF_NAME(mf7)<R, T, B1, B2, B3, B4, B5, B6, B7> F; |
|||
typedef typename _bi::list_av_8<A1, A2, A3, A4, A5, A6, A7, A8>::type list_type; |
|||
return _bi::bind_t<Rt2, F, list_type>(F(f), list_type(a1, a2, a3, a4, a5, a6, a7, a8)); |
|||
} |
|||
|
|||
template<class Rt2, class R, class T, |
|||
class B1, class B2, class B3, class B4, class B5, class B6, class B7, |
|||
class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8> |
|||
_bi::bind_t<Rt2, _mfi::BOOST_BIND_MF_NAME(cmf7)<R, T, B1, B2, B3, B4, B5, B6, B7>, typename _bi::list_av_8<A1, A2, A3, A4, A5, A6, A7, A8>::type> |
|||
BOOST_BIND(boost::type<Rt2>, R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3, B4, B5, B6, B7) const BOOST_BIND_MF_NOEXCEPT, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8) |
|||
{ |
|||
typedef _mfi::BOOST_BIND_MF_NAME(cmf7)<R, T, B1, B2, B3, B4, B5, B6, B7> F; |
|||
typedef typename _bi::list_av_8<A1, A2, A3, A4, A5, A6, A7, A8>::type list_type; |
|||
return _bi::bind_t<Rt2, F, list_type>(F(f), list_type(a1, a2, a3, a4, a5, a6, a7, a8)); |
|||
} |
|||
|
|||
// 8
|
|||
|
|||
template<class Rt2, class R, class T, |
|||
class B1, class B2, class B3, class B4, class B5, class B6, class B7, class B8, |
|||
class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9> |
|||
_bi::bind_t<Rt2, _mfi::BOOST_BIND_MF_NAME(mf8)<R, T, B1, B2, B3, B4, B5, B6, B7, B8>, typename _bi::list_av_9<A1, A2, A3, A4, A5, A6, A7, A8, A9>::type> |
|||
BOOST_BIND(boost::type<Rt2>, R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3, B4, B5, B6, B7, B8) BOOST_BIND_MF_NOEXCEPT, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9) |
|||
{ |
|||
typedef _mfi::BOOST_BIND_MF_NAME(mf8)<R, T, B1, B2, B3, B4, B5, B6, B7, B8> F; |
|||
typedef typename _bi::list_av_9<A1, A2, A3, A4, A5, A6, A7, A8, A9>::type list_type; |
|||
return _bi::bind_t<Rt2, F, list_type>(F(f), list_type(a1, a2, a3, a4, a5, a6, a7, a8, a9)); |
|||
} |
|||
|
|||
template<class Rt2, class R, class T, |
|||
class B1, class B2, class B3, class B4, class B5, class B6, class B7, class B8, |
|||
class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9> |
|||
_bi::bind_t<Rt2, _mfi::BOOST_BIND_MF_NAME(cmf8)<R, T, B1, B2, B3, B4, B5, B6, B7, B8>, typename _bi::list_av_9<A1, A2, A3, A4, A5, A6, A7, A8, A9>::type> |
|||
BOOST_BIND(boost::type<Rt2>, R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3, B4, B5, B6, B7, B8) const BOOST_BIND_MF_NOEXCEPT, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9) |
|||
{ |
|||
typedef _mfi::BOOST_BIND_MF_NAME(cmf8)<R, T, B1, B2, B3, B4, B5, B6, B7, B8> F; |
|||
typedef typename _bi::list_av_9<A1, A2, A3, A4, A5, A6, A7, A8, A9>::type list_type; |
|||
return _bi::bind_t<Rt2, F, list_type>(F(f), list_type(a1, a2, a3, a4, a5, a6, a7, a8, a9)); |
|||
} |
@ -0,0 +1,441 @@ |
|||
//
|
|||
// bind/bind_mf_cc.hpp - support for different calling conventions
|
|||
//
|
|||
// Do not include this header directly.
|
|||
//
|
|||
// Copyright (c) 2001 Peter Dimov and Multi Media Ltd.
|
|||
//
|
|||
// 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/bind/bind.html for documentation.
|
|||
//
|
|||
|
|||
// 0
|
|||
|
|||
template<class R, class T, |
|||
class A1> |
|||
_bi::bind_t<R, _mfi::BOOST_BIND_MF_NAME(mf0)<R, T>, typename _bi::list_av_1<A1>::type> |
|||
BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) () BOOST_BIND_MF_NOEXCEPT, A1 a1) |
|||
{ |
|||
typedef _mfi::BOOST_BIND_MF_NAME(mf0)<R, T> F; |
|||
typedef typename _bi::list_av_1<A1>::type list_type; |
|||
return _bi::bind_t<R, F, list_type>(F(f), list_type(a1)); |
|||
} |
|||
|
|||
template<class R, class T, |
|||
class A1> |
|||
_bi::bind_t<R, _mfi::BOOST_BIND_MF_NAME(cmf0)<R, T>, typename _bi::list_av_1<A1>::type> |
|||
BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) () const BOOST_BIND_MF_NOEXCEPT, A1 a1) |
|||
{ |
|||
typedef _mfi::BOOST_BIND_MF_NAME(cmf0)<R, T> F; |
|||
typedef typename _bi::list_av_1<A1>::type list_type; |
|||
return _bi::bind_t<R, F, list_type>(F(f), list_type(a1)); |
|||
} |
|||
|
|||
template<class Rt2, class R, class T, |
|||
class A1> |
|||
typename boost::enable_if_c<!_bi::is_same<Rt2, R>::value, |
|||
_bi::bind_t<Rt2, _mfi::BOOST_BIND_MF_NAME(mf0)<R, T>, typename _bi::list_av_1<A1>::type> |
|||
>::type BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) () BOOST_BIND_MF_NOEXCEPT, A1 a1) |
|||
{ |
|||
typedef _mfi::BOOST_BIND_MF_NAME(mf0)<R, T> F; |
|||
typedef typename _bi::list_av_1<A1>::type list_type; |
|||
return _bi::bind_t<Rt2, F, list_type>(F(f), list_type(a1)); |
|||
} |
|||
|
|||
template<class Rt2, class R, class T, |
|||
class A1> |
|||
typename boost::enable_if_c<!_bi::is_same<Rt2, R>::value, |
|||
_bi::bind_t<Rt2, _mfi::BOOST_BIND_MF_NAME(cmf0)<R, T>, typename _bi::list_av_1<A1>::type> |
|||
>::type BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) () const BOOST_BIND_MF_NOEXCEPT, A1 a1) |
|||
{ |
|||
typedef _mfi::BOOST_BIND_MF_NAME(cmf0)<R, T> F; |
|||
typedef typename _bi::list_av_1<A1>::type list_type; |
|||
return _bi::bind_t<Rt2, F, list_type>(F(f), list_type(a1)); |
|||
} |
|||
|
|||
// 1
|
|||
|
|||
template<class R, class T, |
|||
class B1, |
|||
class A1, class A2> |
|||
_bi::bind_t<R, _mfi::BOOST_BIND_MF_NAME(mf1)<R, T, B1>, typename _bi::list_av_2<A1, A2>::type> |
|||
BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1) BOOST_BIND_MF_NOEXCEPT, A1 a1, A2 a2) |
|||
{ |
|||
typedef _mfi::BOOST_BIND_MF_NAME(mf1)<R, T, B1> F; |
|||
typedef typename _bi::list_av_2<A1, A2>::type list_type; |
|||
return _bi::bind_t<R, F, list_type>(F(f), list_type(a1, a2)); |
|||
} |
|||
|
|||
template<class R, class T, |
|||
class B1, |
|||
class A1, class A2> |
|||
_bi::bind_t<R, _mfi::BOOST_BIND_MF_NAME(cmf1)<R, T, B1>, typename _bi::list_av_2<A1, A2>::type> |
|||
BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1) const BOOST_BIND_MF_NOEXCEPT, A1 a1, A2 a2) |
|||
{ |
|||
typedef _mfi::BOOST_BIND_MF_NAME(cmf1)<R, T, B1> F; |
|||
typedef typename _bi::list_av_2<A1, A2>::type list_type; |
|||
return _bi::bind_t<R, F, list_type>(F(f), list_type(a1, a2)); |
|||
} |
|||
|
|||
template<class Rt2, class R, class T, |
|||
class B1, |
|||
class A1, class A2> |
|||
typename boost::enable_if_c<!_bi::is_same<Rt2, R>::value, |
|||
_bi::bind_t<Rt2, _mfi::BOOST_BIND_MF_NAME(mf1)<R, T, B1>, typename _bi::list_av_2<A1, A2>::type> |
|||
>::type BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1) BOOST_BIND_MF_NOEXCEPT, A1 a1, A2 a2) |
|||
{ |
|||
typedef _mfi::BOOST_BIND_MF_NAME(mf1)<R, T, B1> F; |
|||
typedef typename _bi::list_av_2<A1, A2>::type list_type; |
|||
return _bi::bind_t<Rt2, F, list_type>(F(f), list_type(a1, a2)); |
|||
} |
|||
|
|||
template<class Rt2, class R, class T, |
|||
class B1, |
|||
class A1, class A2> |
|||
typename boost::enable_if_c<!_bi::is_same<Rt2, R>::value, |
|||
_bi::bind_t<Rt2, _mfi::BOOST_BIND_MF_NAME(cmf1)<R, T, B1>, typename _bi::list_av_2<A1, A2>::type> |
|||
>::type BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1) const BOOST_BIND_MF_NOEXCEPT, A1 a1, A2 a2) |
|||
{ |
|||
typedef _mfi::BOOST_BIND_MF_NAME(cmf1)<R, T, B1> F; |
|||
typedef typename _bi::list_av_2<A1, A2>::type list_type; |
|||
return _bi::bind_t<Rt2, F, list_type>(F(f), list_type(a1, a2)); |
|||
} |
|||
|
|||
// 2
|
|||
|
|||
template<class R, class T, |
|||
class B1, class B2, |
|||
class A1, class A2, class A3> |
|||
_bi::bind_t<R, _mfi::BOOST_BIND_MF_NAME(mf2)<R, T, B1, B2>, typename _bi::list_av_3<A1, A2, A3>::type> |
|||
BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2) BOOST_BIND_MF_NOEXCEPT, A1 a1, A2 a2, A3 a3) |
|||
{ |
|||
typedef _mfi::BOOST_BIND_MF_NAME(mf2)<R, T, B1, B2> F; |
|||
typedef typename _bi::list_av_3<A1, A2, A3>::type list_type; |
|||
return _bi::bind_t<R, F, list_type>(F(f), list_type(a1, a2, a3)); |
|||
} |
|||
|
|||
template<class R, class T, |
|||
class B1, class B2, |
|||
class A1, class A2, class A3> |
|||
_bi::bind_t<R, _mfi::BOOST_BIND_MF_NAME(cmf2)<R, T, B1, B2>, typename _bi::list_av_3<A1, A2, A3>::type> |
|||
BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2) const BOOST_BIND_MF_NOEXCEPT, A1 a1, A2 a2, A3 a3) |
|||
{ |
|||
typedef _mfi::BOOST_BIND_MF_NAME(cmf2)<R, T, B1, B2> F; |
|||
typedef typename _bi::list_av_3<A1, A2, A3>::type list_type; |
|||
return _bi::bind_t<R, F, list_type>(F(f), list_type(a1, a2, a3)); |
|||
} |
|||
|
|||
template<class Rt2, class R, class T, |
|||
class B1, class B2, |
|||
class A1, class A2, class A3> |
|||
typename boost::enable_if_c<!_bi::is_same<Rt2, R>::value, |
|||
_bi::bind_t<Rt2, _mfi::BOOST_BIND_MF_NAME(mf2)<R, T, B1, B2>, typename _bi::list_av_3<A1, A2, A3>::type> |
|||
>::type BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2) BOOST_BIND_MF_NOEXCEPT, A1 a1, A2 a2, A3 a3) |
|||
{ |
|||
typedef _mfi::BOOST_BIND_MF_NAME(mf2)<R, T, B1, B2> F; |
|||
typedef typename _bi::list_av_3<A1, A2, A3>::type list_type; |
|||
return _bi::bind_t<Rt2, F, list_type>(F(f), list_type(a1, a2, a3)); |
|||
} |
|||
|
|||
template<class Rt2, class R, class T, |
|||
class B1, class B2, |
|||
class A1, class A2, class A3> |
|||
typename boost::enable_if_c<!_bi::is_same<Rt2, R>::value, |
|||
_bi::bind_t<Rt2, _mfi::BOOST_BIND_MF_NAME(cmf2)<R, T, B1, B2>, typename _bi::list_av_3<A1, A2, A3>::type> |
|||
>::type BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2) const BOOST_BIND_MF_NOEXCEPT, A1 a1, A2 a2, A3 a3) |
|||
{ |
|||
typedef _mfi::BOOST_BIND_MF_NAME(cmf2)<R, T, B1, B2> F; |
|||
typedef typename _bi::list_av_3<A1, A2, A3>::type list_type; |
|||
return _bi::bind_t<Rt2, F, list_type>(F(f), list_type(a1, a2, a3)); |
|||
} |
|||
|
|||
// 3
|
|||
|
|||
template<class R, class T, |
|||
class B1, class B2, class B3, |
|||
class A1, class A2, class A3, class A4> |
|||
_bi::bind_t<R, _mfi::BOOST_BIND_MF_NAME(mf3)<R, T, B1, B2, B3>, typename _bi::list_av_4<A1, A2, A3, A4>::type> |
|||
BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3) BOOST_BIND_MF_NOEXCEPT, A1 a1, A2 a2, A3 a3, A4 a4) |
|||
{ |
|||
typedef _mfi::BOOST_BIND_MF_NAME(mf3)<R, T, B1, B2, B3> F; |
|||
typedef typename _bi::list_av_4<A1, A2, A3, A4>::type list_type; |
|||
return _bi::bind_t<R, F, list_type>(F(f), list_type(a1, a2, a3, a4)); |
|||
} |
|||
|
|||
template<class R, class T, |
|||
class B1, class B2, class B3, |
|||
class A1, class A2, class A3, class A4> |
|||
_bi::bind_t<R, _mfi::BOOST_BIND_MF_NAME(cmf3)<R, T, B1, B2, B3>, typename _bi::list_av_4<A1, A2, A3, A4>::type> |
|||
BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3) const BOOST_BIND_MF_NOEXCEPT, A1 a1, A2 a2, A3 a3, A4 a4) |
|||
{ |
|||
typedef _mfi::BOOST_BIND_MF_NAME(cmf3)<R, T, B1, B2, B3> F; |
|||
typedef typename _bi::list_av_4<A1, A2, A3, A4>::type list_type; |
|||
return _bi::bind_t<R, F, list_type>(F(f), list_type(a1, a2, a3, a4)); |
|||
} |
|||
|
|||
template<class Rt2, class R, class T, |
|||
class B1, class B2, class B3, |
|||
class A1, class A2, class A3, class A4> |
|||
typename boost::enable_if_c<!_bi::is_same<Rt2, R>::value, |
|||
_bi::bind_t<Rt2, _mfi::BOOST_BIND_MF_NAME(mf3)<R, T, B1, B2, B3>, typename _bi::list_av_4<A1, A2, A3, A4>::type> |
|||
>::type BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3) BOOST_BIND_MF_NOEXCEPT, A1 a1, A2 a2, A3 a3, A4 a4) |
|||
{ |
|||
typedef _mfi::BOOST_BIND_MF_NAME(mf3)<R, T, B1, B2, B3> F; |
|||
typedef typename _bi::list_av_4<A1, A2, A3, A4>::type list_type; |
|||
return _bi::bind_t<Rt2, F, list_type>(F(f), list_type(a1, a2, a3, a4)); |
|||
} |
|||
|
|||
template<class Rt2, class R, class T, |
|||
class B1, class B2, class B3, |
|||
class A1, class A2, class A3, class A4> |
|||
typename boost::enable_if_c<!_bi::is_same<Rt2, R>::value, |
|||
_bi::bind_t<Rt2, _mfi::BOOST_BIND_MF_NAME(cmf3)<R, T, B1, B2, B3>, typename _bi::list_av_4<A1, A2, A3, A4>::type> |
|||
>::type BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3) const BOOST_BIND_MF_NOEXCEPT, A1 a1, A2 a2, A3 a3, A4 a4) |
|||
{ |
|||
typedef _mfi::BOOST_BIND_MF_NAME(cmf3)<R, T, B1, B2, B3> F; |
|||
typedef typename _bi::list_av_4<A1, A2, A3, A4>::type list_type; |
|||
return _bi::bind_t<Rt2, F, list_type>(F(f), list_type(a1, a2, a3, a4)); |
|||
} |
|||
|
|||
// 4
|
|||
|
|||
template<class R, class T, |
|||
class B1, class B2, class B3, class B4, |
|||
class A1, class A2, class A3, class A4, class A5> |
|||
_bi::bind_t<R, _mfi::BOOST_BIND_MF_NAME(mf4)<R, T, B1, B2, B3, B4>, typename _bi::list_av_5<A1, A2, A3, A4, A5>::type> |
|||
BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3, B4) BOOST_BIND_MF_NOEXCEPT, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) |
|||
{ |
|||
typedef _mfi::BOOST_BIND_MF_NAME(mf4)<R, T, B1, B2, B3, B4> F; |
|||
typedef typename _bi::list_av_5<A1, A2, A3, A4, A5>::type list_type; |
|||
return _bi::bind_t<R, F, list_type>(F(f), list_type(a1, a2, a3, a4, a5)); |
|||
} |
|||
|
|||
template<class R, class T, |
|||
class B1, class B2, class B3, class B4, |
|||
class A1, class A2, class A3, class A4, class A5> |
|||
_bi::bind_t<R, _mfi::BOOST_BIND_MF_NAME(cmf4)<R, T, B1, B2, B3, B4>, typename _bi::list_av_5<A1, A2, A3, A4, A5>::type> |
|||
BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3, B4) const BOOST_BIND_MF_NOEXCEPT, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) |
|||
{ |
|||
typedef _mfi::BOOST_BIND_MF_NAME(cmf4)<R, T, B1, B2, B3, B4> F; |
|||
typedef typename _bi::list_av_5<A1, A2, A3, A4, A5>::type list_type; |
|||
return _bi::bind_t<R, F, list_type>(F(f), list_type(a1, a2, a3, a4, a5)); |
|||
} |
|||
|
|||
template<class Rt2, class R, class T, |
|||
class B1, class B2, class B3, class B4, |
|||
class A1, class A2, class A3, class A4, class A5> |
|||
typename boost::enable_if_c<!_bi::is_same<Rt2, R>::value, |
|||
_bi::bind_t<Rt2, _mfi::BOOST_BIND_MF_NAME(mf4)<R, T, B1, B2, B3, B4>, typename _bi::list_av_5<A1, A2, A3, A4, A5>::type> |
|||
>::type BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3, B4) BOOST_BIND_MF_NOEXCEPT, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) |
|||
{ |
|||
typedef _mfi::BOOST_BIND_MF_NAME(mf4)<R, T, B1, B2, B3, B4> F; |
|||
typedef typename _bi::list_av_5<A1, A2, A3, A4, A5>::type list_type; |
|||
return _bi::bind_t<Rt2, F, list_type>(F(f), list_type(a1, a2, a3, a4, a5)); |
|||
} |
|||
|
|||
template<class Rt2, class R, class T, |
|||
class B1, class B2, class B3, class B4, |
|||
class A1, class A2, class A3, class A4, class A5> |
|||
typename boost::enable_if_c<!_bi::is_same<Rt2, R>::value, |
|||
_bi::bind_t<Rt2, _mfi::BOOST_BIND_MF_NAME(cmf4)<R, T, B1, B2, B3, B4>, typename _bi::list_av_5<A1, A2, A3, A4, A5>::type> |
|||
>::type BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3, B4) const BOOST_BIND_MF_NOEXCEPT, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) |
|||
{ |
|||
typedef _mfi::BOOST_BIND_MF_NAME(cmf4)<R, T, B1, B2, B3, B4> F; |
|||
typedef typename _bi::list_av_5<A1, A2, A3, A4, A5>::type list_type; |
|||
return _bi::bind_t<Rt2, F, list_type>(F(f), list_type(a1, a2, a3, a4, a5)); |
|||
} |
|||
|
|||
// 5
|
|||
|
|||
template<class R, class T, |
|||
class B1, class B2, class B3, class B4, class B5, |
|||
class A1, class A2, class A3, class A4, class A5, class A6> |
|||
_bi::bind_t<R, _mfi::BOOST_BIND_MF_NAME(mf5)<R, T, B1, B2, B3, B4, B5>, typename _bi::list_av_6<A1, A2, A3, A4, A5, A6>::type> |
|||
BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3, B4, B5) BOOST_BIND_MF_NOEXCEPT, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) |
|||
{ |
|||
typedef _mfi::BOOST_BIND_MF_NAME(mf5)<R, T, B1, B2, B3, B4, B5> F; |
|||
typedef typename _bi::list_av_6<A1, A2, A3, A4, A5, A6>::type list_type; |
|||
return _bi::bind_t<R, F, list_type>(F(f), list_type(a1, a2, a3, a4, a5, a6)); |
|||
} |
|||
|
|||
template<class R, class T, |
|||
class B1, class B2, class B3, class B4, class B5, |
|||
class A1, class A2, class A3, class A4, class A5, class A6> |
|||
_bi::bind_t<R, _mfi::BOOST_BIND_MF_NAME(cmf5)<R, T, B1, B2, B3, B4, B5>, typename _bi::list_av_6<A1, A2, A3, A4, A5, A6>::type> |
|||
BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3, B4, B5) const BOOST_BIND_MF_NOEXCEPT, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) |
|||
{ |
|||
typedef _mfi::BOOST_BIND_MF_NAME(cmf5)<R, T, B1, B2, B3, B4, B5> F; |
|||
typedef typename _bi::list_av_6<A1, A2, A3, A4, A5, A6>::type list_type; |
|||
return _bi::bind_t<R, F, list_type>(F(f), list_type(a1, a2, a3, a4, a5, a6)); |
|||
} |
|||
|
|||
template<class Rt2, class R, class T, |
|||
class B1, class B2, class B3, class B4, class B5, |
|||
class A1, class A2, class A3, class A4, class A5, class A6> |
|||
typename boost::enable_if_c<!_bi::is_same<Rt2, R>::value, |
|||
_bi::bind_t<Rt2, _mfi::BOOST_BIND_MF_NAME(mf5)<R, T, B1, B2, B3, B4, B5>, typename _bi::list_av_6<A1, A2, A3, A4, A5, A6>::type> |
|||
>::type BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3, B4, B5) BOOST_BIND_MF_NOEXCEPT, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) |
|||
{ |
|||
typedef _mfi::BOOST_BIND_MF_NAME(mf5)<R, T, B1, B2, B3, B4, B5> F; |
|||
typedef typename _bi::list_av_6<A1, A2, A3, A4, A5, A6>::type list_type; |
|||
return _bi::bind_t<Rt2, F, list_type>(F(f), list_type(a1, a2, a3, a4, a5, a6)); |
|||
} |
|||
|
|||
template<class Rt2, class R, class T, |
|||
class B1, class B2, class B3, class B4, class B5, |
|||
class A1, class A2, class A3, class A4, class A5, class A6> |
|||
typename boost::enable_if_c<!_bi::is_same<Rt2, R>::value, |
|||
_bi::bind_t<Rt2, _mfi::BOOST_BIND_MF_NAME(cmf5)<R, T, B1, B2, B3, B4, B5>, typename _bi::list_av_6<A1, A2, A3, A4, A5, A6>::type> |
|||
>::type BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3, B4, B5) const BOOST_BIND_MF_NOEXCEPT, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) |
|||
{ |
|||
typedef _mfi::BOOST_BIND_MF_NAME(cmf5)<R, T, B1, B2, B3, B4, B5> F; |
|||
typedef typename _bi::list_av_6<A1, A2, A3, A4, A5, A6>::type list_type; |
|||
return _bi::bind_t<Rt2, F, list_type>(F(f), list_type(a1, a2, a3, a4, a5, a6)); |
|||
} |
|||
|
|||
// 6
|
|||
|
|||
template<class R, class T, |
|||
class B1, class B2, class B3, class B4, class B5, class B6, |
|||
class A1, class A2, class A3, class A4, class A5, class A6, class A7> |
|||
_bi::bind_t<R, _mfi::BOOST_BIND_MF_NAME(mf6)<R, T, B1, B2, B3, B4, B5, B6>, typename _bi::list_av_7<A1, A2, A3, A4, A5, A6, A7>::type> |
|||
BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3, B4, B5, B6) BOOST_BIND_MF_NOEXCEPT, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) |
|||
{ |
|||
typedef _mfi::BOOST_BIND_MF_NAME(mf6)<R, T, B1, B2, B3, B4, B5, B6> F; |
|||
typedef typename _bi::list_av_7<A1, A2, A3, A4, A5, A6, A7>::type list_type; |
|||
return _bi::bind_t<R, F, list_type>(F(f), list_type(a1, a2, a3, a4, a5, a6, a7)); |
|||
} |
|||
|
|||
template<class R, class T, |
|||
class B1, class B2, class B3, class B4, class B5, class B6, |
|||
class A1, class A2, class A3, class A4, class A5, class A6, class A7> |
|||
_bi::bind_t<R, _mfi::BOOST_BIND_MF_NAME(cmf6)<R, T, B1, B2, B3, B4, B5, B6>, typename _bi::list_av_7<A1, A2, A3, A4, A5, A6, A7>::type> |
|||
BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3, B4, B5, B6) const BOOST_BIND_MF_NOEXCEPT, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) |
|||
{ |
|||
typedef _mfi::BOOST_BIND_MF_NAME(cmf6)<R, T, B1, B2, B3, B4, B5, B6> F; |
|||
typedef typename _bi::list_av_7<A1, A2, A3, A4, A5, A6, A7>::type list_type; |
|||
return _bi::bind_t<R, F, list_type>(F(f), list_type(a1, a2, a3, a4, a5, a6, a7)); |
|||
} |
|||
|
|||
template<class Rt2, class R, class T, |
|||
class B1, class B2, class B3, class B4, class B5, class B6, |
|||
class A1, class A2, class A3, class A4, class A5, class A6, class A7> |
|||
typename boost::enable_if_c<!_bi::is_same<Rt2, R>::value, |
|||
_bi::bind_t<Rt2, _mfi::BOOST_BIND_MF_NAME(mf6)<R, T, B1, B2, B3, B4, B5, B6>, typename _bi::list_av_7<A1, A2, A3, A4, A5, A6, A7>::type> |
|||
>::type BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3, B4, B5, B6) BOOST_BIND_MF_NOEXCEPT, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) |
|||
{ |
|||
typedef _mfi::BOOST_BIND_MF_NAME(mf6)<R, T, B1, B2, B3, B4, B5, B6> F; |
|||
typedef typename _bi::list_av_7<A1, A2, A3, A4, A5, A6, A7>::type list_type; |
|||
return _bi::bind_t<Rt2, F, list_type>(F(f), list_type(a1, a2, a3, a4, a5, a6, a7)); |
|||
} |
|||
|
|||
template<class Rt2, class R, class T, |
|||
class B1, class B2, class B3, class B4, class B5, class B6, |
|||
class A1, class A2, class A3, class A4, class A5, class A6, class A7> |
|||
typename boost::enable_if_c<!_bi::is_same<Rt2, R>::value, |
|||
_bi::bind_t<Rt2, _mfi::BOOST_BIND_MF_NAME(cmf6)<R, T, B1, B2, B3, B4, B5, B6>, typename _bi::list_av_7<A1, A2, A3, A4, A5, A6, A7>::type> |
|||
>::type BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3, B4, B5, B6) const BOOST_BIND_MF_NOEXCEPT, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) |
|||
{ |
|||
typedef _mfi::BOOST_BIND_MF_NAME(cmf6)<R, T, B1, B2, B3, B4, B5, B6> F; |
|||
typedef typename _bi::list_av_7<A1, A2, A3, A4, A5, A6, A7>::type list_type; |
|||
return _bi::bind_t<Rt2, F, list_type>(F(f), list_type(a1, a2, a3, a4, a5, a6, a7)); |
|||
} |
|||
|
|||
// 7
|
|||
|
|||
template<class R, class T, |
|||
class B1, class B2, class B3, class B4, class B5, class B6, class B7, |
|||
class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8> |
|||
_bi::bind_t<R, _mfi::BOOST_BIND_MF_NAME(mf7)<R, T, B1, B2, B3, B4, B5, B6, B7>, typename _bi::list_av_8<A1, A2, A3, A4, A5, A6, A7, A8>::type> |
|||
BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3, B4, B5, B6, B7) BOOST_BIND_MF_NOEXCEPT, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8) |
|||
{ |
|||
typedef _mfi::BOOST_BIND_MF_NAME(mf7)<R, T, B1, B2, B3, B4, B5, B6, B7> F; |
|||
typedef typename _bi::list_av_8<A1, A2, A3, A4, A5, A6, A7, A8>::type list_type; |
|||
return _bi::bind_t<R, F, list_type>(F(f), list_type(a1, a2, a3, a4, a5, a6, a7, a8)); |
|||
} |
|||
|
|||
template<class R, class T, |
|||
class B1, class B2, class B3, class B4, class B5, class B6, class B7, |
|||
class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8> |
|||
_bi::bind_t<R, _mfi::BOOST_BIND_MF_NAME(cmf7)<R, T, B1, B2, B3, B4, B5, B6, B7>, typename _bi::list_av_8<A1, A2, A3, A4, A5, A6, A7, A8>::type> |
|||
BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3, B4, B5, B6, B7) const BOOST_BIND_MF_NOEXCEPT, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8) |
|||
{ |
|||
typedef _mfi::BOOST_BIND_MF_NAME(cmf7)<R, T, B1, B2, B3, B4, B5, B6, B7> F; |
|||
typedef typename _bi::list_av_8<A1, A2, A3, A4, A5, A6, A7, A8>::type list_type; |
|||
return _bi::bind_t<R, F, list_type>(F(f), list_type(a1, a2, a3, a4, a5, a6, a7, a8)); |
|||
} |
|||
|
|||
template<class Rt2, class R, class T, |
|||
class B1, class B2, class B3, class B4, class B5, class B6, class B7, |
|||
class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8> |
|||
typename boost::enable_if_c<!_bi::is_same<Rt2, R>::value, |
|||
_bi::bind_t<Rt2, _mfi::BOOST_BIND_MF_NAME(mf7)<R, T, B1, B2, B3, B4, B5, B6, B7>, typename _bi::list_av_8<A1, A2, A3, A4, A5, A6, A7, A8>::type> |
|||
>::type BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3, B4, B5, B6, B7) BOOST_BIND_MF_NOEXCEPT, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8) |
|||
{ |
|||
typedef _mfi::BOOST_BIND_MF_NAME(mf7)<R, T, B1, B2, B3, B4, B5, B6, B7> F; |
|||
typedef typename _bi::list_av_8<A1, A2, A3, A4, A5, A6, A7, A8>::type list_type; |
|||
return _bi::bind_t<Rt2, F, list_type>(F(f), list_type(a1, a2, a3, a4, a5, a6, a7, a8)); |
|||
} |
|||
|
|||
template<class Rt2, class R, class T, |
|||
class B1, class B2, class B3, class B4, class B5, class B6, class B7, |
|||
class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8> |
|||
typename boost::enable_if_c<!_bi::is_same<Rt2, R>::value, |
|||
_bi::bind_t<Rt2, _mfi::BOOST_BIND_MF_NAME(cmf7)<R, T, B1, B2, B3, B4, B5, B6, B7>, typename _bi::list_av_8<A1, A2, A3, A4, A5, A6, A7, A8>::type> |
|||
>::type BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3, B4, B5, B6, B7) const BOOST_BIND_MF_NOEXCEPT, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8) |
|||
{ |
|||
typedef _mfi::BOOST_BIND_MF_NAME(cmf7)<R, T, B1, B2, B3, B4, B5, B6, B7> F; |
|||
typedef typename _bi::list_av_8<A1, A2, A3, A4, A5, A6, A7, A8>::type list_type; |
|||
return _bi::bind_t<Rt2, F, list_type>(F(f), list_type(a1, a2, a3, a4, a5, a6, a7, a8)); |
|||
} |
|||
|
|||
// 8
|
|||
|
|||
template<class R, class T, |
|||
class B1, class B2, class B3, class B4, class B5, class B6, class B7, class B8, |
|||
class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9> |
|||
_bi::bind_t<R, _mfi::BOOST_BIND_MF_NAME(mf8)<R, T, B1, B2, B3, B4, B5, B6, B7, B8>, typename _bi::list_av_9<A1, A2, A3, A4, A5, A6, A7, A8, A9>::type> |
|||
BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3, B4, B5, B6, B7, B8) BOOST_BIND_MF_NOEXCEPT, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9) |
|||
{ |
|||
typedef _mfi::BOOST_BIND_MF_NAME(mf8)<R, T, B1, B2, B3, B4, B5, B6, B7, B8> F; |
|||
typedef typename _bi::list_av_9<A1, A2, A3, A4, A5, A6, A7, A8, A9>::type list_type; |
|||
return _bi::bind_t<R, F, list_type>(F(f), list_type(a1, a2, a3, a4, a5, a6, a7, a8, a9)); |
|||
} |
|||
|
|||
template<class R, class T, |
|||
class B1, class B2, class B3, class B4, class B5, class B6, class B7, class B8, |
|||
class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9> |
|||
_bi::bind_t<R, _mfi::BOOST_BIND_MF_NAME(cmf8)<R, T, B1, B2, B3, B4, B5, B6, B7, B8>, typename _bi::list_av_9<A1, A2, A3, A4, A5, A6, A7, A8, A9>::type> |
|||
BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3, B4, B5, B6, B7, B8) const BOOST_BIND_MF_NOEXCEPT, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9) |
|||
{ |
|||
typedef _mfi::BOOST_BIND_MF_NAME(cmf8)<R, T, B1, B2, B3, B4, B5, B6, B7, B8> F; |
|||
typedef typename _bi::list_av_9<A1, A2, A3, A4, A5, A6, A7, A8, A9>::type list_type; |
|||
return _bi::bind_t<R, F, list_type>(F(f), list_type(a1, a2, a3, a4, a5, a6, a7, a8, a9)); |
|||
} |
|||
|
|||
template<class Rt2, class R, class T, |
|||
class B1, class B2, class B3, class B4, class B5, class B6, class B7, class B8, |
|||
class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9> |
|||
typename boost::enable_if_c<!_bi::is_same<Rt2, R>::value, |
|||
_bi::bind_t<Rt2, _mfi::BOOST_BIND_MF_NAME(mf8)<R, T, B1, B2, B3, B4, B5, B6, B7, B8>, typename _bi::list_av_9<A1, A2, A3, A4, A5, A6, A7, A8, A9>::type> |
|||
>::type BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3, B4, B5, B6, B7, B8) BOOST_BIND_MF_NOEXCEPT, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9) |
|||
{ |
|||
typedef _mfi::BOOST_BIND_MF_NAME(mf8)<R, T, B1, B2, B3, B4, B5, B6, B7, B8> F; |
|||
typedef typename _bi::list_av_9<A1, A2, A3, A4, A5, A6, A7, A8, A9>::type list_type; |
|||
return _bi::bind_t<Rt2, F, list_type>(F(f), list_type(a1, a2, a3, a4, a5, a6, a7, a8, a9)); |
|||
} |
|||
|
|||
template<class Rt2, class R, class T, |
|||
class B1, class B2, class B3, class B4, class B5, class B6, class B7, class B8, |
|||
class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9> |
|||
typename boost::enable_if_c<!_bi::is_same<Rt2, R>::value, |
|||
_bi::bind_t<Rt2, _mfi::BOOST_BIND_MF_NAME(cmf8)<R, T, B1, B2, B3, B4, B5, B6, B7, B8>, typename _bi::list_av_9<A1, A2, A3, A4, A5, A6, A7, A8, A9>::type> |
|||
>::type BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3, B4, B5, B6, B7, B8) const BOOST_BIND_MF_NOEXCEPT, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9) |
|||
{ |
|||
typedef _mfi::BOOST_BIND_MF_NAME(cmf8)<R, T, B1, B2, B3, B4, B5, B6, B7, B8> F; |
|||
typedef typename _bi::list_av_9<A1, A2, A3, A4, A5, A6, A7, A8, A9>::type list_type; |
|||
return _bi::bind_t<Rt2, F, list_type>(F(f), list_type(a1, a2, a3, a4, a5, a6, a7, a8, a9)); |
|||
} |
@ -0,0 +1,345 @@ |
|||
//
|
|||
// bind/bind_template.hpp
|
|||
//
|
|||
// Do not include this header directly.
|
|||
//
|
|||
// Copyright (c) 2001-2004 Peter Dimov and Multi Media Ltd.
|
|||
//
|
|||
// 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/bind/bind.html for documentation.
|
|||
//
|
|||
|
|||
typedef typename result_traits<R, F>::type result_type; |
|||
|
|||
result_type operator()() |
|||
{ |
|||
list0 a; |
|||
BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0); |
|||
} |
|||
|
|||
result_type operator()() const |
|||
{ |
|||
list0 a; |
|||
BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0); |
|||
} |
|||
|
|||
template<class A1> result_type operator()(A1 & a1) |
|||
{ |
|||
list1<A1 &> a(a1); |
|||
BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0); |
|||
} |
|||
|
|||
template<class A1> result_type operator()(A1 & a1) const |
|||
{ |
|||
list1<A1 &> a(a1); |
|||
BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0); |
|||
} |
|||
|
|||
#if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) \
|
|||
&& !BOOST_WORKAROUND(__EDG_VERSION__, <= 238) |
|||
|
|||
template<class A1> result_type operator()(A1 const & a1) |
|||
{ |
|||
list1<A1 const &> a(a1); |
|||
BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0); |
|||
} |
|||
|
|||
template<class A1> result_type operator()(A1 const & a1) const |
|||
{ |
|||
list1<A1 const &> a(a1); |
|||
BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0); |
|||
} |
|||
|
|||
#endif
|
|||
|
|||
template<class A1, class A2> result_type operator()(A1 & a1, A2 & a2) |
|||
{ |
|||
list2<A1 &, A2 &> a(a1, a2); |
|||
BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0); |
|||
} |
|||
|
|||
template<class A1, class A2> result_type operator()(A1 & a1, A2 & a2) const |
|||
{ |
|||
list2<A1 &, A2 &> a(a1, a2); |
|||
BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0); |
|||
} |
|||
|
|||
#if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) \
|
|||
&& !BOOST_WORKAROUND(__EDG_VERSION__, <= 238) |
|||
|
|||
template<class A1, class A2> result_type operator()(A1 const & a1, A2 & a2) |
|||
{ |
|||
list2<A1 const &, A2 &> a(a1, a2); |
|||
BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0); |
|||
} |
|||
|
|||
template<class A1, class A2> result_type operator()(A1 const & a1, A2 & a2) const |
|||
{ |
|||
list2<A1 const &, A2 &> a(a1, a2); |
|||
BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0); |
|||
} |
|||
|
|||
|
|||
template<class A1, class A2> result_type operator()(A1 & a1, A2 const & a2) |
|||
{ |
|||
list2<A1 &, A2 const &> a(a1, a2); |
|||
BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0); |
|||
} |
|||
|
|||
template<class A1, class A2> result_type operator()(A1 & a1, A2 const & a2) const |
|||
{ |
|||
list2<A1 &, A2 const &> a(a1, a2); |
|||
BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0); |
|||
} |
|||
|
|||
|
|||
template<class A1, class A2> result_type operator()(A1 const & a1, A2 const & a2) |
|||
{ |
|||
list2<A1 const &, A2 const &> a(a1, a2); |
|||
BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0); |
|||
} |
|||
|
|||
template<class A1, class A2> result_type operator()(A1 const & a1, A2 const & a2) const |
|||
{ |
|||
list2<A1 const &, A2 const &> a(a1, a2); |
|||
BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0); |
|||
} |
|||
|
|||
#endif
|
|||
|
|||
template<class A1, class A2, class A3> result_type operator()(A1 & a1, A2 & a2, A3 & a3) |
|||
{ |
|||
list3<A1 &, A2 &, A3 &> a(a1, a2, a3); |
|||
BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0); |
|||
} |
|||
|
|||
template<class A1, class A2, class A3> result_type operator()(A1 & a1, A2 & a2, A3 & a3) const |
|||
{ |
|||
list3<A1 &, A2 &, A3 &> a(a1, a2, a3); |
|||
BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0); |
|||
} |
|||
|
|||
#if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) \
|
|||
&& !BOOST_WORKAROUND(__EDG_VERSION__, <= 238) |
|||
|
|||
template<class A1, class A2, class A3> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3) |
|||
{ |
|||
list3<A1 const &, A2 const &, A3 const &> a(a1, a2, a3); |
|||
BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0); |
|||
} |
|||
|
|||
template<class A1, class A2, class A3> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3) const |
|||
{ |
|||
list3<A1 const &, A2 const &, A3 const &> a(a1, a2, a3); |
|||
BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0); |
|||
} |
|||
|
|||
#endif
|
|||
|
|||
template<class A1, class A2, class A3, class A4> result_type operator()(A1 & a1, A2 & a2, A3 & a3, A4 & a4) |
|||
{ |
|||
list4<A1 &, A2 &, A3 &, A4 &> a(a1, a2, a3, a4); |
|||
BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0); |
|||
} |
|||
|
|||
template<class A1, class A2, class A3, class A4> result_type operator()(A1 & a1, A2 & a2, A3 & a3, A4 & a4) const |
|||
{ |
|||
list4<A1 &, A2 &, A3 &, A4 &> a(a1, a2, a3, a4); |
|||
BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0); |
|||
} |
|||
|
|||
#if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) \
|
|||
&& !BOOST_WORKAROUND(__EDG_VERSION__, <= 238) |
|||
|
|||
template<class A1, class A2, class A3, class A4> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4) |
|||
{ |
|||
list4<A1 const &, A2 const &, A3 const &, A4 const &> a(a1, a2, a3, a4); |
|||
BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0); |
|||
} |
|||
|
|||
template<class A1, class A2, class A3, class A4> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4) const |
|||
{ |
|||
list4<A1 const &, A2 const &, A3 const &, A4 const &> a(a1, a2, a3, a4); |
|||
BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0); |
|||
} |
|||
|
|||
#endif
|
|||
|
|||
template<class A1, class A2, class A3, class A4, class A5> result_type operator()(A1 & a1, A2 & a2, A3 & a3, A4 & a4, A5 & a5) |
|||
{ |
|||
list5<A1 &, A2 &, A3 &, A4 &, A5 &> a(a1, a2, a3, a4, a5); |
|||
BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0); |
|||
} |
|||
|
|||
template<class A1, class A2, class A3, class A4, class A5> result_type operator()(A1 & a1, A2 & a2, A3 & a3, A4 & a4, A5 & a5) const |
|||
{ |
|||
list5<A1 &, A2 &, A3 &, A4 &, A5 &> a(a1, a2, a3, a4, a5); |
|||
BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0); |
|||
} |
|||
|
|||
#if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) \
|
|||
&& !BOOST_WORKAROUND(__EDG_VERSION__, <= 238) |
|||
|
|||
template<class A1, class A2, class A3, class A4, class A5> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5) |
|||
{ |
|||
list5<A1 const &, A2 const &, A3 const &, A4 const &, A5 const &> a(a1, a2, a3, a4, a5); |
|||
BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0); |
|||
} |
|||
|
|||
template<class A1, class A2, class A3, class A4, class A5> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5) const |
|||
{ |
|||
list5<A1 const &, A2 const &, A3 const &, A4 const &, A5 const &> a(a1, a2, a3, a4, a5); |
|||
BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0); |
|||
} |
|||
|
|||
#endif
|
|||
|
|||
template<class A1, class A2, class A3, class A4, class A5, class A6> result_type operator()(A1 & a1, A2 & a2, A3 & a3, A4 & a4, A5 & a5, A6 & a6) |
|||
{ |
|||
list6<A1 &, A2 &, A3 &, A4 &, A5 &, A6 &> a(a1, a2, a3, a4, a5, a6); |
|||
BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0); |
|||
} |
|||
|
|||
template<class A1, class A2, class A3, class A4, class A5, class A6> result_type operator()(A1 & a1, A2 & a2, A3 & a3, A4 & a4, A5 & a5, A6 & a6) const |
|||
{ |
|||
list6<A1 &, A2 &, A3 &, A4 &, A5 &, A6 &> a(a1, a2, a3, a4, a5, a6); |
|||
BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0); |
|||
} |
|||
|
|||
#if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) \
|
|||
&& !BOOST_WORKAROUND(__EDG_VERSION__, <= 238) |
|||
|
|||
template<class A1, class A2, class A3, class A4, class A5, class A6> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6) |
|||
{ |
|||
list6<A1 const &, A2 const &, A3 const &, A4 const &, A5 const &, A6 const &> a(a1, a2, a3, a4, a5, a6); |
|||
BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0); |
|||
} |
|||
|
|||
template<class A1, class A2, class A3, class A4, class A5, class A6> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6) const |
|||
{ |
|||
list6<A1 const &, A2 const &, A3 const &, A4 const &, A5 const &, A6 const &> a(a1, a2, a3, a4, a5, a6); |
|||
BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0); |
|||
} |
|||
|
|||
#endif
|
|||
|
|||
template<class A1, class A2, class A3, class A4, class A5, class A6, class A7> result_type operator()(A1 & a1, A2 & a2, A3 & a3, A4 & a4, A5 & a5, A6 & a6, A7 & a7) |
|||
{ |
|||
list7<A1 &, A2 &, A3 &, A4 &, A5 &, A6 &, A7 &> a(a1, a2, a3, a4, a5, a6, a7); |
|||
BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0); |
|||
} |
|||
|
|||
template<class A1, class A2, class A3, class A4, class A5, class A6, class A7> result_type operator()(A1 & a1, A2 & a2, A3 & a3, A4 & a4, A5 & a5, A6 & a6, A7 & a7) const |
|||
{ |
|||
list7<A1 &, A2 &, A3 &, A4 &, A5 &, A6 &, A7 &> a(a1, a2, a3, a4, a5, a6, a7); |
|||
BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0); |
|||
} |
|||
|
|||
#if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) \
|
|||
&& !BOOST_WORKAROUND(__EDG_VERSION__, <= 238) |
|||
|
|||
template<class A1, class A2, class A3, class A4, class A5, class A6, class A7> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7) |
|||
{ |
|||
list7<A1 const &, A2 const &, A3 const &, A4 const &, A5 const &, A6 const &, A7 const &> a(a1, a2, a3, a4, a5, a6, a7); |
|||
BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0); |
|||
} |
|||
|
|||
template<class A1, class A2, class A3, class A4, class A5, class A6, class A7> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7) const |
|||
{ |
|||
list7<A1 const &, A2 const &, A3 const &, A4 const &, A5 const &, A6 const &, A7 const &> a(a1, a2, a3, a4, a5, a6, a7); |
|||
BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0); |
|||
} |
|||
|
|||
#endif
|
|||
|
|||
template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8> result_type operator()(A1 & a1, A2 & a2, A3 & a3, A4 & a4, A5 & a5, A6 & a6, A7 & a7, A8 & a8) |
|||
{ |
|||
list8<A1 &, A2 &, A3 &, A4 &, A5 &, A6 &, A7 &, A8 &> a(a1, a2, a3, a4, a5, a6, a7, a8); |
|||
BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0); |
|||
} |
|||
|
|||
template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8> result_type operator()(A1 & a1, A2 & a2, A3 & a3, A4 & a4, A5 & a5, A6 & a6, A7 & a7, A8 & a8) const |
|||
{ |
|||
list8<A1 &, A2 &, A3 &, A4 &, A5 &, A6 &, A7 &, A8 &> a(a1, a2, a3, a4, a5, a6, a7, a8); |
|||
BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0); |
|||
} |
|||
|
|||
#if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) \
|
|||
&& !BOOST_WORKAROUND(__EDG_VERSION__, <= 238) |
|||
|
|||
template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7, A8 const & a8) |
|||
{ |
|||
list8<A1 const &, A2 const &, A3 const &, A4 const &, A5 const &, A6 const &, A7 const &, A8 const &> a(a1, a2, a3, a4, a5, a6, a7, a8); |
|||
BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0); |
|||
} |
|||
|
|||
template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7, A8 const & a8) const |
|||
{ |
|||
list8<A1 const &, A2 const &, A3 const &, A4 const &, A5 const &, A6 const &, A7 const &, A8 const &> a(a1, a2, a3, a4, a5, a6, a7, a8); |
|||
BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0); |
|||
} |
|||
|
|||
#endif
|
|||
|
|||
template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9> result_type operator()(A1 & a1, A2 & a2, A3 & a3, A4 & a4, A5 & a5, A6 & a6, A7 & a7, A8 & a8, A9 & a9) |
|||
{ |
|||
list9<A1 &, A2 &, A3 &, A4 &, A5 &, A6 &, A7 &, A8 &, A9 &> a(a1, a2, a3, a4, a5, a6, a7, a8, a9); |
|||
BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0); |
|||
} |
|||
|
|||
template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9> result_type operator()(A1 & a1, A2 & a2, A3 & a3, A4 & a4, A5 & a5, A6 & a6, A7 & a7, A8 & a8, A9 & a9) const |
|||
{ |
|||
list9<A1 &, A2 &, A3 &, A4 &, A5 &, A6 &, A7 &, A8 &, A9 &> a(a1, a2, a3, a4, a5, a6, a7, a8, a9); |
|||
BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0); |
|||
} |
|||
|
|||
#if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) \
|
|||
&& !BOOST_WORKAROUND(__EDG_VERSION__, <= 238) |
|||
|
|||
template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7, A8 const & a8, A9 const & a9) |
|||
{ |
|||
list9<A1 const &, A2 const &, A3 const &, A4 const &, A5 const &, A6 const &, A7 const &, A8 const &, A9 const &> a(a1, a2, a3, a4, a5, a6, a7, a8, a9); |
|||
BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0); |
|||
} |
|||
|
|||
template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7, A8 const & a8, A9 const & a9) const |
|||
{ |
|||
list9<A1 const &, A2 const &, A3 const &, A4 const &, A5 const &, A6 const &, A7 const &, A8 const &, A9 const &> a(a1, a2, a3, a4, a5, a6, a7, a8, a9); |
|||
BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0); |
|||
} |
|||
|
|||
#endif
|
|||
|
|||
template<class A> result_type eval(A & a) |
|||
{ |
|||
BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0); |
|||
} |
|||
|
|||
template<class A> result_type eval(A & a) const |
|||
{ |
|||
BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0); |
|||
} |
|||
|
|||
template<class V> void accept(V & v) const |
|||
{ |
|||
#if !defined( BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP ) && !defined( BOOST_BORLANDC )
|
|||
|
|||
using boost::visit_each; |
|||
|
|||
#endif
|
|||
BOOST_BIND_VISIT_EACH(v, f_, 0); |
|||
l_.accept(v); |
|||
} |
|||
|
|||
bool compare(this_type const & rhs) const |
|||
{ |
|||
return ref_compare(f_, rhs.f_, 0) && l_ == rhs.l_; |
|||
} |
|||
|
|||
private: |
|||
|
|||
F f_; |
|||
L l_; |
@ -0,0 +1,36 @@ |
|||
#ifndef BOOST_BIND_DETAIL_IS_SAME_HPP_INCLUDED
|
|||
#define BOOST_BIND_DETAIL_IS_SAME_HPP_INCLUDED
|
|||
|
|||
// is_same<T1,T2>::value is true when T1 == T2
|
|||
//
|
|||
// Copyright 2014 Peter Dimov
|
|||
//
|
|||
// 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
|
|||
|
|||
#include <boost/config.hpp>
|
|||
|
|||
#if defined(BOOST_HAS_PRAGMA_ONCE)
|
|||
# pragma once
|
|||
#endif
|
|||
|
|||
namespace boost |
|||
{ |
|||
namespace _bi |
|||
{ |
|||
|
|||
template< class T1, class T2 > struct is_same |
|||
{ |
|||
BOOST_STATIC_CONSTANT( bool, value = false ); |
|||
}; |
|||
|
|||
template< class T > struct is_same< T, T > |
|||
{ |
|||
BOOST_STATIC_CONSTANT( bool, value = true ); |
|||
}; |
|||
|
|||
} // namespace _bi
|
|||
} // namespace boost
|
|||
|
|||
#endif // #ifndef BOOST_BIND_DETAIL_IS_SAME_HPP_INCLUDED
|
@ -0,0 +1,22 @@ |
|||
#ifndef BOOST_BIND_DETAIL_REQUIRES_CXX11_HPP_INCLUDED
|
|||
#define BOOST_BIND_DETAIL_REQUIRES_CXX11_HPP_INCLUDED
|
|||
|
|||
// Copyright 2023 Peter Dimov
|
|||
// Distributed under the Boost Software License, Version 1.0.
|
|||
// https://www.boost.org/LICENSE_1_0.txt
|
|||
|
|||
#include <boost/config.hpp>
|
|||
#include <boost/config/pragma_message.hpp>
|
|||
|
|||
#if defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) || \
|
|||
defined(BOOST_NO_CXX11_RVALUE_REFERENCES) || \ |
|||
defined(BOOST_NO_CXX11_DECLTYPE) || \ |
|||
defined(BOOST_NO_CXX11_CONSTEXPR) || \ |
|||
defined(BOOST_NO_CXX11_NOEXCEPT) || \ |
|||
defined(BOOST_NO_CXX11_HDR_FUNCTIONAL) |
|||
|
|||
BOOST_PRAGMA_MESSAGE("C++03 support was deprecated in Boost.Bind 1.82 and will be removed in Boost.Bind 1.85.") |
|||
|
|||
#endif
|
|||
|
|||
#endif // #ifndef BOOST_BIND_DETAIL_REQUIRES_CXX11_HPP_INCLUDED
|
@ -0,0 +1,165 @@ |
|||
#ifndef BOOST_BIND_DETAIL_RESULT_TRAITS_HPP_INCLUDED
|
|||
#define BOOST_BIND_DETAIL_RESULT_TRAITS_HPP_INCLUDED
|
|||
|
|||
// MS compatible compilers support #pragma once
|
|||
|
|||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
|
|||
# pragma once
|
|||
#endif
|
|||
|
|||
//
|
|||
// bind/detail/result_traits.hpp
|
|||
//
|
|||
// boost/bind.hpp support header, return type deduction
|
|||
//
|
|||
// Copyright 2006, 2020 Peter Dimov
|
|||
//
|
|||
// 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/bind/bind.html for documentation.
|
|||
//
|
|||
|
|||
#include <boost/config.hpp>
|
|||
#include <boost/core/ref.hpp>
|
|||
|
|||
#if BOOST_CXX_VERSION >= 201700L
|
|||
#include <functional>
|
|||
#endif
|
|||
|
|||
namespace boost |
|||
{ |
|||
|
|||
namespace _bi |
|||
{ |
|||
|
|||
template<class R, class F> struct result_traits |
|||
{ |
|||
typedef R type; |
|||
}; |
|||
|
|||
struct unspecified {}; |
|||
|
|||
template<class F> struct result_traits<unspecified, F> |
|||
{ |
|||
typedef typename F::result_type type; |
|||
}; |
|||
|
|||
template<class F> struct result_traits< unspecified, reference_wrapper<F> > |
|||
{ |
|||
typedef typename F::result_type type; |
|||
}; |
|||
|
|||
#if BOOST_CXX_VERSION >= 201700L
|
|||
|
|||
template<class T> struct result_traits< unspecified, std::plus<T> > |
|||
{ |
|||
typedef T type; |
|||
}; |
|||
|
|||
template<class T> struct result_traits< unspecified, std::minus<T> > |
|||
{ |
|||
typedef T type; |
|||
}; |
|||
|
|||
template<class T> struct result_traits< unspecified, std::multiplies<T> > |
|||
{ |
|||
typedef T type; |
|||
}; |
|||
|
|||
template<class T> struct result_traits< unspecified, std::divides<T> > |
|||
{ |
|||
typedef T type; |
|||
}; |
|||
|
|||
template<class T> struct result_traits< unspecified, std::modulus<T> > |
|||
{ |
|||
typedef T type; |
|||
}; |
|||
|
|||
template<class T> struct result_traits< unspecified, std::negate<T> > |
|||
{ |
|||
typedef T type; |
|||
}; |
|||
|
|||
template<class T> struct result_traits< unspecified, std::equal_to<T> > |
|||
{ |
|||
typedef bool type; |
|||
}; |
|||
|
|||
template<class T> struct result_traits< unspecified, std::not_equal_to<T> > |
|||
{ |
|||
typedef bool type; |
|||
}; |
|||
|
|||
template<class T> struct result_traits< unspecified, std::greater<T> > |
|||
{ |
|||
typedef bool type; |
|||
}; |
|||
|
|||
template<class T> struct result_traits< unspecified, std::less<T> > |
|||
{ |
|||
typedef bool type; |
|||
}; |
|||
|
|||
template<class T> struct result_traits< unspecified, std::greater_equal<T> > |
|||
{ |
|||
typedef bool type; |
|||
}; |
|||
|
|||
template<class T> struct result_traits< unspecified, std::less_equal<T> > |
|||
{ |
|||
typedef bool type; |
|||
}; |
|||
|
|||
template<class T> struct result_traits< unspecified, std::logical_and<T> > |
|||
{ |
|||
typedef bool type; |
|||
}; |
|||
|
|||
template<class T> struct result_traits< unspecified, std::logical_or<T> > |
|||
{ |
|||
typedef bool type; |
|||
}; |
|||
|
|||
template<class T> struct result_traits< unspecified, std::logical_not<T> > |
|||
{ |
|||
typedef bool type; |
|||
}; |
|||
|
|||
template<class T> struct result_traits< unspecified, std::bit_and<T> > |
|||
{ |
|||
typedef T type; |
|||
}; |
|||
|
|||
template<class T> struct result_traits< unspecified, std::bit_or<T> > |
|||
{ |
|||
typedef T type; |
|||
}; |
|||
|
|||
template<class T> struct result_traits< unspecified, std::bit_xor<T> > |
|||
{ |
|||
typedef T type; |
|||
}; |
|||
|
|||
#if defined(BOOST_LIBSTDCXX_VERSION) && BOOST_LIBSTDCXX_VERSION < 40900
|
|||
|
|||
// libstdc++ 4.8 and below don't have std::bit_not
|
|||
|
|||
#else
|
|||
|
|||
template<class T> struct result_traits< unspecified, std::bit_not<T> > |
|||
{ |
|||
typedef T type; |
|||
}; |
|||
|
|||
#endif
|
|||
|
|||
#endif
|
|||
|
|||
} // namespace _bi
|
|||
|
|||
} // namespace boost
|
|||
|
|||
#endif // #ifndef BOOST_BIND_DETAIL_RESULT_TRAITS_HPP_INCLUDED
|
@ -0,0 +1,404 @@ |
|||
#ifndef BOOST_BIND_MEM_FN_HPP_INCLUDED
|
|||
#define BOOST_BIND_MEM_FN_HPP_INCLUDED
|
|||
|
|||
// MS compatible compilers support #pragma once
|
|||
|
|||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
|
|||
# pragma once
|
|||
#endif
|
|||
|
|||
//
|
|||
// mem_fn.hpp - a generalization of std::mem_fun[_ref]
|
|||
//
|
|||
// Copyright (c) 2001, 2002 Peter Dimov and Multi Media Ltd.
|
|||
// Copyright (c) 2001 David Abrahams
|
|||
// Copyright (c) 2003-2005 Peter Dimov
|
|||
//
|
|||
// 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/bind/mem_fn.html for documentation.
|
|||
//
|
|||
|
|||
#include <boost/bind/detail/requires_cxx11.hpp>
|
|||
#include <boost/get_pointer.hpp>
|
|||
#include <boost/config.hpp>
|
|||
#include <boost/config/workaround.hpp>
|
|||
|
|||
namespace boost |
|||
{ |
|||
|
|||
#if defined(BOOST_NO_VOID_RETURNS)
|
|||
|
|||
#define BOOST_MEM_FN_CLASS_F , class F
|
|||
#define BOOST_MEM_FN_TYPEDEF(X)
|
|||
|
|||
namespace _mfi // mem_fun_impl
|
|||
{ |
|||
|
|||
template<class V> struct mf |
|||
{ |
|||
|
|||
#define BOOST_MEM_FN_RETURN return
|
|||
|
|||
#define BOOST_MEM_FN_NAME(X) inner_##X
|
|||
#define BOOST_MEM_FN_CC
|
|||
|
|||
#include <boost/bind/mem_fn_template.hpp>
|
|||
|
|||
#undef BOOST_MEM_FN_CC
|
|||
#undef BOOST_MEM_FN_NAME
|
|||
|
|||
#if defined(BOOST_MEM_FN_ENABLE_CDECL) && !defined(_M_X64)
|
|||
|
|||
#define BOOST_MEM_FN_NAME(X) inner_##X##_cdecl
|
|||
#define BOOST_MEM_FN_CC __cdecl
|
|||
|
|||
#include <boost/bind/mem_fn_template.hpp>
|
|||
|
|||
#undef BOOST_MEM_FN_CC
|
|||
#undef BOOST_MEM_FN_NAME
|
|||
|
|||
#endif
|
|||
|
|||
#if defined(BOOST_MEM_FN_ENABLE_STDCALL) && !defined(_M_X64)
|
|||
|
|||
#define BOOST_MEM_FN_NAME(X) inner_##X##_stdcall
|
|||
#define BOOST_MEM_FN_CC __stdcall
|
|||
|
|||
#include <boost/bind/mem_fn_template.hpp>
|
|||
|
|||
#undef BOOST_MEM_FN_CC
|
|||
#undef BOOST_MEM_FN_NAME
|
|||
|
|||
#endif
|
|||
|
|||
#if defined(BOOST_MEM_FN_ENABLE_FASTCALL) && !defined(_M_X64)
|
|||
|
|||
#define BOOST_MEM_FN_NAME(X) inner_##X##_fastcall
|
|||
#define BOOST_MEM_FN_CC __fastcall
|
|||
|
|||
#include <boost/bind/mem_fn_template.hpp>
|
|||
|
|||
#undef BOOST_MEM_FN_CC
|
|||
#undef BOOST_MEM_FN_NAME
|
|||
|
|||
#endif
|
|||
|
|||
#undef BOOST_MEM_FN_RETURN
|
|||
|
|||
}; // struct mf<V>
|
|||
|
|||
template<> struct mf<void> |
|||
{ |
|||
|
|||
#define BOOST_MEM_FN_RETURN
|
|||
|
|||
#define BOOST_MEM_FN_NAME(X) inner_##X
|
|||
#define BOOST_MEM_FN_CC
|
|||
|
|||
#include <boost/bind/mem_fn_template.hpp>
|
|||
|
|||
#undef BOOST_MEM_FN_CC
|
|||
#undef BOOST_MEM_FN_NAME
|
|||
|
|||
#if defined(BOOST_MEM_FN_ENABLE_CDECL) && !defined(_M_X64)
|
|||
|
|||
#define BOOST_MEM_FN_NAME(X) inner_##X##_cdecl
|
|||
#define BOOST_MEM_FN_CC __cdecl
|
|||
|
|||
#include <boost/bind/mem_fn_template.hpp>
|
|||
|
|||
#undef BOOST_MEM_FN_CC
|
|||
#undef BOOST_MEM_FN_NAME
|
|||
|
|||
#endif
|
|||
|
|||
#ifdef BOOST_MEM_FN_ENABLE_STDCALL
|
|||
|
|||
#define BOOST_MEM_FN_NAME(X) inner_##X##_stdcall
|
|||
#define BOOST_MEM_FN_CC __stdcall
|
|||
|
|||
#include <boost/bind/mem_fn_template.hpp>
|
|||
|
|||
#undef BOOST_MEM_FN_CC
|
|||
#undef BOOST_MEM_FN_NAME
|
|||
|
|||
#endif
|
|||
|
|||
#ifdef BOOST_MEM_FN_ENABLE_FASTCALL
|
|||
|
|||
#define BOOST_MEM_FN_NAME(X) inner_##X##_fastcall
|
|||
#define BOOST_MEM_FN_CC __fastcall
|
|||
|
|||
#include <boost/bind/mem_fn_template.hpp>
|
|||
|
|||
#undef BOOST_MEM_FN_CC
|
|||
#undef BOOST_MEM_FN_NAME
|
|||
|
|||
#endif
|
|||
|
|||
#undef BOOST_MEM_FN_RETURN
|
|||
|
|||
}; // struct mf<void>
|
|||
|
|||
#undef BOOST_MEM_FN_CLASS_F
|
|||
#undef BOOST_MEM_FN_TYPEDEF_F
|
|||
|
|||
#define BOOST_MEM_FN_NAME(X) X
|
|||
#define BOOST_MEM_FN_NAME2(X) inner_##X
|
|||
#define BOOST_MEM_FN_CC
|
|||
|
|||
#include <boost/bind/mem_fn_vw.hpp>
|
|||
|
|||
#undef BOOST_MEM_FN_NAME
|
|||
#undef BOOST_MEM_FN_NAME2
|
|||
#undef BOOST_MEM_FN_CC
|
|||
|
|||
#if defined(BOOST_MEM_FN_ENABLE_CDECL) && !defined(_M_X64)
|
|||
|
|||
#define BOOST_MEM_FN_NAME(X) X##_cdecl
|
|||
#define BOOST_MEM_FN_NAME2(X) inner_##X##_cdecl
|
|||
#define BOOST_MEM_FN_CC __cdecl
|
|||
|
|||
#include <boost/bind/mem_fn_vw.hpp>
|
|||
|
|||
#undef BOOST_MEM_FN_NAME
|
|||
#undef BOOST_MEM_FN_NAME2
|
|||
#undef BOOST_MEM_FN_CC
|
|||
|
|||
#endif
|
|||
|
|||
#ifdef BOOST_MEM_FN_ENABLE_STDCALL
|
|||
|
|||
#define BOOST_MEM_FN_NAME(X) X##_stdcall
|
|||
#define BOOST_MEM_FN_NAME2(X) inner_##X##_stdcall
|
|||
#define BOOST_MEM_FN_CC __stdcall
|
|||
|
|||
#include <boost/bind/mem_fn_vw.hpp>
|
|||
|
|||
#undef BOOST_MEM_FN_NAME
|
|||
#undef BOOST_MEM_FN_NAME2
|
|||
#undef BOOST_MEM_FN_CC
|
|||
|
|||
#endif
|
|||
|
|||
#ifdef BOOST_MEM_FN_ENABLE_FASTCALL
|
|||
|
|||
#define BOOST_MEM_FN_NAME(X) X##_fastcall
|
|||
#define BOOST_MEM_FN_NAME2(X) inner_##X##_fastcall
|
|||
#define BOOST_MEM_FN_CC __fastcall
|
|||
|
|||
#include <boost/bind/mem_fn_vw.hpp>
|
|||
|
|||
#undef BOOST_MEM_FN_NAME
|
|||
#undef BOOST_MEM_FN_NAME2
|
|||
#undef BOOST_MEM_FN_CC
|
|||
|
|||
#endif
|
|||
|
|||
} // namespace _mfi
|
|||
|
|||
#else // #ifdef BOOST_NO_VOID_RETURNS
|
|||
|
|||
#define BOOST_MEM_FN_CLASS_F
|
|||
#define BOOST_MEM_FN_TYPEDEF(X) typedef X;
|
|||
|
|||
namespace _mfi |
|||
{ |
|||
|
|||
#define BOOST_MEM_FN_RETURN return
|
|||
|
|||
#define BOOST_MEM_FN_NAME(X) X
|
|||
#define BOOST_MEM_FN_CC
|
|||
|
|||
#include <boost/bind/mem_fn_template.hpp>
|
|||
|
|||
#undef BOOST_MEM_FN_CC
|
|||
#undef BOOST_MEM_FN_NAME
|
|||
|
|||
#if defined(BOOST_MEM_FN_ENABLE_CDECL) && !defined(_M_X64)
|
|||
|
|||
#define BOOST_MEM_FN_NAME(X) X##_cdecl
|
|||
#define BOOST_MEM_FN_CC __cdecl
|
|||
|
|||
#include <boost/bind/mem_fn_template.hpp>
|
|||
|
|||
#undef BOOST_MEM_FN_CC
|
|||
#undef BOOST_MEM_FN_NAME
|
|||
|
|||
#endif
|
|||
|
|||
#if defined(BOOST_MEM_FN_ENABLE_STDCALL) && !defined(_M_X64)
|
|||
|
|||
#define BOOST_MEM_FN_NAME(X) X##_stdcall
|
|||
#define BOOST_MEM_FN_CC __stdcall
|
|||
|
|||
#include <boost/bind/mem_fn_template.hpp>
|
|||
|
|||
#undef BOOST_MEM_FN_CC
|
|||
#undef BOOST_MEM_FN_NAME
|
|||
|
|||
#endif
|
|||
|
|||
#if defined(BOOST_MEM_FN_ENABLE_FASTCALL) && !defined(_M_X64)
|
|||
|
|||
#define BOOST_MEM_FN_NAME(X) X##_fastcall
|
|||
#define BOOST_MEM_FN_CC __fastcall
|
|||
|
|||
#include <boost/bind/mem_fn_template.hpp>
|
|||
|
|||
#undef BOOST_MEM_FN_CC
|
|||
#undef BOOST_MEM_FN_NAME
|
|||
|
|||
#endif
|
|||
|
|||
#undef BOOST_MEM_FN_RETURN
|
|||
|
|||
} // namespace _mfi
|
|||
|
|||
#undef BOOST_MEM_FN_CLASS_F
|
|||
#undef BOOST_MEM_FN_TYPEDEF
|
|||
|
|||
#endif // #ifdef BOOST_NO_VOID_RETURNS
|
|||
|
|||
#define BOOST_MEM_FN_NAME(X) X
|
|||
#define BOOST_MEM_FN_CC
|
|||
#define BOOST_MEM_FN_NOEXCEPT
|
|||
|
|||
#include <boost/bind/mem_fn_cc.hpp>
|
|||
|
|||
#if defined( __cpp_noexcept_function_type ) || defined( _NOEXCEPT_TYPES_SUPPORTED )
|
|||
# undef BOOST_MEM_FN_NOEXCEPT
|
|||
# define BOOST_MEM_FN_NOEXCEPT noexcept
|
|||
# include <boost/bind/mem_fn_cc.hpp>
|
|||
#endif
|
|||
|
|||
#undef BOOST_MEM_FN_NAME
|
|||
#undef BOOST_MEM_FN_CC
|
|||
#undef BOOST_MEM_FN_NOEXCEPT
|
|||
|
|||
#if defined(BOOST_MEM_FN_ENABLE_CDECL) && !defined(_M_X64)
|
|||
|
|||
#define BOOST_MEM_FN_NAME(X) X##_cdecl
|
|||
#define BOOST_MEM_FN_CC __cdecl
|
|||
#define BOOST_MEM_FN_NOEXCEPT
|
|||
|
|||
#include <boost/bind/mem_fn_cc.hpp>
|
|||
|
|||
#undef BOOST_MEM_FN_NAME
|
|||
#undef BOOST_MEM_FN_CC
|
|||
#undef BOOST_MEM_FN_NOEXCEPT
|
|||
|
|||
#endif
|
|||
|
|||
#if defined(BOOST_MEM_FN_ENABLE_STDCALL) && !defined(_M_X64)
|
|||
|
|||
#define BOOST_MEM_FN_NAME(X) X##_stdcall
|
|||
#define BOOST_MEM_FN_CC __stdcall
|
|||
#define BOOST_MEM_FN_NOEXCEPT
|
|||
|
|||
#include <boost/bind/mem_fn_cc.hpp>
|
|||
|
|||
#undef BOOST_MEM_FN_NAME
|
|||
#undef BOOST_MEM_FN_CC
|
|||
#undef BOOST_MEM_FN_NOEXCEPT
|
|||
|
|||
#endif
|
|||
|
|||
#if defined(BOOST_MEM_FN_ENABLE_FASTCALL) && !defined(_M_X64)
|
|||
|
|||
#define BOOST_MEM_FN_NAME(X) X##_fastcall
|
|||
#define BOOST_MEM_FN_CC __fastcall
|
|||
#define BOOST_MEM_FN_NOEXCEPT
|
|||
|
|||
#include <boost/bind/mem_fn_cc.hpp>
|
|||
|
|||
#undef BOOST_MEM_FN_NAME
|
|||
#undef BOOST_MEM_FN_CC
|
|||
#undef BOOST_MEM_FN_NOEXCEPT
|
|||
|
|||
#endif
|
|||
|
|||
// data member support
|
|||
|
|||
namespace _mfi |
|||
{ |
|||
|
|||
template<class R, class T> class dm |
|||
{ |
|||
public: |
|||
|
|||
typedef R const & result_type; |
|||
typedef T const * argument_type; |
|||
|
|||
private: |
|||
|
|||
typedef R (T::*F); |
|||
F f_; |
|||
|
|||
template<class U> R const & call(U & u, T const *) const |
|||
{ |
|||
return (u.*f_); |
|||
} |
|||
|
|||
template<class U> R const & call(U & u, void const *) const |
|||
{ |
|||
return (get_pointer(u)->*f_); |
|||
} |
|||
|
|||
public: |
|||
|
|||
explicit dm(F f): f_(f) {} |
|||
|
|||
R & operator()(T * p) const |
|||
{ |
|||
return (p->*f_); |
|||
} |
|||
|
|||
R const & operator()(T const * p) const |
|||
{ |
|||
return (p->*f_); |
|||
} |
|||
|
|||
template<class U> R const & operator()(U const & u) const |
|||
{ |
|||
return call(u, &u); |
|||
} |
|||
|
|||
#if !BOOST_WORKAROUND(BOOST_MSVC, <= 1300) && !BOOST_WORKAROUND(__MWERKS__, < 0x3200)
|
|||
|
|||
R & operator()(T & t) const |
|||
{ |
|||
return (t.*f_); |
|||
} |
|||
|
|||
R const & operator()(T const & t) const |
|||
{ |
|||
return (t.*f_); |
|||
} |
|||
|
|||
#endif
|
|||
|
|||
bool operator==(dm const & rhs) const |
|||
{ |
|||
return f_ == rhs.f_; |
|||
} |
|||
|
|||
bool operator!=(dm const & rhs) const |
|||
{ |
|||
return f_ != rhs.f_; |
|||
} |
|||
}; |
|||
|
|||
} // namespace _mfi
|
|||
|
|||
template<class R, class T> _mfi::dm<R, T> mem_fn(R T::*f) |
|||
{ |
|||
return _mfi::dm<R, T>(f); |
|||
} |
|||
|
|||
} // namespace boost
|
|||
|
|||
#endif // #ifndef BOOST_BIND_MEM_FN_HPP_INCLUDED
|
@ -0,0 +1,103 @@ |
|||
//
|
|||
// bind/mem_fn_cc.hpp - support for different calling conventions
|
|||
//
|
|||
// Do not include this header directly.
|
|||
//
|
|||
// Copyright (c) 2001 Peter Dimov and Multi Media Ltd.
|
|||
//
|
|||
// 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/bind/mem_fn.html for documentation.
|
|||
//
|
|||
|
|||
template<class R, class T> _mfi::BOOST_MEM_FN_NAME(mf0)<R, T> mem_fn(R (BOOST_MEM_FN_CC T::*f) () BOOST_MEM_FN_NOEXCEPT) |
|||
{ |
|||
return _mfi::BOOST_MEM_FN_NAME(mf0)<R, T>(f); |
|||
} |
|||
|
|||
template<class R, class T> _mfi::BOOST_MEM_FN_NAME(cmf0)<R, T> mem_fn(R (BOOST_MEM_FN_CC T::*f) () const BOOST_MEM_FN_NOEXCEPT) |
|||
{ |
|||
return _mfi::BOOST_MEM_FN_NAME(cmf0)<R, T>(f); |
|||
} |
|||
|
|||
template<class R, class T, class A1> _mfi::BOOST_MEM_FN_NAME(mf1)<R, T, A1> mem_fn(R (BOOST_MEM_FN_CC T::*f) (A1) BOOST_MEM_FN_NOEXCEPT) |
|||
{ |
|||
return _mfi::BOOST_MEM_FN_NAME(mf1)<R, T, A1>(f); |
|||
} |
|||
|
|||
template<class R, class T, class A1> _mfi::BOOST_MEM_FN_NAME(cmf1)<R, T, A1> mem_fn(R (BOOST_MEM_FN_CC T::*f) (A1) const BOOST_MEM_FN_NOEXCEPT) |
|||
{ |
|||
return _mfi::BOOST_MEM_FN_NAME(cmf1)<R, T, A1>(f); |
|||
} |
|||
|
|||
template<class R, class T, class A1, class A2> _mfi::BOOST_MEM_FN_NAME(mf2)<R, T, A1, A2> mem_fn(R (BOOST_MEM_FN_CC T::*f) (A1, A2) BOOST_MEM_FN_NOEXCEPT) |
|||
{ |
|||
return _mfi::BOOST_MEM_FN_NAME(mf2)<R, T, A1, A2>(f); |
|||
} |
|||
|
|||
template<class R, class T, class A1, class A2> _mfi::BOOST_MEM_FN_NAME(cmf2)<R, T, A1, A2> mem_fn(R (BOOST_MEM_FN_CC T::*f) (A1, A2) const BOOST_MEM_FN_NOEXCEPT) |
|||
{ |
|||
return _mfi::BOOST_MEM_FN_NAME(cmf2)<R, T, A1, A2>(f); |
|||
} |
|||
|
|||
template<class R, class T, class A1, class A2, class A3> _mfi::BOOST_MEM_FN_NAME(mf3)<R, T, A1, A2, A3> mem_fn(R (BOOST_MEM_FN_CC T::*f) (A1, A2, A3) BOOST_MEM_FN_NOEXCEPT) |
|||
{ |
|||
return _mfi::BOOST_MEM_FN_NAME(mf3)<R, T, A1, A2, A3>(f); |
|||
} |
|||
|
|||
template<class R, class T, class A1, class A2, class A3> _mfi::BOOST_MEM_FN_NAME(cmf3)<R, T, A1, A2, A3> mem_fn(R (BOOST_MEM_FN_CC T::*f) (A1, A2, A3) const BOOST_MEM_FN_NOEXCEPT) |
|||
{ |
|||
return _mfi::BOOST_MEM_FN_NAME(cmf3)<R, T, A1, A2, A3>(f); |
|||
} |
|||
|
|||
template<class R, class T, class A1, class A2, class A3, class A4> _mfi::BOOST_MEM_FN_NAME(mf4)<R, T, A1, A2, A3, A4> mem_fn(R (BOOST_MEM_FN_CC T::*f) (A1, A2, A3, A4) BOOST_MEM_FN_NOEXCEPT) |
|||
{ |
|||
return _mfi::BOOST_MEM_FN_NAME(mf4)<R, T, A1, A2, A3, A4>(f); |
|||
} |
|||
|
|||
template<class R, class T, class A1, class A2, class A3, class A4> _mfi::BOOST_MEM_FN_NAME(cmf4)<R, T, A1, A2, A3, A4> mem_fn(R (BOOST_MEM_FN_CC T::*f) (A1, A2, A3, A4) const BOOST_MEM_FN_NOEXCEPT) |
|||
{ |
|||
return _mfi::BOOST_MEM_FN_NAME(cmf4)<R, T, A1, A2, A3, A4>(f); |
|||
} |
|||
|
|||
template<class R, class T, class A1, class A2, class A3, class A4, class A5> _mfi::BOOST_MEM_FN_NAME(mf5)<R, T, A1, A2, A3, A4, A5> mem_fn(R (BOOST_MEM_FN_CC T::*f) (A1, A2, A3, A4, A5) BOOST_MEM_FN_NOEXCEPT) |
|||
{ |
|||
return _mfi::BOOST_MEM_FN_NAME(mf5)<R, T, A1, A2, A3, A4, A5>(f); |
|||
} |
|||
|
|||
template<class R, class T, class A1, class A2, class A3, class A4, class A5> _mfi::BOOST_MEM_FN_NAME(cmf5)<R, T, A1, A2, A3, A4, A5> mem_fn(R (BOOST_MEM_FN_CC T::*f) (A1, A2, A3, A4, A5) const BOOST_MEM_FN_NOEXCEPT) |
|||
{ |
|||
return _mfi::BOOST_MEM_FN_NAME(cmf5)<R, T, A1, A2, A3, A4, A5>(f); |
|||
} |
|||
|
|||
template<class R, class T, class A1, class A2, class A3, class A4, class A5, class A6> _mfi::BOOST_MEM_FN_NAME(mf6)<R, T, A1, A2, A3, A4, A5, A6> mem_fn(R (BOOST_MEM_FN_CC T::*f) (A1, A2, A3, A4, A5, A6) BOOST_MEM_FN_NOEXCEPT) |
|||
{ |
|||
return _mfi::BOOST_MEM_FN_NAME(mf6)<R, T, A1, A2, A3, A4, A5, A6>(f); |
|||
} |
|||
|
|||
template<class R, class T, class A1, class A2, class A3, class A4, class A5, class A6> _mfi::BOOST_MEM_FN_NAME(cmf6)<R, T, A1, A2, A3, A4, A5, A6> mem_fn(R (BOOST_MEM_FN_CC T::*f) (A1, A2, A3, A4, A5, A6) const BOOST_MEM_FN_NOEXCEPT) |
|||
{ |
|||
return _mfi::BOOST_MEM_FN_NAME(cmf6)<R, T, A1, A2, A3, A4, A5, A6>(f); |
|||
} |
|||
|
|||
template<class R, class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7> _mfi::BOOST_MEM_FN_NAME(mf7)<R, T, A1, A2, A3, A4, A5, A6, A7> mem_fn(R (BOOST_MEM_FN_CC T::*f) (A1, A2, A3, A4, A5, A6, A7) BOOST_MEM_FN_NOEXCEPT) |
|||
{ |
|||
return _mfi::BOOST_MEM_FN_NAME(mf7)<R, T, A1, A2, A3, A4, A5, A6, A7>(f); |
|||
} |
|||
|
|||
template<class R, class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7> _mfi::BOOST_MEM_FN_NAME(cmf7)<R, T, A1, A2, A3, A4, A5, A6, A7> mem_fn(R (BOOST_MEM_FN_CC T::*f) (A1, A2, A3, A4, A5, A6, A7) const BOOST_MEM_FN_NOEXCEPT) |
|||
{ |
|||
return _mfi::BOOST_MEM_FN_NAME(cmf7)<R, T, A1, A2, A3, A4, A5, A6, A7>(f); |
|||
} |
|||
|
|||
template<class R, class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8> _mfi::BOOST_MEM_FN_NAME(mf8)<R, T, A1, A2, A3, A4, A5, A6, A7, A8> mem_fn(R (BOOST_MEM_FN_CC T::*f) (A1, A2, A3, A4, A5, A6, A7, A8) BOOST_MEM_FN_NOEXCEPT) |
|||
{ |
|||
return _mfi::BOOST_MEM_FN_NAME(mf8)<R, T, A1, A2, A3, A4, A5, A6, A7, A8>(f); |
|||
} |
|||
|
|||
template<class R, class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8> _mfi::BOOST_MEM_FN_NAME(cmf8)<R, T, A1, A2, A3, A4, A5, A6, A7, A8> mem_fn(R (BOOST_MEM_FN_CC T::*f) (A1, A2, A3, A4, A5, A6, A7, A8) const BOOST_MEM_FN_NOEXCEPT) |
|||
{ |
|||
return _mfi::BOOST_MEM_FN_NAME(cmf8)<R, T, A1, A2, A3, A4, A5, A6, A7, A8>(f); |
|||
} |
1047
src/boost/bind/mem_fn_template.hpp
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,130 @@ |
|||
//
|
|||
// bind/mem_fn_vw.hpp - void return helper wrappers
|
|||
//
|
|||
// Do not include this header directly
|
|||
//
|
|||
// Copyright (c) 2001 Peter Dimov and Multi Media Ltd.
|
|||
//
|
|||
// 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/bind/mem_fn.html for documentation.
|
|||
//
|
|||
|
|||
template<class R, class T> struct BOOST_MEM_FN_NAME(mf0): public mf<R>::BOOST_NESTED_TEMPLATE BOOST_MEM_FN_NAME2(mf0)<R, T, R (BOOST_MEM_FN_CC T::*) ()> |
|||
{ |
|||
typedef R (BOOST_MEM_FN_CC T::*F) (); |
|||
explicit BOOST_MEM_FN_NAME(mf0)(F f): mf<R>::BOOST_NESTED_TEMPLATE BOOST_MEM_FN_NAME2(mf0)<R, T, F>(f) {} |
|||
}; |
|||
|
|||
template<class R, class T> struct BOOST_MEM_FN_NAME(cmf0): public mf<R>::BOOST_NESTED_TEMPLATE BOOST_MEM_FN_NAME2(cmf0)<R, T, R (BOOST_MEM_FN_CC T::*) () const> |
|||
{ |
|||
typedef R (BOOST_MEM_FN_CC T::*F) () const; |
|||
explicit BOOST_MEM_FN_NAME(cmf0)(F f): mf<R>::BOOST_NESTED_TEMPLATE BOOST_MEM_FN_NAME2(cmf0)<R, T, F>(f) {} |
|||
}; |
|||
|
|||
|
|||
template<class R, class T, class A1> struct BOOST_MEM_FN_NAME(mf1): public mf<R>::BOOST_NESTED_TEMPLATE BOOST_MEM_FN_NAME2(mf1)<R, T, A1, R (BOOST_MEM_FN_CC T::*) (A1)> |
|||
{ |
|||
typedef R (BOOST_MEM_FN_CC T::*F) (A1); |
|||
explicit BOOST_MEM_FN_NAME(mf1)(F f): mf<R>::BOOST_NESTED_TEMPLATE BOOST_MEM_FN_NAME2(mf1)<R, T, A1, F>(f) {} |
|||
}; |
|||
|
|||
template<class R, class T, class A1> struct BOOST_MEM_FN_NAME(cmf1): public mf<R>::BOOST_NESTED_TEMPLATE BOOST_MEM_FN_NAME2(cmf1)<R, T, A1, R (BOOST_MEM_FN_CC T::*) (A1) const> |
|||
{ |
|||
typedef R (BOOST_MEM_FN_CC T::*F) (A1) const; |
|||
explicit BOOST_MEM_FN_NAME(cmf1)(F f): mf<R>::BOOST_NESTED_TEMPLATE BOOST_MEM_FN_NAME2(cmf1)<R, T, A1, F>(f) {} |
|||
}; |
|||
|
|||
|
|||
template<class R, class T, class A1, class A2> struct BOOST_MEM_FN_NAME(mf2): public mf<R>::BOOST_NESTED_TEMPLATE BOOST_MEM_FN_NAME2(mf2)<R, T, A1, A2, R (BOOST_MEM_FN_CC T::*) (A1, A2)> |
|||
{ |
|||
typedef R (BOOST_MEM_FN_CC T::*F) (A1, A2); |
|||
explicit BOOST_MEM_FN_NAME(mf2)(F f): mf<R>::BOOST_NESTED_TEMPLATE BOOST_MEM_FN_NAME2(mf2)<R, T, A1, A2, F>(f) {} |
|||
}; |
|||
|
|||
template<class R, class T, class A1, class A2> struct BOOST_MEM_FN_NAME(cmf2): public mf<R>::BOOST_NESTED_TEMPLATE BOOST_MEM_FN_NAME2(cmf2)<R, T, A1, A2, R (BOOST_MEM_FN_CC T::*) (A1, A2) const> |
|||
{ |
|||
typedef R (BOOST_MEM_FN_CC T::*F) (A1, A2) const; |
|||
explicit BOOST_MEM_FN_NAME(cmf2)(F f): mf<R>::BOOST_NESTED_TEMPLATE BOOST_MEM_FN_NAME2(cmf2)<R, T, A1, A2, F>(f) {} |
|||
}; |
|||
|
|||
|
|||
template<class R, class T, class A1, class A2, class A3> struct BOOST_MEM_FN_NAME(mf3): public mf<R>::BOOST_NESTED_TEMPLATE BOOST_MEM_FN_NAME2(mf3)<R, T, A1, A2, A3, R (BOOST_MEM_FN_CC T::*) (A1, A2, A3)> |
|||
{ |
|||
typedef R (BOOST_MEM_FN_CC T::*F) (A1, A2, A3); |
|||
explicit BOOST_MEM_FN_NAME(mf3)(F f): mf<R>::BOOST_NESTED_TEMPLATE BOOST_MEM_FN_NAME2(mf3)<R, T, A1, A2, A3, F>(f) {} |
|||
}; |
|||
|
|||
template<class R, class T, class A1, class A2, class A3> struct BOOST_MEM_FN_NAME(cmf3): public mf<R>::BOOST_NESTED_TEMPLATE BOOST_MEM_FN_NAME2(cmf3)<R, T, A1, A2, A3, R (BOOST_MEM_FN_CC T::*) (A1, A2, A3) const> |
|||
{ |
|||
typedef R (BOOST_MEM_FN_CC T::*F) (A1, A2, A3) const; |
|||
explicit BOOST_MEM_FN_NAME(cmf3)(F f): mf<R>::BOOST_NESTED_TEMPLATE BOOST_MEM_FN_NAME2(cmf3)<R, T, A1, A2, A3, F>(f) {} |
|||
}; |
|||
|
|||
|
|||
template<class R, class T, class A1, class A2, class A3, class A4> struct BOOST_MEM_FN_NAME(mf4): public mf<R>::BOOST_NESTED_TEMPLATE BOOST_MEM_FN_NAME2(mf4)<R, T, A1, A2, A3, A4, R (BOOST_MEM_FN_CC T::*) (A1, A2, A3, A4)> |
|||
{ |
|||
typedef R (BOOST_MEM_FN_CC T::*F) (A1, A2, A3, A4); |
|||
explicit BOOST_MEM_FN_NAME(mf4)(F f): mf<R>::BOOST_NESTED_TEMPLATE BOOST_MEM_FN_NAME2(mf4)<R, T, A1, A2, A3, A4, F>(f) {} |
|||
}; |
|||
|
|||
template<class R, class T, class A1, class A2, class A3, class A4> struct BOOST_MEM_FN_NAME(cmf4): public mf<R>::BOOST_NESTED_TEMPLATE BOOST_MEM_FN_NAME2(cmf4)<R, T, A1, A2, A3, A4, R (BOOST_MEM_FN_CC T::*) (A1, A2, A3, A4) const> |
|||
{ |
|||
typedef R (BOOST_MEM_FN_CC T::*F) (A1, A2, A3, A4) const; |
|||
explicit BOOST_MEM_FN_NAME(cmf4)(F f): mf<R>::BOOST_NESTED_TEMPLATE BOOST_MEM_FN_NAME2(cmf4)<R, T, A1, A2, A3, A4, F>(f) {} |
|||
}; |
|||
|
|||
|
|||
template<class R, class T, class A1, class A2, class A3, class A4, class A5> struct BOOST_MEM_FN_NAME(mf5): public mf<R>::BOOST_NESTED_TEMPLATE BOOST_MEM_FN_NAME2(mf5)<R, T, A1, A2, A3, A4, A5, R (BOOST_MEM_FN_CC T::*) (A1, A2, A3, A4, A5)> |
|||
{ |
|||
typedef R (BOOST_MEM_FN_CC T::*F) (A1, A2, A3, A4, A5); |
|||
explicit BOOST_MEM_FN_NAME(mf5)(F f): mf<R>::BOOST_NESTED_TEMPLATE BOOST_MEM_FN_NAME2(mf5)<R, T, A1, A2, A3, A4, A5, F>(f) {} |
|||
}; |
|||
|
|||
template<class R, class T, class A1, class A2, class A3, class A4, class A5> struct BOOST_MEM_FN_NAME(cmf5): public mf<R>::BOOST_NESTED_TEMPLATE BOOST_MEM_FN_NAME2(cmf5)<R, T, A1, A2, A3, A4, A5, R (BOOST_MEM_FN_CC T::*) (A1, A2, A3, A4, A5) const> |
|||
{ |
|||
typedef R (BOOST_MEM_FN_CC T::*F) (A1, A2, A3, A4, A5) const; |
|||
explicit BOOST_MEM_FN_NAME(cmf5)(F f): mf<R>::BOOST_NESTED_TEMPLATE BOOST_MEM_FN_NAME2(cmf5)<R, T, A1, A2, A3, A4, A5, F>(f) {} |
|||
}; |
|||
|
|||
|
|||
template<class R, class T, class A1, class A2, class A3, class A4, class A5, class A6> struct BOOST_MEM_FN_NAME(mf6): public mf<R>::BOOST_NESTED_TEMPLATE BOOST_MEM_FN_NAME2(mf6)<R, T, A1, A2, A3, A4, A5, A6, R (BOOST_MEM_FN_CC T::*) (A1, A2, A3, A4, A5, A6)> |
|||
{ |
|||
typedef R (BOOST_MEM_FN_CC T::*F) (A1, A2, A3, A4, A5, A6); |
|||
explicit BOOST_MEM_FN_NAME(mf6)(F f): mf<R>::BOOST_NESTED_TEMPLATE BOOST_MEM_FN_NAME2(mf6)<R, T, A1, A2, A3, A4, A5, A6, F>(f) {} |
|||
}; |
|||
|
|||
template<class R, class T, class A1, class A2, class A3, class A4, class A5, class A6> struct BOOST_MEM_FN_NAME(cmf6): public mf<R>::BOOST_NESTED_TEMPLATE BOOST_MEM_FN_NAME2(cmf6)<R, T, A1, A2, A3, A4, A5, A6, R (BOOST_MEM_FN_CC T::*) (A1, A2, A3, A4, A5, A6) const> |
|||
{ |
|||
typedef R (BOOST_MEM_FN_CC T::*F) (A1, A2, A3, A4, A5, A6) const; |
|||
explicit BOOST_MEM_FN_NAME(cmf6)(F f): mf<R>::BOOST_NESTED_TEMPLATE BOOST_MEM_FN_NAME2(cmf6)<R, T, A1, A2, A3, A4, A5, A6, F>(f) {} |
|||
}; |
|||
|
|||
|
|||
template<class R, class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7> struct BOOST_MEM_FN_NAME(mf7): public mf<R>::BOOST_NESTED_TEMPLATE BOOST_MEM_FN_NAME2(mf7)<R, T, A1, A2, A3, A4, A5, A6, A7, R (BOOST_MEM_FN_CC T::*) (A1, A2, A3, A4, A5, A6, A7)> |
|||
{ |
|||
typedef R (BOOST_MEM_FN_CC T::*F) (A1, A2, A3, A4, A5, A6, A7); |
|||
explicit BOOST_MEM_FN_NAME(mf7)(F f): mf<R>::BOOST_NESTED_TEMPLATE BOOST_MEM_FN_NAME2(mf7)<R, T, A1, A2, A3, A4, A5, A6, A7, F>(f) {} |
|||
}; |
|||
|
|||
template<class R, class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7> struct BOOST_MEM_FN_NAME(cmf7): public mf<R>::BOOST_NESTED_TEMPLATE BOOST_MEM_FN_NAME2(cmf7)<R, T, A1, A2, A3, A4, A5, A6, A7, R (BOOST_MEM_FN_CC T::*) (A1, A2, A3, A4, A5, A6, A7) const> |
|||
{ |
|||
typedef R (BOOST_MEM_FN_CC T::*F) (A1, A2, A3, A4, A5, A6, A7) const; |
|||
explicit BOOST_MEM_FN_NAME(cmf7)(F f): mf<R>::BOOST_NESTED_TEMPLATE BOOST_MEM_FN_NAME2(cmf7)<R, T, A1, A2, A3, A4, A5, A6, A7, F>(f) {} |
|||
}; |
|||
|
|||
|
|||
template<class R, class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8> struct BOOST_MEM_FN_NAME(mf8): public mf<R>::BOOST_NESTED_TEMPLATE BOOST_MEM_FN_NAME2(mf8)<R, T, A1, A2, A3, A4, A5, A6, A7, A8, R (BOOST_MEM_FN_CC T::*) (A1, A2, A3, A4, A5, A6, A7, A8)> |
|||
{ |
|||
typedef R (BOOST_MEM_FN_CC T::*F) (A1, A2, A3, A4, A5, A6, A7, A8); |
|||
explicit BOOST_MEM_FN_NAME(mf8)(F f): mf<R>::BOOST_NESTED_TEMPLATE BOOST_MEM_FN_NAME2(mf8)<R, T, A1, A2, A3, A4, A5, A6, A7, A8, F>(f) {} |
|||
}; |
|||
|
|||
template<class R, class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8> struct BOOST_MEM_FN_NAME(cmf8): public mf<R>::BOOST_NESTED_TEMPLATE BOOST_MEM_FN_NAME2(cmf8)<R, T, A1, A2, A3, A4, A5, A6, A7, A8, R (BOOST_MEM_FN_CC T::*) (A1, A2, A3, A4, A5, A6, A7, A8) const> |
|||
{ |
|||
typedef R (BOOST_MEM_FN_CC T::*F) (A1, A2, A3, A4, A5, A6, A7, A8) const; |
|||
explicit BOOST_MEM_FN_NAME(cmf8)(F f): mf<R>::BOOST_NESTED_TEMPLATE BOOST_MEM_FN_NAME2(cmf8)<R, T, A1, A2, A3, A4, A5, A6, A7, A8, F>(f) {} |
|||
}; |
|||
|
@ -0,0 +1,74 @@ |
|||
#ifndef BOOST_BIND_PLACEHOLDERS_HPP_INCLUDED
|
|||
#define BOOST_BIND_PLACEHOLDERS_HPP_INCLUDED
|
|||
|
|||
// MS compatible compilers support #pragma once
|
|||
|
|||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
|
|||
# pragma once
|
|||
#endif
|
|||
|
|||
//
|
|||
// bind/placeholders.hpp - _N definitions
|
|||
//
|
|||
// Copyright (c) 2002 Peter Dimov and Multi Media Ltd.
|
|||
// Copyright 2015 Peter Dimov
|
|||
//
|
|||
// 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/bind/bind.html for documentation.
|
|||
//
|
|||
|
|||
#include <boost/bind/arg.hpp>
|
|||
#include <boost/config.hpp>
|
|||
|
|||
namespace boost |
|||
{ |
|||
|
|||
namespace placeholders |
|||
{ |
|||
|
|||
#if defined(BOOST_BORLANDC) || defined(__GNUC__) && (__GNUC__ < 4)
|
|||
|
|||
inline boost::arg<1> _1() { return boost::arg<1>(); } |
|||
inline boost::arg<2> _2() { return boost::arg<2>(); } |
|||
inline boost::arg<3> _3() { return boost::arg<3>(); } |
|||
inline boost::arg<4> _4() { return boost::arg<4>(); } |
|||
inline boost::arg<5> _5() { return boost::arg<5>(); } |
|||
inline boost::arg<6> _6() { return boost::arg<6>(); } |
|||
inline boost::arg<7> _7() { return boost::arg<7>(); } |
|||
inline boost::arg<8> _8() { return boost::arg<8>(); } |
|||
inline boost::arg<9> _9() { return boost::arg<9>(); } |
|||
|
|||
#elif !defined(BOOST_NO_CXX17_INLINE_VARIABLES)
|
|||
|
|||
BOOST_INLINE_CONSTEXPR boost::arg<1> _1; |
|||
BOOST_INLINE_CONSTEXPR boost::arg<2> _2; |
|||
BOOST_INLINE_CONSTEXPR boost::arg<3> _3; |
|||
BOOST_INLINE_CONSTEXPR boost::arg<4> _4; |
|||
BOOST_INLINE_CONSTEXPR boost::arg<5> _5; |
|||
BOOST_INLINE_CONSTEXPR boost::arg<6> _6; |
|||
BOOST_INLINE_CONSTEXPR boost::arg<7> _7; |
|||
BOOST_INLINE_CONSTEXPR boost::arg<8> _8; |
|||
BOOST_INLINE_CONSTEXPR boost::arg<9> _9; |
|||
|
|||
#else
|
|||
|
|||
BOOST_STATIC_CONSTEXPR boost::arg<1> _1; |
|||
BOOST_STATIC_CONSTEXPR boost::arg<2> _2; |
|||
BOOST_STATIC_CONSTEXPR boost::arg<3> _3; |
|||
BOOST_STATIC_CONSTEXPR boost::arg<4> _4; |
|||
BOOST_STATIC_CONSTEXPR boost::arg<5> _5; |
|||
BOOST_STATIC_CONSTEXPR boost::arg<6> _6; |
|||
BOOST_STATIC_CONSTEXPR boost::arg<7> _7; |
|||
BOOST_STATIC_CONSTEXPR boost::arg<8> _8; |
|||
BOOST_STATIC_CONSTEXPR boost::arg<9> _9; |
|||
|
|||
#endif
|
|||
|
|||
} // namespace placeholders
|
|||
|
|||
} // namespace boost
|
|||
|
|||
#endif // #ifndef BOOST_BIND_PLACEHOLDERS_HPP_INCLUDED
|
@ -0,0 +1,40 @@ |
|||
#ifndef BOOST_BIND_STD_PLACEHOLDERS_HPP_INCLUDED
|
|||
#define BOOST_BIND_STD_PLACEHOLDERS_HPP_INCLUDED
|
|||
|
|||
// MS compatible compilers support #pragma once
|
|||
|
|||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
|
|||
# pragma once
|
|||
#endif
|
|||
|
|||
// Copyright 2021 Peter Dimov
|
|||
// Distributed under the Boost Software License, Version 1.0.
|
|||
// https://www.boost.org/LICENSE_1_0.txt
|
|||
|
|||
#include <boost/bind/detail/requires_cxx11.hpp>
|
|||
#include <boost/is_placeholder.hpp>
|
|||
#include <boost/config.hpp>
|
|||
|
|||
#if !defined(BOOST_NO_CXX11_HDR_FUNCTIONAL) && !defined(BOOST_NO_CXX11_DECLTYPE) && !defined(BOOST_NO_CXX11_HDR_TYPE_TRAITS)
|
|||
|
|||
#include <functional>
|
|||
#include <type_traits>
|
|||
|
|||
namespace boost |
|||
{ |
|||
|
|||
template<> struct is_placeholder< typename std::decay<decltype(std::placeholders::_1)>::type > { enum _vt { value = 1 }; }; |
|||
template<> struct is_placeholder< typename std::decay<decltype(std::placeholders::_2)>::type > { enum _vt { value = 2 }; }; |
|||
template<> struct is_placeholder< typename std::decay<decltype(std::placeholders::_3)>::type > { enum _vt { value = 3 }; }; |
|||
template<> struct is_placeholder< typename std::decay<decltype(std::placeholders::_4)>::type > { enum _vt { value = 4 }; }; |
|||
template<> struct is_placeholder< typename std::decay<decltype(std::placeholders::_5)>::type > { enum _vt { value = 5 }; }; |
|||
template<> struct is_placeholder< typename std::decay<decltype(std::placeholders::_6)>::type > { enum _vt { value = 6 }; }; |
|||
template<> struct is_placeholder< typename std::decay<decltype(std::placeholders::_7)>::type > { enum _vt { value = 7 }; }; |
|||
template<> struct is_placeholder< typename std::decay<decltype(std::placeholders::_8)>::type > { enum _vt { value = 8 }; }; |
|||
template<> struct is_placeholder< typename std::decay<decltype(std::placeholders::_9)>::type > { enum _vt { value = 9 }; }; |
|||
|
|||
} // namespace boost
|
|||
|
|||
#endif
|
|||
|
|||
#endif // #ifndef BOOST_BIND_STD_PLACEHOLDERS_HPP_INCLUDED
|
@ -0,0 +1,476 @@ |
|||
#ifndef BOOST_BIND_STORAGE_HPP_INCLUDED
|
|||
#define BOOST_BIND_STORAGE_HPP_INCLUDED
|
|||
|
|||
// MS compatible compilers support #pragma once
|
|||
|
|||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
|
|||
# pragma once
|
|||
#endif
|
|||
|
|||
//
|
|||
// bind/storage.hpp
|
|||
//
|
|||
// boost/bind.hpp support header, optimized storage
|
|||
//
|
|||
// Copyright (c) 2006 Peter Dimov
|
|||
//
|
|||
// 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/bind/bind.html for documentation.
|
|||
//
|
|||
|
|||
#include <boost/bind/detail/requires_cxx11.hpp>
|
|||
#include <boost/config.hpp>
|
|||
#include <boost/bind/arg.hpp>
|
|||
|
|||
#ifdef BOOST_MSVC
|
|||
# pragma warning(push)
|
|||
# pragma warning(disable: 4512) // assignment operator could not be generated
|
|||
#endif
|
|||
|
|||
namespace boost |
|||
{ |
|||
|
|||
namespace _bi |
|||
{ |
|||
|
|||
// 1
|
|||
|
|||
template<class A1> struct storage1 |
|||
{ |
|||
explicit storage1( A1 a1 ): a1_( a1 ) {} |
|||
|
|||
template<class V> void accept(V & v) const |
|||
{ |
|||
BOOST_BIND_VISIT_EACH(v, a1_, 0); |
|||
} |
|||
|
|||
A1 a1_; |
|||
}; |
|||
|
|||
#if !defined( BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION ) && !defined( BOOST_BORLANDC )
|
|||
|
|||
template<int I> struct storage1< boost::arg<I> > |
|||
{ |
|||
explicit storage1( boost::arg<I> ) {} |
|||
|
|||
template<class V> void accept(V &) const { } |
|||
|
|||
static boost::arg<I> a1_() { return boost::arg<I>(); } |
|||
}; |
|||
|
|||
template<int I> struct storage1< boost::arg<I> (*) () > |
|||
{ |
|||
explicit storage1( boost::arg<I> (*) () ) {} |
|||
|
|||
template<class V> void accept(V &) const { } |
|||
|
|||
static boost::arg<I> a1_() { return boost::arg<I>(); } |
|||
}; |
|||
|
|||
#endif
|
|||
|
|||
// 2
|
|||
|
|||
template<class A1, class A2> struct storage2: public storage1<A1> |
|||
{ |
|||
typedef storage1<A1> inherited; |
|||
|
|||
storage2( A1 a1, A2 a2 ): storage1<A1>( a1 ), a2_( a2 ) {} |
|||
|
|||
template<class V> void accept(V & v) const |
|||
{ |
|||
inherited::accept(v); |
|||
BOOST_BIND_VISIT_EACH(v, a2_, 0); |
|||
} |
|||
|
|||
A2 a2_; |
|||
}; |
|||
|
|||
#if !defined( BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION )
|
|||
|
|||
template<class A1, int I> struct storage2< A1, boost::arg<I> >: public storage1<A1> |
|||
{ |
|||
typedef storage1<A1> inherited; |
|||
|
|||
storage2( A1 a1, boost::arg<I> ): storage1<A1>( a1 ) {} |
|||
|
|||
template<class V> void accept(V & v) const |
|||
{ |
|||
inherited::accept(v); |
|||
} |
|||
|
|||
static boost::arg<I> a2_() { return boost::arg<I>(); } |
|||
}; |
|||
|
|||
template<class A1, int I> struct storage2< A1, boost::arg<I> (*) () >: public storage1<A1> |
|||
{ |
|||
typedef storage1<A1> inherited; |
|||
|
|||
storage2( A1 a1, boost::arg<I> (*) () ): storage1<A1>( a1 ) {} |
|||
|
|||
template<class V> void accept(V & v) const |
|||
{ |
|||
inherited::accept(v); |
|||
} |
|||
|
|||
static boost::arg<I> a2_() { return boost::arg<I>(); } |
|||
}; |
|||
|
|||
#endif
|
|||
|
|||
// 3
|
|||
|
|||
template<class A1, class A2, class A3> struct storage3: public storage2< A1, A2 > |
|||
{ |
|||
typedef storage2<A1, A2> inherited; |
|||
|
|||
storage3( A1 a1, A2 a2, A3 a3 ): storage2<A1, A2>( a1, a2 ), a3_( a3 ) {} |
|||
|
|||
template<class V> void accept(V & v) const |
|||
{ |
|||
inherited::accept(v); |
|||
BOOST_BIND_VISIT_EACH(v, a3_, 0); |
|||
} |
|||
|
|||
A3 a3_; |
|||
}; |
|||
|
|||
#if !defined( BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION )
|
|||
|
|||
template<class A1, class A2, int I> struct storage3< A1, A2, boost::arg<I> >: public storage2< A1, A2 > |
|||
{ |
|||
typedef storage2<A1, A2> inherited; |
|||
|
|||
storage3( A1 a1, A2 a2, boost::arg<I> ): storage2<A1, A2>( a1, a2 ) {} |
|||
|
|||
template<class V> void accept(V & v) const |
|||
{ |
|||
inherited::accept(v); |
|||
} |
|||
|
|||
static boost::arg<I> a3_() { return boost::arg<I>(); } |
|||
}; |
|||
|
|||
template<class A1, class A2, int I> struct storage3< A1, A2, boost::arg<I> (*) () >: public storage2< A1, A2 > |
|||
{ |
|||
typedef storage2<A1, A2> inherited; |
|||
|
|||
storage3( A1 a1, A2 a2, boost::arg<I> (*) () ): storage2<A1, A2>( a1, a2 ) {} |
|||
|
|||
template<class V> void accept(V & v) const |
|||
{ |
|||
inherited::accept(v); |
|||
} |
|||
|
|||
static boost::arg<I> a3_() { return boost::arg<I>(); } |
|||
}; |
|||
|
|||
#endif
|
|||
|
|||
// 4
|
|||
|
|||
template<class A1, class A2, class A3, class A4> struct storage4: public storage3< A1, A2, A3 > |
|||
{ |
|||
typedef storage3<A1, A2, A3> inherited; |
|||
|
|||
storage4( A1 a1, A2 a2, A3 a3, A4 a4 ): storage3<A1, A2, A3>( a1, a2, a3 ), a4_( a4 ) {} |
|||
|
|||
template<class V> void accept(V & v) const |
|||
{ |
|||
inherited::accept(v); |
|||
BOOST_BIND_VISIT_EACH(v, a4_, 0); |
|||
} |
|||
|
|||
A4 a4_; |
|||
}; |
|||
|
|||
#if !defined( BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION )
|
|||
|
|||
template<class A1, class A2, class A3, int I> struct storage4< A1, A2, A3, boost::arg<I> >: public storage3< A1, A2, A3 > |
|||
{ |
|||
typedef storage3<A1, A2, A3> inherited; |
|||
|
|||
storage4( A1 a1, A2 a2, A3 a3, boost::arg<I> ): storage3<A1, A2, A3>( a1, a2, a3 ) {} |
|||
|
|||
template<class V> void accept(V & v) const |
|||
{ |
|||
inherited::accept(v); |
|||
} |
|||
|
|||
static boost::arg<I> a4_() { return boost::arg<I>(); } |
|||
}; |
|||
|
|||
template<class A1, class A2, class A3, int I> struct storage4< A1, A2, A3, boost::arg<I> (*) () >: public storage3< A1, A2, A3 > |
|||
{ |
|||
typedef storage3<A1, A2, A3> inherited; |
|||
|
|||
storage4( A1 a1, A2 a2, A3 a3, boost::arg<I> (*) () ): storage3<A1, A2, A3>( a1, a2, a3 ) {} |
|||
|
|||
template<class V> void accept(V & v) const |
|||
{ |
|||
inherited::accept(v); |
|||
} |
|||
|
|||
static boost::arg<I> a4_() { return boost::arg<I>(); } |
|||
}; |
|||
|
|||
#endif
|
|||
|
|||
// 5
|
|||
|
|||
template<class A1, class A2, class A3, class A4, class A5> struct storage5: public storage4< A1, A2, A3, A4 > |
|||
{ |
|||
typedef storage4<A1, A2, A3, A4> inherited; |
|||
|
|||
storage5( A1 a1, A2 a2, A3 a3, A4 a4, A5 a5 ): storage4<A1, A2, A3, A4>( a1, a2, a3, a4 ), a5_( a5 ) {} |
|||
|
|||
template<class V> void accept(V & v) const |
|||
{ |
|||
inherited::accept(v); |
|||
BOOST_BIND_VISIT_EACH(v, a5_, 0); |
|||
} |
|||
|
|||
A5 a5_; |
|||
}; |
|||
|
|||
#if !defined( BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION )
|
|||
|
|||
template<class A1, class A2, class A3, class A4, int I> struct storage5< A1, A2, A3, A4, boost::arg<I> >: public storage4< A1, A2, A3, A4 > |
|||
{ |
|||
typedef storage4<A1, A2, A3, A4> inherited; |
|||
|
|||
storage5( A1 a1, A2 a2, A3 a3, A4 a4, boost::arg<I> ): storage4<A1, A2, A3, A4>( a1, a2, a3, a4 ) {} |
|||
|
|||
template<class V> void accept(V & v) const |
|||
{ |
|||
inherited::accept(v); |
|||
} |
|||
|
|||
static boost::arg<I> a5_() { return boost::arg<I>(); } |
|||
}; |
|||
|
|||
template<class A1, class A2, class A3, class A4, int I> struct storage5< A1, A2, A3, A4, boost::arg<I> (*) () >: public storage4< A1, A2, A3, A4 > |
|||
{ |
|||
typedef storage4<A1, A2, A3, A4> inherited; |
|||
|
|||
storage5( A1 a1, A2 a2, A3 a3, A4 a4, boost::arg<I> (*) () ): storage4<A1, A2, A3, A4>( a1, a2, a3, a4 ) {} |
|||
|
|||
template<class V> void accept(V & v) const |
|||
{ |
|||
inherited::accept(v); |
|||
} |
|||
|
|||
static boost::arg<I> a5_() { return boost::arg<I>(); } |
|||
}; |
|||
|
|||
#endif
|
|||
|
|||
// 6
|
|||
|
|||
template<class A1, class A2, class A3, class A4, class A5, class A6> struct storage6: public storage5< A1, A2, A3, A4, A5 > |
|||
{ |
|||
typedef storage5<A1, A2, A3, A4, A5> inherited; |
|||
|
|||
storage6( A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6 ): storage5<A1, A2, A3, A4, A5>( a1, a2, a3, a4, a5 ), a6_( a6 ) {} |
|||
|
|||
template<class V> void accept(V & v) const |
|||
{ |
|||
inherited::accept(v); |
|||
BOOST_BIND_VISIT_EACH(v, a6_, 0); |
|||
} |
|||
|
|||
A6 a6_; |
|||
}; |
|||
|
|||
#if !defined( BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION )
|
|||
|
|||
template<class A1, class A2, class A3, class A4, class A5, int I> struct storage6< A1, A2, A3, A4, A5, boost::arg<I> >: public storage5< A1, A2, A3, A4, A5 > |
|||
{ |
|||
typedef storage5<A1, A2, A3, A4, A5> inherited; |
|||
|
|||
storage6( A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, boost::arg<I> ): storage5<A1, A2, A3, A4, A5>( a1, a2, a3, a4, a5 ) {} |
|||
|
|||
template<class V> void accept(V & v) const |
|||
{ |
|||
inherited::accept(v); |
|||
} |
|||
|
|||
static boost::arg<I> a6_() { return boost::arg<I>(); } |
|||
}; |
|||
|
|||
template<class A1, class A2, class A3, class A4, class A5, int I> struct storage6< A1, A2, A3, A4, A5, boost::arg<I> (*) () >: public storage5< A1, A2, A3, A4, A5 > |
|||
{ |
|||
typedef storage5<A1, A2, A3, A4, A5> inherited; |
|||
|
|||
storage6( A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, boost::arg<I> (*) () ): storage5<A1, A2, A3, A4, A5>( a1, a2, a3, a4, a5 ) {} |
|||
|
|||
template<class V> void accept(V & v) const |
|||
{ |
|||
inherited::accept(v); |
|||
} |
|||
|
|||
static boost::arg<I> a6_() { return boost::arg<I>(); } |
|||
}; |
|||
|
|||
#endif
|
|||
|
|||
// 7
|
|||
|
|||
template<class A1, class A2, class A3, class A4, class A5, class A6, class A7> struct storage7: public storage6< A1, A2, A3, A4, A5, A6 > |
|||
{ |
|||
typedef storage6<A1, A2, A3, A4, A5, A6> inherited; |
|||
|
|||
storage7( A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7 ): storage6<A1, A2, A3, A4, A5, A6>( a1, a2, a3, a4, a5, a6 ), a7_( a7 ) {} |
|||
|
|||
template<class V> void accept(V & v) const |
|||
{ |
|||
inherited::accept(v); |
|||
BOOST_BIND_VISIT_EACH(v, a7_, 0); |
|||
} |
|||
|
|||
A7 a7_; |
|||
}; |
|||
|
|||
#if !defined( BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION )
|
|||
|
|||
template<class A1, class A2, class A3, class A4, class A5, class A6, int I> struct storage7< A1, A2, A3, A4, A5, A6, boost::arg<I> >: public storage6< A1, A2, A3, A4, A5, A6 > |
|||
{ |
|||
typedef storage6<A1, A2, A3, A4, A5, A6> inherited; |
|||
|
|||
storage7( A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, boost::arg<I> ): storage6<A1, A2, A3, A4, A5, A6>( a1, a2, a3, a4, a5, a6 ) {} |
|||
|
|||
template<class V> void accept(V & v) const |
|||
{ |
|||
inherited::accept(v); |
|||
} |
|||
|
|||
static boost::arg<I> a7_() { return boost::arg<I>(); } |
|||
}; |
|||
|
|||
template<class A1, class A2, class A3, class A4, class A5, class A6, int I> struct storage7< A1, A2, A3, A4, A5, A6, boost::arg<I> (*) () >: public storage6< A1, A2, A3, A4, A5, A6 > |
|||
{ |
|||
typedef storage6<A1, A2, A3, A4, A5, A6> inherited; |
|||
|
|||
storage7( A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, boost::arg<I> (*) () ): storage6<A1, A2, A3, A4, A5, A6>( a1, a2, a3, a4, a5, a6 ) {} |
|||
|
|||
template<class V> void accept(V & v) const |
|||
{ |
|||
inherited::accept(v); |
|||
} |
|||
|
|||
static boost::arg<I> a7_() { return boost::arg<I>(); } |
|||
}; |
|||
|
|||
#endif
|
|||
|
|||
// 8
|
|||
|
|||
template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8> struct storage8: public storage7< A1, A2, A3, A4, A5, A6, A7 > |
|||
{ |
|||
typedef storage7<A1, A2, A3, A4, A5, A6, A7> inherited; |
|||
|
|||
storage8( A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8 ): storage7<A1, A2, A3, A4, A5, A6, A7>( a1, a2, a3, a4, a5, a6, a7 ), a8_( a8 ) {} |
|||
|
|||
template<class V> void accept(V & v) const |
|||
{ |
|||
inherited::accept(v); |
|||
BOOST_BIND_VISIT_EACH(v, a8_, 0); |
|||
} |
|||
|
|||
A8 a8_; |
|||
}; |
|||
|
|||
#if !defined( BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION )
|
|||
|
|||
template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, int I> struct storage8< A1, A2, A3, A4, A5, A6, A7, boost::arg<I> >: public storage7< A1, A2, A3, A4, A5, A6, A7 > |
|||
{ |
|||
typedef storage7<A1, A2, A3, A4, A5, A6, A7> inherited; |
|||
|
|||
storage8( A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, boost::arg<I> ): storage7<A1, A2, A3, A4, A5, A6, A7>( a1, a2, a3, a4, a5, a6, a7 ) {} |
|||
|
|||
template<class V> void accept(V & v) const |
|||
{ |
|||
inherited::accept(v); |
|||
} |
|||
|
|||
static boost::arg<I> a8_() { return boost::arg<I>(); } |
|||
}; |
|||
|
|||
template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, int I> struct storage8< A1, A2, A3, A4, A5, A6, A7, boost::arg<I> (*) () >: public storage7< A1, A2, A3, A4, A5, A6, A7 > |
|||
{ |
|||
typedef storage7<A1, A2, A3, A4, A5, A6, A7> inherited; |
|||
|
|||
storage8( A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, boost::arg<I> (*) () ): storage7<A1, A2, A3, A4, A5, A6, A7>( a1, a2, a3, a4, a5, a6, a7 ) {} |
|||
|
|||
template<class V> void accept(V & v) const |
|||
{ |
|||
inherited::accept(v); |
|||
} |
|||
|
|||
static boost::arg<I> a8_() { return boost::arg<I>(); } |
|||
}; |
|||
|
|||
#endif
|
|||
|
|||
// 9
|
|||
|
|||
template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9> struct storage9: public storage8< A1, A2, A3, A4, A5, A6, A7, A8 > |
|||
{ |
|||
typedef storage8<A1, A2, A3, A4, A5, A6, A7, A8> inherited; |
|||
|
|||
storage9( A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9 ): storage8<A1, A2, A3, A4, A5, A6, A7, A8>( a1, a2, a3, a4, a5, a6, a7, a8 ), a9_( a9 ) {} |
|||
|
|||
template<class V> void accept(V & v) const |
|||
{ |
|||
inherited::accept(v); |
|||
BOOST_BIND_VISIT_EACH(v, a9_, 0); |
|||
} |
|||
|
|||
A9 a9_; |
|||
}; |
|||
|
|||
#if !defined( BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION )
|
|||
|
|||
template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, int I> struct storage9< A1, A2, A3, A4, A5, A6, A7, A8, boost::arg<I> >: public storage8< A1, A2, A3, A4, A5, A6, A7, A8 > |
|||
{ |
|||
typedef storage8<A1, A2, A3, A4, A5, A6, A7, A8> inherited; |
|||
|
|||
storage9( A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, boost::arg<I> ): storage8<A1, A2, A3, A4, A5, A6, A7, A8>( a1, a2, a3, a4, a5, a6, a7, a8 ) {} |
|||
|
|||
template<class V> void accept(V & v) const |
|||
{ |
|||
inherited::accept(v); |
|||
} |
|||
|
|||
static boost::arg<I> a9_() { return boost::arg<I>(); } |
|||
}; |
|||
|
|||
template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, int I> struct storage9< A1, A2, A3, A4, A5, A6, A7, A8, boost::arg<I> (*) () >: public storage8< A1, A2, A3, A4, A5, A6, A7, A8 > |
|||
{ |
|||
typedef storage8<A1, A2, A3, A4, A5, A6, A7, A8> inherited; |
|||
|
|||
storage9( A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, boost::arg<I> (*) () ): storage8<A1, A2, A3, A4, A5, A6, A7, A8>( a1, a2, a3, a4, a5, a6, a7, a8 ) {} |
|||
|
|||
template<class V> void accept(V & v) const |
|||
{ |
|||
inherited::accept(v); |
|||
} |
|||
|
|||
static boost::arg<I> a9_() { return boost::arg<I>(); } |
|||
}; |
|||
|
|||
#endif
|
|||
|
|||
} // namespace _bi
|
|||
|
|||
} // namespace boost
|
|||
|
|||
#ifdef BOOST_MSVC
|
|||
# pragma warning(default: 4512) // assignment operator could not be generated
|
|||
# pragma warning(pop)
|
|||
#endif
|
|||
|
|||
#endif // #ifndef BOOST_BIND_STORAGE_HPP_INCLUDED
|
@ -0,0 +1,20 @@ |
|||
// (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000.
|
|||
// Use, modification and distribution are 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/utility for most recent version including documentation.
|
|||
|
|||
// See boost/detail/call_traits.hpp
|
|||
// for full copyright notices.
|
|||
|
|||
#ifndef BOOST_CALL_TRAITS_HPP
|
|||
#define BOOST_CALL_TRAITS_HPP
|
|||
|
|||
#ifndef BOOST_CONFIG_HPP
|
|||
#include <boost/config.hpp>
|
|||
#endif
|
|||
|
|||
#include <boost/detail/call_traits.hpp>
|
|||
|
|||
#endif // BOOST_CALL_TRAITS_HPP
|
@ -0,0 +1,502 @@ |
|||
//////////////////////////////////////////////////////////////////////////////
|
|||
//
|
|||
// (C) Copyright Pablo Halpern 2009. 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)
|
|||
//
|
|||
//////////////////////////////////////////////////////////////////////////////
|
|||
//
|
|||
// (C) Copyright Ion Gaztanaga 2011-2013. 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_ALLOCATOR_ALLOCATOR_TRAITS_HPP
|
|||
#define BOOST_CONTAINER_ALLOCATOR_ALLOCATOR_TRAITS_HPP
|
|||
|
|||
#ifndef BOOST_CONFIG_HPP
|
|||
# include <boost/config.hpp>
|
|||
#endif
|
|||
|
|||
#if defined(BOOST_HAS_PRAGMA_ONCE)
|
|||
# pragma once
|
|||
#endif
|
|||
|
|||
#include <boost/container/detail/config_begin.hpp>
|
|||
#include <boost/container/detail/workaround.hpp>
|
|||
|
|||
// container
|
|||
#include <boost/container/container_fwd.hpp>
|
|||
#include <boost/container/detail/mpl.hpp>
|
|||
#include <boost/container/detail/type_traits.hpp> //is_empty
|
|||
#include <boost/container/detail/placement_new.hpp>
|
|||
#ifndef BOOST_CONTAINER_DETAIL_STD_FWD_HPP
|
|||
#include <boost/container/detail/std_fwd.hpp>
|
|||
#endif
|
|||
// intrusive
|
|||
#include <boost/intrusive/pointer_traits.hpp>
|
|||
#include <boost/intrusive/detail/mpl.hpp>
|
|||
// move
|
|||
#include <boost/move/utility_core.hpp>
|
|||
// move/detail
|
|||
#if defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
|
|||
#include <boost/move/detail/fwd_macros.hpp>
|
|||
#endif
|
|||
// other boost
|
|||
#include <boost/static_assert.hpp>
|
|||
|
|||
#ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
|
|||
|
|||
#if defined(BOOST_GCC) && (BOOST_GCC >= 40600)
|
|||
#pragma GCC diagnostic push
|
|||
#pragma GCC diagnostic ignored "-Wunused-result"
|
|||
#endif
|
|||
|
|||
#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_FUNCNAME allocate
|
|||
#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_NS_BEG namespace boost { namespace container { namespace dtl {
|
|||
#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_NS_END }}}
|
|||
#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_MIN 2
|
|||
#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_MAX 2
|
|||
#include <boost/intrusive/detail/has_member_function_callable_with.hpp>
|
|||
|
|||
#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_FUNCNAME destroy
|
|||
#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_NS_BEG namespace boost { namespace container { namespace dtl {
|
|||
#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_NS_END }}}
|
|||
#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_MIN 1
|
|||
#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_MAX 1
|
|||
#include <boost/intrusive/detail/has_member_function_callable_with.hpp>
|
|||
|
|||
#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_FUNCNAME construct
|
|||
#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_NS_BEG namespace boost { namespace container { namespace dtl {
|
|||
#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_NS_END }}}
|
|||
#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_MIN 1
|
|||
#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_MAX 9
|
|||
#include <boost/intrusive/detail/has_member_function_callable_with.hpp>
|
|||
|
|||
#if defined(BOOST_GCC) && (BOOST_GCC >= 40600)
|
|||
#pragma GCC diagnostic pop
|
|||
#endif
|
|||
|
|||
#endif //#ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
|
|||
|
|||
namespace boost { |
|||
namespace container { |
|||
|
|||
#ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
|
|||
|
|||
template<class T, class VoidAllocator, class Options> |
|||
class small_vector_allocator; |
|||
|
|||
namespace allocator_traits_detail { |
|||
|
|||
BOOST_INTRUSIVE_HAS_STATIC_MEMBER_FUNC_SIGNATURE(has_max_size, max_size) |
|||
BOOST_INTRUSIVE_HAS_STATIC_MEMBER_FUNC_SIGNATURE(has_select_on_container_copy_construction, select_on_container_copy_construction) |
|||
|
|||
} //namespace allocator_traits_detail {
|
|||
|
|||
namespace dtl { |
|||
|
|||
//workaround needed for C++03 compilers with no construct()
|
|||
//supporting rvalue references
|
|||
template<class Allocator> |
|||
struct is_std_allocator |
|||
{ static const bool value = false; }; |
|||
|
|||
template<class T> |
|||
struct is_std_allocator< std::allocator<T> > |
|||
{ static const bool value = true; }; |
|||
|
|||
template<class T, class Options> |
|||
struct is_std_allocator< small_vector_allocator<T, std::allocator<T>, Options > > |
|||
{ static const bool value = true; }; |
|||
|
|||
template<class Allocator> |
|||
struct is_not_std_allocator |
|||
{ static const bool value = !is_std_allocator<Allocator>::value; }; |
|||
|
|||
BOOST_INTRUSIVE_INSTANTIATE_DEFAULT_TYPE_TMPLT(pointer) |
|||
BOOST_INTRUSIVE_INSTANTIATE_EVAL_DEFAULT_TYPE_TMPLT(const_pointer) |
|||
BOOST_INTRUSIVE_INSTANTIATE_DEFAULT_TYPE_TMPLT(reference) |
|||
BOOST_INTRUSIVE_INSTANTIATE_DEFAULT_TYPE_TMPLT(const_reference) |
|||
BOOST_INTRUSIVE_INSTANTIATE_EVAL_DEFAULT_TYPE_TMPLT(void_pointer) |
|||
BOOST_INTRUSIVE_INSTANTIATE_EVAL_DEFAULT_TYPE_TMPLT(const_void_pointer) |
|||
BOOST_INTRUSIVE_INSTANTIATE_DEFAULT_TYPE_TMPLT(size_type) |
|||
BOOST_INTRUSIVE_INSTANTIATE_DEFAULT_TYPE_TMPLT(propagate_on_container_copy_assignment) |
|||
BOOST_INTRUSIVE_INSTANTIATE_DEFAULT_TYPE_TMPLT(propagate_on_container_move_assignment) |
|||
BOOST_INTRUSIVE_INSTANTIATE_DEFAULT_TYPE_TMPLT(propagate_on_container_swap) |
|||
BOOST_INTRUSIVE_INSTANTIATE_DEFAULT_TYPE_TMPLT(is_always_equal) |
|||
BOOST_INTRUSIVE_INSTANTIATE_DEFAULT_TYPE_TMPLT(difference_type) |
|||
BOOST_INTRUSIVE_INSTANTIATE_DEFAULT_TYPE_TMPLT(is_partially_propagable) |
|||
|
|||
} //namespace dtl {
|
|||
|
|||
#endif //#ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
|
|||
|
|||
//! The class template allocator_traits supplies a uniform interface to all allocator types.
|
|||
//! This class is a C++03-compatible implementation of std::allocator_traits
|
|||
template <typename Allocator> |
|||
struct allocator_traits |
|||
{ |
|||
//allocator_type
|
|||
typedef Allocator allocator_type; |
|||
//value_type
|
|||
typedef typename allocator_type::value_type value_type; |
|||
|
|||
#if defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
|
|||
//! Allocator::pointer if such a type exists; otherwise, value_type*
|
|||
//!
|
|||
typedef unspecified pointer; |
|||
//! Allocator::const_pointer if such a type exists ; otherwise, pointer_traits<pointer>::rebind<const
|
|||
//!
|
|||
typedef see_documentation const_pointer; |
|||
//! Non-standard extension
|
|||
//! Allocator::reference if such a type exists; otherwise, value_type&
|
|||
typedef see_documentation reference; |
|||
//! Non-standard extension
|
|||
//! Allocator::const_reference if such a type exists ; otherwise, const value_type&
|
|||
typedef see_documentation const_reference; |
|||
//! Allocator::void_pointer if such a type exists ; otherwise, pointer_traits<pointer>::rebind<void>.
|
|||
//!
|
|||
typedef see_documentation void_pointer; |
|||
//! Allocator::const_void_pointer if such a type exists ; otherwise, pointer_traits<pointer>::rebind<const
|
|||
//!
|
|||
typedef see_documentation const_void_pointer; |
|||
//! Allocator::difference_type if such a type exists ; otherwise, pointer_traits<pointer>::difference_type.
|
|||
//!
|
|||
typedef see_documentation difference_type; |
|||
//! Allocator::size_type if such a type exists ; otherwise, make_unsigned<difference_type>::type
|
|||
//!
|
|||
typedef see_documentation size_type; |
|||
//! Allocator::propagate_on_container_copy_assignment if such a type exists, otherwise a type
|
|||
//! with an internal constant static boolean member <code>value</code> == false.
|
|||
typedef see_documentation propagate_on_container_copy_assignment; |
|||
//! Allocator::propagate_on_container_move_assignment if such a type exists, otherwise a type
|
|||
//! with an internal constant static boolean member <code>value</code> == false.
|
|||
typedef see_documentation propagate_on_container_move_assignment; |
|||
//! Allocator::propagate_on_container_swap if such a type exists, otherwise a type
|
|||
//! with an internal constant static boolean member <code>value</code> == false.
|
|||
typedef see_documentation propagate_on_container_swap; |
|||
//! Allocator::is_always_equal if such a type exists, otherwise a type
|
|||
//! with an internal constant static boolean member <code>value</code> == is_empty<Allocator>::value
|
|||
typedef see_documentation is_always_equal; |
|||
//! Allocator::is_partially_propagable if such a type exists, otherwise a type
|
|||
//! with an internal constant static boolean member <code>value</code> == false
|
|||
//! <b>Note</b>: Non-standard extension used to implement `small_vector_allocator`.
|
|||
typedef see_documentation is_partially_propagable; |
|||
//! Defines an allocator: Allocator::rebind<T>::other if such a type exists; otherwise, Allocator<T, Args>
|
|||
//! if Allocator is a class template instantiation of the form Allocator<U, Args>, where Args is zero or
|
|||
//! more type arguments ; otherwise, the instantiation of rebind_alloc is ill-formed.
|
|||
//!
|
|||
//! In C++03 compilers <code>rebind_alloc</code> is a struct derived from an allocator
|
|||
//! deduced by previously detailed rules.
|
|||
template <class T> using rebind_alloc = see_documentation; |
|||
|
|||
//! In C++03 compilers <code>rebind_traits</code> is a struct derived from
|
|||
//! <code>allocator_traits<OtherAlloc></code>, where <code>OtherAlloc</code> is
|
|||
//! the allocator deduced by rules explained in <code>rebind_alloc</code>.
|
|||
template <class T> using rebind_traits = allocator_traits<rebind_alloc<T> >; |
|||
|
|||
//! Non-standard extension: Portable allocator rebind for C++03 and C++11 compilers.
|
|||
//! <code>type</code> is an allocator related to Allocator deduced deduced by rules explained in <code>rebind_alloc</code>.
|
|||
template <class T> |
|||
struct portable_rebind_alloc |
|||
{ typedef see_documentation type; }; |
|||
#else
|
|||
//pointer
|
|||
typedef BOOST_INTRUSIVE_OBTAIN_TYPE_WITH_DEFAULT(boost::container::dtl::, Allocator, |
|||
pointer, value_type*) |
|||
pointer; |
|||
//const_pointer
|
|||
typedef BOOST_INTRUSIVE_OBTAIN_TYPE_WITH_EVAL_DEFAULT(boost::container::dtl::, Allocator, |
|||
const_pointer, typename boost::intrusive::pointer_traits<pointer>::template |
|||
rebind_pointer<const value_type>) |
|||
const_pointer; |
|||
//reference
|
|||
typedef BOOST_INTRUSIVE_OBTAIN_TYPE_WITH_DEFAULT(boost::container::dtl::, Allocator, |
|||
reference, typename dtl::unvoid_ref<value_type>::type) |
|||
reference; |
|||
//const_reference
|
|||
typedef BOOST_INTRUSIVE_OBTAIN_TYPE_WITH_DEFAULT(boost::container::dtl::, Allocator, |
|||
const_reference, typename dtl::unvoid_ref<const value_type>::type) |
|||
const_reference; |
|||
//void_pointer
|
|||
typedef BOOST_INTRUSIVE_OBTAIN_TYPE_WITH_EVAL_DEFAULT(boost::container::dtl::, Allocator, |
|||
void_pointer, typename boost::intrusive::pointer_traits<pointer>::template |
|||
rebind_pointer<void>) |
|||
void_pointer; |
|||
//const_void_pointer
|
|||
typedef BOOST_INTRUSIVE_OBTAIN_TYPE_WITH_EVAL_DEFAULT(boost::container::dtl::, Allocator, |
|||
const_void_pointer, typename boost::intrusive::pointer_traits<pointer>::template |
|||
rebind_pointer<const void>) |
|||
const_void_pointer; |
|||
//difference_type
|
|||
typedef BOOST_INTRUSIVE_OBTAIN_TYPE_WITH_DEFAULT(boost::container::dtl::, Allocator, |
|||
difference_type, std::ptrdiff_t) |
|||
difference_type; |
|||
//size_type
|
|||
typedef BOOST_INTRUSIVE_OBTAIN_TYPE_WITH_DEFAULT(boost::container::dtl::, Allocator, |
|||
size_type, std::size_t) |
|||
size_type; |
|||
//propagate_on_container_copy_assignment
|
|||
typedef BOOST_INTRUSIVE_OBTAIN_TYPE_WITH_DEFAULT(boost::container::dtl::, Allocator, |
|||
propagate_on_container_copy_assignment, dtl::false_type) |
|||
propagate_on_container_copy_assignment; |
|||
//propagate_on_container_move_assignment
|
|||
typedef BOOST_INTRUSIVE_OBTAIN_TYPE_WITH_DEFAULT(boost::container::dtl::, Allocator, |
|||
propagate_on_container_move_assignment, dtl::false_type) |
|||
propagate_on_container_move_assignment; |
|||
//propagate_on_container_swap
|
|||
typedef BOOST_INTRUSIVE_OBTAIN_TYPE_WITH_DEFAULT(boost::container::dtl::, Allocator, |
|||
propagate_on_container_swap, dtl::false_type) |
|||
propagate_on_container_swap; |
|||
//is_always_equal
|
|||
typedef BOOST_INTRUSIVE_OBTAIN_TYPE_WITH_DEFAULT(boost::container::dtl::, Allocator, |
|||
is_always_equal, dtl::is_empty<Allocator>) |
|||
is_always_equal; |
|||
//is_partially_propagable
|
|||
typedef BOOST_INTRUSIVE_OBTAIN_TYPE_WITH_DEFAULT(boost::container::dtl::, Allocator, |
|||
is_partially_propagable, dtl::false_type) |
|||
is_partially_propagable; |
|||
|
|||
//rebind_alloc & rebind_traits
|
|||
#if !defined(BOOST_NO_CXX11_TEMPLATE_ALIASES)
|
|||
//C++11
|
|||
template <typename T> using rebind_alloc = typename boost::intrusive::pointer_rebind<Allocator, T>::type; |
|||
template <typename T> using rebind_traits = allocator_traits< rebind_alloc<T> >; |
|||
#else // #if !defined(BOOST_NO_CXX11_TEMPLATE_ALIASES)
|
|||
//Some workaround for C++03 or C++11 compilers with no template aliases
|
|||
template <typename T> |
|||
struct rebind_alloc : boost::intrusive::pointer_rebind<Allocator,T>::type |
|||
{ |
|||
typedef typename boost::intrusive::pointer_rebind<Allocator,T>::type Base; |
|||
#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
|
|||
template <typename... Args> |
|||
rebind_alloc(BOOST_FWD_REF(Args)... args) : Base(boost::forward<Args>(args)...) {} |
|||
#else // #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
|
|||
#define BOOST_CONTAINER_ALLOCATOR_TRAITS_REBIND_ALLOC(N) \
|
|||
BOOST_MOVE_TMPL_LT##N BOOST_MOVE_CLASS##N BOOST_MOVE_GT##N\ |
|||
explicit rebind_alloc(BOOST_MOVE_UREF##N) : Base(BOOST_MOVE_FWD##N){}\ |
|||
//
|
|||
BOOST_MOVE_ITERATE_0TO9(BOOST_CONTAINER_ALLOCATOR_TRAITS_REBIND_ALLOC) |
|||
#undef BOOST_CONTAINER_ALLOCATOR_TRAITS_REBIND_ALLOC
|
|||
#endif // #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
|
|||
}; |
|||
|
|||
template <typename T> |
|||
struct rebind_traits |
|||
: allocator_traits<typename boost::intrusive::pointer_rebind<Allocator, T>::type> |
|||
{}; |
|||
#endif // #if !defined(BOOST_NO_CXX11_TEMPLATE_ALIASES)
|
|||
|
|||
//portable_rebind_alloc
|
|||
template <class T> |
|||
struct portable_rebind_alloc |
|||
{ typedef typename boost::intrusive::pointer_rebind<Allocator, T>::type type; }; |
|||
#endif //BOOST_CONTAINER_DOXYGEN_INVOKED
|
|||
|
|||
//! <b>Returns</b>: <code>a.allocate(n)</code>
|
|||
//!
|
|||
BOOST_CONTAINER_FORCEINLINE static pointer allocate(Allocator &a, size_type n) |
|||
{ return a.allocate(n); } |
|||
|
|||
//! <b>Returns</b>: <code>a.deallocate(p, n)</code>
|
|||
//!
|
|||
//! <b>Throws</b>: Nothing
|
|||
BOOST_CONTAINER_FORCEINLINE static void deallocate(Allocator &a, pointer p, size_type n) |
|||
{ a.deallocate(p, n); } |
|||
|
|||
//! <b>Effects</b>: calls <code>a.allocate(n, p)</code> if that call is well-formed;
|
|||
//! otherwise, invokes <code>a.allocate(n)</code>
|
|||
BOOST_CONTAINER_FORCEINLINE static pointer allocate(Allocator &a, size_type n, const_void_pointer p) |
|||
{ |
|||
const bool value = boost::container::dtl:: |
|||
has_member_function_callable_with_allocate |
|||
<Allocator, const size_type, const const_void_pointer>::value; |
|||
dtl::bool_<value> flag; |
|||
return allocator_traits::priv_allocate(flag, a, n, p); |
|||
} |
|||
|
|||
//! <b>Effects</b>: calls <code>a.destroy(p)</code> if that call is well-formed;
|
|||
//! otherwise, invokes <code>p->~T()</code>.
|
|||
template<class T> |
|||
BOOST_CONTAINER_FORCEINLINE static void destroy(Allocator &a, T*p) BOOST_NOEXCEPT_OR_NOTHROW |
|||
{ |
|||
typedef T* destroy_pointer; |
|||
const bool value = boost::container::dtl:: |
|||
has_member_function_callable_with_destroy |
|||
<Allocator, const destroy_pointer>::value; |
|||
dtl::bool_<value> flag; |
|||
allocator_traits::priv_destroy(flag, a, p); |
|||
} |
|||
|
|||
//! <b>Returns</b>: <code>a.max_size()</code> if that expression is well-formed; otherwise,
|
|||
//! <code>numeric_limits<size_type>::max()</code>.
|
|||
BOOST_CONTAINER_FORCEINLINE static size_type max_size(const Allocator &a) BOOST_NOEXCEPT_OR_NOTHROW |
|||
{ |
|||
const bool value = allocator_traits_detail::has_max_size<Allocator, size_type (Allocator::*)() const>::value; |
|||
dtl::bool_<value> flag; |
|||
return allocator_traits::priv_max_size(flag, a); |
|||
} |
|||
|
|||
//! <b>Returns</b>: <code>a.select_on_container_copy_construction()</code> if that expression is well-formed;
|
|||
//! otherwise, a.
|
|||
BOOST_CONTAINER_FORCEINLINE static BOOST_CONTAINER_DOC1ST(Allocator, |
|||
typename dtl::if_c |
|||
< allocator_traits_detail::has_select_on_container_copy_construction<Allocator BOOST_MOVE_I Allocator (Allocator::*)() const>::value |
|||
BOOST_MOVE_I Allocator BOOST_MOVE_I const Allocator & >::type) |
|||
select_on_container_copy_construction(const Allocator &a) |
|||
{ |
|||
const bool value = allocator_traits_detail::has_select_on_container_copy_construction |
|||
<Allocator, Allocator (Allocator::*)() const>::value; |
|||
dtl::bool_<value> flag; |
|||
return allocator_traits::priv_select_on_container_copy_construction(flag, a); |
|||
} |
|||
|
|||
#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) || defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
|
|||
//! <b>Effects</b>: calls <code>a.construct(p, std::forward<Args>(args)...)</code> if that call is well-formed;
|
|||
//! otherwise, invokes <code>`placement new` (static_cast<void*>(p)) T(std::forward<Args>(args)...)</code>
|
|||
template <class T, class ...Args> |
|||
BOOST_CONTAINER_FORCEINLINE static void construct(Allocator & a, T* p, BOOST_FWD_REF(Args)... args) |
|||
{ |
|||
static const bool value = ::boost::move_detail::and_ |
|||
< dtl::is_not_std_allocator<Allocator> |
|||
, boost::container::dtl::has_member_function_callable_with_construct |
|||
< Allocator, T*, Args... > |
|||
>::value; |
|||
dtl::bool_<value> flag; |
|||
allocator_traits::priv_construct(flag, a, p, ::boost::forward<Args>(args)...); |
|||
} |
|||
#endif
|
|||
|
|||
//! <b>Returns</b>: <code>a.storage_is_unpropagable(p)</code> if is_partially_propagable::value is true; otherwise,
|
|||
//! <code>false</code>.
|
|||
BOOST_CONTAINER_FORCEINLINE static bool storage_is_unpropagable(const Allocator &a, pointer p) BOOST_NOEXCEPT_OR_NOTHROW |
|||
{ |
|||
dtl::bool_<is_partially_propagable::value> flag; |
|||
return allocator_traits::priv_storage_is_unpropagable(flag, a, p); |
|||
} |
|||
|
|||
//! <b>Returns</b>: <code>true</code> if <code>is_always_equal::value == true</code>, otherwise,
|
|||
//! <code>a == b</code>.
|
|||
BOOST_CONTAINER_FORCEINLINE static bool equal(const Allocator &a, const Allocator &b) BOOST_NOEXCEPT_OR_NOTHROW |
|||
{ |
|||
dtl::bool_<is_always_equal::value> flag; |
|||
return allocator_traits::priv_equal(flag, a, b); |
|||
} |
|||
|
|||
#if !defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
|
|||
private: |
|||
BOOST_CONTAINER_FORCEINLINE static pointer priv_allocate(dtl::true_type, Allocator &a, size_type n, const_void_pointer p) |
|||
{ return a.allocate(n, p); } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE static pointer priv_allocate(dtl::false_type, Allocator &a, size_type n, const_void_pointer) |
|||
{ return a.allocate(n); } |
|||
|
|||
template<class T> |
|||
BOOST_CONTAINER_FORCEINLINE static void priv_destroy(dtl::true_type, Allocator &a, T* p) BOOST_NOEXCEPT_OR_NOTHROW |
|||
{ a.destroy(p); } |
|||
|
|||
template<class T> |
|||
BOOST_CONTAINER_FORCEINLINE static void priv_destroy(dtl::false_type, Allocator &, T* p) BOOST_NOEXCEPT_OR_NOTHROW |
|||
{ p->~T(); (void)p; } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE static size_type priv_max_size(dtl::true_type, const Allocator &a) BOOST_NOEXCEPT_OR_NOTHROW |
|||
{ return a.max_size(); } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE static size_type priv_max_size(dtl::false_type, const Allocator &) BOOST_NOEXCEPT_OR_NOTHROW |
|||
{ return size_type(-1)/sizeof(value_type); } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE static Allocator priv_select_on_container_copy_construction(dtl::true_type, const Allocator &a) |
|||
{ return a.select_on_container_copy_construction(); } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE static const Allocator &priv_select_on_container_copy_construction(dtl::false_type, const Allocator &a) BOOST_NOEXCEPT_OR_NOTHROW |
|||
{ return a; } |
|||
|
|||
#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
|
|||
template<class T, class ...Args> |
|||
BOOST_CONTAINER_FORCEINLINE static void priv_construct(dtl::true_type, Allocator &a, T *p, BOOST_FWD_REF(Args) ...args) |
|||
{ a.construct( p, ::boost::forward<Args>(args)...); } |
|||
|
|||
template<class T, class ...Args> |
|||
BOOST_CONTAINER_FORCEINLINE static void priv_construct(dtl::false_type, Allocator &, T *p, BOOST_FWD_REF(Args) ...args) |
|||
{ ::new((void*)p, boost_container_new_t()) T(::boost::forward<Args>(args)...); } |
|||
#else // #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
|
|||
public: |
|||
|
|||
#define BOOST_CONTAINER_ALLOCATOR_TRAITS_CONSTRUCT_IMPL(N) \
|
|||
template<class T BOOST_MOVE_I##N BOOST_MOVE_CLASS##N >\ |
|||
BOOST_CONTAINER_FORCEINLINE static void construct(Allocator &a, T *p BOOST_MOVE_I##N BOOST_MOVE_UREF##N)\ |
|||
{\ |
|||
static const bool value = ::boost::move_detail::and_ \ |
|||
< dtl::is_not_std_allocator<Allocator> \ |
|||
, boost::container::dtl::has_member_function_callable_with_construct \ |
|||
< Allocator, T* BOOST_MOVE_I##N BOOST_MOVE_FWD_T##N > \ |
|||
>::value; \ |
|||
dtl::bool_<value> flag;\ |
|||
(priv_construct)(flag, a, p BOOST_MOVE_I##N BOOST_MOVE_FWD##N);\ |
|||
}\ |
|||
//
|
|||
BOOST_MOVE_ITERATE_0TO8(BOOST_CONTAINER_ALLOCATOR_TRAITS_CONSTRUCT_IMPL) |
|||
#undef BOOST_CONTAINER_ALLOCATOR_TRAITS_CONSTRUCT_IMPL
|
|||
|
|||
private: |
|||
/////////////////////////////////
|
|||
// priv_construct
|
|||
/////////////////////////////////
|
|||
#define BOOST_CONTAINER_ALLOCATOR_TRAITS_PRIV_CONSTRUCT_IMPL(N) \
|
|||
template<class T BOOST_MOVE_I##N BOOST_MOVE_CLASS##N >\ |
|||
BOOST_CONTAINER_FORCEINLINE static void priv_construct(dtl::true_type, Allocator &a, T *p BOOST_MOVE_I##N BOOST_MOVE_UREF##N)\ |
|||
{ a.construct( p BOOST_MOVE_I##N BOOST_MOVE_FWD##N ); }\ |
|||
\ |
|||
template<class T BOOST_MOVE_I##N BOOST_MOVE_CLASS##N >\ |
|||
BOOST_CONTAINER_FORCEINLINE static void priv_construct(dtl::false_type, Allocator &, T *p BOOST_MOVE_I##N BOOST_MOVE_UREF##N)\ |
|||
{ ::new((void*)p, boost_container_new_t()) T(BOOST_MOVE_FWD##N); }\ |
|||
//
|
|||
BOOST_MOVE_ITERATE_0TO8(BOOST_CONTAINER_ALLOCATOR_TRAITS_PRIV_CONSTRUCT_IMPL) |
|||
#undef BOOST_CONTAINER_ALLOCATOR_TRAITS_PRIV_CONSTRUCT_IMPL
|
|||
|
|||
#endif // #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
|
|||
|
|||
template<class T> |
|||
BOOST_CONTAINER_FORCEINLINE static void priv_construct(dtl::false_type, Allocator &, T *p, const ::boost::container::default_init_t&) |
|||
{ ::new((void*)p, boost_container_new_t()) T; } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE static bool priv_storage_is_unpropagable(dtl::true_type, const Allocator &a, pointer p) |
|||
{ return a.storage_is_unpropagable(p); } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE static bool priv_storage_is_unpropagable(dtl::false_type, const Allocator &, pointer) |
|||
{ return false; } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE static bool priv_equal(dtl::true_type, const Allocator &, const Allocator &) |
|||
{ return true; } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE static bool priv_equal(dtl::false_type, const Allocator &a, const Allocator &b) |
|||
{ return a == b; } |
|||
|
|||
#endif //#if defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
|
|||
}; |
|||
|
|||
#if !defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
|
|||
|
|||
template<class T, class AllocatorOrVoid> |
|||
struct real_allocator |
|||
{ |
|||
typedef AllocatorOrVoid type; |
|||
}; |
|||
|
|||
template<class T> |
|||
struct real_allocator<T, void> |
|||
{ |
|||
typedef new_allocator<T> type; |
|||
}; |
|||
|
|||
#endif //#if defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
|
|||
|
|||
} //namespace container {
|
|||
} //namespace boost {
|
|||
|
|||
#include <boost/container/detail/config_end.hpp>
|
|||
|
|||
#endif // ! defined(BOOST_CONTAINER_ALLOCATOR_ALLOCATOR_TRAITS_HPP)
|
@ -0,0 +1,388 @@ |
|||
//////////////////////////////////////////////////////////////////////////////
|
|||
//
|
|||
// (C) Copyright Ion Gaztanaga 2005-2014. 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_CONTAINER_FWD_HPP
|
|||
#define BOOST_CONTAINER_CONTAINER_FWD_HPP
|
|||
|
|||
#ifndef BOOST_CONFIG_HPP
|
|||
# include <boost/config.hpp>
|
|||
#endif
|
|||
|
|||
#if defined(BOOST_HAS_PRAGMA_ONCE)
|
|||
# pragma once
|
|||
#endif
|
|||
|
|||
//! \file
|
|||
//! This header file forward declares the following containers:
|
|||
//! - boost::container::vector
|
|||
//! - boost::container::stable_vector
|
|||
//! - boost::container::static_vector
|
|||
//! - boost::container::small_vector_base
|
|||
//! - boost::container::small_vector
|
|||
//! - boost::container::devector
|
|||
//! - boost::container::slist
|
|||
//! - boost::container::list
|
|||
//! - boost::container::set
|
|||
//! - boost::container::multiset
|
|||
//! - boost::container::map
|
|||
//! - boost::container::multimap
|
|||
//! - boost::container::flat_set
|
|||
//! - boost::container::flat_multiset
|
|||
//! - boost::container::flat_map
|
|||
//! - boost::container::flat_multimap
|
|||
//! - boost::container::basic_string
|
|||
//! - boost::container::string
|
|||
//! - boost::container::wstring
|
|||
//!
|
|||
//! Forward declares the following allocators:
|
|||
//! - boost::container::allocator
|
|||
//! - boost::container::node_allocator
|
|||
//! - boost::container::adaptive_pool
|
|||
//!
|
|||
//! Forward declares the following polymorphic resource classes:
|
|||
//! - boost::container::pmr::memory_resource
|
|||
//! - boost::container::pmr::polymorphic_allocator
|
|||
//! - boost::container::pmr::monotonic_buffer_resource
|
|||
//! - boost::container::pmr::pool_options
|
|||
//! - boost::container::pmr::unsynchronized_pool_resource
|
|||
//! - boost::container::pmr::synchronized_pool_resource
|
|||
//!
|
|||
//! And finally it defines the following types
|
|||
|
|||
#ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
|
|||
|
|||
//Std forward declarations
|
|||
#ifndef BOOST_CONTAINER_DETAIL_STD_FWD_HPP
|
|||
#include <boost/container/detail/std_fwd.hpp>
|
|||
#endif
|
|||
|
|||
namespace boost{ |
|||
namespace intrusive{ |
|||
namespace detail{ |
|||
//Create namespace to avoid compilation errors
|
|||
}}} |
|||
|
|||
namespace boost{ namespace container{ namespace dtl{ |
|||
namespace bi = boost::intrusive; |
|||
namespace bid = boost::intrusive::detail; |
|||
}}} |
|||
|
|||
namespace boost{ namespace container{ namespace pmr{ |
|||
namespace bi = boost::intrusive; |
|||
namespace bid = boost::intrusive::detail; |
|||
}}} |
|||
|
|||
#include <cstddef>
|
|||
|
|||
#endif //#ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
|
|||
|
|||
//////////////////////////////////////////////////////////////////////////////
|
|||
// Containers
|
|||
//////////////////////////////////////////////////////////////////////////////
|
|||
|
|||
namespace boost { |
|||
namespace container { |
|||
|
|||
#ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
|
|||
|
|||
template<class T> |
|||
class new_allocator; |
|||
|
|||
template <class T |
|||
,class Allocator = void |
|||
,class Options = void> |
|||
class vector; |
|||
|
|||
template <class T |
|||
,class Allocator = void > |
|||
class stable_vector; |
|||
|
|||
template < class T |
|||
, std::size_t Capacity |
|||
, class Options = void> |
|||
class static_vector; |
|||
|
|||
template < class T |
|||
, class Allocator = void |
|||
, class Options = void > |
|||
class small_vector_base; |
|||
|
|||
template < class T |
|||
, std::size_t N |
|||
, class Allocator = void |
|||
, class Options = void > |
|||
class small_vector; |
|||
|
|||
template <class T |
|||
,class Allocator = void |
|||
,class Options = void> |
|||
class devector; |
|||
|
|||
template <class T |
|||
,class Allocator = void |
|||
,class Options = void> |
|||
class deque; |
|||
|
|||
template <class T |
|||
,class Allocator = void > |
|||
class list; |
|||
|
|||
template <class T |
|||
,class Allocator = void > |
|||
class slist; |
|||
|
|||
template <class Key |
|||
,class Compare = std::less<Key> |
|||
,class Allocator = void |
|||
,class Options = void> |
|||
class set; |
|||
|
|||
template <class Key |
|||
,class Compare = std::less<Key> |
|||
,class Allocator = void |
|||
,class Options = void > |
|||
class multiset; |
|||
|
|||
template <class Key |
|||
,class T |
|||
,class Compare = std::less<Key> |
|||
,class Allocator = void |
|||
,class Options = void > |
|||
class map; |
|||
|
|||
template <class Key |
|||
,class T |
|||
,class Compare = std::less<Key> |
|||
,class Allocator = void |
|||
,class Options = void > |
|||
class multimap; |
|||
|
|||
template <class Key |
|||
,class Compare = std::less<Key> |
|||
,class Allocator = void > |
|||
class flat_set; |
|||
|
|||
template <class Key |
|||
,class Compare = std::less<Key> |
|||
,class Allocator = void > |
|||
class flat_multiset; |
|||
|
|||
template <class Key |
|||
,class T |
|||
,class Compare = std::less<Key> |
|||
,class Allocator = void > |
|||
class flat_map; |
|||
|
|||
template <class Key |
|||
,class T |
|||
,class Compare = std::less<Key> |
|||
,class Allocator = void > |
|||
class flat_multimap; |
|||
|
|||
#ifndef BOOST_NO_CXX11_TEMPLATE_ALIASES
|
|||
|
|||
//! Alias templates for small_flat_[multi]{set|map} using small_vector as container
|
|||
|
|||
template < class Key |
|||
, std::size_t N |
|||
, class Compare = std::less<Key> |
|||
, class SmallVectorAllocator = void |
|||
, class SmallVectorOptions = void > |
|||
using small_flat_set = flat_set<Key, Compare, small_vector<Key, N, SmallVectorAllocator, SmallVectorOptions>>; |
|||
|
|||
template < class Key |
|||
, std::size_t N |
|||
, class Compare = std::less<Key> |
|||
, class SmallVectorAllocator = void |
|||
, class SmallVectorOptions = void > |
|||
using small_flat_multiset = flat_multiset<Key, Compare, small_vector<Key, N, SmallVectorAllocator, SmallVectorOptions>>; |
|||
|
|||
template < class Key |
|||
, class T |
|||
, std::size_t N |
|||
, class Compare = std::less<Key> |
|||
, class SmallVectorAllocator = void |
|||
, class SmallVectorOptions = void > |
|||
using small_flat_map = flat_map<Key, T, Compare, small_vector<std::pair<Key, T>, N, SmallVectorAllocator, SmallVectorOptions>>; |
|||
|
|||
template < class Key |
|||
, class T |
|||
, std::size_t N |
|||
, class Compare = std::less<Key> |
|||
, class SmallVectorAllocator = void |
|||
, class SmallVectorOptions = void > |
|||
using small_flat_multimap = flat_multimap<Key, T, Compare, small_vector<std::pair<Key, T>, N, SmallVectorAllocator, SmallVectorOptions>>; |
|||
|
|||
#endif // #ifndef BOOST_NO_CXX11_TEMPLATE_ALIASES
|
|||
|
|||
|
|||
//! A portable metafunction to obtain a small_flat_set
|
|||
template < class Key |
|||
, std::size_t N |
|||
, class Compare = std::less<Key> |
|||
, class SmallVectorAllocator = void |
|||
, class SmallVectorOptions = void > |
|||
struct small_flat_set_of |
|||
{ |
|||
typedef flat_set<Key, Compare, small_vector<Key, N, SmallVectorAllocator, SmallVectorOptions> > type; |
|||
}; |
|||
|
|||
//! A portable metafunction to obtain a small_flat_multiset
|
|||
template < class Key |
|||
, std::size_t N |
|||
, class Compare = std::less<Key> |
|||
, class SmallVectorAllocator = void |
|||
, class SmallVectorOptions = void > |
|||
struct small_flat_multiset_of |
|||
{ |
|||
typedef flat_multiset<Key, Compare, small_vector<Key, N, SmallVectorAllocator, SmallVectorOptions> > type; |
|||
}; |
|||
|
|||
//! A portable metafunction to obtain a small_flat_map
|
|||
template < class Key |
|||
, class T |
|||
, std::size_t N |
|||
, class Compare = std::less<Key> |
|||
, class SmallVectorAllocator = void |
|||
, class SmallVectorOptions = void > |
|||
struct small_flat_map_of |
|||
{ |
|||
typedef flat_map<Key, T, Compare, small_vector<std::pair<Key, T>, N, SmallVectorAllocator, SmallVectorOptions> > type; |
|||
}; |
|||
|
|||
//! A portable metafunction to obtain a small_flat_multimap
|
|||
template < class Key |
|||
, class T |
|||
, std::size_t N |
|||
, class Compare = std::less<Key> |
|||
, class SmallVectorAllocator = void |
|||
, class SmallVectorOptions = void > |
|||
struct small_flat_multimap_of |
|||
{ |
|||
typedef flat_multimap<Key, T, Compare, small_vector<std::pair<Key, T>, N, SmallVectorAllocator, SmallVectorOptions> > type; |
|||
}; |
|||
|
|||
template <class CharT |
|||
,class Traits = std::char_traits<CharT> |
|||
,class Allocator = void > |
|||
class basic_string; |
|||
|
|||
typedef basic_string <char> string; |
|||
typedef basic_string<wchar_t> wstring; |
|||
|
|||
static const std::size_t ADP_nodes_per_block = 256u; |
|||
static const std::size_t ADP_max_free_blocks = 2u; |
|||
static const std::size_t ADP_overhead_percent = 1u; |
|||
static const std::size_t ADP_only_alignment = 0u; |
|||
|
|||
template < class T |
|||
, std::size_t NodesPerBlock = ADP_nodes_per_block |
|||
, std::size_t MaxFreeBlocks = ADP_max_free_blocks |
|||
, std::size_t OverheadPercent = ADP_overhead_percent |
|||
, unsigned Version = 2 |
|||
> |
|||
class adaptive_pool; |
|||
|
|||
template < class T |
|||
, unsigned Version = 2 |
|||
, unsigned int AllocationDisableMask = 0> |
|||
class allocator; |
|||
|
|||
static const std::size_t NodeAlloc_nodes_per_block = 256u; |
|||
|
|||
template |
|||
< class T |
|||
, std::size_t NodesPerBlock = NodeAlloc_nodes_per_block |
|||
, std::size_t Version = 2> |
|||
class node_allocator; |
|||
|
|||
namespace pmr { |
|||
|
|||
class memory_resource; |
|||
|
|||
template<class T> |
|||
class polymorphic_allocator; |
|||
|
|||
class monotonic_buffer_resource; |
|||
|
|||
struct pool_options; |
|||
|
|||
template <class Allocator> |
|||
class resource_adaptor_imp; |
|||
|
|||
class unsynchronized_pool_resource; |
|||
|
|||
class synchronized_pool_resource; |
|||
|
|||
} //namespace pmr {
|
|||
|
|||
#endif //#ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
|
|||
|
|||
//! Type used to tag that the input range is
|
|||
//! guaranteed to be ordered
|
|||
struct ordered_range_t |
|||
{}; |
|||
|
|||
//! Value used to tag that the input range is
|
|||
//! guaranteed to be ordered
|
|||
static const ordered_range_t ordered_range = ordered_range_t(); |
|||
|
|||
//! Type used to tag that the input range is
|
|||
//! guaranteed to be ordered and unique
|
|||
struct ordered_unique_range_t |
|||
: public ordered_range_t |
|||
{}; |
|||
|
|||
//! Value used to tag that the input range is
|
|||
//! guaranteed to be ordered and unique
|
|||
static const ordered_unique_range_t ordered_unique_range = ordered_unique_range_t(); |
|||
|
|||
//! Type used to tag that the inserted values
|
|||
//! should be default initialized
|
|||
struct default_init_t |
|||
{}; |
|||
|
|||
//! Value used to tag that the inserted values
|
|||
//! should be default initialized
|
|||
static const default_init_t default_init = default_init_t(); |
|||
#ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
|
|||
|
|||
//! Type used to tag that the inserted values
|
|||
//! should be value initialized
|
|||
struct value_init_t |
|||
{}; |
|||
|
|||
//! Value used to tag that the inserted values
|
|||
//! should be value initialized
|
|||
static const value_init_t value_init = value_init_t(); |
|||
|
|||
namespace container_detail_really_deep_namespace { |
|||
|
|||
//Otherwise, gcc issues a warning of previously defined
|
|||
//anonymous_instance and unique_instance
|
|||
struct dummy |
|||
{ |
|||
dummy() |
|||
{ |
|||
(void)ordered_range; |
|||
(void)ordered_unique_range; |
|||
(void)default_init; |
|||
} |
|||
}; |
|||
|
|||
} //detail_really_deep_namespace {
|
|||
|
|||
typedef const std::piecewise_construct_t & piecewise_construct_t; |
|||
|
|||
#endif //#ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
|
|||
|
|||
}} //namespace boost { namespace container {
|
|||
|
|||
#endif //#ifndef BOOST_CONTAINER_CONTAINER_FWD_HPP
|
@ -0,0 +1,33 @@ |
|||
//////////////////////////////////////////////////////////////////////////////
|
|||
//
|
|||
// (C) Copyright Ion Gaztanaga 2014-2015. 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_ADDRESSOF_HPP
|
|||
#define BOOST_CONTAINER_DETAIL_ADDRESSOF_HPP
|
|||
|
|||
#ifndef BOOST_CONFIG_HPP
|
|||
# include <boost/config.hpp>
|
|||
#endif
|
|||
|
|||
#if defined(BOOST_HAS_PRAGMA_ONCE)
|
|||
# pragma once
|
|||
#endif
|
|||
|
|||
#include <boost/move/detail/addressof.hpp>
|
|||
|
|||
namespace boost { |
|||
namespace container { |
|||
namespace dtl { |
|||
|
|||
using boost::move_detail::addressof; |
|||
|
|||
} //namespace dtl {
|
|||
} //namespace container {
|
|||
} //namespace boost {
|
|||
|
|||
#endif //#ifndef BOOST_CONTAINER_DETAIL_ADDRESSOF_HPP
|
@ -0,0 +1,542 @@ |
|||
//////////////////////////////////////////////////////////////////////////////
|
|||
//
|
|||
// (C) Copyright Ion Gaztanaga 2008-2013. 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_ADVANCED_INSERT_INT_HPP
|
|||
#define BOOST_CONTAINER_ADVANCED_INSERT_INT_HPP
|
|||
|
|||
#ifndef BOOST_CONFIG_HPP
|
|||
# include <boost/config.hpp>
|
|||
#endif
|
|||
|
|||
#if defined(BOOST_HAS_PRAGMA_ONCE)
|
|||
# pragma once
|
|||
#endif
|
|||
|
|||
#include <boost/container/detail/config_begin.hpp>
|
|||
#include <boost/container/detail/workaround.hpp>
|
|||
|
|||
// container
|
|||
#include <boost/container/allocator_traits.hpp>
|
|||
// container/detail
|
|||
#include <boost/container/detail/copy_move_algo.hpp>
|
|||
#include <boost/container/detail/destroyers.hpp>
|
|||
#include <boost/container/detail/mpl.hpp>
|
|||
#include <boost/container/detail/type_traits.hpp>
|
|||
#include <boost/container/detail/iterator.hpp>
|
|||
#include <boost/container/detail/iterators.hpp>
|
|||
#include <boost/move/detail/iterator_to_raw_pointer.hpp>
|
|||
#if defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
|
|||
#include <boost/move/detail/fwd_macros.hpp>
|
|||
#endif
|
|||
// move
|
|||
|
|||
#include <boost/move/utility_core.hpp>
|
|||
#include <boost/move/detail/force_ptr.hpp>
|
|||
// other
|
|||
#include <boost/assert.hpp>
|
|||
|
|||
namespace boost { namespace container { namespace dtl { |
|||
|
|||
template<class Allocator, class FwdIt> |
|||
struct move_insert_range_proxy |
|||
{ |
|||
typedef typename allocator_traits<Allocator>::value_type value_type; |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE explicit move_insert_range_proxy(FwdIt first) |
|||
: first_(first) |
|||
{} |
|||
|
|||
template<class Iterator> |
|||
BOOST_CONTAINER_FORCEINLINE void uninitialized_copy_n_and_update(Allocator &a, Iterator p, std::size_t n) |
|||
{ |
|||
this->first_ = ::boost::container::uninitialized_move_alloc_n_source |
|||
(a, this->first_, n, p); |
|||
} |
|||
|
|||
template<class Iterator> |
|||
BOOST_CONTAINER_FORCEINLINE void copy_n_and_update(Allocator &, Iterator p, std::size_t n) |
|||
{ |
|||
this->first_ = ::boost::container::move_n_source(this->first_, n, p); |
|||
} |
|||
|
|||
FwdIt first_; |
|||
}; |
|||
|
|||
|
|||
template<class Allocator, class FwdIt> |
|||
struct insert_range_proxy |
|||
{ |
|||
typedef typename allocator_traits<Allocator>::value_type value_type; |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE explicit insert_range_proxy(FwdIt first) |
|||
: first_(first) |
|||
{} |
|||
|
|||
template<class Iterator> |
|||
BOOST_CONTAINER_FORCEINLINE void uninitialized_copy_n_and_update(Allocator &a, Iterator p, std::size_t n) |
|||
{ |
|||
this->first_ = ::boost::container::uninitialized_copy_alloc_n_source(a, this->first_, n, p); |
|||
} |
|||
|
|||
template<class Iterator> |
|||
BOOST_CONTAINER_FORCEINLINE void copy_n_and_update(Allocator &, Iterator p, std::size_t n) |
|||
{ |
|||
this->first_ = ::boost::container::copy_n_source(this->first_, n, p); |
|||
} |
|||
|
|||
FwdIt first_; |
|||
}; |
|||
|
|||
|
|||
template<class Allocator> |
|||
struct insert_n_copies_proxy |
|||
{ |
|||
typedef typename allocator_traits<Allocator>::value_type value_type; |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE explicit insert_n_copies_proxy(const value_type &v) |
|||
: v_(v) |
|||
{} |
|||
|
|||
template<class Iterator> |
|||
BOOST_CONTAINER_FORCEINLINE void uninitialized_copy_n_and_update(Allocator &a, Iterator p, std::size_t n) const |
|||
{ boost::container::uninitialized_fill_alloc_n(a, v_, n, p); } |
|||
|
|||
template<class Iterator> |
|||
BOOST_CONTAINER_FORCEINLINE void copy_n_and_update(Allocator &, Iterator p, std::size_t n) const |
|||
{ |
|||
while (n){ |
|||
--n; |
|||
*p = v_; |
|||
++p; |
|||
} |
|||
} |
|||
|
|||
const value_type &v_; |
|||
}; |
|||
|
|||
template<class Allocator> |
|||
struct insert_value_initialized_n_proxy |
|||
{ |
|||
typedef ::boost::container::allocator_traits<Allocator> alloc_traits; |
|||
typedef typename allocator_traits<Allocator>::value_type value_type; |
|||
typedef typename dtl::aligned_storage<sizeof(value_type), dtl::alignment_of<value_type>::value>::type storage_t; |
|||
|
|||
template<class Iterator> |
|||
BOOST_CONTAINER_FORCEINLINE void uninitialized_copy_n_and_update(Allocator &a, Iterator p, std::size_t n) const |
|||
{ boost::container::uninitialized_value_init_alloc_n(a, n, p); } |
|||
|
|||
template<class Iterator> |
|||
void copy_n_and_update(Allocator &a, Iterator p, std::size_t n) const |
|||
{ |
|||
while (n){ |
|||
--n; |
|||
storage_t v; |
|||
alloc_traits::construct(a, move_detail::force_ptr<value_type *>(&v)); |
|||
value_type *vp = move_detail::force_ptr<value_type *>(&v); |
|||
value_destructor<Allocator> on_exit(a, *vp); (void)on_exit; |
|||
*p = ::boost::move(*vp); |
|||
++p; |
|||
} |
|||
} |
|||
}; |
|||
|
|||
template<class Allocator> |
|||
struct insert_default_initialized_n_proxy |
|||
{ |
|||
typedef ::boost::container::allocator_traits<Allocator> alloc_traits; |
|||
typedef typename allocator_traits<Allocator>::value_type value_type; |
|||
typedef typename dtl::aligned_storage<sizeof(value_type), dtl::alignment_of<value_type>::value>::type storage_t; |
|||
|
|||
template<class Iterator> |
|||
BOOST_CONTAINER_FORCEINLINE void uninitialized_copy_n_and_update(Allocator &a, Iterator p, std::size_t n) const |
|||
{ boost::container::uninitialized_default_init_alloc_n(a, n, p); } |
|||
|
|||
template<class Iterator> |
|||
void copy_n_and_update(Allocator &a, Iterator p, std::size_t n) const |
|||
{ |
|||
if(!is_pod<value_type>::value){ |
|||
while (n){ |
|||
--n; |
|||
typename dtl::aligned_storage<sizeof(value_type), dtl::alignment_of<value_type>::value>::type v; |
|||
alloc_traits::construct(a, move_detail::force_ptr<value_type *>(&v), default_init); |
|||
value_type *vp = move_detail::force_ptr<value_type *>(&v); |
|||
value_destructor<Allocator> on_exit(a, *vp); (void)on_exit; |
|||
*p = ::boost::move(*vp); |
|||
++p; |
|||
} |
|||
} |
|||
} |
|||
}; |
|||
|
|||
template<class Allocator> |
|||
struct insert_copy_proxy |
|||
{ |
|||
typedef boost::container::allocator_traits<Allocator> alloc_traits; |
|||
typedef typename alloc_traits::value_type value_type; |
|||
|
|||
static const bool single_value = true; |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE explicit insert_copy_proxy(const value_type &v) |
|||
: v_(v) |
|||
{} |
|||
|
|||
template<class Iterator> |
|||
BOOST_CONTAINER_FORCEINLINE void uninitialized_copy_n_and_update(Allocator &a, Iterator p, std::size_t n) const |
|||
{ |
|||
BOOST_ASSERT(n == 1); (void)n; |
|||
alloc_traits::construct( a, boost::movelib::iterator_to_raw_pointer(p), v_); |
|||
} |
|||
|
|||
template<class Iterator> |
|||
BOOST_CONTAINER_FORCEINLINE void copy_n_and_update(Allocator &, Iterator p, std::size_t n) const |
|||
{ |
|||
BOOST_ASSERT(n == 1); (void)n; |
|||
*p = v_; |
|||
} |
|||
|
|||
const value_type &v_; |
|||
}; |
|||
|
|||
|
|||
template<class Allocator> |
|||
struct insert_move_proxy |
|||
{ |
|||
typedef boost::container::allocator_traits<Allocator> alloc_traits; |
|||
typedef typename alloc_traits::value_type value_type; |
|||
|
|||
static const bool single_value = true; |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE explicit insert_move_proxy(value_type &v) |
|||
: v_(v) |
|||
{} |
|||
|
|||
template<class Iterator> |
|||
BOOST_CONTAINER_FORCEINLINE void uninitialized_copy_n_and_update(Allocator &a, Iterator p, std::size_t n) const |
|||
{ |
|||
BOOST_ASSERT(n == 1); (void)n; |
|||
alloc_traits::construct( a, boost::movelib::iterator_to_raw_pointer(p), ::boost::move(v_) ); |
|||
} |
|||
|
|||
template<class Iterator> |
|||
BOOST_CONTAINER_FORCEINLINE void copy_n_and_update(Allocator &, Iterator p, std::size_t n) const |
|||
{ |
|||
BOOST_ASSERT(n == 1); (void)n; |
|||
*p = ::boost::move(v_); |
|||
} |
|||
|
|||
value_type &v_; |
|||
}; |
|||
|
|||
template<class It, class Allocator> |
|||
BOOST_CONTAINER_FORCEINLINE insert_move_proxy<Allocator> get_insert_value_proxy(BOOST_RV_REF(typename boost::container::iterator_traits<It>::value_type) v) |
|||
{ |
|||
return insert_move_proxy<Allocator>(v); |
|||
} |
|||
|
|||
template<class It, class Allocator> |
|||
BOOST_CONTAINER_FORCEINLINE insert_copy_proxy<Allocator> get_insert_value_proxy(const typename boost::container::iterator_traits<It>::value_type &v) |
|||
{ |
|||
return insert_copy_proxy<Allocator>(v); |
|||
} |
|||
|
|||
}}} //namespace boost { namespace container { namespace dtl {
|
|||
|
|||
#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
|
|||
|
|||
#include <boost/container/detail/variadic_templates_tools.hpp>
|
|||
#include <boost/move/utility_core.hpp>
|
|||
|
|||
namespace boost { |
|||
namespace container { |
|||
namespace dtl { |
|||
|
|||
template<class Allocator, class ...Args> |
|||
struct insert_nonmovable_emplace_proxy |
|||
{ |
|||
typedef boost::container::allocator_traits<Allocator> alloc_traits; |
|||
typedef typename alloc_traits::value_type value_type; |
|||
typedef typename build_number_seq<sizeof...(Args)>::type index_tuple_t; |
|||
|
|||
static const bool single_value = true; |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE explicit insert_nonmovable_emplace_proxy(BOOST_FWD_REF(Args)... args) |
|||
: args_(args...) |
|||
{} |
|||
|
|||
template<class Iterator> |
|||
BOOST_CONTAINER_FORCEINLINE void uninitialized_copy_n_and_update(Allocator &a, Iterator p, std::size_t n) |
|||
{ this->priv_uninitialized_copy_some_and_update(a, index_tuple_t(), p, n); } |
|||
|
|||
private: |
|||
template<std::size_t ...IdxPack, class Iterator> |
|||
BOOST_CONTAINER_FORCEINLINE void priv_uninitialized_copy_some_and_update(Allocator &a, const index_tuple<IdxPack...>&, Iterator p, std::size_t n) |
|||
{ |
|||
BOOST_ASSERT(n == 1); (void)n; |
|||
alloc_traits::construct( a, boost::movelib::iterator_to_raw_pointer(p), ::boost::forward<Args>(get<IdxPack>(this->args_))... ); |
|||
} |
|||
|
|||
protected: |
|||
tuple<Args&...> args_; |
|||
}; |
|||
|
|||
template<class Allocator, class ...Args> |
|||
struct insert_emplace_proxy |
|||
: public insert_nonmovable_emplace_proxy<Allocator, Args...> |
|||
{ |
|||
typedef insert_nonmovable_emplace_proxy<Allocator, Args...> base_t; |
|||
typedef boost::container::allocator_traits<Allocator> alloc_traits; |
|||
typedef typename base_t::value_type value_type; |
|||
typedef typename base_t::index_tuple_t index_tuple_t; |
|||
|
|||
static const bool single_value = true; |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE explicit insert_emplace_proxy(BOOST_FWD_REF(Args)... args) |
|||
: base_t(::boost::forward<Args>(args)...) |
|||
{} |
|||
|
|||
template<class Iterator> |
|||
BOOST_CONTAINER_FORCEINLINE void copy_n_and_update(Allocator &a, Iterator p, std::size_t n) |
|||
{ this->priv_copy_some_and_update(a, index_tuple_t(), p, n); } |
|||
|
|||
private: |
|||
|
|||
template<std::size_t ...IdxPack, class Iterator> |
|||
BOOST_CONTAINER_FORCEINLINE void priv_copy_some_and_update(Allocator &a, const index_tuple<IdxPack...>&, Iterator p, std::size_t n) |
|||
{ |
|||
BOOST_ASSERT(n ==1); (void)n; |
|||
typename dtl::aligned_storage<sizeof(value_type), dtl::alignment_of<value_type>::value>::type v; |
|||
alloc_traits::construct(a, move_detail::force_ptr<value_type *>(&v), ::boost::forward<Args>(get<IdxPack>(this->args_))...); |
|||
value_type *vp = move_detail::force_ptr<value_type *>(&v); |
|||
BOOST_CONTAINER_TRY{ |
|||
*p = ::boost::move(*vp); |
|||
} |
|||
BOOST_CONTAINER_CATCH(...){ |
|||
alloc_traits::destroy(a, vp); |
|||
BOOST_CONTAINER_RETHROW |
|||
} |
|||
BOOST_CONTAINER_CATCH_END |
|||
alloc_traits::destroy(a, vp); |
|||
} |
|||
}; |
|||
|
|||
//Specializations to avoid an unneeded temporary when emplacing from a single argument o type value_type
|
|||
template<class Allocator> |
|||
struct insert_emplace_proxy<Allocator, typename boost::container::allocator_traits<Allocator>::value_type> |
|||
: public insert_move_proxy<Allocator> |
|||
{ |
|||
static const bool single_value = true; |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE explicit insert_emplace_proxy(typename boost::container::allocator_traits<Allocator>::value_type &&v) |
|||
: insert_move_proxy<Allocator>(v) |
|||
{} |
|||
}; |
|||
|
|||
//We use "add_const" here as adding "const" only confuses MSVC12(and maybe later) provoking
|
|||
//compiler error C2752 ("more than one partial specialization matches").
|
|||
//Any problem is solvable with an extra layer of indirection? ;-)
|
|||
template<class Allocator> |
|||
struct insert_emplace_proxy<Allocator |
|||
, typename boost::container::dtl::add_const<typename boost::container::allocator_traits<Allocator>::value_type>::type |
|||
> |
|||
: public insert_copy_proxy<Allocator> |
|||
{ |
|||
|
|||
static const bool single_value = true; |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE explicit insert_emplace_proxy(const typename boost::container::allocator_traits<Allocator>::value_type &v) |
|||
: insert_copy_proxy<Allocator>(v) |
|||
{} |
|||
}; |
|||
|
|||
template<class Allocator> |
|||
struct insert_emplace_proxy<Allocator, typename boost::container::allocator_traits<Allocator>::value_type &> |
|||
: public insert_copy_proxy<Allocator> |
|||
{ |
|||
static const bool single_value = true; |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE explicit insert_emplace_proxy(const typename boost::container::allocator_traits<Allocator>::value_type &v) |
|||
: insert_copy_proxy<Allocator>(v) |
|||
{} |
|||
}; |
|||
|
|||
template<class Allocator> |
|||
struct insert_emplace_proxy<Allocator |
|||
, typename boost::container::dtl::add_const<typename boost::container::allocator_traits<Allocator>::value_type>::type & |
|||
> |
|||
: public insert_copy_proxy<Allocator> |
|||
{ |
|||
static const bool single_value = true; |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE explicit insert_emplace_proxy(const typename boost::container::allocator_traits<Allocator>::value_type &v) |
|||
: insert_copy_proxy<Allocator>(v) |
|||
{} |
|||
}; |
|||
|
|||
}}} //namespace boost { namespace container { namespace dtl {
|
|||
|
|||
#else // !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
|
|||
|
|||
#include <boost/container/detail/value_init.hpp>
|
|||
|
|||
namespace boost { |
|||
namespace container { |
|||
namespace dtl { |
|||
|
|||
#define BOOST_CONTAINER_ADVANCED_INSERT_INT_CODE(N) \
|
|||
template< class Allocator BOOST_MOVE_I##N BOOST_MOVE_CLASS##N >\ |
|||
struct insert_nonmovable_emplace_proxy##N\ |
|||
{\ |
|||
typedef boost::container::allocator_traits<Allocator> alloc_traits;\ |
|||
typedef typename alloc_traits::value_type value_type;\ |
|||
\ |
|||
static const bool single_value = true;\ |
|||
\ |
|||
BOOST_CONTAINER_FORCEINLINE explicit insert_nonmovable_emplace_proxy##N(BOOST_MOVE_UREF##N)\ |
|||
BOOST_MOVE_COLON##N BOOST_MOVE_FWD_INIT##N {}\ |
|||
\ |
|||
template<class Iterator>\ |
|||
BOOST_CONTAINER_FORCEINLINE void uninitialized_copy_n_and_update(Allocator &a, Iterator p, std::size_t n)\ |
|||
{\ |
|||
BOOST_ASSERT(n == 1); (void)n;\ |
|||
alloc_traits::construct(a, boost::movelib::iterator_to_raw_pointer(p) BOOST_MOVE_I##N BOOST_MOVE_MFWD##N);\ |
|||
}\ |
|||
\ |
|||
template<class Iterator>\ |
|||
BOOST_CONTAINER_FORCEINLINE void copy_n_and_update(Allocator &, Iterator, std::size_t)\ |
|||
{ BOOST_ASSERT(false); }\ |
|||
\ |
|||
protected:\ |
|||
BOOST_MOVE_MREF##N\ |
|||
};\ |
|||
\ |
|||
template< class Allocator BOOST_MOVE_I##N BOOST_MOVE_CLASS##N >\ |
|||
struct insert_emplace_proxy_arg##N\ |
|||
: insert_nonmovable_emplace_proxy##N< Allocator BOOST_MOVE_I##N BOOST_MOVE_TARG##N >\ |
|||
{\ |
|||
typedef insert_nonmovable_emplace_proxy##N\ |
|||
< Allocator BOOST_MOVE_I##N BOOST_MOVE_TARG##N > base_t;\ |
|||
typedef typename base_t::value_type value_type;\ |
|||
typedef boost::container::allocator_traits<Allocator> alloc_traits;\ |
|||
\ |
|||
static const bool single_value = true;\ |
|||
\ |
|||
BOOST_CONTAINER_FORCEINLINE explicit insert_emplace_proxy_arg##N(BOOST_MOVE_UREF##N)\ |
|||
: base_t(BOOST_MOVE_FWD##N){}\ |
|||
\ |
|||
template<class Iterator>\ |
|||
BOOST_CONTAINER_FORCEINLINE void copy_n_and_update(Allocator &a, Iterator p, std::size_t n)\ |
|||
{\ |
|||
BOOST_ASSERT(n == 1); (void)n;\ |
|||
typename dtl::aligned_storage<sizeof(value_type), dtl::alignment_of<value_type>::value>::type v;\ |
|||
alloc_traits::construct(a, move_detail::force_ptr<value_type *>(&v) BOOST_MOVE_I##N BOOST_MOVE_MFWD##N);\ |
|||
value_type *vp = move_detail::force_ptr<value_type *>(&v);\ |
|||
BOOST_CONTAINER_TRY{\ |
|||
*p = ::boost::move(*vp);\ |
|||
}\ |
|||
BOOST_CONTAINER_CATCH(...){\ |
|||
alloc_traits::destroy(a, vp);\ |
|||
BOOST_CONTAINER_RETHROW\ |
|||
}\ |
|||
BOOST_CONTAINER_CATCH_END\ |
|||
alloc_traits::destroy(a, vp);\ |
|||
}\ |
|||
};\ |
|||
//
|
|||
BOOST_MOVE_ITERATE_0TO9(BOOST_CONTAINER_ADVANCED_INSERT_INT_CODE) |
|||
#undef BOOST_CONTAINER_ADVANCED_INSERT_INT_CODE
|
|||
|
|||
#if defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
|
|||
|
|||
//Specializations to avoid an unneeded temporary when emplacing from a single argument o type value_type
|
|||
template<class Allocator> |
|||
struct insert_emplace_proxy_arg1<Allocator, ::boost::rv<typename boost::container::allocator_traits<Allocator>::value_type> > |
|||
: public insert_move_proxy<Allocator> |
|||
{ |
|||
static const bool single_value = true; |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE explicit insert_emplace_proxy_arg1(typename boost::container::allocator_traits<Allocator>::value_type &v) |
|||
: insert_move_proxy<Allocator>(v) |
|||
{} |
|||
}; |
|||
|
|||
template<class Allocator> |
|||
struct insert_emplace_proxy_arg1<Allocator, typename boost::container::allocator_traits<Allocator>::value_type> |
|||
: public insert_copy_proxy<Allocator> |
|||
{ |
|||
static const bool single_value = true; |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE explicit insert_emplace_proxy_arg1(const typename boost::container::allocator_traits<Allocator>::value_type &v) |
|||
: insert_copy_proxy<Allocator>(v) |
|||
{} |
|||
}; |
|||
|
|||
#else //e.g. MSVC10 & MSVC11
|
|||
|
|||
//Specializations to avoid an unneeded temporary when emplacing from a single argument o type value_type
|
|||
template<class Allocator> |
|||
struct insert_emplace_proxy_arg1<Allocator, typename boost::container::allocator_traits<Allocator>::value_type> |
|||
: public insert_move_proxy<Allocator> |
|||
{ |
|||
static const bool single_value = true; |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE explicit insert_emplace_proxy_arg1(typename boost::container::allocator_traits<Allocator>::value_type &&v) |
|||
: insert_move_proxy<Allocator>(v) |
|||
{} |
|||
}; |
|||
|
|||
//We use "add_const" here as adding "const" only confuses MSVC10&11 provoking
|
|||
//compiler error C2752 ("more than one partial specialization matches").
|
|||
//Any problem is solvable with an extra layer of indirection? ;-)
|
|||
template<class Allocator> |
|||
struct insert_emplace_proxy_arg1<Allocator |
|||
, typename boost::container::dtl::add_const<typename boost::container::allocator_traits<Allocator>::value_type>::type |
|||
> |
|||
: public insert_copy_proxy<Allocator> |
|||
{ |
|||
static const bool single_value = true; |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE explicit insert_emplace_proxy_arg1(const typename boost::container::allocator_traits<Allocator>::value_type &v) |
|||
: insert_copy_proxy<Allocator>(v) |
|||
{} |
|||
}; |
|||
|
|||
template<class Allocator> |
|||
struct insert_emplace_proxy_arg1<Allocator, typename boost::container::allocator_traits<Allocator>::value_type &> |
|||
: public insert_copy_proxy<Allocator> |
|||
{ |
|||
static const bool single_value = true; |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE explicit insert_emplace_proxy_arg1(const typename boost::container::allocator_traits<Allocator>::value_type &v) |
|||
: insert_copy_proxy<Allocator>(v) |
|||
{} |
|||
}; |
|||
|
|||
template<class Allocator> |
|||
struct insert_emplace_proxy_arg1<Allocator |
|||
, typename boost::container::dtl::add_const<typename boost::container::allocator_traits<Allocator>::value_type>::type & |
|||
> |
|||
: public insert_copy_proxy<Allocator> |
|||
{ |
|||
static const bool single_value = true; |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE explicit insert_emplace_proxy_arg1(const typename boost::container::allocator_traits<Allocator>::value_type &v) |
|||
: insert_copy_proxy<Allocator>(v) |
|||
{} |
|||
}; |
|||
|
|||
#endif
|
|||
|
|||
}}} //namespace boost { namespace container { namespace dtl {
|
|||
|
|||
#endif // !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
|
|||
|
|||
#include <boost/container/detail/config_end.hpp>
|
|||
|
|||
#endif //#ifndef BOOST_CONTAINER_ADVANCED_INSERT_INT_HPP
|
@ -0,0 +1,185 @@ |
|||
//////////////////////////////////////////////////////////////////////////////
|
|||
//
|
|||
// (C) Copyright Ion Gaztanaga 2014-2014.
|
|||
//
|
|||
// 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_ALGORITHM_HPP
|
|||
#define BOOST_CONTAINER_DETAIL_ALGORITHM_HPP
|
|||
|
|||
#ifndef BOOST_CONFIG_HPP
|
|||
# include <boost/config.hpp>
|
|||
#endif
|
|||
|
|||
#if defined(BOOST_HAS_PRAGMA_ONCE)
|
|||
# pragma once
|
|||
#endif
|
|||
|
|||
#include <boost/intrusive/detail/algorithm.hpp>
|
|||
|
|||
namespace boost { |
|||
namespace container { |
|||
|
|||
using boost::intrusive::algo_equal; |
|||
using boost::intrusive::algo_lexicographical_compare; |
|||
|
|||
template<class Func> |
|||
class binder1st |
|||
{ |
|||
public: |
|||
typedef typename Func::second_argument_type argument_type; |
|||
typedef typename Func::result_type result_type; |
|||
|
|||
binder1st(const Func& func, const typename Func::first_argument_type& arg) |
|||
: op(func), value(arg) |
|||
{} |
|||
|
|||
result_type operator()(const argument_type& arg) const |
|||
{ return op(value, arg); } |
|||
|
|||
result_type operator()(argument_type& arg) const |
|||
{ return op(value, arg); } |
|||
|
|||
private: |
|||
Func op; |
|||
typename Func::first_argument_type value; |
|||
}; |
|||
|
|||
template<class Func, class T> |
|||
inline binder1st<Func> bind1st(const Func& func, const T& arg) |
|||
{ return boost::container::binder1st<Func>(func, arg); } |
|||
|
|||
template<class Func> |
|||
class binder2nd |
|||
{ |
|||
public: |
|||
typedef typename Func::first_argument_type argument_type; |
|||
typedef typename Func::result_type result_type; |
|||
|
|||
binder2nd(const Func& func, const typename Func::second_argument_type& arg) |
|||
: op(func), value(arg) |
|||
{} |
|||
|
|||
result_type operator()(const argument_type& arg) const |
|||
{ return op(arg, value); } |
|||
|
|||
result_type operator()(argument_type& arg) const |
|||
{ return op(arg, value); } |
|||
|
|||
private: |
|||
Func op; |
|||
typename Func::second_argument_type value; |
|||
}; |
|||
|
|||
template<class Func, class T> |
|||
inline binder2nd<Func> bind2nd(const Func& func, const T& arg) |
|||
{ |
|||
return (boost::container::binder2nd<Func>(func, arg)); |
|||
} |
|||
|
|||
template<class Func> |
|||
class unary_negate |
|||
{ |
|||
public: |
|||
typedef typename Func::argument_type argument_type; |
|||
typedef typename Func::result_type result_type; |
|||
|
|||
explicit unary_negate(const Func& func) |
|||
: m_func(func) |
|||
{} |
|||
|
|||
bool operator()(const typename Func::argument_type& arg) const |
|||
{ return !m_func(arg); } |
|||
|
|||
private: |
|||
Func m_func; |
|||
}; |
|||
|
|||
template<class Func> inline |
|||
unary_negate<Func> not1(const Func& func) |
|||
{ |
|||
return boost::container::unary_negate<Func>(func); |
|||
} |
|||
|
|||
template<class InputIt, class UnaryPredicate> |
|||
InputIt find_if(InputIt first, InputIt last, UnaryPredicate p) |
|||
{ |
|||
for (; first != last; ++first) { |
|||
if (p(*first)) { |
|||
return first; |
|||
} |
|||
} |
|||
return last; |
|||
} |
|||
|
|||
template<class ForwardIt1, class ForwardIt2, class BinaryPredicate> |
|||
ForwardIt1 find_end (ForwardIt1 first1, ForwardIt1 last1 |
|||
,ForwardIt2 first2, ForwardIt2 last2 |
|||
,BinaryPredicate p) |
|||
{ |
|||
if (first2==last2) |
|||
return last1; // specified in C++11
|
|||
|
|||
ForwardIt1 ret = last1; |
|||
|
|||
while (first1!=last1) |
|||
{ |
|||
ForwardIt1 it1 = first1; |
|||
ForwardIt2 it2 = first2; |
|||
while ( p(*it1, *it2) ) { |
|||
++it1; ++it2; |
|||
if (it2==last2) { |
|||
ret=first1; |
|||
break; |
|||
} |
|||
if (it1==last1) |
|||
return ret; |
|||
} |
|||
++first1; |
|||
} |
|||
return ret; |
|||
} |
|||
|
|||
template<class InputIt, class ForwardIt, class BinaryPredicate> |
|||
InputIt find_first_of(InputIt first1, InputIt last1, ForwardIt first2, ForwardIt last2, BinaryPredicate p) |
|||
{ |
|||
for (; first1 != last1; ++first1) { |
|||
for (ForwardIt it = first2; it != last2; ++it) { |
|||
if (p(*first1, *it)) { |
|||
return first1; |
|||
} |
|||
} |
|||
} |
|||
return last1; |
|||
} |
|||
|
|||
template<class ForwardIt1, class ForwardIt2, class BinaryPredicate> |
|||
ForwardIt1 search(ForwardIt1 first1, ForwardIt1 last1, |
|||
ForwardIt2 first2, ForwardIt2 last2, BinaryPredicate p) |
|||
{ |
|||
for (; ; ++first1) { |
|||
ForwardIt1 it = first1; |
|||
for (ForwardIt2 it2 = first2; ; ++it, ++it2) { |
|||
if (it2 == last2) { |
|||
return first1; |
|||
} |
|||
if (it == last1) { |
|||
return last1; |
|||
} |
|||
if (!p(*it, *it2)) { |
|||
break; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
} //namespace container {
|
|||
} //namespace boost {
|
|||
|
|||
#endif //#ifndef BOOST_CONTAINER_DETAIL_ALGORITHM_HPP
|
@ -0,0 +1,60 @@ |
|||
//////////////////////////////////////////////////////////////////////////////
|
|||
//
|
|||
// (C) Copyright Ion Gaztanaga 2014-2015. 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_ALLOC_TRAITS_HPP
|
|||
#define BOOST_CONTAINER_DETAIL_ALLOC_TRAITS_HPP
|
|||
|
|||
#ifndef BOOST_CONFIG_HPP
|
|||
# include <boost/config.hpp>
|
|||
#endif
|
|||
|
|||
#if defined(BOOST_HAS_PRAGMA_ONCE)
|
|||
# pragma once
|
|||
#endif
|
|||
|
|||
// move
|
|||
#include <boost/move/adl_move_swap.hpp>
|
|||
#include <boost/move/utility_core.hpp>
|
|||
|
|||
namespace boost { |
|||
namespace container { |
|||
namespace dtl { |
|||
|
|||
template<class AllocatorType> |
|||
BOOST_CONTAINER_FORCEINLINE void swap_alloc(AllocatorType &, AllocatorType &, dtl::false_type) |
|||
BOOST_NOEXCEPT_OR_NOTHROW |
|||
{} |
|||
|
|||
template<class AllocatorType> |
|||
BOOST_CONTAINER_FORCEINLINE void swap_alloc(AllocatorType &l, AllocatorType &r, dtl::true_type) |
|||
{ boost::adl_move_swap(l, r); } |
|||
|
|||
template<class AllocatorType> |
|||
BOOST_CONTAINER_FORCEINLINE void assign_alloc(AllocatorType &, const AllocatorType &, dtl::false_type) |
|||
BOOST_NOEXCEPT_OR_NOTHROW |
|||
{} |
|||
|
|||
template<class AllocatorType> |
|||
BOOST_CONTAINER_FORCEINLINE void assign_alloc(AllocatorType &l, const AllocatorType &r, dtl::true_type) |
|||
{ l = r; } |
|||
|
|||
template<class AllocatorType> |
|||
BOOST_CONTAINER_FORCEINLINE void move_alloc(AllocatorType &, AllocatorType &, dtl::false_type) |
|||
BOOST_NOEXCEPT_OR_NOTHROW |
|||
{} |
|||
|
|||
template<class AllocatorType> |
|||
BOOST_CONTAINER_FORCEINLINE void move_alloc(AllocatorType &l, AllocatorType &r, dtl::true_type) |
|||
{ l = ::boost::move(r); } |
|||
|
|||
} //namespace dtl {
|
|||
} //namespace container {
|
|||
} //namespace boost {
|
|||
|
|||
#endif //#ifndef BOOST_CONTAINER_DETAIL_ALLOC_TRAITS_HPP
|
@ -0,0 +1,58 @@ |
|||
///////////////////////////////////////////////////////////////////////////////
|
|||
//
|
|||
// (C) Copyright Ion Gaztanaga 2005-2013. 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_ALLOCATION_TYPE_HPP
|
|||
#define BOOST_CONTAINER_ALLOCATION_TYPE_HPP
|
|||
|
|||
#ifndef BOOST_CONFIG_HPP
|
|||
# include <boost/config.hpp>
|
|||
#endif
|
|||
|
|||
#if defined(BOOST_HAS_PRAGMA_ONCE)
|
|||
# pragma once
|
|||
#endif
|
|||
|
|||
#include <boost/container/detail/config_begin.hpp>
|
|||
#include <boost/container/detail/workaround.hpp>
|
|||
|
|||
namespace boost { |
|||
namespace container { |
|||
|
|||
#ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
|
|||
enum allocation_type_v |
|||
{ |
|||
// constants for allocation commands
|
|||
allocate_new_v = 0x01, |
|||
expand_fwd_v = 0x02, |
|||
expand_bwd_v = 0x04, |
|||
// expand_both = expand_fwd | expand_bwd,
|
|||
// expand_or_new = allocate_new | expand_both,
|
|||
shrink_in_place_v = 0x08, |
|||
nothrow_allocation_v = 0x10, |
|||
zero_memory_v = 0x20, |
|||
try_shrink_in_place_v = 0x40 |
|||
}; |
|||
|
|||
typedef unsigned int allocation_type; |
|||
#endif //#ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
|
|||
static const allocation_type allocate_new = (allocation_type)allocate_new_v; |
|||
static const allocation_type expand_fwd = (allocation_type)expand_fwd_v; |
|||
static const allocation_type expand_bwd = (allocation_type)expand_bwd_v; |
|||
static const allocation_type shrink_in_place = (allocation_type)shrink_in_place_v; |
|||
static const allocation_type try_shrink_in_place= (allocation_type)try_shrink_in_place_v; |
|||
static const allocation_type nothrow_allocation = (allocation_type)nothrow_allocation_v; |
|||
static const allocation_type zero_memory = (allocation_type)zero_memory_v; |
|||
|
|||
} //namespace container {
|
|||
} //namespace boost {
|
|||
|
|||
#include <boost/container/detail/config_end.hpp>
|
|||
|
|||
#endif //BOOST_CONTAINER_ALLOCATION_TYPE_HPP
|
@ -0,0 +1,162 @@ |
|||
//////////////////////////////////////////////////////////////////////////////
|
|||
//
|
|||
// (C) Copyright Ion Gaztanaga 2012-2013. 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_ALLOCATOR_VERSION_TRAITS_HPP
|
|||
#define BOOST_CONTAINER_DETAIL_ALLOCATOR_VERSION_TRAITS_HPP
|
|||
|
|||
#ifndef BOOST_CONFIG_HPP
|
|||
# include <boost/config.hpp>
|
|||
#endif
|
|||
|
|||
#if defined(BOOST_HAS_PRAGMA_ONCE)
|
|||
# pragma once
|
|||
#endif
|
|||
|
|||
#include <boost/container/detail/config_begin.hpp>
|
|||
#include <boost/container/detail/workaround.hpp>
|
|||
|
|||
#include <boost/container/allocator_traits.hpp> //allocator_traits
|
|||
#include <boost/container/throw_exception.hpp>
|
|||
#include <boost/container/detail/multiallocation_chain.hpp> //multiallocation_chain
|
|||
#include <boost/container/detail/version_type.hpp> //version_type
|
|||
#include <boost/container/detail/allocation_type.hpp> //allocation_type
|
|||
#include <boost/container/detail/mpl.hpp> //integral_constant
|
|||
#include <boost/intrusive/pointer_traits.hpp> //pointer_traits
|
|||
|
|||
namespace boost { |
|||
namespace container { |
|||
namespace dtl { |
|||
|
|||
template<class Allocator, unsigned Version = boost::container::dtl::version<Allocator>::value> |
|||
struct allocator_version_traits |
|||
{ |
|||
typedef ::boost::container::dtl::integral_constant |
|||
<unsigned, Version> alloc_version; |
|||
|
|||
typedef typename Allocator::multiallocation_chain multiallocation_chain; |
|||
|
|||
typedef typename boost::container::allocator_traits<Allocator>::pointer pointer; |
|||
typedef typename boost::container::allocator_traits<Allocator>::size_type size_type; |
|||
|
|||
//Node allocation interface
|
|||
BOOST_CONTAINER_FORCEINLINE static pointer allocate_one(Allocator &a) |
|||
{ return a.allocate_one(); } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE static void deallocate_one(Allocator &a, const pointer &p) |
|||
{ a.deallocate_one(p); } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE static void allocate_individual(Allocator &a, size_type n, multiallocation_chain &m) |
|||
{ return a.allocate_individual(n, m); } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE static void deallocate_individual(Allocator &a, multiallocation_chain &holder) |
|||
{ a.deallocate_individual(holder); } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE static pointer allocation_command(Allocator &a, allocation_type command, |
|||
size_type limit_size, size_type &prefer_in_recvd_out_size, pointer &reuse) |
|||
{ return a.allocation_command(command, limit_size, prefer_in_recvd_out_size, reuse); } |
|||
}; |
|||
|
|||
template<class Allocator> |
|||
struct allocator_version_traits<Allocator, 1> |
|||
{ |
|||
typedef ::boost::container::dtl::integral_constant |
|||
<unsigned, 1> alloc_version; |
|||
|
|||
typedef typename boost::container::allocator_traits<Allocator>::pointer pointer; |
|||
typedef typename boost::container::allocator_traits<Allocator>::size_type size_type; |
|||
typedef typename boost::container::allocator_traits<Allocator>::value_type value_type; |
|||
|
|||
typedef typename boost::intrusive::pointer_traits<pointer>:: |
|||
template rebind_pointer<void>::type void_ptr; |
|||
typedef dtl::basic_multiallocation_chain |
|||
<void_ptr> multialloc_cached_counted; |
|||
typedef boost::container::dtl:: |
|||
transform_multiallocation_chain |
|||
< multialloc_cached_counted, value_type> multiallocation_chain; |
|||
|
|||
//Node allocation interface
|
|||
BOOST_CONTAINER_FORCEINLINE static pointer allocate_one(Allocator &a) |
|||
{ return a.allocate(1); } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE static void deallocate_one(Allocator &a, const pointer &p) |
|||
{ a.deallocate(p, 1); } |
|||
|
|||
static void deallocate_individual(Allocator &a, multiallocation_chain &holder) |
|||
{ |
|||
size_type n = holder.size(); |
|||
typename multiallocation_chain::iterator it = holder.begin(); |
|||
while(n){ |
|||
--n; |
|||
pointer p = boost::intrusive::pointer_traits<pointer>::pointer_to(*it); |
|||
++it; |
|||
a.deallocate(p, 1); |
|||
} |
|||
} |
|||
|
|||
struct allocate_individual_rollback |
|||
{ |
|||
BOOST_CONTAINER_FORCEINLINE allocate_individual_rollback(Allocator &a, multiallocation_chain &chain) |
|||
: mr_a(a), mp_chain(&chain) |
|||
{} |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE ~allocate_individual_rollback() |
|||
{ |
|||
if(mp_chain) |
|||
allocator_version_traits::deallocate_individual(mr_a, *mp_chain); |
|||
} |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE void release() |
|||
{ |
|||
mp_chain = 0; |
|||
} |
|||
|
|||
Allocator &mr_a; |
|||
multiallocation_chain * mp_chain; |
|||
}; |
|||
|
|||
static void allocate_individual(Allocator &a, size_type n, multiallocation_chain &m) |
|||
{ |
|||
allocate_individual_rollback rollback(a, m); |
|||
while(n--){ |
|||
m.push_front(a.allocate(1)); |
|||
} |
|||
rollback.release(); |
|||
} |
|||
|
|||
static pointer allocation_command(Allocator &a, allocation_type command, |
|||
size_type, size_type &prefer_in_recvd_out_size, pointer &reuse) |
|||
{ |
|||
pointer ret = pointer(); |
|||
if(BOOST_UNLIKELY(!(command & allocate_new) && !(command & nothrow_allocation))){ |
|||
throw_logic_error("version 1 allocator without allocate_new flag"); |
|||
} |
|||
else{ |
|||
BOOST_CONTAINER_TRY{ |
|||
ret = a.allocate(prefer_in_recvd_out_size); |
|||
} |
|||
BOOST_CONTAINER_CATCH(...){ |
|||
if(!(command & nothrow_allocation)){ |
|||
BOOST_CONTAINER_RETHROW |
|||
} |
|||
} |
|||
BOOST_CONTAINER_CATCH_END |
|||
reuse = pointer(); |
|||
} |
|||
return ret; |
|||
} |
|||
}; |
|||
|
|||
} //namespace dtl {
|
|||
} //namespace container {
|
|||
} //namespace boost {
|
|||
|
|||
#include <boost/container/detail/config_end.hpp>
|
|||
|
|||
#endif // ! defined(BOOST_CONTAINER_DETAIL_ALLOCATOR_VERSION_TRAITS_HPP)
|
@ -0,0 +1,134 @@ |
|||
///////////////////////////////////////////////////////////////////////////////
|
|||
//
|
|||
// (C) Copyright Ion Gaztanaga 2014-2014. 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_COMPARE_FUNCTORS_HPP
|
|||
#define BOOST_CONTAINER_DETAIL_COMPARE_FUNCTORS_HPP
|
|||
|
|||
#ifndef BOOST_CONFIG_HPP
|
|||
# include <boost/config.hpp>
|
|||
#endif
|
|||
|
|||
#if defined(BOOST_HAS_PRAGMA_ONCE)
|
|||
# pragma once
|
|||
#endif
|
|||
|
|||
#include <boost/intrusive/detail/ebo_functor_holder.hpp>
|
|||
#include <boost/container/detail/workaround.hpp>
|
|||
|
|||
namespace boost { |
|||
namespace container { |
|||
|
|||
template<class ValueType> |
|||
class equal_to_value |
|||
{ |
|||
typedef ValueType value_type; |
|||
const value_type &t_; |
|||
|
|||
public: |
|||
BOOST_CONTAINER_FORCEINLINE explicit equal_to_value(const value_type &t) |
|||
: t_(t) |
|||
{} |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE bool operator()(const value_type &t)const |
|||
{ return t_ == t; } |
|||
}; |
|||
|
|||
template<class Node, class Pred, class Ret = bool> |
|||
struct value_to_node_compare |
|||
: Pred |
|||
{ |
|||
typedef Pred predicate_type; |
|||
typedef Node node_type; |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE value_to_node_compare() |
|||
: Pred() |
|||
{} |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE explicit value_to_node_compare(Pred pred) |
|||
: Pred(pred) |
|||
{} |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE Ret operator()(const Node &a, const Node &b) const |
|||
{ return static_cast<const Pred&>(*this)(a.get_data(), b.get_data()); } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE Ret operator()(const Node &a) const |
|||
{ return static_cast<const Pred&>(*this)(a.get_data()); } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE Ret operator()(const Node &a, const Node &b) |
|||
{ return static_cast<Pred&>(*this)(a.get_data(), b.get_data()); } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE Ret operator()(const Node &a) |
|||
{ return static_cast<Pred&>(*this)(a.get_data()); } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE predicate_type & predicate() { return static_cast<predicate_type&>(*this); } |
|||
BOOST_CONTAINER_FORCEINLINE const predicate_type & predicate() const { return static_cast<predicate_type&>(*this); } |
|||
}; |
|||
|
|||
template<class KeyPred, class KeyOfValue, class Node, class Ret = bool> |
|||
struct key_node_pred |
|||
: public boost::intrusive::detail::ebo_functor_holder<KeyPred> |
|||
{ |
|||
BOOST_CONTAINER_FORCEINLINE explicit key_node_pred(const KeyPred &comp) |
|||
: base_t(comp) |
|||
{} |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE explicit key_node_pred() |
|||
{} |
|||
|
|||
typedef boost::intrusive::detail::ebo_functor_holder<KeyPred> base_t; |
|||
typedef KeyPred key_predicate; |
|||
typedef KeyOfValue key_of_value; |
|||
typedef typename KeyOfValue::type key_type; |
|||
|
|||
|
|||
BOOST_CONTAINER_FORCEINLINE static const key_type &key_from(const Node &n) |
|||
{ |
|||
return key_of_value()(n.get_data()); |
|||
} |
|||
|
|||
template <class T> |
|||
BOOST_CONTAINER_FORCEINLINE static const T & |
|||
key_from(const T &t) |
|||
{ return t; } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE const key_predicate &key_pred() const |
|||
{ return static_cast<const key_predicate &>(*this); } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE key_predicate &key_pred() |
|||
{ return static_cast<key_predicate &>(*this); } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE Ret operator()(const key_type &key) const |
|||
{ return this->key_pred()(key); } |
|||
|
|||
template<class U> |
|||
BOOST_CONTAINER_FORCEINLINE Ret operator()(const U &nonkey) const |
|||
{ return this->key_pred()(this->key_from(nonkey)); } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE bool operator()(const key_type &key1, const key_type &key2) const |
|||
{ return this->key_pred()(key1, key2); } |
|||
|
|||
template<class U> |
|||
BOOST_CONTAINER_FORCEINLINE bool operator()(const key_type &key1, const U &nonkey2) const |
|||
{ return this->key_pred()(key1, this->key_from(nonkey2)); } |
|||
|
|||
template<class U> |
|||
BOOST_CONTAINER_FORCEINLINE bool operator()(const U &nonkey1, const key_type &key2) const |
|||
{ return this->key_pred()(this->key_from(nonkey1), key2); } |
|||
|
|||
template<class U, class V> |
|||
BOOST_CONTAINER_FORCEINLINE bool operator()(const U &nonkey1, const V &nonkey2) const |
|||
{ return this->key_pred()(this->key_from(nonkey1), this->key_from(nonkey2)); } |
|||
}; |
|||
|
|||
|
|||
} //namespace container {
|
|||
} //namespace boost {
|
|||
|
|||
#endif //BOOST_CONTAINER_DETAIL_COMPARE_FUNCTORS_HPP
|
@ -0,0 +1,61 @@ |
|||
//////////////////////////////////////////////////////////////////////////////
|
|||
//
|
|||
// (C) Copyright Ion Gaztanaga 2005-2013. 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_CONTAINER_DETAIL_CONFIG_INCLUDED
|
|||
#define BOOST_CONTAINER_CONTAINER_DETAIL_CONFIG_INCLUDED
|
|||
#ifndef BOOST_CONFIG_HPP
|
|||
#include <boost/config.hpp>
|
|||
#endif
|
|||
|
|||
#endif //BOOST_CONTAINER_CONTAINER_DETAIL_CONFIG_INCLUDED
|
|||
|
|||
#ifdef BOOST_MSVC
|
|||
#pragma warning (push)
|
|||
#pragma warning (disable : 4619) // there is no warning number 'XXXX'
|
|||
#pragma warning (disable : 4127) // conditional expression is constant
|
|||
#pragma warning (disable : 4146) // unary minus operator applied to unsigned type, result still unsigned
|
|||
#pragma warning (disable : 4197) // top-level volatile in cast is ignored
|
|||
#pragma warning (disable : 4251) // "identifier" : class "type" needs to have dll-interface to be used by clients of class "type2"
|
|||
#pragma warning (disable : 4275) // non DLL-interface classkey "identifier" used as base for DLL-interface classkey "identifier"
|
|||
#pragma warning (disable : 4284) // odd return type for operator->
|
|||
#pragma warning (disable : 4290) // C++ exception specification ignored except to indicate a function is not __declspec(nothrow)
|
|||
#pragma warning (disable : 4324) // structure was padded due to __declspec(align(
|
|||
#pragma warning (disable : 4345) // behavior change: an object of POD type constructed with an initializer of the form () will be default-initialized
|
|||
#pragma warning (disable : 4355) // "this" : used in base member initializer list
|
|||
#pragma warning (disable : 4503) // "identifier" : decorated name length exceeded, name was truncated
|
|||
#pragma warning (disable : 4510) // default constructor could not be generated
|
|||
#pragma warning (disable : 4511) // copy constructor could not be generated
|
|||
#pragma warning (disable : 4512) // assignment operator could not be generated
|
|||
#pragma warning (disable : 4514) // unreferenced inline removed
|
|||
#pragma warning (disable : 4521) // Disable "multiple copy constructors specified"
|
|||
#pragma warning (disable : 4522) // "class" : multiple assignment operators specified
|
|||
#pragma warning (disable : 4541) // 'typeid' used on polymorphic type '' with /GR-; unpredictable behavior may result
|
|||
#pragma warning (disable : 4584) // X is already a base-class of Y
|
|||
#pragma warning (disable : 4610) // struct can never be instantiated - user defined constructor required
|
|||
#pragma warning (disable : 4671) // the copy constructor is inaccessible
|
|||
#pragma warning (disable : 4673) // throwing '' the following types will not be considered at the catch site
|
|||
#pragma warning (disable : 4675) // "method" should be declared "static" and have exactly one parameter
|
|||
#pragma warning (disable : 4706) // assignment within conditional expression
|
|||
#pragma warning (disable : 4710) // function not inlined
|
|||
#pragma warning (disable : 4714) // "function": marked as __forceinline not inlined
|
|||
#pragma warning (disable : 4711) // function selected for automatic inline expansion
|
|||
#pragma warning (disable : 4786) // identifier truncated in debug info
|
|||
#pragma warning (disable : 4996) // "function": was declared deprecated
|
|||
|
|||
#endif //BOOST_MSVC
|
|||
|
|||
|
|||
#if defined(BOOST_GCC) && (BOOST_GCC >= 40600)
|
|||
#pragma GCC diagnostic push
|
|||
//Sign conversion warnings broken before GCC 9.3
|
|||
//(https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87519)
|
|||
#if BOOST_GCC < 90300
|
|||
#pragma GCC diagnostic ignored "-Wsign-conversion"
|
|||
#endif
|
|||
#endif
|
@ -0,0 +1,16 @@ |
|||
//////////////////////////////////////////////////////////////////////////////
|
|||
//
|
|||
// (C) Copyright Ion Gaztanaga 2005-2013. 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.
|
|||
//
|
|||
//////////////////////////////////////////////////////////////////////////////
|
|||
#if defined BOOST_MSVC
|
|||
#pragma warning (pop)
|
|||
#endif
|
|||
|
|||
#if defined(BOOST_GCC) && (BOOST_GCC >= 40600)
|
|||
#pragma GCC diagnostic pop
|
|||
#endif
|
@ -0,0 +1,98 @@ |
|||
//////////////////////////////////////////////////////////////////////////////
|
|||
//
|
|||
// (C) Copyright Ion Gaztanaga 2014-2014.
|
|||
//
|
|||
// 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_CONSTRUCT_IN_PLACE_HPP
|
|||
#define BOOST_CONTAINER_DETAIL_CONSTRUCT_IN_PLACE_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>
|
|||
#include <boost/container/detail/iterators.hpp>
|
|||
#include <boost/container/detail/value_init.hpp>
|
|||
|
|||
namespace boost { |
|||
namespace container { |
|||
|
|||
//In place construction
|
|||
|
|||
struct iterator_arg_t{}; |
|||
|
|||
template<class Allocator, class T, class InpIt> |
|||
BOOST_CONTAINER_FORCEINLINE void construct_in_place(Allocator &a, T* dest, InpIt source) |
|||
{ boost::container::allocator_traits<Allocator>::construct(a, dest, *source); } |
|||
|
|||
template<class Allocator, class T, class U> |
|||
BOOST_CONTAINER_FORCEINLINE void construct_in_place(Allocator &a, T *dest, value_init_construct_iterator<U>) |
|||
{ |
|||
boost::container::allocator_traits<Allocator>::construct(a, dest); |
|||
} |
|||
|
|||
template <class T> |
|||
class default_init_construct_iterator; |
|||
|
|||
template<class Allocator, class T, class U> |
|||
BOOST_CONTAINER_FORCEINLINE void construct_in_place(Allocator &a, T *dest, default_init_construct_iterator<U>) |
|||
{ |
|||
boost::container::allocator_traits<Allocator>::construct(a, dest, default_init); |
|||
} |
|||
|
|||
template <class T, class EmplaceFunctor> |
|||
class emplace_iterator; |
|||
|
|||
template<class Allocator, class T, class U, class EF> |
|||
BOOST_CONTAINER_FORCEINLINE void construct_in_place(Allocator &a, T *dest, emplace_iterator<U, EF> ei) |
|||
{ |
|||
ei.construct_in_place(a, dest); |
|||
} |
|||
|
|||
//Assignment
|
|||
|
|||
template<class DstIt, class InpIt> |
|||
BOOST_CONTAINER_FORCEINLINE void assign_in_place(DstIt dest, InpIt source) |
|||
{ *dest = *source; } |
|||
|
|||
template<class DstIt, class U> |
|||
BOOST_CONTAINER_FORCEINLINE void assign_in_place(DstIt dest, value_init_construct_iterator<U>) |
|||
{ |
|||
dtl::value_init<U> val; |
|||
*dest = boost::move(val.get()); |
|||
} |
|||
|
|||
template <class DstIt> |
|||
class default_init_construct_iterator; |
|||
|
|||
template<class DstIt, class U, class D> |
|||
BOOST_CONTAINER_FORCEINLINE void assign_in_place(DstIt dest, default_init_construct_iterator<U>) |
|||
{ |
|||
U u; |
|||
*dest = boost::move(u); |
|||
} |
|||
|
|||
template <class T, class EmplaceFunctor> |
|||
class emplace_iterator; |
|||
|
|||
template<class DstIt, class U, class EF> |
|||
BOOST_CONTAINER_FORCEINLINE void assign_in_place(DstIt dest, emplace_iterator<U, EF> ei) |
|||
{ |
|||
ei.assign_in_place(dest); |
|||
} |
|||
|
|||
} //namespace container {
|
|||
} //namespace boost {
|
|||
|
|||
#endif //#ifndef BOOST_CONTAINER_DETAIL_CONSTRUCT_IN_PLACE_HPP
|
@ -0,0 +1,53 @@ |
|||
//////////////////////////////////////////////////////////////////////////////
|
|||
//
|
|||
// (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_OR_ALLOCATOR_REBIND_HPP
|
|||
#define BOOST_CONTAINER_DETAIL_CONTAINER_OR_ALLOCATOR_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>
|
|||
#include <boost/container/detail/container_rebind.hpp>
|
|||
#include <boost/container/detail/is_container.hpp>
|
|||
|
|||
namespace boost { |
|||
namespace container { |
|||
namespace dtl { |
|||
|
|||
template<class AllocatorOrContainer, class ToType, bool = is_container<AllocatorOrContainer>::value> |
|||
struct container_or_allocator_rebind_impl |
|||
: container_rebind<AllocatorOrContainer, ToType> |
|||
{}; |
|||
|
|||
template<class AllocatorOrContainer, class ToType> |
|||
struct container_or_allocator_rebind_impl<AllocatorOrContainer, ToType, false> |
|||
: allocator_traits<AllocatorOrContainer>::template portable_rebind_alloc<ToType> |
|||
{}; |
|||
|
|||
template<class ToType> |
|||
struct container_or_allocator_rebind_impl<void, ToType, false> |
|||
: real_allocator<ToType, void> |
|||
{}; |
|||
|
|||
template<class AllocatorOrContainer, class ToType> |
|||
struct container_or_allocator_rebind |
|||
: container_or_allocator_rebind_impl<AllocatorOrContainer, ToType> |
|||
{}; |
|||
|
|||
} //namespace dtl {
|
|||
} //namespace container {
|
|||
} //namespace boost {
|
|||
|
|||
#endif //#ifndef BOOST_CONTAINER_DETAIL_CONTAINER_OR_ALLOCATOR_REBIND_HPP
|
@ -0,0 +1,163 @@ |
|||
//////////////////////////////////////////////////////////////////////////////
|
|||
//
|
|||
// (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>
|
|||
#include <boost/container/container_fwd.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<typename real_allocator<V, A>::type>::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<typename real_allocator<V, A>::type>::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; |
|||
}; |
|||
|
|||
#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<typename real_allocator<V, A>::type>::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<typename real_allocator<V, A>::type>::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<typename real_allocator<V, A>::type>::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<typename real_allocator<V, A>::type>::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<typename real_allocator<V, A>::type>::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<typename real_allocator<V, A>::type>::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<typename real_allocator<V, A>::type>::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<typename real_allocator<V, A>::type>::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<typename real_allocator<V, A>::type>::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<typename real_allocator<V, A>::type>::template portable_rebind_alloc<U>::type, P0, P1, P2, P3, P4, P5, P6, P7, P8> type; |
|||
}; |
|||
|
|||
#endif //!defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
|
|||
|
|||
//for small_vector,static_vector
|
|||
|
|||
template <typename V, std::size_t N, typename A, typename O, class U> |
|||
struct container_rebind<small_vector<V, N, A, O>, U> |
|||
{ |
|||
typedef small_vector<U, N, typename allocator_traits<typename real_allocator<V, A>::type>::template portable_rebind_alloc<U>::type, O> type; |
|||
}; |
|||
|
|||
template <typename V, std::size_t N, typename O, class U> |
|||
struct container_rebind<static_vector<V, N, O>, U> |
|||
{ |
|||
typedef static_vector<U, N, O> type; |
|||
}; |
|||
|
|||
} //namespace dtl {
|
|||
} //namespace container {
|
|||
} //namespace boost {
|
|||
|
|||
#endif //#ifndef BOOST_CONTAINER_DETAIL_CONTAINER_REBIND_HPP
|
1982
src/boost/container/detail/copy_move_algo.hpp
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,502 @@ |
|||
//////////////////////////////////////////////////////////////////////////////
|
|||
//
|
|||
// (C) Copyright Ion Gaztanaga 2005-2013.
|
|||
//
|
|||
// 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_DESTROYERS_HPP
|
|||
#define BOOST_CONTAINER_DESTROYERS_HPP
|
|||
|
|||
#ifndef BOOST_CONFIG_HPP
|
|||
# include <boost/config.hpp>
|
|||
#endif
|
|||
|
|||
#if defined(BOOST_HAS_PRAGMA_ONCE)
|
|||
# pragma once
|
|||
#endif
|
|||
|
|||
#include <boost/container/detail/config_begin.hpp>
|
|||
#include <boost/container/detail/workaround.hpp>
|
|||
|
|||
#include <boost/container/allocator_traits.hpp>
|
|||
#include <boost/move/detail/to_raw_pointer.hpp>
|
|||
#include <boost/container/detail/version_type.hpp>
|
|||
#include <boost/move/detail/iterator_to_raw_pointer.hpp>
|
|||
|
|||
namespace boost { |
|||
namespace container { |
|||
namespace dtl { |
|||
|
|||
//!A deleter for scoped_ptr that deallocates the memory
|
|||
//!allocated for an object using a STL allocator.
|
|||
template <class Allocator> |
|||
struct scoped_deallocator |
|||
{ |
|||
typedef allocator_traits<Allocator> allocator_traits_type; |
|||
typedef typename allocator_traits_type::pointer pointer; |
|||
typedef dtl::integral_constant<unsigned, |
|||
boost::container::dtl:: |
|||
version<Allocator>::value> alloc_version; |
|||
|
|||
private: |
|||
void priv_deallocate(version_1) |
|||
{ m_alloc.deallocate(m_ptr, 1); } |
|||
|
|||
void priv_deallocate(version_2) |
|||
{ m_alloc.deallocate_one(m_ptr); } |
|||
|
|||
BOOST_MOVABLE_BUT_NOT_COPYABLE(scoped_deallocator) |
|||
|
|||
public: |
|||
|
|||
pointer m_ptr; |
|||
Allocator& m_alloc; |
|||
|
|||
scoped_deallocator(pointer p, Allocator& a) |
|||
: m_ptr(p), m_alloc(a) |
|||
{} |
|||
|
|||
~scoped_deallocator() |
|||
{ if (m_ptr)priv_deallocate(alloc_version()); } |
|||
|
|||
scoped_deallocator(BOOST_RV_REF(scoped_deallocator) o) |
|||
: m_ptr(o.m_ptr), m_alloc(o.m_alloc) |
|||
{ o.release(); } |
|||
|
|||
pointer get() const |
|||
{ return m_ptr; } |
|||
|
|||
void set(const pointer &p) |
|||
{ m_ptr = p; } |
|||
|
|||
void release() |
|||
{ m_ptr = 0; } |
|||
}; |
|||
|
|||
template <class Allocator> |
|||
struct null_scoped_deallocator |
|||
{ |
|||
typedef boost::container::allocator_traits<Allocator> AllocTraits; |
|||
typedef typename AllocTraits::pointer pointer; |
|||
|
|||
null_scoped_deallocator(pointer, Allocator&, std::size_t) |
|||
{} |
|||
|
|||
void release() |
|||
{} |
|||
|
|||
pointer get() const |
|||
{ return pointer(); } |
|||
|
|||
void set(const pointer &) |
|||
{} |
|||
}; |
|||
|
|||
//!A deleter for scoped_ptr that deallocates the memory
|
|||
//!allocated for an array of objects using a STL allocator.
|
|||
template <class Allocator> |
|||
struct scoped_array_deallocator |
|||
{ |
|||
typedef boost::container::allocator_traits<Allocator> AllocTraits; |
|||
typedef typename AllocTraits::pointer pointer; |
|||
typedef typename AllocTraits::size_type size_type; |
|||
|
|||
scoped_array_deallocator(pointer p, Allocator& a, std::size_t length) |
|||
: m_ptr(p), m_alloc(a), m_length(length) {} |
|||
|
|||
~scoped_array_deallocator() |
|||
{ if (m_ptr) m_alloc.deallocate(m_ptr, size_type(m_length)); } |
|||
|
|||
void release() |
|||
{ m_ptr = 0; } |
|||
|
|||
private: |
|||
pointer m_ptr; |
|||
Allocator& m_alloc; |
|||
std::size_t m_length; |
|||
}; |
|||
|
|||
template <class Allocator> |
|||
struct null_scoped_array_deallocator |
|||
{ |
|||
typedef boost::container::allocator_traits<Allocator> AllocTraits; |
|||
typedef typename AllocTraits::pointer pointer; |
|||
|
|||
null_scoped_array_deallocator(pointer, Allocator&, std::size_t) |
|||
{} |
|||
|
|||
void release() |
|||
{} |
|||
}; |
|||
|
|||
template <class Allocator> |
|||
struct scoped_node_destroy_deallocator |
|||
{ |
|||
typedef boost::container::allocator_traits<Allocator> AllocTraits; |
|||
typedef typename AllocTraits::pointer pointer; |
|||
typedef dtl::integral_constant<unsigned, |
|||
boost::container::dtl:: |
|||
version<Allocator>::value> alloc_version; |
|||
|
|||
scoped_node_destroy_deallocator(pointer p, Allocator& a) |
|||
: m_ptr(p), m_alloc(a) {} |
|||
|
|||
~scoped_node_destroy_deallocator() |
|||
{ |
|||
if(m_ptr){ |
|||
boost::movelib::to_raw_pointer(m_ptr)->destructor(m_alloc); |
|||
priv_deallocate(m_ptr, alloc_version()); |
|||
} |
|||
} |
|||
|
|||
void release() |
|||
{ m_ptr = 0; } |
|||
|
|||
private: |
|||
|
|||
void priv_deallocate(const pointer &p, version_1) |
|||
{ AllocTraits::deallocate(m_alloc, p, 1); } |
|||
|
|||
void priv_deallocate(const pointer &p, version_2) |
|||
{ m_alloc.deallocate_one(p); } |
|||
|
|||
pointer m_ptr; |
|||
Allocator& m_alloc; |
|||
}; |
|||
|
|||
|
|||
//!A deleter for scoped_ptr that destroys
|
|||
//!an object using a STL allocator.
|
|||
template <class Allocator, class Ptr = typename allocator_traits<Allocator>::pointer> |
|||
struct scoped_destructor_n |
|||
{ |
|||
typedef boost::container::allocator_traits<Allocator> AllocTraits; |
|||
typedef Ptr pointer; |
|||
typedef typename AllocTraits::value_type value_type; |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE scoped_destructor_n(Ptr p, Allocator& a, std::size_t n) |
|||
: m_p(p), m_n(n), m_a(a) |
|||
{} |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE void release() |
|||
{ m_p = Ptr(); m_n = 0; } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE void increment_size(std::size_t inc) |
|||
{ m_n += inc; } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE void increment_size_backwards(std::size_t inc) |
|||
{ m_n += inc; m_p -= std::ptrdiff_t(inc); } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE void shrink_forward(std::size_t inc) |
|||
{ m_n -= inc; m_p += std::ptrdiff_t(inc); } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE void set_size(std::size_t sz) |
|||
{ m_n = sz; } |
|||
|
|||
~scoped_destructor_n() |
|||
{ |
|||
if(m_n){ |
|||
value_type *raw_ptr = boost::movelib::iterator_to_raw_pointer(m_p); |
|||
do { |
|||
--m_n; |
|||
AllocTraits::destroy(m_a, raw_ptr); |
|||
++raw_ptr; |
|||
} while(m_n); |
|||
} |
|||
} |
|||
|
|||
private: |
|||
pointer m_p; |
|||
std::size_t m_n; |
|||
Allocator& m_a; |
|||
}; |
|||
|
|||
//!A deleter for scoped_ptr that destroys
|
|||
//!an object using a STL allocator.
|
|||
template <class Allocator, class Ptr = typename allocator_traits<Allocator>::pointer> |
|||
struct null_scoped_destructor_n |
|||
{ |
|||
typedef boost::container::allocator_traits<Allocator> AllocTraits; |
|||
typedef Ptr pointer; |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE null_scoped_destructor_n(Ptr, Allocator&, std::size_t) |
|||
{} |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE void increment_size(std::size_t) |
|||
{} |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE void increment_size_backwards(std::size_t) |
|||
{} |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE void set_size(std::size_t ) |
|||
{} |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE void shrink_forward(std::size_t) |
|||
{} |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE void release() |
|||
{} |
|||
}; |
|||
|
|||
|
|||
//!A deleter for scoped_ptr that destroys
|
|||
//!an object using a STL allocator.
|
|||
template <class Allocator> |
|||
struct scoped_destructor_range |
|||
{ |
|||
typedef boost::container::allocator_traits<Allocator> AllocTraits; |
|||
typedef typename AllocTraits::pointer pointer; |
|||
typedef typename AllocTraits::value_type value_type; |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE scoped_destructor_range(pointer p, pointer e, Allocator& a) |
|||
: m_p(p), m_e(e), m_a(a) |
|||
{} |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE void release() |
|||
{ m_p = pointer(); m_e = pointer(); } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE void set_end(pointer e) |
|||
{ m_e = e; } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE void set_begin(pointer b) |
|||
{ m_p = b; } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE void set_range(pointer b, pointer e) |
|||
{ m_p = b; m_e = e; } |
|||
|
|||
~scoped_destructor_range() |
|||
{ |
|||
while(m_p != m_e){ |
|||
value_type *raw_ptr = boost::movelib::to_raw_pointer(m_p); |
|||
AllocTraits::destroy(m_a, raw_ptr); |
|||
++m_p; |
|||
} |
|||
} |
|||
|
|||
private: |
|||
pointer m_p; |
|||
pointer m_e; |
|||
Allocator & m_a; |
|||
}; |
|||
|
|||
//!A deleter for scoped_ptr that destroys
|
|||
//!an object using a STL allocator.
|
|||
template <class Allocator> |
|||
struct null_scoped_destructor_range |
|||
{ |
|||
typedef boost::container::allocator_traits<Allocator> AllocTraits; |
|||
typedef typename AllocTraits::pointer pointer; |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE null_scoped_destructor_range(pointer, pointer, Allocator&) |
|||
{} |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE void release() |
|||
{} |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE void set_end(pointer) |
|||
{} |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE void set_begin(pointer) |
|||
{} |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE void set_range(pointer, pointer) |
|||
{} |
|||
}; |
|||
|
|||
|
|||
template<class Allocator> |
|||
class scoped_destructor |
|||
{ |
|||
typedef boost::container::allocator_traits<Allocator> AllocTraits; |
|||
public: |
|||
typedef typename Allocator::value_type value_type; |
|||
BOOST_CONTAINER_FORCEINLINE scoped_destructor(Allocator &a, value_type *pv) |
|||
: pv_(pv), a_(a) |
|||
{} |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE ~scoped_destructor() |
|||
{ |
|||
if(pv_){ |
|||
AllocTraits::destroy(a_, pv_); |
|||
} |
|||
} |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE void release() |
|||
{ pv_ = 0; } |
|||
|
|||
|
|||
BOOST_CONTAINER_FORCEINLINE void set(value_type *ptr) { pv_ = ptr; } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE value_type *get() const { return pv_; } |
|||
|
|||
private: |
|||
value_type *pv_; |
|||
Allocator &a_; |
|||
}; |
|||
|
|||
template<class Allocator> |
|||
class null_scoped_destructor |
|||
{ |
|||
typedef boost::container::allocator_traits<Allocator> AllocTraits; |
|||
public: |
|||
typedef typename Allocator::value_type value_type; |
|||
BOOST_CONTAINER_FORCEINLINE null_scoped_destructor(Allocator &, value_type *) |
|||
{} |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE ~null_scoped_destructor() |
|||
{} |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE void release() |
|||
{} |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE void set(value_type *) { } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE value_type *get() const { return 0; } |
|||
}; |
|||
|
|||
|
|||
|
|||
template<class Allocator, class Value = typename Allocator::value_type> |
|||
class value_destructor |
|||
{ |
|||
typedef boost::container::allocator_traits<Allocator> AllocTraits; |
|||
public: |
|||
typedef Value value_type; |
|||
BOOST_CONTAINER_FORCEINLINE value_destructor(Allocator &a, value_type &rv) |
|||
: rv_(rv), a_(a) |
|||
{} |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE ~value_destructor() |
|||
{ |
|||
AllocTraits::destroy(a_, &rv_); |
|||
} |
|||
|
|||
private: |
|||
value_type &rv_; |
|||
Allocator &a_; |
|||
}; |
|||
|
|||
template <class Allocator> |
|||
class allocator_node_destroyer |
|||
{ |
|||
typedef boost::container::allocator_traits<Allocator> AllocTraits; |
|||
typedef typename AllocTraits::value_type value_type; |
|||
typedef typename AllocTraits::pointer pointer; |
|||
typedef dtl::integral_constant<unsigned, |
|||
boost::container::dtl:: |
|||
version<Allocator>::value> alloc_version; |
|||
|
|||
private: |
|||
Allocator & a_; |
|||
|
|||
private: |
|||
BOOST_CONTAINER_FORCEINLINE void priv_deallocate(const pointer &p, version_1) |
|||
{ AllocTraits::deallocate(a_,p, 1); } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE void priv_deallocate(const pointer &p, version_2) |
|||
{ a_.deallocate_one(p); } |
|||
|
|||
public: |
|||
BOOST_CONTAINER_FORCEINLINE explicit allocator_node_destroyer(Allocator &a) |
|||
: a_(a) |
|||
{} |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE void operator()(const pointer &p) |
|||
{ |
|||
boost::movelib::to_raw_pointer(p)->destructor(a_); |
|||
this->priv_deallocate(p, alloc_version()); |
|||
} |
|||
}; |
|||
|
|||
template<class Allocator> |
|||
class scoped_node_destructor |
|||
{ |
|||
typedef boost::container::allocator_traits<Allocator> AllocTraits; |
|||
public: |
|||
typedef typename Allocator::value_type value_type; |
|||
BOOST_CONTAINER_FORCEINLINE scoped_node_destructor(Allocator &a, value_type *pv) |
|||
: pv_(pv), a_(a) |
|||
{} |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE ~scoped_node_destructor() |
|||
{ |
|||
if(pv_){ |
|||
pv_->destructor(a_); |
|||
} |
|||
} |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE void release() |
|||
{ pv_ = 0; } |
|||
|
|||
|
|||
BOOST_CONTAINER_FORCEINLINE void set(value_type *ptr) { pv_ = ptr; } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE value_type *get() const { return pv_; } |
|||
|
|||
private: |
|||
value_type *pv_; |
|||
Allocator &a_; |
|||
}; |
|||
|
|||
|
|||
|
|||
template <class Allocator> |
|||
class allocator_node_destroyer_and_chain_builder |
|||
{ |
|||
typedef allocator_traits<Allocator> allocator_traits_type; |
|||
typedef typename allocator_traits_type::value_type value_type; |
|||
typedef typename Allocator::multiallocation_chain multiallocation_chain; |
|||
|
|||
Allocator & a_; |
|||
multiallocation_chain &c_; |
|||
|
|||
public: |
|||
BOOST_CONTAINER_FORCEINLINE allocator_node_destroyer_and_chain_builder(Allocator &a, multiallocation_chain &c) |
|||
: a_(a), c_(c) |
|||
{} |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE void operator()(const typename Allocator::pointer &p) |
|||
{ |
|||
boost::movelib::to_raw_pointer(p)->destructor(a_); |
|||
c_.push_back(p); |
|||
} |
|||
}; |
|||
|
|||
template <class Allocator> |
|||
class allocator_multialloc_chain_node_deallocator |
|||
{ |
|||
typedef allocator_traits<Allocator> allocator_traits_type; |
|||
typedef typename allocator_traits_type::value_type value_type; |
|||
typedef typename Allocator::multiallocation_chain multiallocation_chain; |
|||
typedef allocator_node_destroyer_and_chain_builder<Allocator> chain_builder; |
|||
|
|||
Allocator & a_; |
|||
multiallocation_chain c_; |
|||
|
|||
public: |
|||
BOOST_CONTAINER_FORCEINLINE allocator_multialloc_chain_node_deallocator(Allocator &a) |
|||
: a_(a), c_() |
|||
{} |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE chain_builder get_chain_builder() |
|||
{ return chain_builder(a_, c_); } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE ~allocator_multialloc_chain_node_deallocator() |
|||
{ |
|||
a_.deallocate_individual(c_); |
|||
} |
|||
}; |
|||
|
|||
} //namespace dtl {
|
|||
} //namespace container {
|
|||
} //namespace boost {
|
|||
|
|||
#include <boost/container/detail/config_end.hpp>
|
|||
|
|||
#endif //#ifndef BOOST_CONTAINER_DESTROYERS_HPP
|
1711
src/boost/container/detail/flat_tree.hpp
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,72 @@ |
|||
//////////////////////////////////////////////////////////////////////////////
|
|||
//
|
|||
// (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_IS_CONTAINER_HPP
|
|||
#define BOOST_CONTAINER_DETAIL_IS_CONTAINER_HPP
|
|||
|
|||
#ifndef BOOST_CONFIG_HPP
|
|||
# include <boost/config.hpp>
|
|||
#endif
|
|||
|
|||
#if defined(BOOST_HAS_PRAGMA_ONCE)
|
|||
# pragma once
|
|||
#endif
|
|||
|
|||
#if defined(BOOST_GCC) && (BOOST_GCC >= 40600)
|
|||
#pragma GCC diagnostic push
|
|||
#pragma GCC diagnostic ignored "-Wunused-result"
|
|||
#endif
|
|||
|
|||
//empty
|
|||
#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_FUNCNAME empty
|
|||
#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_NS_BEG namespace boost { namespace container { namespace is_container_detail {
|
|||
#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_NS_END }}}
|
|||
#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_MIN 0
|
|||
#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_MAX 0
|
|||
#include <boost/intrusive/detail/has_member_function_callable_with.hpp>
|
|||
|
|||
//size
|
|||
#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_FUNCNAME size
|
|||
#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_NS_BEG namespace boost { namespace container { namespace is_container_detail {
|
|||
#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_NS_END }}}
|
|||
#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_MIN 0
|
|||
#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_MAX 0
|
|||
#include <boost/intrusive/detail/has_member_function_callable_with.hpp>
|
|||
|
|||
//#pragma GCC diagnostic ignored "-Wunused-result"
|
|||
#if defined(BOOST_GCC) && (BOOST_GCC >= 40600)
|
|||
#pragma GCC diagnostic pop
|
|||
#endif
|
|||
|
|||
namespace boost { |
|||
namespace container { |
|||
namespace dtl { |
|||
|
|||
template <class Container> |
|||
struct is_container |
|||
{ |
|||
static const bool value = |
|||
boost::container::is_container_detail:: |
|||
has_member_function_callable_with_size <const Container>::value && |
|||
boost::container::is_container_detail:: |
|||
has_member_function_callable_with_empty<const Container>::value; |
|||
}; |
|||
|
|||
template <> |
|||
struct is_container<void> |
|||
{ |
|||
static const bool value = false; |
|||
}; |
|||
|
|||
|
|||
} //namespace dtl {
|
|||
} //namespace container {
|
|||
} //namespace boost {
|
|||
|
|||
#endif //#ifndef BOOST_CONTAINER_DETAIL_IS_CONTAINER_HPP
|
@ -0,0 +1,82 @@ |
|||
//////////////////////////////////////////////////////////////////////////////
|
|||
//
|
|||
// (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_IS_CONTIGUOUS_CONTAINER_HPP
|
|||
#define BOOST_CONTAINER_DETAIL_IS_CONTIGUOUS_CONTAINER_HPP
|
|||
|
|||
#ifndef BOOST_CONFIG_HPP
|
|||
# include <boost/config.hpp>
|
|||
#endif
|
|||
|
|||
#if defined(BOOST_HAS_PRAGMA_ONCE)
|
|||
# pragma once
|
|||
#endif
|
|||
|
|||
#if defined(BOOST_GCC) && (BOOST_GCC >= 40600)
|
|||
#pragma GCC diagnostic push
|
|||
#pragma GCC diagnostic ignored "-Wunused-result"
|
|||
#endif
|
|||
|
|||
//data
|
|||
#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_FUNCNAME data
|
|||
#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_NS_BEG namespace boost { namespace container { namespace is_contiguous_container_detail {
|
|||
#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_NS_END }}}
|
|||
#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_MIN 0
|
|||
#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_MAX 0
|
|||
#include <boost/intrusive/detail/has_member_function_callable_with.hpp>
|
|||
|
|||
//back_free_capacity
|
|||
#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_FUNCNAME back_free_capacity
|
|||
#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_NS_BEG namespace boost { namespace container { namespace back_free_capacity_detail {
|
|||
#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_NS_END }}}
|
|||
#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_MIN 0
|
|||
#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_MAX 0
|
|||
#include <boost/intrusive/detail/has_member_function_callable_with.hpp>
|
|||
|
|||
//#pragma GCC diagnostic ignored "-Wunused-result"
|
|||
#if defined(BOOST_GCC) && (BOOST_GCC >= 40600)
|
|||
#pragma GCC diagnostic pop
|
|||
#endif
|
|||
|
|||
namespace boost { |
|||
namespace container { |
|||
namespace dtl { |
|||
|
|||
template <class Container> |
|||
struct is_contiguous_container |
|||
{ |
|||
static const bool value = |
|||
boost::container::is_contiguous_container_detail:: |
|||
has_member_function_callable_with_data<Container>::value && |
|||
boost::container::is_contiguous_container_detail:: |
|||
has_member_function_callable_with_data<const Container>::value; |
|||
}; |
|||
|
|||
|
|||
template < class Container |
|||
, bool = boost::container::back_free_capacity_detail:: |
|||
has_member_function_callable_with_back_free_capacity<const Container>::value> |
|||
struct back_free_capacity |
|||
{ |
|||
static typename Container::size_type get(const Container &c) |
|||
{ return c.back_free_capacity(); } |
|||
}; |
|||
|
|||
template < class Container> |
|||
struct back_free_capacity<Container, false> |
|||
{ |
|||
static typename Container::size_type get(const Container &c) |
|||
{ return c.capacity() - c.size(); } |
|||
}; |
|||
|
|||
} //namespace dtl {
|
|||
} //namespace container {
|
|||
} //namespace boost {
|
|||
|
|||
#endif //#ifndef BOOST_CONTAINER_DETAIL_IS_CONTIGUOUS_CONTAINER_HPP
|
@ -0,0 +1,91 @@ |
|||
//////////////////////////////////////////////////////////////////////////////
|
|||
//
|
|||
// (C) Copyright Ion Gaztanaga 2005-2013.
|
|||
//
|
|||
// 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_CONTAINER_DETAIL_IS_PAIR_HPP
|
|||
#define BOOST_CONTAINER_CONTAINER_DETAIL_IS_PAIR_HPP
|
|||
|
|||
#ifndef BOOST_CONFIG_HPP
|
|||
# include <boost/config.hpp>
|
|||
#endif
|
|||
|
|||
#if defined(BOOST_HAS_PRAGMA_ONCE)
|
|||
# pragma once
|
|||
#endif
|
|||
|
|||
#include <boost/container/detail/config_begin.hpp>
|
|||
#include <boost/container/detail/workaround.hpp>
|
|||
#include <boost/container/detail/std_fwd.hpp>
|
|||
|
|||
#if defined(BOOST_MSVC) && (_CPPLIB_VER == 520)
|
|||
//MSVC 2010 tuple marker
|
|||
namespace std { namespace tr1 { struct _Nil; }} |
|||
#elif defined(BOOST_MSVC) && (_CPPLIB_VER == 540)
|
|||
//MSVC 2012 tuple marker
|
|||
namespace std { struct _Nil; } |
|||
#endif
|
|||
|
|||
namespace boost { |
|||
namespace tuples { |
|||
|
|||
struct null_type; |
|||
|
|||
template < |
|||
class T0, class T1, class T2, |
|||
class T3, class T4, class T5, |
|||
class T6, class T7, class T8, |
|||
class T9> |
|||
class tuple; |
|||
|
|||
} //namespace tuples {
|
|||
} //namespace boost {
|
|||
|
|||
namespace boost { |
|||
namespace container { |
|||
|
|||
struct try_emplace_t{}; |
|||
|
|||
namespace dtl { |
|||
|
|||
template <class T1, class T2> |
|||
struct pair; |
|||
|
|||
template <class T> |
|||
struct is_pair |
|||
{ |
|||
static const bool value = false; |
|||
}; |
|||
|
|||
template <class T1, class T2> |
|||
struct is_pair< pair<T1, T2> > |
|||
{ |
|||
static const bool value = true; |
|||
}; |
|||
|
|||
template <class T1, class T2> |
|||
struct is_pair< std::pair<T1, T2> > |
|||
{ |
|||
static const bool value = true; |
|||
}; |
|||
|
|||
template <class T> |
|||
struct is_not_pair |
|||
{ |
|||
static const bool value = !is_pair<T>::value; |
|||
}; |
|||
|
|||
} //namespace dtl {
|
|||
} //namespace container {
|
|||
} //namespace boost {
|
|||
|
|||
#include <boost/container/detail/config_end.hpp>
|
|||
|
|||
#endif //#ifndef BOOST_CONTAINER_CONTAINER_DETAIL_IS_PAIR_HPP
|
@ -0,0 +1,57 @@ |
|||
//////////////////////////////////////////////////////////////////////////////
|
|||
//
|
|||
// (C) Copyright Ion Gaztanaga 2016-2016. 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_IS_SORTED_HPP
|
|||
#define BOOST_CONTAINER_DETAIL_IS_SORTED_HPP
|
|||
|
|||
#ifndef BOOST_CONFIG_HPP
|
|||
# include <boost/config.hpp>
|
|||
#endif
|
|||
|
|||
#if defined(BOOST_HAS_PRAGMA_ONCE)
|
|||
# pragma once
|
|||
#endif
|
|||
|
|||
namespace boost { |
|||
namespace container { |
|||
namespace dtl { |
|||
|
|||
template <class ForwardIterator, class Pred> |
|||
bool is_sorted (ForwardIterator first, ForwardIterator last, Pred pred) |
|||
{ |
|||
if(first != last){ |
|||
ForwardIterator next = first; |
|||
while (++next != last){ |
|||
if(pred(*next, *first)) |
|||
return false; |
|||
++first; |
|||
} |
|||
} |
|||
return true; |
|||
} |
|||
|
|||
template <class ForwardIterator, class Pred> |
|||
bool is_sorted_and_unique (ForwardIterator first, ForwardIterator last, Pred pred) |
|||
{ |
|||
if(first != last){ |
|||
ForwardIterator next = first; |
|||
while (++next != last){ |
|||
if(!pred(*first, *next)) |
|||
return false; |
|||
++first; |
|||
} |
|||
} |
|||
return true; |
|||
} |
|||
|
|||
} //namespace dtl {
|
|||
} //namespace container {
|
|||
} //namespace boost {
|
|||
|
|||
#endif //#ifndef BOOST_CONTAINER_DETAIL_IS_SORTED_HPP
|
@ -0,0 +1,94 @@ |
|||
//////////////////////////////////////////////////////////////////////////////
|
|||
//
|
|||
// (C) Copyright Ion Gaztanaga 2014-2014.
|
|||
//
|
|||
// 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_ITERATOR_HPP
|
|||
#define BOOST_CONTAINER_DETAIL_ITERATOR_HPP
|
|||
|
|||
#ifndef BOOST_CONFIG_HPP
|
|||
# include <boost/config.hpp>
|
|||
#endif
|
|||
|
|||
#if defined(BOOST_HAS_PRAGMA_ONCE)
|
|||
# pragma once
|
|||
#endif
|
|||
|
|||
#include <boost/intrusive/detail/iterator.hpp>
|
|||
#include <boost/move/utility_core.hpp>
|
|||
#include <boost/container/detail/mpl.hpp>
|
|||
|
|||
namespace boost { |
|||
namespace container { |
|||
|
|||
using ::boost::intrusive::iterator_traits; |
|||
using ::boost::intrusive::iter_difference; |
|||
using ::boost::intrusive::iter_category; |
|||
using ::boost::intrusive::iter_value; |
|||
using ::boost::intrusive::iter_size; |
|||
using ::boost::intrusive::iterator_distance; |
|||
using ::boost::intrusive::iterator_udistance; |
|||
using ::boost::intrusive::iterator_advance; |
|||
using ::boost::intrusive::iterator_uadvance; |
|||
using ::boost::intrusive::make_iterator_advance; |
|||
using ::boost::intrusive::make_iterator_uadvance; |
|||
using ::boost::intrusive::iterator; |
|||
using ::boost::intrusive::iterator_enable_if_tag; |
|||
using ::boost::intrusive::iterator_disable_if_tag; |
|||
using ::boost::intrusive::iterator_arrow_result; |
|||
|
|||
template <class Container> |
|||
class back_emplacer |
|||
{ |
|||
private: |
|||
Container& container; |
|||
|
|||
public: |
|||
typedef std::output_iterator_tag iterator_category; |
|||
typedef void value_type; |
|||
typedef void difference_type; |
|||
typedef void pointer; |
|||
typedef void reference; |
|||
|
|||
back_emplacer(Container& x) |
|||
: container(x) |
|||
{} |
|||
|
|||
template<class U> |
|||
back_emplacer& operator=(BOOST_FWD_REF(U) value) |
|||
{ |
|||
container.emplace_back(boost::forward<U>(value)); |
|||
return *this; |
|||
} |
|||
back_emplacer& operator*() { return *this; } |
|||
back_emplacer& operator++() { return *this; } |
|||
back_emplacer& operator++(int){ return *this; } |
|||
}; |
|||
|
|||
#ifndef BOOST_CONTAINER_NO_CXX17_CTAD
|
|||
|
|||
template<class InputIterator> |
|||
using it_based_non_const_first_type_t = typename dtl::remove_const<typename iterator_traits<InputIterator>::value_type::first_type>::type; |
|||
|
|||
template<class InputIterator> |
|||
using it_based_const_first_type_t = const typename dtl::remove_const<typename iterator_traits<InputIterator>::value_type::first_type>::type; |
|||
|
|||
template<class InputIterator> |
|||
using it_based_second_type_t = typename iterator_traits<InputIterator>::value_type::second_type; |
|||
|
|||
template<class InputIterator> |
|||
using it_based_value_type_t = typename iterator_traits<InputIterator>::value_type; |
|||
|
|||
#endif
|
|||
|
|||
} //namespace container {
|
|||
} //namespace boost {
|
|||
|
|||
#endif //#ifndef BOOST_CONTAINER_DETAIL_ITERATORS_HPP
|
@ -0,0 +1,910 @@ |
|||
//////////////////////////////////////////////////////////////////////////////
|
|||
//
|
|||
// (C) Copyright Ion Gaztanaga 2005-2013.
|
|||
// (C) Copyright Gennaro Prota 2003 - 2004.
|
|||
//
|
|||
// 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_ITERATORS_HPP
|
|||
#define BOOST_CONTAINER_DETAIL_ITERATORS_HPP
|
|||
|
|||
#ifndef BOOST_CONFIG_HPP
|
|||
# include <boost/config.hpp>
|
|||
#endif
|
|||
|
|||
#if defined(BOOST_HAS_PRAGMA_ONCE)
|
|||
# pragma once
|
|||
#endif
|
|||
|
|||
#include <boost/container/detail/config_begin.hpp>
|
|||
#include <boost/container/detail/workaround.hpp>
|
|||
#include <boost/container/allocator_traits.hpp>
|
|||
#include <boost/container/detail/type_traits.hpp>
|
|||
#include <boost/container/detail/value_init.hpp>
|
|||
#include <boost/static_assert.hpp>
|
|||
#include <boost/move/utility_core.hpp>
|
|||
#include <boost/intrusive/detail/reverse_iterator.hpp>
|
|||
|
|||
#if defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
|
|||
#include <boost/move/detail/fwd_macros.hpp>
|
|||
#else
|
|||
#include <boost/container/detail/variadic_templates_tools.hpp>
|
|||
#endif
|
|||
#include <boost/container/detail/iterator.hpp>
|
|||
|
|||
namespace boost { |
|||
namespace container { |
|||
|
|||
template <class T> |
|||
class constant_iterator |
|||
: public ::boost::container::iterator |
|||
<std::random_access_iterator_tag, T, std::ptrdiff_t, const T*, const T &> |
|||
{ |
|||
typedef constant_iterator<T> this_type; |
|||
|
|||
public: |
|||
BOOST_CONTAINER_FORCEINLINE explicit constant_iterator(const T &ref, std::size_t range_size) |
|||
: m_ptr(&ref), m_num(range_size){} |
|||
|
|||
//Constructors
|
|||
BOOST_CONTAINER_FORCEINLINE constant_iterator() |
|||
: m_ptr(0), m_num(0){} |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE constant_iterator& operator++() |
|||
{ increment(); return *this; } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE constant_iterator operator++(int) |
|||
{ |
|||
constant_iterator result (*this); |
|||
increment(); |
|||
return result; |
|||
} |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE constant_iterator& operator--() |
|||
{ decrement(); return *this; } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE constant_iterator operator--(int) |
|||
{ |
|||
constant_iterator result (*this); |
|||
decrement(); |
|||
return result; |
|||
} |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE friend bool operator== (const constant_iterator& i, const constant_iterator& i2) |
|||
{ return i.equal(i2); } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE friend bool operator!= (const constant_iterator& i, const constant_iterator& i2) |
|||
{ return !(i == i2); } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE friend bool operator< (const constant_iterator& i, const constant_iterator& i2) |
|||
{ return i.less(i2); } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE friend bool operator> (const constant_iterator& i, const constant_iterator& i2) |
|||
{ return i2 < i; } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE friend bool operator<= (const constant_iterator& i, const constant_iterator& i2) |
|||
{ return !(i > i2); } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE friend bool operator>= (const constant_iterator& i, const constant_iterator& i2) |
|||
{ return !(i < i2); } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE friend std::ptrdiff_t operator- (const constant_iterator& i, const constant_iterator& i2) |
|||
{ return i2.distance_to(i); } |
|||
|
|||
//Arithmetic signed
|
|||
BOOST_CONTAINER_FORCEINLINE constant_iterator& operator+=(std::ptrdiff_t off) |
|||
{ this->advance(off); return *this; } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE constant_iterator operator+(std::ptrdiff_t off) const |
|||
{ |
|||
constant_iterator other(*this); |
|||
other.advance(off); |
|||
return other; |
|||
} |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE friend constant_iterator operator+(std::ptrdiff_t off, const constant_iterator& right) |
|||
{ return right + off; } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE constant_iterator& operator-=(std::ptrdiff_t off) |
|||
{ this->advance(-off); return *this; } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE constant_iterator operator-(std::ptrdiff_t off) const |
|||
{ return *this + (-off); } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE const T& operator[] (std::ptrdiff_t ) const |
|||
{ return dereference(); } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE const T& operator*() const |
|||
{ return dereference(); } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE const T* operator->() const |
|||
{ return &(dereference()); } |
|||
|
|||
//Arithmetic unsigned
|
|||
BOOST_CONTAINER_FORCEINLINE constant_iterator& operator+=(std::size_t off) |
|||
{ return *this += std::ptrdiff_t(off); } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE constant_iterator operator+(std::size_t off) const |
|||
{ return *this + std::ptrdiff_t(off); } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE friend constant_iterator operator+(std::size_t off, const constant_iterator& right) |
|||
{ return std::ptrdiff_t(off) + right; } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE constant_iterator& operator-=(std::size_t off) |
|||
{ return *this -= std::ptrdiff_t(off); } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE constant_iterator operator-(std::size_t off) const |
|||
{ return *this - std::ptrdiff_t(off); } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE const T& operator[] (std::size_t off) const |
|||
{ return (*this)[std::ptrdiff_t(off)]; } |
|||
|
|||
private: |
|||
const T * m_ptr; |
|||
std::size_t m_num; |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE void increment() |
|||
{ --m_num; } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE void decrement() |
|||
{ ++m_num; } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE bool equal(const this_type &other) const |
|||
{ return m_num == other.m_num; } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE bool less(const this_type &other) const |
|||
{ return other.m_num < m_num; } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE const T & dereference() const |
|||
{ return *m_ptr; } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE void advance(std::ptrdiff_t n) |
|||
{ m_num = std::size_t(std::ptrdiff_t(m_num) - n); } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE std::ptrdiff_t distance_to(const this_type &other)const |
|||
{ return std::ptrdiff_t(m_num - other.m_num); } |
|||
}; |
|||
|
|||
template <class T> |
|||
class value_init_construct_iterator |
|||
: public ::boost::container::iterator |
|||
<std::random_access_iterator_tag, T, std::ptrdiff_t, const T*, const T &> |
|||
{ |
|||
typedef value_init_construct_iterator<T> this_type; |
|||
|
|||
public: |
|||
BOOST_CONTAINER_FORCEINLINE explicit value_init_construct_iterator(std::size_t range_size) |
|||
: m_num(range_size){} |
|||
|
|||
//Constructors
|
|||
BOOST_CONTAINER_FORCEINLINE value_init_construct_iterator() |
|||
: m_num(0){} |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE value_init_construct_iterator& operator++() |
|||
{ increment(); return *this; } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE value_init_construct_iterator operator++(int) |
|||
{ |
|||
value_init_construct_iterator result (*this); |
|||
increment(); |
|||
return result; |
|||
} |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE value_init_construct_iterator& operator--() |
|||
{ decrement(); return *this; } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE value_init_construct_iterator operator--(int) |
|||
{ |
|||
value_init_construct_iterator result (*this); |
|||
decrement(); |
|||
return result; |
|||
} |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE friend bool operator== (const value_init_construct_iterator& i, const value_init_construct_iterator& i2) |
|||
{ return i.equal(i2); } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE friend bool operator!= (const value_init_construct_iterator& i, const value_init_construct_iterator& i2) |
|||
{ return !(i == i2); } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE friend bool operator< (const value_init_construct_iterator& i, const value_init_construct_iterator& i2) |
|||
{ return i.less(i2); } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE friend bool operator> (const value_init_construct_iterator& i, const value_init_construct_iterator& i2) |
|||
{ return i2 < i; } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE friend bool operator<= (const value_init_construct_iterator& i, const value_init_construct_iterator& i2) |
|||
{ return !(i > i2); } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE friend bool operator>= (const value_init_construct_iterator& i, const value_init_construct_iterator& i2) |
|||
{ return !(i < i2); } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE friend std::ptrdiff_t operator- (const value_init_construct_iterator& i, const value_init_construct_iterator& i2) |
|||
{ return i2.distance_to(i); } |
|||
|
|||
//Arithmetic
|
|||
BOOST_CONTAINER_FORCEINLINE value_init_construct_iterator& operator+=(std::ptrdiff_t off) |
|||
{ this->advance(off); return *this; } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE value_init_construct_iterator operator+(std::ptrdiff_t off) const |
|||
{ |
|||
value_init_construct_iterator other(*this); |
|||
other.advance(off); |
|||
return other; |
|||
} |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE friend value_init_construct_iterator operator+(std::ptrdiff_t off, const value_init_construct_iterator& right) |
|||
{ return right + off; } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE value_init_construct_iterator& operator-=(std::ptrdiff_t off) |
|||
{ this->advance(-off); return *this; } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE value_init_construct_iterator operator-(std::ptrdiff_t off) const |
|||
{ return *this + (-off); } |
|||
|
|||
//This pseudo-iterator's dereference operations have no sense since value is not
|
|||
//constructed until ::boost::container::construct_in_place is called.
|
|||
//So comment them to catch bad uses
|
|||
//const T& operator*() const;
|
|||
//const T& operator[](difference_type) const;
|
|||
//const T* operator->() const;
|
|||
|
|||
private: |
|||
std::size_t m_num; |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE void increment() |
|||
{ --m_num; } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE void decrement() |
|||
{ ++m_num; } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE bool equal(const this_type &other) const |
|||
{ return m_num == other.m_num; } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE bool less(const this_type &other) const |
|||
{ return other.m_num < m_num; } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE const T & dereference() const |
|||
{ |
|||
static T dummy; |
|||
return dummy; |
|||
} |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE void advance(std::ptrdiff_t n) |
|||
{ m_num = std::size_t(std::ptrdiff_t(m_num) - n); } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE std::ptrdiff_t distance_to(const this_type &other)const |
|||
{ return std::ptrdiff_t(m_num - other.m_num); } |
|||
}; |
|||
|
|||
template <class T> |
|||
class default_init_construct_iterator |
|||
: public ::boost::container::iterator |
|||
<std::random_access_iterator_tag, T, std::ptrdiff_t, const T*, const T &> |
|||
{ |
|||
typedef default_init_construct_iterator<T> this_type; |
|||
|
|||
public: |
|||
BOOST_CONTAINER_FORCEINLINE explicit default_init_construct_iterator(std::size_t range_size) |
|||
: m_num(range_size){} |
|||
|
|||
//Constructors
|
|||
BOOST_CONTAINER_FORCEINLINE default_init_construct_iterator() |
|||
: m_num(0){} |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE default_init_construct_iterator& operator++() |
|||
{ increment(); return *this; } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE default_init_construct_iterator operator++(int) |
|||
{ |
|||
default_init_construct_iterator result (*this); |
|||
increment(); |
|||
return result; |
|||
} |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE default_init_construct_iterator& operator--() |
|||
{ decrement(); return *this; } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE default_init_construct_iterator operator--(int) |
|||
{ |
|||
default_init_construct_iterator result (*this); |
|||
decrement(); |
|||
return result; |
|||
} |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE friend bool operator== (const default_init_construct_iterator& i, const default_init_construct_iterator& i2) |
|||
{ return i.equal(i2); } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE friend bool operator!= (const default_init_construct_iterator& i, const default_init_construct_iterator& i2) |
|||
{ return !(i == i2); } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE friend bool operator< (const default_init_construct_iterator& i, const default_init_construct_iterator& i2) |
|||
{ return i.less(i2); } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE friend bool operator> (const default_init_construct_iterator& i, const default_init_construct_iterator& i2) |
|||
{ return i2 < i; } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE friend bool operator<= (const default_init_construct_iterator& i, const default_init_construct_iterator& i2) |
|||
{ return !(i > i2); } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE friend bool operator>= (const default_init_construct_iterator& i, const default_init_construct_iterator& i2) |
|||
{ return !(i < i2); } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE friend std::ptrdiff_t operator- (const default_init_construct_iterator& i, const default_init_construct_iterator& i2) |
|||
{ return i2.distance_to(i); } |
|||
|
|||
//Arithmetic
|
|||
BOOST_CONTAINER_FORCEINLINE default_init_construct_iterator& operator+=(std::ptrdiff_t off) |
|||
{ this->advance(off); return *this; } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE default_init_construct_iterator operator+(std::ptrdiff_t off) const |
|||
{ |
|||
default_init_construct_iterator other(*this); |
|||
other.advance(off); |
|||
return other; |
|||
} |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE friend default_init_construct_iterator operator+(std::ptrdiff_t off, const default_init_construct_iterator& right) |
|||
{ return right + off; } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE default_init_construct_iterator& operator-=(std::ptrdiff_t off) |
|||
{ this->advance(-off); return *this; } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE default_init_construct_iterator operator-(std::ptrdiff_t off) const |
|||
{ return *this + (-off); } |
|||
|
|||
//This pseudo-iterator's dereference operations have no sense since value is not
|
|||
//constructed until ::boost::container::construct_in_place is called.
|
|||
//So comment them to catch bad uses
|
|||
//const T& operator*() const;
|
|||
//const T& operator[](difference_type) const;
|
|||
//const T* operator->() const;
|
|||
|
|||
private: |
|||
std::size_t m_num; |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE void increment() |
|||
{ --m_num; } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE void decrement() |
|||
{ ++m_num; } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE bool equal(const this_type &other) const |
|||
{ return m_num == other.m_num; } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE bool less(const this_type &other) const |
|||
{ return other.m_num < m_num; } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE const T & dereference() const |
|||
{ |
|||
static T dummy; |
|||
return dummy; |
|||
} |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE void advance(std::ptrdiff_t n) |
|||
{ m_num = std::size_t(std::ptrdiff_t(m_num) - n); } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE std::ptrdiff_t distance_to(const this_type &other) const |
|||
{ return std::ptrdiff_t(m_num - other.m_num); } |
|||
}; |
|||
|
|||
|
|||
template <class T> |
|||
class repeat_iterator |
|||
: public ::boost::container::iterator |
|||
<std::random_access_iterator_tag, T, std::ptrdiff_t, T*, T&> |
|||
{ |
|||
typedef repeat_iterator<T> this_type; |
|||
public: |
|||
BOOST_CONTAINER_FORCEINLINE explicit repeat_iterator(T &ref, std::size_t range_size) |
|||
: m_ptr(&ref), m_num(range_size){} |
|||
|
|||
//Constructors
|
|||
BOOST_CONTAINER_FORCEINLINE repeat_iterator() |
|||
: m_ptr(0), m_num(0){} |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE this_type& operator++() |
|||
{ increment(); return *this; } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE this_type operator++(int) |
|||
{ |
|||
this_type result (*this); |
|||
increment(); |
|||
return result; |
|||
} |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE this_type& operator--() |
|||
{ increment(); return *this; } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE this_type operator--(int) |
|||
{ |
|||
this_type result (*this); |
|||
increment(); |
|||
return result; |
|||
} |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE friend bool operator== (const this_type& i, const this_type& i2) |
|||
{ return i.equal(i2); } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE friend bool operator!= (const this_type& i, const this_type& i2) |
|||
{ return !(i == i2); } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE friend bool operator< (const this_type& i, const this_type& i2) |
|||
{ return i.less(i2); } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE friend bool operator> (const this_type& i, const this_type& i2) |
|||
{ return i2 < i; } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE friend bool operator<= (const this_type& i, const this_type& i2) |
|||
{ return !(i > i2); } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE friend bool operator>= (const this_type& i, const this_type& i2) |
|||
{ return !(i < i2); } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE friend std::ptrdiff_t operator- (const this_type& i, const this_type& i2) |
|||
{ return i2.distance_to(i); } |
|||
|
|||
//Arithmetic
|
|||
BOOST_CONTAINER_FORCEINLINE this_type& operator+=(std::ptrdiff_t off) |
|||
{ this->advance(off); return *this; } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE this_type operator+(std::ptrdiff_t off) const |
|||
{ |
|||
this_type other(*this); |
|||
other.advance(off); |
|||
return other; |
|||
} |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE friend this_type operator+(std::ptrdiff_t off, const this_type& right) |
|||
{ return right + off; } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE this_type& operator-=(std::ptrdiff_t off) |
|||
{ this->advance(-off); return *this; } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE this_type operator-(std::ptrdiff_t off) const |
|||
{ return *this + (-off); } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE T& operator*() const |
|||
{ return dereference(); } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE T& operator[] (std::ptrdiff_t ) const |
|||
{ return dereference(); } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE T *operator->() const |
|||
{ return &(dereference()); } |
|||
|
|||
private: |
|||
T * m_ptr; |
|||
std::size_t m_num; |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE void increment() |
|||
{ --m_num; } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE void decrement() |
|||
{ ++m_num; } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE bool equal(const this_type &other) const |
|||
{ return m_num == other.m_num; } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE bool less(const this_type &other) const |
|||
{ return other.m_num < m_num; } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE T & dereference() const |
|||
{ return *m_ptr; } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE void advance(std::ptrdiff_t n) |
|||
{ m_num = std::size_t(std::ptrdiff_t(m_num - n)); } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE std::ptrdiff_t distance_to(const this_type &other)const |
|||
{ return std::ptrdiff_t(m_num - other.m_num); } |
|||
}; |
|||
|
|||
template <class T, class EmplaceFunctor> |
|||
class emplace_iterator |
|||
: public ::boost::container::iterator |
|||
<std::random_access_iterator_tag, T, std::ptrdiff_t, const T*, const T &> |
|||
{ |
|||
typedef emplace_iterator this_type; |
|||
|
|||
public: |
|||
typedef std::ptrdiff_t difference_type; |
|||
BOOST_CONTAINER_FORCEINLINE explicit emplace_iterator(EmplaceFunctor&e) |
|||
: m_num(1), m_pe(&e){} |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE emplace_iterator() |
|||
: m_num(0), m_pe(0){} |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE this_type& operator++() |
|||
{ increment(); return *this; } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE this_type operator++(int) |
|||
{ |
|||
this_type result (*this); |
|||
increment(); |
|||
return result; |
|||
} |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE this_type& operator--() |
|||
{ decrement(); return *this; } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE this_type operator--(int) |
|||
{ |
|||
this_type result (*this); |
|||
decrement(); |
|||
return result; |
|||
} |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE friend bool operator== (const this_type& i, const this_type& i2) |
|||
{ return i.equal(i2); } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE friend bool operator!= (const this_type& i, const this_type& i2) |
|||
{ return !(i == i2); } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE friend bool operator< (const this_type& i, const this_type& i2) |
|||
{ return i.less(i2); } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE friend bool operator> (const this_type& i, const this_type& i2) |
|||
{ return i2 < i; } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE friend bool operator<= (const this_type& i, const this_type& i2) |
|||
{ return !(i > i2); } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE friend bool operator>= (const this_type& i, const this_type& i2) |
|||
{ return !(i < i2); } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE friend difference_type operator- (const this_type& i, const this_type& i2) |
|||
{ return i2.distance_to(i); } |
|||
|
|||
//Arithmetic
|
|||
BOOST_CONTAINER_FORCEINLINE this_type& operator+=(difference_type off) |
|||
{ this->advance(off); return *this; } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE this_type operator+(difference_type off) const |
|||
{ |
|||
this_type other(*this); |
|||
other.advance(off); |
|||
return other; |
|||
} |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE friend this_type operator+(difference_type off, const this_type& right) |
|||
{ return right + off; } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE this_type& operator-=(difference_type off) |
|||
{ this->advance(-off); return *this; } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE this_type operator-(difference_type off) const |
|||
{ return *this + (-off); } |
|||
|
|||
private: |
|||
//This pseudo-iterator's dereference operations have no sense since value is not
|
|||
//constructed until ::boost::container::construct_in_place is called.
|
|||
//So comment them to catch bad uses
|
|||
const T& operator*() const; |
|||
const T& operator[](difference_type) const; |
|||
const T* operator->() const; |
|||
|
|||
public: |
|||
template<class Allocator> |
|||
BOOST_CONTAINER_FORCEINLINE void construct_in_place(Allocator &a, T* ptr) |
|||
{ (*m_pe)(a, ptr); } |
|||
|
|||
template<class DestIt> |
|||
BOOST_CONTAINER_FORCEINLINE void assign_in_place(DestIt dest) |
|||
{ (*m_pe)(dest); } |
|||
|
|||
private: |
|||
std::size_t m_num; |
|||
EmplaceFunctor * m_pe; |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE void increment() |
|||
{ --m_num; } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE void decrement() |
|||
{ ++m_num; } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE bool equal(const this_type &other) const |
|||
{ return m_num == other.m_num; } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE bool less(const this_type &other) const |
|||
{ return other.m_num < m_num; } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE const T & dereference() const |
|||
{ |
|||
static T dummy; |
|||
return dummy; |
|||
} |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE void advance(difference_type n) |
|||
{ m_num -= n; } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE difference_type distance_to(const this_type &other)const |
|||
{ return difference_type(m_num - other.m_num); } |
|||
}; |
|||
|
|||
#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
|
|||
|
|||
template<class ...Args> |
|||
struct emplace_functor |
|||
{ |
|||
typedef typename dtl::build_number_seq<sizeof...(Args)>::type index_tuple_t; |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE emplace_functor(BOOST_FWD_REF(Args)... args) |
|||
: args_(args...) |
|||
{} |
|||
|
|||
template<class Allocator, class T> |
|||
BOOST_CONTAINER_FORCEINLINE void operator()(Allocator &a, T *ptr) |
|||
{ emplace_functor::inplace_impl(a, ptr, index_tuple_t()); } |
|||
|
|||
template<class DestIt> |
|||
BOOST_CONTAINER_FORCEINLINE void operator()(DestIt dest) |
|||
{ emplace_functor::inplace_impl(dest, index_tuple_t()); } |
|||
|
|||
private: |
|||
template<class Allocator, class T, std::size_t ...IdxPack> |
|||
BOOST_CONTAINER_FORCEINLINE void inplace_impl(Allocator &a, T* ptr, const dtl::index_tuple<IdxPack...>&) |
|||
{ |
|||
allocator_traits<Allocator>::construct |
|||
(a, ptr, ::boost::forward<Args>(dtl::get<IdxPack>(args_))...); |
|||
} |
|||
|
|||
template<class DestIt, std::size_t ...IdxPack> |
|||
BOOST_CONTAINER_FORCEINLINE void inplace_impl(DestIt dest, const dtl::index_tuple<IdxPack...>&) |
|||
{ |
|||
typedef typename boost::container::iterator_traits<DestIt>::value_type value_type; |
|||
value_type && tmp= value_type(::boost::forward<Args>(dtl::get<IdxPack>(args_))...); |
|||
*dest = ::boost::move(tmp); |
|||
} |
|||
|
|||
dtl::tuple<Args&...> args_; |
|||
}; |
|||
|
|||
template<class ...Args> |
|||
struct emplace_functor_type |
|||
{ |
|||
typedef emplace_functor<Args...> type; |
|||
}; |
|||
|
|||
#else // !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
|
|||
|
|||
//Partial specializations cannot match argument list for primary template, so add an extra argument
|
|||
template <BOOST_MOVE_CLASSDFLT9, class Dummy = void> |
|||
struct emplace_functor_type; |
|||
|
|||
#define BOOST_MOVE_ITERATOR_EMPLACE_FUNCTOR_CODE(N) \
|
|||
BOOST_MOVE_TMPL_LT##N BOOST_MOVE_CLASS##N BOOST_MOVE_GT##N \ |
|||
struct emplace_functor##N\ |
|||
{\ |
|||
BOOST_CONTAINER_FORCEINLINE explicit emplace_functor##N( BOOST_MOVE_UREF##N )\ |
|||
BOOST_MOVE_COLON##N BOOST_MOVE_FWD_INIT##N{}\ |
|||
\ |
|||
template<class Allocator, class T>\ |
|||
BOOST_CONTAINER_FORCEINLINE void operator()(Allocator &a, T *ptr)\ |
|||
{ allocator_traits<Allocator>::construct(a, ptr BOOST_MOVE_I##N BOOST_MOVE_MFWD##N); }\ |
|||
\ |
|||
template<class DestIt>\ |
|||
BOOST_CONTAINER_FORCEINLINE void operator()(DestIt dest)\ |
|||
{\ |
|||
typedef typename boost::container::iterator_traits<DestIt>::value_type value_type;\ |
|||
BOOST_MOVE_IF(N, value_type tmp(BOOST_MOVE_MFWD##N), dtl::value_init<value_type> tmp) ;\ |
|||
*dest = ::boost::move(const_cast<value_type &>(BOOST_MOVE_IF(N, tmp, tmp.get())));\ |
|||
}\ |
|||
\ |
|||
BOOST_MOVE_MREF##N\ |
|||
};\ |
|||
\ |
|||
template <BOOST_MOVE_CLASS##N>\ |
|||
struct emplace_functor_type<BOOST_MOVE_TARG##N>\ |
|||
{\ |
|||
typedef emplace_functor##N BOOST_MOVE_LT##N BOOST_MOVE_TARG##N BOOST_MOVE_GT##N type;\ |
|||
};\ |
|||
//
|
|||
|
|||
BOOST_MOVE_ITERATE_0TO9(BOOST_MOVE_ITERATOR_EMPLACE_FUNCTOR_CODE) |
|||
|
|||
#undef BOOST_MOVE_ITERATOR_EMPLACE_FUNCTOR_CODE
|
|||
|
|||
#endif
|
|||
|
|||
namespace dtl { |
|||
|
|||
template<class T> |
|||
struct has_iterator_category |
|||
{ |
|||
struct two { char _[2]; }; |
|||
|
|||
template <typename X> |
|||
static char test(int, typename X::iterator_category*); |
|||
|
|||
template <typename X> |
|||
static two test(int, ...); |
|||
|
|||
static const bool value = (1 == sizeof(test<T>(0, 0))); |
|||
}; |
|||
|
|||
|
|||
template<class T, bool = has_iterator_category<T>::value > |
|||
struct is_input_iterator |
|||
{ |
|||
static const bool value = is_same<typename T::iterator_category, std::input_iterator_tag>::value; |
|||
}; |
|||
|
|||
template<class T> |
|||
struct is_input_iterator<T, false> |
|||
{ |
|||
static const bool value = false; |
|||
}; |
|||
|
|||
template<class T> |
|||
struct is_not_input_iterator |
|||
{ |
|||
static const bool value = !is_input_iterator<T>::value; |
|||
}; |
|||
|
|||
template<class T, bool = has_iterator_category<T>::value > |
|||
struct is_forward_iterator |
|||
{ |
|||
static const bool value = is_same<typename T::iterator_category, std::forward_iterator_tag>::value; |
|||
}; |
|||
|
|||
template<class T> |
|||
struct is_forward_iterator<T, false> |
|||
{ |
|||
static const bool value = false; |
|||
}; |
|||
|
|||
template<class T, bool = has_iterator_category<T>::value > |
|||
struct is_bidirectional_iterator |
|||
{ |
|||
static const bool value = is_same<typename T::iterator_category, std::bidirectional_iterator_tag>::value; |
|||
}; |
|||
|
|||
template<class T> |
|||
struct is_bidirectional_iterator<T, false> |
|||
{ |
|||
static const bool value = false; |
|||
}; |
|||
|
|||
template<class IINodeType> |
|||
struct iiterator_node_value_type { |
|||
typedef typename IINodeType::value_type type; |
|||
}; |
|||
|
|||
template<class IIterator> |
|||
struct iiterator_types |
|||
{ |
|||
typedef typename IIterator::value_type it_value_type; |
|||
typedef typename iiterator_node_value_type<it_value_type>::type value_type; |
|||
typedef typename boost::container::iterator_traits<IIterator>::pointer it_pointer; |
|||
typedef typename boost::container::iterator_traits<IIterator>::difference_type difference_type; |
|||
typedef typename ::boost::intrusive::pointer_traits<it_pointer>:: |
|||
template rebind_pointer<value_type>::type pointer; |
|||
typedef typename ::boost::intrusive::pointer_traits<it_pointer>:: |
|||
template rebind_pointer<const value_type>::type const_pointer; |
|||
typedef typename ::boost::intrusive:: |
|||
pointer_traits<pointer>::reference reference; |
|||
typedef typename ::boost::intrusive:: |
|||
pointer_traits<const_pointer>::reference const_reference; |
|||
typedef typename IIterator::iterator_category iterator_category; |
|||
}; |
|||
|
|||
template<class IIterator, bool IsConst> |
|||
struct iterator_types |
|||
{ |
|||
typedef typename ::boost::container::iterator |
|||
< typename iiterator_types<IIterator>::iterator_category |
|||
, typename iiterator_types<IIterator>::value_type |
|||
, typename iiterator_types<IIterator>::difference_type |
|||
, typename iiterator_types<IIterator>::const_pointer |
|||
, typename iiterator_types<IIterator>::const_reference> type; |
|||
}; |
|||
|
|||
template<class IIterator> |
|||
struct iterator_types<IIterator, false> |
|||
{ |
|||
typedef typename ::boost::container::iterator |
|||
< typename iiterator_types<IIterator>::iterator_category |
|||
, typename iiterator_types<IIterator>::value_type |
|||
, typename iiterator_types<IIterator>::difference_type |
|||
, typename iiterator_types<IIterator>::pointer |
|||
, typename iiterator_types<IIterator>::reference> type; |
|||
}; |
|||
|
|||
template<class IIterator, bool IsConst> |
|||
class iterator_from_iiterator |
|||
{ |
|||
typedef typename iterator_types<IIterator, IsConst>::type types_t; |
|||
class nat |
|||
{ |
|||
public: |
|||
IIterator get() const |
|||
{ return IIterator(); } |
|||
}; |
|||
typedef typename dtl::if_c< IsConst |
|||
, iterator_from_iiterator<IIterator, false> |
|||
, nat>::type nonconst_iterator; |
|||
|
|||
public: |
|||
typedef typename types_t::pointer pointer; |
|||
typedef typename types_t::reference reference; |
|||
typedef typename types_t::difference_type difference_type; |
|||
typedef typename types_t::iterator_category iterator_category; |
|||
typedef typename types_t::value_type value_type; |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE iterator_from_iiterator() |
|||
: m_iit() |
|||
{} |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE explicit iterator_from_iiterator(IIterator iit) BOOST_NOEXCEPT_OR_NOTHROW |
|||
: m_iit(iit) |
|||
{} |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE iterator_from_iiterator(const iterator_from_iiterator& other) BOOST_NOEXCEPT_OR_NOTHROW |
|||
: m_iit(other.get()) |
|||
{} |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE iterator_from_iiterator(const nonconst_iterator& other) BOOST_NOEXCEPT_OR_NOTHROW |
|||
: m_iit(other.get()) |
|||
{} |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE iterator_from_iiterator& operator=(const iterator_from_iiterator& other) BOOST_NOEXCEPT_OR_NOTHROW |
|||
{ m_iit = other.get(); return *this; } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE iterator_from_iiterator& operator++() BOOST_NOEXCEPT_OR_NOTHROW |
|||
{ ++this->m_iit; return *this; } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE iterator_from_iiterator operator++(int) BOOST_NOEXCEPT_OR_NOTHROW |
|||
{ |
|||
iterator_from_iiterator result (*this); |
|||
++this->m_iit; |
|||
return result; |
|||
} |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE iterator_from_iiterator& operator--() BOOST_NOEXCEPT_OR_NOTHROW |
|||
{ |
|||
//If the iterator_from_iiterator is not a bidirectional iterator, operator-- should not exist
|
|||
BOOST_STATIC_ASSERT((is_bidirectional_iterator<iterator_from_iiterator>::value)); |
|||
--this->m_iit; return *this; |
|||
} |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE iterator_from_iiterator operator--(int) BOOST_NOEXCEPT_OR_NOTHROW |
|||
{ |
|||
iterator_from_iiterator result (*this); |
|||
--this->m_iit; |
|||
return result; |
|||
} |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE friend bool operator== (const iterator_from_iiterator& l, const iterator_from_iiterator& r) BOOST_NOEXCEPT_OR_NOTHROW |
|||
{ return l.m_iit == r.m_iit; } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE friend bool operator!= (const iterator_from_iiterator& l, const iterator_from_iiterator& r) BOOST_NOEXCEPT_OR_NOTHROW |
|||
{ return l.m_iit != r.m_iit; } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE reference operator*() const BOOST_NOEXCEPT_OR_NOTHROW |
|||
{ return this->m_iit->get_data(); } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE pointer operator->() const BOOST_NOEXCEPT_OR_NOTHROW |
|||
{ return ::boost::intrusive::pointer_traits<pointer>::pointer_to(this->operator*()); } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE const IIterator &get() const BOOST_NOEXCEPT_OR_NOTHROW |
|||
{ return this->m_iit; } |
|||
|
|||
private: |
|||
IIterator m_iit; |
|||
}; |
|||
|
|||
} //namespace dtl {
|
|||
|
|||
using ::boost::intrusive::reverse_iterator; |
|||
|
|||
} //namespace container {
|
|||
} //namespace boost {
|
|||
|
|||
#include <boost/container/detail/config_end.hpp>
|
|||
|
|||
#endif //#ifndef BOOST_CONTAINER_DETAIL_ITERATORS_HPP
|
@ -0,0 +1,37 @@ |
|||
//////////////////////////////////////////////////////////////////////////////
|
|||
//
|
|||
// (C) Copyright Ion Gaztanaga 2005-2013. 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_MIN_MAX_HPP
|
|||
#define BOOST_CONTAINER_DETAIL_MIN_MAX_HPP
|
|||
|
|||
#ifndef BOOST_CONFIG_HPP
|
|||
# include <boost/config.hpp>
|
|||
#endif
|
|||
|
|||
#if defined(BOOST_HAS_PRAGMA_ONCE)
|
|||
# pragma once
|
|||
#endif
|
|||
|
|||
namespace boost { |
|||
namespace container { |
|||
namespace dtl { |
|||
|
|||
template<class T> |
|||
const T &max_value(const T &a, const T &b) |
|||
{ return a > b ? a : b; } |
|||
|
|||
template<class T> |
|||
const T &min_value(const T &a, const T &b) |
|||
{ return a < b ? a : b; } |
|||
|
|||
} //namespace dtl {
|
|||
} //namespace container {
|
|||
} //namespace boost {
|
|||
|
|||
#endif //#ifndef BOOST_CONTAINER_DETAIL_MIN_MAX_HPP
|
@ -0,0 +1,32 @@ |
|||
/////////////////////////////////////////////////////////////////////////////
|
|||
//
|
|||
// (C) Copyright Ion Gaztanaga 2014-2015
|
|||
//
|
|||
// 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_MINIMAL_CHAR_TRAITS_HEADER_HPP
|
|||
#define BOOST_CONTAINER_DETAIL_MINIMAL_CHAR_TRAITS_HEADER_HPP
|
|||
#
|
|||
#ifndef BOOST_CONFIG_HPP
|
|||
# include <boost/config.hpp>
|
|||
#endif
|
|||
#
|
|||
#if defined(BOOST_HAS_PRAGMA_ONCE)
|
|||
# pragma once
|
|||
#endif
|
|||
#
|
|||
#//Try to avoid including <string>, as it's quite big
|
|||
#if defined(_MSC_VER) && defined(BOOST_DINKUMWARE_STDLIB)
|
|||
#include <iosfwd> //Dinkum libraries for MSVC define std::char_traits there
|
|||
#elif defined(BOOST_GNU_STDLIB)
|
|||
#include <bits/char_traits.h>
|
|||
#else
|
|||
#include <string> //Fallback
|
|||
#endif
|
|||
|
|||
#endif //BOOST_CONTAINER_DETAIL_MINIMAL_CHAR_TRAITS_HEADER_HPP
|
@ -0,0 +1,144 @@ |
|||
//////////////////////////////////////////////////////////////////////////////
|
|||
//
|
|||
// (C) Copyright Ion Gaztanaga 2005-2013.
|
|||
//
|
|||
// 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_CONTAINER_DETAIL_MPL_HPP
|
|||
#define BOOST_CONTAINER_CONTAINER_DETAIL_MPL_HPP
|
|||
|
|||
#ifndef BOOST_CONFIG_HPP
|
|||
# include <boost/config.hpp>
|
|||
#endif
|
|||
|
|||
#if defined(BOOST_HAS_PRAGMA_ONCE)
|
|||
# pragma once
|
|||
#endif
|
|||
|
|||
#include <boost/container/detail/config_begin.hpp>
|
|||
#include <boost/container/detail/workaround.hpp>
|
|||
#include <boost/move/detail/type_traits.hpp>
|
|||
#include <boost/intrusive/detail/mpl.hpp>
|
|||
|
|||
#include <cstddef>
|
|||
|
|||
namespace boost { |
|||
namespace container { |
|||
namespace dtl { |
|||
|
|||
using boost::move_detail::integral_constant; |
|||
using boost::move_detail::true_type; |
|||
using boost::move_detail::false_type; |
|||
using boost::move_detail::enable_if_c; |
|||
using boost::move_detail::enable_if; |
|||
using boost::move_detail::enable_if_convertible; |
|||
using boost::move_detail::disable_if_c; |
|||
using boost::move_detail::disable_if; |
|||
using boost::move_detail::disable_if_convertible; |
|||
using boost::move_detail::is_convertible; |
|||
using boost::move_detail::if_c; |
|||
using boost::move_detail::if_; |
|||
using boost::move_detail::identity; |
|||
using boost::move_detail::bool_; |
|||
using boost::move_detail::true_; |
|||
using boost::move_detail::false_; |
|||
using boost::move_detail::yes_type; |
|||
using boost::move_detail::no_type; |
|||
using boost::move_detail::bool_; |
|||
using boost::move_detail::true_; |
|||
using boost::move_detail::false_; |
|||
using boost::move_detail::unvoid_ref; |
|||
using boost::move_detail::and_; |
|||
using boost::move_detail::or_; |
|||
using boost::move_detail::not_; |
|||
using boost::move_detail::enable_if_and; |
|||
using boost::move_detail::disable_if_and; |
|||
using boost::move_detail::enable_if_or; |
|||
using boost::move_detail::disable_if_or; |
|||
using boost::move_detail::remove_const; |
|||
|
|||
template <class FirstType> |
|||
struct select1st |
|||
{ |
|||
typedef FirstType type; |
|||
|
|||
template<class T> |
|||
BOOST_CONTAINER_FORCEINLINE const type& operator()(const T& x) const |
|||
{ return x.first; } |
|||
|
|||
template<class T> |
|||
BOOST_CONTAINER_FORCEINLINE type& operator()(T& x) |
|||
{ return const_cast<type&>(x.first); } |
|||
}; |
|||
|
|||
|
|||
template<typename T> |
|||
struct void_t { typedef void type; }; |
|||
|
|||
template <class T, class=void> |
|||
struct is_transparent_base |
|||
{ |
|||
static const bool value = false; |
|||
}; |
|||
|
|||
template <class T> |
|||
struct is_transparent_base<T, typename void_t<typename T::is_transparent>::type> |
|||
{ |
|||
static const bool value = true; |
|||
}; |
|||
|
|||
template <class T> |
|||
struct is_transparent |
|||
: is_transparent_base<T> |
|||
{}; |
|||
|
|||
template <typename C, class /*Dummy*/, typename R> |
|||
struct enable_if_transparent |
|||
: boost::move_detail::enable_if_c<dtl::is_transparent<C>::value, R> |
|||
{}; |
|||
|
|||
#ifndef BOOST_CONTAINER_NO_CXX17_CTAD
|
|||
|
|||
// void_t (void_t for C++11)
|
|||
template<typename...> using variadic_void_t = void; |
|||
|
|||
// Trait to detect Allocator-like types.
|
|||
template<typename Allocator, typename = void> |
|||
struct is_allocator |
|||
{ |
|||
static const bool value = false; |
|||
}; |
|||
|
|||
template <typename T> |
|||
T&& ctad_declval(); |
|||
|
|||
template<typename Allocator> |
|||
struct is_allocator < Allocator, |
|||
variadic_void_t< typename Allocator::value_type |
|||
, decltype(ctad_declval<Allocator&>().allocate(size_t{})) >> |
|||
{ |
|||
static const bool value = true; |
|||
}; |
|||
|
|||
template<class T> |
|||
using require_allocator_t = typename enable_if_c<is_allocator<T>::value, T>::type; |
|||
|
|||
template<class T> |
|||
using require_nonallocator_t = typename enable_if_c<!is_allocator<T>::value, T>::type; |
|||
|
|||
#endif
|
|||
|
|||
} //namespace dtl {
|
|||
} //namespace container {
|
|||
} //namespace boost {
|
|||
|
|||
#include <boost/container/detail/config_end.hpp>
|
|||
|
|||
#endif //#ifndef BOOST_CONTAINER_CONTAINER_DETAIL_MPL_HPP
|
|||
|
@ -0,0 +1,307 @@ |
|||
//////////////////////////////////////////////////////////////////////////////
|
|||
//
|
|||
// (C) Copyright Ion Gaztanaga 2005-2013. 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_MULTIALLOCATION_CHAIN_HPP
|
|||
#define BOOST_CONTAINER_DETAIL_MULTIALLOCATION_CHAIN_HPP
|
|||
|
|||
#ifndef BOOST_CONFIG_HPP
|
|||
# include <boost/config.hpp>
|
|||
#endif
|
|||
|
|||
#if defined(BOOST_HAS_PRAGMA_ONCE)
|
|||
# pragma once
|
|||
#endif
|
|||
|
|||
#include <boost/container/detail/config_begin.hpp>
|
|||
#include <boost/container/detail/workaround.hpp>
|
|||
// container
|
|||
#include <boost/container/container_fwd.hpp>
|
|||
// container/detail
|
|||
#include <boost/move/detail/to_raw_pointer.hpp>
|
|||
#include <boost/container/detail/transform_iterator.hpp>
|
|||
#include <boost/container/detail/type_traits.hpp>
|
|||
#include <boost/container/detail/placement_new.hpp>
|
|||
// intrusive
|
|||
#include <boost/intrusive/slist.hpp>
|
|||
#include <boost/intrusive/pointer_traits.hpp>
|
|||
#include <boost/intrusive/detail/twin.hpp>
|
|||
// move
|
|||
#include <boost/move/utility_core.hpp>
|
|||
|
|||
namespace boost { |
|||
namespace container { |
|||
namespace dtl { |
|||
|
|||
template<class VoidPointer> |
|||
class basic_multiallocation_chain |
|||
{ |
|||
private: |
|||
typedef bi::slist_base_hook<bi::void_pointer<VoidPointer> |
|||
,bi::link_mode<bi::normal_link> |
|||
> node; |
|||
|
|||
typedef typename boost::intrusive::pointer_traits |
|||
<VoidPointer>::template rebind_pointer<char>::type char_ptr; |
|||
typedef typename boost::intrusive:: |
|||
pointer_traits<char_ptr>::difference_type difference_type; |
|||
|
|||
typedef bi::slist< node |
|||
, bi::linear<true> |
|||
, bi::cache_last<true> |
|||
, bi::size_type<typename boost::container::dtl::make_unsigned<difference_type>::type> |
|||
> slist_impl_t; |
|||
slist_impl_t slist_impl_; |
|||
|
|||
typedef typename boost::intrusive::pointer_traits |
|||
<VoidPointer>::template rebind_pointer<node>::type node_ptr; |
|||
typedef typename boost::intrusive:: |
|||
pointer_traits<node_ptr> node_ptr_traits; |
|||
|
|||
static node & to_node(const VoidPointer &p) |
|||
{ return *static_cast<node*>(static_cast<void*>(boost::movelib::to_raw_pointer(p))); } |
|||
|
|||
static VoidPointer from_node(node &n) |
|||
{ return node_ptr_traits::pointer_to(n); } |
|||
|
|||
static node_ptr to_node_ptr(const VoidPointer &p) |
|||
{ return node_ptr_traits::static_cast_from(p); } |
|||
|
|||
BOOST_MOVABLE_BUT_NOT_COPYABLE(basic_multiallocation_chain) |
|||
|
|||
public: |
|||
|
|||
typedef VoidPointer void_pointer; |
|||
typedef typename slist_impl_t::iterator iterator; |
|||
typedef typename slist_impl_t::size_type size_type; |
|||
typedef boost::intrusive::twin<void_pointer> pointer_pair; |
|||
|
|||
basic_multiallocation_chain() |
|||
: slist_impl_() |
|||
{} |
|||
|
|||
basic_multiallocation_chain(const void_pointer &b, const void_pointer &before_e, size_type n) |
|||
: slist_impl_(to_node_ptr(b), to_node_ptr(before_e), n) |
|||
{} |
|||
|
|||
basic_multiallocation_chain(BOOST_RV_REF(basic_multiallocation_chain) other) |
|||
: slist_impl_(::boost::move(other.slist_impl_)) |
|||
{} |
|||
|
|||
basic_multiallocation_chain& operator=(BOOST_RV_REF(basic_multiallocation_chain) other) |
|||
{ |
|||
slist_impl_ = ::boost::move(other.slist_impl_); |
|||
return *this; |
|||
} |
|||
|
|||
bool empty() const |
|||
{ return slist_impl_.empty(); } |
|||
|
|||
size_type size() const |
|||
{ return slist_impl_.size(); } |
|||
|
|||
iterator before_begin() |
|||
{ return slist_impl_.before_begin(); } |
|||
|
|||
iterator begin() |
|||
{ return slist_impl_.begin(); } |
|||
|
|||
iterator end() |
|||
{ return slist_impl_.end(); } |
|||
|
|||
iterator last() |
|||
{ return slist_impl_.last(); } |
|||
|
|||
void clear() |
|||
{ slist_impl_.clear(); } |
|||
|
|||
iterator insert_after(iterator it, void_pointer m) |
|||
{ return slist_impl_.insert_after(it, to_node(m)); } |
|||
|
|||
void push_front(const void_pointer &m) |
|||
{ return slist_impl_.push_front(to_node(m)); } |
|||
|
|||
void push_back(const void_pointer &m) |
|||
{ return slist_impl_.push_back(to_node(m)); } |
|||
|
|||
void_pointer pop_front() |
|||
{ |
|||
node & n = slist_impl_.front(); |
|||
void_pointer ret = from_node(n); |
|||
slist_impl_.pop_front(); |
|||
return ret; |
|||
} |
|||
|
|||
void splice_after(iterator after_this, basic_multiallocation_chain &x, iterator before_b, iterator before_e, size_type n) |
|||
{ slist_impl_.splice_after(after_this, x.slist_impl_, before_b, before_e, n); } |
|||
|
|||
void splice_after(iterator after_this, basic_multiallocation_chain &x) |
|||
{ slist_impl_.splice_after(after_this, x.slist_impl_); } |
|||
|
|||
void erase_after(iterator before_b, iterator e, size_type n) |
|||
{ slist_impl_.erase_after(before_b, e, n); } |
|||
|
|||
void_pointer incorporate_after(iterator after_this, const void_pointer &b, size_type unit_bytes, size_type num_units) |
|||
{ |
|||
typedef typename boost::intrusive::pointer_traits<char_ptr> char_pointer_traits; |
|||
char_ptr elem = char_pointer_traits::static_cast_from(b); |
|||
if(num_units){ |
|||
char_ptr prev_elem = elem; |
|||
elem += difference_type(unit_bytes); |
|||
for(size_type i = 0; i != num_units-1u; ++i, elem += difference_type(unit_bytes)){ |
|||
::new (boost::movelib::to_raw_pointer(prev_elem), boost_container_new_t()) void_pointer(elem); |
|||
prev_elem = elem; |
|||
} |
|||
slist_impl_.incorporate_after(after_this, to_node_ptr(b), to_node_ptr(prev_elem), num_units); |
|||
} |
|||
return elem; |
|||
} |
|||
|
|||
void incorporate_after(iterator after_this, void_pointer b, void_pointer before_e, size_type n) |
|||
{ slist_impl_.incorporate_after(after_this, to_node_ptr(b), to_node_ptr(before_e), n); } |
|||
|
|||
void swap(basic_multiallocation_chain &x) |
|||
{ slist_impl_.swap(x.slist_impl_); } |
|||
|
|||
static iterator iterator_to(const void_pointer &p) |
|||
{ return slist_impl_t::s_iterator_to(to_node(p)); } |
|||
|
|||
pointer_pair extract_data() |
|||
{ |
|||
if(BOOST_LIKELY(!slist_impl_.empty())){ |
|||
pointer_pair ret |
|||
(slist_impl_.begin().operator->() |
|||
,slist_impl_.last().operator->()); |
|||
slist_impl_.clear(); |
|||
return ret; |
|||
} |
|||
else { |
|||
return pointer_pair(); |
|||
} |
|||
} |
|||
}; |
|||
|
|||
template<class T> |
|||
struct cast_functor |
|||
{ |
|||
typedef typename dtl::add_reference<T>::type result_type; |
|||
template<class U> |
|||
result_type operator()(U &ptr) const |
|||
{ return *static_cast<T*>(static_cast<void*>(&ptr)); } |
|||
}; |
|||
|
|||
template<class MultiallocationChain, class T> |
|||
class transform_multiallocation_chain |
|||
: public MultiallocationChain |
|||
{ |
|||
private: |
|||
BOOST_MOVABLE_BUT_NOT_COPYABLE(transform_multiallocation_chain) |
|||
//transform_multiallocation_chain(const transform_multiallocation_chain &);
|
|||
//transform_multiallocation_chain & operator=(const transform_multiallocation_chain &);
|
|||
|
|||
typedef typename MultiallocationChain::void_pointer void_pointer; |
|||
typedef typename boost::intrusive::pointer_traits |
|||
<void_pointer> void_pointer_traits; |
|||
typedef typename void_pointer_traits::template |
|||
rebind_pointer<T>::type pointer; |
|||
typedef typename boost::intrusive::pointer_traits |
|||
<pointer> pointer_traits; |
|||
|
|||
static pointer cast(const void_pointer &p) |
|||
{ return pointer_traits::static_cast_from(p); } |
|||
|
|||
public: |
|||
typedef transform_iterator |
|||
< typename MultiallocationChain::iterator |
|||
, dtl::cast_functor <T> > iterator; |
|||
typedef typename MultiallocationChain::size_type size_type; |
|||
typedef boost::intrusive::twin<pointer> pointer_pair; |
|||
|
|||
transform_multiallocation_chain() |
|||
: MultiallocationChain() |
|||
{} |
|||
|
|||
transform_multiallocation_chain(BOOST_RV_REF(transform_multiallocation_chain) other) |
|||
: MultiallocationChain(::boost::move(static_cast<MultiallocationChain&>(other))) |
|||
{} |
|||
|
|||
transform_multiallocation_chain(BOOST_RV_REF(MultiallocationChain) other) |
|||
: MultiallocationChain(::boost::move(static_cast<MultiallocationChain&>(other))) |
|||
{} |
|||
|
|||
transform_multiallocation_chain& operator=(BOOST_RV_REF(transform_multiallocation_chain) other) |
|||
{ |
|||
return static_cast<MultiallocationChain&> |
|||
(this->MultiallocationChain::operator=(::boost::move(static_cast<MultiallocationChain&>(other)))); |
|||
} |
|||
|
|||
void push_front(const pointer &mem) |
|||
{ this->MultiallocationChain::push_front(mem); } |
|||
|
|||
void push_back(const pointer &mem) |
|||
{ return this->MultiallocationChain::push_back(mem); } |
|||
|
|||
void swap(transform_multiallocation_chain &other_chain) |
|||
{ this->MultiallocationChain::swap(other_chain); } |
|||
|
|||
void splice_after(iterator after_this, transform_multiallocation_chain &x, iterator before_b, iterator before_e, size_type n) |
|||
{ this->MultiallocationChain::splice_after(after_this.base(), x, before_b.base(), before_e.base(), n); } |
|||
|
|||
void incorporate_after(iterator after_this, pointer b, pointer before_e, size_type n) |
|||
{ this->MultiallocationChain::incorporate_after(after_this.base(), b, before_e, n); } |
|||
|
|||
pointer pop_front() |
|||
{ return cast(this->MultiallocationChain::pop_front()); } |
|||
|
|||
bool empty() const |
|||
{ return this->MultiallocationChain::empty(); } |
|||
|
|||
iterator before_begin() |
|||
{ return iterator(this->MultiallocationChain::before_begin()); } |
|||
|
|||
iterator begin() |
|||
{ return iterator(this->MultiallocationChain::begin()); } |
|||
|
|||
iterator last() |
|||
{ return iterator(this->MultiallocationChain::last()); } |
|||
|
|||
iterator end() |
|||
{ return iterator(this->MultiallocationChain::end()); } |
|||
|
|||
size_type size() const |
|||
{ return this->MultiallocationChain::size(); } |
|||
|
|||
void clear() |
|||
{ this->MultiallocationChain::clear(); } |
|||
|
|||
iterator insert_after(iterator it, pointer m) |
|||
{ return iterator(this->MultiallocationChain::insert_after(it.base(), m)); } |
|||
|
|||
static iterator iterator_to(const pointer &p) |
|||
{ return iterator(MultiallocationChain::iterator_to(p)); } |
|||
|
|||
pointer_pair extract_data() |
|||
{ |
|||
typename MultiallocationChain::pointer_pair data(this->MultiallocationChain::extract_data()); |
|||
return pointer_pair(cast(data.first), cast(data.second)); |
|||
} |
|||
/*
|
|||
MultiallocationChain &extract_multiallocation_chain() |
|||
{ return holder_; }*/ |
|||
}; |
|||
|
|||
}}} |
|||
|
|||
// namespace dtl {
|
|||
// namespace container {
|
|||
// namespace boost {
|
|||
|
|||
#include <boost/container/detail/config_end.hpp>
|
|||
|
|||
#endif //BOOST_CONTAINER_DETAIL_MULTIALLOCATION_CHAIN_HPP
|
@ -0,0 +1,98 @@ |
|||
//////////////////////////////////////////////////////////////////////////////
|
|||
//
|
|||
// (C) Copyright Ion Gaztanaga 2014-2015. 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_NEXT_CAPACITY_HPP
|
|||
#define BOOST_CONTAINER_DETAIL_NEXT_CAPACITY_HPP
|
|||
|
|||
#ifndef BOOST_CONFIG_HPP
|
|||
# include <boost/config.hpp>
|
|||
#endif
|
|||
|
|||
#if defined(BOOST_HAS_PRAGMA_ONCE)
|
|||
# pragma once
|
|||
#endif
|
|||
|
|||
#include <boost/container/detail/config_begin.hpp>
|
|||
#include <boost/container/detail/workaround.hpp>
|
|||
|
|||
// container
|
|||
#include <boost/container/throw_exception.hpp>
|
|||
// container/detail
|
|||
#include <boost/container/detail/min_max.hpp>
|
|||
|
|||
#include <boost/static_assert.hpp>
|
|||
|
|||
namespace boost { |
|||
namespace container { |
|||
namespace dtl { |
|||
|
|||
template<unsigned Minimum, unsigned Numerator, unsigned Denominator> |
|||
struct grow_factor_ratio |
|||
{ |
|||
BOOST_STATIC_ASSERT(Numerator > Denominator); |
|||
BOOST_STATIC_ASSERT(Numerator < 100); |
|||
BOOST_STATIC_ASSERT(Denominator < 100); |
|||
BOOST_STATIC_ASSERT(Denominator == 1 || (0 != Numerator % Denominator)); |
|||
|
|||
template<class SizeType> |
|||
SizeType operator()(const SizeType cur_cap, const SizeType add_min_cap, const SizeType max_cap) const |
|||
{ |
|||
const SizeType overflow_limit = ((SizeType)-1) / Numerator; |
|||
|
|||
SizeType new_cap = 0; |
|||
|
|||
if(cur_cap <= overflow_limit){ |
|||
new_cap = SizeType(cur_cap * Numerator / Denominator); |
|||
} |
|||
else if(Denominator == 1 || (SizeType(new_cap = cur_cap) / Denominator) > overflow_limit){ |
|||
new_cap = (SizeType)-1; |
|||
} |
|||
else{ |
|||
new_cap = SizeType(new_cap*Numerator); |
|||
} |
|||
return max_value<SizeType> |
|||
( SizeType(Minimum) |
|||
, max_value<SizeType> |
|||
( SizeType(cur_cap+add_min_cap) |
|||
, min_value<SizeType>(max_cap, new_cap)) |
|||
); |
|||
} |
|||
}; |
|||
|
|||
} //namespace dtl {
|
|||
|
|||
struct growth_factor_50 |
|||
: dtl::grow_factor_ratio<0, 3, 2> |
|||
{}; |
|||
|
|||
struct growth_factor_60 |
|||
: dtl::grow_factor_ratio<0, 8, 5> |
|||
{}; |
|||
|
|||
struct growth_factor_100 |
|||
: dtl::grow_factor_ratio<0, 2, 1> |
|||
{}; |
|||
|
|||
template<class SizeType> |
|||
BOOST_CONTAINER_FORCEINLINE void clamp_by_stored_size_type(SizeType &, SizeType) |
|||
{} |
|||
|
|||
template<class SizeType, class SomeStoredSizeType> |
|||
BOOST_CONTAINER_FORCEINLINE void clamp_by_stored_size_type(SizeType &s, SomeStoredSizeType) |
|||
{ |
|||
if (s >= SomeStoredSizeType(-1) ) |
|||
s = SomeStoredSizeType(-1); |
|||
} |
|||
|
|||
} //namespace container {
|
|||
} //namespace boost {
|
|||
|
|||
#include <boost/container/detail/config_end.hpp>
|
|||
|
|||
#endif //#ifndef BOOST_CONTAINER_DETAIL_NEXT_CAPACITY_HPP
|
@ -0,0 +1,604 @@ |
|||
//////////////////////////////////////////////////////////////////////////////
|
|||
//
|
|||
// (C) Copyright Ion Gaztanaga 2005-2013. 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_NODE_ALLOC_HPP_
|
|||
#define BOOST_CONTAINER_DETAIL_NODE_ALLOC_HPP_
|
|||
|
|||
#ifndef BOOST_CONFIG_HPP
|
|||
# include <boost/config.hpp>
|
|||
#endif
|
|||
|
|||
#if defined(BOOST_HAS_PRAGMA_ONCE)
|
|||
# pragma once
|
|||
#endif
|
|||
|
|||
#include <boost/container/detail/config_begin.hpp>
|
|||
#include <boost/container/detail/workaround.hpp>
|
|||
|
|||
// container
|
|||
#include <boost/container/allocator_traits.hpp>
|
|||
// container/detail
|
|||
#include <boost/container/detail/addressof.hpp>
|
|||
#include <boost/container/detail/alloc_helpers.hpp>
|
|||
#include <boost/container/detail/allocator_version_traits.hpp>
|
|||
#include <boost/container/detail/construct_in_place.hpp>
|
|||
#include <boost/container/detail/destroyers.hpp>
|
|||
#include <boost/move/detail/iterator_to_raw_pointer.hpp>
|
|||
#include <boost/container/detail/mpl.hpp>
|
|||
#include <boost/container/detail/placement_new.hpp>
|
|||
#include <boost/move/detail/to_raw_pointer.hpp>
|
|||
#include <boost/container/detail/type_traits.hpp>
|
|||
#include <boost/container/detail/version_type.hpp>
|
|||
#include <boost/container/detail/is_pair.hpp>
|
|||
// intrusive
|
|||
#include <boost/intrusive/detail/mpl.hpp>
|
|||
#include <boost/intrusive/options.hpp>
|
|||
// move
|
|||
#include <boost/move/utility_core.hpp>
|
|||
#if defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
|
|||
#include <boost/move/detail/fwd_macros.hpp>
|
|||
#endif
|
|||
|
|||
|
|||
namespace boost { |
|||
namespace container { |
|||
|
|||
//This trait is used to type-pun std::pair because in C++03
|
|||
//compilers std::pair is useless for C++11 features
|
|||
template<class T, bool> |
|||
struct node_internal_data_type |
|||
{ |
|||
typedef T type; |
|||
}; |
|||
|
|||
template<class T> |
|||
struct node_internal_data_type< T, true> |
|||
{ |
|||
typedef dtl::pair< typename dtl::remove_const<typename T::first_type>::type |
|||
, typename T::second_type> |
|||
type; |
|||
}; |
|||
|
|||
template <class T, class HookDefiner, bool PairBased = false> |
|||
struct base_node |
|||
: public HookDefiner::type |
|||
{ |
|||
public: |
|||
typedef T value_type; |
|||
typedef typename node_internal_data_type<T, PairBased && dtl::is_pair<T>::value>::type internal_type; |
|||
typedef typename HookDefiner::type hook_type; |
|||
|
|||
typedef typename dtl::aligned_storage<sizeof(T), dtl::alignment_of<T>::value>::type storage_t; |
|||
storage_t m_storage; |
|||
|
|||
#if defined(BOOST_GCC) && (BOOST_GCC >= 40600) && (BOOST_GCC < 80000)
|
|||
#pragma GCC diagnostic push
|
|||
#pragma GCC diagnostic ignored "-Wstrict-aliasing"
|
|||
#define BOOST_CONTAINER_DISABLE_ALIASING_WARNING
|
|||
# endif
|
|||
public: |
|||
|
|||
#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
|
|||
|
|||
template<class Alloc, class ...Args> |
|||
explicit base_node(Alloc &a, Args &&...args) |
|||
: hook_type() |
|||
{ |
|||
::boost::container::allocator_traits<Alloc>::construct |
|||
(a, &this->get_real_data(), ::boost::forward<Args>(args)...); |
|||
} |
|||
|
|||
#else //defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
|
|||
|
|||
#define BOOST_CONTAINER_BASE_NODE_CONSTRUCT_IMPL(N) \
|
|||
template< class Alloc BOOST_MOVE_I##N BOOST_MOVE_CLASS##N > \ |
|||
explicit base_node(Alloc &a BOOST_MOVE_I##N BOOST_MOVE_UREF##N)\ |
|||
: hook_type()\ |
|||
{\ |
|||
::boost::container::allocator_traits<Alloc>::construct\ |
|||
(a, &this->get_real_data() BOOST_MOVE_I##N BOOST_MOVE_FWD##N);\ |
|||
}\ |
|||
//
|
|||
BOOST_MOVE_ITERATE_0TO9(BOOST_CONTAINER_BASE_NODE_CONSTRUCT_IMPL) |
|||
#undef BOOST_CONTAINER_BASE_NODE_CONSTRUCT_IMPL
|
|||
|
|||
#endif // !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
|
|||
|
|||
template<class Alloc, class It> |
|||
explicit base_node(iterator_arg_t, Alloc &a, It it) |
|||
: hook_type() |
|||
{ |
|||
::boost::container::construct_in_place(a, &this->get_real_data(), it); |
|||
} |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE T &get_data() |
|||
{ return *move_detail::force_ptr<T*>(this->m_storage.data); } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE const T &get_data() const |
|||
{ return *move_detail::force_ptr<const T*>(this->m_storage.data); } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE internal_type &get_real_data() |
|||
{ return *move_detail::force_ptr<internal_type*>(this->m_storage.data); } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE const internal_type &get_real_data() const |
|||
{ return *move_detail::force_ptr<const internal_type*>(this->m_storage.data); } |
|||
|
|||
#if defined(BOOST_CONTAINER_DISABLE_ALIASING_WARNING)
|
|||
#pragma GCC diagnostic pop
|
|||
#undef BOOST_CONTAINER_DISABLE_ALIASING_WARNING
|
|||
# endif
|
|||
|
|||
template<class Alloc> |
|||
BOOST_CONTAINER_FORCEINLINE void destructor(Alloc &a) BOOST_NOEXCEPT |
|||
{ |
|||
allocator_traits<Alloc>::destroy |
|||
(a, &this->get_real_data()); |
|||
this->~base_node(); |
|||
} |
|||
|
|||
template<class Pair> |
|||
BOOST_CONTAINER_FORCEINLINE |
|||
typename dtl::enable_if< dtl::is_pair<Pair>, void >::type |
|||
do_assign(const Pair &p) |
|||
{ |
|||
typedef typename Pair::first_type first_type; |
|||
const_cast<typename dtl::remove_const<first_type>::type &>(this->get_real_data().first) = p.first; |
|||
this->get_real_data().second = p.second; |
|||
} |
|||
|
|||
template<class V> |
|||
BOOST_CONTAINER_FORCEINLINE |
|||
typename dtl::disable_if< dtl::is_pair<V>, void >::type |
|||
do_assign(const V &v) |
|||
{ this->get_real_data() = v; } |
|||
|
|||
template<class Pair> |
|||
BOOST_CONTAINER_FORCEINLINE |
|||
typename dtl::enable_if< dtl::is_pair<Pair>, void >::type |
|||
do_move_assign(Pair &p) |
|||
{ |
|||
typedef typename Pair::first_type first_type; |
|||
const_cast<first_type&>(this->get_real_data().first) = ::boost::move(p.first); |
|||
this->get_real_data().second = ::boost::move(p.second); |
|||
} |
|||
|
|||
template<class V> |
|||
BOOST_CONTAINER_FORCEINLINE |
|||
typename dtl::disable_if< dtl::is_pair<V>, void >::type |
|||
do_move_assign(V &v) |
|||
{ this->get_real_data() = ::boost::move(v); } |
|||
|
|||
private: |
|||
base_node(); |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE ~base_node() |
|||
{ } |
|||
}; |
|||
|
|||
|
|||
namespace dtl { |
|||
|
|||
BOOST_INTRUSIVE_INSTANTIATE_DEFAULT_TYPE_TMPLT(key_compare) |
|||
BOOST_INTRUSIVE_INSTANTIATE_DEFAULT_TYPE_TMPLT(key_equal) |
|||
BOOST_INTRUSIVE_INSTANTIATE_DEFAULT_TYPE_TMPLT(hasher) |
|||
BOOST_INTRUSIVE_INSTANTIATE_DEFAULT_TYPE_TMPLT(predicate_type) |
|||
BOOST_INTRUSIVE_INSTANTIATE_DEFAULT_TYPE_TMPLT(bucket_traits) |
|||
BOOST_INTRUSIVE_INSTANTIATE_DEFAULT_TYPE_TMPLT(bucket_type) |
|||
|
|||
template<class Allocator, class ICont> |
|||
struct node_alloc_holder |
|||
: public allocator_traits<Allocator>::template |
|||
portable_rebind_alloc<typename ICont::value_type>::type //NodeAlloc
|
|||
{ |
|||
//If the intrusive container is an associative container, obtain the predicate, which will
|
|||
//be of type node_compare<>. If not an associative container val_compare will be a "nat" type.
|
|||
typedef BOOST_INTRUSIVE_OBTAIN_TYPE_WITH_DEFAULT |
|||
( boost::container::dtl:: |
|||
, ICont, key_compare, dtl::nat) intrusive_key_compare; |
|||
|
|||
//If the intrusive container is a hash container, obtain the predicate, which will
|
|||
//be of type node_compare<>. If not an associative container val_equal will be a "nat" type.
|
|||
typedef BOOST_INTRUSIVE_OBTAIN_TYPE_WITH_DEFAULT |
|||
(boost::container::dtl:: |
|||
, ICont, key_equal, dtl::nat2) intrusive_val_equal; |
|||
typedef BOOST_INTRUSIVE_OBTAIN_TYPE_WITH_DEFAULT |
|||
(boost::container::dtl:: |
|||
, ICont, hasher, dtl::nat3) intrusive_val_hasher; |
|||
typedef BOOST_INTRUSIVE_OBTAIN_TYPE_WITH_DEFAULT |
|||
(boost::container::dtl:: |
|||
, ICont, bucket_traits, dtl::natN<0>) intrusive_bucket_traits; |
|||
typedef BOOST_INTRUSIVE_OBTAIN_TYPE_WITH_DEFAULT |
|||
(boost::container::dtl:: |
|||
, ICont, bucket_type, dtl::natN<1>) intrusive_bucket_type; |
|||
//In that case obtain the value predicate from the node predicate via predicate_type
|
|||
//if intrusive_key_compare is node_compare<>, nat otherwise
|
|||
typedef BOOST_INTRUSIVE_OBTAIN_TYPE_WITH_DEFAULT |
|||
(boost::container::dtl:: |
|||
, intrusive_val_equal |
|||
, predicate_type, dtl::nat2) val_equal; |
|||
typedef BOOST_INTRUSIVE_OBTAIN_TYPE_WITH_DEFAULT |
|||
(boost::container::dtl:: |
|||
, intrusive_val_hasher |
|||
, predicate_type, dtl::nat3) val_hasher; |
|||
|
|||
typedef allocator_traits<Allocator> allocator_traits_type; |
|||
typedef typename allocator_traits_type::value_type val_type; |
|||
typedef ICont intrusive_container; |
|||
typedef typename ICont::value_type Node; |
|||
typedef typename allocator_traits_type::template |
|||
portable_rebind_alloc<Node>::type NodeAlloc; |
|||
typedef allocator_traits<NodeAlloc> node_allocator_traits_type; |
|||
typedef dtl::allocator_version_traits<NodeAlloc> node_allocator_version_traits_type; |
|||
typedef Allocator ValAlloc; |
|||
typedef typename node_allocator_traits_type::pointer NodePtr; |
|||
typedef dtl::scoped_deallocator<NodeAlloc> Deallocator; |
|||
typedef typename node_allocator_traits_type::size_type size_type; |
|||
typedef typename node_allocator_traits_type::difference_type difference_type; |
|||
typedef dtl::integral_constant<unsigned, |
|||
boost::container::dtl:: |
|||
version<NodeAlloc>::value> alloc_version; |
|||
typedef typename ICont::iterator icont_iterator; |
|||
typedef typename ICont::const_iterator icont_citerator; |
|||
typedef allocator_node_destroyer<NodeAlloc> Destroyer; |
|||
typedef allocator_traits<NodeAlloc> NodeAllocTraits; |
|||
typedef allocator_version_traits<NodeAlloc> AllocVersionTraits; |
|||
|
|||
private: |
|||
BOOST_COPYABLE_AND_MOVABLE(node_alloc_holder) |
|||
|
|||
public: |
|||
|
|||
//Constructors for sequence containers
|
|||
BOOST_CONTAINER_FORCEINLINE node_alloc_holder() |
|||
{} |
|||
|
|||
explicit node_alloc_holder(const intrusive_bucket_traits& bt) |
|||
: m_icont(bt) |
|||
{} |
|||
|
|||
explicit node_alloc_holder(const ValAlloc &a) |
|||
: NodeAlloc(a) |
|||
{} |
|||
|
|||
node_alloc_holder(const intrusive_bucket_traits& bt, const ValAlloc& a) |
|||
: NodeAlloc(a) |
|||
, m_icont(bt) |
|||
{} |
|||
|
|||
//Constructors for associative containers
|
|||
node_alloc_holder(const intrusive_key_compare &c, const ValAlloc &a) |
|||
: NodeAlloc(a), m_icont(c) |
|||
{} |
|||
|
|||
node_alloc_holder(const intrusive_bucket_traits & bt, const val_hasher &hf, const val_equal &eql, const ValAlloc &a) |
|||
: NodeAlloc(a) |
|||
, m_icont(bt |
|||
, typename ICont::hasher(hf) |
|||
, typename ICont::key_equal(eql)) |
|||
{} |
|||
|
|||
node_alloc_holder(const intrusive_bucket_traits& bt, const val_hasher &hf, const ValAlloc &a) |
|||
: NodeAlloc(a) |
|||
, m_icont(bt |
|||
, typename ICont::hasher(hf) |
|||
, typename ICont::key_equal()) |
|||
{} |
|||
|
|||
node_alloc_holder(const intrusive_bucket_traits& bt, const val_hasher &hf) |
|||
: m_icont(bt |
|||
, typename ICont::hasher(hf) |
|||
, typename ICont::key_equal()) |
|||
{} |
|||
|
|||
explicit node_alloc_holder(const node_alloc_holder &x) |
|||
: NodeAlloc(NodeAllocTraits::select_on_container_copy_construction(x.node_alloc())) |
|||
{} |
|||
|
|||
node_alloc_holder(const node_alloc_holder &x, const intrusive_key_compare &c) |
|||
: NodeAlloc(NodeAllocTraits::select_on_container_copy_construction(x.node_alloc())) |
|||
, m_icont(c) |
|||
{} |
|||
|
|||
node_alloc_holder(const node_alloc_holder &x, const intrusive_bucket_traits& bt, const val_hasher &hf, const val_equal &eql) |
|||
: NodeAlloc(NodeAllocTraits::select_on_container_copy_construction(x.node_alloc())) |
|||
, m_icont( bt |
|||
, typename ICont::hasher(hf) |
|||
, typename ICont::key_equal(eql)) |
|||
{} |
|||
|
|||
node_alloc_holder(const val_hasher &hf, const intrusive_bucket_traits& bt, const val_equal &eql) |
|||
: m_icont(bt |
|||
, typename ICont::hasher(hf) |
|||
, typename ICont::key_equal(eql)) |
|||
{} |
|||
|
|||
explicit node_alloc_holder(BOOST_RV_REF(node_alloc_holder) x) |
|||
: NodeAlloc(boost::move(BOOST_MOVE_TO_LV(x).node_alloc())) |
|||
{ this->icont().swap(x.icont()); } |
|||
|
|||
explicit node_alloc_holder(const intrusive_key_compare &c) |
|||
: m_icont(c) |
|||
{} |
|||
|
|||
//helpers for move assignments
|
|||
explicit node_alloc_holder(BOOST_RV_REF(node_alloc_holder) x, const intrusive_key_compare &c) |
|||
: NodeAlloc(boost::move(BOOST_MOVE_TO_LV(x).node_alloc())), m_icont(c) |
|||
{ this->icont().swap(x.icont()); } |
|||
|
|||
explicit node_alloc_holder(BOOST_RV_REF(node_alloc_holder) x, const intrusive_bucket_traits& bt, const val_hasher &hf, const val_equal &eql) |
|||
: NodeAlloc(boost::move(BOOST_MOVE_TO_LV(x).node_alloc())) |
|||
, m_icont( bt |
|||
, typename ICont::hasher(hf) |
|||
, typename ICont::key_equal(eql)) |
|||
{ this->icont().swap(BOOST_MOVE_TO_LV(x).icont()); } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE void copy_assign_alloc(const node_alloc_holder &x) |
|||
{ |
|||
dtl::bool_<allocator_traits_type::propagate_on_container_copy_assignment::value> flag; |
|||
dtl::assign_alloc( static_cast<NodeAlloc &>(*this) |
|||
, static_cast<const NodeAlloc &>(x), flag); |
|||
} |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE void move_assign_alloc( node_alloc_holder &x) |
|||
{ |
|||
dtl::bool_<allocator_traits_type::propagate_on_container_move_assignment::value> flag; |
|||
dtl::move_alloc( static_cast<NodeAlloc &>(*this) |
|||
, static_cast<NodeAlloc &>(x), flag); |
|||
} |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE ~node_alloc_holder() |
|||
{ this->clear(alloc_version()); } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE size_type max_size() const |
|||
{ return allocator_traits_type::max_size(this->node_alloc()); } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE NodePtr allocate_one() |
|||
{ return AllocVersionTraits::allocate_one(this->node_alloc()); } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE void deallocate_one(const NodePtr &p) |
|||
{ AllocVersionTraits::deallocate_one(this->node_alloc(), p); } |
|||
|
|||
#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
|
|||
|
|||
template<class ...Args> |
|||
NodePtr create_node(Args &&...args) |
|||
{ |
|||
NodePtr p = this->allocate_one(); |
|||
NodeAlloc &nalloc = this->node_alloc(); |
|||
Deallocator node_deallocator(p, nalloc); |
|||
::new(boost::movelib::iterator_to_raw_pointer(p), boost_container_new_t()) |
|||
Node(nalloc, boost::forward<Args>(args)...); |
|||
node_deallocator.release(); |
|||
return (p); |
|||
} |
|||
|
|||
#else //defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
|
|||
|
|||
#define BOOST_CONTAINER_NODE_ALLOC_HOLDER_CONSTRUCT_IMPL(N) \
|
|||
BOOST_MOVE_TMPL_LT##N BOOST_MOVE_CLASS##N BOOST_MOVE_GT##N \ |
|||
NodePtr create_node(BOOST_MOVE_UREF##N)\ |
|||
{\ |
|||
NodePtr p = this->allocate_one();\ |
|||
NodeAlloc &nalloc = this->node_alloc();\ |
|||
Deallocator node_deallocator(p, nalloc);\ |
|||
::new(boost::movelib::iterator_to_raw_pointer(p), boost_container_new_t())\ |
|||
Node(nalloc BOOST_MOVE_I##N BOOST_MOVE_FWD##N);\ |
|||
node_deallocator.release();\ |
|||
return (p);\ |
|||
}\ |
|||
//
|
|||
BOOST_MOVE_ITERATE_0TO9(BOOST_CONTAINER_NODE_ALLOC_HOLDER_CONSTRUCT_IMPL) |
|||
#undef BOOST_CONTAINER_NODE_ALLOC_HOLDER_CONSTRUCT_IMPL
|
|||
|
|||
#endif // !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
|
|||
|
|||
template<class It> |
|||
NodePtr create_node_from_it(const It &it) |
|||
{ |
|||
NodePtr p = this->allocate_one(); |
|||
NodeAlloc &nalloc = this->node_alloc(); |
|||
Deallocator node_deallocator(p, nalloc); |
|||
::new(boost::movelib::iterator_to_raw_pointer(p), boost_container_new_t()) |
|||
Node(iterator_arg_t(), nalloc, it); |
|||
node_deallocator.release(); |
|||
return (p); |
|||
} |
|||
|
|||
template<class KeyConvertible> |
|||
NodePtr create_node_from_key(BOOST_FWD_REF(KeyConvertible) key) |
|||
{ |
|||
NodePtr p = this->allocate_one(); |
|||
BOOST_CONTAINER_TRY{ |
|||
::new(boost::movelib::iterator_to_raw_pointer(p), boost_container_new_t()) Node; |
|||
NodeAlloc &na = this->node_alloc(); |
|||
node_allocator_traits_type::construct |
|||
(na, dtl::addressof(p->get_real_data().first), boost::forward<KeyConvertible>(key)); |
|||
BOOST_CONTAINER_TRY{ |
|||
node_allocator_traits_type::construct(na, dtl::addressof(p->get_real_data().second)); |
|||
} |
|||
BOOST_CONTAINER_CATCH(...){ |
|||
node_allocator_traits_type::destroy(na, dtl::addressof(p->get_real_data().first)); |
|||
BOOST_CONTAINER_RETHROW; |
|||
} |
|||
BOOST_CONTAINER_CATCH_END |
|||
} |
|||
BOOST_CONTAINER_CATCH(...) { |
|||
p->destroy_header(); |
|||
this->node_alloc().deallocate(p, 1); |
|||
BOOST_CONTAINER_RETHROW |
|||
} |
|||
BOOST_CONTAINER_CATCH_END |
|||
return (p); |
|||
} |
|||
|
|||
void destroy_node(const NodePtr &nodep) |
|||
{ |
|||
boost::movelib::to_raw_pointer(nodep)->destructor(this->node_alloc()); |
|||
this->deallocate_one(nodep); |
|||
} |
|||
|
|||
void swap(node_alloc_holder &x) |
|||
{ |
|||
this->icont().swap(x.icont()); |
|||
dtl::bool_<allocator_traits_type::propagate_on_container_swap::value> flag; |
|||
dtl::swap_alloc(this->node_alloc(), x.node_alloc(), flag); |
|||
} |
|||
|
|||
template<class FwdIterator, class Inserter> |
|||
void allocate_many_and_construct |
|||
(FwdIterator beg, size_type n, Inserter inserter) |
|||
{ |
|||
if(n){ |
|||
typedef typename node_allocator_version_traits_type::multiallocation_chain multiallocation_chain_t; |
|||
|
|||
//Try to allocate memory in a single block
|
|||
typedef typename multiallocation_chain_t::iterator multialloc_iterator_t; |
|||
multiallocation_chain_t chain; |
|||
NodeAlloc &nalloc = this->node_alloc(); |
|||
node_allocator_version_traits_type::allocate_individual(nalloc, n, chain); |
|||
multialloc_iterator_t itbeg = chain.begin(); |
|||
multialloc_iterator_t itlast = chain.last(); |
|||
chain.clear(); |
|||
|
|||
Node *p = 0; |
|||
BOOST_CONTAINER_TRY{ |
|||
Deallocator node_deallocator(NodePtr(), nalloc); |
|||
dtl::scoped_node_destructor<NodeAlloc> sdestructor(nalloc, 0); |
|||
while(n){ |
|||
--n; |
|||
p = boost::movelib::iterator_to_raw_pointer(itbeg); |
|||
++itbeg; //Increment iterator before overwriting pointed memory
|
|||
//This does not throw
|
|||
::new(boost::movelib::iterator_to_raw_pointer(p), boost_container_new_t()) |
|||
Node(iterator_arg_t(), nalloc, beg); |
|||
sdestructor.set(p); |
|||
++beg; |
|||
//This can throw in some containers (predicate might throw).
|
|||
//(sdestructor will destruct the node and node_deallocator will deallocate it in case of exception)
|
|||
inserter(*p); |
|||
sdestructor.release(); |
|||
} |
|||
sdestructor.release(); |
|||
node_deallocator.release(); |
|||
} |
|||
BOOST_CONTAINER_CATCH(...){ |
|||
chain.incorporate_after(chain.last(), &*itbeg, &*itlast, n); |
|||
node_allocator_version_traits_type::deallocate_individual(this->node_alloc(), chain); |
|||
BOOST_CONTAINER_RETHROW |
|||
} |
|||
BOOST_CONTAINER_CATCH_END |
|||
} |
|||
} |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE void clear(version_1) |
|||
{ this->icont().clear_and_dispose(Destroyer(this->node_alloc())); } |
|||
|
|||
void clear(version_2) |
|||
{ |
|||
typename NodeAlloc::multiallocation_chain chain; |
|||
allocator_node_destroyer_and_chain_builder<NodeAlloc> builder(this->node_alloc(), chain); |
|||
this->icont().clear_and_dispose(builder); |
|||
//BOOST_STATIC_ASSERT((::boost::has_move_emulation_enabled<typename NodeAlloc::multiallocation_chain>::value == true));
|
|||
if(!chain.empty()) |
|||
this->node_alloc().deallocate_individual(chain); |
|||
} |
|||
|
|||
icont_iterator erase_range(const icont_iterator &first, const icont_iterator &last, version_1) |
|||
{ return this->icont().erase_and_dispose(first, last, Destroyer(this->node_alloc())); } |
|||
|
|||
icont_iterator erase_range(const icont_iterator &first, const icont_iterator &last, version_2) |
|||
{ |
|||
NodeAlloc & nalloc = this->node_alloc(); |
|||
typename NodeAlloc::multiallocation_chain chain; |
|||
allocator_node_destroyer_and_chain_builder<NodeAlloc> chain_builder(nalloc, chain); |
|||
icont_iterator ret_it = this->icont().erase_and_dispose(first, last, chain_builder); |
|||
nalloc.deallocate_individual(chain); |
|||
return ret_it; |
|||
} |
|||
|
|||
template<class Key> |
|||
BOOST_CONTAINER_FORCEINLINE size_type erase_key(const Key& k, version_1) |
|||
{ return this->icont().erase_and_dispose(k, Destroyer(this->node_alloc())); } |
|||
|
|||
template<class Key> |
|||
BOOST_CONTAINER_FORCEINLINE size_type erase_key(const Key& k, version_2) |
|||
{ |
|||
allocator_multialloc_chain_node_deallocator<NodeAlloc> chain_holder(this->node_alloc()); |
|||
return this->icont().erase_and_dispose(k, chain_holder.get_chain_builder()); |
|||
} |
|||
|
|||
protected: |
|||
struct cloner |
|||
{ |
|||
BOOST_CONTAINER_FORCEINLINE explicit cloner(node_alloc_holder &holder) |
|||
: m_holder(holder) |
|||
{} |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE NodePtr operator()(const Node &other) const |
|||
{ return m_holder.create_node(other.get_real_data()); } |
|||
|
|||
node_alloc_holder &m_holder; |
|||
}; |
|||
|
|||
struct move_cloner |
|||
{ |
|||
BOOST_CONTAINER_FORCEINLINE move_cloner(node_alloc_holder &holder) |
|||
: m_holder(holder) |
|||
{} |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE NodePtr operator()(Node &other) |
|||
{ //Use get_real_data() instead of get_real_data to allow moving const key in [multi]map
|
|||
return m_holder.create_node(::boost::move(other.get_real_data())); |
|||
} |
|||
|
|||
node_alloc_holder &m_holder; |
|||
}; |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE ICont &non_const_icont() const |
|||
{ return const_cast<ICont&>(this->m_icont); } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE NodeAlloc &node_alloc() |
|||
{ return static_cast<NodeAlloc &>(*this); } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE const NodeAlloc &node_alloc() const |
|||
{ return static_cast<const NodeAlloc &>(*this); } |
|||
|
|||
public: |
|||
BOOST_CONTAINER_FORCEINLINE ICont &icont() |
|||
{ return this->m_icont; } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE const ICont &icont() const |
|||
{ return this->m_icont; } |
|||
|
|||
protected: |
|||
//The intrusive container
|
|||
ICont m_icont; |
|||
}; |
|||
|
|||
template<class Node, class KeyOfValue> |
|||
struct key_of_node : KeyOfValue |
|||
{ |
|||
typedef typename KeyOfValue::type type; |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE key_of_node() |
|||
{} |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE const type& operator()(const Node& x) const |
|||
{ return this->KeyOfValue::operator()(x.get_data()); } |
|||
}; |
|||
|
|||
|
|||
} //namespace dtl {
|
|||
} //namespace container {
|
|||
} //namespace boost {
|
|||
|
|||
#include <boost/container/detail/config_end.hpp>
|
|||
|
|||
#endif // BOOST_CONTAINER_DETAIL_NODE_ALLOC_HPP_
|
@ -0,0 +1,607 @@ |
|||
//////////////////////////////////////////////////////////////////////////////
|
|||
//
|
|||
// (C) Copyright Ion Gaztanaga 2005-2013.
|
|||
//
|
|||
// 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_CONTAINER_DETAIL_PAIR_HPP
|
|||
#define BOOST_CONTAINER_CONTAINER_DETAIL_PAIR_HPP
|
|||
|
|||
#ifndef BOOST_CONFIG_HPP
|
|||
# include <boost/config.hpp>
|
|||
#endif
|
|||
|
|||
#if defined(BOOST_HAS_PRAGMA_ONCE)
|
|||
# pragma once
|
|||
#endif
|
|||
|
|||
#include <boost/container/detail/config_begin.hpp>
|
|||
#include <boost/container/container_fwd.hpp>
|
|||
#include <boost/container/detail/workaround.hpp>
|
|||
|
|||
#include <boost/static_assert.hpp>
|
|||
#include <boost/container/detail/mpl.hpp>
|
|||
#include <boost/container/detail/type_traits.hpp>
|
|||
#include <boost/container/detail/mpl.hpp>
|
|||
#include <boost/container/detail/std_fwd.hpp>
|
|||
#include <boost/container/detail/is_pair.hpp>
|
|||
#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
|
|||
# include <boost/container/detail/variadic_templates_tools.hpp>
|
|||
#endif
|
|||
#include <boost/move/adl_move_swap.hpp> //swap
|
|||
|
|||
#include <boost/intrusive/detail/minimal_pair_header.hpp> //pair
|
|||
#include <boost/move/utility_core.hpp>
|
|||
#include <boost/move/detail/fwd_macros.hpp>
|
|||
|
|||
namespace boost { |
|||
namespace container { |
|||
namespace pair_impl { |
|||
|
|||
template <class TupleClass> |
|||
struct is_boost_tuple |
|||
{ |
|||
static const bool value = false; |
|||
}; |
|||
|
|||
template < |
|||
class T0, class T1, class T2, |
|||
class T3, class T4, class T5, |
|||
class T6, class T7, class T8, |
|||
class T9> |
|||
struct is_boost_tuple< boost::tuples::tuple<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9> > |
|||
{ |
|||
static const bool value = true; |
|||
}; |
|||
|
|||
template<class Tuple> |
|||
struct disable_if_boost_tuple |
|||
: boost::container::dtl::disable_if< is_boost_tuple<Tuple> > |
|||
{}; |
|||
|
|||
template<class T> |
|||
struct is_tuple_null |
|||
{ |
|||
static const bool value = false; |
|||
}; |
|||
|
|||
template<> |
|||
struct is_tuple_null<boost::tuples::null_type> |
|||
{ |
|||
static const bool value = true; |
|||
}; |
|||
|
|||
} //namespace detail {
|
|||
|
|||
#ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
|
|||
|
|||
template <int Dummy = 0> |
|||
struct std_piecewise_construct_holder |
|||
{ |
|||
static ::std::piecewise_construct_t *dummy; |
|||
}; |
|||
|
|||
template <int Dummy> |
|||
::std::piecewise_construct_t *std_piecewise_construct_holder<Dummy>::dummy = |
|||
reinterpret_cast< ::std::piecewise_construct_t *>(0x01234); //Avoid sanitizer errors on references to null pointers
|
|||
|
|||
#else
|
|||
|
|||
//! The piecewise_construct_t struct is an empty structure type used as a unique type to
|
|||
//! disambiguate used to disambiguate between different functions that take two tuple arguments.
|
|||
typedef unspecified piecewise_construct_t; |
|||
|
|||
#endif //#ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
|
|||
|
|||
//! A instance of type
|
|||
//! piecewise_construct_t
|
|||
static piecewise_construct_t piecewise_construct = BOOST_CONTAINER_DOC1ST(unspecified, *std_piecewise_construct_holder<>::dummy); |
|||
|
|||
///@cond
|
|||
|
|||
namespace dtl { |
|||
|
|||
struct piecewise_construct_use |
|||
{ |
|||
//Avoid warnings of unused "piecewise_construct"
|
|||
piecewise_construct_use() |
|||
{ (void)&::boost::container::piecewise_construct; } |
|||
}; |
|||
|
|||
struct pair_nat; |
|||
|
|||
template<typename T, typename U, typename V> |
|||
void get(T); //to enable ADL
|
|||
|
|||
///@endcond
|
|||
|
|||
#ifdef _LIBCPP_DEPRECATED_ABI_DISABLE_PAIR_TRIVIAL_COPY_CTOR
|
|||
//Libc++, in some versions, has an ABI breakage that needs some
|
|||
//padding in dtl::pair, as "std::pair::first" is not at offset zero.
|
|||
//See: https://reviews.llvm.org/D56357 for more information.
|
|||
//
|
|||
template <class T1, class T2, std::size_t N> |
|||
struct pair_padding |
|||
{ |
|||
char padding[N]; |
|||
}; |
|||
|
|||
template <class T1, class T2> |
|||
struct pair_padding<T1, T2, 0> |
|||
{ |
|||
}; |
|||
|
|||
template <class T1, class T2> |
|||
struct simple_pair |
|||
{ |
|||
T1 first; |
|||
T2 second; |
|||
}; |
|||
|
|||
#endif
|
|||
|
|||
template <class T1, class T2> |
|||
struct pair |
|||
#ifdef _LIBCPP_DEPRECATED_ABI_DISABLE_PAIR_TRIVIAL_COPY_CTOR
|
|||
: pair_padding<T1, T2, sizeof(std::pair<T1, T2>) - sizeof(simple_pair<T1, T2>)> |
|||
#endif
|
|||
{ |
|||
private: |
|||
BOOST_COPYABLE_AND_MOVABLE(pair) |
|||
|
|||
public: |
|||
typedef T1 first_type; |
|||
typedef T2 second_type; |
|||
|
|||
T1 first; |
|||
T2 second; |
|||
|
|||
//Default constructor
|
|||
pair() |
|||
: first(), second() |
|||
{ |
|||
BOOST_STATIC_ASSERT((sizeof(std::pair<T1, T2>) == sizeof(pair<T1, T2>))); |
|||
} |
|||
|
|||
//pair copy assignment
|
|||
pair(const pair& x) |
|||
: first(x.first), second(x.second) |
|||
{ |
|||
BOOST_STATIC_ASSERT((sizeof(std::pair<T1, T2>) == sizeof(pair<T1, T2>))); |
|||
} |
|||
|
|||
//pair move constructor
|
|||
pair(BOOST_RV_REF(pair) p) |
|||
: first(::boost::move(BOOST_MOVE_TO_LV(p).first)), second(::boost::move(BOOST_MOVE_TO_LV(p).second)) |
|||
{ |
|||
BOOST_STATIC_ASSERT((sizeof(std::pair<T1, T2>) == sizeof(pair<T1, T2>))); |
|||
} |
|||
|
|||
template <class D, class S> |
|||
pair(const pair<D, S> &p) |
|||
: first(p.first), second(p.second) |
|||
{ |
|||
BOOST_STATIC_ASSERT((sizeof(std::pair<T1, T2>) == sizeof(pair<T1, T2>))); |
|||
} |
|||
|
|||
template <class D, class S> |
|||
pair(BOOST_RV_REF_BEG pair<D, S> BOOST_RV_REF_END p) |
|||
: first(::boost::move(BOOST_MOVE_TO_LV(p).first)), second(::boost::move(BOOST_MOVE_TO_LV(p).second)) |
|||
{ |
|||
BOOST_STATIC_ASSERT((sizeof(std::pair<T1, T2>) == sizeof(pair<T1, T2>))); |
|||
} |
|||
|
|||
//pair from two values
|
|||
pair(const T1 &t1, const T2 &t2) |
|||
: first(t1) |
|||
, second(t2) |
|||
{ |
|||
BOOST_STATIC_ASSERT((sizeof(std::pair<T1, T2>) == sizeof(pair<T1, T2>))); |
|||
} |
|||
|
|||
template<class U, class V> |
|||
pair(BOOST_FWD_REF(U) u, BOOST_FWD_REF(V) v) |
|||
: first(::boost::forward<U>(u)) |
|||
, second(::boost::forward<V>(v)) |
|||
{ |
|||
BOOST_STATIC_ASSERT((sizeof(std::pair<T1, T2>) == sizeof(pair<T1, T2>))); |
|||
} |
|||
|
|||
//And now compatibility with std::pair
|
|||
pair(const std::pair<T1, T2>& x) |
|||
: first(x.first), second(x.second) |
|||
{ |
|||
BOOST_STATIC_ASSERT((sizeof(std::pair<T1, T2>) == sizeof(pair<T1, T2>))); |
|||
} |
|||
|
|||
template <class D, class S> |
|||
pair(const std::pair<D, S>& p) |
|||
: first(p.first), second(p.second) |
|||
{ |
|||
BOOST_STATIC_ASSERT((sizeof(std::pair<T1, T2>) == sizeof(pair<T1, T2>))); |
|||
} |
|||
|
|||
pair(BOOST_RV_REF_BEG std::pair<T1, T2> BOOST_RV_REF_END p) |
|||
: first(::boost::move(BOOST_MOVE_TO_LV(p).first)), second(::boost::move(BOOST_MOVE_TO_LV(p).second)) |
|||
{ |
|||
BOOST_STATIC_ASSERT((sizeof(std::pair<T1, T2>) == sizeof(pair<T1, T2>))); |
|||
} |
|||
|
|||
template <class D, class S> |
|||
pair(BOOST_RV_REF_BEG std::pair<D, S> BOOST_RV_REF_END p) |
|||
: first(::boost::move(BOOST_MOVE_TO_LV(p).first)), second(::boost::move(BOOST_MOVE_TO_LV(p).second)) |
|||
{ |
|||
BOOST_STATIC_ASSERT((sizeof(std::pair<T1, T2>) == sizeof(pair<T1, T2>))); |
|||
} |
|||
|
|||
#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
|
|||
template< class KeyType, class ...Args> |
|||
pair(try_emplace_t, BOOST_FWD_REF(KeyType) k, Args && ...args) |
|||
: first(boost::forward<KeyType>(k)), second(::boost::forward<Args>(args)...)\ |
|||
{ |
|||
BOOST_STATIC_ASSERT((sizeof(std::pair<T1, T2>) == sizeof(pair<T1, T2>))); |
|||
} |
|||
#else
|
|||
|
|||
//piecewise construction from boost::tuple
|
|||
#define BOOST_PAIR_TRY_EMPLACE_CONSTRUCT_CODE(N)\
|
|||
template< class KeyType BOOST_MOVE_I##N BOOST_MOVE_CLASS##N > \ |
|||
pair( try_emplace_t, BOOST_FWD_REF(KeyType) k BOOST_MOVE_I##N BOOST_MOVE_UREF##N )\ |
|||
: first(boost::forward<KeyType>(k)), second(BOOST_MOVE_FWD##N)\ |
|||
{\ |
|||
BOOST_STATIC_ASSERT((sizeof(std::pair<T1, T2>) == sizeof(pair<T1, T2>)));\ |
|||
}\ |
|||
//
|
|||
BOOST_MOVE_ITERATE_0TO9(BOOST_PAIR_TRY_EMPLACE_CONSTRUCT_CODE) |
|||
#undef BOOST_PAIR_TRY_EMPLACE_CONSTRUCT_CODE
|
|||
|
|||
#endif //BOOST_NO_CXX11_VARIADIC_TEMPLATES
|
|||
|
|||
//piecewise construction from boost::tuple
|
|||
#define BOOST_PAIR_PIECEWISE_CONSTRUCT_BOOST_TUPLE_CODE(N,M)\
|
|||
template< template<class, class, class, class, class, class, class, class, class, class> class BoostTuple \ |
|||
BOOST_MOVE_I_IF(BOOST_MOVE_OR(N,M)) BOOST_MOVE_CLASS##N BOOST_MOVE_I_IF(BOOST_MOVE_AND(N,M)) BOOST_MOVE_CLASSQ##M > \ |
|||
pair( piecewise_construct_t\ |
|||
, BoostTuple<BOOST_MOVE_TARG##N BOOST_MOVE_I##N BOOST_MOVE_REPEAT(BOOST_MOVE_SUB(10,N),::boost::tuples::null_type)> p\ |
|||
, BoostTuple<BOOST_MOVE_TARGQ##M BOOST_MOVE_I##M BOOST_MOVE_REPEAT(BOOST_MOVE_SUB(10,M),::boost::tuples::null_type)> q\ |
|||
, typename dtl::enable_if_c\ |
|||
< pair_impl::is_boost_tuple< BoostTuple<BOOST_MOVE_TARG##N BOOST_MOVE_I##N BOOST_MOVE_REPEAT(BOOST_MOVE_SUB(10,N),::boost::tuples::null_type)> >::value &&\ |
|||
!(pair_impl::is_tuple_null<BOOST_MOVE_LAST_TARG##N>::value || pair_impl::is_tuple_null<BOOST_MOVE_LAST_TARGQ##M>::value) \ |
|||
>::type* = 0\ |
|||
)\ |
|||
: first(BOOST_MOVE_TMPL_GET##N), second(BOOST_MOVE_TMPL_GETQ##M)\ |
|||
{ (void)p; (void)q;\ |
|||
BOOST_STATIC_ASSERT((sizeof(std::pair<T1, T2>) == sizeof(pair<T1, T2>)));\ |
|||
}\ |
|||
//
|
|||
BOOST_MOVE_ITER2D_0TOMAX(9, BOOST_PAIR_PIECEWISE_CONSTRUCT_BOOST_TUPLE_CODE) |
|||
#undef BOOST_PAIR_PIECEWISE_CONSTRUCT_BOOST_TUPLE_CODE
|
|||
|
|||
//piecewise construction from variadic tuple (with delegating constructors)
|
|||
#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
|
|||
# if !defined(BOOST_CONTAINER_NO_CXX11_DELEGATING_CONSTRUCTORS)
|
|||
private: |
|||
template<template<class ...> class Tuple, class... Args1, class... Args2, size_t... Indexes1, size_t... Indexes2> |
|||
pair(Tuple<Args1...>& t1, Tuple<Args2...>& t2, index_tuple<Indexes1...>, index_tuple<Indexes2...>) |
|||
: first (::boost::forward<Args1>(get<Indexes1>(t1))...) |
|||
, second(::boost::forward<Args2>(get<Indexes2>(t2))...) |
|||
{ (void) t1; (void)t2; } |
|||
|
|||
public: |
|||
template< template<class ...> class Tuple, class... Args1, class... Args2 |
|||
, class = typename pair_impl::disable_if_boost_tuple< Tuple<Args1...> >::type> |
|||
pair(piecewise_construct_t, Tuple<Args1...> t1, Tuple<Args2...> t2) |
|||
: pair(t1, t2, typename build_number_seq<sizeof...(Args1)>::type(), typename build_number_seq<sizeof...(Args2)>::type()) |
|||
{ |
|||
BOOST_STATIC_ASSERT((sizeof(std::pair<T1, T2>) == sizeof(pair<T1, T2>))); |
|||
} |
|||
# else
|
|||
//piecewise construction from variadic tuple (suboptimal, without delegating constructors)
|
|||
private: |
|||
template<typename T, template<class ...> class Tuple, typename... Args> |
|||
static T build_from_args(Tuple<Args...>&& t) |
|||
{ return do_build_from_args<T>(::boost::move(t), typename build_number_seq<sizeof...(Args)>::type()); } |
|||
|
|||
template<typename T, template<class ...> class Tuple, typename... Args, std::size_t... Indexes> |
|||
static T do_build_from_args(Tuple<Args...> && t, const index_tuple<Indexes...>&) |
|||
{ (void)t; return T(::boost::forward<Args>(get<Indexes>(t))...); } |
|||
|
|||
public: |
|||
template< template<class ...> class Tuple, class... Args1, class... Args2 |
|||
, class = typename pair_impl::disable_if_boost_tuple< Tuple<Args1...> >::type> |
|||
pair(piecewise_construct_t, Tuple<Args1...> t1, Tuple<Args2...> t2) |
|||
: first (build_from_args<first_type> (::boost::move(t1))) |
|||
, second (build_from_args<second_type>(::boost::move(t2))) |
|||
{ |
|||
BOOST_STATIC_ASSERT((sizeof(std::pair<T1, T2>) == sizeof(pair<T1, T2>))); |
|||
} |
|||
# endif //BOOST_NO_CXX11_VARIADIC_TEMPLATES
|
|||
#elif defined(BOOST_MSVC) && (_CPPLIB_VER == 520)
|
|||
//MSVC 2010 tuple implementation
|
|||
#define BOOST_PAIR_PIECEWISE_CONSTRUCT_MSVC2010_TUPLE_CODE(N,M)\
|
|||
template< template<class, class, class, class, class, class, class, class, class, class> class StdTuple \ |
|||
BOOST_MOVE_I_IF(BOOST_MOVE_OR(N,M)) BOOST_MOVE_CLASS##N BOOST_MOVE_I_IF(BOOST_MOVE_AND(N,M)) BOOST_MOVE_CLASSQ##M > \ |
|||
pair( piecewise_construct_t\ |
|||
, StdTuple<BOOST_MOVE_TARG##N BOOST_MOVE_I##N BOOST_MOVE_REPEAT(BOOST_MOVE_SUB(10,N),::std::tr1::_Nil)> p\ |
|||
, StdTuple<BOOST_MOVE_TARGQ##M BOOST_MOVE_I##M BOOST_MOVE_REPEAT(BOOST_MOVE_SUB(10,M),::std::tr1::_Nil)> q)\ |
|||
: first(BOOST_MOVE_GET_IDX##N), second(BOOST_MOVE_GET_IDXQ##M)\ |
|||
{ (void)p; (void)q;\ |
|||
BOOST_STATIC_ASSERT((sizeof(std::pair<T1, T2>) == sizeof(pair<T1, T2>)));\ |
|||
}\ |
|||
//
|
|||
BOOST_MOVE_ITER2D_0TOMAX(9, BOOST_PAIR_PIECEWISE_CONSTRUCT_MSVC2010_TUPLE_CODE) |
|||
#undef BOOST_PAIR_PIECEWISE_CONSTRUCT_MSVC2010_TUPLE_CODE
|
|||
#elif defined(BOOST_MSVC) && (_CPPLIB_VER == 540)
|
|||
#if _VARIADIC_MAX >= 9
|
|||
#define BOOST_PAIR_PIECEWISE_CONSTRUCT_MSVC2012_TUPLE_MAX_IT 9
|
|||
#else
|
|||
#define BOOST_PAIR_PIECEWISE_CONSTRUCT_MSVC2012_TUPLE_MAX_IT BOOST_MOVE_ADD(_VARIADIC_MAX, 1)
|
|||
#endif
|
|||
|
|||
//MSVC 2012 tuple implementation
|
|||
#define BOOST_PAIR_PIECEWISE_CONSTRUCT_MSVC2012_TUPLE_CODE(N,M)\
|
|||
template< template<BOOST_MOVE_REPEAT(_VARIADIC_MAX, class), class, class, class> class StdTuple \ |
|||
BOOST_MOVE_I_IF(BOOST_MOVE_OR(N,M)) BOOST_MOVE_CLASS##N BOOST_MOVE_I_IF(BOOST_MOVE_AND(N,M)) BOOST_MOVE_CLASSQ##M > \ |
|||
pair( piecewise_construct_t\ |
|||
, StdTuple<BOOST_MOVE_TARG##N BOOST_MOVE_I##N BOOST_MOVE_REPEAT(BOOST_MOVE_SUB(BOOST_MOVE_ADD(_VARIADIC_MAX, 3),N),::std::_Nil) > p\ |
|||
, StdTuple<BOOST_MOVE_TARGQ##M BOOST_MOVE_I##M BOOST_MOVE_REPEAT(BOOST_MOVE_SUB(BOOST_MOVE_ADD(_VARIADIC_MAX, 3),M),::std::_Nil) > q)\ |
|||
: first(BOOST_MOVE_GET_IDX##N), second(BOOST_MOVE_GET_IDXQ##M)\ |
|||
{ (void)p; (void)q;\ |
|||
BOOST_STATIC_ASSERT((sizeof(std::pair<T1, T2>) == sizeof(pair<T1, T2>)));\ |
|||
}\ |
|||
//
|
|||
BOOST_MOVE_ITER2D_0TOMAX(BOOST_PAIR_PIECEWISE_CONSTRUCT_MSVC2012_TUPLE_MAX_IT, BOOST_PAIR_PIECEWISE_CONSTRUCT_MSVC2012_TUPLE_CODE) |
|||
#undef BOOST_PAIR_PIECEWISE_CONSTRUCT_MSVC2010_TUPLE_CODE
|
|||
#undef BOOST_PAIR_PIECEWISE_CONSTRUCT_MSVC2012_TUPLE_MAX_IT
|
|||
#endif
|
|||
|
|||
//pair copy assignment
|
|||
pair& operator=(BOOST_COPY_ASSIGN_REF(pair) p) |
|||
{ |
|||
first = p.first; |
|||
second = p.second; |
|||
return *this; |
|||
} |
|||
|
|||
//pair move assignment
|
|||
pair& operator=(BOOST_RV_REF(pair) p) |
|||
{ |
|||
first = ::boost::move(BOOST_MOVE_TO_LV(p).first); |
|||
second = ::boost::move(BOOST_MOVE_TO_LV(p).second); |
|||
return *this; |
|||
} |
|||
|
|||
template <class D, class S> |
|||
typename ::boost::container::dtl::disable_if_or |
|||
< pair & |
|||
, ::boost::container::dtl::is_same<T1, D> |
|||
, ::boost::container::dtl::is_same<T2, S> |
|||
>::type |
|||
operator=(const pair<D, S>&p) |
|||
{ |
|||
first = p.first; |
|||
second = p.second; |
|||
return *this; |
|||
} |
|||
|
|||
template <class D, class S> |
|||
typename ::boost::container::dtl::disable_if_or |
|||
< pair & |
|||
, ::boost::container::dtl::is_same<T1, D> |
|||
, ::boost::container::dtl::is_same<T2, S> |
|||
>::type |
|||
operator=(BOOST_RV_REF_BEG pair<D, S> BOOST_RV_REF_END p) |
|||
{ |
|||
first = ::boost::move(BOOST_MOVE_TO_LV(p).first); |
|||
second = ::boost::move(BOOST_MOVE_TO_LV(p).second); |
|||
return *this; |
|||
} |
|||
//std::pair copy assignment
|
|||
pair& operator=(const std::pair<T1, T2> &p) |
|||
{ |
|||
first = p.first; |
|||
second = p.second; |
|||
return *this; |
|||
} |
|||
|
|||
template <class D, class S> |
|||
pair& operator=(const std::pair<D, S> &p) |
|||
{ |
|||
first = ::boost::move(p.first); |
|||
second = ::boost::move(p.second); |
|||
return *this; |
|||
} |
|||
|
|||
//std::pair move assignment
|
|||
pair& operator=(BOOST_RV_REF_BEG std::pair<T1, T2> BOOST_RV_REF_END p) |
|||
{ |
|||
first = ::boost::move(BOOST_MOVE_TO_LV(p).first); |
|||
second = ::boost::move(BOOST_MOVE_TO_LV(p).second); |
|||
return *this; |
|||
} |
|||
|
|||
template <class D, class S> |
|||
pair& operator=(BOOST_RV_REF_BEG std::pair<D, S> BOOST_RV_REF_END p) |
|||
{ |
|||
first = ::boost::move(BOOST_MOVE_TO_LV(p).first); |
|||
second = ::boost::move(BOOST_MOVE_TO_LV(p).second); |
|||
return *this; |
|||
} |
|||
|
|||
//swap
|
|||
void swap(pair& p) |
|||
{ |
|||
::boost::adl_move_swap(this->first, p.first); |
|||
::boost::adl_move_swap(this->second, p.second); |
|||
} |
|||
}; |
|||
|
|||
template <class T1, class T2> |
|||
inline bool operator==(const pair<T1,T2>& x, const pair<T1,T2>& y) |
|||
{ return static_cast<bool>(x.first == y.first && x.second == y.second); } |
|||
|
|||
template <class T1, class T2> |
|||
inline bool operator< (const pair<T1,T2>& x, const pair<T1,T2>& y) |
|||
{ return static_cast<bool>(x.first < y.first || |
|||
(!(y.first < x.first) && x.second < y.second)); } |
|||
|
|||
template <class T1, class T2> |
|||
inline bool operator!=(const pair<T1,T2>& x, const pair<T1,T2>& y) |
|||
{ return static_cast<bool>(!(x == y)); } |
|||
|
|||
template <class T1, class T2> |
|||
inline bool operator> (const pair<T1,T2>& x, const pair<T1,T2>& y) |
|||
{ return y < x; } |
|||
|
|||
template <class T1, class T2> |
|||
inline bool operator>=(const pair<T1,T2>& x, const pair<T1,T2>& y) |
|||
{ return static_cast<bool>(!(x < y)); } |
|||
|
|||
template <class T1, class T2> |
|||
inline bool operator<=(const pair<T1,T2>& x, const pair<T1,T2>& y) |
|||
{ return static_cast<bool>(!(y < x)); } |
|||
|
|||
template <class T1, class T2> |
|||
inline pair<T1, T2> make_pair(T1 x, T2 y) |
|||
{ return pair<T1, T2>(x, y); } |
|||
|
|||
template <class T1, class T2> |
|||
inline void swap(pair<T1, T2>& x, pair<T1, T2>& y) |
|||
{ x.swap(y); } |
|||
|
|||
} //namespace dtl {
|
|||
} //namespace container {
|
|||
|
|||
#ifdef BOOST_NO_CXX11_RVALUE_REFERENCES
|
|||
|
|||
template<class T1, class T2> |
|||
struct has_move_emulation_enabled< ::boost::container::dtl::pair<T1, T2> > |
|||
{ |
|||
static const bool value = true; |
|||
}; |
|||
|
|||
#endif
|
|||
|
|||
namespace move_detail{ |
|||
|
|||
template<class T> |
|||
struct is_class_or_union; |
|||
|
|||
template <class T1, class T2> |
|||
struct is_class_or_union< ::boost::container::dtl::pair<T1, T2> > |
|||
//This specialization is needed to avoid instantiation of pair in
|
|||
//is_class, and allow recursive maps.
|
|||
{ |
|||
static const bool value = true; |
|||
}; |
|||
|
|||
template <class T1, class T2> |
|||
struct is_class_or_union< std::pair<T1, T2> > |
|||
//This specialization is needed to avoid instantiation of pair in
|
|||
//is_class, and allow recursive maps.
|
|||
{ |
|||
static const bool value = true; |
|||
}; |
|||
|
|||
template<class T> |
|||
struct is_union; |
|||
|
|||
template <class T1, class T2> |
|||
struct is_union< ::boost::container::dtl::pair<T1, T2> > |
|||
//This specialization is needed to avoid instantiation of pair in
|
|||
//is_class, and allow recursive maps.
|
|||
{ |
|||
static const bool value = false; |
|||
}; |
|||
|
|||
template <class T1, class T2> |
|||
struct is_union< std::pair<T1, T2> > |
|||
//This specialization is needed to avoid instantiation of pair in
|
|||
//is_class, and allow recursive maps.
|
|||
{ |
|||
static const bool value = false; |
|||
}; |
|||
|
|||
template<class T> |
|||
struct is_class; |
|||
|
|||
template <class T1, class T2> |
|||
struct is_class< ::boost::container::dtl::pair<T1, T2> > |
|||
//This specialization is needed to avoid instantiation of pair in
|
|||
//is_class, and allow recursive maps.
|
|||
{ |
|||
static const bool value = true; |
|||
}; |
|||
|
|||
template <class T1, class T2> |
|||
struct is_class< std::pair<T1, T2> > |
|||
//This specialization is needed to avoid instantiation of pair in
|
|||
//is_class, and allow recursive maps.
|
|||
{ |
|||
static const bool value = true; |
|||
}; |
|||
|
|||
|
|||
//Triviality of pair
|
|||
template<class T> |
|||
struct is_trivially_copy_constructible; |
|||
|
|||
template<class A, class B> |
|||
struct is_trivially_copy_assignable |
|||
<boost::container::dtl::pair<A,B> > |
|||
{ |
|||
static const bool value = false ; |
|||
}; |
|||
|
|||
template<class T> |
|||
struct is_trivially_move_constructible; |
|||
|
|||
template<class A, class B> |
|||
struct is_trivially_move_assignable |
|||
<boost::container::dtl::pair<A,B> > |
|||
{ |
|||
static const bool value = false; |
|||
}; |
|||
|
|||
template<class T> |
|||
struct is_trivially_copy_assignable; |
|||
|
|||
template<class A, class B> |
|||
struct is_trivially_copy_constructible<boost::container::dtl::pair<A,B> > |
|||
{ |
|||
static const bool value = false; |
|||
}; |
|||
|
|||
template<class T> |
|||
struct is_trivially_move_assignable; |
|||
|
|||
template<class A, class B> |
|||
struct is_trivially_move_constructible<boost::container::dtl::pair<A,B> > |
|||
{ |
|||
static const bool value = false; |
|||
}; |
|||
|
|||
template<class T> |
|||
struct is_trivially_destructible; |
|||
|
|||
template<class A, class B> |
|||
struct is_trivially_destructible<boost::container::dtl::pair<A,B> > |
|||
{ |
|||
static const bool value = boost::move_detail::is_trivially_destructible<A>::value && |
|||
boost::move_detail::is_trivially_destructible<B>::value ; |
|||
}; |
|||
|
|||
|
|||
} //namespace move_detail{
|
|||
|
|||
} //namespace boost {
|
|||
|
|||
#include <boost/container/detail/config_end.hpp>
|
|||
|
|||
#endif //#ifndef BOOST_CONTAINER_DETAIL_PAIR_HPP
|
@ -0,0 +1,55 @@ |
|||
//////////////////////////////////////////////////////////////////////////////
|
|||
//
|
|||
// (C) Copyright Ion Gaztanaga 2005-2013. 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_PAIR_KEY_MAPPED_OF_VALUE_HPP
|
|||
#define BOOST_CONTAINER_PAIR_KEY_MAPPED_OF_VALUE_HPP
|
|||
|
|||
#ifndef BOOST_CONFIG_HPP
|
|||
# include <boost/config.hpp>
|
|||
#endif
|
|||
|
|||
#if defined(BOOST_HAS_PRAGMA_ONCE)
|
|||
# pragma once
|
|||
#endif
|
|||
|
|||
#include <boost/container/detail/config_begin.hpp>
|
|||
#include <boost/container/detail/workaround.hpp>
|
|||
|
|||
namespace boost { |
|||
namespace container { |
|||
|
|||
template<class Key, class Mapped> |
|||
struct pair_key_mapped_of_value |
|||
{ |
|||
typedef Key key_type; |
|||
typedef Mapped mapped_type; |
|||
|
|||
template<class Pair> |
|||
const key_type & key_of_value(const Pair &p) const |
|||
{ return p.first; } |
|||
|
|||
template<class Pair> |
|||
const mapped_type & mapped_of_value(const Pair &p) const |
|||
{ return p.second; } |
|||
|
|||
template<class Pair> |
|||
key_type & key_of_value(Pair &p) const |
|||
{ return const_cast<key_type&>(p.first); } |
|||
|
|||
template<class Pair> |
|||
mapped_type & mapped_of_value(Pair &p) const |
|||
{ return p.second; } |
|||
|
|||
}; |
|||
|
|||
}} |
|||
|
|||
#include <boost/container/detail/config_end.hpp>
|
|||
|
|||
#endif // BOOST_CONTAINER_PAIR_KEY_MAPPED_OF_VALUE_HPP
|
@ -0,0 +1,24 @@ |
|||
#ifndef BOOST_CONTAINER_DETAIL_PLACEMENT_NEW_HPP
|
|||
#define BOOST_CONTAINER_DETAIL_PLACEMENT_NEW_HPP
|
|||
///////////////////////////////////////////////////////////////////////////////
|
|||
//
|
|||
// (C) Copyright Ion Gaztanaga 2014-2015. 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.
|
|||
//
|
|||
///////////////////////////////////////////////////////////////////////////////
|
|||
|
|||
#include <cstddef>
|
|||
|
|||
struct boost_container_new_t{}; |
|||
|
|||
//avoid including <new>
|
|||
inline void *operator new(std::size_t, void *p, boost_container_new_t) |
|||
{ return p; } |
|||
|
|||
inline void operator delete(void *, void *, boost_container_new_t) |
|||
{} |
|||
|
|||
#endif //BOOST_CONTAINER_DETAIL_PLACEMENT_NEW_HPP
|
@ -0,0 +1,62 @@ |
|||
//////////////////////////////////////////////////////////////////////////////
|
|||
//
|
|||
// (C) Copyright Ion Gaztanaga 2014-2014. 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_STD_FWD_HPP
|
|||
#define BOOST_CONTAINER_DETAIL_STD_FWD_HPP
|
|||
|
|||
#ifndef BOOST_CONFIG_HPP
|
|||
# include <boost/config.hpp>
|
|||
#endif
|
|||
|
|||
#if defined(BOOST_HAS_PRAGMA_ONCE)
|
|||
# pragma once
|
|||
#endif
|
|||
|
|||
//////////////////////////////////////////////////////////////////////////////
|
|||
// Standard predeclarations
|
|||
//////////////////////////////////////////////////////////////////////////////
|
|||
|
|||
#include <boost/move/detail/std_ns_begin.hpp>
|
|||
BOOST_MOVE_STD_NS_BEG |
|||
|
|||
template<class T> |
|||
class allocator; |
|||
|
|||
template<class T> |
|||
struct less; |
|||
|
|||
template<class T> |
|||
struct equal_to; |
|||
|
|||
template<class T1, class T2> |
|||
struct pair; |
|||
|
|||
template<class T> |
|||
struct char_traits; |
|||
|
|||
struct input_iterator_tag; |
|||
struct forward_iterator_tag; |
|||
struct bidirectional_iterator_tag; |
|||
struct random_access_iterator_tag; |
|||
|
|||
template<class Container> |
|||
class insert_iterator; |
|||
|
|||
struct allocator_arg_t; |
|||
|
|||
struct piecewise_construct_t; |
|||
|
|||
template <class Ptr> |
|||
struct pointer_traits; |
|||
|
|||
BOOST_MOVE_STD_NS_END |
|||
#include <boost/move/detail/std_ns_end.hpp>
|
|||
|
|||
#endif //#ifndef BOOST_CONTAINER_DETAIL_STD_FWD_HPP
|
@ -0,0 +1,180 @@ |
|||
//////////////////////////////////////////////////////////////////////////////
|
|||
//
|
|||
// (C) Copyright Ion Gaztanaga 2005-2013.
|
|||
// (C) Copyright Gennaro Prota 2003 - 2004.
|
|||
//
|
|||
// 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_TRANSFORM_ITERATORS_HPP
|
|||
#define BOOST_CONTAINER_DETAIL_TRANSFORM_ITERATORS_HPP
|
|||
|
|||
#ifndef BOOST_CONFIG_HPP
|
|||
# include <boost/config.hpp>
|
|||
#endif
|
|||
|
|||
#if defined(BOOST_HAS_PRAGMA_ONCE)
|
|||
# pragma once
|
|||
#endif
|
|||
|
|||
#include <boost/container/detail/config_begin.hpp>
|
|||
#include <boost/container/detail/workaround.hpp>
|
|||
#include <boost/container/detail/type_traits.hpp>
|
|||
#include <boost/container/detail/iterator.hpp>
|
|||
|
|||
namespace boost { |
|||
namespace container { |
|||
|
|||
template <class PseudoReference> |
|||
struct operator_arrow_proxy |
|||
{ |
|||
BOOST_CONTAINER_FORCEINLINE operator_arrow_proxy(const PseudoReference &px) |
|||
: m_value(px) |
|||
{} |
|||
|
|||
typedef PseudoReference element_type; |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE PseudoReference* operator->() const { return &m_value; } |
|||
|
|||
mutable PseudoReference m_value; |
|||
}; |
|||
|
|||
template <class T> |
|||
struct operator_arrow_proxy<T&> |
|||
{ |
|||
BOOST_CONTAINER_FORCEINLINE operator_arrow_proxy(T &px) |
|||
: m_value(px) |
|||
{} |
|||
|
|||
typedef T element_type; |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE T* operator->() const { return const_cast<T*>(&m_value); } |
|||
|
|||
T &m_value; |
|||
}; |
|||
|
|||
template <class Iterator, class UnaryFunction> |
|||
class transform_iterator |
|||
: public UnaryFunction |
|||
, public boost::container::iterator |
|||
< typename Iterator::iterator_category |
|||
, typename dtl::remove_reference<typename UnaryFunction::result_type>::type |
|||
, typename Iterator::difference_type |
|||
, operator_arrow_proxy<typename UnaryFunction::result_type> |
|||
, typename UnaryFunction::result_type> |
|||
{ |
|||
public: |
|||
BOOST_CONTAINER_FORCEINLINE explicit transform_iterator(const Iterator &it, const UnaryFunction &f = UnaryFunction()) |
|||
: UnaryFunction(f), m_it(it) |
|||
{} |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE explicit transform_iterator() |
|||
: UnaryFunction(), m_it() |
|||
{} |
|||
|
|||
//Constructors
|
|||
BOOST_CONTAINER_FORCEINLINE transform_iterator& operator++() |
|||
{ increment(); return *this; } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE transform_iterator operator++(int) |
|||
{ |
|||
transform_iterator result (*this); |
|||
increment(); |
|||
return result; |
|||
} |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE friend bool operator== (const transform_iterator& i, const transform_iterator& i2) |
|||
{ return i.equal(i2); } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE friend bool operator!= (const transform_iterator& i, const transform_iterator& i2) |
|||
{ return !(i == i2); } |
|||
|
|||
/*
|
|||
friend bool operator> (const transform_iterator& i, const transform_iterator& i2) |
|||
{ return i2 < i; } |
|||
|
|||
friend bool operator<= (const transform_iterator& i, const transform_iterator& i2) |
|||
{ return !(i > i2); } |
|||
|
|||
friend bool operator>= (const transform_iterator& i, const transform_iterator& i2) |
|||
{ return !(i < i2); } |
|||
*/ |
|||
BOOST_CONTAINER_FORCEINLINE friend typename Iterator::difference_type operator- (const transform_iterator& i, const transform_iterator& i2) |
|||
{ return i2.distance_to(i); } |
|||
|
|||
//Arithmetic
|
|||
BOOST_CONTAINER_FORCEINLINE transform_iterator& operator+=(typename Iterator::difference_type off) |
|||
{ this->advance(off); return *this; } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE transform_iterator operator+(typename Iterator::difference_type off) const |
|||
{ |
|||
transform_iterator other(*this); |
|||
other.advance(off); |
|||
return other; |
|||
} |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE friend transform_iterator operator+(typename Iterator::difference_type off, const transform_iterator& right) |
|||
{ return right + off; } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE transform_iterator& operator-=(typename Iterator::difference_type off) |
|||
{ this->advance(-off); return *this; } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE transform_iterator operator-(typename Iterator::difference_type off) const |
|||
{ return *this + (-off); } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE typename UnaryFunction::result_type operator*() const |
|||
{ return dereference(); } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE operator_arrow_proxy<typename UnaryFunction::result_type> |
|||
operator->() const |
|||
{ return operator_arrow_proxy<typename UnaryFunction::result_type>(dereference()); } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE Iterator & base() |
|||
{ return m_it; } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE const Iterator & base() const |
|||
{ return m_it; } |
|||
|
|||
private: |
|||
Iterator m_it; |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE void increment() |
|||
{ ++m_it; } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE void decrement() |
|||
{ --m_it; } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE bool equal(const transform_iterator &other) const |
|||
{ return m_it == other.m_it; } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE bool less(const transform_iterator &other) const |
|||
{ return other.m_it < m_it; } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE typename UnaryFunction::result_type dereference() const |
|||
{ return UnaryFunction::operator()(*m_it); } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE void advance(typename Iterator::difference_type n) |
|||
{ boost::container::iterator_advance(m_it, n); } |
|||
|
|||
BOOST_CONTAINER_FORCEINLINE typename Iterator::difference_type distance_to(const transform_iterator &other)const |
|||
{ return boost::container::iterator_distance(other.m_it, m_it); } |
|||
}; |
|||
|
|||
template <class Iterator, class UnaryFunc> |
|||
BOOST_CONTAINER_FORCEINLINE transform_iterator<Iterator, UnaryFunc> |
|||
make_transform_iterator(Iterator it, UnaryFunc fun) |
|||
{ |
|||
return transform_iterator<Iterator, UnaryFunc>(it, fun); |
|||
} |
|||
|
|||
} //namespace container {
|
|||
} //namespace boost {
|
|||
|
|||
#include <boost/container/detail/config_end.hpp>
|
|||
|
|||
#endif //#ifndef BOOST_CONTAINER_DETAIL_TRANSFORM_ITERATORS_HPP
|
1437
src/boost/container/detail/tree.hpp
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,75 @@ |
|||
//////////////////////////////////////////////////////////////////////////////
|
|||
// (C) Copyright John Maddock 2000.
|
|||
// (C) Copyright Ion Gaztanaga 2005-2015.
|
|||
//
|
|||
// 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.
|
|||
//
|
|||
// The alignment and Type traits implementation comes from
|
|||
// John Maddock's TypeTraits library.
|
|||
//
|
|||
// Some other tricks come from Howard Hinnant's papers and StackOverflow replies
|
|||
//////////////////////////////////////////////////////////////////////////////
|
|||
#ifndef BOOST_CONTAINER_CONTAINER_DETAIL_TYPE_TRAITS_HPP
|
|||
#define BOOST_CONTAINER_CONTAINER_DETAIL_TYPE_TRAITS_HPP
|
|||
|
|||
#ifndef BOOST_CONFIG_HPP
|
|||
# include <boost/config.hpp>
|
|||
#endif
|
|||
|
|||
#if defined(BOOST_HAS_PRAGMA_ONCE)
|
|||
# pragma once
|
|||
#endif
|
|||
|
|||
#include <boost/move/detail/type_traits.hpp>
|
|||
|
|||
namespace boost { |
|||
namespace container { |
|||
namespace dtl { |
|||
|
|||
using ::boost::move_detail::enable_if; |
|||
using ::boost::move_detail::enable_if_and; |
|||
using ::boost::move_detail::is_same; |
|||
using ::boost::move_detail::is_different; |
|||
using ::boost::move_detail::is_pointer; |
|||
using ::boost::move_detail::add_reference; |
|||
using ::boost::move_detail::add_const; |
|||
using ::boost::move_detail::add_const_reference; |
|||
using ::boost::move_detail::remove_const; |
|||
using ::boost::move_detail::remove_reference; |
|||
using ::boost::move_detail::remove_cvref; |
|||
using ::boost::move_detail::make_unsigned; |
|||
using ::boost::move_detail::is_floating_point; |
|||
using ::boost::move_detail::is_integral; |
|||
using ::boost::move_detail::is_enum; |
|||
using ::boost::move_detail::is_pod; |
|||
using ::boost::move_detail::is_empty; |
|||
using ::boost::move_detail::is_trivially_destructible; |
|||
using ::boost::move_detail::is_trivially_default_constructible; |
|||
using ::boost::move_detail::is_trivially_copy_constructible; |
|||
using ::boost::move_detail::is_trivially_move_constructible; |
|||
using ::boost::move_detail::is_trivially_copy_assignable; |
|||
using ::boost::move_detail::is_trivially_move_assignable; |
|||
using ::boost::move_detail::is_nothrow_default_constructible; |
|||
using ::boost::move_detail::is_nothrow_copy_constructible; |
|||
using ::boost::move_detail::is_nothrow_move_constructible; |
|||
using ::boost::move_detail::is_nothrow_copy_assignable; |
|||
using ::boost::move_detail::is_nothrow_move_assignable; |
|||
using ::boost::move_detail::is_nothrow_swappable; |
|||
using ::boost::move_detail::alignment_of; |
|||
using ::boost::move_detail::aligned_storage; |
|||
using ::boost::move_detail::nat; |
|||
using ::boost::move_detail::nat2; |
|||
using ::boost::move_detail::nat3; |
|||
using ::boost::move_detail::natN; |
|||
using ::boost::move_detail::max_align_t; |
|||
using ::boost::move_detail::is_convertible; |
|||
|
|||
} //namespace dtl {
|
|||
} //namespace container {
|
|||
} //namespace boost {
|
|||
|
|||
#endif //#ifndef BOOST_CONTAINER_CONTAINER_DETAIL_TYPE_TRAITS_HPP
|
@ -0,0 +1,32 @@ |
|||
#ifndef BOOST_CONTAINER_DETAIL_VALUE_FUNCTORS_HPP
|
|||
#define BOOST_CONTAINER_DETAIL_VALUE_FUNCTORS_HPP
|
|||
///////////////////////////////////////////////////////////////////////////////
|
|||
//
|
|||
// (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_CONFIG_HPP
|
|||
# include <boost/config.hpp>
|
|||
#endif
|
|||
|
|||
#if defined(BOOST_HAS_PRAGMA_ONCE)
|
|||
# pragma once
|
|||
#endif
|
|||
|
|||
#include <boost/intrusive/detail/value_functors.hpp>
|
|||
|
|||
namespace boost { |
|||
namespace container { |
|||
|
|||
using ::boost::intrusive::value_less; |
|||
using ::boost::intrusive::value_equal; |
|||
|
|||
} //namespace container {
|
|||
} //namespace boost {
|
|||
|
|||
#endif //BOOST_CONTAINER_DETAIL_VALUE_FUNCTORS_HPP
|
@ -0,0 +1,51 @@ |
|||
//////////////////////////////////////////////////////////////////////////////
|
|||
//
|
|||
// (C) Copyright Ion Gaztanaga 2005-2013.
|
|||
//
|
|||
// 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_VALUE_INIT_HPP
|
|||
#define BOOST_CONTAINER_DETAIL_VALUE_INIT_HPP
|
|||
|
|||
#ifndef BOOST_CONFIG_HPP
|
|||
# include <boost/config.hpp>
|
|||
#endif
|
|||
|
|||
#if defined(BOOST_HAS_PRAGMA_ONCE)
|
|||
# pragma once
|
|||
#endif
|
|||
|
|||
#include <boost/container/detail/config_begin.hpp>
|
|||
#include <boost/container/detail/workaround.hpp>
|
|||
|
|||
namespace boost { |
|||
namespace container { |
|||
namespace dtl { |
|||
|
|||
template<class T> |
|||
struct value_init |
|||
{ |
|||
value_init() |
|||
: m_t() |
|||
{} |
|||
|
|||
operator T &() { return m_t; } |
|||
|
|||
T &get() { return m_t; } |
|||
|
|||
T m_t; |
|||
}; |
|||
|
|||
} //namespace dtl {
|
|||
} //namespace container {
|
|||
} //namespace boost {
|
|||
|
|||
#include <boost/container/detail/config_end.hpp>
|
|||
|
|||
#endif //#ifndef BOOST_CONTAINER_DETAIL_VALUE_INIT_HPP
|
@ -0,0 +1,163 @@ |
|||
//////////////////////////////////////////////////////////////////////////////
|
|||
//
|
|||
// (C) Copyright Ion Gaztanaga 2008-2013. 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_VARIADIC_TEMPLATES_TOOLS_HPP
|
|||
#define BOOST_CONTAINER_DETAIL_VARIADIC_TEMPLATES_TOOLS_HPP
|
|||
|
|||
#ifndef BOOST_CONFIG_HPP
|
|||
# include <boost/config.hpp>
|
|||
#endif
|
|||
|
|||
#if defined(BOOST_HAS_PRAGMA_ONCE)
|
|||
# pragma once
|
|||
#endif
|
|||
|
|||
#include <boost/container/detail/config_begin.hpp>
|
|||
#include <boost/container/detail/workaround.hpp>
|
|||
#include <boost/move/utility_core.hpp>
|
|||
|
|||
#include <boost/container/detail/type_traits.hpp>
|
|||
#include <cstddef> //std::size_t
|
|||
|
|||
namespace boost { |
|||
namespace container { |
|||
namespace dtl { |
|||
|
|||
template<typename... Values> |
|||
class tuple; |
|||
|
|||
template<> class tuple<> |
|||
{}; |
|||
|
|||
template<typename Head, typename... Tail> |
|||
class tuple<Head, Tail...> |
|||
: private tuple<Tail...> |
|||
{ |
|||
typedef tuple<Tail...> inherited; |
|||
|
|||
public: |
|||
tuple() |
|||
: inherited(), m_head() |
|||
{} |
|||
|
|||
template<class U, class ...Args> |
|||
tuple(U &&u, Args && ...args) |
|||
: inherited(::boost::forward<Args>(args)...), m_head(::boost::forward<U>(u)) |
|||
{} |
|||
|
|||
// Construct tuple from another tuple.
|
|||
template<typename... VValues> |
|||
tuple(const tuple<VValues...>& other) |
|||
: inherited(other.tail()), m_head(other.head()) |
|||
{} |
|||
|
|||
template<typename... VValues> |
|||
tuple& operator=(const tuple<VValues...>& other) |
|||
{ |
|||
m_head = other.head(); |
|||
tail() = other.tail(); |
|||
return this; |
|||
} |
|||
|
|||
typename add_reference<Head>::type head() { return m_head; } |
|||
typename add_reference<const Head>::type head() const { return m_head; } |
|||
|
|||
inherited& tail() { return *this; } |
|||
const inherited& tail() const { return *this; } |
|||
|
|||
protected: |
|||
Head m_head; |
|||
}; |
|||
|
|||
|
|||
template<typename... Values> |
|||
tuple<Values&&...> forward_as_tuple_impl(Values&&... values) |
|||
{ return tuple<Values&&...>(::boost::forward<Values>(values)...); } |
|||
|
|||
template<int I, typename Tuple> |
|||
struct tuple_element; |
|||
|
|||
template<int I, typename Head, typename... Tail> |
|||
struct tuple_element<I, tuple<Head, Tail...> > |
|||
{ |
|||
typedef typename tuple_element<I-1, tuple<Tail...> >::type type; |
|||
}; |
|||
|
|||
template<typename Head, typename... Tail> |
|||
struct tuple_element<0, tuple<Head, Tail...> > |
|||
{ |
|||
typedef Head type; |
|||
}; |
|||
|
|||
template<int I, typename Tuple> |
|||
class get_impl; |
|||
|
|||
template<int I, typename Head, typename... Values> |
|||
class get_impl<I, tuple<Head, Values...> > |
|||
{ |
|||
typedef typename tuple_element<I-1, tuple<Values...> >::type Element; |
|||
typedef get_impl<I-1, tuple<Values...> > Next; |
|||
|
|||
public: |
|||
typedef typename add_reference<Element>::type type; |
|||
typedef typename add_const_reference<Element>::type const_type; |
|||
static type get(tuple<Head, Values...>& t) { return Next::get(t.tail()); } |
|||
static const_type get(const tuple<Head, Values...>& t) { return Next::get(t.tail()); } |
|||
}; |
|||
|
|||
template<typename Head, typename... Values> |
|||
class get_impl<0, tuple<Head, Values...> > |
|||
{ |
|||
public: |
|||
typedef typename add_reference<Head>::type type; |
|||
typedef typename add_const_reference<Head>::type const_type; |
|||
static type get(tuple<Head, Values...>& t) { return t.head(); } |
|||
static const_type get(const tuple<Head, Values...>& t){ return t.head(); } |
|||
}; |
|||
|
|||
template<int I, typename... Values> |
|||
typename get_impl<I, tuple<Values...> >::type get(tuple<Values...>& t) |
|||
{ return get_impl<I, tuple<Values...> >::get(t); } |
|||
|
|||
template<int I, typename... Values> |
|||
typename get_impl<I, tuple<Values...> >::const_type get(const tuple<Values...>& t) |
|||
{ return get_impl<I, tuple<Values...> >::get(t); } |
|||
|
|||
////////////////////////////////////////////////////
|
|||
// Builds an index_tuple<0, 1, 2, ..., Num-1>, that will
|
|||
// be used to "unpack" into comma-separated values
|
|||
// in a function call.
|
|||
////////////////////////////////////////////////////
|
|||
|
|||
template<std::size_t...> struct index_tuple{ typedef index_tuple type; }; |
|||
|
|||
template<class S1, class S2> struct concat_index_tuple; |
|||
|
|||
template<std::size_t... I1, std::size_t... I2> |
|||
struct concat_index_tuple<index_tuple<I1...>, index_tuple<I2...>> |
|||
: index_tuple<I1..., (sizeof...(I1)+I2)...>{}; |
|||
|
|||
template<std::size_t N> struct build_number_seq; |
|||
|
|||
template<std::size_t N> |
|||
struct build_number_seq |
|||
: concat_index_tuple<typename build_number_seq<N/2>::type |
|||
,typename build_number_seq<N - N/2 >::type |
|||
>::type |
|||
{}; |
|||
|
|||
template<> struct build_number_seq<0> : index_tuple<>{}; |
|||
template<> struct build_number_seq<1> : index_tuple<0>{}; |
|||
|
|||
}}} //namespace boost { namespace container { namespace dtl {
|
|||
|
|||
#include <boost/container/detail/config_end.hpp>
|
|||
|
|||
#endif //#ifndef BOOST_CONTAINER_DETAIL_VARIADIC_TEMPLATES_TOOLS_HPP
|
@ -0,0 +1,101 @@ |
|||
//////////////////////////////////////////////////////////////////////////////
|
|||
//
|
|||
// (C) Copyright Ion Gaztanaga 2005-2013. 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.
|
|||
//
|
|||
//////////////////////////////////////////////////////////////////////////////
|
|||
//
|
|||
// This code comes from N1953 document by Howard E. Hinnant
|
|||
//
|
|||
//////////////////////////////////////////////////////////////////////////////
|
|||
|
|||
|
|||
#ifndef BOOST_CONTAINER_DETAIL_VERSION_TYPE_HPP
|
|||
#define BOOST_CONTAINER_DETAIL_VERSION_TYPE_HPP
|
|||
|
|||
#ifndef BOOST_CONFIG_HPP
|
|||
# include <boost/config.hpp>
|
|||
#endif
|
|||
|
|||
#if defined(BOOST_HAS_PRAGMA_ONCE)
|
|||
# pragma once
|
|||
#endif
|
|||
|
|||
#include <boost/container/detail/config_begin.hpp>
|
|||
#include <boost/container/detail/workaround.hpp>
|
|||
|
|||
#include <boost/container/detail/mpl.hpp>
|
|||
#include <boost/container/detail/type_traits.hpp>
|
|||
|
|||
namespace boost{ |
|||
namespace container { |
|||
namespace dtl { |
|||
|
|||
template <class T, unsigned V> |
|||
struct version_type |
|||
: public dtl::integral_constant<unsigned, V> |
|||
{ |
|||
typedef T type; |
|||
}; |
|||
|
|||
namespace impl{ |
|||
|
|||
template <class T> |
|||
struct extract_version |
|||
{ |
|||
typedef typename T::version type; |
|||
}; |
|||
|
|||
template <class T> |
|||
struct has_version |
|||
{ |
|||
private: |
|||
struct two {char _[2];}; |
|||
template <class U> static two test(...); |
|||
template <class U> static char test(const typename U::version*); |
|||
public: |
|||
static const bool value = sizeof(test<T>(0)) == 1; |
|||
void dummy(){} |
|||
}; |
|||
|
|||
template <class T, bool = has_version<T>::value> |
|||
struct version |
|||
{ |
|||
static const unsigned value = 1; |
|||
}; |
|||
|
|||
template <class T> |
|||
struct version<T, true> |
|||
{ |
|||
static const unsigned value = extract_version<T>::type::value; |
|||
}; |
|||
|
|||
} //namespace impl
|
|||
|
|||
template <class T> |
|||
struct version |
|||
: public dtl::integral_constant<unsigned, impl::version<T>::value> |
|||
{}; |
|||
|
|||
template<class T, unsigned N> |
|||
struct is_version |
|||
{ |
|||
static const bool value = |
|||
is_same< typename version<T>::type, integral_constant<unsigned, N> >::value; |
|||
}; |
|||
|
|||
} //namespace dtl {
|
|||
|
|||
typedef dtl::integral_constant<unsigned, 0> version_0; |
|||
typedef dtl::integral_constant<unsigned, 1> version_1; |
|||
typedef dtl::integral_constant<unsigned, 2> version_2; |
|||
|
|||
} //namespace container {
|
|||
} //namespace boost{
|
|||
|
|||
#include <boost/container/detail/config_end.hpp>
|
|||
|
|||
#endif //#define BOOST_CONTAINER_DETAIL_VERSION_TYPE_HPP
|
@ -0,0 +1,190 @@ |
|||
//////////////////////////////////////////////////////////////////////////////
|
|||
//
|
|||
// (C) Copyright Ion Gaztanaga 2005-2013. 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_WORKAROUND_HPP
|
|||
#define BOOST_CONTAINER_DETAIL_WORKAROUND_HPP
|
|||
|
|||
#ifndef BOOST_CONFIG_HPP
|
|||
# include <boost/config.hpp>
|
|||
#endif
|
|||
|
|||
#if defined(BOOST_HAS_PRAGMA_ONCE)
|
|||
# pragma once
|
|||
#endif
|
|||
|
|||
#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) && !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)\
|
|||
&& !defined(BOOST_INTERPROCESS_DISABLE_VARIADIC_TMPL) |
|||
#define BOOST_CONTAINER_PERFECT_FORWARDING
|
|||
#endif
|
|||
|
|||
#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) && defined(__GXX_EXPERIMENTAL_CXX0X__)\
|
|||
&& (__GNUC__*10000 + __GNUC_MINOR__*100 + __GNUC_PATCHLEVEL__ < 40700) |
|||
#define BOOST_CONTAINER_UNIMPLEMENTED_PACK_EXPANSION_TO_FIXED_LIST
|
|||
#endif
|
|||
|
|||
#if defined(BOOST_GCC_VERSION)
|
|||
# if (BOOST_GCC_VERSION < 40700) || !defined(BOOST_GCC_CXX11)
|
|||
# define BOOST_CONTAINER_NO_CXX11_DELEGATING_CONSTRUCTORS
|
|||
# endif
|
|||
#elif defined(BOOST_MSVC)
|
|||
# if _MSC_FULL_VER < 180020827
|
|||
# define BOOST_CONTAINER_NO_CXX11_DELEGATING_CONSTRUCTORS
|
|||
# endif
|
|||
#elif defined(BOOST_CLANG)
|
|||
# if !__has_feature(cxx_delegating_constructors)
|
|||
# define BOOST_CONTAINER_NO_CXX11_DELEGATING_CONSTRUCTORS
|
|||
# endif
|
|||
#endif
|
|||
|
|||
#if defined(BOOST_MSVC) && (_MSC_VER < 1400)
|
|||
#define BOOST_CONTAINER_TEMPLATED_CONVERSION_OPERATOR_BROKEN
|
|||
#endif
|
|||
|
|||
#if !defined(BOOST_NO_CXX11_HDR_TUPLE) || (defined(BOOST_MSVC) && (BOOST_MSVC == 1700 || BOOST_MSVC == 1600))
|
|||
#define BOOST_CONTAINER_PAIR_TEST_HAS_HEADER_TUPLE
|
|||
#endif
|
|||
|
|||
//Macros for documentation purposes. For code, expands to the argument
|
|||
#define BOOST_CONTAINER_IMPDEF(TYPE) TYPE
|
|||
#define BOOST_CONTAINER_SEEDOC(TYPE) TYPE
|
|||
|
|||
//Macros for memset optimization. In most platforms
|
|||
//memsetting pointers and floatings is safe and faster.
|
|||
//
|
|||
//If your platform does not offer these guarantees
|
|||
//define these to value zero.
|
|||
#ifndef BOOST_CONTAINER_MEMZEROED_FLOATING_POINT_IS_NOT_ZERO
|
|||
#define BOOST_CONTAINER_MEMZEROED_FLOATING_POINT_IS_ZERO 1
|
|||
#endif
|
|||
|
|||
#ifndef BOOST_CONTAINER_MEMZEROED_POINTER_IS_NOT_NULL
|
|||
#define BOOST_CONTAINER_MEMZEROED_POINTER_IS_NULL
|
|||
#endif
|
|||
|
|||
#define BOOST_CONTAINER_DOC1ST(TYPE1, TYPE2) TYPE2
|
|||
#define BOOST_CONTAINER_I ,
|
|||
#define BOOST_CONTAINER_DOCIGN(T) T
|
|||
#define BOOST_CONTAINER_DOCONLY(T)
|
|||
|
|||
/*
|
|||
we need to import/export our code only if the user has specifically |
|||
asked for it by defining either BOOST_ALL_DYN_LINK if they want all boost |
|||
libraries to be dynamically linked, or BOOST_CONTAINER_DYN_LINK |
|||
if they want just this one to be dynamically liked: |
|||
*/ |
|||
#if defined(BOOST_ALL_DYN_LINK) || defined(BOOST_CONTAINER_DYN_LINK)
|
|||
|
|||
/* export if this is our own source, otherwise import: */ |
|||
#ifdef BOOST_CONTAINER_SOURCE
|
|||
# define BOOST_CONTAINER_DECL BOOST_SYMBOL_EXPORT
|
|||
#else
|
|||
# define BOOST_CONTAINER_DECL BOOST_SYMBOL_IMPORT
|
|||
|
|||
#endif /* BOOST_CONTAINER_SOURCE */
|
|||
#else
|
|||
#define BOOST_CONTAINER_DECL
|
|||
#endif /* DYN_LINK */
|
|||
|
|||
//#define BOOST_CONTAINER_DISABLE_FORCEINLINE
|
|||
|
|||
#if defined(BOOST_CONTAINER_DISABLE_FORCEINLINE)
|
|||
#define BOOST_CONTAINER_FORCEINLINE inline
|
|||
#elif defined(BOOST_CONTAINER_FORCEINLINE_IS_BOOST_FORCELINE)
|
|||
#define BOOST_CONTAINER_FORCEINLINE BOOST_FORCEINLINE
|
|||
#elif defined(BOOST_MSVC) && (_MSC_VER <= 1900 || defined(_DEBUG))
|
|||
//"__forceinline" and MSVC seems to have some bugs in old versions and in debug mode
|
|||
#define BOOST_CONTAINER_FORCEINLINE inline
|
|||
#elif defined(BOOST_GCC) && ((__GNUC__ <= 5) || defined(__MINGW32__))
|
|||
//Older GCCs and MinGw have problems with forceinline
|
|||
#define BOOST_CONTAINER_FORCEINLINE inline
|
|||
#else
|
|||
#define BOOST_CONTAINER_FORCEINLINE BOOST_FORCEINLINE
|
|||
#endif
|
|||
|
|||
//#define BOOST_CONTAINER_DISABLE_NOINLINE
|
|||
|
|||
#if defined(BOOST_CONTAINER_DISABLE_NOINLINE)
|
|||
#define BOOST_CONTAINER_NOINLINE
|
|||
#else
|
|||
#define BOOST_CONTAINER_NOINLINE BOOST_NOINLINE
|
|||
#endif
|
|||
|
|||
|
|||
#if !defined(__has_feature)
|
|||
#define BOOST_CONTAINER_HAS_FEATURE(feature) 0
|
|||
#else
|
|||
#define BOOST_CONTAINER_HAS_FEATURE(feature) __has_feature(feature)
|
|||
#endif
|
|||
|
|||
//Detect address sanitizer
|
|||
#if defined(__SANITIZE_ADDRESS__) || BOOST_CONTAINER_HAS_FEATURE(address_sanitizer)
|
|||
#define BOOST_CONTAINER_ASAN
|
|||
#endif
|
|||
|
|||
|
|||
#if (BOOST_CXX_VERSION < 201703L) || !defined(__cpp_deduction_guides)
|
|||
#define BOOST_CONTAINER_NO_CXX17_CTAD
|
|||
#endif
|
|||
|
|||
#if defined(BOOST_CONTAINER_DISABLE_ATTRIBUTE_NODISCARD)
|
|||
#define BOOST_CONTAINER_ATTRIBUTE_NODISCARD
|
|||
#else
|
|||
#if defined(BOOST_GCC) && ((BOOST_GCC < 100000) || (__cplusplus < 201703L))
|
|||
//Avoid using it in C++ < 17 and GCC < 10 because it warns in SFINAE contexts
|
|||
//(see https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89070)
|
|||
#define BOOST_CONTAINER_ATTRIBUTE_NODISCARD
|
|||
#else
|
|||
#define BOOST_CONTAINER_ATTRIBUTE_NODISCARD BOOST_ATTRIBUTE_NODISCARD
|
|||
#endif
|
|||
#endif
|
|||
|
|||
|
|||
//Configuration options:
|
|||
|
|||
//Define this to use std exception types instead of boost::container's own exception types
|
|||
//#define BOOST_CONTAINER_USE_STD_EXCEPTIONS
|
|||
|
|||
|
|||
namespace boost { |
|||
namespace container { |
|||
|
|||
template <typename T1> |
|||
BOOST_FORCEINLINE BOOST_CXX14_CONSTEXPR void ignore(T1 const&) |
|||
{} |
|||
|
|||
}} //namespace boost::container {
|
|||
|
|||
#if !(defined BOOST_NO_EXCEPTIONS)
|
|||
# define BOOST_CONTAINER_TRY { try
|
|||
# define BOOST_CONTAINER_CATCH(x) catch(x)
|
|||
# define BOOST_CONTAINER_RETHROW throw;
|
|||
# define BOOST_CONTAINER_CATCH_END }
|
|||
#else
|
|||
# if !defined(BOOST_MSVC) || BOOST_MSVC >= 1900
|
|||
# define BOOST_CONTAINER_TRY { if (true)
|
|||
# define BOOST_CONTAINER_CATCH(x) else if (false)
|
|||
# else
|
|||
// warning C4127: conditional expression is constant
|
|||
# define BOOST_CONTAINER_TRY { \
|
|||
__pragma(warning(push)) \ |
|||
__pragma(warning(disable: 4127)) \ |
|||
if (true) \ |
|||
__pragma(warning(pop)) |
|||
# define BOOST_CONTAINER_CATCH(x) else \
|
|||
__pragma(warning(push)) \ |
|||
__pragma(warning(disable: 4127)) \ |
|||
if (false) \ |
|||
__pragma(warning(pop)) |
|||
# endif
|
|||
# define BOOST_CONTAINER_RETHROW
|
|||
# define BOOST_CONTAINER_CATCH_END }
|
|||
#endif
|
|||
|
|||
#endif //#ifndef BOOST_CONTAINER_DETAIL_WORKAROUND_HPP
|
3067
src/boost/container/flat_map.hpp
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
2315
src/boost/container/map.hpp
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,201 @@ |
|||
//////////////////////////////////////////////////////////////////////////////
|
|||
//
|
|||
// (C) Copyright Ion Gaztanaga 2014-2015. 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_NEW_ALLOCATOR_HPP
|
|||
#define BOOST_CONTAINER_NEW_ALLOCATOR_HPP
|
|||
|
|||
#ifndef BOOST_CONFIG_HPP
|
|||
# include <boost/config.hpp>
|
|||
#endif
|
|||
|
|||
#if defined(BOOST_HAS_PRAGMA_ONCE)
|
|||
# pragma once
|
|||
#endif
|
|||
|
|||
#include <boost/container/detail/config_begin.hpp>
|
|||
#include <boost/container/detail/workaround.hpp>
|
|||
#include <boost/container/throw_exception.hpp>
|
|||
#include <cstddef>
|
|||
|
|||
//!\file
|
|||
|
|||
namespace boost { |
|||
namespace container { |
|||
|
|||
/// @cond
|
|||
|
|||
template<bool Value> |
|||
struct new_allocator_bool |
|||
{ static const bool value = Value; }; |
|||
|
|||
template<class T> |
|||
class new_allocator; |
|||
|
|||
/// @endcond
|
|||
|
|||
//! Specialization of new_allocator for void types
|
|||
template<> |
|||
class new_allocator<void> |
|||
{ |
|||
public: |
|||
typedef void value_type; |
|||
typedef void * pointer; |
|||
typedef const void* const_pointer; |
|||
//!A integral constant of type bool with value true
|
|||
typedef BOOST_CONTAINER_IMPDEF(new_allocator_bool<true>) propagate_on_container_move_assignment; |
|||
//!A integral constant of type bool with value true
|
|||
typedef BOOST_CONTAINER_IMPDEF(new_allocator_bool<true>) is_always_equal; |
|||
// reference-to-void members are impossible
|
|||
|
|||
//!Obtains an new_allocator that allocates
|
|||
//!objects of type T2
|
|||
template<class T2> |
|||
struct rebind |
|||
{ |
|||
typedef new_allocator< T2> other; |
|||
}; |
|||
|
|||
//!Default constructor
|
|||
//!Never throws
|
|||
new_allocator() BOOST_NOEXCEPT_OR_NOTHROW |
|||
{} |
|||
|
|||
//!Constructor from other new_allocator.
|
|||
//!Never throws
|
|||
new_allocator(const new_allocator &) BOOST_NOEXCEPT_OR_NOTHROW |
|||
{} |
|||
|
|||
//!Copy assignment operator from other new_allocator.
|
|||
//!Never throws
|
|||
new_allocator& operator=(const new_allocator &) BOOST_NOEXCEPT_OR_NOTHROW |
|||
{ |
|||
return *this; |
|||
} |
|||
|
|||
//!Constructor from related new_allocator.
|
|||
//!Never throws
|
|||
template<class T2> |
|||
new_allocator(const new_allocator<T2> &) BOOST_NOEXCEPT_OR_NOTHROW |
|||
{} |
|||
|
|||
//!Swaps two allocators, does nothing
|
|||
//!because this new_allocator is stateless
|
|||
friend void swap(new_allocator &, new_allocator &) BOOST_NOEXCEPT_OR_NOTHROW |
|||
{} |
|||
|
|||
//!An new_allocator always compares to true, as memory allocated with one
|
|||
//!instance can be deallocated by another instance
|
|||
friend bool operator==(const new_allocator &, const new_allocator &) BOOST_NOEXCEPT_OR_NOTHROW |
|||
{ return true; } |
|||
|
|||
//!An new_allocator always compares to false, as memory allocated with one
|
|||
//!instance can be deallocated by another instance
|
|||
friend bool operator!=(const new_allocator &, const new_allocator &) BOOST_NOEXCEPT_OR_NOTHROW |
|||
{ return false; } |
|||
}; |
|||
|
|||
|
|||
//! This class is a reduced STL-compatible allocator that allocates memory using operator new
|
|||
template<class T> |
|||
class new_allocator |
|||
{ |
|||
public: |
|||
typedef T value_type; |
|||
typedef T * pointer; |
|||
typedef const T * const_pointer; |
|||
typedef T & reference; |
|||
typedef const T & const_reference; |
|||
typedef std::size_t size_type; |
|||
typedef std::ptrdiff_t difference_type; |
|||
//!A integral constant of type bool with value true
|
|||
typedef BOOST_CONTAINER_IMPDEF(new_allocator_bool<true>) propagate_on_container_move_assignment; |
|||
//!A integral constant of type bool with value true
|
|||
typedef BOOST_CONTAINER_IMPDEF(new_allocator_bool<true>) is_always_equal; |
|||
|
|||
//!Obtains an new_allocator that allocates
|
|||
//!objects of type T2
|
|||
template<class T2> |
|||
struct rebind |
|||
{ |
|||
typedef new_allocator<T2> other; |
|||
}; |
|||
|
|||
//!Default constructor
|
|||
//!Never throws
|
|||
new_allocator() BOOST_NOEXCEPT_OR_NOTHROW |
|||
{} |
|||
|
|||
//!Constructor from other new_allocator.
|
|||
//!Never throws
|
|||
new_allocator(const new_allocator &) BOOST_NOEXCEPT_OR_NOTHROW |
|||
{} |
|||
|
|||
//!Copy assignment operator from other new_allocator.
|
|||
//!Never throws
|
|||
new_allocator& operator=(const new_allocator &) BOOST_NOEXCEPT_OR_NOTHROW |
|||
{ |
|||
return *this; |
|||
} |
|||
|
|||
//!Constructor from related new_allocator.
|
|||
//!Never throws
|
|||
template<class T2> |
|||
new_allocator(const new_allocator<T2> &) BOOST_NOEXCEPT_OR_NOTHROW |
|||
{} |
|||
|
|||
//!Allocates memory for an array of count elements.
|
|||
//!Throws bad_alloc if there is no enough memory
|
|||
pointer allocate(size_type count) |
|||
{ |
|||
const std::size_t max_count = std::size_t(-1)/(2*sizeof(T)); |
|||
if(BOOST_UNLIKELY(count > max_count)) |
|||
throw_bad_alloc(); |
|||
return static_cast<T*>(::operator new(count*sizeof(T))); |
|||
} |
|||
|
|||
//!Deallocates previously allocated memory.
|
|||
//!Never throws
|
|||
void deallocate(pointer ptr, size_type n) BOOST_NOEXCEPT_OR_NOTHROW |
|||
{ |
|||
(void)n; |
|||
# if __cpp_sized_deallocation
|
|||
::operator delete((void*)ptr, n * sizeof(T)); |
|||
#else
|
|||
::operator delete((void*)ptr); |
|||
# endif
|
|||
} |
|||
|
|||
//!Returns the maximum number of elements that could be allocated.
|
|||
//!Never throws
|
|||
size_type max_size() const BOOST_NOEXCEPT_OR_NOTHROW |
|||
{ return std::size_t(-1)/(2*sizeof(T)); } |
|||
|
|||
//!Swaps two allocators, does nothing
|
|||
//!because this new_allocator is stateless
|
|||
friend void swap(new_allocator &, new_allocator &) BOOST_NOEXCEPT_OR_NOTHROW |
|||
{} |
|||
|
|||
//!An new_allocator always compares to true, as memory allocated with one
|
|||
//!instance can be deallocated by another instance
|
|||
friend bool operator==(const new_allocator &, const new_allocator &) BOOST_NOEXCEPT_OR_NOTHROW |
|||
{ return true; } |
|||
|
|||
//!An new_allocator always compares to false, as memory allocated with one
|
|||
//!instance can be deallocated by another instance
|
|||
friend bool operator!=(const new_allocator &, const new_allocator &) BOOST_NOEXCEPT_OR_NOTHROW |
|||
{ return false; } |
|||
}; |
|||
|
|||
} //namespace container {
|
|||
} //namespace boost {
|
|||
|
|||
#include <boost/container/detail/config_end.hpp>
|
|||
|
|||
#endif //BOOST_CONTAINER_NEW_ALLOCATOR_HPP
|
@ -0,0 +1,445 @@ |
|||
//////////////////////////////////////////////////////////////////////////////
|
|||
//
|
|||
// (C) Copyright Ion Gaztanaga 2016-2016. 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_NODE_HANDLE_HPP
|
|||
#define BOOST_CONTAINER_NODE_HANDLE_HPP
|
|||
|
|||
#ifndef BOOST_CONFIG_HPP
|
|||
# include <boost/config.hpp>
|
|||
#endif
|
|||
|
|||
#if defined(BOOST_HAS_PRAGMA_ONCE)
|
|||
# pragma once
|
|||
#endif
|
|||
|
|||
#include <boost/container/detail/config_begin.hpp>
|
|||
#include <boost/container/detail/workaround.hpp>
|
|||
#include <boost/static_assert.hpp>
|
|||
#include <boost/container/detail/placement_new.hpp>
|
|||
#include <boost/move/detail/to_raw_pointer.hpp>
|
|||
#include <boost/container/allocator_traits.hpp>
|
|||
#include <boost/container/detail/mpl.hpp>
|
|||
|
|||
#include <boost/move/utility_core.hpp>
|
|||
#include <boost/move/adl_move_swap.hpp>
|
|||
|
|||
#include <boost/container/detail/mpl.hpp>
|
|||
#include <boost/assert.hpp>
|
|||
|
|||
|
|||
//!\file
|
|||
|
|||
namespace boost { |
|||
namespace container { |
|||
|
|||
///@cond
|
|||
|
|||
template<class Value, class KeyMapped> |
|||
struct node_handle_keymapped_traits |
|||
{ |
|||
typedef typename KeyMapped::key_type key_type; |
|||
typedef typename KeyMapped::mapped_type mapped_type; |
|||
}; |
|||
|
|||
template<class Value> |
|||
struct node_handle_keymapped_traits<Value, void> |
|||
{ |
|||
typedef Value key_type; |
|||
typedef Value mapped_type; |
|||
}; |
|||
|
|||
class node_handle_friend |
|||
{ |
|||
public: |
|||
|
|||
template<class NH> |
|||
BOOST_CONTAINER_FORCEINLINE static void destroy_alloc(NH &nh) BOOST_NOEXCEPT |
|||
{ nh.destroy_alloc(); } |
|||
|
|||
template<class NH> |
|||
BOOST_CONTAINER_FORCEINLINE static typename NH::node_pointer &get_node_pointer(NH &nh) BOOST_NOEXCEPT |
|||
{ return nh.get_node_pointer(); } |
|||
}; |
|||
|
|||
|
|||
///@endcond
|
|||
|
|||
//! A node_handle is an object that accepts ownership of a single element from an associative container.
|
|||
//! It may be used to transfer that ownership to another container with compatible nodes. Containers
|
|||
//! with compatible nodes have the same node handle type. Elements may be transferred in either direction
|
|||
//! between container types in the same row:.
|
|||
//!
|
|||
//! Container types with compatible nodes
|
|||
//!
|
|||
//! map<K, T, C1, A> <-> map<K, T, C2, A>
|
|||
//!
|
|||
//! map<K, T, C1, A> <-> multimap<K, T, C2, A>
|
|||
//!
|
|||
//! set<K, C1, A> <-> set<K, C2, A>
|
|||
//!
|
|||
//! set<K, C1, A> <-> multiset<K, C2, A>
|
|||
//!
|
|||
//! If a node handle is not empty, then it contains an allocator that is equal to the allocator of the container
|
|||
//! when the element was extracted. If a node handle is empty, it contains no allocator.
|
|||
template <class NodeAllocator, class KeyMapped = void> |
|||
class node_handle |
|||
{ |
|||
typedef NodeAllocator nallocator_type; |
|||
typedef allocator_traits<NodeAllocator> nator_traits; |
|||
typedef typename nator_traits::value_type priv_node_t; |
|||
typedef typename priv_node_t::value_type priv_value_t; |
|||
typedef node_handle_keymapped_traits<priv_value_t, KeyMapped> keymapped_t; |
|||
|
|||
public: |
|||
typedef priv_value_t value_type; |
|||
typedef typename keymapped_t::key_type key_type; |
|||
typedef typename keymapped_t::mapped_type mapped_type; |
|||
typedef typename nator_traits::template portable_rebind_alloc |
|||
<value_type>::type allocator_type; |
|||
|
|||
typedef priv_node_t container_node_type; |
|||
friend class node_handle_friend; |
|||
|
|||
///@cond
|
|||
private: |
|||
BOOST_MOVABLE_BUT_NOT_COPYABLE(node_handle) |
|||
|
|||
typedef typename nator_traits::pointer node_pointer; |
|||
typedef typename dtl::aligned_storage |
|||
< sizeof(nallocator_type) |
|||
, dtl::alignment_of<nallocator_type>::value |
|||
>::type nalloc_storage_t; |
|||
|
|||
node_pointer m_ptr; |
|||
nalloc_storage_t m_nalloc_storage; |
|||
|
|||
void move_construct_alloc(nallocator_type &al) |
|||
{ ::new((void*)m_nalloc_storage.data, boost_container_new_t()) nallocator_type(::boost::move(al)); } |
|||
|
|||
void destroy_deallocate_node() |
|||
{ |
|||
boost::movelib::to_raw_pointer(m_ptr)->destructor(this->node_alloc()); |
|||
nator_traits::deallocate(this->node_alloc(), m_ptr, 1u); |
|||
} |
|||
|
|||
template<class OtherNodeHandle> |
|||
void move_construct_end(OtherNodeHandle &nh) |
|||
{ |
|||
if(m_ptr){ |
|||
::new ((void*)m_nalloc_storage.data, boost_container_new_t()) nallocator_type(::boost::move(nh.node_alloc())); |
|||
node_handle_friend::destroy_alloc(nh); |
|||
node_handle_friend::get_node_pointer(nh) = node_pointer(); |
|||
} |
|||
BOOST_ASSERT(nh.empty()); |
|||
} |
|||
|
|||
void destroy_alloc() BOOST_NOEXCEPT |
|||
{ static_cast<nallocator_type*>((void*)m_nalloc_storage.data)->~nallocator_type(); } |
|||
|
|||
node_pointer &get_node_pointer() BOOST_NOEXCEPT |
|||
{ return m_ptr; } |
|||
|
|||
///@endcond
|
|||
|
|||
public: |
|||
//! <b>Effects</b>: Initializes m_ptr to nullptr.
|
|||
//!
|
|||
//! <b>Postcondition</b>: this->empty()
|
|||
BOOST_CXX14_CONSTEXPR node_handle() BOOST_NOEXCEPT |
|||
: m_ptr() |
|||
{ } |
|||
|
|||
//! <b>Effects</b>: Constructs a node_handle object initializing internal pointer with p.
|
|||
//! If p != nullptr copy constructs internal allocator from al.
|
|||
node_handle(node_pointer p, const nallocator_type &al) BOOST_NOEXCEPT |
|||
: m_ptr(p) |
|||
{ |
|||
if(m_ptr){ |
|||
::new ((void*)m_nalloc_storage.data, boost_container_new_t()) nallocator_type(al); |
|||
} |
|||
} |
|||
|
|||
//! <b>Effects</b>: Constructs a node_handle object initializing internal pointer with a related nh's internal pointer
|
|||
//! and assigns nullptr to the later. If nh's internal pointer was not nullptr, move constructs internal
|
|||
//! allocator with nh's internal allocator and destroy nh's internal allocator.
|
|||
//!
|
|||
//! <b>Postcondition</b>: nh.empty()
|
|||
//!
|
|||
//! <b>Note</b>: Two node_handle's are related if only one of KeyMapped template parameter
|
|||
//! of a node handle is void.
|
|||
template<class KeyMapped2> |
|||
node_handle( BOOST_RV_REF_BEG node_handle<NodeAllocator, KeyMapped2> BOOST_RV_REF_END nh |
|||
, typename dtl::enable_if_c |
|||
< ((unsigned)dtl::is_same<KeyMapped, void>::value + |
|||
(unsigned)dtl::is_same<KeyMapped2, void>::value) == 1u |
|||
>::type* = 0) BOOST_NOEXCEPT |
|||
: m_ptr(nh.get()) |
|||
{ this->move_construct_end(nh); } |
|||
|
|||
//! <b>Effects</b>: Constructs a node_handle object initializing internal pointer with nh's internal pointer
|
|||
//! and assigns nullptr to the later. If nh's internal pointer was not nullptr, move constructs internal
|
|||
//! allocator with nh's internal allocator and destroy nh's internal allocator.
|
|||
//!
|
|||
//! <b>Postcondition</b>: nh.empty()
|
|||
node_handle (BOOST_RV_REF(node_handle) nh) BOOST_NOEXCEPT |
|||
: m_ptr(nh.m_ptr) |
|||
{ this->move_construct_end(nh); } |
|||
|
|||
//! <b>Effects</b>: If !this->empty(), destroys the value_type subobject in the container_node_type object
|
|||
//! pointed to by c by calling allocator_traits<impl_defined>::destroy, then deallocates m_ptr by calling
|
|||
//! nator_traits::rebind_traits<container_node_type>::deallocate.
|
|||
~node_handle() BOOST_NOEXCEPT |
|||
{ |
|||
if(!this->empty()){ |
|||
this->destroy_deallocate_node(); |
|||
this->destroy_alloc(); |
|||
} |
|||
} |
|||
|
|||
//! <b>Requires</b>: Either this->empty(), or nator_traits::propagate_on_container_move_assignment is true, or
|
|||
//! node_alloc() == nh.node_alloc().
|
|||
//!
|
|||
//! <b>Effects</b>: If m_ptr != nullptr, destroys the value_type subobject in the container_node_type object
|
|||
//! pointed to by m_ptr by calling nator_traits::destroy, then deallocates m_ptr by calling
|
|||
//! nator_traits::deallocate. Assigns nh.m_ptr to m_ptr. If this->empty()
|
|||
//! or nator_traits::propagate_on_container_move_assignment is true, move assigns nh.node_alloc() to
|
|||
//! node_alloc(). Assigns nullptr to nh.m_ptr and assigns nullopt to nh.node_alloc().
|
|||
//!
|
|||
//! <b>Returns</b>: *this.
|
|||
//!
|
|||
//! <b>Throws</b>: Nothing.
|
|||
node_handle & operator=(BOOST_RV_REF(node_handle) nh) BOOST_NOEXCEPT |
|||
{ |
|||
BOOST_ASSERT(this->empty() || nator_traits::propagate_on_container_move_assignment::value |
|||
|| nator_traits::equal(node_alloc(), nh.node_alloc())); |
|||
|
|||
bool const was_this_non_null = !this->empty(); |
|||
bool const was_nh_non_null = !nh.empty(); |
|||
|
|||
if(was_nh_non_null){ |
|||
if(was_this_non_null){ |
|||
this->destroy_deallocate_node(); |
|||
if(nator_traits::propagate_on_container_move_assignment::value){ |
|||
this->node_alloc() = ::boost::move(nh.node_alloc()); |
|||
} |
|||
} |
|||
else{ |
|||
this->move_construct_alloc(nh.node_alloc()); |
|||
} |
|||
m_ptr = nh.m_ptr; |
|||
nh.m_ptr = node_pointer(); |
|||
nh.destroy_alloc(); |
|||
} |
|||
else if(was_this_non_null){ |
|||
this->destroy_deallocate_node(); |
|||
this->destroy_alloc(); |
|||
m_ptr = node_pointer(); |
|||
} |
|||
return *this; |
|||
} |
|||
|
|||
//! <b>Requires</b>: empty() == false.
|
|||
//!
|
|||
//! <b>Returns</b>: A reference to the value_type subobject in the container_node_type object pointed to by m_ptr
|
|||
//!
|
|||
//! <b>Throws</b>: Nothing.
|
|||
value_type& value() const BOOST_NOEXCEPT |
|||
{ |
|||
BOOST_STATIC_ASSERT((dtl::is_same<KeyMapped, void>::value)); |
|||
BOOST_ASSERT(!empty()); |
|||
return m_ptr->get_data(); |
|||
} |
|||
|
|||
//! <b>Requires</b>: empty() == false.
|
|||
//!
|
|||
//! <b>Returns</b>: A non-const reference to the key_type member of the value_type subobject in the
|
|||
//! container_node_type object pointed to by m_ptr.
|
|||
//!
|
|||
//! <b>Throws</b>: Nothing.
|
|||
//!
|
|||
//! <b>Requires</b>: Modifying the key through the returned reference is permitted.
|
|||
key_type& key() const BOOST_NOEXCEPT |
|||
{ |
|||
BOOST_STATIC_ASSERT((!dtl::is_same<KeyMapped, void>::value)); |
|||
BOOST_ASSERT(!empty()); |
|||
return const_cast<key_type &>(KeyMapped().key_of_value(m_ptr->get_data())); |
|||
} |
|||
|
|||
//! <b>Requires</b>: empty() == false.
|
|||
//!
|
|||
//! <b>Returns</b>: A reference to the mapped_type member of the value_type subobject
|
|||
//! in the container_node_type object pointed to by m_ptr
|
|||
//!
|
|||
//! <b>Throws</b>: Nothing.
|
|||
mapped_type& mapped() const BOOST_NOEXCEPT |
|||
{ |
|||
BOOST_STATIC_ASSERT((!dtl::is_same<KeyMapped, void>::value)); |
|||
BOOST_ASSERT(!empty()); |
|||
return KeyMapped().mapped_of_value(m_ptr->get_data()); |
|||
} |
|||
|
|||
//! <b>Requires</b>: empty() == false.
|
|||
//!
|
|||
//! <b>Returns</b>: A copy of the internally hold allocator.
|
|||
//!
|
|||
//! <b>Throws</b>: Nothing.
|
|||
allocator_type get_allocator() const |
|||
{ |
|||
BOOST_ASSERT(!empty()); |
|||
return this->node_alloc(); |
|||
} |
|||
|
|||
//! <b>Returns</b>: m_ptr != nullptr.
|
|||
//!
|
|||
#ifdef BOOST_CONTAINER_DOXYGEN_INVOKED
|
|||
BOOST_CONTAINER_FORCEINLINE explicit operator bool |
|||
#else
|
|||
private: struct bool_conversion {int for_bool; int for_arg(); }; typedef int bool_conversion::* explicit_bool_arg; |
|||
public: BOOST_CONTAINER_FORCEINLINE operator explicit_bool_arg |
|||
#endif
|
|||
()const BOOST_NOEXCEPT |
|||
{ return m_ptr ? &bool_conversion::for_bool : explicit_bool_arg(0); } |
|||
|
|||
//! <b>Returns</b>: m_ptr == nullptr.
|
|||
//!
|
|||
bool empty() const BOOST_NOEXCEPT |
|||
{ |
|||
return !this->m_ptr; |
|||
} |
|||
|
|||
//! <b>Requires</b>: this->empty(), or nh.empty(), or nator_traits::propagate_on_container_swap is true, or
|
|||
//! node_alloc() == nh.node_alloc().
|
|||
//!
|
|||
//! <b>Effects</b>: Calls swap(m_ptr, nh.m_ptr). If this->empty(), or nh.empty(), or nator_traits::propagate_on_-
|
|||
//! container_swap is true calls swap(node_alloc(), nh.node_alloc()).
|
|||
void swap(node_handle &nh) |
|||
BOOST_NOEXCEPT_IF(nator_traits::propagate_on_container_swap::value || nator_traits::is_always_equal::value) |
|||
{ |
|||
BOOST_ASSERT(this->empty() || nh.empty() || nator_traits::propagate_on_container_swap::value |
|||
|| nator_traits::equal(node_alloc(), nh.node_alloc())); |
|||
|
|||
bool const was_this_non_null = !this->empty(); |
|||
bool const was_nh_non_null = !nh.empty(); |
|||
|
|||
if(was_nh_non_null){ |
|||
if(was_this_non_null){ |
|||
if(nator_traits::propagate_on_container_swap::value){ |
|||
::boost::adl_move_swap(this->node_alloc(), nh.node_alloc()); |
|||
} |
|||
} |
|||
else{ |
|||
this->move_construct_alloc(nh.node_alloc()); |
|||
nh.destroy_alloc(); |
|||
} |
|||
} |
|||
else if(was_this_non_null){ |
|||
nh.move_construct_alloc(this->node_alloc()); |
|||
this->destroy_alloc(); |
|||
} |
|||
::boost::adl_move_swap(m_ptr, nh.m_ptr); |
|||
} |
|||
|
|||
//! <b>Effects</b>: If this->empty() returns nullptr, otherwise returns m_ptr
|
|||
//! resets m_ptr to nullptr and destroys the internal allocator.
|
|||
//!
|
|||
//! <b>Postcondition</b>: this->empty()
|
|||
//!
|
|||
//! <b>Note</b>: Non-standard extensions
|
|||
node_pointer release() BOOST_NOEXCEPT |
|||
{ |
|||
node_pointer p(m_ptr); |
|||
m_ptr = node_pointer(); |
|||
if(p) |
|||
this->destroy_alloc(); |
|||
return p; |
|||
} |
|||
|
|||
//! <b>Effects</b>: Returns m_ptr.
|
|||
//!
|
|||
//! <b>Note</b>: Non-standard extensions
|
|||
node_pointer get() const BOOST_NOEXCEPT |
|||
{ |
|||
return m_ptr; |
|||
} |
|||
|
|||
//! <b>Effects</b>: Returns a reference to the internal node allocator.
|
|||
//!
|
|||
//! <b>Note</b>: Non-standard extensions
|
|||
nallocator_type &node_alloc() BOOST_NOEXCEPT |
|||
{ |
|||
BOOST_ASSERT(!empty()); |
|||
return *static_cast<nallocator_type*>((void*)m_nalloc_storage.data); |
|||
} |
|||
|
|||
|
|||
//! <b>Effects</b>: Returns a reference to the internal node allocator.
|
|||
//!
|
|||
//! <b>Note</b>: Non-standard extensions
|
|||
const nallocator_type &node_alloc() const BOOST_NOEXCEPT |
|||
{ |
|||
BOOST_ASSERT(!empty()); |
|||
return *static_cast<const nallocator_type*>((const void*)m_nalloc_storage.data); |
|||
} |
|||
|
|||
//! <b>Effects</b>: x.swap(y).
|
|||
//!
|
|||
friend void swap(node_handle & x, node_handle & y) BOOST_NOEXCEPT_IF(BOOST_NOEXCEPT(x.swap(y))) |
|||
{ x.swap(y); } |
|||
}; |
|||
|
|||
//! A class template used to describe the results of inserting a
|
|||
//! Container::node_type in a Container with unique keys.
|
|||
//! Includes at least the following non-static public data members:
|
|||
//!
|
|||
//! <ul><li>bool inserted</li>;
|
|||
//! <li>Iterator position</li>;
|
|||
//! <li>NodeType node</li></ul>
|
|||
//!
|
|||
//! This type is MoveConstructible, MoveAssignable, DefaultConstructible,
|
|||
//! Destructible, and lvalues of that type are swappable
|
|||
template<class Iterator, class NodeType> |
|||
struct insert_return_type_base |
|||
{ |
|||
private: |
|||
BOOST_MOVABLE_BUT_NOT_COPYABLE(insert_return_type_base) |
|||
|
|||
public: |
|||
insert_return_type_base() |
|||
: inserted(false), position(), node() |
|||
{} |
|||
|
|||
insert_return_type_base(BOOST_RV_REF(insert_return_type_base) other) |
|||
: inserted(other.inserted), position(other.position), node(boost::move(other.node)) |
|||
{} |
|||
|
|||
template<class RelatedIt, class RelatedNode> |
|||
insert_return_type_base(bool insert, RelatedIt it, BOOST_RV_REF(RelatedNode) n) |
|||
: inserted(insert), position(it), node(boost::move(n)) |
|||
{} |
|||
|
|||
insert_return_type_base & operator=(BOOST_RV_REF(insert_return_type_base) other) |
|||
{ |
|||
inserted = other.inserted; |
|||
position = other.position; |
|||
node = boost::move(other.node); |
|||
return *this; |
|||
} |
|||
|
|||
bool inserted; |
|||
Iterator position; |
|||
NodeType node; |
|||
}; |
|||
|
|||
} //namespace container {
|
|||
} //namespace boost {
|
|||
|
|||
#include <boost/container/detail/config_end.hpp>
|
|||
|
|||
#endif //BOOST_CONTAINER_NODE_HANDLE_HPP
|
@ -0,0 +1,671 @@ |
|||
/////////////////////////////////////////////////////////////////////////////
|
|||
//
|
|||
// (C) Copyright Ion Gaztanaga 2013-2013
|
|||
//
|
|||
// 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_OPTIONS_HPP
|
|||
#define BOOST_CONTAINER_OPTIONS_HPP
|
|||
|
|||
#ifndef BOOST_CONFIG_HPP
|
|||
# include <boost/config.hpp>
|
|||
#endif
|
|||
|
|||
#if defined(BOOST_HAS_PRAGMA_ONCE)
|
|||
# pragma once
|
|||
#endif
|
|||
|
|||
#include <boost/container/detail/config_begin.hpp>
|
|||
#include <boost/container/container_fwd.hpp>
|
|||
#include <boost/intrusive/pack_options.hpp>
|
|||
#include <boost/static_assert.hpp>
|
|||
|
|||
namespace boost { |
|||
namespace container { |
|||
|
|||
////////////////////////////////////////////////////////////////
|
|||
//
|
|||
//
|
|||
// OPTIONS FOR ASSOCIATIVE TREE-BASED CONTAINERS
|
|||
//
|
|||
//
|
|||
////////////////////////////////////////////////////////////////
|
|||
|
|||
//! Enumeration used to configure ordered associative containers
|
|||
//! with a concrete tree implementation.
|
|||
enum tree_type_enum |
|||
{ |
|||
red_black_tree, |
|||
avl_tree, |
|||
scapegoat_tree, |
|||
splay_tree |
|||
}; |
|||
|
|||
#if !defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
|
|||
|
|||
template<tree_type_enum TreeType, bool OptimizeSize> |
|||
struct tree_opt |
|||
{ |
|||
static const boost::container::tree_type_enum tree_type = TreeType; |
|||
static const bool optimize_size = OptimizeSize; |
|||
}; |
|||
|
|||
typedef tree_opt<red_black_tree, true> tree_assoc_defaults; |
|||
|
|||
#endif //!defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
|
|||
|
|||
//!This option setter specifies the underlying tree type
|
|||
//!(red-black, AVL, Scapegoat or Splay) for ordered associative containers
|
|||
BOOST_INTRUSIVE_OPTION_CONSTANT(tree_type, tree_type_enum, TreeType, tree_type) |
|||
|
|||
//!This option setter specifies if node size is optimized
|
|||
//!storing rebalancing data masked into pointers for ordered associative containers
|
|||
BOOST_INTRUSIVE_OPTION_CONSTANT(optimize_size, bool, Enabled, optimize_size) |
|||
|
|||
//! Helper metafunction to combine options into a single type to be used
|
|||
//! by \c boost::container::set, \c boost::container::multiset
|
|||
//! \c boost::container::map and \c boost::container::multimap.
|
|||
//! Supported options are: \c boost::container::optimize_size and \c boost::container::tree_type
|
|||
#if defined(BOOST_CONTAINER_DOXYGEN_INVOKED) || defined(BOOST_CONTAINER_VARIADIC_TEMPLATES)
|
|||
template<class ...Options> |
|||
#else
|
|||
template<class O1 = void, class O2 = void, class O3 = void, class O4 = void> |
|||
#endif
|
|||
struct tree_assoc_options |
|||
{ |
|||
/// @cond
|
|||
typedef typename ::boost::intrusive::pack_options |
|||
< tree_assoc_defaults, |
|||
#if !defined(BOOST_CONTAINER_VARIADIC_TEMPLATES)
|
|||
O1, O2, O3, O4 |
|||
#else
|
|||
Options... |
|||
#endif
|
|||
>::type packed_options; |
|||
typedef tree_opt<packed_options::tree_type, packed_options::optimize_size> implementation_defined; |
|||
/// @endcond
|
|||
typedef implementation_defined type; |
|||
}; |
|||
|
|||
#if !defined(BOOST_NO_CXX11_TEMPLATE_ALIASES)
|
|||
|
|||
//! Helper alias metafunction to combine options into a single type to be used
|
|||
//! by tree-based associative containers
|
|||
template<class ...Options> |
|||
using tree_assoc_options_t = typename boost::container::tree_assoc_options<Options...>::type; |
|||
|
|||
#endif
|
|||
|
|||
|
|||
////////////////////////////////////////////////////////////////
|
|||
//
|
|||
//
|
|||
// OPTIONS FOR ASSOCIATIVE HASH-BASED CONTAINERS
|
|||
//
|
|||
//
|
|||
////////////////////////////////////////////////////////////////
|
|||
|
|||
#if !defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
|
|||
|
|||
template<bool StoreHash, bool CacheBegin, bool LinearBuckets, bool FastmodBuckets> |
|||
struct hash_opt |
|||
{ |
|||
static const bool store_hash = StoreHash; |
|||
static const bool cache_begin = CacheBegin; |
|||
static const bool linear_buckets = LinearBuckets; |
|||
static const bool fastmod_buckets = FastmodBuckets; |
|||
}; |
|||
|
|||
typedef hash_opt<false, false, false, false> hash_assoc_defaults; |
|||
|
|||
#endif //!defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
|
|||
|
|||
//!This option setter specifies if nodes also store the hash value
|
|||
//!so that search and rehashing for hash-expensive types is improved.
|
|||
//!This option might degrade performance for easy to hash types (like integers)
|
|||
BOOST_INTRUSIVE_OPTION_CONSTANT(store_hash, bool, Enabled, store_hash) |
|||
|
|||
//!This option setter specifies if the container will cache the first
|
|||
//!non-empty bucket so that begin() is O(1) instead of searching for the
|
|||
//!first non-empty bucket (which can be O(bucket_size()))
|
|||
BOOST_INTRUSIVE_OPTION_CONSTANT(cache_begin, bool, Enabled, cache_begin) |
|||
|
|||
BOOST_INTRUSIVE_OPTION_CONSTANT(linear_buckets, bool, Enabled, linear_buckets) |
|||
|
|||
BOOST_INTRUSIVE_OPTION_CONSTANT(fastmod_buckets, bool, Enabled, fastmod_buckets) |
|||
|
|||
//! Helper metafunction to combine options into a single type to be used
|
|||
//! by \c boost::container::hash_set, \c boost::container::hash_multiset
|
|||
//! \c boost::container::hash_map and \c boost::container::hash_multimap.
|
|||
//! Supported options are: \c boost::container::store_hash
|
|||
#if defined(BOOST_CONTAINER_DOXYGEN_INVOKED) || defined(BOOST_CONTAINER_VARIADIC_TEMPLATES)
|
|||
template<class ...Options> |
|||
#else
|
|||
template<class O1 = void, class O2 = void, class O3 = void, class O4 = void> |
|||
#endif
|
|||
struct hash_assoc_options |
|||
{ |
|||
/// @cond
|
|||
typedef typename ::boost::intrusive::pack_options |
|||
< hash_assoc_defaults, |
|||
#if !defined(BOOST_CONTAINER_VARIADIC_TEMPLATES)
|
|||
O1, O2, O3, O4 |
|||
#else
|
|||
Options... |
|||
#endif
|
|||
>::type packed_options; |
|||
typedef hash_opt<packed_options::store_hash |
|||
,packed_options::cache_begin |
|||
,packed_options::linear_buckets |
|||
,packed_options::fastmod_buckets |
|||
> implementation_defined; |
|||
/// @endcond
|
|||
typedef implementation_defined type; |
|||
}; |
|||
|
|||
#if !defined(BOOST_NO_CXX11_TEMPLATE_ALIASES)
|
|||
|
|||
//! Helper alias metafunction to combine options into a single type to be used
|
|||
//! by hash-based associative containers
|
|||
template<class ...Options> |
|||
using hash_assoc_options_t = typename boost::container::hash_assoc_options<Options...>::type; |
|||
|
|||
#endif
|
|||
|
|||
////////////////////////////////////////////////////////////////
|
|||
//
|
|||
//
|
|||
// OPTIONS FOR VECTOR-BASED CONTAINERS
|
|||
//
|
|||
//
|
|||
////////////////////////////////////////////////////////////////
|
|||
|
|||
#if !defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
|
|||
|
|||
template<class T, class Default> |
|||
struct default_if_void |
|||
{ |
|||
typedef T type; |
|||
}; |
|||
|
|||
template<class Default> |
|||
struct default_if_void<void, Default> |
|||
{ |
|||
typedef Default type; |
|||
}; |
|||
|
|||
template<std::size_t N, std::size_t DefaultN> |
|||
struct default_if_zero |
|||
{ |
|||
static const std::size_t value = N; |
|||
}; |
|||
|
|||
template<std::size_t DefaultN> |
|||
struct default_if_zero<0u, DefaultN> |
|||
{ |
|||
static const std::size_t value = DefaultN; |
|||
}; |
|||
|
|||
|
|||
|
|||
#endif
|
|||
|
|||
#if !defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
|
|||
|
|||
template<class AllocTraits, class StoredSizeType> |
|||
struct get_stored_size_type_with_alloctraits |
|||
{ |
|||
typedef StoredSizeType type; |
|||
}; |
|||
|
|||
template<class AllocTraits> |
|||
struct get_stored_size_type_with_alloctraits<AllocTraits, void> |
|||
{ |
|||
typedef typename AllocTraits::size_type type; |
|||
}; |
|||
|
|||
template<class GrowthType, class StoredSizeType> |
|||
struct vector_opt |
|||
{ |
|||
typedef GrowthType growth_factor_type; |
|||
typedef StoredSizeType stored_size_type; |
|||
|
|||
template<class AllocTraits> |
|||
struct get_stored_size_type |
|||
: get_stored_size_type_with_alloctraits<AllocTraits, StoredSizeType> |
|||
{}; |
|||
}; |
|||
|
|||
class default_next_capacity; |
|||
|
|||
typedef vector_opt<void, void> vector_null_opt; |
|||
|
|||
#else //!defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
|
|||
|
|||
//!This growth factor argument specifies that the container should increase its
|
|||
//!capacity a 50% when existing capacity is exhausted.
|
|||
struct growth_factor_50{}; |
|||
|
|||
//!This growth factor argument specifies that the container should increase its
|
|||
//!capacity a 60% when existing capacity is exhausted.
|
|||
struct growth_factor_60{}; |
|||
|
|||
//!This growth factor argument specifies that the container should increase its
|
|||
//!capacity a 100% (doubling its capacity) when existing capacity is exhausted.
|
|||
struct growth_factor_100{}; |
|||
|
|||
#endif //!defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
|
|||
|
|||
//!This option setter specifies the growth factor strategy of the underlying vector.
|
|||
//!
|
|||
//!\tparam GrowthFactor A function object that has the following signature:<br/><br/>
|
|||
//!`template<class SizeType>`<br/>
|
|||
//!`SizeType operator()(SizeType cur_cap, SizeType add_min_cap, SizeType max_cap) const;`.<br/><br/>
|
|||
//!`cur_cap` is the current capacity, `add_min_cap` is the minimum additional capacity
|
|||
//!we want to achieve and `max_cap` is the maximum capacity that the allocator or other
|
|||
//!factors allow. The implementation should return a value between `cur_cap` + `add_min_cap`
|
|||
//!and `max_cap`. `cur_cap` + `add_min_cap` is guaranteed not to overflow/wraparound,
|
|||
//! but the implementation should handle wraparound produced by the growth factor.
|
|||
//!
|
|||
//!Predefined growth factors that can be passed as arguments to this option are:
|
|||
//!\c boost::container::growth_factor_50
|
|||
//!\c boost::container::growth_factor_60
|
|||
//!\c boost::container::growth_factor_100
|
|||
//!
|
|||
//!If this option is not specified, a default will be used by the container.
|
|||
BOOST_INTRUSIVE_OPTION_TYPE(growth_factor, GrowthFactor, GrowthFactor, growth_factor_type) |
|||
|
|||
//!This option specifies the unsigned integer type that a user wants the container
|
|||
//!to use to hold size-related information inside a container (e.g. current size, current capacity).
|
|||
//!
|
|||
//!\tparam StoredSizeType An unsigned integer type. It shall be smaller than than the size
|
|||
//! of the size_type deduced from `allocator_traits<A>::size_type` or the same type.
|
|||
//!
|
|||
//!If the maximum capacity() to be used is limited, a user can try to use 8-bit, 16-bit
|
|||
//!(e.g. in 32-bit machines), or 32-bit size types (e.g. in a 64 bit machine) to see if some
|
|||
//!memory can be saved for empty vectors. This could potentially performance benefits due to better
|
|||
//!cache usage.
|
|||
//!
|
|||
//!Note that alignment requirements can disallow theoretical space savings. Example:
|
|||
//!\c vector holds a pointer and two size types (for size and capacity), in a 32 bit machine
|
|||
//!a 8 bit size type (total size: 4 byte pointer + 2 x 1 byte sizes = 6 bytes)
|
|||
//!will not save space when comparing two 16-bit size types because usually
|
|||
//!a 32 bit alignment is required for vector and the size will be rounded to 8 bytes. In a 64-bit
|
|||
//!machine a 16 bit size type does not usually save memory when comparing to a 32-bit size type.
|
|||
//!Measure the size of the resulting container and do not assume a smaller \c stored_size
|
|||
//!will always lead to a smaller sizeof(container).
|
|||
//!
|
|||
//!If a user tries to insert more elements than representable by \c stored_size, vector
|
|||
//!will throw a length_error.
|
|||
//!
|
|||
//!If this option is not specified, `allocator_traits<A>::size_type` (usually std::size_t) will
|
|||
//!be used to store size-related information inside the container.
|
|||
BOOST_INTRUSIVE_OPTION_TYPE(stored_size, StoredSizeType, StoredSizeType, stored_size_type) |
|||
|
|||
//! Helper metafunction to combine options into a single type to be used
|
|||
//! by \c boost::container::vector.
|
|||
//! Supported options are: \c boost::container::growth_factor and \c boost::container::stored_size
|
|||
#if defined(BOOST_CONTAINER_DOXYGEN_INVOKED) || defined(BOOST_CONTAINER_VARIADIC_TEMPLATES)
|
|||
template<class ...Options> |
|||
#else
|
|||
template<class O1 = void, class O2 = void, class O3 = void, class O4 = void> |
|||
#endif
|
|||
struct vector_options |
|||
{ |
|||
/// @cond
|
|||
typedef typename ::boost::intrusive::pack_options |
|||
< vector_null_opt, |
|||
#if !defined(BOOST_CONTAINER_VARIADIC_TEMPLATES)
|
|||
O1, O2, O3, O4 |
|||
#else
|
|||
Options... |
|||
#endif
|
|||
>::type packed_options; |
|||
typedef vector_opt< typename packed_options::growth_factor_type |
|||
, typename packed_options::stored_size_type> implementation_defined; |
|||
/// @endcond
|
|||
typedef implementation_defined type; |
|||
}; |
|||
|
|||
#if !defined(BOOST_NO_CXX11_TEMPLATE_ALIASES)
|
|||
|
|||
//! Helper alias metafunction to combine options into a single type to be used
|
|||
//! by \c boost::container::vector.
|
|||
//! Supported options are: \c boost::container::growth_factor and \c boost::container::stored_size
|
|||
template<class ...Options> |
|||
using vector_options_t = typename boost::container::vector_options<Options...>::type; |
|||
|
|||
#endif
|
|||
|
|||
////////////////////////////////////////////////////////////////
|
|||
//
|
|||
//
|
|||
// OPTIONS FOR SMALL-VECTOR CONTAINER
|
|||
//
|
|||
//
|
|||
////////////////////////////////////////////////////////////////
|
|||
|
|||
//! This option specifies the desired alignment for the value_type stored
|
|||
//! in the container.
|
|||
//! A value zero represents the natural alignment.
|
|||
//!
|
|||
//!\tparam Alignment An unsigned integer value. Must be power of two.
|
|||
BOOST_INTRUSIVE_OPTION_CONSTANT(inplace_alignment, std::size_t, Alignment, inplace_alignment) |
|||
|
|||
#if !defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
|
|||
|
|||
template<class GrowthType, std::size_t InplaceAlignment> |
|||
struct small_vector_opt |
|||
{ |
|||
typedef GrowthType growth_factor_type; |
|||
static const std::size_t inplace_alignment = InplaceAlignment; |
|||
}; |
|||
|
|||
typedef small_vector_opt<void, 0u> small_vector_null_opt; |
|||
|
|||
#endif //!defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
|
|||
|
|||
//! Helper metafunction to combine options into a single type to be used
|
|||
//! by \c boost::container::small_vector.
|
|||
//! Supported options are: \c boost::container::growth_factor and \c boost::container::inplace_alignment
|
|||
#if defined(BOOST_CONTAINER_DOXYGEN_INVOKED) || defined(BOOST_CONTAINER_VARIADIC_TEMPLATES)
|
|||
template<class ...Options> |
|||
#else
|
|||
template<class O1 = void, class O2 = void, class O3 = void, class O4 = void> |
|||
#endif
|
|||
struct small_vector_options |
|||
{ |
|||
/// @cond
|
|||
typedef typename ::boost::intrusive::pack_options |
|||
< small_vector_null_opt, |
|||
#if !defined(BOOST_CONTAINER_VARIADIC_TEMPLATES)
|
|||
O1, O2, O3, O4 |
|||
#else
|
|||
Options... |
|||
#endif
|
|||
>::type packed_options; |
|||
typedef small_vector_opt< typename packed_options::growth_factor_type |
|||
, packed_options::inplace_alignment> implementation_defined; |
|||
/// @endcond
|
|||
typedef implementation_defined type; |
|||
}; |
|||
|
|||
#if !defined(BOOST_NO_CXX11_TEMPLATE_ALIASES)
|
|||
|
|||
//! Helper alias metafunction to combine options into a single type to be used
|
|||
//! by \c boost::container::small_vector.
|
|||
//! Supported options are: \c boost::container::growth_factor and \c boost::container::stored_size
|
|||
template<class ...Options> |
|||
using small_vector_options_t = typename boost::container::small_vector_options<Options...>::type; |
|||
|
|||
#endif
|
|||
|
|||
|
|||
////////////////////////////////////////////////////////////////
|
|||
//
|
|||
//
|
|||
// OPTIONS FOR STATIC-VECTOR CONTAINER
|
|||
//
|
|||
//
|
|||
////////////////////////////////////////////////////////////////
|
|||
|
|||
//!This option specifies if the container will throw if in
|
|||
//!the static capacity is not sufficient to hold the required
|
|||
//!values. If false is specified, insufficient capacity will
|
|||
//!lead to BOOST_ASSERT, and if this assertion returns, to undefined behaviour,
|
|||
//!which potentially can lead to better static_vector performance.
|
|||
//!The default value is true.
|
|||
//!
|
|||
//!\tparam ThrowOnExhaustion A boolean value. True if throw is required.
|
|||
BOOST_INTRUSIVE_OPTION_CONSTANT(throw_on_overflow, bool, ThrowOnOverflow, throw_on_overflow) |
|||
|
|||
#if !defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
|
|||
|
|||
template<bool ThrowOnOverflow, std::size_t InplaceAlignment> |
|||
struct static_vector_opt |
|||
{ |
|||
static const bool throw_on_overflow = ThrowOnOverflow; |
|||
static const std::size_t inplace_alignment = InplaceAlignment; |
|||
}; |
|||
|
|||
typedef static_vector_opt<true, 0u> static_vector_null_opt; |
|||
|
|||
#endif //!defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
|
|||
|
|||
//! Helper metafunction to combine options into a single type to be used
|
|||
//! by \c boost::container::static_vector.
|
|||
//! Supported options are: \c boost::container::throw_on_overflow and \c boost::container::inplace_alignment
|
|||
#if defined(BOOST_CONTAINER_DOXYGEN_INVOKED) || defined(BOOST_CONTAINER_VARIADIC_TEMPLATES)
|
|||
template<class ...Options> |
|||
#else
|
|||
template<class O1 = void, class O2 = void, class O3 = void, class O4 = void> |
|||
#endif
|
|||
struct static_vector_options |
|||
{ |
|||
/// @cond
|
|||
typedef typename ::boost::intrusive::pack_options |
|||
< static_vector_null_opt, |
|||
#if !defined(BOOST_CONTAINER_VARIADIC_TEMPLATES)
|
|||
O1, O2, O3, O4 |
|||
#else
|
|||
Options... |
|||
#endif
|
|||
>::type packed_options; |
|||
typedef static_vector_opt< packed_options::throw_on_overflow |
|||
, packed_options::inplace_alignment> implementation_defined; |
|||
/// @endcond
|
|||
typedef implementation_defined type; |
|||
}; |
|||
|
|||
#if !defined(BOOST_NO_CXX11_TEMPLATE_ALIASES)
|
|||
|
|||
//! Helper alias metafunction to combine options into a single type to be used
|
|||
//! by \c boost::container::static_vector.
|
|||
//! Supported options are: \c boost::container::growth_factor and \c boost::container::stored_size
|
|||
template<class ...Options> |
|||
using static_vector_options_t = typename boost::container::static_vector_options<Options...>::type; |
|||
|
|||
#endif
|
|||
|
|||
|
|||
////////////////////////////////////////////////////////////////
|
|||
//
|
|||
//
|
|||
// OPTIONS FOR DEVECTOR CONTAINER
|
|||
//
|
|||
//
|
|||
////////////////////////////////////////////////////////////////
|
|||
|
|||
//!Thse options specify the relocation strategy of devector.
|
|||
//!
|
|||
//!Predefined relocation limits that can be passed as arguments to this option are:
|
|||
//!\c boost::container::relocate_on_66
|
|||
//!\c boost::container::relocate_on_75
|
|||
//!\c boost::container::relocate_on_80
|
|||
//!\c boost::container::relocate_on_85
|
|||
//!\c boost::container::relocate_on_90
|
|||
//!
|
|||
//!If this option is not specified, a default will be used by the container.
|
|||
//!
|
|||
//!Note: Repeated insertions at only one end (only back insertions or only front insertions) usually will
|
|||
//!lead to a single relocation when `relocate_on_66` is used and two relocations when `relocate_on_90`
|
|||
//!is used.
|
|||
|
|||
#if !defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
|
|||
|
|||
BOOST_INTRUSIVE_OPTION_CONSTANT(relocate_on, std::size_t, Fraction, free_fraction) |
|||
|
|||
struct relocate_on_66 : public relocate_on<3U>{}; |
|||
|
|||
struct relocate_on_75 : public relocate_on<4U> {}; |
|||
|
|||
struct relocate_on_80 : public relocate_on<5U> {}; |
|||
|
|||
struct relocate_on_85 : public relocate_on<7U> {}; |
|||
|
|||
struct relocate_on_90 : public relocate_on<10U> {}; |
|||
|
|||
template<class GrowthType, class StoredSizeType, std::size_t FreeFraction> |
|||
struct devector_opt |
|||
: vector_opt<GrowthType, StoredSizeType> |
|||
{ |
|||
static const std::size_t free_fraction = FreeFraction; |
|||
}; |
|||
|
|||
typedef devector_opt<void, void, 0u> devector_null_opt; |
|||
|
|||
#else
|
|||
|
|||
//!This relocation condition option specifies that the container will never relocate
|
|||
//!elements when there is no space at the side the insertion should
|
|||
//!take place
|
|||
struct relocate_never; |
|||
|
|||
//!This relocation condition option specifies that the container will relocate
|
|||
//!all elements when there is no space at the side the insertion should
|
|||
//!take place and memory usage is below 66% (2/3)
|
|||
struct relocate_on_66; |
|||
|
|||
//!This relocation condition option specifies that the container will relocate
|
|||
//!all elements when there is no space at the side the insertion should
|
|||
//!take place and memory usage is below 75% (3/4)
|
|||
struct relocate_on_75; |
|||
|
|||
//!This relocation condition option specifies that the container will relocate
|
|||
//!all elements when there is no space at the side the insertion should
|
|||
//!take place and memory usage is below 80% (4/5)
|
|||
struct relocate_on_80; |
|||
|
|||
//!This relocation condition option specifies that the container will relocate
|
|||
//!all elements when there is no space at the side the insertion should
|
|||
//!take place and memory usage is below 85% (6/7)
|
|||
struct relocate_on_85; |
|||
|
|||
//!This relocation condition option specifies that the container will relocate
|
|||
//!all elements when there is no space at the side the insertion should
|
|||
//!take place and memory usage is below 90% (9/10)
|
|||
struct relocate_on_90; |
|||
|
|||
#endif
|
|||
|
|||
|
|||
//! Helper metafunction to combine options into a single type to be used
|
|||
//! by \c boost::container::devector.
|
|||
//! Supported options are: \c boost::container::growth_factor, \c boost::container::stored_size
|
|||
//! and \c boost::container::relocate_on
|
|||
#if defined(BOOST_CONTAINER_DOXYGEN_INVOKED) || defined(BOOST_CONTAINER_VARIADIC_TEMPLATES)
|
|||
template<class ...Options> |
|||
#else
|
|||
template<class O1 = void, class O2 = void, class O3 = void, class O4 = void> |
|||
#endif
|
|||
struct devector_options |
|||
{ |
|||
/// @cond
|
|||
typedef typename ::boost::intrusive::pack_options |
|||
< devector_null_opt, |
|||
#if !defined(BOOST_CONTAINER_VARIADIC_TEMPLATES)
|
|||
O1, O2, O3, O4 |
|||
#else
|
|||
Options... |
|||
#endif
|
|||
>::type packed_options; |
|||
typedef devector_opt< typename packed_options::growth_factor_type |
|||
, typename packed_options::stored_size_type |
|||
, packed_options::free_fraction |
|||
> implementation_defined; |
|||
/// @endcond
|
|||
typedef implementation_defined type; |
|||
}; |
|||
|
|||
#if !defined(BOOST_NO_CXX11_TEMPLATE_ALIASES)
|
|||
|
|||
//! Helper alias metafunction to combine options into a single type to be used
|
|||
//! by \c boost::container::devector.
|
|||
//! Supported options are: \c boost::container::growth_factor and \c boost::container::stored_size
|
|||
template<class ...Options> |
|||
using devector_options_t = typename boost::container::devector_options<Options...>::type; |
|||
|
|||
#endif
|
|||
|
|||
////////////////////////////////////////////////////////////////
|
|||
//
|
|||
//
|
|||
// OPTIONS FOR DEQUE-BASED CONTAINERS
|
|||
//
|
|||
//
|
|||
////////////////////////////////////////////////////////////////
|
|||
|
|||
#if !defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
|
|||
|
|||
template<std::size_t BlockBytes, std::size_t BlockSize> |
|||
struct deque_opt |
|||
{ |
|||
static const std::size_t block_bytes = BlockBytes; |
|||
static const std::size_t block_size = BlockSize; |
|||
BOOST_STATIC_ASSERT_MSG(!(block_bytes && block_size), "block_bytes and block_size can't be specified at the same time"); |
|||
}; |
|||
|
|||
typedef deque_opt<0u, 0u> deque_null_opt; |
|||
|
|||
#endif
|
|||
|
|||
//! Helper metafunction to combine options into a single type to be used
|
|||
//! by \c boost::container::deque.
|
|||
//! Supported options are: \c boost::container::block_bytes
|
|||
#if defined(BOOST_CONTAINER_DOXYGEN_INVOKED) || defined(BOOST_CONTAINER_VARIADIC_TEMPLATES)
|
|||
template<class ...Options> |
|||
#else
|
|||
template<class O1 = void, class O2 = void, class O3 = void, class O4 = void> |
|||
#endif
|
|||
struct deque_options |
|||
{ |
|||
/// @cond
|
|||
typedef typename ::boost::intrusive::pack_options |
|||
< deque_null_opt, |
|||
#if !defined(BOOST_CONTAINER_VARIADIC_TEMPLATES)
|
|||
O1, O2, O3, O4 |
|||
#else
|
|||
Options... |
|||
#endif
|
|||
>::type packed_options; |
|||
typedef deque_opt< packed_options::block_bytes, packed_options::block_size > implementation_defined; |
|||
/// @endcond
|
|||
typedef implementation_defined type; |
|||
}; |
|||
|
|||
#if !defined(BOOST_NO_CXX11_TEMPLATE_ALIASES)
|
|||
|
|||
//! Helper alias metafunction to combine options into a single type to be used
|
|||
//! by \c boost::container::deque.
|
|||
//! Supported options are: \c boost::container::block_bytes
|
|||
template<class ...Options> |
|||
using deque_options_t = typename boost::container::deque_options<Options...>::type; |
|||
|
|||
#endif
|
|||
|
|||
//!This option specifies the maximum size of a block in bytes: this delimites the number of contiguous elements
|
|||
//!that will be allocated by deque as min(1u, BlockBytes/sizeof(value_type))
|
|||
//!A value zero represents the default value.
|
|||
//!
|
|||
//!\tparam BlockBytes An unsigned integer value.
|
|||
BOOST_INTRUSIVE_OPTION_CONSTANT(block_bytes, std::size_t, BlockBytes, block_bytes) |
|||
|
|||
//!This option specifies the size of a block, delimites the number of contiguous elements
|
|||
//!that will be allocated by deque as BlockSize.
|
|||
//!A value zero represents the default value.
|
|||
//!
|
|||
//!\tparam BlockBytes An unsigned integer value.
|
|||
BOOST_INTRUSIVE_OPTION_CONSTANT(block_size, std::size_t, BlockSize, block_size) |
|||
|
|||
} //namespace container {
|
|||
} //namespace boost {
|
|||
|
|||
#include <boost/container/detail/config_end.hpp>
|
|||
|
|||
#endif //#ifndef BOOST_CONTAINER_OPTIONS_HPP
|
3625
src/boost/container/string.hpp
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,295 @@ |
|||
//////////////////////////////////////////////////////////////////////////////
|
|||
//
|
|||
// (C) Copyright Ion Gaztanaga 2012-2013. 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_THROW_EXCEPTION_HPP
|
|||
#define BOOST_CONTAINER_THROW_EXCEPTION_HPP
|
|||
|
|||
#ifndef BOOST_CONFIG_HPP
|
|||
# include <boost/config.hpp>
|
|||
#endif
|
|||
|
|||
#if defined(BOOST_HAS_PRAGMA_ONCE)
|
|||
# pragma once
|
|||
#endif
|
|||
|
|||
#include <boost/container/detail/config_begin.hpp>
|
|||
#include <boost/container/detail/workaround.hpp>
|
|||
|
|||
#ifndef BOOST_NO_EXCEPTIONS
|
|||
#include <exception> //for std exception base
|
|||
|
|||
# if defined(BOOST_CONTAINER_USE_STD_EXCEPTIONS)
|
|||
#include <stdexcept> //for std::out_of_range, std::length_error, std::logic_error, std::runtime_error
|
|||
#include <string> //for implicit std::string conversion
|
|||
#include <new> //for std::bad_alloc
|
|||
|
|||
namespace boost { |
|||
namespace container { |
|||
|
|||
typedef std::bad_alloc bad_alloc_t; |
|||
typedef std::out_of_range out_of_range_t; |
|||
typedef std::length_error length_error_t; |
|||
typedef std::logic_error logic_error_t; |
|||
typedef std::runtime_error runtime_error_t; |
|||
|
|||
}} //namespace boost::container
|
|||
|
|||
# else //!BOOST_CONTAINER_USE_STD_EXCEPTIONS
|
|||
|
|||
namespace boost { |
|||
namespace container { |
|||
|
|||
class BOOST_SYMBOL_VISIBLE exception |
|||
: public ::std::exception |
|||
{ |
|||
typedef ::std::exception std_exception_t; |
|||
|
|||
public: |
|||
|
|||
//msg must be a static string (guaranteed by callers)
|
|||
explicit exception(const char *msg) |
|||
: std_exception_t(), m_msg(msg) |
|||
{} |
|||
|
|||
virtual const char *what() const BOOST_NOEXCEPT_OR_NOTHROW BOOST_OVERRIDE |
|||
{ return m_msg ? m_msg : "unknown boost::container exception"; } |
|||
|
|||
private: |
|||
const char *m_msg; |
|||
}; |
|||
|
|||
class BOOST_SYMBOL_VISIBLE bad_alloc |
|||
: public exception |
|||
{ |
|||
public: |
|||
bad_alloc() |
|||
: exception("boost::container::bad_alloc thrown") |
|||
{} |
|||
}; |
|||
|
|||
typedef bad_alloc bad_alloc_t; |
|||
|
|||
class BOOST_SYMBOL_VISIBLE out_of_range |
|||
: public exception |
|||
{ |
|||
public: |
|||
explicit out_of_range(const char *msg) |
|||
: exception(msg) |
|||
{} |
|||
}; |
|||
|
|||
typedef out_of_range out_of_range_t; |
|||
|
|||
class BOOST_SYMBOL_VISIBLE length_error |
|||
: public exception |
|||
{ |
|||
public: |
|||
explicit length_error(const char *msg) |
|||
: exception(msg) |
|||
{} |
|||
}; |
|||
|
|||
typedef length_error length_error_t; |
|||
|
|||
class BOOST_SYMBOL_VISIBLE logic_error |
|||
: public exception |
|||
{ |
|||
public: |
|||
explicit logic_error(const char *msg) |
|||
: exception(msg) |
|||
{} |
|||
}; |
|||
|
|||
typedef logic_error logic_error_t; |
|||
|
|||
class BOOST_SYMBOL_VISIBLE runtime_error |
|||
: public exception |
|||
{ |
|||
public: |
|||
explicit runtime_error(const char *msg) |
|||
: exception(msg) |
|||
{} |
|||
}; |
|||
|
|||
typedef runtime_error runtime_error_t; |
|||
|
|||
} // namespace boost {
|
|||
} // namespace container {
|
|||
|
|||
# endif
|
|||
#else
|
|||
#include <boost/assert.hpp>
|
|||
#include <cstdlib> //for std::abort
|
|||
#endif
|
|||
|
|||
namespace boost { |
|||
namespace container { |
|||
|
|||
#if defined(BOOST_CONTAINER_USER_DEFINED_THROW_CALLBACKS)
|
|||
//The user must provide definitions for the following functions
|
|||
|
|||
BOOST_NORETURN void throw_bad_alloc(); |
|||
|
|||
BOOST_NORETURN void throw_out_of_range(const char* str); |
|||
|
|||
BOOST_NORETURN void throw_length_error(const char* str); |
|||
|
|||
BOOST_NORETURN void throw_logic_error(const char* str); |
|||
|
|||
BOOST_NORETURN void throw_runtime_error(const char* str); |
|||
|
|||
#elif defined(BOOST_NO_EXCEPTIONS)
|
|||
|
|||
BOOST_NORETURN inline void throw_bad_alloc() |
|||
{ |
|||
BOOST_ASSERT(!"boost::container bad_alloc thrown"); |
|||
std::abort(); |
|||
} |
|||
|
|||
BOOST_NORETURN inline void throw_out_of_range(const char* str) |
|||
{ |
|||
boost::container::ignore(str); |
|||
BOOST_ASSERT_MSG(!"boost::container out_of_range thrown", str); |
|||
std::abort(); |
|||
} |
|||
|
|||
BOOST_NORETURN inline void throw_length_error(const char* str) |
|||
{ |
|||
boost::container::ignore(str); |
|||
BOOST_ASSERT_MSG(!"boost::container length_error thrown", str); |
|||
std::abort(); |
|||
} |
|||
|
|||
BOOST_NORETURN inline void throw_logic_error(const char* str) |
|||
{ |
|||
boost::container::ignore(str); |
|||
BOOST_ASSERT_MSG(!"boost::container logic_error thrown", str); |
|||
std::abort(); |
|||
} |
|||
|
|||
BOOST_NORETURN inline void throw_runtime_error(const char* str) |
|||
{ |
|||
boost::container::ignore(str); |
|||
BOOST_ASSERT_MSG(!"boost::container runtime_error thrown", str); |
|||
std::abort(); |
|||
} |
|||
|
|||
#else //defined(BOOST_NO_EXCEPTIONS)
|
|||
|
|||
//! Exception callback called by Boost.Container when fails to allocate the requested storage space.
|
|||
//! <ul>
|
|||
//! <li>If BOOST_NO_EXCEPTIONS is NOT defined and BOOST_CONTAINER_USE_STD_EXCEPTIONS is NOT defined
|
|||
//! <code>boost::container::bad_alloc(str)</code> is thrown.</li>
|
|||
//!
|
|||
//! <li>If BOOST_NO_EXCEPTIONS is NOT defined and BOOST_CONTAINER_USE_STD_EXCEPTIONS is defined
|
|||
//! <code>std::bad_alloc(str)</code> is thrown.</li>
|
|||
//!
|
|||
//! <li>If BOOST_NO_EXCEPTIONS is defined and BOOST_CONTAINER_USER_DEFINED_THROW_CALLBACKS
|
|||
//! is NOT defined <code>BOOST_ASSERT(!"boost::container bad_alloc thrown")</code> is called
|
|||
//! and <code>std::abort()</code> if the former returns.</li>
|
|||
//!
|
|||
//! <li>If BOOST_NO_EXCEPTIONS and BOOST_CONTAINER_USER_DEFINED_THROW_CALLBACKS are defined
|
|||
//! the user must provide an implementation and the function should not return.</li>
|
|||
//! </ul>
|
|||
BOOST_NORETURN inline void throw_bad_alloc() |
|||
{ |
|||
throw bad_alloc_t(); |
|||
} |
|||
|
|||
//! Exception callback called by Boost.Container to signal arguments out of range.
|
|||
//! <ul>
|
|||
//! <li>If BOOST_NO_EXCEPTIONS is NOT defined and BOOST_CONTAINER_USE_STD_EXCEPTIONS is NOT defined
|
|||
//! <code>boost::container::out_of_range(str)</code> is thrown.</li>
|
|||
//!
|
|||
//! <li>If BOOST_NO_EXCEPTIONS is NOT defined and BOOST_CONTAINER_USE_STD_EXCEPTIONS is defined
|
|||
//! <code>std::out_of_range(str)</code> is thrown.</li>
|
|||
//!
|
|||
//! <li>If BOOST_NO_EXCEPTIONS is defined and BOOST_CONTAINER_USER_DEFINED_THROW_CALLBACKS
|
|||
//! is NOT defined <code>BOOST_ASSERT_MSG(!"boost::container out_of_range thrown", str)</code> is called
|
|||
//! and <code>std::abort()</code> if the former returns.</li>
|
|||
//!
|
|||
//! <li>If BOOST_NO_EXCEPTIONS and BOOST_CONTAINER_USER_DEFINED_THROW_CALLBACKS are defined
|
|||
//! the user must provide an implementation and the function should not return.</li>
|
|||
//! </ul>
|
|||
BOOST_NORETURN inline void throw_out_of_range(const char* str) |
|||
{ |
|||
throw out_of_range_t(str); |
|||
} |
|||
|
|||
//! Exception callback called by Boost.Container to signal errors resizing.
|
|||
//! <ul>
|
|||
//!
|
|||
//! <li>If BOOST_NO_EXCEPTIONS is NOT defined and BOOST_CONTAINER_USE_STD_EXCEPTIONS is NOT defined
|
|||
//! <code>boost::container::length_error(str)</code> is thrown.</li>
|
|||
//!
|
|||
//! <li>If BOOST_NO_EXCEPTIONS is NOT defined and BOOST_CONTAINER_USE_STD_EXCEPTIONS is defined
|
|||
//! <code>std::length_error(str)</code> is thrown.</li>
|
|||
//!
|
|||
//! <li>If BOOST_NO_EXCEPTIONS is defined and BOOST_CONTAINER_USER_DEFINED_THROW_CALLBACKS
|
|||
//! is NOT defined <code>BOOST_ASSERT_MSG(!"boost::container length_error thrown", str)</code> is called
|
|||
//! and <code>std::abort()</code> if the former returns.</li>
|
|||
//!
|
|||
//! <li>If BOOST_NO_EXCEPTIONS and BOOST_CONTAINER_USER_DEFINED_THROW_CALLBACKS are defined
|
|||
//! the user must provide an implementation and the function should not return.</li>
|
|||
//! </ul>
|
|||
BOOST_NORETURN inline void throw_length_error(const char* str) |
|||
{ |
|||
throw length_error_t(str); |
|||
} |
|||
|
|||
//! Exception callback called by Boost.Container to report errors in the internal logical
|
|||
//! of the program, such as violation of logical preconditions or class invariants.
|
|||
//! <ul>
|
|||
//!
|
|||
//! <li>If BOOST_NO_EXCEPTIONS is NOT defined and BOOST_CONTAINER_USE_STD_EXCEPTIONS is NOT defined
|
|||
//! <code>boost::container::logic_error(str)</code> is thrown.</li>
|
|||
//!
|
|||
//! <li>If BOOST_NO_EXCEPTIONS is NOT defined and BOOST_CONTAINER_USE_STD_EXCEPTIONS is defined
|
|||
//! <code>std::logic_error(str)</code> is thrown.</li>
|
|||
//!
|
|||
//! <li>If BOOST_NO_EXCEPTIONS is defined and BOOST_CONTAINER_USER_DEFINED_THROW_CALLBACKS
|
|||
//! is NOT defined <code>BOOST_ASSERT_MSG(!"boost::container logic_error thrown", str)</code> is called
|
|||
//! and <code>std::abort()</code> if the former returns.</li>
|
|||
//!
|
|||
//! <li>If BOOST_NO_EXCEPTIONS and BOOST_CONTAINER_USER_DEFINED_THROW_CALLBACKS are defined
|
|||
//! the user must provide an implementation and the function should not return.</li>
|
|||
//! </ul>
|
|||
BOOST_NORETURN inline void throw_logic_error(const char* str) |
|||
{ |
|||
throw logic_error_t(str); |
|||
} |
|||
|
|||
//! Exception callback called by Boost.Container to report errors that can only be detected during runtime.
|
|||
//! <ul>
|
|||
//! <li>If BOOST_NO_EXCEPTIONS is NOT defined and BOOST_CONTAINER_USE_STD_EXCEPTIONS is NOT defined
|
|||
//! <code>boost::container::runtime_error(str)</code> is thrown.</li>
|
|||
//!
|
|||
//! <li>If BOOST_NO_EXCEPTIONS is NOT defined and BOOST_CONTAINER_USE_STD_EXCEPTIONS is defined
|
|||
//! <code>std::runtime_error(str)</code> is thrown.</li>
|
|||
//!
|
|||
//! <li>If BOOST_NO_EXCEPTIONS is defined and BOOST_CONTAINER_USER_DEFINED_THROW_CALLBACKS
|
|||
//! is NOT defined <code>BOOST_ASSERT_MSG(!"boost::container runtime_error thrown", str)</code> is called
|
|||
//! and <code>std::abort()</code> if the former returns.</li>
|
|||
//!
|
|||
//! <li>If BOOST_NO_EXCEPTIONS and BOOST_CONTAINER_USER_DEFINED_THROW_CALLBACKS are defined
|
|||
//! the user must provide an implementation and the function should not return.</li>
|
|||
//! </ul>
|
|||
BOOST_NORETURN inline void throw_runtime_error(const char* str) |
|||
{ |
|||
throw runtime_error_t(str); |
|||
} |
|||
|
|||
#endif
|
|||
|
|||
}} //namespace boost { namespace container {
|
|||
|
|||
#include <boost/container/detail/config_end.hpp>
|
|||
|
|||
#endif //#ifndef BOOST_CONTAINER_THROW_EXCEPTION_HPP
|
3188
src/boost/container/vector.hpp
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,126 @@ |
|||
#ifndef BOOST_CORE_DEMANGLE_HPP_INCLUDED
|
|||
#define BOOST_CORE_DEMANGLE_HPP_INCLUDED
|
|||
|
|||
// core::demangle
|
|||
//
|
|||
// Copyright 2014 Peter Dimov
|
|||
// Copyright 2014 Andrey Semashev
|
|||
//
|
|||
// 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
|
|||
|
|||
#include <boost/config.hpp>
|
|||
#include <string>
|
|||
|
|||
#if defined(BOOST_HAS_PRAGMA_ONCE)
|
|||
# pragma once
|
|||
#endif
|
|||
|
|||
// __has_include is currently supported by GCC and Clang. However GCC 4.9 may have issues and
|
|||
// returns 1 for 'defined( __has_include )', while '__has_include' is actually not supported:
|
|||
// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63662
|
|||
#if defined( __has_include ) && (!defined( BOOST_GCC ) || (__GNUC__ + 0) >= 5)
|
|||
# if __has_include(<cxxabi.h>)
|
|||
# define BOOST_CORE_HAS_CXXABI_H
|
|||
# endif
|
|||
#elif defined( __GLIBCXX__ ) || defined( __GLIBCPP__ )
|
|||
# define BOOST_CORE_HAS_CXXABI_H
|
|||
#endif
|
|||
|
|||
#if defined( BOOST_CORE_HAS_CXXABI_H )
|
|||
# include <cxxabi.h>
|
|||
// For some archtectures (mips, mips64, x86, x86_64) cxxabi.h in Android NDK is implemented by gabi++ library
|
|||
// (https://android.googlesource.com/platform/ndk/+/master/sources/cxx-stl/gabi++/), which does not implement
|
|||
// abi::__cxa_demangle(). We detect this implementation by checking the include guard here.
|
|||
# if defined( __GABIXX_CXXABI_H__ )
|
|||
# undef BOOST_CORE_HAS_CXXABI_H
|
|||
# else
|
|||
# include <cstdlib>
|
|||
# include <cstddef>
|
|||
# endif
|
|||
#endif
|
|||
|
|||
namespace boost |
|||
{ |
|||
|
|||
namespace core |
|||
{ |
|||
|
|||
inline char const * demangle_alloc( char const * name ) BOOST_NOEXCEPT; |
|||
inline void demangle_free( char const * name ) BOOST_NOEXCEPT; |
|||
|
|||
class scoped_demangled_name |
|||
{ |
|||
private: |
|||
char const * m_p; |
|||
|
|||
public: |
|||
explicit scoped_demangled_name( char const * name ) BOOST_NOEXCEPT : |
|||
m_p( demangle_alloc( name ) ) |
|||
{ |
|||
} |
|||
|
|||
~scoped_demangled_name() BOOST_NOEXCEPT |
|||
{ |
|||
demangle_free( m_p ); |
|||
} |
|||
|
|||
char const * get() const BOOST_NOEXCEPT |
|||
{ |
|||
return m_p; |
|||
} |
|||
|
|||
BOOST_DELETED_FUNCTION(scoped_demangled_name( scoped_demangled_name const& )) |
|||
BOOST_DELETED_FUNCTION(scoped_demangled_name& operator= ( scoped_demangled_name const& )) |
|||
}; |
|||
|
|||
|
|||
#if defined( BOOST_CORE_HAS_CXXABI_H )
|
|||
|
|||
inline char const * demangle_alloc( char const * name ) BOOST_NOEXCEPT |
|||
{ |
|||
int status = 0; |
|||
std::size_t size = 0; |
|||
return abi::__cxa_demangle( name, NULL, &size, &status ); |
|||
} |
|||
|
|||
inline void demangle_free( char const * name ) BOOST_NOEXCEPT |
|||
{ |
|||
std::free( const_cast< char* >( name ) ); |
|||
} |
|||
|
|||
inline std::string demangle( char const * name ) |
|||
{ |
|||
scoped_demangled_name demangled_name( name ); |
|||
char const * p = demangled_name.get(); |
|||
if( !p ) |
|||
p = name; |
|||
return p; |
|||
} |
|||
|
|||
#else
|
|||
|
|||
inline char const * demangle_alloc( char const * name ) BOOST_NOEXCEPT |
|||
{ |
|||
return name; |
|||
} |
|||
|
|||
inline void demangle_free( char const * ) BOOST_NOEXCEPT |
|||
{ |
|||
} |
|||
|
|||
inline std::string demangle( char const * name ) |
|||
{ |
|||
return name; |
|||
} |
|||
|
|||
#endif
|
|||
|
|||
} // namespace core
|
|||
|
|||
} // namespace boost
|
|||
|
|||
#undef BOOST_CORE_HAS_CXXABI_H
|
|||
|
|||
#endif // #ifndef BOOST_CORE_DEMANGLE_HPP_INCLUDED
|
@ -0,0 +1,128 @@ |
|||
// Boost enable_if library
|
|||
|
|||
// Copyright 2003 (c) The Trustees of Indiana University.
|
|||
|
|||
// 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)
|
|||
|
|||
// Authors: Jaakko Jarvi (jajarvi at osl.iu.edu)
|
|||
// Jeremiah Willcock (jewillco at osl.iu.edu)
|
|||
// Andrew Lumsdaine (lums at osl.iu.edu)
|
|||
|
|||
|
|||
#ifndef BOOST_CORE_ENABLE_IF_HPP
|
|||
#define BOOST_CORE_ENABLE_IF_HPP
|
|||
|
|||
#include "boost/config.hpp"
|
|||
|
|||
// Even the definition of enable_if causes problems on some compilers,
|
|||
// so it's macroed out for all compilers that do not support SFINAE
|
|||
|
|||
#ifndef BOOST_NO_SFINAE
|
|||
|
|||
namespace boost |
|||
{ |
|||
template<typename T, typename R=void> |
|||
struct enable_if_has_type |
|||
{ |
|||
typedef R type; |
|||
}; |
|||
|
|||
template <bool B, class T = void> |
|||
struct enable_if_c { |
|||
typedef T type; |
|||
}; |
|||
|
|||
template <class T> |
|||
struct enable_if_c<false, T> {}; |
|||
|
|||
template <class Cond, class T = void> |
|||
struct enable_if : public enable_if_c<Cond::value, T> {}; |
|||
|
|||
template <bool B, class T> |
|||
struct lazy_enable_if_c { |
|||
typedef typename T::type type; |
|||
}; |
|||
|
|||
template <class T> |
|||
struct lazy_enable_if_c<false, T> {}; |
|||
|
|||
template <class Cond, class T> |
|||
struct lazy_enable_if : public lazy_enable_if_c<Cond::value, T> {}; |
|||
|
|||
|
|||
template <bool B, class T = void> |
|||
struct disable_if_c { |
|||
typedef T type; |
|||
}; |
|||
|
|||
template <class T> |
|||
struct disable_if_c<true, T> {}; |
|||
|
|||
template <class Cond, class T = void> |
|||
struct disable_if : public disable_if_c<Cond::value, T> {}; |
|||
|
|||
template <bool B, class T> |
|||
struct lazy_disable_if_c { |
|||
typedef typename T::type type; |
|||
}; |
|||
|
|||
template <class T> |
|||
struct lazy_disable_if_c<true, T> {}; |
|||
|
|||
template <class Cond, class T> |
|||
struct lazy_disable_if : public lazy_disable_if_c<Cond::value, T> {}; |
|||
|
|||
} // namespace boost
|
|||
|
|||
#else
|
|||
|
|||
namespace boost { |
|||
|
|||
namespace detail { typedef void enable_if_default_T; } |
|||
|
|||
template <typename T> |
|||
struct enable_if_does_not_work_on_this_compiler; |
|||
|
|||
template<typename T, typename R=void> |
|||
struct enable_if_has_type : enable_if_does_not_work_on_this_compiler<T> |
|||
{ }; |
|||
|
|||
template <bool B, class T = detail::enable_if_default_T> |
|||
struct enable_if_c : enable_if_does_not_work_on_this_compiler<T> |
|||
{ }; |
|||
|
|||
template <bool B, class T = detail::enable_if_default_T> |
|||
struct disable_if_c : enable_if_does_not_work_on_this_compiler<T> |
|||
{ }; |
|||
|
|||
template <bool B, class T = detail::enable_if_default_T> |
|||
struct lazy_enable_if_c : enable_if_does_not_work_on_this_compiler<T> |
|||
{ }; |
|||
|
|||
template <bool B, class T = detail::enable_if_default_T> |
|||
struct lazy_disable_if_c : enable_if_does_not_work_on_this_compiler<T> |
|||
{ }; |
|||
|
|||
template <class Cond, class T = detail::enable_if_default_T> |
|||
struct enable_if : enable_if_does_not_work_on_this_compiler<T> |
|||
{ }; |
|||
|
|||
template <class Cond, class T = detail::enable_if_default_T> |
|||
struct disable_if : enable_if_does_not_work_on_this_compiler<T> |
|||
{ }; |
|||
|
|||
template <class Cond, class T = detail::enable_if_default_T> |
|||
struct lazy_enable_if : enable_if_does_not_work_on_this_compiler<T> |
|||
{ }; |
|||
|
|||
template <class Cond, class T = detail::enable_if_default_T> |
|||
struct lazy_disable_if : enable_if_does_not_work_on_this_compiler<T> |
|||
{ }; |
|||
|
|||
} // namespace boost
|
|||
|
|||
#endif // BOOST_NO_SFINAE
|
|||
|
|||
#endif
|
@ -0,0 +1,93 @@ |
|||
// Copyright (C) 2007, 2008 Steven Watanabe, Joseph Gauterin, Niels Dekker
|
|||
// Copyright (C) 2023 Andrey Semashev
|
|||
//
|
|||
// 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)
|
|||
// For more information, see http://www.boost.org
|
|||
|
|||
#ifndef BOOST_CORE_INVOKE_SWAP_HPP
|
|||
#define BOOST_CORE_INVOKE_SWAP_HPP
|
|||
|
|||
// Note: the implementation of this utility contains various workarounds:
|
|||
// - invoke_swap_impl is put outside the boost namespace, to avoid infinite
|
|||
// recursion (causing stack overflow) when swapping objects of a primitive
|
|||
// type.
|
|||
// - std::swap is imported with a using-directive, rather than
|
|||
// a using-declaration, because some compilers (including MSVC 7.1,
|
|||
// Borland 5.9.3, and Intel 8.1) don't do argument-dependent lookup
|
|||
// when it has a using-declaration instead.
|
|||
// - The main entry function is called invoke_swap rather than swap
|
|||
// to avoid forming an infinite recursion when the arguments are not
|
|||
// swappable.
|
|||
|
|||
#include <boost/core/enable_if.hpp>
|
|||
#include <boost/config.hpp>
|
|||
#if __cplusplus >= 201103L || defined(BOOST_DINKUMWARE_STDLIB)
|
|||
#include <utility> // for std::swap (C++11)
|
|||
#else
|
|||
#include <algorithm> // for std::swap (C++98)
|
|||
#endif
|
|||
#include <cstddef> // for std::size_t
|
|||
|
|||
#ifdef BOOST_HAS_PRAGMA_ONCE
|
|||
#pragma once
|
|||
#endif
|
|||
|
|||
#if defined(BOOST_GCC) && (BOOST_GCC < 40700)
|
|||
// gcc 4.6 ICEs on noexcept specifications below
|
|||
#define BOOST_CORE_SWAP_NOEXCEPT_IF(x)
|
|||
#else
|
|||
#define BOOST_CORE_SWAP_NOEXCEPT_IF(x) BOOST_NOEXCEPT_IF(x)
|
|||
#endif
|
|||
|
|||
namespace boost_swap_impl { |
|||
|
|||
// we can't use type_traits here
|
|||
|
|||
template<class T> struct is_const { enum _vt { value = 0 }; }; |
|||
template<class T> struct is_const<T const> { enum _vt { value = 1 }; }; |
|||
|
|||
// Use std::swap if argument dependent lookup fails.
|
|||
// We need to have this at namespace scope to be able to use unqualified swap() call
|
|||
// in noexcept specification.
|
|||
using namespace std; |
|||
|
|||
template<class T> |
|||
BOOST_GPU_ENABLED |
|||
inline void invoke_swap_impl(T& left, T& right) BOOST_CORE_SWAP_NOEXCEPT_IF(BOOST_NOEXCEPT_EXPR(swap(left, right))) |
|||
{ |
|||
swap(left, right); |
|||
} |
|||
|
|||
template<class T, std::size_t N> |
|||
BOOST_GPU_ENABLED |
|||
inline void invoke_swap_impl(T (& left)[N], T (& right)[N]) |
|||
BOOST_CORE_SWAP_NOEXCEPT_IF(BOOST_NOEXCEPT_EXPR(::boost_swap_impl::invoke_swap_impl(left[0], right[0]))) |
|||
{ |
|||
for (std::size_t i = 0; i < N; ++i) |
|||
{ |
|||
::boost_swap_impl::invoke_swap_impl(left[i], right[i]); |
|||
} |
|||
} |
|||
|
|||
} // namespace boost_swap_impl
|
|||
|
|||
namespace boost { |
|||
namespace core { |
|||
|
|||
template<class T> |
|||
BOOST_GPU_ENABLED |
|||
inline typename enable_if_c< !::boost_swap_impl::is_const<T>::value >::type |
|||
invoke_swap(T& left, T& right) |
|||
BOOST_CORE_SWAP_NOEXCEPT_IF(BOOST_NOEXCEPT_EXPR(::boost_swap_impl::invoke_swap_impl(left, right))) |
|||
{ |
|||
::boost_swap_impl::invoke_swap_impl(left, right); |
|||
} |
|||
|
|||
} // namespace core
|
|||
} // namespace boost
|
|||
|
|||
#undef BOOST_CORE_SWAP_NOEXCEPT_IF
|
|||
|
|||
#endif // BOOST_CORE_INVOKE_SWAP_HPP
|
@ -0,0 +1,345 @@ |
|||
#ifndef BOOST_CORE_REF_HPP
|
|||
#define BOOST_CORE_REF_HPP
|
|||
|
|||
#include <boost/config.hpp>
|
|||
#include <boost/config/workaround.hpp>
|
|||
#include <boost/core/addressof.hpp>
|
|||
#include <boost/core/enable_if.hpp>
|
|||
|
|||
#if defined(BOOST_HAS_PRAGMA_ONCE)
|
|||
# pragma once
|
|||
#endif
|
|||
|
|||
//
|
|||
// ref.hpp - ref/cref, useful helper functions
|
|||
//
|
|||
// Copyright (C) 1999, 2000 Jaakko Jarvi (jaakko.jarvi@cs.utu.fi)
|
|||
// Copyright (C) 2001, 2002 Peter Dimov
|
|||
// Copyright (C) 2002 David Abrahams
|
|||
//
|
|||
// Copyright (C) 2014 Glen Joseph Fernandes
|
|||
// (glenjofe@gmail.com)
|
|||
//
|
|||
// Copyright (C) 2014 Agustin Berge
|
|||
//
|
|||
// 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/core/doc/html/core/ref.html for documentation.
|
|||
//
|
|||
|
|||
/**
|
|||
@file |
|||
*/ |
|||
|
|||
/**
|
|||
Boost namespace. |
|||
*/ |
|||
namespace boost |
|||
{ |
|||
|
|||
#if defined( BOOST_MSVC ) && BOOST_WORKAROUND( BOOST_MSVC, == 1600 )
|
|||
|
|||
struct ref_workaround_tag {}; |
|||
|
|||
#endif
|
|||
|
|||
namespace detail |
|||
{ |
|||
|
|||
template< class Y, class T > struct ref_convertible |
|||
{ |
|||
typedef char (&yes) [1]; |
|||
typedef char (&no) [2]; |
|||
|
|||
static yes f( T* ); |
|||
static no f( ... ); |
|||
|
|||
enum _vt { value = sizeof( (f)( static_cast<Y*>(0) ) ) == sizeof(yes) }; |
|||
}; |
|||
|
|||
#if defined(BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS)
|
|||
struct ref_empty |
|||
{ |
|||
}; |
|||
#endif
|
|||
|
|||
} // namespace detail
|
|||
|
|||
// reference_wrapper
|
|||
|
|||
/**
|
|||
@brief Contains a reference to an object of type `T`. |
|||
|
|||
`reference_wrapper` is primarily used to "feed" references to |
|||
function templates (algorithms) that take their parameter by |
|||
value. It provides an implicit conversion to `T&`, which |
|||
usually allows the function templates to work on references |
|||
unmodified. |
|||
*/ |
|||
template<class T> class reference_wrapper |
|||
{ |
|||
public: |
|||
/**
|
|||
Type `T`. |
|||
*/ |
|||
typedef T type; |
|||
|
|||
/**
|
|||
Constructs a `reference_wrapper` object that stores a |
|||
reference to `t`. |
|||
|
|||
@remark Does not throw. |
|||
*/ |
|||
BOOST_FORCEINLINE explicit reference_wrapper(T& t) BOOST_NOEXCEPT : t_(boost::addressof(t)) {} |
|||
|
|||
#if defined( BOOST_MSVC ) && BOOST_WORKAROUND( BOOST_MSVC, == 1600 )
|
|||
|
|||
BOOST_FORCEINLINE explicit reference_wrapper( T & t, ref_workaround_tag ) BOOST_NOEXCEPT : t_( boost::addressof( t ) ) {} |
|||
|
|||
#endif
|
|||
|
|||
#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
|
|||
/**
|
|||
@remark Construction from a temporary object is disabled. |
|||
*/ |
|||
BOOST_DELETED_FUNCTION(reference_wrapper(T&& t)) |
|||
public: |
|||
#endif
|
|||
|
|||
template<class Y> friend class reference_wrapper; |
|||
|
|||
/**
|
|||
Constructs a `reference_wrapper` object that stores the |
|||
reference stored in the compatible `reference_wrapper` `r`. |
|||
|
|||
@remark Only enabled when `Y*` is convertible to `T*`. |
|||
@remark Does not throw. |
|||
*/ |
|||
#if !defined(BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS)
|
|||
template<class Y, class = typename enable_if_c<boost::detail::ref_convertible<Y, T>::value>::type> |
|||
reference_wrapper( reference_wrapper<Y> r ) BOOST_NOEXCEPT : t_( r.t_ ) |
|||
{ |
|||
} |
|||
#else
|
|||
template<class Y> reference_wrapper( reference_wrapper<Y> r, |
|||
typename enable_if_c<boost::detail::ref_convertible<Y, T>::value, |
|||
boost::detail::ref_empty>::type = boost::detail::ref_empty() ) BOOST_NOEXCEPT : t_( r.t_ ) |
|||
{ |
|||
} |
|||
#endif
|
|||
|
|||
/**
|
|||
@return The stored reference. |
|||
@remark Does not throw. |
|||
*/ |
|||
BOOST_FORCEINLINE operator T& () const BOOST_NOEXCEPT { return *t_; } |
|||
|
|||
/**
|
|||
@return The stored reference. |
|||
@remark Does not throw. |
|||
*/ |
|||
BOOST_FORCEINLINE T& get() const BOOST_NOEXCEPT { return *t_; } |
|||
|
|||
/**
|
|||
@return A pointer to the object referenced by the stored |
|||
reference. |
|||
@remark Does not throw. |
|||
*/ |
|||
BOOST_FORCEINLINE T* get_pointer() const BOOST_NOEXCEPT { return t_; } |
|||
|
|||
private: |
|||
|
|||
T* t_; |
|||
}; |
|||
|
|||
// ref
|
|||
|
|||
/**
|
|||
@cond |
|||
*/ |
|||
#if defined( BOOST_BORLANDC ) && BOOST_WORKAROUND( BOOST_BORLANDC, BOOST_TESTED_AT(0x581) )
|
|||
# define BOOST_REF_CONST
|
|||
#else
|
|||
# define BOOST_REF_CONST const
|
|||
#endif
|
|||
/**
|
|||
@endcond |
|||
*/ |
|||
|
|||
/**
|
|||
@return `reference_wrapper<T>(t)` |
|||
@remark Does not throw. |
|||
*/ |
|||
template<class T> BOOST_FORCEINLINE reference_wrapper<T> BOOST_REF_CONST ref( T & t ) BOOST_NOEXCEPT |
|||
{ |
|||
#if defined( BOOST_MSVC ) && BOOST_WORKAROUND( BOOST_MSVC, == 1600 )
|
|||
|
|||
return reference_wrapper<T>( t, ref_workaround_tag() ); |
|||
|
|||
#else
|
|||
|
|||
return reference_wrapper<T>( t ); |
|||
|
|||
#endif
|
|||
} |
|||
|
|||
// cref
|
|||
|
|||
/**
|
|||
@return `reference_wrapper<T const>(t)` |
|||
@remark Does not throw. |
|||
*/ |
|||
template<class T> BOOST_FORCEINLINE reference_wrapper<T const> BOOST_REF_CONST cref( T const & t ) BOOST_NOEXCEPT |
|||
{ |
|||
return reference_wrapper<T const>(t); |
|||
} |
|||
|
|||
#undef BOOST_REF_CONST
|
|||
|
|||
#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
|
|||
|
|||
/**
|
|||
@cond |
|||
*/ |
|||
#if defined(BOOST_NO_CXX11_DELETED_FUNCTIONS)
|
|||
# define BOOST_REF_DELETE
|
|||
#else
|
|||
# define BOOST_REF_DELETE = delete
|
|||
#endif
|
|||
/**
|
|||
@endcond |
|||
*/ |
|||
|
|||
/**
|
|||
@remark Construction from a temporary object is disabled. |
|||
*/ |
|||
template<class T> void ref(T const&&) BOOST_REF_DELETE; |
|||
|
|||
/**
|
|||
@remark Construction from a temporary object is disabled. |
|||
*/ |
|||
template<class T> void cref(T const&&) BOOST_REF_DELETE; |
|||
|
|||
#undef BOOST_REF_DELETE
|
|||
|
|||
#endif
|
|||
|
|||
// is_reference_wrapper
|
|||
|
|||
/**
|
|||
@brief Determine if a type `T` is an instantiation of |
|||
`reference_wrapper`. |
|||
|
|||
The value static constant will be true if the type `T` is a |
|||
specialization of `reference_wrapper`. |
|||
*/ |
|||
template<typename T> struct is_reference_wrapper |
|||
{ |
|||
BOOST_STATIC_CONSTANT( bool, value = false ); |
|||
}; |
|||
|
|||
/**
|
|||
@cond |
|||
*/ |
|||
template<typename T> struct is_reference_wrapper< reference_wrapper<T> > |
|||
{ |
|||
BOOST_STATIC_CONSTANT( bool, value = true ); |
|||
}; |
|||
|
|||
#if !defined(BOOST_NO_CV_SPECIALIZATIONS)
|
|||
|
|||
template<typename T> struct is_reference_wrapper< reference_wrapper<T> const > |
|||
{ |
|||
BOOST_STATIC_CONSTANT( bool, value = true ); |
|||
}; |
|||
|
|||
template<typename T> struct is_reference_wrapper< reference_wrapper<T> volatile > |
|||
{ |
|||
BOOST_STATIC_CONSTANT( bool, value = true ); |
|||
}; |
|||
|
|||
template<typename T> struct is_reference_wrapper< reference_wrapper<T> const volatile > |
|||
{ |
|||
BOOST_STATIC_CONSTANT( bool, value = true ); |
|||
}; |
|||
|
|||
#endif // !defined(BOOST_NO_CV_SPECIALIZATIONS)
|
|||
|
|||
/**
|
|||
@endcond |
|||
*/ |
|||
|
|||
|
|||
// unwrap_reference
|
|||
|
|||
/**
|
|||
@brief Find the type in a `reference_wrapper`. |
|||
|
|||
The `typedef` type is `T::type` if `T` is a |
|||
`reference_wrapper`, `T` otherwise. |
|||
*/ |
|||
template<typename T> struct unwrap_reference |
|||
{ |
|||
typedef T type; |
|||
}; |
|||
|
|||
/**
|
|||
@cond |
|||
*/ |
|||
template<typename T> struct unwrap_reference< reference_wrapper<T> > |
|||
{ |
|||
typedef T type; |
|||
}; |
|||
|
|||
#if !defined(BOOST_NO_CV_SPECIALIZATIONS)
|
|||
|
|||
template<typename T> struct unwrap_reference< reference_wrapper<T> const > |
|||
{ |
|||
typedef T type; |
|||
}; |
|||
|
|||
template<typename T> struct unwrap_reference< reference_wrapper<T> volatile > |
|||
{ |
|||
typedef T type; |
|||
}; |
|||
|
|||
template<typename T> struct unwrap_reference< reference_wrapper<T> const volatile > |
|||
{ |
|||
typedef T type; |
|||
}; |
|||
|
|||
#endif // !defined(BOOST_NO_CV_SPECIALIZATIONS)
|
|||
|
|||
/**
|
|||
@endcond |
|||
*/ |
|||
|
|||
// unwrap_ref
|
|||
|
|||
/**
|
|||
@return `unwrap_reference<T>::type&(t)` |
|||
@remark Does not throw. |
|||
*/ |
|||
template<class T> BOOST_FORCEINLINE typename unwrap_reference<T>::type& unwrap_ref( T & t ) BOOST_NOEXCEPT |
|||
{ |
|||
return t; |
|||
} |
|||
|
|||
// get_pointer
|
|||
|
|||
/**
|
|||
@cond |
|||
*/ |
|||
template<class T> BOOST_FORCEINLINE T* get_pointer( reference_wrapper<T> const & r ) BOOST_NOEXCEPT |
|||
{ |
|||
return r.get_pointer(); |
|||
} |
|||
/**
|
|||
@endcond |
|||
*/ |
|||
|
|||
} // namespace boost
|
|||
|
|||
#endif // #ifndef BOOST_CORE_REF_HPP
|
@ -0,0 +1,167 @@ |
|||
#ifndef BOOST_CORE_TYPEINFO_HPP_INCLUDED
|
|||
#define BOOST_CORE_TYPEINFO_HPP_INCLUDED
|
|||
|
|||
// MS compatible compilers support #pragma once
|
|||
|
|||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
|
|||
# pragma once
|
|||
#endif
|
|||
|
|||
// core::typeinfo, BOOST_CORE_TYPEID
|
|||
//
|
|||
// Copyright 2007, 2014 Peter Dimov
|
|||
//
|
|||
// 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)
|
|||
|
|||
#include <boost/config.hpp>
|
|||
|
|||
#if defined( BOOST_NO_TYPEID )
|
|||
|
|||
#include <boost/current_function.hpp>
|
|||
#include <functional>
|
|||
#include <cstring>
|
|||
|
|||
namespace boost |
|||
{ |
|||
|
|||
namespace core |
|||
{ |
|||
|
|||
class typeinfo |
|||
{ |
|||
private: |
|||
|
|||
typeinfo( typeinfo const& ); |
|||
typeinfo& operator=( typeinfo const& ); |
|||
|
|||
char const * name_; |
|||
void (*lib_id_)(); |
|||
|
|||
public: |
|||
|
|||
typeinfo( char const * name, void (*lib_id)() ): name_( name ), lib_id_( lib_id ) |
|||
{ |
|||
} |
|||
|
|||
bool operator==( typeinfo const& rhs ) const |
|||
{ |
|||
#if ( defined(_WIN32) || defined(__CYGWIN__) ) && ( defined(__GNUC__) || defined(__clang__) ) && !defined(BOOST_DISABLE_CURRENT_FUNCTION)
|
|||
|
|||
return lib_id_ == rhs.lib_id_? this == &rhs: std::strcmp( name_, rhs.name_ ) == 0; |
|||
|
|||
#else
|
|||
|
|||
return this == &rhs; |
|||
|
|||
#endif
|
|||
} |
|||
|
|||
bool operator!=( typeinfo const& rhs ) const |
|||
{ |
|||
return !( *this == rhs ); |
|||
} |
|||
|
|||
bool before( typeinfo const& rhs ) const |
|||
{ |
|||
#if ( defined(_WIN32) || defined(__CYGWIN__) ) && ( defined(__GNUC__) || defined(__clang__) ) && !defined(BOOST_DISABLE_CURRENT_FUNCTION)
|
|||
|
|||
return lib_id_ == rhs.lib_id_? std::less< typeinfo const* >()( this, &rhs ): std::strcmp( name_, rhs.name_ ) < 0; |
|||
|
|||
#else
|
|||
|
|||
return std::less< typeinfo const* >()( this, &rhs ); |
|||
|
|||
#endif
|
|||
} |
|||
|
|||
char const* name() const |
|||
{ |
|||
return name_; |
|||
} |
|||
}; |
|||
|
|||
inline char const * demangled_name( core::typeinfo const & ti ) |
|||
{ |
|||
return ti.name(); |
|||
} |
|||
|
|||
} // namespace core
|
|||
|
|||
namespace detail |
|||
{ |
|||
|
|||
template<class T> struct BOOST_SYMBOL_VISIBLE core_typeid_ |
|||
{ |
|||
static boost::core::typeinfo ti_; |
|||
|
|||
static char const * name() |
|||
{ |
|||
return BOOST_CURRENT_FUNCTION; |
|||
} |
|||
}; |
|||
|
|||
BOOST_SYMBOL_VISIBLE inline void core_typeid_lib_id() |
|||
{ |
|||
} |
|||
|
|||
template<class T> boost::core::typeinfo core_typeid_< T >::ti_( core_typeid_< T >::name(), &core_typeid_lib_id ); |
|||
|
|||
template<class T> struct core_typeid_< T & >: core_typeid_< T > |
|||
{ |
|||
}; |
|||
|
|||
template<class T> struct core_typeid_< T const >: core_typeid_< T > |
|||
{ |
|||
}; |
|||
|
|||
template<class T> struct core_typeid_< T volatile >: core_typeid_< T > |
|||
{ |
|||
}; |
|||
|
|||
template<class T> struct core_typeid_< T const volatile >: core_typeid_< T > |
|||
{ |
|||
}; |
|||
|
|||
} // namespace detail
|
|||
|
|||
} // namespace boost
|
|||
|
|||
#define BOOST_CORE_TYPEID(T) (boost::detail::core_typeid_<T>::ti_)
|
|||
|
|||
#else
|
|||
|
|||
#include <boost/core/demangle.hpp>
|
|||
#include <typeinfo>
|
|||
|
|||
namespace boost |
|||
{ |
|||
|
|||
namespace core |
|||
{ |
|||
|
|||
#if defined( BOOST_NO_STD_TYPEINFO )
|
|||
|
|||
typedef ::type_info typeinfo; |
|||
|
|||
#else
|
|||
|
|||
typedef std::type_info typeinfo; |
|||
|
|||
#endif
|
|||
|
|||
inline std::string demangled_name( core::typeinfo const & ti ) |
|||
{ |
|||
return core::demangle( ti.name() ); |
|||
} |
|||
|
|||
} // namespace core
|
|||
|
|||
} // namespace boost
|
|||
|
|||
#define BOOST_CORE_TYPEID(T) typeid(T)
|
|||
|
|||
#endif
|
|||
|
|||
#endif // #ifndef BOOST_CORE_TYPEINFO_HPP_INCLUDED
|
@ -0,0 +1,17 @@ |
|||
/*
|
|||
Copyright 2019 Glen Joseph Fernandes |
|||
(glenjofe@gmail.com) |
|||
|
|||
Distributed under the Boost Software License, Version 1.0. |
|||
(http://www.boost.org/LICENSE_1_0.txt)
|
|||
*/ |
|||
#ifndef BOOST_CORE_USE_DEFAULT_HPP
|
|||
#define BOOST_CORE_USE_DEFAULT_HPP
|
|||
|
|||
namespace boost { |
|||
|
|||
struct use_default { }; |
|||
|
|||
} /* boost */ |
|||
|
|||
#endif
|
@ -0,0 +1,193 @@ |
|||
/* Copyright 2003-2013 Joaquin M Lopez Munoz.
|
|||
* 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 Boost website at http://www.boost.org/
|
|||
*/ |
|||
|
|||
#ifndef BOOST_DETAIL_ALLOCATOR_UTILITIES_HPP
|
|||
#define BOOST_DETAIL_ALLOCATOR_UTILITIES_HPP
|
|||
|
|||
#include <boost/config.hpp> /* keep it first to prevent nasty warns in MSVC */
|
|||
#include <boost/detail/workaround.hpp>
|
|||
#include <boost/detail/select_type.hpp>
|
|||
#include <boost/type_traits/is_same.hpp>
|
|||
#include <cstddef>
|
|||
#include <memory>
|
|||
#include <new>
|
|||
|
|||
namespace boost{ |
|||
|
|||
namespace detail{ |
|||
|
|||
/* Allocator adaption layer. Some stdlibs provide allocators without rebind
|
|||
* and template ctors. These facilities are simulated with the external |
|||
* template class rebind_to and the aid of partial_std_allocator_wrapper. |
|||
*/ |
|||
|
|||
namespace allocator{ |
|||
|
|||
/* partial_std_allocator_wrapper inherits the functionality of a std
|
|||
* allocator while providing a templatized ctor and other bits missing |
|||
* in some stdlib implementation or another. |
|||
*/ |
|||
|
|||
template<typename Type> |
|||
class partial_std_allocator_wrapper:public std::allocator<Type> |
|||
{ |
|||
public: |
|||
/* Oddly enough, STLport does not define std::allocator<void>::value_type
|
|||
* when configured to work without partial template specialization. |
|||
* No harm in supplying the definition here unconditionally. |
|||
*/ |
|||
|
|||
typedef Type value_type; |
|||
|
|||
partial_std_allocator_wrapper(){} |
|||
|
|||
template<typename Other> |
|||
partial_std_allocator_wrapper(const partial_std_allocator_wrapper<Other>&){} |
|||
|
|||
partial_std_allocator_wrapper(const std::allocator<Type>& x): |
|||
std::allocator<Type>(x) |
|||
{ |
|||
} |
|||
|
|||
#if defined(BOOST_DINKUMWARE_STDLIB)
|
|||
/* Dinkumware guys didn't provide a means to call allocate() without
|
|||
* supplying a hint, in disagreement with the standard. |
|||
*/ |
|||
|
|||
Type* allocate(std::size_t n,const void* hint=0) |
|||
{ |
|||
std::allocator<Type>& a=*this; |
|||
return a.allocate(n,hint); |
|||
} |
|||
#endif
|
|||
|
|||
}; |
|||
|
|||
/* Detects whether a given allocator belongs to a defective stdlib not
|
|||
* having the required member templates. |
|||
* Note that it does not suffice to check the Boost.Config stdlib |
|||
* macros, as the user might have passed a custom, compliant allocator. |
|||
* The checks also considers partial_std_allocator_wrapper to be |
|||
* a standard defective allocator. |
|||
*/ |
|||
|
|||
#if defined(BOOST_NO_STD_ALLOCATOR)&&\
|
|||
(defined(BOOST_HAS_PARTIAL_STD_ALLOCATOR)||defined(BOOST_DINKUMWARE_STDLIB)) |
|||
|
|||
template<typename Allocator> |
|||
struct is_partial_std_allocator |
|||
{ |
|||
BOOST_STATIC_CONSTANT(bool, |
|||
value= |
|||
(is_same< |
|||
std::allocator<BOOST_DEDUCED_TYPENAME Allocator::value_type>, |
|||
Allocator |
|||
>::value)|| |
|||
(is_same< |
|||
partial_std_allocator_wrapper< |
|||
BOOST_DEDUCED_TYPENAME Allocator::value_type>, |
|||
Allocator |
|||
>::value)); |
|||
}; |
|||
|
|||
#else
|
|||
|
|||
template<typename Allocator> |
|||
struct is_partial_std_allocator |
|||
{ |
|||
BOOST_STATIC_CONSTANT(bool,value=false); |
|||
}; |
|||
|
|||
#endif
|
|||
|
|||
/* rebind operations for defective std allocators */ |
|||
|
|||
template<typename Allocator,typename Type> |
|||
struct partial_std_allocator_rebind_to |
|||
{ |
|||
typedef partial_std_allocator_wrapper<Type> type; |
|||
}; |
|||
|
|||
/* rebind operation in all other cases */ |
|||
|
|||
template<typename Allocator> |
|||
struct rebinder |
|||
{ |
|||
template<typename Type> |
|||
struct result |
|||
{ |
|||
#ifdef BOOST_NO_CXX11_ALLOCATOR
|
|||
typedef typename Allocator::BOOST_NESTED_TEMPLATE |
|||
rebind<Type>::other other; |
|||
#else
|
|||
typedef typename std::allocator_traits<Allocator>::BOOST_NESTED_TEMPLATE |
|||
rebind_alloc<Type> other; |
|||
#endif
|
|||
}; |
|||
}; |
|||
|
|||
template<typename Allocator,typename Type> |
|||
struct compliant_allocator_rebind_to |
|||
{ |
|||
typedef typename rebinder<Allocator>:: |
|||
BOOST_NESTED_TEMPLATE result<Type>::other type; |
|||
}; |
|||
|
|||
/* rebind front-end */ |
|||
|
|||
template<typename Allocator,typename Type> |
|||
struct rebind_to: |
|||
boost::detail::if_true< |
|||
is_partial_std_allocator<Allocator>::value |
|||
>::template then< |
|||
partial_std_allocator_rebind_to<Allocator,Type>, |
|||
compliant_allocator_rebind_to<Allocator,Type> |
|||
>::type |
|||
{ |
|||
}; |
|||
|
|||
/* allocator-independent versions of construct and destroy */ |
|||
|
|||
template<typename Type> |
|||
void construct(void* p,const Type& t) |
|||
{ |
|||
new (p) Type(t); |
|||
} |
|||
|
|||
#if BOOST_WORKAROUND(BOOST_MSVC,BOOST_TESTED_AT(1500))
|
|||
/* MSVC++ issues spurious warnings about unreferencend formal parameters
|
|||
* in destroy<Type> when Type is a class with trivial dtor. |
|||
*/ |
|||
|
|||
#pragma warning(push)
|
|||
#pragma warning(disable:4100)
|
|||
#endif
|
|||
|
|||
template<typename Type> |
|||
void destroy(const Type* p) |
|||
{ |
|||
|
|||
#if BOOST_WORKAROUND(__SUNPRO_CC,BOOST_TESTED_AT(0x590))
|
|||
const_cast<Type*>(p)->~Type(); |
|||
#else
|
|||
p->~Type(); |
|||
#endif
|
|||
|
|||
} |
|||
|
|||
#if BOOST_WORKAROUND(BOOST_MSVC,BOOST_TESTED_AT(1500))
|
|||
#pragma warning(pop)
|
|||
#endif
|
|||
|
|||
} /* namespace boost::detail::allocator */ |
|||
|
|||
} /* namespace boost::detail */ |
|||
|
|||
} /* namespace boost */ |
|||
|
|||
#endif
|
@ -0,0 +1,21 @@ |
|||
#ifndef BOOST_DETAIL_ATOMIC_COUNT_HPP_INCLUDED
|
|||
#define BOOST_DETAIL_ATOMIC_COUNT_HPP_INCLUDED
|
|||
|
|||
// MS compatible compilers support #pragma once
|
|||
|
|||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
|
|||
# pragma once
|
|||
#endif
|
|||
|
|||
//
|
|||
// boost/detail/atomic_count.hpp - thread/SMP safe reference counter
|
|||
//
|
|||
// Copyright (c) 2001, 2002 Peter Dimov and Multi Media Ltd.
|
|||
//
|
|||
// 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
|
|||
|
|||
#include <boost/smart_ptr/detail/atomic_count.hpp>
|
|||
|
|||
#endif // #ifndef BOOST_DETAIL_ATOMIC_COUNT_HPP_INCLUDED
|
@ -0,0 +1,172 @@ |
|||
// (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000.
|
|||
// Use, modification and distribution are 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/utility for most recent version including documentation.
|
|||
|
|||
// call_traits: defines typedefs for function usage
|
|||
// (see libs/utility/call_traits.htm)
|
|||
|
|||
/* Release notes:
|
|||
23rd July 2000: |
|||
Fixed array specialization. (JM) |
|||
Added Borland specific fixes for reference types |
|||
(issue raised by Steve Cleary). |
|||
*/ |
|||
|
|||
#ifndef BOOST_DETAIL_CALL_TRAITS_HPP
|
|||
#define BOOST_DETAIL_CALL_TRAITS_HPP
|
|||
|
|||
#ifndef BOOST_CONFIG_HPP
|
|||
#include <boost/config.hpp>
|
|||
#endif
|
|||
#include <cstddef>
|
|||
|
|||
#include <boost/type_traits/is_arithmetic.hpp>
|
|||
#include <boost/type_traits/is_enum.hpp>
|
|||
#include <boost/type_traits/is_pointer.hpp>
|
|||
#include <boost/detail/workaround.hpp>
|
|||
|
|||
namespace boost{ |
|||
|
|||
namespace detail{ |
|||
|
|||
template <typename T, bool small_> |
|||
struct ct_imp2 |
|||
{ |
|||
typedef const T& param_type; |
|||
}; |
|||
|
|||
template <typename T> |
|||
struct ct_imp2<T, true> |
|||
{ |
|||
typedef const T param_type; |
|||
}; |
|||
|
|||
template <typename T, bool isp, bool b1, bool b2> |
|||
struct ct_imp |
|||
{ |
|||
typedef const T& param_type; |
|||
}; |
|||
|
|||
template <typename T, bool isp, bool b2> |
|||
struct ct_imp<T, isp, true, b2> |
|||
{ |
|||
typedef typename ct_imp2<T, sizeof(T) <= sizeof(void*)>::param_type param_type; |
|||
}; |
|||
|
|||
template <typename T, bool isp, bool b1> |
|||
struct ct_imp<T, isp, b1, true> |
|||
{ |
|||
typedef typename ct_imp2<T, sizeof(T) <= sizeof(void*)>::param_type param_type; |
|||
}; |
|||
|
|||
template <typename T, bool b1, bool b2> |
|||
struct ct_imp<T, true, b1, b2> |
|||
{ |
|||
typedef const T param_type; |
|||
}; |
|||
|
|||
} |
|||
|
|||
template <typename T> |
|||
struct call_traits |
|||
{ |
|||
public: |
|||
typedef T value_type; |
|||
typedef T& reference; |
|||
typedef const T& const_reference; |
|||
//
|
|||
// C++ Builder workaround: we should be able to define a compile time
|
|||
// constant and pass that as a single template parameter to ct_imp<T,bool>,
|
|||
// however compiler bugs prevent this - instead pass three bool's to
|
|||
// ct_imp<T,bool,bool,bool> and add an extra partial specialisation
|
|||
// of ct_imp to handle the logic. (JM)
|
|||
typedef typename boost::detail::ct_imp< |
|||
T, |
|||
::boost::is_pointer<T>::value, |
|||
::boost::is_arithmetic<T>::value, |
|||
::boost::is_enum<T>::value |
|||
>::param_type param_type; |
|||
}; |
|||
|
|||
template <typename T> |
|||
struct call_traits<T&> |
|||
{ |
|||
typedef T& value_type; |
|||
typedef T& reference; |
|||
typedef const T& const_reference; |
|||
typedef T& param_type; // hh removed const
|
|||
}; |
|||
|
|||
#if BOOST_WORKAROUND( BOOST_BORLANDC, < 0x5A0 )
|
|||
// these are illegal specialisations; cv-qualifies applied to
|
|||
// references have no effect according to [8.3.2p1],
|
|||
// C++ Builder requires them though as it treats cv-qualified
|
|||
// references as distinct types...
|
|||
template <typename T> |
|||
struct call_traits<T&const> |
|||
{ |
|||
typedef T& value_type; |
|||
typedef T& reference; |
|||
typedef const T& const_reference; |
|||
typedef T& param_type; // hh removed const
|
|||
}; |
|||
template <typename T> |
|||
struct call_traits<T&volatile> |
|||
{ |
|||
typedef T& value_type; |
|||
typedef T& reference; |
|||
typedef const T& const_reference; |
|||
typedef T& param_type; // hh removed const
|
|||
}; |
|||
template <typename T> |
|||
struct call_traits<T&const volatile> |
|||
{ |
|||
typedef T& value_type; |
|||
typedef T& reference; |
|||
typedef const T& const_reference; |
|||
typedef T& param_type; // hh removed const
|
|||
}; |
|||
|
|||
template <typename T> |
|||
struct call_traits< T * > |
|||
{ |
|||
typedef T * value_type; |
|||
typedef T * & reference; |
|||
typedef T * const & const_reference; |
|||
typedef T * const param_type; // hh removed const
|
|||
}; |
|||
#endif
|
|||
#if !defined(BOOST_NO_ARRAY_TYPE_SPECIALIZATIONS)
|
|||
template <typename T, std::size_t N> |
|||
struct call_traits<T [N]> |
|||
{ |
|||
private: |
|||
typedef T array_type[N]; |
|||
public: |
|||
// degrades array to pointer:
|
|||
typedef const T* value_type; |
|||
typedef array_type& reference; |
|||
typedef const array_type& const_reference; |
|||
typedef const T* const param_type; |
|||
}; |
|||
|
|||
template <typename T, std::size_t N> |
|||
struct call_traits<const T [N]> |
|||
{ |
|||
private: |
|||
typedef const T array_type[N]; |
|||
public: |
|||
// degrades array to pointer:
|
|||
typedef const T* value_type; |
|||
typedef array_type& reference; |
|||
typedef const array_type& const_reference; |
|||
typedef const T* const param_type; |
|||
}; |
|||
#endif
|
|||
|
|||
} |
|||
|
|||
#endif // BOOST_DETAIL_CALL_TRAITS_HPP
|
@ -0,0 +1,195 @@ |
|||
// Copyright David Abrahams 2002.
|
|||
// 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)
|
|||
#ifndef INDIRECT_TRAITS_DWA2002131_HPP
|
|||
# define INDIRECT_TRAITS_DWA2002131_HPP
|
|||
# include <boost/type_traits/integral_constant.hpp>
|
|||
# include <boost/type_traits/is_function.hpp>
|
|||
# include <boost/type_traits/is_reference.hpp>
|
|||
# include <boost/type_traits/is_pointer.hpp>
|
|||
# include <boost/type_traits/is_class.hpp>
|
|||
# include <boost/type_traits/is_const.hpp>
|
|||
# include <boost/type_traits/is_volatile.hpp>
|
|||
# include <boost/type_traits/is_member_function_pointer.hpp>
|
|||
# include <boost/type_traits/is_member_pointer.hpp>
|
|||
# include <boost/type_traits/remove_cv.hpp>
|
|||
# include <boost/type_traits/remove_reference.hpp>
|
|||
# include <boost/type_traits/remove_pointer.hpp>
|
|||
|
|||
# include <boost/detail/workaround.hpp>
|
|||
# include <boost/detail/select_type.hpp>
|
|||
|
|||
|
|||
namespace boost { namespace detail { |
|||
|
|||
namespace indirect_traits { |
|||
|
|||
template <class T> |
|||
struct is_reference_to_const : boost::false_type |
|||
{ |
|||
}; |
|||
|
|||
template <class T> |
|||
struct is_reference_to_const<T const&> : boost::true_type |
|||
{ |
|||
}; |
|||
|
|||
# if defined(BOOST_MSVC) && _MSC_FULL_VER <= 13102140 // vc7.01 alpha workaround
|
|||
template<class T> |
|||
struct is_reference_to_const<T const volatile&> : boost::true_type |
|||
{ |
|||
}; |
|||
# endif
|
|||
|
|||
template <class T> |
|||
struct is_reference_to_function : boost::false_type |
|||
{ |
|||
}; |
|||
|
|||
template <class T> |
|||
struct is_reference_to_function<T&> : is_function<T> |
|||
{ |
|||
}; |
|||
|
|||
template <class T> |
|||
struct is_pointer_to_function : boost::false_type |
|||
{ |
|||
}; |
|||
|
|||
// There's no such thing as a pointer-to-cv-function, so we don't need
|
|||
// specializations for those
|
|||
template <class T> |
|||
struct is_pointer_to_function<T*> : is_function<T> |
|||
{ |
|||
}; |
|||
|
|||
template <class T> |
|||
struct is_reference_to_member_function_pointer_impl : boost::false_type |
|||
{ |
|||
}; |
|||
|
|||
template <class T> |
|||
struct is_reference_to_member_function_pointer_impl<T&> |
|||
: is_member_function_pointer<typename remove_cv<T>::type> |
|||
{ |
|||
}; |
|||
|
|||
|
|||
template <class T> |
|||
struct is_reference_to_member_function_pointer |
|||
: is_reference_to_member_function_pointer_impl<T> |
|||
{ |
|||
}; |
|||
|
|||
template <class T> |
|||
struct is_reference_to_function_pointer_aux |
|||
: boost::integral_constant<bool, |
|||
is_reference<T>::value && |
|||
is_pointer_to_function< |
|||
typename remove_cv< |
|||
typename remove_reference<T>::type |
|||
>::type |
|||
>::value |
|||
> |
|||
{ |
|||
// There's no such thing as a pointer-to-cv-function, so we don't need specializations for those
|
|||
}; |
|||
|
|||
template <class T> |
|||
struct is_reference_to_function_pointer |
|||
: boost::detail::if_true< |
|||
is_reference_to_function<T>::value |
|||
>::template then< |
|||
boost::false_type |
|||
, is_reference_to_function_pointer_aux<T> |
|||
>::type |
|||
{ |
|||
}; |
|||
|
|||
template <class T> |
|||
struct is_reference_to_non_const |
|||
: boost::integral_constant<bool, |
|||
is_reference<T>::value && |
|||
!is_reference_to_const<T>::value |
|||
> |
|||
{ |
|||
}; |
|||
|
|||
template <class T> |
|||
struct is_reference_to_volatile : boost::false_type |
|||
{ |
|||
}; |
|||
|
|||
template <class T> |
|||
struct is_reference_to_volatile<T volatile&> : boost::true_type |
|||
{ |
|||
}; |
|||
|
|||
# if defined(BOOST_MSVC) && _MSC_FULL_VER <= 13102140 // vc7.01 alpha workaround
|
|||
template <class T> |
|||
struct is_reference_to_volatile<T const volatile&> : boost::true_type |
|||
{ |
|||
}; |
|||
# endif
|
|||
|
|||
|
|||
template <class T> |
|||
struct is_reference_to_pointer : boost::false_type |
|||
{ |
|||
}; |
|||
|
|||
template <class T> |
|||
struct is_reference_to_pointer<T*&> : boost::true_type |
|||
{ |
|||
}; |
|||
|
|||
template <class T> |
|||
struct is_reference_to_pointer<T* const&> : boost::true_type |
|||
{ |
|||
}; |
|||
|
|||
template <class T> |
|||
struct is_reference_to_pointer<T* volatile&> : boost::true_type |
|||
{ |
|||
}; |
|||
|
|||
template <class T> |
|||
struct is_reference_to_pointer<T* const volatile&> : boost::true_type |
|||
{ |
|||
}; |
|||
|
|||
template <class T> |
|||
struct is_reference_to_class |
|||
: boost::integral_constant<bool, |
|||
is_reference<T>::value && |
|||
is_class< |
|||
typename remove_cv< |
|||
typename remove_reference<T>::type |
|||
>::type |
|||
>::value |
|||
> |
|||
{ |
|||
}; |
|||
|
|||
template <class T> |
|||
struct is_pointer_to_class |
|||
: boost::integral_constant<bool, |
|||
is_pointer<T>::value && |
|||
is_class< |
|||
typename remove_cv< |
|||
typename remove_pointer<T>::type |
|||
>::type |
|||
>::value |
|||
> |
|||
{ |
|||
}; |
|||
|
|||
|
|||
} |
|||
|
|||
using namespace indirect_traits; |
|||
|
|||
}} // namespace boost::python::detail
|
|||
|
|||
#endif // INDIRECT_TRAITS_DWA2002131_HPP
|
@ -0,0 +1,273 @@ |
|||
#ifndef BOOST_DETAIL_INTERLOCKED_HPP_INCLUDED
|
|||
#define BOOST_DETAIL_INTERLOCKED_HPP_INCLUDED
|
|||
|
|||
//
|
|||
// boost/detail/interlocked.hpp
|
|||
//
|
|||
// Copyright 2005 Peter Dimov
|
|||
// Copyright 2018, 2019 Andrey Semashev
|
|||
//
|
|||
// 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)
|
|||
//
|
|||
|
|||
#include <boost/config.hpp>
|
|||
|
|||
#ifdef BOOST_HAS_PRAGMA_ONCE
|
|||
#pragma once
|
|||
#endif
|
|||
|
|||
// BOOST_INTERLOCKED_HAS_INTRIN_H
|
|||
|
|||
// VC9 has intrin.h, but it collides with <utility>
|
|||
#if defined( BOOST_MSVC ) && BOOST_MSVC >= 1600
|
|||
|
|||
# define BOOST_INTERLOCKED_HAS_INTRIN_H
|
|||
|
|||
// Unlike __MINGW64__, __MINGW64_VERSION_MAJOR is defined by MinGW-w64 for both 32 and 64-bit targets.
|
|||
#elif defined( __MINGW64_VERSION_MAJOR )
|
|||
|
|||
// MinGW-w64 provides intrin.h for both 32 and 64-bit targets.
|
|||
# define BOOST_INTERLOCKED_HAS_INTRIN_H
|
|||
|
|||
#elif defined( __CYGWIN__ )
|
|||
|
|||
// Cygwin and Cygwin64 provide intrin.h. On Cygwin64 we have to use intrin.h because it's an LP64 target,
|
|||
// where long is 64-bit and therefore _Interlocked* functions have different signatures.
|
|||
# define BOOST_INTERLOCKED_HAS_INTRIN_H
|
|||
|
|||
// Intel C++ on Windows on VC10+ stdlib
|
|||
#elif defined( BOOST_INTEL_WIN ) && defined( _CPPLIB_VER ) && _CPPLIB_VER >= 520
|
|||
|
|||
# define BOOST_INTERLOCKED_HAS_INTRIN_H
|
|||
|
|||
// clang-cl on Windows on VC10+ stdlib
|
|||
#elif defined( __clang__ ) && defined( _MSC_VER ) && defined( _CPPLIB_VER ) && _CPPLIB_VER >= 520
|
|||
|
|||
# define BOOST_INTERLOCKED_HAS_INTRIN_H
|
|||
|
|||
#endif
|
|||
|
|||
#if !defined(__LP64__)
|
|||
#define BOOST_INTERLOCKED_LONG32 long
|
|||
#else
|
|||
#define BOOST_INTERLOCKED_LONG32 int
|
|||
#endif
|
|||
|
|||
#if defined( BOOST_USE_WINDOWS_H )
|
|||
|
|||
# include <windows.h>
|
|||
|
|||
# define BOOST_INTERLOCKED_INCREMENT(dest) \
|
|||
InterlockedIncrement((BOOST_INTERLOCKED_LONG32*)(dest)) |
|||
# define BOOST_INTERLOCKED_DECREMENT(dest) \
|
|||
InterlockedDecrement((BOOST_INTERLOCKED_LONG32*)(dest)) |
|||
# define BOOST_INTERLOCKED_COMPARE_EXCHANGE(dest, exchange, compare) \
|
|||
InterlockedCompareExchange((BOOST_INTERLOCKED_LONG32*)(dest), (BOOST_INTERLOCKED_LONG32)(exchange), (BOOST_INTERLOCKED_LONG32)(compare)) |
|||
# define BOOST_INTERLOCKED_EXCHANGE(dest, exchange) \
|
|||
InterlockedExchange((BOOST_INTERLOCKED_LONG32*)(dest), (BOOST_INTERLOCKED_LONG32)(exchange)) |
|||
# define BOOST_INTERLOCKED_EXCHANGE_ADD(dest, add) \
|
|||
InterlockedExchangeAdd((BOOST_INTERLOCKED_LONG32*)(dest), (BOOST_INTERLOCKED_LONG32)(add)) |
|||
# define BOOST_INTERLOCKED_COMPARE_EXCHANGE_POINTER(dest, exchange, compare) \
|
|||
InterlockedCompareExchangePointer((void**)(dest), (void*)(exchange), (void*)(compare)) |
|||
# define BOOST_INTERLOCKED_EXCHANGE_POINTER(dest, exchange) \
|
|||
InterlockedExchangePointer((void**)(dest), (void*)(exchange)) |
|||
|
|||
#elif defined( BOOST_USE_INTRIN_H ) || defined( BOOST_INTERLOCKED_HAS_INTRIN_H )
|
|||
|
|||
#include <intrin.h>
|
|||
|
|||
# define BOOST_INTERLOCKED_INCREMENT(dest) \
|
|||
_InterlockedIncrement((BOOST_INTERLOCKED_LONG32*)(dest)) |
|||
# define BOOST_INTERLOCKED_DECREMENT(dest) \
|
|||
_InterlockedDecrement((BOOST_INTERLOCKED_LONG32*)(dest)) |
|||
# define BOOST_INTERLOCKED_COMPARE_EXCHANGE(dest, exchange, compare) \
|
|||
_InterlockedCompareExchange((BOOST_INTERLOCKED_LONG32*)(dest), (BOOST_INTERLOCKED_LONG32)(exchange), (BOOST_INTERLOCKED_LONG32)(compare)) |
|||
# define BOOST_INTERLOCKED_EXCHANGE(dest, exchange) \
|
|||
_InterlockedExchange((BOOST_INTERLOCKED_LONG32*)(dest), (BOOST_INTERLOCKED_LONG32)(exchange)) |
|||
# define BOOST_INTERLOCKED_EXCHANGE_ADD(dest, add) \
|
|||
_InterlockedExchangeAdd((BOOST_INTERLOCKED_LONG32*)(dest), (BOOST_INTERLOCKED_LONG32)(add)) |
|||
|
|||
// Note: Though MSVC-12 defines _InterlockedCompareExchangePointer and _InterlockedExchangePointer in intrin.h, the latter
|
|||
// is actually broken as it conflicts with winnt.h from Windows SDK 8.1.
|
|||
# if (defined(_MSC_VER) && _MSC_VER >= 1900) || \
|
|||
(defined(_M_IA64) || defined(_M_AMD64) || defined(__x86_64__) || defined(__x86_64) || defined(_M_ARM64)) |
|||
|
|||
# define BOOST_INTERLOCKED_COMPARE_EXCHANGE_POINTER(dest, exchange, compare) \
|
|||
_InterlockedCompareExchangePointer((void**)(dest), (void*)(exchange), (void*)(compare)) |
|||
# define BOOST_INTERLOCKED_EXCHANGE_POINTER(dest, exchange) \
|
|||
_InterlockedExchangePointer((void**)(dest), (void*)(exchange)) |
|||
|
|||
# else
|
|||
|
|||
# define BOOST_INTERLOCKED_COMPARE_EXCHANGE_POINTER(dest, exchange, compare) \
|
|||
((void*)BOOST_INTERLOCKED_COMPARE_EXCHANGE((BOOST_INTERLOCKED_LONG32*)(dest), (BOOST_INTERLOCKED_LONG32)(exchange), (BOOST_INTERLOCKED_LONG32)(compare))) |
|||
# define BOOST_INTERLOCKED_EXCHANGE_POINTER(dest, exchange) \
|
|||
((void*)BOOST_INTERLOCKED_EXCHANGE((BOOST_INTERLOCKED_LONG32*)(dest), (BOOST_INTERLOCKED_LONG32)(exchange))) |
|||
|
|||
# endif
|
|||
|
|||
#elif defined(_WIN32_WCE)
|
|||
|
|||
#if _WIN32_WCE >= 0x600
|
|||
|
|||
extern "C" BOOST_INTERLOCKED_LONG32 __cdecl _InterlockedIncrement( BOOST_INTERLOCKED_LONG32 volatile * ); |
|||
extern "C" BOOST_INTERLOCKED_LONG32 __cdecl _InterlockedDecrement( BOOST_INTERLOCKED_LONG32 volatile * ); |
|||
extern "C" BOOST_INTERLOCKED_LONG32 __cdecl _InterlockedCompareExchange( BOOST_INTERLOCKED_LONG32 volatile *, BOOST_INTERLOCKED_LONG32, BOOST_INTERLOCKED_LONG32 ); |
|||
extern "C" BOOST_INTERLOCKED_LONG32 __cdecl _InterlockedExchange( BOOST_INTERLOCKED_LONG32 volatile *, BOOST_INTERLOCKED_LONG32 ); |
|||
extern "C" BOOST_INTERLOCKED_LONG32 __cdecl _InterlockedExchangeAdd( BOOST_INTERLOCKED_LONG32 volatile *, BOOST_INTERLOCKED_LONG32 ); |
|||
|
|||
# define BOOST_INTERLOCKED_INCREMENT(dest) \
|
|||
_InterlockedIncrement((BOOST_INTERLOCKED_LONG32*)(dest)) |
|||
# define BOOST_INTERLOCKED_DECREMENT(dest) \
|
|||
_InterlockedDecrement((BOOST_INTERLOCKED_LONG32*)(dest)) |
|||
# define BOOST_INTERLOCKED_COMPARE_EXCHANGE(dest, exchange, compare) \
|
|||
_InterlockedCompareExchange((BOOST_INTERLOCKED_LONG32*)(dest), (BOOST_INTERLOCKED_LONG32)(exchange), (BOOST_INTERLOCKED_LONG32)(compare)) |
|||
# define BOOST_INTERLOCKED_EXCHANGE(dest, exchange) \
|
|||
_InterlockedExchange((BOOST_INTERLOCKED_LONG32*)(dest), (BOOST_INTERLOCKED_LONG32)(exchange)) |
|||
# define BOOST_INTERLOCKED_EXCHANGE_ADD(dest, add) \
|
|||
_InterlockedExchangeAdd((BOOST_INTERLOCKED_LONG32*)(dest), (BOOST_INTERLOCKED_LONG32)(add)) |
|||
|
|||
#else // _WIN32_WCE >= 0x600
|
|||
|
|||
// under Windows CE we still have old-style Interlocked* functions
|
|||
|
|||
extern "C" BOOST_INTERLOCKED_LONG32 __cdecl InterlockedIncrement( BOOST_INTERLOCKED_LONG32 * ); |
|||
extern "C" BOOST_INTERLOCKED_LONG32 __cdecl InterlockedDecrement( BOOST_INTERLOCKED_LONG32 * ); |
|||
extern "C" BOOST_INTERLOCKED_LONG32 __cdecl InterlockedCompareExchange( BOOST_INTERLOCKED_LONG32 *, BOOST_INTERLOCKED_LONG32, BOOST_INTERLOCKED_LONG32 ); |
|||
extern "C" BOOST_INTERLOCKED_LONG32 __cdecl InterlockedExchange( BOOST_INTERLOCKED_LONG32 *, BOOST_INTERLOCKED_LONG32 ); |
|||
extern "C" BOOST_INTERLOCKED_LONG32 __cdecl InterlockedExchangeAdd( BOOST_INTERLOCKED_LONG32 *, BOOST_INTERLOCKED_LONG32 ); |
|||
|
|||
# define BOOST_INTERLOCKED_INCREMENT(dest) \
|
|||
InterlockedIncrement((BOOST_INTERLOCKED_LONG32*)(dest)) |
|||
# define BOOST_INTERLOCKED_DECREMENT(dest) \
|
|||
InterlockedDecrement((BOOST_INTERLOCKED_LONG32*)(dest)) |
|||
# define BOOST_INTERLOCKED_COMPARE_EXCHANGE(dest, exchange, compare) \
|
|||
InterlockedCompareExchange((BOOST_INTERLOCKED_LONG32*)(dest), (BOOST_INTERLOCKED_LONG32)(exchange), (BOOST_INTERLOCKED_LONG32)(compare)) |
|||
# define BOOST_INTERLOCKED_EXCHANGE(dest, exchange) \
|
|||
InterlockedExchange((BOOST_INTERLOCKED_LONG32*)(dest), (BOOST_INTERLOCKED_LONG32)(exchange)) |
|||
# define BOOST_INTERLOCKED_EXCHANGE_ADD(dest, add) \
|
|||
InterlockedExchangeAdd((BOOST_INTERLOCKED_LONG32*)(dest), (BOOST_INTERLOCKED_LONG32)(add)) |
|||
|
|||
#endif // _WIN32_WCE >= 0x600
|
|||
|
|||
# define BOOST_INTERLOCKED_COMPARE_EXCHANGE_POINTER(dest, exchange, compare) \
|
|||
((void*)BOOST_INTERLOCKED_COMPARE_EXCHANGE((BOOST_INTERLOCKED_LONG32*)(dest), (BOOST_INTERLOCKED_LONG32)(exchange), (BOOST_INTERLOCKED_LONG32)(compare))) |
|||
# define BOOST_INTERLOCKED_EXCHANGE_POINTER(dest, exchange) \
|
|||
((void*)BOOST_INTERLOCKED_EXCHANGE((BOOST_INTERLOCKED_LONG32*)(dest), (BOOST_INTERLOCKED_LONG32)(exchange))) |
|||
|
|||
#elif defined( BOOST_MSVC ) || defined( BOOST_INTEL_WIN )
|
|||
|
|||
# if defined( __CLRCALL_PURE_OR_CDECL )
|
|||
# define BOOST_INTERLOCKED_CLRCALL_PURE_OR_CDECL __CLRCALL_PURE_OR_CDECL
|
|||
# else
|
|||
# define BOOST_INTERLOCKED_CLRCALL_PURE_OR_CDECL __cdecl
|
|||
# endif
|
|||
|
|||
extern "C" BOOST_INTERLOCKED_LONG32 BOOST_INTERLOCKED_CLRCALL_PURE_OR_CDECL _InterlockedIncrement( BOOST_INTERLOCKED_LONG32 volatile * ); |
|||
extern "C" BOOST_INTERLOCKED_LONG32 BOOST_INTERLOCKED_CLRCALL_PURE_OR_CDECL _InterlockedDecrement( BOOST_INTERLOCKED_LONG32 volatile * ); |
|||
extern "C" BOOST_INTERLOCKED_LONG32 BOOST_INTERLOCKED_CLRCALL_PURE_OR_CDECL _InterlockedCompareExchange( BOOST_INTERLOCKED_LONG32 volatile *, BOOST_INTERLOCKED_LONG32, BOOST_INTERLOCKED_LONG32 ); |
|||
extern "C" BOOST_INTERLOCKED_LONG32 BOOST_INTERLOCKED_CLRCALL_PURE_OR_CDECL _InterlockedExchange( BOOST_INTERLOCKED_LONG32 volatile *, BOOST_INTERLOCKED_LONG32 ); |
|||
extern "C" BOOST_INTERLOCKED_LONG32 BOOST_INTERLOCKED_CLRCALL_PURE_OR_CDECL _InterlockedExchangeAdd( BOOST_INTERLOCKED_LONG32 volatile *, BOOST_INTERLOCKED_LONG32 ); |
|||
|
|||
# if defined( BOOST_MSVC ) && BOOST_MSVC >= 1310
|
|||
# pragma intrinsic( _InterlockedIncrement )
|
|||
# pragma intrinsic( _InterlockedDecrement )
|
|||
# pragma intrinsic( _InterlockedCompareExchange )
|
|||
# pragma intrinsic( _InterlockedExchange )
|
|||
# pragma intrinsic( _InterlockedExchangeAdd )
|
|||
# endif
|
|||
|
|||
# if defined(_M_IA64) || defined(_M_AMD64) || defined(_M_ARM64)
|
|||
|
|||
extern "C" void* BOOST_INTERLOCKED_CLRCALL_PURE_OR_CDECL _InterlockedCompareExchangePointer( void* volatile *, void*, void* ); |
|||
extern "C" void* BOOST_INTERLOCKED_CLRCALL_PURE_OR_CDECL _InterlockedExchangePointer( void* volatile *, void* ); |
|||
|
|||
# if defined( BOOST_MSVC ) && BOOST_MSVC >= 1310
|
|||
# pragma intrinsic( _InterlockedCompareExchangePointer )
|
|||
# pragma intrinsic( _InterlockedExchangePointer )
|
|||
# endif
|
|||
|
|||
# define BOOST_INTERLOCKED_COMPARE_EXCHANGE_POINTER(dest, exchange, compare) \
|
|||
_InterlockedCompareExchangePointer((void**)(dest), (void*)(exchange), (void*)(compare)) |
|||
# define BOOST_INTERLOCKED_EXCHANGE_POINTER(dest, exchange) \
|
|||
_InterlockedExchangePointer((void**)(dest), (void*)(exchange)) |
|||
|
|||
# else
|
|||
|
|||
# define BOOST_INTERLOCKED_COMPARE_EXCHANGE_POINTER(dest, exchange, compare) \
|
|||
((void*)BOOST_INTERLOCKED_COMPARE_EXCHANGE((BOOST_INTERLOCKED_LONG32*)(dest), (BOOST_INTERLOCKED_LONG32)(exchange), (BOOST_INTERLOCKED_LONG32)(compare))) |
|||
# define BOOST_INTERLOCKED_EXCHANGE_POINTER(dest, exchange) \
|
|||
((void*)BOOST_INTERLOCKED_EXCHANGE((BOOST_INTERLOCKED_LONG32*)(dest), (BOOST_INTERLOCKED_LONG32)(exchange))) |
|||
|
|||
# endif
|
|||
|
|||
# undef BOOST_INTERLOCKED_CLRCALL_PURE_OR_CDECL
|
|||
|
|||
# define BOOST_INTERLOCKED_INCREMENT(dest) \
|
|||
_InterlockedIncrement((BOOST_INTERLOCKED_LONG32*)(dest)) |
|||
# define BOOST_INTERLOCKED_DECREMENT(dest) \
|
|||
_InterlockedDecrement((BOOST_INTERLOCKED_LONG32*)(dest)) |
|||
# define BOOST_INTERLOCKED_COMPARE_EXCHANGE(dest, exchange, compare) \
|
|||
_InterlockedCompareExchange((BOOST_INTERLOCKED_LONG32*)(dest), (BOOST_INTERLOCKED_LONG32)(exchange), (BOOST_INTERLOCKED_LONG32)(compare)) |
|||
# define BOOST_INTERLOCKED_EXCHANGE(dest, exchange) \
|
|||
_InterlockedExchange((BOOST_INTERLOCKED_LONG32*)(dest), (BOOST_INTERLOCKED_LONG32)(exchange)) |
|||
# define BOOST_INTERLOCKED_EXCHANGE_ADD(dest, add) \
|
|||
_InterlockedExchangeAdd((BOOST_INTERLOCKED_LONG32*)(dest), (BOOST_INTERLOCKED_LONG32)(add)) |
|||
|
|||
#elif defined( WIN32 ) || defined( _WIN32 ) || defined( __WIN32__ )
|
|||
|
|||
#define BOOST_INTERLOCKED_IMPORT __declspec(dllimport)
|
|||
|
|||
namespace boost |
|||
{ |
|||
|
|||
namespace detail |
|||
{ |
|||
|
|||
extern "C" BOOST_INTERLOCKED_IMPORT BOOST_INTERLOCKED_LONG32 __stdcall InterlockedIncrement( BOOST_INTERLOCKED_LONG32 volatile * ); |
|||
extern "C" BOOST_INTERLOCKED_IMPORT BOOST_INTERLOCKED_LONG32 __stdcall InterlockedDecrement( BOOST_INTERLOCKED_LONG32 volatile * ); |
|||
extern "C" BOOST_INTERLOCKED_IMPORT BOOST_INTERLOCKED_LONG32 __stdcall InterlockedCompareExchange( BOOST_INTERLOCKED_LONG32 volatile *, BOOST_INTERLOCKED_LONG32, BOOST_INTERLOCKED_LONG32 ); |
|||
extern "C" BOOST_INTERLOCKED_IMPORT BOOST_INTERLOCKED_LONG32 __stdcall InterlockedExchange( BOOST_INTERLOCKED_LONG32 volatile *, BOOST_INTERLOCKED_LONG32 ); |
|||
extern "C" BOOST_INTERLOCKED_IMPORT BOOST_INTERLOCKED_LONG32 __stdcall InterlockedExchangeAdd( BOOST_INTERLOCKED_LONG32 volatile *, BOOST_INTERLOCKED_LONG32 ); |
|||
|
|||
# if defined(_M_IA64) || defined(_M_AMD64) || defined(_M_ARM64)
|
|||
extern "C" BOOST_INTERLOCKED_IMPORT void* __stdcall InterlockedCompareExchangePointer( void* volatile *, void*, void* ); |
|||
extern "C" BOOST_INTERLOCKED_IMPORT void* __stdcall InterlockedExchangePointer( void* volatile *, void* ); |
|||
# endif
|
|||
|
|||
} // namespace detail
|
|||
|
|||
} // namespace boost
|
|||
|
|||
# define BOOST_INTERLOCKED_INCREMENT(dest) \
|
|||
::boost::detail::InterlockedIncrement((BOOST_INTERLOCKED_LONG32*)(dest)) |
|||
# define BOOST_INTERLOCKED_DECREMENT(dest) \
|
|||
::boost::detail::InterlockedDecrement((BOOST_INTERLOCKED_LONG32*)(dest)) |
|||
# define BOOST_INTERLOCKED_COMPARE_EXCHANGE(dest, exchange, compare) \
|
|||
::boost::detail::InterlockedCompareExchange((BOOST_INTERLOCKED_LONG32*)(dest), (BOOST_INTERLOCKED_LONG32)(exchange), (BOOST_INTERLOCKED_LONG32)(compare)) |
|||
# define BOOST_INTERLOCKED_EXCHANGE(dest, exchange) \
|
|||
::boost::detail::InterlockedExchange((BOOST_INTERLOCKED_LONG32*)(dest), (BOOST_INTERLOCKED_LONG32)(exchange)) |
|||
# define BOOST_INTERLOCKED_EXCHANGE_ADD(dest, add) \
|
|||
::boost::detail::InterlockedExchangeAdd((BOOST_INTERLOCKED_LONG32*)(dest), (BOOST_INTERLOCKED_LONG32)(add)) |
|||
|
|||
# if defined(_M_IA64) || defined(_M_AMD64) || defined(_M_ARM64)
|
|||
# define BOOST_INTERLOCKED_COMPARE_EXCHANGE_POINTER(dest, exchange, compare) \
|
|||
::boost::detail::InterlockedCompareExchangePointer((void**)(dest), (void*)(exchange), (void*)(compare)) |
|||
# define BOOST_INTERLOCKED_EXCHANGE_POINTER(dest, exchange) \
|
|||
::boost::detail::InterlockedExchangePointer((void**)(dest), (void*)(exchange)) |
|||
# else
|
|||
# define BOOST_INTERLOCKED_COMPARE_EXCHANGE_POINTER(dest, exchange, compare) \
|
|||
((void*)BOOST_INTERLOCKED_COMPARE_EXCHANGE((BOOST_INTERLOCKED_LONG32 volatile*)(dest),(BOOST_INTERLOCKED_LONG32)(exchange),(BOOST_INTERLOCKED_LONG32)(compare))) |
|||
# define BOOST_INTERLOCKED_EXCHANGE_POINTER(dest, exchange) \
|
|||
((void*)BOOST_INTERLOCKED_EXCHANGE((BOOST_INTERLOCKED_LONG32*)(dest),(BOOST_INTERLOCKED_LONG32)(exchange))) |
|||
# endif
|
|||
|
|||
#else
|
|||
|
|||
# error "Interlocked intrinsics not available"
|
|||
|
|||
#endif
|
|||
|
|||
#endif // #ifndef BOOST_DETAIL_INTERLOCKED_HPP_INCLUDED
|
@ -0,0 +1,22 @@ |
|||
#ifndef BOOST_DETAIL_LIGHTWEIGHT_MUTEX_HPP_INCLUDED
|
|||
#define BOOST_DETAIL_LIGHTWEIGHT_MUTEX_HPP_INCLUDED
|
|||
|
|||
// MS compatible compilers support #pragma once
|
|||
|
|||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
|
|||
# pragma once
|
|||
#endif
|
|||
|
|||
//
|
|||
// boost/detail/lightweight_mutex.hpp - lightweight mutex
|
|||
//
|
|||
// Copyright (c) 2002, 2003 Peter Dimov and Multi Media Ltd.
|
|||
//
|
|||
// 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
|
|||
//
|
|||
|
|||
#include <boost/smart_ptr/detail/lightweight_mutex.hpp>
|
|||
|
|||
#endif // #ifndef BOOST_DETAIL_LIGHTWEIGHT_MUTEX_HPP_INCLUDED
|
@ -0,0 +1,36 @@ |
|||
// (C) Copyright David Abrahams 2001.
|
|||
// 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 for most recent version including documentation.
|
|||
|
|||
// Revision History
|
|||
// 09 Feb 01 Applied John Maddock's Borland patch Moving <true>
|
|||
// specialization to unspecialized template (David Abrahams)
|
|||
// 06 Feb 01 Created (David Abrahams)
|
|||
|
|||
#ifndef SELECT_TYPE_DWA20010206_HPP
|
|||
# define SELECT_TYPE_DWA20010206_HPP
|
|||
|
|||
namespace boost { namespace detail { |
|||
|
|||
// Template class if_true -- select among 2 types based on a bool constant expression
|
|||
// Usage:
|
|||
// typename if_true<(bool_const_expression)>::template then<true_type, false_type>::type
|
|||
|
|||
// HP aCC cannot deal with missing names for template value parameters
|
|||
template <bool b> struct if_true |
|||
{ |
|||
template <class T, class F> |
|||
struct then { typedef T type; }; |
|||
}; |
|||
|
|||
template <> |
|||
struct if_true<false> |
|||
{ |
|||
template <class T, class F> |
|||
struct then { typedef F type; }; |
|||
}; |
|||
}} |
|||
#endif // SELECT_TYPE_DWA20010206_HPP
|
@ -0,0 +1,74 @@ |
|||
//-----------------------------------------------------------------------------
|
|||
// boost detail/templated_streams.hpp header file
|
|||
// See http://www.boost.org for updates, documentation, and revision history.
|
|||
//-----------------------------------------------------------------------------
|
|||
//
|
|||
// Copyright (c) 2003
|
|||
// Eric Friedman
|
|||
//
|
|||
// 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)
|
|||
|
|||
#ifndef BOOST_DETAIL_TEMPLATED_STREAMS_HPP
|
|||
#define BOOST_DETAIL_TEMPLATED_STREAMS_HPP
|
|||
|
|||
#include "boost/config.hpp"
|
|||
|
|||
///////////////////////////////////////////////////////////////////////////////
|
|||
// (detail) BOOST_TEMPLATED_STREAM_* macros
|
|||
//
|
|||
// Provides workaround platforms without stream class templates.
|
|||
//
|
|||
|
|||
#if !defined(BOOST_NO_STD_LOCALE)
|
|||
|
|||
#define BOOST_TEMPLATED_STREAM_TEMPLATE(E,T) \
|
|||
template < typename E , typename T > |
|||
|
|||
#define BOOST_TEMPLATED_STREAM_TEMPLATE_ALLOC(E,T,A) \
|
|||
template < typename E , typename T , typename A > |
|||
|
|||
#define BOOST_TEMPLATED_STREAM_ARGS(E,T) \
|
|||
typename E , typename T |
|||
|
|||
#define BOOST_TEMPLATED_STREAM_ARGS_ALLOC(E,T,A) \
|
|||
typename E , typename T , typename A |
|||
|
|||
#define BOOST_TEMPLATED_STREAM_COMMA ,
|
|||
|
|||
#define BOOST_TEMPLATED_STREAM_ELEM(E) E
|
|||
#define BOOST_TEMPLATED_STREAM_TRAITS(T) T
|
|||
#define BOOST_TEMPLATED_STREAM_ALLOC(A) A
|
|||
|
|||
#define BOOST_TEMPLATED_STREAM(X,E,T) \
|
|||
BOOST_JOIN(std::basic_,X)< E , T > |
|||
|
|||
#define BOOST_TEMPLATED_STREAM_WITH_ALLOC(X,E,T,A) \
|
|||
BOOST_JOIN(std::basic_,X)< E , T , A > |
|||
|
|||
#else // defined(BOOST_NO_STD_LOCALE)
|
|||
|
|||
#define BOOST_TEMPLATED_STREAM_TEMPLATE(E,T) /**/
|
|||
|
|||
#define BOOST_TEMPLATED_STREAM_TEMPLATE_ALLOC(E,T,A) /**/
|
|||
|
|||
#define BOOST_TEMPLATED_STREAM_ARGS(E,T) /**/
|
|||
|
|||
#define BOOST_TEMPLATED_STREAM_ARGS_ALLOC(E,T,A) /**/
|
|||
|
|||
#define BOOST_TEMPLATED_STREAM_COMMA /**/
|
|||
|
|||
#define BOOST_TEMPLATED_STREAM_ELEM(E) char
|
|||
#define BOOST_TEMPLATED_STREAM_TRAITS(T) std::char_traits<char>
|
|||
#define BOOST_TEMPLATED_STREAM_ALLOC(A) std::allocator<char>
|
|||
|
|||
#define BOOST_TEMPLATED_STREAM(X,E,T) \
|
|||
std::X |
|||
|
|||
#define BOOST_TEMPLATED_STREAM_WITH_ALLOC(X,E,T,A) \
|
|||
std::X |
|||
|
|||
#endif // BOOST_NO_STD_LOCALE
|
|||
|
|||
#endif // BOOST_DETAIL_TEMPLATED_STREAMS_HPP
|
@ -0,0 +1,116 @@ |
|||
/* Copyright 2006-2015 Joaquin M Lopez Munoz.
|
|||
* 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/flyweight for library home page.
|
|||
*/ |
|||
|
|||
#ifndef BOOST_FLYWEIGHT_ASSOC_CONTAINER_FACTORY_HPP
|
|||
#define BOOST_FLYWEIGHT_ASSOC_CONTAINER_FACTORY_HPP
|
|||
|
|||
#if defined(_MSC_VER)
|
|||
#pragma once
|
|||
#endif
|
|||
|
|||
#include <boost/config.hpp> /* keep it first to prevent nasty warns in MSVC */
|
|||
#include <boost/flyweight/assoc_container_factory_fwd.hpp>
|
|||
#include <boost/flyweight/detail/is_placeholder_expr.hpp>
|
|||
#include <boost/flyweight/detail/nested_xxx_if_not_ph.hpp>
|
|||
#include <boost/flyweight/factory_tag.hpp>
|
|||
#include <boost/mpl/apply.hpp>
|
|||
#include <boost/mpl/aux_/lambda_support.hpp>
|
|||
#include <boost/mpl/if.hpp>
|
|||
|
|||
#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
|
|||
#include <utility>
|
|||
#endif
|
|||
|
|||
namespace boost{namespace flyweights{namespace detail{ |
|||
BOOST_FLYWEIGHT_NESTED_XXX_IF_NOT_PLACEHOLDER_EXPRESSION_DEF(iterator) |
|||
BOOST_FLYWEIGHT_NESTED_XXX_IF_NOT_PLACEHOLDER_EXPRESSION_DEF(value_type) |
|||
}}} /* namespace boost::flyweights::detail */ |
|||
|
|||
/* Factory class using a given associative container.
|
|||
*/ |
|||
|
|||
namespace boost{ |
|||
|
|||
namespace flyweights{ |
|||
|
|||
template<typename Container> |
|||
class assoc_container_factory_class:public factory_marker |
|||
{ |
|||
public: |
|||
/* When assoc_container_factory_class<Container> is an MPL placeholder
|
|||
* expression, referring to Container::iterator and Container::value_type |
|||
* force the MPL placeholder expression Container to be instantiated, which |
|||
* is wasteful and can fail in concept-checked STL implementations. |
|||
* We protect ourselves against this circumstance. |
|||
*/ |
|||
|
|||
typedef typename detail::nested_iterator_if_not_placeholder_expression< |
|||
Container |
|||
>::type handle_type; |
|||
typedef typename detail::nested_value_type_if_not_placeholder_expression< |
|||
Container |
|||
>::type entry_type; |
|||
|
|||
handle_type insert(const entry_type& x) |
|||
{ |
|||
return cont.insert(x).first; |
|||
} |
|||
|
|||
#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
|
|||
handle_type insert(entry_type&& x) |
|||
{ |
|||
return cont.insert(std::move(x)).first; |
|||
} |
|||
#endif
|
|||
|
|||
void erase(handle_type h) |
|||
{ |
|||
cont.erase(h); |
|||
} |
|||
|
|||
static const entry_type& entry(handle_type h){return *h;} |
|||
|
|||
private: |
|||
/* As above, avoid instantiating Container if it is an
|
|||
* MPL placeholder expression. |
|||
*/ |
|||
|
|||
typedef typename mpl::if_< |
|||
detail::is_placeholder_expression<Container>, |
|||
int, |
|||
Container |
|||
>::type container_type; |
|||
container_type cont; |
|||
|
|||
public: |
|||
typedef assoc_container_factory_class type; |
|||
BOOST_MPL_AUX_LAMBDA_SUPPORT(1,assoc_container_factory_class,(Container)) |
|||
}; |
|||
|
|||
/* assoc_container_factory_class specifier */ |
|||
|
|||
template< |
|||
typename ContainerSpecifier |
|||
BOOST_FLYWEIGHT_NOT_A_PLACEHOLDER_EXPRESSION_DEF |
|||
> |
|||
struct assoc_container_factory:factory_marker |
|||
{ |
|||
template<typename Entry,typename Key> |
|||
struct apply |
|||
{ |
|||
typedef assoc_container_factory_class< |
|||
typename mpl::apply2<ContainerSpecifier,Entry,Key>::type |
|||
> type; |
|||
}; |
|||
}; |
|||
|
|||
} /* namespace flyweights */ |
|||
|
|||
} /* namespace boost */ |
|||
|
|||
#endif
|
@ -0,0 +1,35 @@ |
|||
/* Copyright 2006-2008 Joaquin M Lopez Munoz.
|
|||
* 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/flyweight for library home page.
|
|||
*/ |
|||
|
|||
#ifndef BOOST_FLYWEIGHT_ASSOC_CONTAINER_FACTORY_FWD_HPP
|
|||
#define BOOST_FLYWEIGHT_ASSOC_CONTAINER_FACTORY_FWD_HPP
|
|||
|
|||
#if defined(_MSC_VER)
|
|||
#pragma once
|
|||
#endif
|
|||
|
|||
#include <boost/flyweight/detail/not_placeholder_expr.hpp>
|
|||
|
|||
namespace boost{ |
|||
|
|||
namespace flyweights{ |
|||
|
|||
template<typename Container> |
|||
class assoc_container_factory_class; |
|||
|
|||
template< |
|||
typename ContainerSpecifier |
|||
BOOST_FLYWEIGHT_NOT_A_PLACEHOLDER_EXPRESSION |
|||
> |
|||
struct assoc_container_factory; |
|||
|
|||
} /* namespace flyweights */ |
|||
|
|||
} /* namespace boost */ |
|||
|
|||
#endif
|
@ -0,0 +1,79 @@ |
|||
/* Copyright 2006-2020 Joaquin M Lopez Munoz.
|
|||
* 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/flyweight for library home page.
|
|||
*/ |
|||
|
|||
#ifndef BOOST_FLYWEIGHT_DETAIL_ARCHIVE_CONSTRUCTED_HPP
|
|||
#define BOOST_FLYWEIGHT_DETAIL_ARCHIVE_CONSTRUCTED_HPP
|
|||
|
|||
#if defined(_MSC_VER)&&(_MSC_VER>=1200)
|
|||
#pragma once
|
|||
#endif
|
|||
|
|||
#include <boost/config.hpp> /* keep it first to prevent nasty warns in MSVC */
|
|||
#include <boost/core/no_exceptions_support.hpp>
|
|||
#include <boost/noncopyable.hpp>
|
|||
#include <boost/core/serialization.hpp>
|
|||
#include <boost/type_traits/aligned_storage.hpp>
|
|||
#include <boost/type_traits/alignment_of.hpp>
|
|||
|
|||
namespace boost{ |
|||
|
|||
namespace flyweights{ |
|||
|
|||
namespace detail{ |
|||
|
|||
/* constructs a stack-based object from a serialization archive */ |
|||
|
|||
template<typename T> |
|||
struct archive_constructed:private noncopyable |
|||
{ |
|||
template<class Archive> |
|||
archive_constructed(Archive& ar,const unsigned int version) |
|||
{ |
|||
core::load_construct_data_adl(ar,&get(),version); |
|||
BOOST_TRY{ |
|||
ar>>get(); |
|||
} |
|||
BOOST_CATCH(...){ |
|||
(&get())->~T(); |
|||
BOOST_RETHROW; |
|||
} |
|||
BOOST_CATCH_END |
|||
} |
|||
|
|||
template<class Archive> |
|||
archive_constructed(const char* name,Archive& ar,const unsigned int version) |
|||
{ |
|||
core::load_construct_data_adl(ar,&get(),version); |
|||
BOOST_TRY{ |
|||
ar>>serialization::make_nvp(name,get()); |
|||
} |
|||
BOOST_CATCH(...){ |
|||
(&get())->~T(); |
|||
BOOST_RETHROW; |
|||
} |
|||
BOOST_CATCH_END |
|||
} |
|||
|
|||
~archive_constructed() |
|||
{ |
|||
(&get())->~T(); |
|||
} |
|||
|
|||
T& get(){return *static_cast<T*>(static_cast<void*>(&space));} |
|||
|
|||
private: |
|||
typename aligned_storage<sizeof(T),alignment_of<T>::value>::type space; |
|||
}; |
|||
|
|||
} /* namespace flyweights::detail */ |
|||
|
|||
} /* namespace flyweights */ |
|||
|
|||
} /* namespace boost */ |
|||
|
|||
#endif
|
@ -0,0 +1,84 @@ |
|||
/* Copyright 2006-2019 Joaquin M Lopez Munoz.
|
|||
* 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/flyweight for library home page.
|
|||
*/ |
|||
|
|||
#ifndef BOOST_FLYWEIGHT_DETAIL_DEFAULT_VALUE_POLICY_HPP
|
|||
#define BOOST_FLYWEIGHT_DETAIL_DEFAULT_VALUE_POLICY_HPP
|
|||
|
|||
#if defined(_MSC_VER)
|
|||
#pragma once
|
|||
#endif
|
|||
|
|||
#include <boost/config.hpp> /* keep it first to prevent nasty warns in MSVC */
|
|||
#include <boost/detail/workaround.hpp>
|
|||
#include <boost/flyweight/detail/perfect_fwd.hpp>
|
|||
#include <boost/flyweight/detail/value_tag.hpp>
|
|||
|
|||
/* Default value policy: the key is the same as the value.
|
|||
*/ |
|||
|
|||
namespace boost{ |
|||
|
|||
namespace flyweights{ |
|||
|
|||
namespace detail{ |
|||
|
|||
template<typename Value> |
|||
struct default_value_policy:value_marker |
|||
{ |
|||
typedef Value key_type; |
|||
typedef Value value_type; |
|||
|
|||
struct rep_type |
|||
{ |
|||
/* template ctors */ |
|||
|
|||
#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)&&\
|
|||
!defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)&&\ |
|||
BOOST_WORKAROUND(BOOST_GCC,<=40603) |
|||
/* GCC bug: the default ctor generated by the variadic template ctor below
|
|||
* fails to value-initialize x. |
|||
*/ |
|||
|
|||
rep_type():x(){} |
|||
#endif
|
|||
|
|||
#define BOOST_FLYWEIGHT_PERFECT_FWD_CTR_BODY(args) \
|
|||
:x(BOOST_FLYWEIGHT_FORWARD(args)){} |
|||
|
|||
BOOST_FLYWEIGHT_PERFECT_FWD( |
|||
explicit rep_type, |
|||
BOOST_FLYWEIGHT_PERFECT_FWD_CTR_BODY) |
|||
|
|||
#undef BOOST_FLYWEIGHT_PERFECT_FWD_CTR_BODY
|
|||
|
|||
rep_type(const rep_type& r):x(r.x){} |
|||
|
|||
#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
|
|||
rep_type(rep_type&& r):x(std::move(r.x)){} |
|||
#endif
|
|||
|
|||
operator const value_type&()const{return x;} |
|||
|
|||
value_type x; |
|||
}; |
|||
|
|||
static void construct_value(const rep_type&){} |
|||
static void copy_value(const rep_type&){} |
|||
|
|||
#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
|
|||
static void move_value(const rep_type&){} |
|||
#endif
|
|||
}; |
|||
|
|||
} /* namespace flyweights::detail */ |
|||
|
|||
} /* namespace flyweights */ |
|||
|
|||
} /* namespace boost */ |
|||
|
|||
#endif
|
@ -0,0 +1,114 @@ |
|||
/* Copyright 2006-2014 Joaquin M Lopez Munoz.
|
|||
* 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/flyweight for library home page.
|
|||
*/ |
|||
|
|||
#ifndef BOOST_FLYWEIGHT_DETAIL_DYN_PERFECT_FWD_HPP
|
|||
#define BOOST_FLYWEIGHT_DETAIL_DYN_PERFECT_FWD_HPP
|
|||
|
|||
#if defined(_MSC_VER)
|
|||
#pragma once
|
|||
#endif
|
|||
|
|||
#include <boost/config.hpp>
|
|||
|
|||
#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
|
|||
|
|||
#include <boost/preprocessor/arithmetic/add.hpp>
|
|||
#include <boost/preprocessor/cat.hpp>
|
|||
#include <boost/preprocessor/repetition/enum.hpp>
|
|||
#include <boost/preprocessor/repetition/enum_params.hpp>
|
|||
#include <boost/preprocessor/repetition/repeat_from_to.hpp>
|
|||
#include <boost/preprocessor/seq/seq.hpp>
|
|||
|
|||
#define BOOST_FLYWEIGHT_PERFECT_FWD_ARG(z,n,_) \
|
|||
BOOST_PP_CAT(T,n)&& BOOST_PP_CAT(t,n) |
|||
|
|||
#define BOOST_FLYWEIGHT_PERFECT_FWD_N_AUX(n,name,body) \
|
|||
template<BOOST_PP_ENUM_PARAMS(n,typename T)> \ |
|||
name(BOOST_PP_ENUM(n,BOOST_FLYWEIGHT_PERFECT_FWD_ARG,~)) \ |
|||
body((FORWARD)(n)) |
|||
|
|||
#define BOOST_FLYWEIGHT_PERFECT_FWD_N(z,n,data) \
|
|||
BOOST_FLYWEIGHT_PERFECT_FWD_N_AUX( \ |
|||
n,BOOST_PP_SEQ_HEAD(data), \ |
|||
BOOST_PP_SEQ_HEAD(BOOST_PP_SEQ_TAIL(data))) |
|||
|
|||
#define BOOST_FLYWEIGHT_PERFECT_FWD_WITH_ARGS(name,body) \
|
|||
BOOST_PP_REPEAT_FROM_TO( \ |
|||
1,BOOST_PP_ADD(BOOST_FLYWEIGHT_LIMIT_PERFECT_FWD_ARGS,1), \ |
|||
BOOST_FLYWEIGHT_PERFECT_FWD_N,(name)(body)) |
|||
|
|||
#define BOOST_FLYWEIGHT_PERFECT_FWD(name,body) \
|
|||
name()body((ENUM)(0)) \ |
|||
BOOST_FLYWEIGHT_PERFECT_FWD_WITH_ARGS(name,body) |
|||
|
|||
#else
|
|||
|
|||
/* no rvalue refs -> [const] Tn& overloads */ |
|||
|
|||
#include <boost/preprocessor/arithmetic/add.hpp>
|
|||
#include <boost/preprocessor/cat.hpp>
|
|||
#include <boost/preprocessor/repetition/enum.hpp>
|
|||
#include <boost/preprocessor/repetition/enum_params.hpp>
|
|||
#include <boost/preprocessor/repetition/repeat.hpp>
|
|||
#include <boost/preprocessor/repetition/repeat_from_to.hpp>
|
|||
#include <boost/preprocessor/seq/elem.hpp>
|
|||
#include <boost/preprocessor/seq/for_each_product.hpp>
|
|||
#include <boost/preprocessor/seq/seq.hpp>
|
|||
#include <boost/preprocessor/seq/size.hpp>
|
|||
|
|||
#define BOOST_FLYWEIGHT_CONST(b) BOOST_PP_CAT(BOOST_FLYWEIGHT_CONST,b)
|
|||
#define BOOST_FLYWEIGHT_CONST0
|
|||
#define BOOST_FLYWEIGHT_CONST1 const
|
|||
|
|||
/* if mask[n]==0 --> Tn& tn
|
|||
* if mask[n]==1 --> const Tn& tn |
|||
*/ |
|||
|
|||
#define BOOST_FLYWEIGHT_PERFECT_FWD_ARG(z,n,mask) \
|
|||
BOOST_FLYWEIGHT_CONST(BOOST_PP_SEQ_ELEM(n,mask)) \ |
|||
BOOST_PP_CAT(T,n)& BOOST_PP_CAT(t,n) |
|||
|
|||
/* overload accepting size(mask) args, where the template args are
|
|||
* marked const or not according to the given mask (a seq of 0 or 1) |
|||
*/ |
|||
|
|||
#define BOOST_FLYWEIGHT_PERFECT_FWD_MASK_AUX(r,name,body,mask) \
|
|||
template<BOOST_PP_ENUM_PARAMS(BOOST_PP_SEQ_SIZE(mask),typename T)> \ |
|||
name( \ |
|||
BOOST_PP_ENUM( \ |
|||
BOOST_PP_SEQ_SIZE(mask),BOOST_FLYWEIGHT_PERFECT_FWD_ARG,mask)) \ |
|||
body((ENUM)(BOOST_PP_SEQ_SIZE(mask))) |
|||
|
|||
#define BOOST_FLYWEIGHT_PERFECT_FWD_MASK(r,data) \
|
|||
BOOST_FLYWEIGHT_PERFECT_FWD_MASK_AUX( \ |
|||
r, \ |
|||
BOOST_PP_SEQ_ELEM(0,BOOST_PP_SEQ_HEAD(data)), \ |
|||
BOOST_PP_SEQ_ELEM(1,BOOST_PP_SEQ_HEAD(data)), \ |
|||
BOOST_PP_SEQ_TAIL(data)) |
|||
|
|||
#define BOOST_FLYWEIGHT_01(z,n,_) ((0)(1))
|
|||
|
|||
/* Perfect forwarding overloads accepting 1 to n args */ |
|||
|
|||
#define BOOST_FLYWEIGHT_PERFECT_FWD_N(z,n,data) \
|
|||
BOOST_PP_SEQ_FOR_EACH_PRODUCT( \ |
|||
BOOST_FLYWEIGHT_PERFECT_FWD_MASK, \ |
|||
((data)) \ |
|||
BOOST_PP_REPEAT(n,BOOST_FLYWEIGHT_01,~)) |
|||
|
|||
#define BOOST_FLYWEIGHT_PERFECT_FWD_WITH_ARGS(name,body) \
|
|||
BOOST_PP_REPEAT_FROM_TO( \ |
|||
1,BOOST_PP_ADD(BOOST_FLYWEIGHT_LIMIT_PERFECT_FWD_ARGS,1), \ |
|||
BOOST_FLYWEIGHT_PERFECT_FWD_N,(name)(body)) |
|||
|
|||
#define BOOST_FLYWEIGHT_PERFECT_FWD(name,body) \
|
|||
name()body((ENUM)(0)) \ |
|||
BOOST_FLYWEIGHT_PERFECT_FWD_WITH_ARGS(name,body) |
|||
|
|||
#endif
|
|||
#endif
|
@ -0,0 +1,312 @@ |
|||
/* Copyright 2006-2020 Joaquin M Lopez Munoz.
|
|||
* 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/flyweight for library home page.
|
|||
*/ |
|||
|
|||
#ifndef BOOST_FLYWEIGHT_DETAIL_FLYWEIGHT_CORE_HPP
|
|||
#define BOOST_FLYWEIGHT_DETAIL_FLYWEIGHT_CORE_HPP
|
|||
|
|||
#if defined(_MSC_VER)
|
|||
#pragma once
|
|||
#endif
|
|||
|
|||
#include <boost/config.hpp> /* keep it first to prevent nasty warns in MSVC */
|
|||
#include <boost/core/no_exceptions_support.hpp>
|
|||
#include <boost/detail/workaround.hpp>
|
|||
#include <boost/flyweight/detail/perfect_fwd.hpp>
|
|||
#include <boost/mpl/apply.hpp>
|
|||
|
|||
#if BOOST_WORKAROUND(BOOST_MSVC,BOOST_TESTED_AT(1400))
|
|||
#pragma warning(push)
|
|||
#pragma warning(disable:4101) /* unreferenced local vars */
|
|||
#endif
|
|||
|
|||
/* flyweight_core provides the inner implementation of flyweight<> by
|
|||
* weaving together a value policy, a flyweight factory, a holder for the |
|||
* factory,a tracking policy and a locking policy. |
|||
*/ |
|||
|
|||
namespace boost{ |
|||
|
|||
namespace flyweights{ |
|||
|
|||
namespace detail{ |
|||
|
|||
template< |
|||
typename ValuePolicy,typename Tag,typename TrackingPolicy, |
|||
typename FactorySpecifier,typename LockingPolicy,typename HolderSpecifier |
|||
> |
|||
class flyweight_core; |
|||
|
|||
template< |
|||
typename ValuePolicy,typename Tag,typename TrackingPolicy, |
|||
typename FactorySpecifier,typename LockingPolicy,typename HolderSpecifier |
|||
> |
|||
struct flyweight_core_tracking_helper |
|||
{ |
|||
private: |
|||
typedef flyweight_core< |
|||
ValuePolicy,Tag,TrackingPolicy, |
|||
FactorySpecifier,LockingPolicy, |
|||
HolderSpecifier |
|||
> core; |
|||
typedef typename core::handle_type handle_type; |
|||
typedef typename core::entry_type entry_type; |
|||
|
|||
public: |
|||
static const entry_type& entry(const handle_type& h) |
|||
{ |
|||
return core::entry(h); |
|||
} |
|||
|
|||
template<typename Checker> |
|||
static void erase(const handle_type& h,Checker chk) |
|||
{ |
|||
typedef typename core::lock_type lock_type; |
|||
core::init(); |
|||
lock_type lock(core::mutex());(void)lock; |
|||
if(chk(h))core::factory().erase(h); |
|||
} |
|||
}; |
|||
|
|||
template< |
|||
typename ValuePolicy,typename Tag,typename TrackingPolicy, |
|||
typename FactorySpecifier,typename LockingPolicy,typename HolderSpecifier |
|||
> |
|||
class flyweight_core |
|||
{ |
|||
public: |
|||
typedef typename ValuePolicy::key_type key_type; |
|||
typedef typename ValuePolicy::value_type value_type; |
|||
typedef typename ValuePolicy::rep_type rep_type; |
|||
typedef typename mpl::apply2< |
|||
typename TrackingPolicy::entry_type, |
|||
rep_type, |
|||
key_type |
|||
>::type entry_type; |
|||
typedef typename mpl::apply2< |
|||
FactorySpecifier, |
|||
entry_type, |
|||
key_type |
|||
>::type factory_type; |
|||
typedef typename factory_type::handle_type base_handle_type; |
|||
typedef typename mpl::apply2< |
|||
typename TrackingPolicy::handle_type, |
|||
base_handle_type, |
|||
flyweight_core_tracking_helper< |
|||
ValuePolicy,Tag,TrackingPolicy, |
|||
FactorySpecifier,LockingPolicy, |
|||
HolderSpecifier |
|||
> |
|||
>::type handle_type; |
|||
typedef typename LockingPolicy::mutex_type mutex_type; |
|||
typedef typename LockingPolicy::lock_type lock_type; |
|||
|
|||
static bool init() |
|||
{ |
|||
if(static_initializer)return true; |
|||
else{ |
|||
holder_arg& a=holder_type::get(); |
|||
static_factory_ptr=&a.factory; |
|||
static_mutex_ptr=&a.mutex; |
|||
static_initializer=(static_factory_ptr!=0); |
|||
return static_initializer; |
|||
} |
|||
} |
|||
|
|||
/* insert overloads*/ |
|||
|
|||
#define BOOST_FLYWEIGHT_PERFECT_FWD_INSERT_BODY(args) \
|
|||
{ \ |
|||
return insert_rep(rep_type(BOOST_FLYWEIGHT_FORWARD(args))); \ |
|||
} |
|||
|
|||
BOOST_FLYWEIGHT_PERFECT_FWD( |
|||
static handle_type insert, |
|||
BOOST_FLYWEIGHT_PERFECT_FWD_INSERT_BODY) |
|||
|
|||
#undef BOOST_FLYWEIGHT_PERFECT_FWD_INSERT_BODY
|
|||
|
|||
static handle_type insert(const value_type& x){return insert_value(x);} |
|||
static handle_type insert(value_type& x){return insert_value(x);} |
|||
|
|||
#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
|
|||
static handle_type insert(const value_type&& x){return insert_value(x);} |
|||
static handle_type insert(value_type&& x){return insert_value(std::move(x));} |
|||
#endif
|
|||
|
|||
static const entry_type& entry(const base_handle_type& h) |
|||
{ |
|||
return factory().entry(h); |
|||
} |
|||
|
|||
static const value_type& value(const handle_type& h) |
|||
{ |
|||
return static_cast<const rep_type&>(entry(h)); |
|||
} |
|||
|
|||
static const key_type& key(const handle_type& h) |
|||
{ |
|||
return static_cast<const rep_type&>(entry(h)); |
|||
} |
|||
|
|||
static factory_type& factory() |
|||
{ |
|||
return *static_factory_ptr; |
|||
} |
|||
|
|||
static mutex_type& mutex() |
|||
{ |
|||
return *static_mutex_ptr; |
|||
} |
|||
|
|||
private: |
|||
struct holder_arg |
|||
{ |
|||
factory_type factory; |
|||
mutex_type mutex; |
|||
}; |
|||
typedef typename mpl::apply1< |
|||
HolderSpecifier, |
|||
holder_arg |
|||
>::type holder_type; |
|||
|
|||
static handle_type insert_rep(const rep_type& x) |
|||
{ |
|||
init(); |
|||
entry_type e(x); |
|||
lock_type lock(mutex());(void)lock; |
|||
#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
|
|||
base_handle_type h(factory().insert(std::move(e))); |
|||
#else
|
|||
base_handle_type h(factory().insert(e)); |
|||
#endif
|
|||
|
|||
BOOST_TRY{ |
|||
ValuePolicy::construct_value( |
|||
static_cast<const rep_type&>(entry(h))); |
|||
} |
|||
BOOST_CATCH(...){ |
|||
factory().erase(h); |
|||
BOOST_RETHROW; |
|||
} |
|||
BOOST_CATCH_END |
|||
return static_cast<handle_type>(h); |
|||
} |
|||
|
|||
static handle_type insert_value(const value_type& x) |
|||
{ |
|||
init(); |
|||
entry_type e((rep_type(x))); |
|||
lock_type lock(mutex());(void)lock; |
|||
|
|||
#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
|
|||
base_handle_type h(factory().insert(std::move(e))); |
|||
#else
|
|||
base_handle_type h(factory().insert(e)); |
|||
#endif
|
|||
|
|||
BOOST_TRY{ |
|||
ValuePolicy::copy_value( |
|||
static_cast<const rep_type&>(entry(h))); |
|||
} |
|||
BOOST_CATCH(...){ |
|||
factory().erase(h); |
|||
BOOST_RETHROW; |
|||
} |
|||
BOOST_CATCH_END |
|||
return static_cast<handle_type>(h); |
|||
} |
|||
|
|||
#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
|
|||
static handle_type insert_rep(rep_type&& x) |
|||
{ |
|||
init(); |
|||
entry_type e(std::move(x)); |
|||
lock_type lock(mutex());(void)lock; |
|||
base_handle_type h(factory().insert(std::move(e))); |
|||
|
|||
BOOST_TRY{ |
|||
ValuePolicy::construct_value( |
|||
static_cast<const rep_type&>(entry(h))); |
|||
} |
|||
BOOST_CATCH(...){ |
|||
factory().erase(h); |
|||
BOOST_RETHROW; |
|||
} |
|||
BOOST_CATCH_END |
|||
return static_cast<handle_type>(h); |
|||
} |
|||
|
|||
static handle_type insert_value(value_type&& x) |
|||
{ |
|||
init(); |
|||
entry_type e(rep_type(std::move(x))); |
|||
lock_type lock(mutex());(void)lock; |
|||
base_handle_type h(factory().insert(std::move(e))); |
|||
BOOST_TRY{ |
|||
ValuePolicy::move_value( |
|||
static_cast<const rep_type&>(entry(h))); |
|||
} |
|||
BOOST_CATCH(...){ |
|||
factory().erase(h); |
|||
BOOST_RETHROW; |
|||
} |
|||
BOOST_CATCH_END |
|||
return static_cast<handle_type>(h); |
|||
} |
|||
#endif
|
|||
|
|||
static bool static_initializer; |
|||
static factory_type* static_factory_ptr; |
|||
static mutex_type* static_mutex_ptr; |
|||
}; |
|||
|
|||
template< |
|||
typename ValuePolicy,typename Tag,typename TrackingPolicy, |
|||
typename FactorySpecifier,typename LockingPolicy,typename HolderSpecifier |
|||
> |
|||
bool |
|||
flyweight_core< |
|||
ValuePolicy,Tag,TrackingPolicy, |
|||
FactorySpecifier,LockingPolicy,HolderSpecifier>::static_initializer= |
|||
flyweight_core< |
|||
ValuePolicy,Tag,TrackingPolicy, |
|||
FactorySpecifier,LockingPolicy,HolderSpecifier>::init(); |
|||
|
|||
template< |
|||
typename ValuePolicy,typename Tag,typename TrackingPolicy, |
|||
typename FactorySpecifier,typename LockingPolicy,typename HolderSpecifier |
|||
> |
|||
typename flyweight_core< |
|||
ValuePolicy,Tag,TrackingPolicy, |
|||
FactorySpecifier,LockingPolicy,HolderSpecifier>::factory_type* |
|||
flyweight_core< |
|||
ValuePolicy,Tag,TrackingPolicy, |
|||
FactorySpecifier,LockingPolicy,HolderSpecifier>::static_factory_ptr=0; |
|||
|
|||
template< |
|||
typename ValuePolicy,typename Tag,typename TrackingPolicy, |
|||
typename FactorySpecifier,typename LockingPolicy,typename HolderSpecifier |
|||
> |
|||
typename flyweight_core< |
|||
ValuePolicy,Tag,TrackingPolicy, |
|||
FactorySpecifier,LockingPolicy,HolderSpecifier>::mutex_type* |
|||
flyweight_core< |
|||
ValuePolicy,Tag,TrackingPolicy, |
|||
FactorySpecifier,LockingPolicy,HolderSpecifier>::static_mutex_ptr=0; |
|||
|
|||
} /* namespace flyweights::detail */ |
|||
|
|||
} /* namespace flyweights */ |
|||
|
|||
} /* namespace boost */ |
|||
|
|||
#if BOOST_WORKAROUND(BOOST_MSVC,BOOST_TESTED_AT(1400))
|
|||
#pragma warning(pop)
|
|||
#endif
|
|||
|
|||
#endif
|
@ -0,0 +1,65 @@ |
|||
/* Copyright 2006-2009 Joaquin M Lopez Munoz.
|
|||
* 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/flyweight for library home page.
|
|||
*/ |
|||
|
|||
#ifndef BOOST_FLYWEIGHT_DETAIL_IS_PLACEHOLDER_EXPR_HPP
|
|||
#define BOOST_FLYWEIGHT_DETAIL_IS_PLACEHOLDER_EXPR_HPP
|
|||
|
|||
#if defined(_MSC_VER)
|
|||
#pragma once
|
|||
#endif
|
|||
|
|||
#include <boost/type_traits/is_same.hpp>
|
|||
#include <boost/mpl/apply.hpp>
|
|||
#include <boost/mpl/aux_/lambda_support.hpp>
|
|||
#include <boost/mpl/not.hpp>
|
|||
#include <boost/preprocessor/facilities/intercept.hpp>
|
|||
#include <boost/preprocessor/repetition/enum_params.hpp>
|
|||
|
|||
namespace boost{ |
|||
|
|||
namespace flyweights{ |
|||
|
|||
namespace detail{ |
|||
|
|||
/* is_placeholder_expression<T> indicates whether T is an
|
|||
* MPL placeholder expression. |
|||
*/ |
|||
|
|||
template<typename T> |
|||
struct is_placeholder_expression_helper |
|||
{ |
|||
template< |
|||
BOOST_PP_ENUM_PARAMS( |
|||
BOOST_MPL_LIMIT_METAFUNCTION_ARITY,typename BOOST_PP_INTERCEPT) |
|||
> |
|||
struct apply{ |
|||
typedef int type; |
|||
}; |
|||
|
|||
BOOST_MPL_AUX_LAMBDA_SUPPORT(1,is_placeholder_expression_helper,(T)) |
|||
}; |
|||
|
|||
template<typename T> |
|||
struct is_placeholder_expression: |
|||
mpl::not_<is_same< |
|||
typename mpl::apply< |
|||
is_placeholder_expression_helper<T>, |
|||
BOOST_PP_ENUM_PARAMS( |
|||
BOOST_MPL_LIMIT_METAFUNCTION_ARITY,int BOOST_PP_INTERCEPT) |
|||
>::type, |
|||
int |
|||
> > |
|||
{}; |
|||
|
|||
} /* namespace flyweights::detail */ |
|||
|
|||
} /* namespace flyweights */ |
|||
|
|||
} /* namespace boost */ |
|||
|
|||
#endif
|
@ -0,0 +1,39 @@ |
|||
/* Copyright 2006-2009 Joaquin M Lopez Munoz.
|
|||
* 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/flyweight for library home page.
|
|||
*/ |
|||
|
|||
#ifndef BOOST_FLYWEIGHT_DETAIL_NESTED_XXX_IF_NOT_PH_HPP
|
|||
#define BOOST_FLYWEIGHT_DETAIL_NESTED_XXX_IF_NOT_PH_HPP
|
|||
|
|||
#if defined(_MSC_VER)
|
|||
#pragma once
|
|||
#endif
|
|||
|
|||
#include <boost/flyweight/detail/is_placeholder_expr.hpp>
|
|||
#include <boost/mpl/if.hpp>
|
|||
|
|||
/* nested_##name##_if_not_placeholder_expression<T>::type is T::name unless
|
|||
* T is an MPL placeholder expression, in which case it defaults to int. |
|||
*/ |
|||
|
|||
#define BOOST_FLYWEIGHT_NESTED_XXX_IF_NOT_PLACEHOLDER_EXPRESSION_DEF(name) \
|
|||
struct nested_##name##_if_not_placeholder_expression_helper \ |
|||
{ \ |
|||
typedef int name; \ |
|||
}; \ |
|||
\ |
|||
template<typename T> \ |
|||
struct nested_##name##_if_not_placeholder_expression \ |
|||
{ \ |
|||
typedef typename boost::mpl::if_< \ |
|||
boost::flyweights::detail::is_placeholder_expression<T>, \ |
|||
nested_##name##_if_not_placeholder_expression_helper, \ |
|||
T \ |
|||
>::type::name type; \ |
|||
}; |
|||
|
|||
#endif
|
@ -0,0 +1,63 @@ |
|||
/* Copyright 2006-2018 Joaquin M Lopez Munoz.
|
|||
* 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/flyweight for library home page.
|
|||
*/ |
|||
|
|||
#ifndef BOOST_FLYWEIGHT_DETAIL_NOT_PLACEHOLDER_EXPR_HPP
|
|||
#define BOOST_FLYWEIGHT_DETAIL_NOT_PLACEHOLDER_EXPR_HPP
|
|||
|
|||
#if defined(_MSC_VER)
|
|||
#pragma once
|
|||
#endif
|
|||
|
|||
/* BOOST_FLYWEIGHT_NOT_A_PLACEHOLDER_EXPRESSION can be inserted at the end
|
|||
* of a class template parameter declaration: |
|||
* template< |
|||
* typename X0,...,typename Xn |
|||
* BOOST_FLYWEIGHT_NOT_A_PLACEHOLDER_EXPRESSION |
|||
* > |
|||
* struct foo... |
|||
* to prevent instantiations from being treated as MPL placeholder |
|||
* expressions in the presence of placeholder arguments; this is useful |
|||
* to avoid masking of a metafunction class nested ::apply during |
|||
* MPL invocation. |
|||
*/ |
|||
|
|||
#include <boost/config.hpp> /* keep it first to prevent nasty warns in MSVC */
|
|||
#include <boost/detail/workaround.hpp>
|
|||
|
|||
#if BOOST_WORKAROUND(__GNUC__, <4)||\
|
|||
BOOST_WORKAROUND(__GNUC__,==4)&&(__GNUC_MINOR__<2)||\ |
|||
BOOST_WORKAROUND(__GNUC__, ==7)&&( __cplusplus>=201703L)||\ |
|||
BOOST_WORKAROUND(__GNUC__, >=8)&&( __cplusplus>=201103L) |
|||
/* The default trick on which the macro is based, namely adding a int=0
|
|||
* defaulted template parameter, does not work in GCC prior to 4.2 due to |
|||
* an unfortunate compiler non-standard extension, as explained in |
|||
* http://lists.boost.org/boost-users/2007/07/29866.php
|
|||
* As it happens, GCC 7 in C++17 mode and GCC 8 (and presumably later) in |
|||
* C++11 mode (and presumably later) go back to this old behavior, anticipating |
|||
* the resolution of CWG DR 150 (see P0522R0). |
|||
* In these cases we resort to an uglier technique, adding defaulted template |
|||
* parameters so as to exceed BOOST_MPL_LIMIT_METAFUNCTION_ARITY. |
|||
*/ |
|||
|
|||
#include <boost/mpl/limits/arity.hpp>
|
|||
#include <boost/preprocessor/facilities/intercept.hpp>
|
|||
#include <boost/preprocessor/repetition/enum_trailing_params.hpp>
|
|||
|
|||
#define BOOST_FLYWEIGHT_NOT_A_PLACEHOLDER_EXPRESSION \
|
|||
BOOST_PP_ENUM_TRAILING_PARAMS( \ |
|||
BOOST_MPL_LIMIT_METAFUNCTION_ARITY,typename=int BOOST_PP_INTERCEPT) |
|||
#define BOOST_FLYWEIGHT_NOT_A_PLACEHOLDER_EXPRESSION_DEF \
|
|||
BOOST_PP_ENUM_TRAILING_PARAMS( \ |
|||
BOOST_MPL_LIMIT_METAFUNCTION_ARITY,typename BOOST_PP_INTERCEPT) |
|||
|
|||
#else
|
|||
#define BOOST_FLYWEIGHT_NOT_A_PLACEHOLDER_EXPRESSION ,int=0
|
|||
#define BOOST_FLYWEIGHT_NOT_A_PLACEHOLDER_EXPRESSION_DEF ,int
|
|||
#endif
|
|||
|
|||
#endif
|
@ -0,0 +1,90 @@ |
|||
/* Copyright 2006-2014 Joaquin M Lopez Munoz.
|
|||
* 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/flyweight for library home page.
|
|||
*/ |
|||
|
|||
#ifndef BOOST_FLYWEIGHT_DETAIL_PERFECT_FWD_HPP
|
|||
#define BOOST_FLYWEIGHT_DETAIL_PERFECT_FWD_HPP
|
|||
|
|||
#if defined(_MSC_VER)
|
|||
#pragma once
|
|||
#endif
|
|||
|
|||
/* C++03-compatible implementation of perfect forwarding.
|
|||
* Usage: |
|||
* |
|||
* # define NAME ... |
|||
* # define BODY(args) {...BOOST_FLYWEIGHT_FORWARD(args)...} |
|||
* BOOST_FLYWEIGHT_PERFECT_FWD(name,body) |
|||
* |
|||
* where NAME includes the return type and qualifiers (if any) and BODY(args) |
|||
* is expected to fo the forwarding through BOOST_FLYWEIGHT_FORWARD(args). |
|||
* |
|||
* In compilers capable of perfect forwarding, the real thing is provided |
|||
* (just one variadic args overload is generated). Otherwise the machinery |
|||
* generates n+1 overloads, if rvalue refs are supported, or else 2^(n+1)-1 |
|||
* overloads accepting any combination of lvalue refs and const lvalue refs, |
|||
* up to BOOST_FLYWEIGHT_LIMIT_PERFECT_FWD_ARGS args. |
|||
* |
|||
* BOOST_FLYWEIGHT_PERFECT_FWD_WITH_ARGS(name,body) is a variation omitting the |
|||
* overloads with zero args --when perfect forwarding is available, this second |
|||
* macro is exactly the same as the original. |
|||
*/ |
|||
|
|||
#include <boost/config.hpp> /* keep it first to prevent nasty warns in MSVC */
|
|||
#include <boost/preprocessor/cat.hpp>
|
|||
#include <boost/preprocessor/repetition/enum.hpp>
|
|||
#include <boost/preprocessor/repetition/enum_params.hpp>
|
|||
#include <boost/preprocessor/seq/seq.hpp>
|
|||
|
|||
#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
|
|||
#include <utility>
|
|||
#endif
|
|||
|
|||
#define BOOST_FLYWEIGHT_FORWARD_FORWARD_AUX(z,n,_) \
|
|||
std::forward<BOOST_PP_CAT(T,n)>(BOOST_PP_CAT(t,n)) |
|||
|
|||
#define BOOST_FLYWEIGHT_FORWARD_FORWARD(n) \
|
|||
BOOST_PP_ENUM(n,BOOST_FLYWEIGHT_FORWARD_FORWARD_AUX,~) |
|||
|
|||
#define BOOST_FLYWEIGHT_FORWARD_ENUM(n) BOOST_PP_ENUM_PARAMS(n,t)
|
|||
|
|||
#define BOOST_FLYWEIGHT_FORWARD_PASS(arg) arg
|
|||
|
|||
#define BOOST_FLYWEIGHT_FORWARD(args)\
|
|||
BOOST_PP_CAT(BOOST_FLYWEIGHT_FORWARD_,BOOST_PP_SEQ_HEAD(args))( \ |
|||
BOOST_PP_SEQ_HEAD(BOOST_PP_SEQ_TAIL(args))) |
|||
|
|||
#if defined(BOOST_NO_CXX11_RVALUE_REFERENCES)||\
|
|||
defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) |
|||
|
|||
#if !defined(BOOST_FLYWEIGHT_LIMIT_PERFECT_FWD_ARGS)
|
|||
#define BOOST_FLYWEIGHT_LIMIT_PERFECT_FWD_ARGS 5
|
|||
#endif
|
|||
|
|||
#if BOOST_FLYWEIGHT_LIMIT_PERFECT_FWD_ARGS<0
|
|||
#error BOOST_FLYWEIGHT_LIMIT_PERFECT_FWD_ARGS must be >=0
|
|||
#endif
|
|||
|
|||
#if BOOST_FLYWEIGHT_LIMIT_PERFECT_FWD_ARGS<=5
|
|||
#include <boost/flyweight/detail/pp_perfect_fwd.hpp>
|
|||
#else
|
|||
#include <boost/flyweight/detail/dyn_perfect_fwd.hpp>
|
|||
#endif
|
|||
|
|||
#else
|
|||
|
|||
/* real perfect forwarding */ |
|||
|
|||
#define BOOST_FLYWEIGHT_PERFECT_FWD(name,body) \
|
|||
template<typename... Args>name(Args&&... args) \ |
|||
body((PASS)(std::forward<Args>(args)...)) |
|||
|
|||
#define BOOST_FLYWEIGHT_PERFECT_FWD_WITH_ARGS \
|
|||
BOOST_FLYWEIGHT_PERFECT_FWD |
|||
|
|||
#endif
|
|||
#endif
|
@ -0,0 +1,172 @@ |
|||
/* Copyright 2006-2014 Joaquin M Lopez Munoz.
|
|||
* 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/flyweight for library home page.
|
|||
*/ |
|||
|
|||
#ifndef BOOST_FLYWEIGHT_DETAIL_PP_PERFECT_FWD_HPP
|
|||
#define BOOST_FLYWEIGHT_DETAIL_PP_PERFECT_FWD_HPP
|
|||
|
|||
#if defined(_MSC_VER)
|
|||
#pragma once
|
|||
#endif
|
|||
|
|||
#include <boost/config.hpp>
|
|||
|
|||
#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
|
|||
|
|||
#define BOOST_FLYWEIGHT_PERFECT_FWD_0(name,body) \
|
|||
name()body((FORWARD)(0)) |
|||
|
|||
#if BOOST_FLYWEIGHT_LIMIT_PERFECT_FWD_ARGS>=1
|
|||
#define BOOST_FLYWEIGHT_PERFECT_FWD_1(name,body) \
|
|||
template<typename T0> name(T0&& t0)body((FORWARD)(1)) |
|||
#endif
|
|||
|
|||
#if BOOST_FLYWEIGHT_LIMIT_PERFECT_FWD_ARGS>=2
|
|||
#define BOOST_FLYWEIGHT_PERFECT_FWD_2(name,body) \
|
|||
template<typename T0,typename T1> name(T0&& t0,T1&& t1)body((FORWARD)(2)) |
|||
#endif
|
|||
|
|||
#if BOOST_FLYWEIGHT_LIMIT_PERFECT_FWD_ARGS>=3
|
|||
#define BOOST_FLYWEIGHT_PERFECT_FWD_3(name,body) \
|
|||
template<typename T0,typename T1,typename T2> name(T0&& t0,T1&& t1,T2&& t2)body((FORWARD)(3)) |
|||
#endif
|
|||
|
|||
#if BOOST_FLYWEIGHT_LIMIT_PERFECT_FWD_ARGS>=4
|
|||
#define BOOST_FLYWEIGHT_PERFECT_FWD_4(name,body) \
|
|||
template<typename T0,typename T1,typename T2,typename T3> name(T0&& t0,T1&& t1,T2&& t2,T3&& t3)body((FORWARD)(4)) |
|||
#endif
|
|||
|
|||
#if BOOST_FLYWEIGHT_LIMIT_PERFECT_FWD_ARGS>=5
|
|||
#define BOOST_FLYWEIGHT_PERFECT_FWD_5(name,body) \
|
|||
template<typename T0,typename T1,typename T2,typename T3,typename T4> name(T0&& t0,T1&& t1,T2&& t2,T3&& t3,T4&& t4)body((FORWARD)(5)) |
|||
#endif
|
|||
|
|||
#else
|
|||
|
|||
/* no rvalue refs -> [const] Tn& overloads */ |
|||
|
|||
#define BOOST_FLYWEIGHT_PERFECT_FWD_0(name,body) \
|
|||
name()body((ENUM)(0)) |
|||
|
|||
#if BOOST_FLYWEIGHT_LIMIT_PERFECT_FWD_ARGS>=1
|
|||
#define BOOST_FLYWEIGHT_PERFECT_FWD_1(name,body) \
|
|||
template<typename T0> name(T0& t0)body((ENUM)(1))\ |
|||
template<typename T0> name(const T0& t0)body((ENUM)(1)) |
|||
#endif
|
|||
|
|||
#if BOOST_FLYWEIGHT_LIMIT_PERFECT_FWD_ARGS>=2
|
|||
#define BOOST_FLYWEIGHT_PERFECT_FWD_2(name,body) \
|
|||
template<typename T0,typename T1> name(T0& t0,T1& t1)body((ENUM)(2))\ |
|||
template<typename T0,typename T1> name(T0& t0,const T1& t1)body((ENUM)(2))\ |
|||
template<typename T0,typename T1> name(const T0& t0,T1& t1)body((ENUM)(2))\ |
|||
template<typename T0,typename T1> name(const T0& t0,const T1& t1)body((ENUM)(2)) |
|||
#endif
|
|||
|
|||
#if BOOST_FLYWEIGHT_LIMIT_PERFECT_FWD_ARGS>=3
|
|||
#define BOOST_FLYWEIGHT_PERFECT_FWD_3(name,body) \
|
|||
template<typename T0,typename T1,typename T2> name(T0& t0,T1& t1,T2& t2)body((ENUM)(3))\ |
|||
template<typename T0,typename T1,typename T2> name(T0& t0,T1& t1,const T2& t2)body((ENUM)(3))\ |
|||
template<typename T0,typename T1,typename T2> name(T0& t0,const T1& t1,T2& t2)body((ENUM)(3))\ |
|||
template<typename T0,typename T1,typename T2> name(T0& t0,const T1& t1,const T2& t2)body((ENUM)(3))\ |
|||
template<typename T0,typename T1,typename T2> name(const T0& t0,T1& t1,T2& t2)body((ENUM)(3))\ |
|||
template<typename T0,typename T1,typename T2> name(const T0& t0,T1& t1,const T2& t2)body((ENUM)(3))\ |
|||
template<typename T0,typename T1,typename T2> name(const T0& t0,const T1& t1,T2& t2)body((ENUM)(3))\ |
|||
template<typename T0,typename T1,typename T2> name(const T0& t0,const T1& t1,const T2& t2)body((ENUM)(3)) |
|||
#endif
|
|||
|
|||
#if BOOST_FLYWEIGHT_LIMIT_PERFECT_FWD_ARGS>=4
|
|||
#define BOOST_FLYWEIGHT_PERFECT_FWD_4(name,body) \
|
|||
template<typename T0,typename T1,typename T2,typename T3> name(T0& t0,T1& t1,T2& t2,T3& t3)body((ENUM)(4))\ |
|||
template<typename T0,typename T1,typename T2,typename T3> name(T0& t0,T1& t1,T2& t2,const T3& t3)body((ENUM)(4))\ |
|||
template<typename T0,typename T1,typename T2,typename T3> name(T0& t0,T1& t1,const T2& t2,T3& t3)body((ENUM)(4))\ |
|||
template<typename T0,typename T1,typename T2,typename T3> name(T0& t0,T1& t1,const T2& t2,const T3& t3)body((ENUM)(4))\ |
|||
template<typename T0,typename T1,typename T2,typename T3> name(T0& t0,const T1& t1,T2& t2,T3& t3)body((ENUM)(4))\ |
|||
template<typename T0,typename T1,typename T2,typename T3> name(T0& t0,const T1& t1,T2& t2,const T3& t3)body((ENUM)(4))\ |
|||
template<typename T0,typename T1,typename T2,typename T3> name(T0& t0,const T1& t1,const T2& t2,T3& t3)body((ENUM)(4))\ |
|||
template<typename T0,typename T1,typename T2,typename T3> name(T0& t0,const T1& t1,const T2& t2,const T3& t3)body((ENUM)(4))\ |
|||
template<typename T0,typename T1,typename T2,typename T3> name(const T0& t0,T1& t1,T2& t2,T3& t3)body((ENUM)(4))\ |
|||
template<typename T0,typename T1,typename T2,typename T3> name(const T0& t0,T1& t1,T2& t2,const T3& t3)body((ENUM)(4))\ |
|||
template<typename T0,typename T1,typename T2,typename T3> name(const T0& t0,T1& t1,const T2& t2,T3& t3)body((ENUM)(4))\ |
|||
template<typename T0,typename T1,typename T2,typename T3> name(const T0& t0,T1& t1,const T2& t2,const T3& t3)body((ENUM)(4))\ |
|||
template<typename T0,typename T1,typename T2,typename T3> name(const T0& t0,const T1& t1,T2& t2,T3& t3)body((ENUM)(4))\ |
|||
template<typename T0,typename T1,typename T2,typename T3> name(const T0& t0,const T1& t1,T2& t2,const T3& t3)body((ENUM)(4))\ |
|||
template<typename T0,typename T1,typename T2,typename T3> name(const T0& t0,const T1& t1,const T2& t2,T3& t3)body((ENUM)(4))\ |
|||
template<typename T0,typename T1,typename T2,typename T3> name(const T0& t0,const T1& t1,const T2& t2,const T3& t3)body((ENUM)(4)) |
|||
#endif
|
|||
|
|||
#if BOOST_FLYWEIGHT_LIMIT_PERFECT_FWD_ARGS>=5
|
|||
#define BOOST_FLYWEIGHT_PERFECT_FWD_5(name,body) \
|
|||
template<typename T0,typename T1,typename T2,typename T3,typename T4> name(T0& t0,T1& t1,T2& t2,T3& t3,T4& t4)body((ENUM)(5))\ |
|||
template<typename T0,typename T1,typename T2,typename T3,typename T4> name(T0& t0,T1& t1,T2& t2,T3& t3,const T4& t4)body((ENUM)(5))\ |
|||
template<typename T0,typename T1,typename T2,typename T3,typename T4> name(T0& t0,T1& t1,T2& t2,const T3& t3,T4& t4)body((ENUM)(5))\ |
|||
template<typename T0,typename T1,typename T2,typename T3,typename T4> name(T0& t0,T1& t1,T2& t2,const T3& t3,const T4& t4)body((ENUM)(5))\ |
|||
template<typename T0,typename T1,typename T2,typename T3,typename T4> name(T0& t0,T1& t1,const T2& t2,T3& t3,T4& t4)body((ENUM)(5))\ |
|||
template<typename T0,typename T1,typename T2,typename T3,typename T4> name(T0& t0,T1& t1,const T2& t2,T3& t3,const T4& t4)body((ENUM)(5))\ |
|||
template<typename T0,typename T1,typename T2,typename T3,typename T4> name(T0& t0,T1& t1,const T2& t2,const T3& t3,T4& t4)body((ENUM)(5))\ |
|||
template<typename T0,typename T1,typename T2,typename T3,typename T4> name(T0& t0,T1& t1,const T2& t2,const T3& t3,const T4& t4)body((ENUM)(5))\ |
|||
template<typename T0,typename T1,typename T2,typename T3,typename T4> name(T0& t0,const T1& t1,T2& t2,T3& t3,T4& t4)body((ENUM)(5))\ |
|||
template<typename T0,typename T1,typename T2,typename T3,typename T4> name(T0& t0,const T1& t1,T2& t2,T3& t3,const T4& t4)body((ENUM)(5))\ |
|||
template<typename T0,typename T1,typename T2,typename T3,typename T4> name(T0& t0,const T1& t1,T2& t2,const T3& t3,T4& t4)body((ENUM)(5))\ |
|||
template<typename T0,typename T1,typename T2,typename T3,typename T4> name(T0& t0,const T1& t1,T2& t2,const T3& t3,const T4& t4)body((ENUM)(5))\ |
|||
template<typename T0,typename T1,typename T2,typename T3,typename T4> name(T0& t0,const T1& t1,const T2& t2,T3& t3,T4& t4)body((ENUM)(5))\ |
|||
template<typename T0,typename T1,typename T2,typename T3,typename T4> name(T0& t0,const T1& t1,const T2& t2,T3& t3,const T4& t4)body((ENUM)(5))\ |
|||
template<typename T0,typename T1,typename T2,typename T3,typename T4> name(T0& t0,const T1& t1,const T2& t2,const T3& t3,T4& t4)body((ENUM)(5))\ |
|||
template<typename T0,typename T1,typename T2,typename T3,typename T4> name(T0& t0,const T1& t1,const T2& t2,const T3& t3,const T4& t4)body((ENUM)(5))\ |
|||
template<typename T0,typename T1,typename T2,typename T3,typename T4> name(const T0& t0,T1& t1,T2& t2,T3& t3,T4& t4)body((ENUM)(5))\ |
|||
template<typename T0,typename T1,typename T2,typename T3,typename T4> name(const T0& t0,T1& t1,T2& t2,T3& t3,const T4& t4)body((ENUM)(5))\ |
|||
template<typename T0,typename T1,typename T2,typename T3,typename T4> name(const T0& t0,T1& t1,T2& t2,const T3& t3,T4& t4)body((ENUM)(5))\ |
|||
template<typename T0,typename T1,typename T2,typename T3,typename T4> name(const T0& t0,T1& t1,T2& t2,const T3& t3,const T4& t4)body((ENUM)(5))\ |
|||
template<typename T0,typename T1,typename T2,typename T3,typename T4> name(const T0& t0,T1& t1,const T2& t2,T3& t3,T4& t4)body((ENUM)(5))\ |
|||
template<typename T0,typename T1,typename T2,typename T3,typename T4> name(const T0& t0,T1& t1,const T2& t2,T3& t3,const T4& t4)body((ENUM)(5))\ |
|||
template<typename T0,typename T1,typename T2,typename T3,typename T4> name(const T0& t0,T1& t1,const T2& t2,const T3& t3,T4& t4)body((ENUM)(5))\ |
|||
template<typename T0,typename T1,typename T2,typename T3,typename T4> name(const T0& t0,T1& t1,const T2& t2,const T3& t3,const T4& t4)body((ENUM)(5))\ |
|||
template<typename T0,typename T1,typename T2,typename T3,typename T4> name(const T0& t0,const T1& t1,T2& t2,T3& t3,T4& t4)body((ENUM)(5))\ |
|||
template<typename T0,typename T1,typename T2,typename T3,typename T4> name(const T0& t0,const T1& t1,T2& t2,T3& t3,const T4& t4)body((ENUM)(5))\ |
|||
template<typename T0,typename T1,typename T2,typename T3,typename T4> name(const T0& t0,const T1& t1,T2& t2,const T3& t3,T4& t4)body((ENUM)(5))\ |
|||
template<typename T0,typename T1,typename T2,typename T3,typename T4> name(const T0& t0,const T1& t1,T2& t2,const T3& t3,const T4& t4)body((ENUM)(5))\ |
|||
template<typename T0,typename T1,typename T2,typename T3,typename T4> name(const T0& t0,const T1& t1,const T2& t2,T3& t3,T4& t4)body((ENUM)(5))\ |
|||
template<typename T0,typename T1,typename T2,typename T3,typename T4> name(const T0& t0,const T1& t1,const T2& t2,T3& t3,const T4& t4)body((ENUM)(5))\ |
|||
template<typename T0,typename T1,typename T2,typename T3,typename T4> name(const T0& t0,const T1& t1,const T2& t2,const T3& t3,T4& t4)body((ENUM)(5))\ |
|||
template<typename T0,typename T1,typename T2,typename T3,typename T4> name(const T0& t0,const T1& t1,const T2& t2,const T3& t3,const T4& t4)body((ENUM)(5)) |
|||
#endif
|
|||
|
|||
#endif
|
|||
|
|||
#if BOOST_FLYWEIGHT_LIMIT_PERFECT_FWD_ARGS==0
|
|||
#define BOOST_FLYWEIGHT_PERFECT_FWD_WITH_ARGS(name,body)
|
|||
#elif BOOST_FLYWEIGHT_LIMIT_PERFECT_FWD_ARGS==1
|
|||
#define BOOST_FLYWEIGHT_PERFECT_FWD_WITH_ARGS(name,body) \
|
|||
BOOST_FLYWEIGHT_PERFECT_FWD_1(name,body) |
|||
#elif BOOST_FLYWEIGHT_LIMIT_PERFECT_FWD_ARGS==2
|
|||
#define BOOST_FLYWEIGHT_PERFECT_FWD_WITH_ARGS(name,body) \
|
|||
BOOST_FLYWEIGHT_PERFECT_FWD_1(name,body) \ |
|||
BOOST_FLYWEIGHT_PERFECT_FWD_2(name,body) |
|||
#elif BOOST_FLYWEIGHT_LIMIT_PERFECT_FWD_ARGS==3
|
|||
#define BOOST_FLYWEIGHT_PERFECT_FWD_WITH_ARGS(name,body) \
|
|||
BOOST_FLYWEIGHT_PERFECT_FWD_1(name,body) \ |
|||
BOOST_FLYWEIGHT_PERFECT_FWD_2(name,body) \ |
|||
BOOST_FLYWEIGHT_PERFECT_FWD_3(name,body) |
|||
#elif BOOST_FLYWEIGHT_LIMIT_PERFECT_FWD_ARGS==4
|
|||
#define BOOST_FLYWEIGHT_PERFECT_FWD_WITH_ARGS(name,body) \
|
|||
BOOST_FLYWEIGHT_PERFECT_FWD_1(name,body) \ |
|||
BOOST_FLYWEIGHT_PERFECT_FWD_2(name,body) \ |
|||
BOOST_FLYWEIGHT_PERFECT_FWD_3(name,body) \ |
|||
BOOST_FLYWEIGHT_PERFECT_FWD_4(name,body) |
|||
#else /* BOOST_FLYWEIGHT_LIMIT_PERFECT_FWD_ARGS==5 */
|
|||
#define BOOST_FLYWEIGHT_PERFECT_FWD_WITH_ARGS(name,body) \
|
|||
BOOST_FLYWEIGHT_PERFECT_FWD_1(name,body) \ |
|||
BOOST_FLYWEIGHT_PERFECT_FWD_2(name,body) \ |
|||
BOOST_FLYWEIGHT_PERFECT_FWD_3(name,body) \ |
|||
BOOST_FLYWEIGHT_PERFECT_FWD_4(name,body) \ |
|||
BOOST_FLYWEIGHT_PERFECT_FWD_5(name,body) |
|||
#endif
|
|||
|
|||
#define BOOST_FLYWEIGHT_PERFECT_FWD(name,body) \
|
|||
BOOST_FLYWEIGHT_PERFECT_FWD_0(name,body) \ |
|||
BOOST_FLYWEIGHT_PERFECT_FWD_WITH_ARGS(name,body) |
|||
|
|||
#endif
|
@ -0,0 +1,148 @@ |
|||
/* Copyright 2006-2023 Joaquin M Lopez Munoz.
|
|||
* 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/flyweight for library home page.
|
|||
*/ |
|||
|
|||
#ifndef BOOST_FLYWEIGHT_DETAIL_RECURSIVE_LW_MUTEX_HPP
|
|||
#define BOOST_FLYWEIGHT_DETAIL_RECURSIVE_LW_MUTEX_HPP
|
|||
|
|||
#if defined(_MSC_VER)
|
|||
#pragma once
|
|||
#endif
|
|||
|
|||
/* Recursive lightweight mutex.
|
|||
* - If <mutex> is provided, it uses std::recursive_mutex. |
|||
* - Else if Pthreads is available, it uses a Pthreads mutex with |
|||
* PTHREAD_MUTEX_RECURSIVE attribute. |
|||
* - Else if on Windows/Cygwin, it relies on boost::detail::lightweight_mutex |
|||
* for an implementation based on (recursive) Win32 CRITICAL_SECTION. |
|||
* - Else, it provides a dummy implementation. |
|||
*/ |
|||
|
|||
#include <boost/config.hpp>
|
|||
|
|||
#if !defined(BOOST_NO_CXX11_HDR_MUTEX)
|
|||
#include <boost/noncopyable.hpp>
|
|||
#include <mutex>
|
|||
|
|||
namespace boost{ |
|||
|
|||
namespace flyweights{ |
|||
|
|||
namespace detail{ |
|||
|
|||
struct recursive_lightweight_mutex:noncopyable |
|||
{ |
|||
recursive_lightweight_mutex(){} |
|||
|
|||
struct scoped_lock; |
|||
friend struct scoped_lock; |
|||
struct scoped_lock:noncopyable |
|||
{ |
|||
public: |
|||
scoped_lock(recursive_lightweight_mutex& m):m_(m.m_){m_.lock();} |
|||
~scoped_lock(){m_.unlock();} |
|||
|
|||
private: |
|||
std::recursive_mutex& m_; |
|||
}; |
|||
|
|||
private: |
|||
std::recursive_mutex m_; |
|||
}; |
|||
|
|||
} /* namespace flyweights::detail */ |
|||
|
|||
} /* namespace flyweights */ |
|||
|
|||
} /* namespace boost */ |
|||
#elif defined(BOOST_HAS_PTHREADS)
|
|||
/* code shamelessly ripped from <boost/detail/lwm_pthreads.hpp> */ |
|||
|
|||
#include <boost/assert.hpp>
|
|||
#include <boost/noncopyable.hpp>
|
|||
#include <pthread.h>
|
|||
|
|||
namespace boost{ |
|||
|
|||
namespace flyweights{ |
|||
|
|||
namespace detail{ |
|||
|
|||
struct recursive_lightweight_mutex:noncopyable |
|||
{ |
|||
recursive_lightweight_mutex() |
|||
{ |
|||
pthread_mutexattr_t attr; |
|||
BOOST_VERIFY(pthread_mutexattr_init(&attr)==0); |
|||
BOOST_VERIFY(pthread_mutexattr_settype(&attr,PTHREAD_MUTEX_RECURSIVE)==0); |
|||
BOOST_VERIFY(pthread_mutex_init(&m_,&attr)==0); |
|||
BOOST_VERIFY(pthread_mutexattr_destroy(&attr)==0); |
|||
} |
|||
|
|||
~recursive_lightweight_mutex(){pthread_mutex_destroy(&m_);} |
|||
|
|||
struct scoped_lock; |
|||
friend struct scoped_lock; |
|||
struct scoped_lock:noncopyable |
|||
{ |
|||
public: |
|||
scoped_lock(recursive_lightweight_mutex& m):m_(m.m_) |
|||
{ |
|||
BOOST_VERIFY(pthread_mutex_lock(&m_)==0); |
|||
} |
|||
|
|||
~scoped_lock(){BOOST_VERIFY(pthread_mutex_unlock(&m_)==0);} |
|||
|
|||
private: |
|||
pthread_mutex_t& m_; |
|||
}; |
|||
|
|||
private: |
|||
pthread_mutex_t m_; |
|||
}; |
|||
|
|||
} /* namespace flyweights::detail */ |
|||
|
|||
} /* namespace flyweights */ |
|||
|
|||
} /* namespace boost */ |
|||
#elif defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__)
|
|||
#include <boost/smart_ptr/detail/lightweight_mutex.hpp>
|
|||
|
|||
namespace boost{ |
|||
|
|||
namespace flyweights{ |
|||
|
|||
namespace detail{ |
|||
|
|||
typedef boost::detail::lightweight_mutex recursive_lightweight_mutex; |
|||
|
|||
} /* namespace flyweights::detail */ |
|||
|
|||
} /* namespace flyweights */ |
|||
|
|||
} /* namespace boost */ |
|||
#else
|
|||
namespace boost{ |
|||
|
|||
namespace flyweights{ |
|||
|
|||
namespace detail{ |
|||
|
|||
struct recursive_lightweight_mutex |
|||
{ |
|||
typedef recursive_lightweight_mutex scoped_lock; |
|||
}; |
|||
|
|||
} /* namespace flyweights::detail */ |
|||
|
|||
} /* namespace flyweights */ |
|||
|
|||
} /* namespace boost */ |
|||
#endif
|
|||
|
|||
#endif
|
@ -0,0 +1,98 @@ |
|||
/* Copyright 2006-2014 Joaquin M Lopez Munoz.
|
|||
* 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/flyweight for library home page.
|
|||
*/ |
|||
|
|||
#ifndef BOOST_FLYWEIGHT_DETAIL_SERIALIZATION_HELPER_HPP
|
|||
#define BOOST_FLYWEIGHT_DETAIL_SERIALIZATION_HELPER_HPP
|
|||
|
|||
#if defined(_MSC_VER)&&(_MSC_VER>=1200)
|
|||
#pragma once
|
|||
#endif
|
|||
|
|||
#include <boost/config.hpp> /* keep it first to prevent nasty warns in MSVC */
|
|||
#include <boost/multi_index_container.hpp>
|
|||
#include <boost/multi_index/hashed_index.hpp>
|
|||
#include <boost/multi_index/random_access_index.hpp>
|
|||
#include <boost/noncopyable.hpp>
|
|||
#include <vector>
|
|||
|
|||
namespace boost{ |
|||
|
|||
namespace flyweights{ |
|||
|
|||
namespace detail{ |
|||
|
|||
/* The serialization helpers for flyweight<T> map numerical IDs to
|
|||
* flyweight exemplars --an exemplar is the flyweight object |
|||
* associated to a given value that appears first on the serialization |
|||
* stream, so that subsequent equivalent flyweight objects will be made |
|||
* to refer to it during the serialization process. |
|||
*/ |
|||
|
|||
template<typename Flyweight> |
|||
struct flyweight_value_address |
|||
{ |
|||
typedef const typename Flyweight::value_type* result_type; |
|||
|
|||
result_type operator()(const Flyweight& x)const{return &x.get();} |
|||
}; |
|||
|
|||
template<typename Flyweight> |
|||
class save_helper:private noncopyable |
|||
{ |
|||
typedef multi_index::multi_index_container< |
|||
Flyweight, |
|||
multi_index::indexed_by< |
|||
multi_index::random_access<>, |
|||
multi_index::hashed_unique<flyweight_value_address<Flyweight> > |
|||
> |
|||
> table; |
|||
|
|||
public: |
|||
|
|||
typedef typename table::size_type size_type; |
|||
|
|||
size_type size()const{return t.size();} |
|||
|
|||
size_type find(const Flyweight& x)const |
|||
{ |
|||
return multi_index::project<0>(t,multi_index::get<1>(t).find(&x.get())) |
|||
-t.begin(); |
|||
} |
|||
|
|||
void push_back(const Flyweight& x){t.push_back(x);} |
|||
|
|||
private: |
|||
table t; |
|||
}; |
|||
|
|||
template<typename Flyweight> |
|||
class load_helper:private noncopyable |
|||
{ |
|||
typedef std::vector<Flyweight> table; |
|||
|
|||
public: |
|||
|
|||
typedef typename table::size_type size_type; |
|||
|
|||
size_type size()const{return t.size();} |
|||
|
|||
Flyweight operator[](size_type n)const{return t[n];} |
|||
|
|||
void push_back(const Flyweight& x){t.push_back(x);} |
|||
|
|||
private: |
|||
table t; |
|||
}; |
|||
|
|||
} /* namespace flyweights::detail */ |
|||
|
|||
} /* namespace flyweights */ |
|||
|
|||
} /* namespace boost */ |
|||
|
|||
#endif
|
@ -0,0 +1,50 @@ |
|||
/* Copyright 2006-2008 Joaquin M Lopez Munoz.
|
|||
* 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/flyweight for library home page.
|
|||
*/ |
|||
|
|||
#ifndef BOOST_FLYWEIGHT_DETAIL_VALUE_TAG_HPP
|
|||
#define BOOST_FLYWEIGHT_DETAIL_VALUE_TAG_HPP
|
|||
|
|||
#if defined(_MSC_VER)
|
|||
#pragma once
|
|||
#endif
|
|||
|
|||
#include <boost/config.hpp> /* keep it first to prevent nasty warns in MSVC */
|
|||
#include <boost/parameter/parameters.hpp>
|
|||
#include <boost/type_traits/is_base_and_derived.hpp>
|
|||
|
|||
namespace boost{ |
|||
|
|||
namespace flyweights{ |
|||
|
|||
namespace detail{ |
|||
|
|||
/* Three ways to indicate that a given class T is a value policy:
|
|||
* 1. Make it derived from value_marker. |
|||
* 2. Specialize is_value to evaluate to boost::mpl::true_. |
|||
* 3. Pass it as value<T> when defining a flyweight type. |
|||
* |
|||
* For the time being the interface of value policies is not public. |
|||
*/ |
|||
|
|||
struct value_marker{}; |
|||
|
|||
template<typename T> |
|||
struct is_value:is_base_and_derived<value_marker,T> |
|||
{}; |
|||
|
|||
template<typename T=parameter::void_> |
|||
struct value:parameter::template_keyword<value<>,T> |
|||
{}; |
|||
|
|||
} /* namespace flyweights::detail */ |
|||
|
|||
} /* namespace flyweights */ |
|||
|
|||
} /* namespace boost */ |
|||
|
|||
#endif
|
@ -0,0 +1,44 @@ |
|||
/* Copyright 2006-2008 Joaquin M Lopez Munoz.
|
|||
* 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/flyweight for library home page.
|
|||
*/ |
|||
|
|||
#ifndef BOOST_FLYWEIGHT_FACTORY_TAG_HPP
|
|||
#define BOOST_FLYWEIGHT_FACTORY_TAG_HPP
|
|||
|
|||
#if defined(_MSC_VER)
|
|||
#pragma once
|
|||
#endif
|
|||
|
|||
#include <boost/config.hpp> /* keep it first to prevent nasty warns in MSVC */
|
|||
#include <boost/parameter/parameters.hpp>
|
|||
#include <boost/type_traits/is_base_and_derived.hpp>
|
|||
|
|||
namespace boost{ |
|||
|
|||
namespace flyweights{ |
|||
|
|||
/* Three ways to indicate that a given class T is a factory specifier:
|
|||
* 1. Make it derived from factory_marker. |
|||
* 2. Specialize is_factory to evaluate to boost::mpl::true_. |
|||
* 3. Pass it as factory<T> when defining a flyweight type. |
|||
*/ |
|||
|
|||
struct factory_marker{}; |
|||
|
|||
template<typename T> |
|||
struct is_factory:is_base_and_derived<factory_marker,T> |
|||
{}; |
|||
|
|||
template<typename T=parameter::void_> |
|||
struct factory:parameter::template_keyword<factory<>,T> |
|||
{}; |
|||
|
|||
} /* namespace flyweights */ |
|||
|
|||
} /* namespace boost */ |
|||
|
|||
#endif
|
@ -0,0 +1,501 @@ |
|||
/* Flyweight class.
|
|||
* |
|||
* Copyright 2006-2023 Joaquin M Lopez Munoz. |
|||
* 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/flyweight for library home page.
|
|||
*/ |
|||
|
|||
#ifndef BOOST_FLYWEIGHT_FLYWEIGHT_HPP
|
|||
#define BOOST_FLYWEIGHT_FLYWEIGHT_HPP
|
|||
|
|||
#if defined(_MSC_VER)
|
|||
#pragma once
|
|||
#endif
|
|||
|
|||
#include <boost/config.hpp> /* keep it first to prevent nasty warns in MSVC */
|
|||
#include <algorithm>
|
|||
#include <boost/core/addressof.hpp>
|
|||
#include <boost/core/invoke_swap.hpp>
|
|||
#include <boost/detail/workaround.hpp>
|
|||
#include <boost/flyweight/detail/default_value_policy.hpp>
|
|||
#include <boost/flyweight/detail/flyweight_core.hpp>
|
|||
#include <boost/flyweight/detail/perfect_fwd.hpp>
|
|||
#include <boost/flyweight/factory_tag.hpp>
|
|||
#include <boost/flyweight/flyweight_fwd.hpp>
|
|||
#include <boost/flyweight/locking_tag.hpp>
|
|||
#include <boost/flyweight/simple_locking_fwd.hpp>
|
|||
#include <boost/flyweight/static_holder_fwd.hpp>
|
|||
#include <boost/flyweight/hashed_factory_fwd.hpp>
|
|||
#include <boost/flyweight/holder_tag.hpp>
|
|||
#include <boost/flyweight/refcounted_fwd.hpp>
|
|||
#include <boost/flyweight/tag.hpp>
|
|||
#include <boost/flyweight/tracking_tag.hpp>
|
|||
#include <boost/mpl/assert.hpp>
|
|||
#include <boost/mpl/if.hpp>
|
|||
#include <boost/mpl/not.hpp>
|
|||
#include <boost/mpl/or.hpp>
|
|||
#include <boost/parameter/binding.hpp>
|
|||
#include <boost/type_traits/is_same.hpp>
|
|||
|
|||
#if !defined(BOOST_NO_SFINAE)&&!defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
|
|||
#include <boost/core/enable_if.hpp>
|
|||
#include <boost/type_traits/is_convertible.hpp>
|
|||
#include <initializer_list>
|
|||
#endif
|
|||
|
|||
#if BOOST_WORKAROUND(BOOST_MSVC,BOOST_TESTED_AT(1400))
|
|||
#pragma warning(push)
|
|||
#pragma warning(disable:4520) /* multiple default ctors */
|
|||
#pragma warning(disable:4521) /* multiple copy ctors */
|
|||
#endif
|
|||
|
|||
namespace boost{ |
|||
|
|||
namespace flyweights{ |
|||
|
|||
namespace detail{ |
|||
|
|||
/* Used for the detection of unmatched template args in a
|
|||
* flyweight instantiation. |
|||
*/ |
|||
|
|||
struct unmatched_arg; |
|||
|
|||
/* Boost.Parameter structures for use in flyweight.
|
|||
* NB: these types are derived from instead of typedef'd to force their |
|||
* instantiation, which solves http://bugs.sun.com/view_bug.do?bug_id=6782987
|
|||
* as found out by Simon Atanasyan. |
|||
*/ |
|||
|
|||
struct flyweight_signature: |
|||
parameter::parameters< |
|||
parameter::optional< |
|||
parameter::deduced<tag<> >, |
|||
detail::is_tag<boost::mpl::_> |
|||
>, |
|||
parameter::optional< |
|||
parameter::deduced<tracking<> >, |
|||
is_tracking<boost::mpl::_> |
|||
>, |
|||
parameter::optional< |
|||
parameter::deduced<factory<> >, |
|||
is_factory<boost::mpl::_> |
|||
>, |
|||
parameter::optional< |
|||
parameter::deduced<locking<> >, |
|||
is_locking<boost::mpl::_> |
|||
>, |
|||
parameter::optional< |
|||
parameter::deduced<holder<> >, |
|||
is_holder<boost::mpl::_> |
|||
> |
|||
> |
|||
{}; |
|||
|
|||
struct flyweight_unmatched_signature: |
|||
parameter::parameters< |
|||
parameter::optional< |
|||
parameter::deduced< |
|||
detail::unmatched_arg |
|||
>, |
|||
mpl::not_< |
|||
mpl::or_< |
|||
detail::is_tag<boost::mpl::_>, |
|||
is_tracking<boost::mpl::_>, |
|||
is_factory<boost::mpl::_>, |
|||
is_locking<boost::mpl::_>, |
|||
is_holder<boost::mpl::_> |
|||
> |
|||
> |
|||
> |
|||
> |
|||
{}; |
|||
|
|||
} /* namespace flyweights::detail */ |
|||
|
|||
template< |
|||
typename T, |
|||
typename Arg1,typename Arg2,typename Arg3,typename Arg4,typename Arg5 |
|||
> |
|||
class flyweight |
|||
{ |
|||
private: |
|||
typedef typename mpl::if_< |
|||
detail::is_value<T>, |
|||
T, |
|||
detail::default_value_policy<T> |
|||
>::type value_policy; |
|||
typedef typename detail:: |
|||
flyweight_signature::bind< |
|||
Arg1,Arg2,Arg3,Arg4,Arg5 |
|||
>::type args; |
|||
typedef typename parameter::binding< |
|||
args,tag<>,mpl::na |
|||
>::type tag_type; |
|||
typedef typename parameter::binding< |
|||
args,tracking<>,refcounted |
|||
>::type tracking_policy; |
|||
typedef typename parameter::binding< |
|||
args,factory<>,hashed_factory<> |
|||
>::type factory_specifier; |
|||
typedef typename parameter::binding< |
|||
args,locking<>,simple_locking |
|||
>::type locking_policy; |
|||
typedef typename parameter::binding< |
|||
args,holder<>,static_holder |
|||
>::type holder_specifier; |
|||
|
|||
typedef typename detail:: |
|||
flyweight_unmatched_signature::bind< |
|||
Arg1,Arg2,Arg3,Arg4,Arg5 |
|||
>::type unmatched_args; |
|||
typedef typename parameter::binding< |
|||
unmatched_args,detail::unmatched_arg, |
|||
detail::unmatched_arg |
|||
>::type unmatched_arg_detected; |
|||
|
|||
/* You have passed a type in the specification of a flyweight type that
|
|||
* could not be interpreted as a valid argument. |
|||
*/ |
|||
BOOST_MPL_ASSERT_MSG( |
|||
(is_same<unmatched_arg_detected,detail::unmatched_arg>::value), |
|||
INVALID_ARGUMENT_TO_FLYWEIGHT, |
|||
(flyweight)); |
|||
|
|||
typedef detail::flyweight_core< |
|||
value_policy,tag_type,tracking_policy, |
|||
factory_specifier,locking_policy, |
|||
holder_specifier |
|||
> core; |
|||
typedef typename core::handle_type handle_type; |
|||
|
|||
public: |
|||
typedef typename value_policy::key_type key_type; |
|||
typedef typename value_policy::value_type value_type; |
|||
|
|||
/* static data initialization */ |
|||
|
|||
static bool init(){return core::init();} |
|||
|
|||
class initializer |
|||
{ |
|||
public: |
|||
initializer():b(init()){} |
|||
private: |
|||
bool b; |
|||
}; |
|||
|
|||
/* construct/copy/destroy */ |
|||
|
|||
flyweight():h(core::insert()){} |
|||
|
|||
#define BOOST_FLYWEIGHT_PERFECT_FWD_CTR_BODY(args) \
|
|||
:h(core::insert(BOOST_FLYWEIGHT_FORWARD(args))){} |
|||
|
|||
BOOST_FLYWEIGHT_PERFECT_FWD_WITH_ARGS( |
|||
explicit flyweight, |
|||
BOOST_FLYWEIGHT_PERFECT_FWD_CTR_BODY) |
|||
|
|||
#undef BOOST_FLYWEIGHT_PERFECT_FWD_CTR_BODY
|
|||
|
|||
#if !defined(BOOST_NO_SFINAE)&&!defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
|
|||
template<typename V> |
|||
flyweight( |
|||
std::initializer_list<V> list, |
|||
typename boost::enable_if< |
|||
boost::is_convertible<std::initializer_list<V>,key_type> >::type* =0): |
|||
h(core::insert(list)){} |
|||
#endif
|
|||
|
|||
flyweight(const flyweight& x):h(x.h){} |
|||
flyweight(flyweight& x):h(x.h){} |
|||
|
|||
#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
|
|||
flyweight(const flyweight&& x):h(x.h){} |
|||
flyweight(flyweight&& x):h(x.h){} |
|||
#endif
|
|||
|
|||
#if !defined(BOOST_NO_SFINAE)&&!defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
|
|||
template<typename V> |
|||
typename boost::enable_if< |
|||
boost::is_convertible<std::initializer_list<V>,key_type>,flyweight&>::type |
|||
operator=(std::initializer_list<V> list) |
|||
{ |
|||
return operator=(flyweight(list)); |
|||
} |
|||
#endif
|
|||
|
|||
flyweight& operator=(const flyweight& x){h=x.h;return *this;} |
|||
flyweight& operator=(const value_type& x){return operator=(flyweight(x));} |
|||
|
|||
#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
|
|||
flyweight& operator=(value_type&& x) |
|||
{ |
|||
return operator=(flyweight(std::move(x))); |
|||
} |
|||
#endif
|
|||
|
|||
/* convertibility to underlying type */ |
|||
|
|||
const key_type& get_key()const{return core::key(h);} |
|||
const value_type& get()const{return core::value(h);} |
|||
const value_type& operator*()const{return get();} |
|||
operator const value_type&()const{return get();} |
|||
const value_type* operator->()const{return boost::addressof(get());} |
|||
|
|||
/* exact type equality */ |
|||
|
|||
friend bool operator==(const flyweight& x,const flyweight& y) |
|||
{ |
|||
return &x.get()==&y.get(); |
|||
} |
|||
|
|||
/* modifiers */ |
|||
|
|||
void swap(flyweight& x){boost::core::invoke_swap(h,x.h);} |
|||
|
|||
private: |
|||
handle_type h; |
|||
}; |
|||
|
|||
#define BOOST_FLYWEIGHT_TYPENAME_TEMPL_ARGS(n) \
|
|||
typename Arg##n##1,typename Arg##n##2,typename Arg##n##3, \ |
|||
typename Arg##n##4,typename Arg##n##5 |
|||
#define BOOST_FLYWEIGHT_TEMPL_ARGS(n) \
|
|||
Arg##n##1,Arg##n##2,Arg##n##3,Arg##n##4,Arg##n##5 |
|||
|
|||
/* Comparison. Unlike exact type comparison defined above, intertype
|
|||
* comparison just forwards to the underlying objects. |
|||
*/ |
|||
|
|||
template< |
|||
typename T1,BOOST_FLYWEIGHT_TYPENAME_TEMPL_ARGS(1), |
|||
typename T2,BOOST_FLYWEIGHT_TYPENAME_TEMPL_ARGS(2) |
|||
> |
|||
bool operator==( |
|||
const flyweight<T1,BOOST_FLYWEIGHT_TEMPL_ARGS(1)>& x, |
|||
const flyweight<T2,BOOST_FLYWEIGHT_TEMPL_ARGS(2)>& y) |
|||
{ |
|||
return x.get()==y.get(); |
|||
} |
|||
|
|||
template< |
|||
typename T1,BOOST_FLYWEIGHT_TYPENAME_TEMPL_ARGS(1), |
|||
typename T2,BOOST_FLYWEIGHT_TYPENAME_TEMPL_ARGS(2) |
|||
> |
|||
bool operator<( |
|||
const flyweight<T1,BOOST_FLYWEIGHT_TEMPL_ARGS(1)>& x, |
|||
const flyweight<T2,BOOST_FLYWEIGHT_TEMPL_ARGS(2)>& y) |
|||
{ |
|||
return x.get()<y.get(); |
|||
} |
|||
|
|||
#if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING)
|
|||
template< |
|||
typename T1,BOOST_FLYWEIGHT_TYPENAME_TEMPL_ARGS(1), |
|||
typename T2 |
|||
> |
|||
bool operator==( |
|||
const flyweight<T1,BOOST_FLYWEIGHT_TEMPL_ARGS(1)>& x,const T2& y) |
|||
{ |
|||
return x.get()==y; |
|||
} |
|||
|
|||
template< |
|||
typename T1, |
|||
typename T2,BOOST_FLYWEIGHT_TYPENAME_TEMPL_ARGS(2) |
|||
> |
|||
bool operator==( |
|||
const T1& x,const flyweight<T2,BOOST_FLYWEIGHT_TEMPL_ARGS(2)>& y) |
|||
{ |
|||
return x==y.get(); |
|||
} |
|||
|
|||
template< |
|||
typename T1,BOOST_FLYWEIGHT_TYPENAME_TEMPL_ARGS(1), |
|||
typename T2 |
|||
> |
|||
bool operator<( |
|||
const flyweight<T1,BOOST_FLYWEIGHT_TEMPL_ARGS(1)>& x,const T2& y) |
|||
{ |
|||
return x.get()<y; |
|||
} |
|||
|
|||
template< |
|||
typename T1, |
|||
typename T2,BOOST_FLYWEIGHT_TYPENAME_TEMPL_ARGS(2) |
|||
> |
|||
bool operator<( |
|||
const T1& x,const flyweight<T2,BOOST_FLYWEIGHT_TEMPL_ARGS(2)>& y) |
|||
{ |
|||
return x<y.get(); |
|||
} |
|||
#endif /* !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) */
|
|||
|
|||
/* rest of comparison operators */ |
|||
|
|||
#define BOOST_FLYWEIGHT_COMPLETE_COMP_OPS(t,a1,a2) \
|
|||
template<t> \ |
|||
inline bool operator!=(const a1& x,const a2& y) \ |
|||
{ \ |
|||
return !(x==y); \ |
|||
} \ |
|||
\ |
|||
template<t> \ |
|||
inline bool operator>(const a1& x,const a2& y) \ |
|||
{ \ |
|||
return y<x; \ |
|||
} \ |
|||
\ |
|||
template<t> \ |
|||
inline bool operator>=(const a1& x,const a2& y) \ |
|||
{ \ |
|||
return !(x<y); \ |
|||
} \ |
|||
\ |
|||
template<t> \ |
|||
inline bool operator<=(const a1& x,const a2& y) \ |
|||
{ \ |
|||
return !(y<x); \ |
|||
} |
|||
|
|||
BOOST_FLYWEIGHT_COMPLETE_COMP_OPS( |
|||
typename T1 BOOST_PP_COMMA() |
|||
BOOST_FLYWEIGHT_TYPENAME_TEMPL_ARGS(1) BOOST_PP_COMMA() |
|||
typename T2 BOOST_PP_COMMA() |
|||
BOOST_FLYWEIGHT_TYPENAME_TEMPL_ARGS(2), |
|||
flyweight< |
|||
T1 BOOST_PP_COMMA() BOOST_FLYWEIGHT_TEMPL_ARGS(1) |
|||
>, |
|||
flyweight< |
|||
T2 BOOST_PP_COMMA() BOOST_FLYWEIGHT_TEMPL_ARGS(2) |
|||
>) |
|||
|
|||
#if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING)
|
|||
BOOST_FLYWEIGHT_COMPLETE_COMP_OPS( |
|||
typename T1 BOOST_PP_COMMA() |
|||
BOOST_FLYWEIGHT_TYPENAME_TEMPL_ARGS(1) BOOST_PP_COMMA() |
|||
typename T2, |
|||
flyweight< |
|||
T1 BOOST_PP_COMMA() BOOST_FLYWEIGHT_TEMPL_ARGS(1) |
|||
>, |
|||
T2) |
|||
|
|||
BOOST_FLYWEIGHT_COMPLETE_COMP_OPS( |
|||
typename T1 BOOST_PP_COMMA() |
|||
typename T2 BOOST_PP_COMMA() |
|||
BOOST_FLYWEIGHT_TYPENAME_TEMPL_ARGS(2), |
|||
T1, |
|||
flyweight< |
|||
T2 BOOST_PP_COMMA() BOOST_FLYWEIGHT_TEMPL_ARGS(2) |
|||
>) |
|||
#endif /* !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) */
|
|||
|
|||
/* specialized algorithms */ |
|||
|
|||
template<typename T,BOOST_FLYWEIGHT_TYPENAME_TEMPL_ARGS(_)> |
|||
void swap( |
|||
flyweight<T,BOOST_FLYWEIGHT_TEMPL_ARGS(_)>& x, |
|||
flyweight<T,BOOST_FLYWEIGHT_TEMPL_ARGS(_)>& y) |
|||
{ |
|||
x.swap(y); |
|||
} |
|||
|
|||
template< |
|||
BOOST_TEMPLATED_STREAM_ARGS(ElemType,Traits) |
|||
BOOST_TEMPLATED_STREAM_COMMA |
|||
typename T,BOOST_FLYWEIGHT_TYPENAME_TEMPL_ARGS(_) |
|||
> |
|||
BOOST_TEMPLATED_STREAM(ostream,ElemType,Traits)& operator<<( |
|||
BOOST_TEMPLATED_STREAM(ostream,ElemType,Traits)& out, |
|||
const flyweight<T,BOOST_FLYWEIGHT_TEMPL_ARGS(_)>& x) |
|||
{ |
|||
return out<<x.get(); |
|||
} |
|||
|
|||
template< |
|||
BOOST_TEMPLATED_STREAM_ARGS(ElemType,Traits) |
|||
BOOST_TEMPLATED_STREAM_COMMA |
|||
typename T,BOOST_FLYWEIGHT_TYPENAME_TEMPL_ARGS(_) |
|||
> |
|||
BOOST_TEMPLATED_STREAM(istream,ElemType,Traits)& operator>>( |
|||
BOOST_TEMPLATED_STREAM(istream,ElemType,Traits)& in, |
|||
flyweight<T,BOOST_FLYWEIGHT_TEMPL_ARGS(_)>& x) |
|||
{ |
|||
typedef typename flyweight< |
|||
T,BOOST_FLYWEIGHT_TEMPL_ARGS(_) |
|||
>::value_type value_type; |
|||
|
|||
/* value_type need not be default ctble but must be copy ctble */ |
|||
value_type t(x.get()); |
|||
in>>t; |
|||
x=t; |
|||
return in; |
|||
} |
|||
|
|||
} /* namespace flyweights */ |
|||
|
|||
} /* namespace boost */ |
|||
|
|||
#if !defined(BOOST_FLYWEIGHT_DISABLE_HASH_SUPPORT)
|
|||
|
|||
/* hash support */ |
|||
|
|||
#if !defined(BOOST_NO_CXX11_HDR_FUNCTIONAL)
|
|||
namespace std{ |
|||
|
|||
template<typename T,BOOST_FLYWEIGHT_TYPENAME_TEMPL_ARGS(_)> |
|||
BOOST_FLYWEIGHT_STD_HASH_STRUCT_KEYWORD |
|||
hash<boost::flyweight<T,BOOST_FLYWEIGHT_TEMPL_ARGS(_)> > |
|||
{ |
|||
public: |
|||
typedef std::size_t result_type; |
|||
typedef boost::flyweight< |
|||
T,BOOST_FLYWEIGHT_TEMPL_ARGS(_)> argument_type; |
|||
|
|||
result_type operator()(const argument_type& x)const |
|||
{ |
|||
typedef typename argument_type::value_type value_type; |
|||
|
|||
std::hash<const value_type*> h; |
|||
return h(&x.get()); |
|||
} |
|||
}; |
|||
|
|||
} /* namespace std */ |
|||
#endif /* !defined(BOOST_NO_CXX11_HDR_FUNCTIONAL) */
|
|||
|
|||
namespace boost{ |
|||
#if !defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP)
|
|||
namespace flyweights{ |
|||
#endif
|
|||
|
|||
template<typename T,BOOST_FLYWEIGHT_TYPENAME_TEMPL_ARGS(_)> |
|||
std::size_t hash_value(const flyweight<T,BOOST_FLYWEIGHT_TEMPL_ARGS(_)>& x) |
|||
{ |
|||
typedef typename flyweight< |
|||
T,BOOST_FLYWEIGHT_TEMPL_ARGS(_) |
|||
>::value_type value_type; |
|||
|
|||
boost::hash<const value_type*> h; |
|||
return h(&x.get()); |
|||
} |
|||
|
|||
#if !defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP)
|
|||
} /* namespace flyweights */ |
|||
#endif
|
|||
} /* namespace boost */ |
|||
#endif /* !defined(BOOST_FLYWEIGHT_DISABLE_HASH_SUPPORT) */
|
|||
|
|||
#undef BOOST_FLYWEIGHT_COMPLETE_COMP_OPS
|
|||
#undef BOOST_FLYWEIGHT_TEMPL_ARGS
|
|||
#undef BOOST_FLYWEIGHT_TYPENAME_TEMPL_ARGS
|
|||
|
|||
#if BOOST_WORKAROUND(BOOST_MSVC,BOOST_TESTED_AT(1400))
|
|||
#pragma warning(pop)
|
|||
#endif
|
|||
|
|||
#endif
|
@ -0,0 +1,215 @@ |
|||
/* Copyright 2006-2015 Joaquin M Lopez Munoz.
|
|||
* 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/flyweight for library home page.
|
|||
*/ |
|||
|
|||
#ifndef BOOST_FLYWEIGHT_FLYWEIGHT_FWD_HPP
|
|||
#define BOOST_FLYWEIGHT_FLYWEIGHT_FWD_HPP
|
|||
|
|||
#if defined(_MSC_VER)
|
|||
#pragma once
|
|||
#endif
|
|||
|
|||
#include <boost/config.hpp> /* keep it first to prevent nasty warns in MSVC */
|
|||
#include <boost/detail/templated_streams.hpp>
|
|||
#include <boost/detail/workaround.hpp>
|
|||
#include <boost/parameter/parameters.hpp>
|
|||
#include <boost/preprocessor/punctuation/comma.hpp>
|
|||
#include <iosfwd>
|
|||
|
|||
#if !defined(BOOST_FLYWEIGHT_DISABLE_HASH_SUPPORT)
|
|||
#include <boost/functional/hash_fwd.hpp>
|
|||
#include <cstddef>
|
|||
#endif
|
|||
|
|||
namespace boost{ |
|||
|
|||
namespace flyweights{ |
|||
|
|||
template< |
|||
typename T, |
|||
typename Arg1=parameter::void_, |
|||
typename Arg2=parameter::void_, |
|||
typename Arg3=parameter::void_, |
|||
typename Arg4=parameter::void_, |
|||
typename Arg5=parameter::void_ |
|||
> |
|||
class flyweight; |
|||
|
|||
#define BOOST_FLYWEIGHT_TYPENAME_TEMPL_ARGS(n) \
|
|||
typename Arg##n##1,typename Arg##n##2,typename Arg##n##3, \ |
|||
typename Arg##n##4,typename Arg##n##5 |
|||
#define BOOST_FLYWEIGHT_TEMPL_ARGS(n) \
|
|||
Arg##n##1,Arg##n##2,Arg##n##3,Arg##n##4,Arg##n##5 |
|||
|
|||
template< |
|||
typename T1,BOOST_FLYWEIGHT_TYPENAME_TEMPL_ARGS(1), |
|||
typename T2,BOOST_FLYWEIGHT_TYPENAME_TEMPL_ARGS(2) |
|||
> |
|||
bool operator==( |
|||
const flyweight<T1,BOOST_FLYWEIGHT_TEMPL_ARGS(1)>& x, |
|||
const flyweight<T2,BOOST_FLYWEIGHT_TEMPL_ARGS(2)>& y); |
|||
|
|||
template< |
|||
typename T1,BOOST_FLYWEIGHT_TYPENAME_TEMPL_ARGS(1), |
|||
typename T2,BOOST_FLYWEIGHT_TYPENAME_TEMPL_ARGS(2) |
|||
> |
|||
bool operator<( |
|||
const flyweight<T1,BOOST_FLYWEIGHT_TEMPL_ARGS(1)>& x, |
|||
const flyweight<T2,BOOST_FLYWEIGHT_TEMPL_ARGS(2)>& y); |
|||
|
|||
#if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING)
|
|||
template< |
|||
typename T1,BOOST_FLYWEIGHT_TYPENAME_TEMPL_ARGS(1), |
|||
typename T2 |
|||
> |
|||
bool operator==( |
|||
const flyweight<T1,BOOST_FLYWEIGHT_TEMPL_ARGS(1)>& x,const T2& y); |
|||
|
|||
template< |
|||
typename T1, |
|||
typename T2,BOOST_FLYWEIGHT_TYPENAME_TEMPL_ARGS(2) |
|||
> |
|||
bool operator==( |
|||
const T1& x,const flyweight<T2,BOOST_FLYWEIGHT_TEMPL_ARGS(2)>& y); |
|||
|
|||
template< |
|||
typename T1,BOOST_FLYWEIGHT_TYPENAME_TEMPL_ARGS(1), |
|||
typename T2 |
|||
> |
|||
bool operator<( |
|||
const flyweight<T1,BOOST_FLYWEIGHT_TEMPL_ARGS(1)>& x,const T2& y); |
|||
|
|||
template< |
|||
typename T1, |
|||
typename T2,BOOST_FLYWEIGHT_TYPENAME_TEMPL_ARGS(2) |
|||
> |
|||
bool operator<( |
|||
const T1& x,const flyweight<T2,BOOST_FLYWEIGHT_TEMPL_ARGS(2)>& y); |
|||
#endif /* !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) */
|
|||
|
|||
#define BOOST_FLYWEIGHT_COMPLETE_COMP_OPS_DECL(t,a1,a2) \
|
|||
template<t> \ |
|||
inline bool operator!=(const a1& x,const a2& y); \ |
|||
\ |
|||
template<t> \ |
|||
inline bool operator>(const a1& x,const a2& y); \ |
|||
\ |
|||
template<t> \ |
|||
inline bool operator>=(const a1& x,const a2& y); \ |
|||
\ |
|||
template<t> \ |
|||
inline bool operator<=(const a1& x,const a2& y); \ |
|||
|
|||
BOOST_FLYWEIGHT_COMPLETE_COMP_OPS_DECL( |
|||
typename T1 BOOST_PP_COMMA() |
|||
BOOST_FLYWEIGHT_TYPENAME_TEMPL_ARGS(1) BOOST_PP_COMMA() |
|||
typename T2 BOOST_PP_COMMA() |
|||
BOOST_FLYWEIGHT_TYPENAME_TEMPL_ARGS(2), |
|||
flyweight< |
|||
T1 BOOST_PP_COMMA() BOOST_FLYWEIGHT_TEMPL_ARGS(1) |
|||
>, |
|||
flyweight< |
|||
T2 BOOST_PP_COMMA() BOOST_FLYWEIGHT_TEMPL_ARGS(2) |
|||
>) |
|||
|
|||
#if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING)
|
|||
BOOST_FLYWEIGHT_COMPLETE_COMP_OPS_DECL( |
|||
typename T1 BOOST_PP_COMMA() |
|||
BOOST_FLYWEIGHT_TYPENAME_TEMPL_ARGS(1) BOOST_PP_COMMA() |
|||
typename T2, |
|||
flyweight< |
|||
T1 BOOST_PP_COMMA() BOOST_FLYWEIGHT_TEMPL_ARGS(1) |
|||
>, |
|||
T2) |
|||
|
|||
BOOST_FLYWEIGHT_COMPLETE_COMP_OPS_DECL( |
|||
typename T1 BOOST_PP_COMMA() |
|||
typename T2 BOOST_PP_COMMA() |
|||
BOOST_FLYWEIGHT_TYPENAME_TEMPL_ARGS(2), |
|||
T1, |
|||
flyweight< |
|||
T2 BOOST_PP_COMMA() BOOST_FLYWEIGHT_TEMPL_ARGS(2) |
|||
>) |
|||
#endif /* !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) */
|
|||
|
|||
template<typename T,BOOST_FLYWEIGHT_TYPENAME_TEMPL_ARGS(_)> |
|||
inline void swap( |
|||
flyweight<T,BOOST_FLYWEIGHT_TEMPL_ARGS(_)>& x, |
|||
flyweight<T,BOOST_FLYWEIGHT_TEMPL_ARGS(_)>& y); |
|||
|
|||
template< |
|||
BOOST_TEMPLATED_STREAM_ARGS(ElemType,Traits) |
|||
BOOST_TEMPLATED_STREAM_COMMA |
|||
typename T,BOOST_FLYWEIGHT_TYPENAME_TEMPL_ARGS(_) |
|||
> |
|||
inline BOOST_TEMPLATED_STREAM(ostream,ElemType,Traits)& operator<<( |
|||
BOOST_TEMPLATED_STREAM(ostream,ElemType,Traits)& out, |
|||
const flyweight<T,BOOST_FLYWEIGHT_TEMPL_ARGS(_)>& x); |
|||
|
|||
template< |
|||
BOOST_TEMPLATED_STREAM_ARGS(ElemType,Traits) |
|||
BOOST_TEMPLATED_STREAM_COMMA |
|||
typename T,BOOST_FLYWEIGHT_TYPENAME_TEMPL_ARGS(_) |
|||
> |
|||
inline BOOST_TEMPLATED_STREAM(istream,ElemType,Traits)& operator>>( |
|||
BOOST_TEMPLATED_STREAM(istream,ElemType,Traits)& in, |
|||
flyweight<T,BOOST_FLYWEIGHT_TEMPL_ARGS(_)>& x); |
|||
|
|||
} /* namespace flyweights */ |
|||
|
|||
using flyweights::flyweight; |
|||
|
|||
} /* namespace boost */ |
|||
|
|||
#if !defined(BOOST_FLYWEIGHT_DISABLE_HASH_SUPPORT)
|
|||
#if !defined(BOOST_NO_CXX11_HDR_FUNCTIONAL)
|
|||
|
|||
#if BOOST_WORKAROUND(_CPPLIB_VER,==520)
|
|||
/* Dinkumware 5.20 defines std::hash as class rather than struct */ |
|||
#define BOOST_FLYWEIGHT_STD_HASH_STRUCT_KEYWORD class
|
|||
#else
|
|||
#define BOOST_FLYWEIGHT_STD_HASH_STRUCT_KEYWORD struct
|
|||
#endif
|
|||
|
|||
#if !defined(_LIBCPP_VERSION)
|
|||
namespace std{ |
|||
template <class T> BOOST_FLYWEIGHT_STD_HASH_STRUCT_KEYWORD hash; |
|||
} |
|||
#else
|
|||
/* As discussed in http://lists.boost.org/Archives/boost/2011/02/177218.php */ |
|||
#include <functional>
|
|||
#endif
|
|||
|
|||
namespace std{ |
|||
|
|||
template<typename T,BOOST_FLYWEIGHT_TYPENAME_TEMPL_ARGS(_)> |
|||
BOOST_FLYWEIGHT_STD_HASH_STRUCT_KEYWORD |
|||
hash<boost::flyweight<T,BOOST_FLYWEIGHT_TEMPL_ARGS(_)> >; |
|||
|
|||
} /* namespace std */ |
|||
#endif /* !defined(BOOST_NO_CXX11_HDR_FUNCTIONAL) */
|
|||
|
|||
namespace boost{ |
|||
#if !defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP)
|
|||
namespace flyweights{ |
|||
#endif
|
|||
|
|||
template<typename T,BOOST_FLYWEIGHT_TYPENAME_TEMPL_ARGS(_)> |
|||
inline std::size_t hash_value( |
|||
const flyweight<T,BOOST_FLYWEIGHT_TEMPL_ARGS(_)>& x); |
|||
|
|||
#if !defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP)
|
|||
} /* namespace flyweights */ |
|||
#endif
|
|||
} /* namespace boost */ |
|||
#endif /* !defined(BOOST_FLYWEIGHT_DISABLE_HASH_SUPPORT) */
|
|||
|
|||
#undef BOOST_FLYWEIGHT_COMPLETE_COMP_OPS_DECL
|
|||
#undef BOOST_FLYWEIGHT_TEMPL_ARGS
|
|||
#undef BOOST_FLYWEIGHT_TYPENAME_TEMPL_ARGS
|
|||
|
|||
#endif
|
@ -0,0 +1,125 @@ |
|||
/* Copyright 2006-2014 Joaquin M Lopez Munoz.
|
|||
* 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/flyweight for library home page.
|
|||
*/ |
|||
|
|||
#ifndef BOOST_FLYWEIGHT_HASHED_FACTORY_HPP
|
|||
#define BOOST_FLYWEIGHT_HASHED_FACTORY_HPP
|
|||
|
|||
#if defined(_MSC_VER)
|
|||
#pragma once
|
|||
#endif
|
|||
|
|||
#include <boost/config.hpp> /* keep it first to prevent nasty warns in MSVC */
|
|||
#include <boost/flyweight/factory_tag.hpp>
|
|||
#include <boost/flyweight/hashed_factory_fwd.hpp>
|
|||
#include <boost/multi_index_container.hpp>
|
|||
#include <boost/multi_index/identity.hpp>
|
|||
#include <boost/multi_index/hashed_index.hpp>
|
|||
#include <boost/mpl/aux_/lambda_support.hpp>
|
|||
#include <boost/mpl/if.hpp>
|
|||
|
|||
#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
|
|||
#include <utility>
|
|||
#endif
|
|||
|
|||
/* Flyweight factory based on a hashed container implemented
|
|||
* with Boost.MultiIndex. |
|||
*/ |
|||
|
|||
namespace boost{ |
|||
|
|||
namespace flyweights{ |
|||
|
|||
template< |
|||
typename Entry,typename Key, |
|||
typename Hash,typename Pred,typename Allocator |
|||
> |
|||
class hashed_factory_class:public factory_marker |
|||
{ |
|||
struct index_list: |
|||
boost::mpl::vector1< |
|||
multi_index::hashed_unique< |
|||
multi_index::identity<Entry>, |
|||
typename boost::mpl::if_< |
|||
mpl::is_na<Hash>, |
|||
hash<Key>, |
|||
Hash |
|||
>::type, |
|||
typename boost::mpl::if_< |
|||
mpl::is_na<Pred>, |
|||
std::equal_to<Key>, |
|||
Pred |
|||
>::type |
|||
> |
|||
> |
|||
{}; |
|||
|
|||
typedef multi_index::multi_index_container< |
|||
Entry, |
|||
index_list, |
|||
typename boost::mpl::if_< |
|||
mpl::is_na<Allocator>, |
|||
std::allocator<Entry>, |
|||
Allocator |
|||
>::type |
|||
> container_type; |
|||
|
|||
public: |
|||
typedef const Entry* handle_type; |
|||
|
|||
handle_type insert(const Entry& x) |
|||
{ |
|||
return &*cont.insert(x).first; |
|||
} |
|||
|
|||
#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
|
|||
handle_type insert(Entry&& x) |
|||
{ |
|||
return &*cont.insert(std::move(x)).first; |
|||
} |
|||
#endif
|
|||
|
|||
void erase(handle_type h) |
|||
{ |
|||
cont.erase(cont.iterator_to(*h)); |
|||
} |
|||
|
|||
static const Entry& entry(handle_type h){return *h;} |
|||
|
|||
private: |
|||
container_type cont; |
|||
|
|||
public: |
|||
typedef hashed_factory_class type; |
|||
BOOST_MPL_AUX_LAMBDA_SUPPORT( |
|||
5,hashed_factory_class,(Entry,Key,Hash,Pred,Allocator)) |
|||
}; |
|||
|
|||
/* hashed_factory_class specifier */ |
|||
|
|||
template< |
|||
typename Hash,typename Pred,typename Allocator |
|||
BOOST_FLYWEIGHT_NOT_A_PLACEHOLDER_EXPRESSION_DEF |
|||
> |
|||
struct hashed_factory:factory_marker |
|||
{ |
|||
template<typename Entry,typename Key> |
|||
struct apply: |
|||
mpl::apply2< |
|||
hashed_factory_class< |
|||
boost::mpl::_1,boost::mpl::_2,Hash,Pred,Allocator |
|||
>, |
|||
Entry,Key |
|||
> |
|||
{}; |
|||
}; |
|||
|
|||
} /* namespace flyweights */ |
|||
|
|||
} /* namespace boost */ |
|||
|
|||
#endif
|
@ -0,0 +1,40 @@ |
|||
/* Copyright 2006-2008 Joaquin M Lopez Munoz.
|
|||
* 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/flyweight for library home page.
|
|||
*/ |
|||
|
|||
#ifndef BOOST_FLYWEIGHT_HASHED_FACTORY_FWD_HPP
|
|||
#define BOOST_FLYWEIGHT_HASHED_FACTORY_FWD_HPP
|
|||
|
|||
#if defined(_MSC_VER)
|
|||
#pragma once
|
|||
#endif
|
|||
|
|||
#include <boost/config.hpp> /* keep it first to prevent nasty warns in MSVC */
|
|||
#include <boost/flyweight/detail/not_placeholder_expr.hpp>
|
|||
#include <boost/mpl/aux_/na.hpp>
|
|||
|
|||
namespace boost{ |
|||
|
|||
namespace flyweights{ |
|||
|
|||
template< |
|||
typename Entry,typename Key, |
|||
typename Hash=mpl::na,typename Pred=mpl::na,typename Allocator=mpl::na |
|||
> |
|||
class hashed_factory_class; |
|||
|
|||
template< |
|||
typename Hash=mpl::na,typename Pred=mpl::na,typename Allocator=mpl::na |
|||
BOOST_FLYWEIGHT_NOT_A_PLACEHOLDER_EXPRESSION |
|||
> |
|||
struct hashed_factory; |
|||
|
|||
} /* namespace flyweights */ |
|||
|
|||
} /* namespace boost */ |
|||
|
|||
#endif
|
@ -0,0 +1,44 @@ |
|||
/* Copyright 2006-2008 Joaquin M Lopez Munoz.
|
|||
* 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/flyweight for library home page.
|
|||
*/ |
|||
|
|||
#ifndef BOOST_FLYWEIGHT_HOLDER_TAG_HPP
|
|||
#define BOOST_FLYWEIGHT_HOLDER_TAG_HPP
|
|||
|
|||
#if defined(_MSC_VER)
|
|||
#pragma once
|
|||
#endif
|
|||
|
|||
#include <boost/config.hpp> /* keep it first to prevent nasty warns in MSVC */
|
|||
#include <boost/parameter/parameters.hpp>
|
|||
#include <boost/type_traits/is_base_and_derived.hpp>
|
|||
|
|||
namespace boost{ |
|||
|
|||
namespace flyweights{ |
|||
|
|||
/* Three ways to indicate that a given class T is a holder specifier:
|
|||
* 1. Make it derived from holder_marker. |
|||
* 2. Specialize is_holder to evaluate to boost::mpl::true_. |
|||
* 3. Pass it as holder<T> when defining a flyweight type. |
|||
*/ |
|||
|
|||
struct holder_marker{}; |
|||
|
|||
template<typename T> |
|||
struct is_holder:is_base_and_derived<holder_marker,T> |
|||
{}; |
|||
|
|||
template<typename T=parameter::void_> |
|||
struct holder:parameter::template_keyword<holder<>,T> |
|||
{}; |
|||
|
|||
} /* namespace flyweights */ |
|||
|
|||
} /* namespace boost */ |
|||
|
|||
#endif
|
Some files were not shown because too many files changed in this diff
Write
Preview
Loading…
Cancel
Save
Reference in new issue