summaryrefslogtreecommitdiff
path: root/libs/container
diff options
context:
space:
mode:
authorDongHun Kwak <dh0128.kwak@samsung.com>2019-12-05 15:12:59 +0900
committerDongHun Kwak <dh0128.kwak@samsung.com>2019-12-05 15:12:59 +0900
commitb8cf34c691623e4ec329053cbbf68522a855882d (patch)
tree34da08632a99677f6b79ecb65e5b655a5b69a67f /libs/container
parent3fdc3e5ee96dca5b11d1694975a65200787eab86 (diff)
downloadboost-b8cf34c691623e4ec329053cbbf68522a855882d.tar.gz
boost-b8cf34c691623e4ec329053cbbf68522a855882d.tar.bz2
boost-b8cf34c691623e4ec329053cbbf68522a855882d.zip
Imported Upstream version 1.67.0upstream/1.67.0
Diffstat (limited to 'libs/container')
-rw-r--r--libs/container/bench/Jamfile.v22
-rw-r--r--libs/container/bench/bench_adaptive_node_pool.cpp12
-rw-r--r--libs/container/bench/bench_alloc_shrink_to_fit.cpp4
-rw-r--r--libs/container/bench/detail/varray.hpp8
-rw-r--r--libs/container/bench/detail/varray_concept.hpp4
-rw-r--r--libs/container/bench/detail/varray_util.hpp34
-rw-r--r--libs/container/bench/varray.hpp8
-rw-r--r--libs/container/doc/Jamfile.v23
-rw-r--r--libs/container/doc/autodoc.xml192
-rw-r--r--libs/container/doc/container.qbk179
-rw-r--r--libs/container/doc/images/stable_vector.png (renamed from libs/container/doc/html/images/stable_vector.png)bin7163 -> 7163 bytes
-rw-r--r--libs/container/example/Jamfile.v22
-rw-r--r--libs/container/example/doc_custom_tree.cpp5
-rw-r--r--libs/container/example/doc_custom_vector.cpp54
-rw-r--r--libs/container/proj/vc7ide/container.sln296
-rw-r--r--libs/container/proj/vc7ide/doc_custom_tree.vcproj2
-rw-r--r--libs/container/proj/vc7ide/doc_custom_vector.vcproj136
-rw-r--r--libs/container/proj/vc7ide/doc_extended_allocators.vcproj2
-rw-r--r--libs/container/proj/vc7ide/doc_move_containers.vcproj2
-rw-r--r--libs/container/proj/vc7ide/doc_pmr.vcproj2
-rw-r--r--libs/container/proj/vc7ide/doc_recursive_containers.vcproj2
-rw-r--r--libs/container/proj/vc7ide/doc_type_erasure.vcproj2
-rw-r--r--libs/container/proj/vc7ide/vector_options_test.vcproj135
-rw-r--r--libs/container/src/dlmalloc_ext_2_8_6.c2
-rw-r--r--libs/container/src/monotonic_buffer_resource.cpp13
-rw-r--r--libs/container/src/pool_resource.cpp8
-rw-r--r--libs/container/test/Jamfile.v22
-rw-r--r--libs/container/test/allocator_argument_tester.hpp8
-rw-r--r--libs/container/test/allocator_traits_test.cpp16
-rw-r--r--libs/container/test/check_equal_containers.hpp12
-rw-r--r--libs/container/test/deque_test.cpp6
-rw-r--r--libs/container/test/dummy_test_allocator.hpp6
-rw-r--r--libs/container/test/emplace_test.hpp36
-rw-r--r--libs/container/test/expand_bwd_test_allocator.hpp10
-rw-r--r--libs/container/test/flat_map_test.cpp4
-rw-r--r--libs/container/test/flat_set_test.cpp23
-rw-r--r--libs/container/test/flat_tree_test.cpp10
-rw-r--r--libs/container/test/global_resource_test.cpp2
-rw-r--r--libs/container/test/list_test.cpp2
-rw-r--r--libs/container/test/list_test.hpp6
-rw-r--r--libs/container/test/map_test.hpp18
-rw-r--r--libs/container/test/node_handle_test.cpp16
-rw-r--r--libs/container/test/null_iterators_test.cpp2
-rw-r--r--libs/container/test/pair_test.cpp58
-rw-r--r--libs/container/test/pmr_deque_test.cpp2
-rw-r--r--libs/container/test/pmr_flat_map_test.cpp2
-rw-r--r--libs/container/test/pmr_flat_set_test.cpp2
-rw-r--r--libs/container/test/pmr_list_test.cpp2
-rw-r--r--libs/container/test/pmr_map_test.cpp2
-rw-r--r--libs/container/test/pmr_set_test.cpp2
-rw-r--r--libs/container/test/pmr_small_vector_test.cpp2
-rw-r--r--libs/container/test/pmr_stable_vector_test.cpp2
-rw-r--r--libs/container/test/pmr_string_test.cpp2
-rw-r--r--libs/container/test/pmr_vector_test.cpp2
-rw-r--r--libs/container/test/polymorphic_allocator_test.cpp4
-rw-r--r--libs/container/test/propagation_test_allocator.hpp8
-rw-r--r--libs/container/test/scoped_allocator_adaptor_test.cpp74
-rw-r--r--libs/container/test/scoped_allocator_usage_test.cpp2
-rw-r--r--libs/container/test/set_test.hpp32
-rw-r--r--libs/container/test/slist_test.cpp33
-rw-r--r--libs/container/test/tree_test.cpp4
-rw-r--r--libs/container/test/vector_options_test.cpp121
-rw-r--r--libs/container/test/vector_test.cpp11
-rw-r--r--libs/container/test/vector_test.hpp12
64 files changed, 1124 insertions, 543 deletions
diff --git a/libs/container/bench/Jamfile.v2 b/libs/container/bench/Jamfile.v2
index cc068ee93e..9cf993dc45 100644
--- a/libs/container/bench/Jamfile.v2
+++ b/libs/container/bench/Jamfile.v2
@@ -21,7 +21,7 @@ rule test_all
for local fileb in [ glob *.cpp ]
{
- all_rules += [ run $(fileb) /boost/timer//boost_timer /boost/container//boost_container
+ all_rules += [ run $(fileb) /boost/container//boost_container /boost/timer//boost_timer
: # additional args
: # test-files
: # requirements
diff --git a/libs/container/bench/bench_adaptive_node_pool.cpp b/libs/container/bench/bench_adaptive_node_pool.cpp
index 048e1b3f9a..e9a3681d20 100644
--- a/libs/container/bench/bench_adaptive_node_pool.cpp
+++ b/libs/container/bench/bench_adaptive_node_pool.cpp
@@ -221,28 +221,28 @@ void list_test_template(std::size_t num_iterations, std::size_t num_elements, bo
}
//Release node_allocator cache
- typedef boost::container::container_detail::shared_node_pool
+ typedef boost::container::dtl::shared_node_pool
< (2*sizeof(void*)+sizeof(int))
, AdPoolAlignOnlyV2::nodes_per_block> shared_node_pool_t;
- boost::container::container_detail::singleton_default
+ boost::container::dtl::singleton_default
<shared_node_pool_t>::instance().purge_blocks();
//Release adaptive_pool cache
- typedef boost::container::container_detail::shared_adaptive_node_pool
+ typedef boost::container::dtl::shared_adaptive_node_pool
< (2*sizeof(void*)+sizeof(int))
, AdPool2PercentV2::nodes_per_block
, AdPool2PercentV2::max_free_blocks
, AdPool2PercentV2::overhead_percent> shared_adaptive_pool_plus_t;
- boost::container::container_detail::singleton_default
+ boost::container::dtl::singleton_default
<shared_adaptive_pool_plus_t>::instance().deallocate_free_blocks();
//Release adaptive_pool cache
- typedef boost::container::container_detail::shared_adaptive_node_pool
+ typedef boost::container::dtl::shared_adaptive_node_pool
< (2*sizeof(void*)+sizeof(int))
, AdPool2PercentV2::nodes_per_block
, AdPool2PercentV2::max_free_blocks
, 0u> shared_adaptive_pool_plus_align_only_t;
- boost::container::container_detail::singleton_default
+ boost::container::dtl::singleton_default
<shared_adaptive_pool_plus_align_only_t>::instance().deallocate_free_blocks();
//Release dlmalloc memory
bc::dlmalloc_trim(0);
diff --git a/libs/container/bench/bench_alloc_shrink_to_fit.cpp b/libs/container/bench/bench_alloc_shrink_to_fit.cpp
index 271d770a3d..687d76d214 100644
--- a/libs/container/bench/bench_alloc_shrink_to_fit.cpp
+++ b/libs/container/bench/bench_alloc_shrink_to_fit.cpp
@@ -84,8 +84,8 @@ void vector_test_template(unsigned int num_iterations, unsigned int num_elements
timer.resume();
#ifndef NDEBUG
- typedef bc::container_detail::integral_constant
- <unsigned, bc::container_detail::version<Allocator>::value> alloc_version;
+ typedef bc::dtl::integral_constant
+ <unsigned, bc::dtl::version<Allocator>::value> alloc_version;
#endif
for(unsigned int r = 0; r != num_iterations; ++r){
diff --git a/libs/container/bench/detail/varray.hpp b/libs/container/bench/detail/varray.hpp
index 4553c47a11..ca29c146a4 100644
--- a/libs/container/bench/detail/varray.hpp
+++ b/libs/container/bench/detail/varray.hpp
@@ -50,7 +50,7 @@
* @defgroup varray_non_member varray non-member functions
*/
-namespace boost { namespace container { namespace container_detail {
+namespace boost { namespace container { namespace dtl {
// Forward declaration
template <typename Value, std::size_t Capacity, typename Strategy>
@@ -220,14 +220,14 @@ struct varray_traits
template <typename Value, std::size_t Capacity, typename Strategy = strategy::def<Value> >
class varray
{
- typedef container_detail::varray_traits<
+ typedef dtl::varray_traits<
Value, Capacity, Strategy
> vt;
typedef typename vt::error_handler errh;
typedef typename aligned_storage<
sizeof(Value[Capacity]),
- boost::container::container_detail::alignment_of<Value[Capacity]>::value
+ boost::container::dtl::alignment_of<Value[Capacity]>::value
>::type aligned_storage_type;
template <typename V, std::size_t C, typename S>
@@ -2235,7 +2235,7 @@ inline void swap(varray<V, C1, S1> & x, varray<V, C2, S2> & y)
x.swap(y);
}
-}}} // namespace boost::container::container_detail
+}}} // namespace boost::container::dtl
#include <boost/container/detail/config_end.hpp>
diff --git a/libs/container/bench/detail/varray_concept.hpp b/libs/container/bench/detail/varray_concept.hpp
index 6f044a9ac5..94d19bd793 100644
--- a/libs/container/bench/detail/varray_concept.hpp
+++ b/libs/container/bench/detail/varray_concept.hpp
@@ -12,7 +12,7 @@
#include <boost/concept_check.hpp>
-namespace boost { namespace container { namespace container_detail { namespace concept {
+namespace boost { namespace container { namespace dtl { namespace concept {
/**
* VArrayStrategyConcept
@@ -55,6 +55,6 @@ public :
#endif
};
-}}}} // namespace boost::container::container_detail::concept
+}}}} // namespace boost::container::dtl::concept
#endif //BOOST_CONTAINER_VARRAY_CONCEPT_HPP
diff --git a/libs/container/bench/detail/varray_util.hpp b/libs/container/bench/detail/varray_util.hpp
index 9eac6a83ed..043e9e939d 100644
--- a/libs/container/bench/detail/varray_util.hpp
+++ b/libs/container/bench/detail/varray_util.hpp
@@ -41,10 +41,10 @@
namespace boost { namespace container { namespace varray_detail {
-namespace bcd = ::boost::container::container_detail;
+namespace bcd = ::boost::container::dtl;
template <typename I>
-struct are_elements_contiguous : boost::container::container_detail::is_pointer<I>
+struct are_elements_contiguous : boost::container::dtl::is_pointer<I>
{};
#if defined(BOOST_CONTAINER_VARRAY_ENABLE_VECTORS_OPTIMIZATION) && !defined(BOOST_NO_EXCEPTIONS)
@@ -176,7 +176,7 @@ inline O copy_dispatch(I first, I last, O dst, bcd::true_type const& /*use_memmo
{
typedef typename ::boost::container::iterator_traits<I>::value_type value_type;
const std::size_t d = boost::container::iterator_distance(first, last);
- ::memmove(boost::container::container_detail::addressof(*dst), boost::container::container_detail::addressof(*first), sizeof(value_type) * d);
+ ::memmove(boost::container::dtl::addressof(*dst), boost::container::dtl::addressof(*first), sizeof(value_type) * d);
return dst + d;
}
@@ -206,7 +206,7 @@ O uninitialized_copy_dispatch(I first, I last, O dst,
{
typedef typename ::boost::container::iterator_traits<I>::value_type value_type;
const std::size_t d = boost::container::iterator_distance(first, last);
- ::memcpy(boost::container::container_detail::addressof(*dst), boost::container::container_detail::addressof(*first), sizeof(value_type) * d);
+ ::memcpy(boost::container::dtl::addressof(*dst), boost::container::dtl::addressof(*first), sizeof(value_type) * d);
return dst + d;
}
@@ -238,7 +238,7 @@ O uninitialized_move_dispatch(I first, I last, O dst,
{
typedef typename ::boost::container::iterator_traits<I>::value_type value_type;
const std::size_t d = boost::container::iterator_distance(first, last);
- ::memcpy(boost::container::container_detail::addressof(*dst), boost::container::container_detail::addressof(*first), sizeof(value_type) * d);
+ ::memcpy(boost::container::dtl::addressof(*dst), boost::container::dtl::addressof(*first), sizeof(value_type) * d);
return dst + d;
}
@@ -255,7 +255,7 @@ O uninitialized_move_dispatch(I first, I last, O dst,
{
typedef typename boost::container::iterator_traits<O>::value_type value_type;
for (; first != last; ++first, ++o )
- new (boost::container::container_detail::addressof(*o)) value_type(boost::move(*first));
+ new (boost::container::dtl::addressof(*o)) value_type(boost::move(*first));
}
BOOST_CATCH(...)
{
@@ -289,7 +289,7 @@ O move_dispatch(I first, I last, O dst,
{
typedef typename ::boost::container::iterator_traits<I>::value_type value_type;
const std::size_t d = boost::container::iterator_distance(first, last);
- ::memmove(boost::container::container_detail::addressof(*dst), boost::container::container_detail::addressof(*first), sizeof(value_type)*d );
+ ::memmove(boost::container::dtl::addressof(*dst), boost::container::dtl::addressof(*first), sizeof(value_type)*d );
return dst + d;
}
@@ -322,7 +322,7 @@ BDO move_backward_dispatch(BDI first, BDI last, BDO dst,
typedef typename ::boost::container::iterator_traits<BDI>::value_type value_type;
const std::size_t d = boost::container::iterator_distance(first, last);
BDO foo(dst - d);
- ::memmove(boost::container::container_detail::addressof(*foo), boost::container::container_detail::addressof(*first), sizeof(value_type) * d);
+ ::memmove(boost::container::dtl::addressof(*foo), boost::container::dtl::addressof(*first), sizeof(value_type) * d);
return foo;
}
@@ -419,7 +419,7 @@ void uninitialized_fill_dispatch(I first, I last,
{
typedef typename ::boost::container::iterator_traits<I>::value_type value_type;
for ( ; first != last ; ++first )
- new (boost::container::container_detail::addressof(*first)) value_type();
+ new (boost::container::dtl::addressof(*first)) value_type();
}
template <typename I, typename DisableTrivialInit>
@@ -434,7 +434,7 @@ void uninitialized_fill_dispatch(I first, I last,
BOOST_TRY
{
for ( ; it != last ; ++it )
- new (boost::container::container_detail::addressof(*it)) value_type(); // may throw
+ new (boost::container::dtl::addressof(*it)) value_type(); // may throw
}
BOOST_CATCH(...)
{
@@ -466,7 +466,7 @@ inline
void construct_dispatch(bcd::false_type const& /*dont_init*/, I pos)
{
typedef typename ::boost::container::iterator_traits<I>::value_type value_type;
- new (static_cast<void*>(::boost::container::container_detail::addressof(*pos))) value_type(); // may throw
+ new (static_cast<void*>(::boost::container::dtl::addressof(*pos))) value_type(); // may throw
}
template <typename DisableTrivialInit, typename I>
@@ -487,7 +487,7 @@ template <typename I, typename V>
inline
void construct_dispatch(I pos, V const& v, bcd::true_type const& /*use_memcpy*/)
{
- ::memcpy(boost::container::container_detail::addressof(*pos), boost::container::container_detail::addressof(v), sizeof(V));
+ ::memcpy(boost::container::dtl::addressof(*pos), boost::container::dtl::addressof(v), sizeof(V));
}
template <typename I, typename P>
@@ -496,7 +496,7 @@ void construct_dispatch(I pos, P const& p,
bcd::false_type const& /*use_memcpy*/)
{
typedef typename ::boost::container::iterator_traits<I>::value_type V;
- new (static_cast<void*>(boost::container::container_detail::addressof(*pos))) V(p); // may throw
+ new (static_cast<void*>(boost::container::dtl::addressof(*pos))) V(p); // may throw
}
template <typename DisableTrivialInit, typename I, typename P>
@@ -517,7 +517,7 @@ inline
void construct(DisableTrivialInit const&, I pos, BOOST_RV_REF(P) p)
{
typedef typename ::boost::container::iterator_traits<I>::value_type V;
- new (static_cast<void*>(boost::container::container_detail::addressof(*pos))) V(::boost::move(p)); // may throw
+ new (static_cast<void*>(boost::container::dtl::addressof(*pos))) V(::boost::move(p)); // may throw
}
// Needed by emplace_back() and emplace()
@@ -532,7 +532,7 @@ void construct(DisableTrivialInit const&,
BOOST_FWD_REF(Args) ...args)
{
typedef typename ::boost::container::iterator_traits<I>::value_type V;
- new (static_cast<void*>(boost::container::container_detail::addressof(*pos))) V(::boost::forward<Args>(args)...); // may throw
+ new (static_cast<void*>(boost::container::dtl::addressof(*pos))) V(::boost::forward<Args>(args)...); // may throw
}
#else // !BOOST_NO_CXX11_VARIADIC_TEMPLATES
@@ -546,7 +546,7 @@ template <typename DisableTrivialInit, typename I, typename P BOOST_MOVE_I##N BO
inline void construct(DisableTrivialInit const&, I pos, BOOST_FWD_REF(P) p BOOST_MOVE_I##N BOOST_MOVE_UREF##N )\
{\
typedef typename ::boost::container::iterator_traits<I>::value_type V;\
- new (static_cast<void*>(boost::container::container_detail::addressof(*pos)))\
+ new (static_cast<void*>(boost::container::dtl::addressof(*pos)))\
V(::boost::forward<P>(p) BOOST_MOVE_I##N BOOST_MOVE_FWD##N); /*may throw*/\
}
BOOST_MOVE_ITERATE_1TO9(BOOST_CONTAINER_VARRAY_UTIL_CONSTRUCT_CODE)
@@ -562,7 +562,7 @@ inline
void assign_dispatch(I pos, V const& v,
bcd::true_type const& /*use_memcpy*/)
{
- ::memcpy(boost::container::container_detail::addressof(*pos), boost::container::container_detail::addressof(v), sizeof(V));
+ ::memcpy(boost::container::dtl::addressof(*pos), boost::container::dtl::addressof(v), sizeof(V));
}
template <typename I, typename V>
diff --git a/libs/container/bench/varray.hpp b/libs/container/bench/varray.hpp
index caac4af664..98b710078f 100644
--- a/libs/container/bench/varray.hpp
+++ b/libs/container/bench/varray.hpp
@@ -54,9 +54,9 @@ namespace boost { namespace container {
*/
template <typename Value, std::size_t Capacity>
class varray
- : public container_detail::varray<Value, Capacity>
+ : public dtl::varray<Value, Capacity>
{
- typedef container_detail::varray<Value, Capacity> base_t;
+ typedef dtl::varray<Value, Capacity> base_t;
BOOST_COPYABLE_AND_MOVABLE(varray)
@@ -238,7 +238,7 @@ public:
//! Linear O(N).
template <std::size_t C>
varray(BOOST_RV_REF_2_TEMPL_ARGS(varray, value_type, C) other)
- : base_t(boost::move(static_cast<container_detail::varray<value_type, C>&>(other)))
+ : base_t(boost::move(static_cast<dtl::varray<value_type, C>&>(other)))
{}
//! @brief Move assignment. Moves Values stored in the other varray to this one.
@@ -272,7 +272,7 @@ public:
template <std::size_t C>
varray & operator=(BOOST_RV_REF_2_TEMPL_ARGS(varray, value_type, C) other)
{
- base_t::operator=(boost::move(static_cast<container_detail::varray<value_type, C>&>(other)));
+ base_t::operator=(boost::move(static_cast<dtl::varray<value_type, C>&>(other)));
return *this;
}
diff --git a/libs/container/doc/Jamfile.v2 b/libs/container/doc/Jamfile.v2
index 62bb90d8f0..dedb9c1455 100644
--- a/libs/container/doc/Jamfile.v2
+++ b/libs/container/doc/Jamfile.v2
@@ -40,7 +40,8 @@ doxygen autodoc
\"BOOST_RV_REF_END_IF_CXX11=&&\" \\
\"BOOST_COPY_ASSIGN_REF(T)=const T &\" \\
\"BOOST_FWD_REF(a)=a &&\" \\
- \"BOOST_INTRUSIVE_OPTION_CONSTANT(OPTION_NAME, TYPE, VALUE, CONSTANT_NAME) = template<TYPE VALUE> struct OPTION_NAME{};\" \\
+ \"BOOST_INTRUSIVE_OPTION_CONSTANT(OPTION_NAME, TYPE, VALUE, CONSTANT_NAME) = template<TYPE VALUE> struct OPTION_NAME{};\" \\
+ \"BOOST_INTRUSIVE_OPTION_TYPE(OPTION_NAME, TYPE, TYPEDEF_EXPR, TYPEDEF_NAME) = template<class TYPE> struct OPTION_NAME{};\" \\
\"BOOST_CONTAINER_DOC1ST(T1, T2)=T1\" \\
\"BOOST_CONTAINER_DOCIGN(T) \"\\
\"BOOST_CONTAINER_DOCONLY(T)=T\"\\
diff --git a/libs/container/doc/autodoc.xml b/libs/container/doc/autodoc.xml
index 322000ab9b..2cb313433b 100644
--- a/libs/container/doc/autodoc.xml
+++ b/libs/container/doc/autodoc.xml
@@ -15,11 +15,11 @@
<typedef name="value_type"><type>T</type></typedef>
<typedef name="pointer"><type>T *</type></typedef>
<typedef name="const_pointer"><type>const T *</type></typedef>
-<typedef name="reference"><type><emphasis>unspecified</emphasis></type></typedef>
-<typedef name="const_reference"><type><emphasis>unspecified</emphasis></type></typedef>
+<typedef name="reference"><type>::boost::container::dtl::unvoid_ref&lt; T &gt;::type</type></typedef>
+<typedef name="const_reference"><type>::boost::container::dtl::unvoid_ref&lt; const T &gt;::type</type></typedef>
<typedef name="size_type"><type>std::size_t</type></typedef>
<typedef name="difference_type"><type>std::ptrdiff_t</type></typedef>
-<typedef name="version"><type><emphasis>unspecified</emphasis></type></typedef>
+<typedef name="version"><type>boost::container::dtl::version_type&lt; <classname>self_t</classname>, Version &gt;</type></typedef>
<data-member name="nodes_per_block" specifiers="static"><type>const std::size_t</type></data-member>
<data-member name="max_free_blocks" specifiers="static"><type>const std::size_t</type></data-member>
<data-member name="overhead_percent" specifiers="static"><type>const std::size_t</type></data-member>
@@ -134,7 +134,7 @@
<typedef name="const_reference"><type>const T &amp;</type></typedef>
<typedef name="size_type"><type>std::size_t</type></typedef>
<typedef name="difference_type"><type>std::ptrdiff_t</type></typedef>
-<typedef name="version"><type><emphasis>unspecified</emphasis></type></typedef>
+<typedef name="version"><type>boost::container::dtl::version_type&lt; self_t, Version &gt;</type></typedef>
<method-group name="public member functions">
<method name="allocate"><type>pointer</type><parameter name="count"><paramtype>size_type</paramtype></parameter><parameter name="hint"><paramtype>const void *</paramtype><default>0</default></parameter><description><para>Allocates memory for an array of count elements. Throws std::bad_alloc if there is no enough memory If Version is 2, this allocated memory can only be deallocated with deallocate() or (for Version == 2) deallocate_many() </para></description></method>
<method name="deallocate" cv="noexcept"><type>void</type><parameter name="ptr"><paramtype>pointer</paramtype></parameter><parameter name=""><paramtype>size_type</paramtype></parameter><description><para>Deallocates previously allocated memory. Never throws </para></description></method>
@@ -334,11 +334,7 @@
<listitem><para><classname alt="boost::container::pmr::memory_resource">boost::container::pmr::memory_resource</classname></para></listitem><listitem><para><classname alt="boost::container::pmr::polymorphic_allocator">boost::container::pmr::polymorphic_allocator</classname></para></listitem><listitem><para><classname alt="boost::container::pmr::monotonic_buffer_resource">boost::container::pmr::monotonic_buffer_resource</classname></para></listitem><listitem><para><classname alt="boost::container::pmr::pool_options">boost::container::pmr::pool_options</classname></para></listitem><listitem><para><classname alt="boost::container::pmr::unsynchronized_pool_resource">boost::container::pmr::unsynchronized_pool_resource</classname></para></listitem><listitem><para><classname alt="boost::container::pmr::synchronized_pool_resource">boost::container::pmr::synchronized_pool_resource</classname></para></listitem></itemizedlist>
</para><para>And finally it defines the following types </para><namespace name="boost">
<namespace name="container">
-<struct name="ordered_range_t"><description><para>Type used to tag that the input range is guaranteed to be ordered </para></description></struct><struct name="ordered_unique_range_t"><inherit access="public">boost::container::ordered_range_t</inherit><description><para>Type used to tag that the input range is guaranteed to be ordered and unique </para></description></struct><struct name="default_init_t"><description><para>Type used to tag that the inserted values should be default initialized </para></description></struct><enum name="tree_type_enum"><enumvalue name="red_black_tree"/><enumvalue name="avl_tree"/><enumvalue name="scapegoat_tree"/><enumvalue name="splay_tree"/><description><para>Enumeration used to configure ordered associative containers with a concrete tree implementation. </para></description></enum>
-<typedef name="tree_assoc_defaults"><description><para>Default options for tree-based associative containers<itemizedlist>
-<listitem><para>tree_type&lt;red_black_tree&gt;</para></listitem><listitem><para>optimize_size&lt;true&gt; </para></listitem></itemizedlist>
-</para></description><type>implementation_defined</type></typedef>
-<data-member name="ordered_range" specifiers="static"><type>const <classname>ordered_range_t</classname></type><description><para>Value used to tag that the input range is guaranteed to be ordered </para></description></data-member>
+<struct name="ordered_range_t"><description><para>Type used to tag that the input range is guaranteed to be ordered </para></description></struct><struct name="ordered_unique_range_t"><inherit access="public">boost::container::ordered_range_t</inherit><description><para>Type used to tag that the input range is guaranteed to be ordered and unique </para></description></struct><struct name="default_init_t"><description><para>Type used to tag that the inserted values should be default initialized </para></description></struct><data-member name="ordered_range" specifiers="static"><type>const <classname>ordered_range_t</classname></type><description><para>Value used to tag that the input range is guaranteed to be ordered </para></description></data-member>
<data-member name="ordered_unique_range" specifiers="static"><type>const <classname>ordered_unique_range_t</classname></type><description><para>Value used to tag that the input range is guaranteed to be ordered and unique </para></description></data-member>
<data-member name="default_init" specifiers="static"><type>const <classname>default_init_t</classname></type><description><para>Value used to tag that the inserted values should be default initialized </para></description></data-member>
@@ -489,7 +485,7 @@
<method name="swap" cv="noexcept(allocator_traits_type::propagate_on_container_swap::value||allocator_traits_type::is_always_equal::value))"><type>void</type><parameter name="x"><paramtype><classname>deque</classname> &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Swaps the contents of *this and x.</para><para><emphasis role="bold">Throws</emphasis>: Nothing.</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></method>
<method name="clear" cv="noexcept"><type>void</type><description><para><emphasis role="bold">Effects</emphasis>: Erases all the elements of the deque.</para><para><emphasis role="bold">Throws</emphasis>: Nothing.</para><para><emphasis role="bold">Complexity</emphasis>: Linear to the number of elements in the deque. </para></description></method>
</method-group>
-<constructor cv="noexcept(container_detail::is_nothrow_default_constructible&lt; Allocator &gt;::value))"><description><para><emphasis role="bold">Effects</emphasis>: Default constructors a deque.</para><para><emphasis role="bold">Throws</emphasis>: If allocator_type's default constructor throws.</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></constructor>
+<constructor cv="noexcept(dtl::is_nothrow_default_constructible&lt; Allocator &gt;::value))"><description><para><emphasis role="bold">Effects</emphasis>: Default constructors a deque.</para><para><emphasis role="bold">Throws</emphasis>: If allocator_type's default constructor throws.</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></constructor>
<constructor specifiers="explicit" cv="noexcept"><parameter name="a"><paramtype>const allocator_type &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Constructs a deque taking the allocator as parameter.</para><para><emphasis role="bold">Throws</emphasis>: Nothing</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></constructor>
<constructor specifiers="explicit"><parameter name="n"><paramtype>size_type</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Constructs a deque and inserts n value initialized values.</para><para><emphasis role="bold">Throws</emphasis>: If allocator_type's default constructor throws or T's value initialization throws.</para><para><emphasis role="bold">Complexity</emphasis>: Linear to n. </para></description></constructor>
<constructor><parameter name="n"><paramtype>size_type</paramtype></parameter><parameter name=""><paramtype><classname>default_init_t</classname></paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Constructs a deque and inserts n default initialized values.</para><para><emphasis role="bold">Throws</emphasis>: If allocator_type's default constructor throws or T's default initialization or copy constructor throws.</para><para><emphasis role="bold">Complexity</emphasis>: Linear to n.</para><para><emphasis role="bold">Note</emphasis>: Non-standard extension </para></description></constructor>
@@ -690,7 +686,7 @@
<typedef name="const_reverse_iterator"><type>sequence_type::const_reverse_iterator</type></typedef>
<typedef name="movable_value_type"><type>implementation_defined</type></typedef>
<method-group name="public member functions">
-<method name="BOOST_STATIC_ASSERT"><type/><parameter name=""><paramtype><emphasis>unspecified</emphasis></paramtype></parameter></method>
+<method name="BOOST_STATIC_ASSERT"><type/><parameter name=""><paramtype>(dtl::is_same&lt; std::pair&lt; Key, T &gt;, typename allocator_type::value_type &gt;::value)</paramtype></parameter></method>
<method name="get_allocator" cv="const noexcept"><type>allocator_type</type><description><para><emphasis role="bold">Effects</emphasis>: Returns a copy of the allocator that was passed to the object's constructor.</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></method>
<method name="get_stored_allocator" cv="noexcept"><type>get_stored_allocator_noconst_return_t</type><description><para><emphasis role="bold">Effects</emphasis>: Returns a reference to the internal allocator.</para><para><emphasis role="bold">Throws</emphasis>: Nothing</para><para><emphasis role="bold">Complexity</emphasis>: Constant.</para><para><emphasis role="bold">Note</emphasis>: Non-standard extension. </para></description></method>
<method name="get_stored_allocator" cv="const noexcept"><type>get_stored_allocator_const_return_t</type><description><para><emphasis role="bold">Effects</emphasis>: Returns a reference to the internal allocator.</para><para><emphasis role="bold">Throws</emphasis>: Nothing</para><para><emphasis role="bold">Complexity</emphasis>: Constant.</para><para><emphasis role="bold">Note</emphasis>: Non-standard extension. </para></description></method>
@@ -758,12 +754,12 @@
<method name="insert"><type>iterator</type><parameter name="p"><paramtype>const_iterator</paramtype></parameter><parameter name="x"><paramtype>movable_value_type &amp;&amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Inserts an element move constructed from x in the container. p is a hint pointing to where the insert should start to search.</para><para><emphasis role="bold">Returns</emphasis>: An iterator pointing to the element with key equivalent to the key of x.</para><para><emphasis role="bold">Complexity</emphasis>: Logarithmic search time (constant if x is inserted right before p) plus insertion linear to the elements with bigger keys than x.</para><para><emphasis role="bold">Note</emphasis>: If an element is inserted it might invalidate elements. </para></description></method>
<method name="insert"><type>void</type><template>
<template-type-parameter name="InputIterator"/>
- </template><parameter name="first"><paramtype>InputIterator</paramtype></parameter><parameter name="last"><paramtype>InputIterator</paramtype></parameter><description><para><emphasis role="bold">Requires</emphasis>: first, last are not iterators into *this.</para><para><emphasis role="bold">Effects</emphasis>: inserts each element from the range [first,last) if and only if there is no element with key equivalent to the key of that element.</para><para><emphasis role="bold">Complexity</emphasis>: At most N log(size()+N) (N is the distance from first to last) search time plus N*size() insertion time.</para><para><emphasis role="bold">Note</emphasis>: If an element is inserted it might invalidate elements. </para></description></method>
+ </template><parameter name="first"><paramtype>InputIterator</paramtype></parameter><parameter name="last"><paramtype>InputIterator</paramtype></parameter><description><para><emphasis role="bold">Requires</emphasis>: first, last are not iterators into *this.</para><para><emphasis role="bold">Effects</emphasis>: inserts each element from the range [first,last) if and only if there is no element with key equivalent to the key of that element.</para><para><emphasis role="bold">Complexity</emphasis>: N log(size()+N).</para><para><emphasis role="bold">Note</emphasis>: If an element is inserted it might invalidate elements. </para></description></method>
<method name="insert"><type>void</type><template>
<template-type-parameter name="InputIterator"/>
- </template><parameter name=""><paramtype><classname>ordered_unique_range_t</classname></paramtype></parameter><parameter name="first"><paramtype>InputIterator</paramtype></parameter><parameter name="last"><paramtype>InputIterator</paramtype></parameter><description><para><emphasis role="bold">Requires</emphasis>: first, last are not iterators into *this.</para><para><emphasis role="bold">Requires</emphasis>: [first ,last) must be ordered according to the predicate and must be unique values.</para><para><emphasis role="bold">Effects</emphasis>: inserts each element from the range [first,last) if and only if there is no element with key equivalent to the key of that element. This function is more efficient than the normal range creation for ordered ranges.</para><para><emphasis role="bold">Complexity</emphasis>: At most N log(size()+N) (N is the distance from first to last) search time plus N*size() insertion time.</para><para><emphasis role="bold">Note</emphasis>: If an element is inserted it might invalidate elements.</para><para><emphasis role="bold">Note</emphasis>: Non-standard extension. </para></description></method>
-<method name="insert"><type>void</type><parameter name="il"><paramtype>std::initializer_list&lt; value_type &gt;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: inserts each element from the range [il.begin(), il.end()) if and only if there is no element with key equivalent to the key of that element.</para><para><emphasis role="bold">Complexity</emphasis>: At most N log(size()+N) (N is the distance from il.first() to il.end()) search time plus N*size() insertion time.</para><para><emphasis role="bold">Note</emphasis>: If an element is inserted it might invalidate elements. </para></description></method>
-<method name="insert"><type>void</type><parameter name=""><paramtype><classname>ordered_unique_range_t</classname></paramtype></parameter><parameter name="il"><paramtype>std::initializer_list&lt; value_type &gt;</paramtype></parameter><description><para><emphasis role="bold">Requires</emphasis>: [il.begin(), il.end()) must be ordered according to the predicate and must be unique values.</para><para><emphasis role="bold">Effects</emphasis>: inserts each element from the range [il.begin(), il.end()) if and only if there is no element with key equivalent to the key of that element. This function is more efficient than the normal range creation for ordered ranges.</para><para><emphasis role="bold">Complexity</emphasis>: At most N log(size()+N) (N is the distance from first to last) search time plus N*size() insertion time.</para><para><emphasis role="bold">Note</emphasis>: If an element is inserted it might invalidate elements.</para><para><emphasis role="bold">Note</emphasis>: Non-standard extension. </para></description></method>
+ </template><parameter name=""><paramtype><classname>ordered_unique_range_t</classname></paramtype></parameter><parameter name="first"><paramtype>InputIterator</paramtype></parameter><parameter name="last"><paramtype>InputIterator</paramtype></parameter><description><para><emphasis role="bold">Requires</emphasis>: first, last are not iterators into *this.</para><para><emphasis role="bold">Requires</emphasis>: [first ,last) must be ordered according to the predicate and must be unique values.</para><para><emphasis role="bold">Effects</emphasis>: inserts each element from the range [first,last) if and only if there is no element with key equivalent to the key of that element. This function is more efficient than the normal range creation for ordered ranges.</para><para><emphasis role="bold">Complexity</emphasis>: Linear.</para><para><emphasis role="bold">Note</emphasis>: If an element is inserted it might invalidate elements.</para><para><emphasis role="bold">Note</emphasis>: Non-standard extension. </para></description></method>
+<method name="insert"><type>void</type><parameter name="il"><paramtype>std::initializer_list&lt; value_type &gt;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: inserts each element from the range [il.begin(), il.end()) if and only if there is no element with key equivalent to the key of that element.</para><para><emphasis role="bold">Complexity</emphasis>: N log(N).</para><para><emphasis role="bold">Note</emphasis>: If an element is inserted it might invalidate elements. </para></description></method>
+<method name="insert"><type>void</type><parameter name=""><paramtype><classname>ordered_unique_range_t</classname></paramtype></parameter><parameter name="il"><paramtype>std::initializer_list&lt; value_type &gt;</paramtype></parameter><description><para><emphasis role="bold">Requires</emphasis>: [il.begin(), il.end()) must be ordered according to the predicate and must be unique values.</para><para><emphasis role="bold">Effects</emphasis>: inserts each element from the range [il.begin(), il.end()) if and only if there is no element with key equivalent to the key of that element. This function is more efficient than the normal range creation for ordered ranges.</para><para><emphasis role="bold">Complexity</emphasis>: Linear.</para><para><emphasis role="bold">Note</emphasis>: If an element is inserted it might invalidate elements.</para><para><emphasis role="bold">Note</emphasis>: Non-standard extension. </para></description></method>
<method name="merge"><type>void</type><template>
<template-type-parameter name="C2"/>
</template><parameter name="source"><paramtype><classname>flat_map</classname>&lt; Key, T, C2, AllocatorOrContainer &gt; &amp;</paramtype></parameter><description><para><emphasis role="bold">Requires</emphasis>: this-&gt;get_allocator() == source.get_allocator().</para><para><emphasis role="bold">Effects</emphasis>: Attempts to extract each element in source and insert it into a using the comparison object of *this. If there is an element in a with key equivalent to the key of an element from source, then that element is not extracted from source.</para><para><emphasis role="bold">Postcondition</emphasis>: Pointers and references to the transferred elements of source refer to those same elements but as members of *this. Iterators referring to the transferred elements will continue to refer to their elements, but they now behave as iterators into *this, not into source.</para><para><emphasis role="bold">Throws</emphasis>: Nothing unless the comparison object throws.</para><para><emphasis role="bold">Complexity</emphasis>: N log(a.size() + N) (N has the value source.size()) </para></description></method>
@@ -779,7 +775,7 @@
<method name="erase"><type>iterator</type><parameter name="p"><paramtype>const_iterator</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Erases the element pointed to by p.</para><para><emphasis role="bold">Returns</emphasis>: Returns an iterator pointing to the element immediately following q prior to the element being erased. If no such element exists, returns end().</para><para><emphasis role="bold">Complexity</emphasis>: Linear to the elements with keys bigger than p</para><para><emphasis role="bold">Note</emphasis>: Invalidates elements with keys not less than the erased element. </para></description></method>
<method name="erase"><type>size_type</type><parameter name="x"><paramtype>const key_type &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Erases all elements in the container with key equivalent to x.</para><para><emphasis role="bold">Returns</emphasis>: Returns the number of erased elements.</para><para><emphasis role="bold">Complexity</emphasis>: Logarithmic search time plus erasure time linear to the elements with bigger keys. </para></description></method>
<method name="erase"><type>iterator</type><parameter name="first"><paramtype>const_iterator</paramtype></parameter><parameter name="last"><paramtype>const_iterator</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Erases all the elements in the range [first, last).</para><para><emphasis role="bold">Returns</emphasis>: Returns last.</para><para><emphasis role="bold">Complexity</emphasis>: size()*N where N is the distance from first to last.</para><para><emphasis role="bold">Complexity</emphasis>: Logarithmic search time plus erasure time linear to the elements with bigger keys. </para></description></method>
-<method name="swap" cv="noexcept(allocator_traits_type::is_always_equal::value &amp;&amp;boost::container::container_detail::is_nothrow_swappable&lt; Compare &gt;::value))"><type>void</type><parameter name="x"><paramtype><classname>flat_map</classname> &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Swaps the contents of *this and x.</para><para><emphasis role="bold">Throws</emphasis>: Nothing.</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></method>
+<method name="swap" cv="noexcept(allocator_traits_type::is_always_equal::value &amp;&amp;boost::container::dtl::is_nothrow_swappable&lt; Compare &gt;::value))"><type>void</type><parameter name="x"><paramtype><classname>flat_map</classname> &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Swaps the contents of *this and x.</para><para><emphasis role="bold">Throws</emphasis>: Nothing.</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></method>
<method name="clear" cv="noexcept"><type>void</type><description><para><emphasis role="bold">Effects</emphasis>: erase(a.begin(),a.end()).</para><para><emphasis role="bold">Postcondition</emphasis>: size() == 0.</para><para><emphasis role="bold">Complexity</emphasis>: linear in size(). </para></description></method>
<method name="key_comp" cv="const"><type>key_compare</type><description><para><emphasis role="bold">Effects</emphasis>: Returns the comparison object out of which a was constructed.</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></method>
<method name="value_comp" cv="const"><type>value_compare</type><description><para><emphasis role="bold">Effects</emphasis>: Returns an object of value_compare constructed out of the comparison object.</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></method>
@@ -796,7 +792,7 @@
<method name="adopt_sequence"><type>void</type><parameter name="seq"><paramtype>sequence_type &amp;&amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Discards the internally hold sequence container and adopts the one passed externally using the move assignment. Erases non-unique elements.</para><para><emphasis role="bold">Complexity</emphasis>: Assuming O(1) move assignment, O(NlogN) with N = seq.size()</para><para><emphasis role="bold">Throws</emphasis>: If the comparison or the move constructor throws </para></description></method>
<method name="adopt_sequence"><type>void</type><parameter name=""><paramtype><classname>ordered_unique_range_t</classname></paramtype></parameter><parameter name="seq"><paramtype>sequence_type &amp;&amp;</paramtype></parameter><description><para><emphasis role="bold">Requires</emphasis>: seq shall be ordered according to this-&gt;compare() and shall contain unique elements.</para><para><emphasis role="bold">Effects</emphasis>: Discards the internally hold sequence container and adopts the one passed externally using the move assignment.</para><para><emphasis role="bold">Complexity</emphasis>: Assuming O(1) move assignment, O(1)</para><para><emphasis role="bold">Throws</emphasis>: If the move assignment throws </para></description></method>
</method-group>
-<constructor cv="noexcept(container_detail::is_nothrow_default_constructible&lt; AllocatorOrContainer &gt;::value &amp;&amp;container_detail::is_nothrow_default_constructible&lt; Compare &gt;::value))"><description><para><emphasis role="bold">Effects</emphasis>: Default constructs an empty <classname alt="boost::container::flat_map">flat_map</classname>.</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></constructor>
+<constructor cv="noexcept(dtl::is_nothrow_default_constructible&lt; AllocatorOrContainer &gt;::value &amp;&amp;dtl::is_nothrow_default_constructible&lt; Compare &gt;::value))"><description><para><emphasis role="bold">Effects</emphasis>: Default constructs an empty <classname alt="boost::container::flat_map">flat_map</classname>.</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></constructor>
<constructor specifiers="explicit"><parameter name="a"><paramtype>const allocator_type &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Constructs an empty <classname alt="boost::container::flat_map">flat_map</classname> using the specified allocator.</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></constructor>
<constructor specifiers="explicit"><parameter name="comp"><paramtype>const Compare &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Constructs an empty <classname alt="boost::container::flat_map">flat_map</classname> using the specified comparison object.</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></constructor>
<constructor><parameter name="comp"><paramtype>const Compare &amp;</paramtype></parameter><parameter name="a"><paramtype>const allocator_type &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Constructs an empty <classname alt="boost::container::flat_map">flat_map</classname> using the specified comparison object and allocator.</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></constructor>
@@ -829,11 +825,11 @@
<constructor><parameter name=""><paramtype><classname>ordered_unique_range_t</classname></paramtype></parameter><parameter name="il"><paramtype>std::initializer_list&lt; value_type &gt;</paramtype></parameter><parameter name="comp"><paramtype>const Compare &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Constructs an empty <classname alt="boost::container::flat_map">flat_map</classname> using the specified comparison object and inserts elements from the ordered unique range [il.begin(), il.end()). This function is more efficient than the normal range creation for ordered ranges.</para><para><emphasis role="bold">Requires</emphasis>: [il.begin(), il.end()) must be ordered according to the predicate and must be unique values.</para><para><emphasis role="bold">Complexity</emphasis>: Linear in N.</para><para><emphasis role="bold">Note</emphasis>: Non-standard extension. </para></description></constructor>
<constructor><parameter name=""><paramtype><classname>ordered_unique_range_t</classname></paramtype></parameter><parameter name="il"><paramtype>std::initializer_list&lt; value_type &gt;</paramtype></parameter><parameter name="comp"><paramtype>const Compare &amp;</paramtype></parameter><parameter name="a"><paramtype>const allocator_type &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Constructs an empty <classname alt="boost::container::flat_map">flat_map</classname> using the specified comparison object and allocator, and inserts elements from the ordered unique range [il.begin(), il.end()). This function is more efficient than the normal range creation for ordered ranges.</para><para><emphasis role="bold">Requires</emphasis>: [il.begin(), il.end()) must be ordered according to the predicate and must be unique values.</para><para><emphasis role="bold">Complexity</emphasis>: Linear in N.</para><para><emphasis role="bold">Note</emphasis>: Non-standard extension. </para></description></constructor>
<constructor><parameter name="x"><paramtype>const <classname>flat_map</classname> &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Copy constructs a <classname alt="boost::container::flat_map">flat_map</classname>.</para><para><emphasis role="bold">Complexity</emphasis>: Linear in x.size(). </para></description></constructor>
-<constructor cv="noexcept(boost::container::container_detail::is_nothrow_move_constructible&lt; Compare &gt;::value))"><parameter name="x"><paramtype><classname>flat_map</classname> &amp;&amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Move constructs a <classname alt="boost::container::flat_map">flat_map</classname>. Constructs *this using x's resources.</para><para><emphasis role="bold">Complexity</emphasis>: Constant.</para><para><emphasis role="bold">Postcondition</emphasis>: x is emptied. </para></description></constructor>
+<constructor cv="noexcept(boost::container::dtl::is_nothrow_move_constructible&lt; Compare &gt;::value))"><parameter name="x"><paramtype><classname>flat_map</classname> &amp;&amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Move constructs a <classname alt="boost::container::flat_map">flat_map</classname>. Constructs *this using x's resources.</para><para><emphasis role="bold">Complexity</emphasis>: Constant.</para><para><emphasis role="bold">Postcondition</emphasis>: x is emptied. </para></description></constructor>
<constructor><parameter name="x"><paramtype>const <classname>flat_map</classname> &amp;</paramtype></parameter><parameter name="a"><paramtype>const allocator_type &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Copy constructs a <classname alt="boost::container::flat_map">flat_map</classname> using the specified allocator.</para><para><emphasis role="bold">Complexity</emphasis>: Linear in x.size(). </para></description></constructor>
<constructor><parameter name="x"><paramtype><classname>flat_map</classname> &amp;&amp;</paramtype></parameter><parameter name="a"><paramtype>const allocator_type &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Move constructs a <classname alt="boost::container::flat_map">flat_map</classname> using the specified allocator. Constructs *this using x's resources.</para><para><emphasis role="bold">Complexity</emphasis>: Constant if x.get_allocator() == a, linear otherwise. </para></description></constructor>
<copy-assignment><type><classname>flat_map</classname> &amp;</type><parameter name="x"><paramtype>const <classname>flat_map</classname> &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Makes *this a copy of x.</para><para><emphasis role="bold">Complexity</emphasis>: Linear in x.size(). </para></description></copy-assignment>
-<copy-assignment cv="noexcept((allocator_traits_type::propagate_on_container_move_assignment::value||allocator_traits_type::is_always_equal::value)&amp;&amp;boost::container::container_detail::is_nothrow_move_assignable&lt; Compare &gt;::value))"><type><classname>flat_map</classname> &amp;</type><parameter name="x"><paramtype><classname>flat_map</classname> &amp;&amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Move constructs a <classname alt="boost::container::flat_map">flat_map</classname>. Constructs *this using x's resources.</para><para><emphasis role="bold">Throws</emphasis>: If allocator_traits_type::propagate_on_container_move_assignment is false and (allocation throws or value_type's move constructor throws)</para><para><emphasis role="bold">Complexity</emphasis>: Constant if allocator_traits_type:: propagate_on_container_move_assignment is true or this-&gt;get&gt;allocator() == x.get_allocator(). Linear otherwise. </para></description></copy-assignment>
+<copy-assignment cv="noexcept((allocator_traits_type::propagate_on_container_move_assignment::value||allocator_traits_type::is_always_equal::value)&amp;&amp;boost::container::dtl::is_nothrow_move_assignable&lt; Compare &gt;::value))"><type><classname>flat_map</classname> &amp;</type><parameter name="x"><paramtype><classname>flat_map</classname> &amp;&amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Move constructs a <classname alt="boost::container::flat_map">flat_map</classname>. Constructs *this using x's resources.</para><para><emphasis role="bold">Throws</emphasis>: If allocator_traits_type::propagate_on_container_move_assignment is false and (allocation throws or value_type's move constructor throws)</para><para><emphasis role="bold">Complexity</emphasis>: Constant if allocator_traits_type:: propagate_on_container_move_assignment is true or this-&gt;get&gt;allocator() == x.get_allocator(). Linear otherwise. </para></description></copy-assignment>
<copy-assignment><type><classname>flat_map</classname> &amp;</type><parameter name="il"><paramtype>std::initializer_list&lt; value_type &gt;</paramtype></parameter><purpose><emphasis role="bold">Effects</emphasis>: Assign elements from il to *this </purpose></copy-assignment>
<method-group name="friend functions">
<method name="operator=="><type>friend bool</type><parameter name="x"><paramtype>const <classname>flat_map</classname> &amp;</paramtype></parameter><parameter name="y"><paramtype>const <classname>flat_map</classname> &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Returns true if x and y are equal</para><para><emphasis role="bold">Complexity</emphasis>: Linear to the number of elements in the container. </para></description></method>
@@ -873,7 +869,7 @@
<typedef name="const_reverse_iterator"><type>sequence_type::const_reverse_iterator</type></typedef>
<typedef name="movable_value_type"><type>implementation_defined</type></typedef>
<method-group name="public member functions">
-<method name="BOOST_STATIC_ASSERT"><type/><parameter name=""><paramtype><emphasis>unspecified</emphasis></paramtype></parameter></method>
+<method name="BOOST_STATIC_ASSERT"><type/><parameter name=""><paramtype>(dtl::is_same&lt; std::pair&lt; Key, T &gt;, typename AllocatorOrContainer::value_type &gt;::value)</paramtype></parameter></method>
<method name="get_allocator" cv="const noexcept"><type>allocator_type</type><description><para><emphasis role="bold">Effects</emphasis>: Returns a copy of the allocator that was passed to the object's constructor.</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></method>
<method name="get_stored_allocator" cv="noexcept"><type>stored_allocator_type &amp;</type><description><para><emphasis role="bold">Effects</emphasis>: Returns a reference to the internal allocator.</para><para><emphasis role="bold">Throws</emphasis>: Nothing</para><para><emphasis role="bold">Complexity</emphasis>: Constant.</para><para><emphasis role="bold">Note</emphasis>: Non-standard extension. </para></description></method>
<method name="get_stored_allocator" cv="const noexcept"><type>const stored_allocator_type &amp;</type><description><para><emphasis role="bold">Effects</emphasis>: Returns a reference to the internal allocator.</para><para><emphasis role="bold">Throws</emphasis>: Nothing</para><para><emphasis role="bold">Complexity</emphasis>: Constant.</para><para><emphasis role="bold">Note</emphasis>: Non-standard extension. </para></description></method>
@@ -913,12 +909,12 @@
<method name="insert"><type>iterator</type><parameter name="p"><paramtype>const_iterator</paramtype></parameter><parameter name="x"><paramtype>impl_value_type &amp;&amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Inserts a value move constructed from x in the container. p is a hint pointing to where the insert should start to search.</para><para><emphasis role="bold">Returns</emphasis>: An iterator pointing to the element with key equivalent to the key of x.</para><para><emphasis role="bold">Complexity</emphasis>: Logarithmic search time (constant time if the value is to be inserted before p) plus linear insertion to the elements with bigger keys than x.</para><para><emphasis role="bold">Note</emphasis>: If an element is inserted it might invalidate elements. </para></description></method>
<method name="insert"><type>void</type><template>
<template-type-parameter name="InputIterator"/>
- </template><parameter name="first"><paramtype>InputIterator</paramtype></parameter><parameter name="last"><paramtype>InputIterator</paramtype></parameter><description><para><emphasis role="bold">Requires</emphasis>: first, last are not iterators into *this.</para><para><emphasis role="bold">Effects</emphasis>: inserts each element from the range [first,last) .</para><para><emphasis role="bold">Complexity</emphasis>: At most N log(size()+N) (N is the distance from first to last) search time plus N*size() insertion time.</para><para><emphasis role="bold">Note</emphasis>: If an element is inserted it might invalidate elements. </para></description></method>
+ </template><parameter name="first"><paramtype>InputIterator</paramtype></parameter><parameter name="last"><paramtype>InputIterator</paramtype></parameter><description><para><emphasis role="bold">Requires</emphasis>: first, last are not iterators into *this.</para><para><emphasis role="bold">Effects</emphasis>: inserts each element from the range [first,last) .</para><para><emphasis role="bold">Complexity</emphasis>: N log(N).</para><para><emphasis role="bold">Note</emphasis>: If an element is inserted it might invalidate elements. </para></description></method>
<method name="insert"><type>void</type><template>
<template-type-parameter name="InputIterator"/>
- </template><parameter name=""><paramtype><classname>ordered_range_t</classname></paramtype></parameter><parameter name="first"><paramtype>InputIterator</paramtype></parameter><parameter name="last"><paramtype>InputIterator</paramtype></parameter><description><para><emphasis role="bold">Requires</emphasis>: first, last are not iterators into *this.</para><para><emphasis role="bold">Requires</emphasis>: [first ,last) must be ordered according to the predicate.</para><para><emphasis role="bold">Effects</emphasis>: inserts each element from the range [first,last) if and only if there is no element with key equivalent to the key of that element. This function is more efficient than the normal range creation for ordered ranges.</para><para><emphasis role="bold">Complexity</emphasis>: At most N log(size()+N) (N is the distance from first to last) search time plus N*size() insertion time.</para><para><emphasis role="bold">Note</emphasis>: If an element is inserted it might invalidate elements.</para><para><emphasis role="bold">Note</emphasis>: Non-standard extension. </para></description></method>
-<method name="insert"><type>void</type><parameter name="il"><paramtype>std::initializer_list&lt; value_type &gt;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: inserts each element from the range [il.begin(), il.end()) .</para><para><emphasis role="bold">Complexity</emphasis>: At most N log(size()+N) (N is the distance from first to last) search time plus N*size() insertion time.</para><para><emphasis role="bold">Note</emphasis>: If an element is inserted it might invalidate elements. </para></description></method>
-<method name="insert"><type>void</type><parameter name=""><paramtype><classname>ordered_range_t</classname></paramtype></parameter><parameter name="il"><paramtype>std::initializer_list&lt; value_type &gt;</paramtype></parameter><description><para><emphasis role="bold">Requires</emphasis>: [il.begin(), il.end()) must be ordered according to the predicate.</para><para><emphasis role="bold">Effects</emphasis>: inserts each element from the range [il.begin(), il.end()) if and only if there is no element with key equivalent to the key of that element. This function is more efficient than the normal range creation for ordered ranges.</para><para><emphasis role="bold">Complexity</emphasis>: At most N log(size()+N) (N is the distance from first to last) search time plus N*size() insertion time.</para><para><emphasis role="bold">Note</emphasis>: If an element is inserted it might invalidate elements.</para><para><emphasis role="bold">Note</emphasis>: Non-standard extension. </para></description></method>
+ </template><parameter name=""><paramtype><classname>ordered_range_t</classname></paramtype></parameter><parameter name="first"><paramtype>InputIterator</paramtype></parameter><parameter name="last"><paramtype>InputIterator</paramtype></parameter><description><para><emphasis role="bold">Requires</emphasis>: first, last are not iterators into *this.</para><para><emphasis role="bold">Requires</emphasis>: [first ,last) must be ordered according to the predicate.</para><para><emphasis role="bold">Effects</emphasis>: inserts each element from the range [first,last) if and only if there is no element with key equivalent to the key of that element. This function is more efficient than the normal range creation for ordered ranges.</para><para><emphasis role="bold">Complexity</emphasis>: Linear.</para><para><emphasis role="bold">Note</emphasis>: If an element is inserted it might invalidate elements.</para><para><emphasis role="bold">Note</emphasis>: Non-standard extension. </para></description></method>
+<method name="insert"><type>void</type><parameter name="il"><paramtype>std::initializer_list&lt; value_type &gt;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: inserts each element from the range [il.begin(), il.end()) .</para><para><emphasis role="bold">Complexity</emphasis>: N log(N).</para><para><emphasis role="bold">Note</emphasis>: If an element is inserted it might invalidate elements. </para></description></method>
+<method name="insert"><type>void</type><parameter name=""><paramtype><classname>ordered_range_t</classname></paramtype></parameter><parameter name="il"><paramtype>std::initializer_list&lt; value_type &gt;</paramtype></parameter><description><para><emphasis role="bold">Requires</emphasis>: [il.begin(), il.end()) must be ordered according to the predicate.</para><para><emphasis role="bold">Effects</emphasis>: inserts each element from the range [il.begin(), il.end()) if and only if there is no element with key equivalent to the key of that element. This function is more efficient than the normal range creation for ordered ranges.</para><para><emphasis role="bold">Complexity</emphasis>: Linear.</para><para><emphasis role="bold">Note</emphasis>: If an element is inserted it might invalidate elements.</para><para><emphasis role="bold">Note</emphasis>: Non-standard extension. </para></description></method>
<method name="merge"><type>void</type><template>
<template-type-parameter name="C2"/>
</template><parameter name="source"><paramtype><classname>flat_multimap</classname>&lt; Key, T, C2, AllocatorOrContainer &gt; &amp;</paramtype></parameter><description><para><emphasis role="bold">Requires</emphasis>: this-&gt;get_allocator() == source.get_allocator().</para><para><emphasis role="bold">Effects</emphasis>: Extracts each element in source and insert it into a using the comparison object of *this.</para><para><emphasis role="bold">Postcondition</emphasis>: Pointers and references to the transferred elements of source refer to those same elements but as members of *this. Iterators referring to the transferred elements will continue to refer to their elements, but they now behave as iterators into *this, not into source.</para><para><emphasis role="bold">Throws</emphasis>: Nothing unless the comparison object throws.</para><para><emphasis role="bold">Complexity</emphasis>: N log(a.size() + N) (N has the value source.size()) </para></description></method>
@@ -934,7 +930,7 @@
<method name="erase"><type>iterator</type><parameter name="p"><paramtype>const_iterator</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Erases the element pointed to by p.</para><para><emphasis role="bold">Returns</emphasis>: Returns an iterator pointing to the element immediately following q prior to the element being erased. If no such element exists, returns end().</para><para><emphasis role="bold">Complexity</emphasis>: Linear to the elements with keys bigger than p</para><para><emphasis role="bold">Note</emphasis>: Invalidates elements with keys not less than the erased element. </para></description></method>
<method name="erase"><type>size_type</type><parameter name="x"><paramtype>const key_type &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Erases all elements in the container with key equivalent to x.</para><para><emphasis role="bold">Returns</emphasis>: Returns the number of erased elements.</para><para><emphasis role="bold">Complexity</emphasis>: Logarithmic search time plus erasure time linear to the elements with bigger keys. </para></description></method>
<method name="erase"><type>iterator</type><parameter name="first"><paramtype>const_iterator</paramtype></parameter><parameter name="last"><paramtype>const_iterator</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Erases all the elements in the range [first, last).</para><para><emphasis role="bold">Returns</emphasis>: Returns last.</para><para><emphasis role="bold">Complexity</emphasis>: size()*N where N is the distance from first to last.</para><para><emphasis role="bold">Complexity</emphasis>: Logarithmic search time plus erasure time linear to the elements with bigger keys. </para></description></method>
-<method name="swap" cv="noexcept(allocator_traits_type::is_always_equal::value &amp;&amp;boost::container::container_detail::is_nothrow_swappable&lt; Compare &gt;::value))"><type>void</type><parameter name="x"><paramtype><classname>flat_multimap</classname> &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Swaps the contents of *this and x.</para><para><emphasis role="bold">Throws</emphasis>: Nothing.</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></method>
+<method name="swap" cv="noexcept(allocator_traits_type::is_always_equal::value &amp;&amp;boost::container::dtl::is_nothrow_swappable&lt; Compare &gt;::value))"><type>void</type><parameter name="x"><paramtype><classname>flat_multimap</classname> &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Swaps the contents of *this and x.</para><para><emphasis role="bold">Throws</emphasis>: Nothing.</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></method>
<method name="clear" cv="noexcept"><type>void</type><description><para><emphasis role="bold">Effects</emphasis>: erase(a.begin(),a.end()).</para><para><emphasis role="bold">Postcondition</emphasis>: size() == 0.</para><para><emphasis role="bold">Complexity</emphasis>: linear in size(). </para></description></method>
<method name="key_comp" cv="const"><type>key_compare</type><description><para><emphasis role="bold">Effects</emphasis>: Returns the comparison object out of which a was constructed.</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></method>
<method name="value_comp" cv="const"><type>value_compare</type><description><para><emphasis role="bold">Effects</emphasis>: Returns an object of value_compare constructed out of the comparison object.</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></method>
@@ -951,7 +947,7 @@
<method name="adopt_sequence"><type>void</type><parameter name="seq"><paramtype>sequence_type &amp;&amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Discards the internally hold sequence container and adopts the one passed externally using the move assignment.</para><para><emphasis role="bold">Complexity</emphasis>: Assuming O(1) move assignment, O(NlogN) with N = seq.size()</para><para><emphasis role="bold">Throws</emphasis>: If the comparison or the move constructor throws </para></description></method>
<method name="adopt_sequence"><type>void</type><parameter name=""><paramtype><classname>ordered_range_t</classname></paramtype></parameter><parameter name="seq"><paramtype>sequence_type &amp;&amp;</paramtype></parameter><description><para><emphasis role="bold">Requires</emphasis>: seq shall be ordered according to this-&gt;compare().</para><para><emphasis role="bold">Effects</emphasis>: Discards the internally hold sequence container and adopts the one passed externally using the move assignment.</para><para><emphasis role="bold">Complexity</emphasis>: Assuming O(1) move assignment, O(1)</para><para><emphasis role="bold">Throws</emphasis>: If the move assignment throws </para></description></method>
</method-group>
-<constructor cv="noexcept(container_detail::is_nothrow_default_constructible&lt; AllocatorOrContainer &gt;::value &amp;&amp;container_detail::is_nothrow_default_constructible&lt; Compare &gt;::value))"><description><para><emphasis role="bold">Effects</emphasis>: Default constructs an empty <classname alt="boost::container::flat_map">flat_map</classname>.</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></constructor>
+<constructor cv="noexcept(dtl::is_nothrow_default_constructible&lt; AllocatorOrContainer &gt;::value &amp;&amp;dtl::is_nothrow_default_constructible&lt; Compare &gt;::value))"><description><para><emphasis role="bold">Effects</emphasis>: Default constructs an empty <classname alt="boost::container::flat_map">flat_map</classname>.</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></constructor>
<constructor specifiers="explicit"><parameter name="a"><paramtype>const allocator_type &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Constructs an empty <classname alt="boost::container::flat_multimap">flat_multimap</classname> using the specified allocator.</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></constructor>
<constructor specifiers="explicit"><parameter name="comp"><paramtype>const Compare &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Constructs an empty <classname alt="boost::container::flat_multimap">flat_multimap</classname> using the specified comparison object .</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></constructor>
<constructor><parameter name="comp"><paramtype>const Compare &amp;</paramtype></parameter><parameter name="a"><paramtype>const allocator_type &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Constructs an empty <classname alt="boost::container::flat_multimap">flat_multimap</classname> using the specified comparison object and allocator.</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></constructor>
@@ -984,11 +980,11 @@
<constructor><parameter name=""><paramtype><classname>ordered_range_t</classname></paramtype></parameter><parameter name="il"><paramtype>std::initializer_list&lt; value_type &gt;</paramtype></parameter><parameter name="comp"><paramtype>const Compare &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Constructs an empty <classname alt="boost::container::flat_multimap">flat_multimap</classname> using the specified comparison object and inserts elements from the ordered range [il.begin(), il.end()). This function is more efficient than the normal range creation for ordered ranges.</para><para><emphasis role="bold">Requires</emphasis>: [il.begin(), il.end()) must be ordered according to the predicate.</para><para><emphasis role="bold">Complexity</emphasis>: Linear in N.</para><para><emphasis role="bold">Note</emphasis>: Non-standard extension. </para></description></constructor>
<constructor><parameter name=""><paramtype><classname>ordered_range_t</classname></paramtype></parameter><parameter name="il"><paramtype>std::initializer_list&lt; value_type &gt;</paramtype></parameter><parameter name="comp"><paramtype>const Compare &amp;</paramtype></parameter><parameter name="a"><paramtype>const allocator_type &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Constructs an empty <classname alt="boost::container::flat_multimap">flat_multimap</classname> using the specified comparison object and allocator, and inserts elements from the ordered range [il.begin(), il.end()). This function is more efficient than the normal range creation for ordered ranges.</para><para><emphasis role="bold">Requires</emphasis>: [il.begin(), il.end()) must be ordered according to the predicate.</para><para><emphasis role="bold">Complexity</emphasis>: Linear in N.</para><para><emphasis role="bold">Note</emphasis>: Non-standard extension. </para></description></constructor>
<constructor><parameter name="x"><paramtype>const <classname>flat_multimap</classname> &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Copy constructs a <classname alt="boost::container::flat_multimap">flat_multimap</classname>.</para><para><emphasis role="bold">Complexity</emphasis>: Linear in x.size(). </para></description></constructor>
-<constructor cv="noexcept(boost::container::container_detail::is_nothrow_move_constructible&lt; Compare &gt;::value))"><parameter name="x"><paramtype><classname>flat_multimap</classname> &amp;&amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Move constructs a <classname alt="boost::container::flat_multimap">flat_multimap</classname>. Constructs *this using x's resources.</para><para><emphasis role="bold">Complexity</emphasis>: Constant.</para><para><emphasis role="bold">Postcondition</emphasis>: x is emptied. </para></description></constructor>
+<constructor cv="noexcept(boost::container::dtl::is_nothrow_move_constructible&lt; Compare &gt;::value))"><parameter name="x"><paramtype><classname>flat_multimap</classname> &amp;&amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Move constructs a <classname alt="boost::container::flat_multimap">flat_multimap</classname>. Constructs *this using x's resources.</para><para><emphasis role="bold">Complexity</emphasis>: Constant.</para><para><emphasis role="bold">Postcondition</emphasis>: x is emptied. </para></description></constructor>
<constructor><parameter name="x"><paramtype>const <classname>flat_multimap</classname> &amp;</paramtype></parameter><parameter name="a"><paramtype>const allocator_type &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Copy constructs a <classname alt="boost::container::flat_multimap">flat_multimap</classname> using the specified allocator.</para><para><emphasis role="bold">Complexity</emphasis>: Linear in x.size(). </para></description></constructor>
<constructor><parameter name="x"><paramtype><classname>flat_multimap</classname> &amp;&amp;</paramtype></parameter><parameter name="a"><paramtype>const allocator_type &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Move constructs a <classname alt="boost::container::flat_multimap">flat_multimap</classname> using the specified allocator. Constructs *this using x's resources.</para><para><emphasis role="bold">Complexity</emphasis>: Constant if a == x.get_allocator(), linear otherwise. </para></description></constructor>
<copy-assignment><type><classname>flat_multimap</classname> &amp;</type><parameter name="x"><paramtype>const <classname>flat_multimap</classname> &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Makes *this a copy of x.</para><para><emphasis role="bold">Complexity</emphasis>: Linear in x.size(). </para></description></copy-assignment>
-<copy-assignment cv="noexcept((allocator_traits_type::propagate_on_container_move_assignment::value||allocator_traits_type::is_always_equal::value)&amp;&amp;boost::container::container_detail::is_nothrow_move_assignable&lt; Compare &gt;::value))"><type><classname>flat_multimap</classname> &amp;</type><parameter name="x"><paramtype><classname>flat_multimap</classname> &amp;&amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: this-&gt;swap(x.get()).</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></copy-assignment>
+<copy-assignment cv="noexcept((allocator_traits_type::propagate_on_container_move_assignment::value||allocator_traits_type::is_always_equal::value)&amp;&amp;boost::container::dtl::is_nothrow_move_assignable&lt; Compare &gt;::value))"><type><classname>flat_multimap</classname> &amp;</type><parameter name="x"><paramtype><classname>flat_multimap</classname> &amp;&amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: this-&gt;swap(x.get()).</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></copy-assignment>
<copy-assignment><type><classname>flat_multimap</classname> &amp;</type><parameter name="il"><paramtype>std::initializer_list&lt; value_type &gt;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Assign content of il to *this</para><para><emphasis role="bold">Complexity</emphasis>: Linear in il.size(). </para></description></copy-assignment>
<method-group name="friend functions">
<method name="operator=="><type>friend bool</type><parameter name="x"><paramtype>const <classname>flat_multimap</classname> &amp;</paramtype></parameter><parameter name="y"><paramtype>const <classname>flat_multimap</classname> &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Returns true if x and y are equal</para><para><emphasis role="bold">Complexity</emphasis>: Linear to the number of elements in the container. </para></description></method>
@@ -1068,13 +1064,11 @@
<template-type-parameter name="Key"/>
<template-type-parameter name="T"/>
<template-type-parameter name="Compare"><default>std::less&lt;Key&gt;</default></template-type-parameter>
- <template-type-parameter name="Options"><default>tree_assoc_defaults</default></template-type-parameter>
</template><description><para>A portable metafunction to obtain a <classname alt="boost::container::flat_map">flat_map</classname> that uses a polymorphic allocator </para></description><typedef name="type"><type><classname>boost::container::flat_map</classname>&lt; Key, T, Compare, <classname>polymorphic_allocator</classname>&lt; std::pair&lt; Key, T &gt; &gt; &gt;</type></typedef>
</struct><struct name="flat_multimap_of"><template>
<template-type-parameter name="Key"/>
<template-type-parameter name="T"/>
<template-type-parameter name="Compare"><default>std::less&lt;Key&gt;</default></template-type-parameter>
- <template-type-parameter name="Options"><default>tree_assoc_defaults</default></template-type-parameter>
</template><description><para>A portable metafunction to obtain a <classname alt="boost::container::flat_multimap">flat_multimap</classname> that uses a polymorphic allocator </para></description><typedef name="type"><type><classname>boost::container::flat_multimap</classname>&lt; Key, T, Compare, <classname>polymorphic_allocator</classname>&lt; std::pair&lt; Key, T &gt; &gt; &gt;</type></typedef>
</struct><typedef name="flat_map"><type><classname>boost::container::flat_map</classname>&lt; Key, T, Compare, <classname>polymorphic_allocator</classname>&lt; std::pair&lt; Key, T &gt; &gt; &gt;</type></typedef>
<typedef name="flat_multimap"><type><classname>boost::container::flat_multimap</classname>&lt; Key, T, Compare, <classname>polymorphic_allocator</classname>&lt; std::pair&lt; Key, T &gt; &gt; &gt;</type></typedef>
@@ -1208,12 +1202,12 @@
<method name="insert"><type>iterator</type><parameter name="p"><paramtype>const_iterator</paramtype></parameter><parameter name="x"><paramtype>value_type &amp;&amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Inserts an element move constructed from x in the container. p is a hint pointing to where the insert should start to search.</para><para><emphasis role="bold">Returns</emphasis>: An iterator pointing to the element with key equivalent to the key of x.</para><para><emphasis role="bold">Complexity</emphasis>: Logarithmic search time (constant if x is inserted right before p) plus insertion linear to the elements with bigger keys than x.</para><para><emphasis role="bold">Note</emphasis>: If an element is inserted it might invalidate elements. </para></description></method>
<method name="insert"><type>void</type><template>
<template-type-parameter name="InputIterator"/>
- </template><parameter name="first"><paramtype>InputIterator</paramtype></parameter><parameter name="last"><paramtype>InputIterator</paramtype></parameter><description><para><emphasis role="bold">Requires</emphasis>: first, last are not iterators into *this.</para><para><emphasis role="bold">Effects</emphasis>: inserts each element from the range [first,last) if and only if there is no element with key equivalent to the key of that element.</para><para><emphasis role="bold">Complexity</emphasis>: At most N log(size()+N) (N is the distance from first to last) search time plus N*size() insertion time.</para><para><emphasis role="bold">Note</emphasis>: If an element is inserted it might invalidate elements. </para></description></method>
+ </template><parameter name="first"><paramtype>InputIterator</paramtype></parameter><parameter name="last"><paramtype>InputIterator</paramtype></parameter><description><para><emphasis role="bold">Requires</emphasis>: first, last are not iterators into *this.</para><para><emphasis role="bold">Effects</emphasis>: inserts each element from the range [first,last) if and only if there is no element with key equivalent to the key of that element.</para><para><emphasis role="bold">Complexity</emphasis>: N log(N).</para><para><emphasis role="bold">Note</emphasis>: If an element is inserted it might invalidate elements. </para></description></method>
<method name="insert"><type>void</type><template>
<template-type-parameter name="InputIterator"/>
- </template><parameter name=""><paramtype><classname>ordered_unique_range_t</classname></paramtype></parameter><parameter name="first"><paramtype>InputIterator</paramtype></parameter><parameter name="last"><paramtype>InputIterator</paramtype></parameter><description><para><emphasis role="bold">Requires</emphasis>: first, last are not iterators into *this and must be ordered according to the predicate and must be unique values.</para><para><emphasis role="bold">Effects</emphasis>: inserts each element from the range [first,last) .This function is more efficient than the normal range creation for ordered ranges.</para><para><emphasis role="bold">Complexity</emphasis>: At most N log(size()+N) (N is the distance from first to last) search time plus N*size() insertion time.</para><para><emphasis role="bold">Note</emphasis>: Non-standard extension. If an element is inserted it might invalidate elements. </para></description></method>
-<method name="insert"><type>void</type><parameter name="il"><paramtype>std::initializer_list&lt; value_type &gt;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: inserts each element from the range [il.begin(), il.end()) if and only if there is no element with key equivalent to the key of that element.</para><para><emphasis role="bold">Complexity</emphasis>: At most N log(size()+N) (N is the distance from il.begin() to il.end()) search time plus N*size() insertion time.</para><para><emphasis role="bold">Note</emphasis>: If an element is inserted it might invalidate elements. </para></description></method>
-<method name="insert"><type>void</type><parameter name=""><paramtype><classname>ordered_unique_range_t</classname></paramtype></parameter><parameter name="il"><paramtype>std::initializer_list&lt; value_type &gt;</paramtype></parameter><description><para><emphasis role="bold">Requires</emphasis>: Range [il.begin(), il.end()) must be ordered according to the predicate and must be unique values.</para><para><emphasis role="bold">Effects</emphasis>: inserts each element from the range [il.begin(), il.end()) .This function is more efficient than the normal range creation for ordered ranges.</para><para><emphasis role="bold">Complexity</emphasis>: At most N log(size()+N) (N is the distance from il.begin() to il.end()) search time plus N*size() insertion time.</para><para><emphasis role="bold">Note</emphasis>: Non-standard extension. If an element is inserted it might invalidate elements. </para></description></method>
+ </template><parameter name=""><paramtype><classname>ordered_unique_range_t</classname></paramtype></parameter><parameter name="first"><paramtype>InputIterator</paramtype></parameter><parameter name="last"><paramtype>InputIterator</paramtype></parameter><description><para><emphasis role="bold">Requires</emphasis>: first, last are not iterators into *this and must be ordered according to the predicate and must be unique values.</para><para><emphasis role="bold">Effects</emphasis>: inserts each element from the range [first,last) .This function is more efficient than the normal range creation for ordered ranges.</para><para><emphasis role="bold">Complexity</emphasis>: Linear.</para><para><emphasis role="bold">Note</emphasis>: Non-standard extension. If an element is inserted it might invalidate elements. </para></description></method>
+<method name="insert"><type>void</type><parameter name="il"><paramtype>std::initializer_list&lt; value_type &gt;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: inserts each element from the range [il.begin(), il.end()) if and only if there is no element with key equivalent to the key of that element.</para><para><emphasis role="bold">Complexity</emphasis>: N log(N).</para><para><emphasis role="bold">Note</emphasis>: If an element is inserted it might invalidate elements. </para></description></method>
+<method name="insert"><type>void</type><parameter name=""><paramtype><classname>ordered_unique_range_t</classname></paramtype></parameter><parameter name="il"><paramtype>std::initializer_list&lt; value_type &gt;</paramtype></parameter><description><para><emphasis role="bold">Requires</emphasis>: Range [il.begin(), il.end()) must be ordered according to the predicate and must be unique values.</para><para><emphasis role="bold">Effects</emphasis>: inserts each element from the range [il.begin(), il.end()) .This function is more efficient than the normal range creation for ordered ranges.</para><para><emphasis role="bold">Complexity</emphasis>: Linear.</para><para><emphasis role="bold">Note</emphasis>: Non-standard extension. If an element is inserted it might invalidate elements. </para></description></method>
<method name="merge"><type>void</type><template>
<template-type-parameter name="C2"/>
</template><parameter name="source"><paramtype><classname>flat_set</classname>&lt; Key, C2, AllocatorOrContainer &gt; &amp;</paramtype></parameter><description><para><emphasis role="bold">Requires</emphasis>: this-&gt;get_allocator() == source.get_allocator().</para><para><emphasis role="bold">Effects</emphasis>: Attempts to extract each element in source and insert it into a using the comparison object of *this. If there is an element in a with key equivalent to the key of an element from source, then that element is not extracted from source.</para><para><emphasis role="bold">Postcondition</emphasis>: Pointers and references to the transferred elements of source refer to those same elements but as members of *this. Iterators referring to the transferred elements will continue to refer to their elements, but they now behave as iterators into *this, not into source.</para><para><emphasis role="bold">Throws</emphasis>: Nothing unless the comparison object throws.</para><para><emphasis role="bold">Complexity</emphasis>: N log(a.size() + N) (N has the value source.size()) </para></description></method>
@@ -1229,7 +1223,7 @@
<method name="erase"><type>iterator</type><parameter name="p"><paramtype>const_iterator</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Erases the element pointed to by p.</para><para><emphasis role="bold">Returns</emphasis>: Returns an iterator pointing to the element immediately following q prior to the element being erased. If no such element exists, returns end().</para><para><emphasis role="bold">Complexity</emphasis>: Linear to the elements with keys bigger than p</para><para><emphasis role="bold">Note</emphasis>: Invalidates elements with keys not less than the erased element. </para></description></method>
<method name="erase"><type>size_type</type><parameter name="x"><paramtype>const key_type &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Erases all elements in the container with key equivalent to x.</para><para><emphasis role="bold">Returns</emphasis>: Returns the number of erased elements.</para><para><emphasis role="bold">Complexity</emphasis>: Logarithmic search time plus erasure time linear to the elements with bigger keys. </para></description></method>
<method name="erase"><type>iterator</type><parameter name="first"><paramtype>const_iterator</paramtype></parameter><parameter name="last"><paramtype>const_iterator</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Erases all the elements in the range [first, last).</para><para><emphasis role="bold">Returns</emphasis>: Returns last.</para><para><emphasis role="bold">Complexity</emphasis>: size()*N where N is the distance from first to last.</para><para><emphasis role="bold">Complexity</emphasis>: Logarithmic search time plus erasure time linear to the elements with bigger keys. </para></description></method>
-<method name="swap" cv="noexcept(allocator_traits_type::is_always_equal::value &amp;&amp;boost::container::container_detail::is_nothrow_swappable&lt; Compare &gt;::value))"><type>void</type><parameter name="x"><paramtype><classname>flat_set</classname> &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Swaps the contents of *this and x.</para><para><emphasis role="bold">Throws</emphasis>: Nothing.</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></method>
+<method name="swap" cv="noexcept(allocator_traits_type::is_always_equal::value &amp;&amp;boost::container::dtl::is_nothrow_swappable&lt; Compare &gt;::value))"><type>void</type><parameter name="x"><paramtype><classname>flat_set</classname> &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Swaps the contents of *this and x.</para><para><emphasis role="bold">Throws</emphasis>: Nothing.</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></method>
<method name="clear" cv="noexcept"><type>void</type><description><para><emphasis role="bold">Effects</emphasis>: erase(a.begin(),a.end()).</para><para><emphasis role="bold">Postcondition</emphasis>: size() == 0.</para><para><emphasis role="bold">Complexity</emphasis>: linear in size(). </para></description></method>
<method name="key_comp" cv="const"><type>key_compare</type><description><para><emphasis role="bold">Effects</emphasis>: Returns the comparison object out of which a was constructed.</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></method>
<method name="value_comp" cv="const"><type>value_compare</type><description><para><emphasis role="bold">Effects</emphasis>: Returns an object of value_compare constructed out of the comparison object.</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></method>
@@ -1250,7 +1244,7 @@
<method name="adopt_sequence"><type>void</type><parameter name="seq"><paramtype>sequence_type &amp;&amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Discards the internally hold sequence container and adopts the one passed externally using the move assignment. Erases non-unique elements.</para><para><emphasis role="bold">Complexity</emphasis>: Assuming O(1) move assignment, O(NlogN) with N = seq.size()</para><para><emphasis role="bold">Throws</emphasis>: If the comparison or the move constructor throws </para></description></method>
<method name="adopt_sequence"><type>void</type><parameter name=""><paramtype><classname>ordered_unique_range_t</classname></paramtype></parameter><parameter name="seq"><paramtype>sequence_type &amp;&amp;</paramtype></parameter><description><para><emphasis role="bold">Requires</emphasis>: seq shall be ordered according to this-&gt;compare() and shall contain unique elements.</para><para><emphasis role="bold">Effects</emphasis>: Discards the internally hold sequence container and adopts the one passed externally using the move assignment.</para><para><emphasis role="bold">Complexity</emphasis>: Assuming O(1) move assignment, O(1)</para><para><emphasis role="bold">Throws</emphasis>: If the move assignment throws </para></description></method>
</method-group>
-<constructor cv="noexcept(container_detail::is_nothrow_default_constructible&lt; AllocatorOrContainer &gt;::value &amp;&amp;container_detail::is_nothrow_default_constructible&lt; Compare &gt;::value))"><description><para><emphasis role="bold">Effects</emphasis>: Default constructs an empty container.</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></constructor>
+<constructor cv="noexcept(dtl::is_nothrow_default_constructible&lt; AllocatorOrContainer &gt;::value &amp;&amp;dtl::is_nothrow_default_constructible&lt; Compare &gt;::value))"><description><para><emphasis role="bold">Effects</emphasis>: Default constructs an empty container.</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></constructor>
<constructor specifiers="explicit"><parameter name="comp"><paramtype>const Compare &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Constructs an empty container using the specified comparison object.</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></constructor>
<constructor specifiers="explicit"><parameter name="a"><paramtype>const allocator_type &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Constructs an empty container using the specified allocator.</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></constructor>
<constructor><parameter name="comp"><paramtype>const Compare &amp;</paramtype></parameter><parameter name="a"><paramtype>const allocator_type &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Constructs an empty container using the specified comparison object and allocator.</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></constructor>
@@ -1283,11 +1277,11 @@
<constructor><parameter name=""><paramtype><classname>ordered_unique_range_t</classname></paramtype></parameter><parameter name="il"><paramtype>std::initializer_list&lt; value_type &gt;</paramtype></parameter><parameter name="comp"><paramtype>const Compare &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Constructs an empty container using the specified comparison object and inserts elements from the ordered unique range [il.begin(), il.end()). This function is more efficient than the normal range creation for ordered ranges.</para><para><emphasis role="bold">Requires</emphasis>: [il.begin(), il.end()) must be ordered according to the predicate and must be unique values.</para><para><emphasis role="bold">Complexity</emphasis>: Linear in N.</para><para><emphasis role="bold">Note</emphasis>: Non-standard extension. </para></description></constructor>
<constructor><parameter name=""><paramtype><classname>ordered_unique_range_t</classname></paramtype></parameter><parameter name="il"><paramtype>std::initializer_list&lt; value_type &gt;</paramtype></parameter><parameter name="comp"><paramtype>const Compare &amp;</paramtype></parameter><parameter name="a"><paramtype>const allocator_type &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Constructs an empty container using the specified comparison object and allocator, and inserts elements from the ordered unique range [il.begin(), il.end()). This function is more efficient than the normal range creation for ordered ranges.</para><para><emphasis role="bold">Requires</emphasis>: [il.begin(), il.end()) must be ordered according to the predicate and must be unique values.</para><para><emphasis role="bold">Complexity</emphasis>: Linear in N.</para><para><emphasis role="bold">Note</emphasis>: Non-standard extension. </para></description></constructor>
<constructor><parameter name="x"><paramtype>const <classname>flat_set</classname> &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Copy constructs the container.</para><para><emphasis role="bold">Complexity</emphasis>: Linear in x.size(). </para></description></constructor>
-<constructor cv="noexcept(boost::container::container_detail::is_nothrow_move_constructible&lt; Compare &gt;::value))"><parameter name="x"><paramtype><classname>flat_set</classname> &amp;&amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Move constructs thecontainer. Constructs *this using x's resources.</para><para><emphasis role="bold">Complexity</emphasis>: Constant.</para><para><emphasis role="bold">Postcondition</emphasis>: x is emptied. </para></description></constructor>
+<constructor cv="noexcept(boost::container::dtl::is_nothrow_move_constructible&lt; Compare &gt;::value))"><parameter name="x"><paramtype><classname>flat_set</classname> &amp;&amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Move constructs thecontainer. Constructs *this using x's resources.</para><para><emphasis role="bold">Complexity</emphasis>: Constant.</para><para><emphasis role="bold">Postcondition</emphasis>: x is emptied. </para></description></constructor>
<constructor><parameter name="x"><paramtype>const <classname>flat_set</classname> &amp;</paramtype></parameter><parameter name="a"><paramtype>const allocator_type &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Copy constructs a container using the specified allocator.</para><para><emphasis role="bold">Complexity</emphasis>: Linear in x.size(). </para></description></constructor>
<constructor><parameter name="x"><paramtype><classname>flat_set</classname> &amp;&amp;</paramtype></parameter><parameter name="a"><paramtype>const allocator_type &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Move constructs a container using the specified allocator. Constructs *this using x's resources.</para><para><emphasis role="bold">Complexity</emphasis>: Constant if a == x.get_allocator(), linear otherwise </para></description></constructor>
<copy-assignment><type><classname>flat_set</classname> &amp;</type><parameter name="x"><paramtype>const <classname>flat_set</classname> &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Makes *this a copy of x.</para><para><emphasis role="bold">Complexity</emphasis>: Linear in x.size(). </para></description></copy-assignment>
-<copy-assignment cv="noexcept((allocator_traits_type::propagate_on_container_move_assignment::value||allocator_traits_type::is_always_equal::value)&amp;&amp;boost::container::container_detail::is_nothrow_move_assignable&lt; Compare &gt;::value))"><type><classname>flat_set</classname> &amp;</type><parameter name="x"><paramtype><classname>flat_set</classname> &amp;&amp;</paramtype></parameter><description><para><emphasis role="bold">Throws</emphasis>: If allocator_traits_type::propagate_on_container_move_assignment is false and (allocation throws or value_type's move constructor throws)</para><para><emphasis role="bold">Complexity</emphasis>: Constant if allocator_traits_type:: propagate_on_container_move_assignment is true or this-&gt;get&gt;allocator() == x.get_allocator(). Linear otherwise. </para></description></copy-assignment>
+<copy-assignment cv="noexcept((allocator_traits_type::propagate_on_container_move_assignment::value||allocator_traits_type::is_always_equal::value)&amp;&amp;boost::container::dtl::is_nothrow_move_assignable&lt; Compare &gt;::value))"><type><classname>flat_set</classname> &amp;</type><parameter name="x"><paramtype><classname>flat_set</classname> &amp;&amp;</paramtype></parameter><description><para><emphasis role="bold">Throws</emphasis>: If allocator_traits_type::propagate_on_container_move_assignment is false and (allocation throws or value_type's move constructor throws)</para><para><emphasis role="bold">Complexity</emphasis>: Constant if allocator_traits_type:: propagate_on_container_move_assignment is true or this-&gt;get&gt;allocator() == x.get_allocator(). Linear otherwise. </para></description></copy-assignment>
<copy-assignment><type><classname>flat_set</classname> &amp;</type><parameter name="il"><paramtype>std::initializer_list&lt; value_type &gt;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Copy all elements from il to *this.</para><para><emphasis role="bold">Complexity</emphasis>: Linear in il.size(). </para></description></copy-assignment>
<method-group name="friend functions">
<method name="operator=="><type>friend bool</type><parameter name="x"><paramtype>const <classname>flat_set</classname> &amp;</paramtype></parameter><parameter name="y"><paramtype>const <classname>flat_set</classname> &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Returns true if x and y are equal</para><para><emphasis role="bold">Complexity</emphasis>: Linear to the number of elements in the container. </para></description></method>
@@ -1357,12 +1351,12 @@
<method name="insert"><type>iterator</type><parameter name="p"><paramtype>const_iterator</paramtype></parameter><parameter name="x"><paramtype>value_type &amp;&amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Inserts a new value move constructed from x in the container. p is a hint pointing to where the insert should start to search.</para><para><emphasis role="bold">Returns</emphasis>: An iterator pointing to the element with key equivalent to the key of x.</para><para><emphasis role="bold">Complexity</emphasis>: Logarithmic search time (constant if x is inserted right before p) plus insertion linear to the elements with bigger keys than x.</para><para><emphasis role="bold">Note</emphasis>: If an element is inserted it might invalidate elements. </para></description></method>
<method name="insert"><type>void</type><template>
<template-type-parameter name="InputIterator"/>
- </template><parameter name="first"><paramtype>InputIterator</paramtype></parameter><parameter name="last"><paramtype>InputIterator</paramtype></parameter><description><para><emphasis role="bold">Requires</emphasis>: first, last are not iterators into *this.</para><para><emphasis role="bold">Effects</emphasis>: inserts each element from the range [first,last) .</para><para><emphasis role="bold">Complexity</emphasis>: At most N log(size()+N) (N is the distance from first to last) search time plus N*size() insertion time.</para><para><emphasis role="bold">Note</emphasis>: If an element is inserted it might invalidate elements. </para></description></method>
+ </template><parameter name="first"><paramtype>InputIterator</paramtype></parameter><parameter name="last"><paramtype>InputIterator</paramtype></parameter><description><para><emphasis role="bold">Requires</emphasis>: first, last are not iterators into *this.</para><para><emphasis role="bold">Effects</emphasis>: inserts each element from the range [first,last) .</para><para><emphasis role="bold">Complexity</emphasis>: N log(N).</para><para><emphasis role="bold">Note</emphasis>: If an element is inserted it might invalidate elements. </para></description></method>
<method name="insert"><type>void</type><template>
<template-type-parameter name="InputIterator"/>
- </template><parameter name=""><paramtype><classname>ordered_range_t</classname></paramtype></parameter><parameter name="first"><paramtype>InputIterator</paramtype></parameter><parameter name="last"><paramtype>InputIterator</paramtype></parameter><description><para><emphasis role="bold">Requires</emphasis>: first, last are not iterators into *this and must be ordered according to the predicate.</para><para><emphasis role="bold">Effects</emphasis>: inserts each element from the range [first,last) .This function is more efficient than the normal range creation for ordered ranges.</para><para><emphasis role="bold">Complexity</emphasis>: At most N log(size()+N) (N is the distance from first to last) search time plus N*size() insertion time.</para><para><emphasis role="bold">Note</emphasis>: Non-standard extension. If an element is inserted it might invalidate elements. </para></description></method>
-<method name="insert"><type>void</type><parameter name="il"><paramtype>std::initializer_list&lt; value_type &gt;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: inserts each element from the range [il.begin(), il.end()).</para><para><emphasis role="bold">Complexity</emphasis>: At most N log(size()+N) (N is the distance from first to last) search time plus N*size() insertion time.</para><para><emphasis role="bold">Note</emphasis>: If an element is inserted it might invalidate elements. </para></description></method>
-<method name="insert"><type>void</type><parameter name=""><paramtype><classname>ordered_range_t</classname></paramtype></parameter><parameter name="il"><paramtype>std::initializer_list&lt; value_type &gt;</paramtype></parameter><description><para><emphasis role="bold">Requires</emphasis>: Range [il.begin(), il.end()) must be ordered according to the predicate.</para><para><emphasis role="bold">Effects</emphasis>: inserts each element from the range [il.begin(), il.end()). This function is more efficient than the normal range creation for ordered ranges.</para><para><emphasis role="bold">Complexity</emphasis>: At most N log(size()+N) (N is the distance from il.begin() to il.end()) search time plus N*size() insertion time.</para><para><emphasis role="bold">Note</emphasis>: Non-standard extension. If an element is inserted it might invalidate elements. </para></description></method>
+ </template><parameter name=""><paramtype><classname>ordered_range_t</classname></paramtype></parameter><parameter name="first"><paramtype>InputIterator</paramtype></parameter><parameter name="last"><paramtype>InputIterator</paramtype></parameter><description><para><emphasis role="bold">Requires</emphasis>: first, last are not iterators into *this and must be ordered according to the predicate.</para><para><emphasis role="bold">Effects</emphasis>: inserts each element from the range [first,last) .This function is more efficient than the normal range creation for ordered ranges.</para><para><emphasis role="bold">Complexity</emphasis>: Linear.</para><para><emphasis role="bold">Note</emphasis>: Non-standard extension. If an element is inserted it might invalidate elements. </para></description></method>
+<method name="insert"><type>void</type><parameter name="il"><paramtype>std::initializer_list&lt; value_type &gt;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: inserts each element from the range [il.begin(), il.end()).</para><para><emphasis role="bold">Complexity</emphasis>: N log(N).</para><para><emphasis role="bold">Note</emphasis>: If an element is inserted it might invalidate elements. </para></description></method>
+<method name="insert"><type>void</type><parameter name=""><paramtype><classname>ordered_range_t</classname></paramtype></parameter><parameter name="il"><paramtype>std::initializer_list&lt; value_type &gt;</paramtype></parameter><description><para><emphasis role="bold">Requires</emphasis>: Range [il.begin(), il.end()) must be ordered according to the predicate.</para><para><emphasis role="bold">Effects</emphasis>: inserts each element from the range [il.begin(), il.end()). This function is more efficient than the normal range creation for ordered ranges.</para><para><emphasis role="bold">Complexity</emphasis>: Linear.</para><para><emphasis role="bold">Note</emphasis>: Non-standard extension. If an element is inserted it might invalidate elements. </para></description></method>
<method name="merge"><type>void</type><template>
<template-type-parameter name="C2"/>
</template><parameter name="source"><paramtype><classname>flat_multiset</classname>&lt; Key, C2, AllocatorOrContainer &gt; &amp;</paramtype></parameter><description><para><emphasis role="bold">Requires</emphasis>: this-&gt;get_allocator() == source.get_allocator().</para><para><emphasis role="bold">Effects</emphasis>: Extracts each element in source and insert it into a using the comparison object of *this.</para><para><emphasis role="bold">Postcondition</emphasis>: Pointers and references to the transferred elements of source refer to those same elements but as members of *this. Iterators referring to the transferred elements will continue to refer to their elements, but they now behave as iterators into *this, not into source.</para><para><emphasis role="bold">Throws</emphasis>: Nothing unless the comparison object throws.</para><para><emphasis role="bold">Complexity</emphasis>: N log(a.size() + N) (N has the value source.size()) </para></description></method>
@@ -1378,7 +1372,7 @@
<method name="erase"><type>iterator</type><parameter name="p"><paramtype>const_iterator</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Erases the element pointed to by p.</para><para><emphasis role="bold">Returns</emphasis>: Returns an iterator pointing to the element immediately following q prior to the element being erased. If no such element exists, returns end().</para><para><emphasis role="bold">Complexity</emphasis>: Linear to the elements with keys bigger than p</para><para><emphasis role="bold">Note</emphasis>: Invalidates elements with keys not less than the erased element. </para></description></method>
<method name="erase"><type>size_type</type><parameter name="x"><paramtype>const key_type &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Erases all elements in the container with key equivalent to x.</para><para><emphasis role="bold">Returns</emphasis>: Returns the number of erased elements.</para><para><emphasis role="bold">Complexity</emphasis>: Logarithmic search time plus erasure time linear to the elements with bigger keys. </para></description></method>
<method name="erase"><type>iterator</type><parameter name="first"><paramtype>const_iterator</paramtype></parameter><parameter name="last"><paramtype>const_iterator</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Erases all the elements in the range [first, last).</para><para><emphasis role="bold">Returns</emphasis>: Returns last.</para><para><emphasis role="bold">Complexity</emphasis>: size()*N where N is the distance from first to last.</para><para><emphasis role="bold">Complexity</emphasis>: Logarithmic search time plus erasure time linear to the elements with bigger keys. </para></description></method>
-<method name="swap" cv="noexcept(allocator_traits_type::is_always_equal::value &amp;&amp;boost::container::container_detail::is_nothrow_swappable&lt; Compare &gt;::value))"><type>void</type><parameter name="x"><paramtype><classname>flat_multiset</classname> &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Swaps the contents of *this and x.</para><para><emphasis role="bold">Throws</emphasis>: Nothing.</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></method>
+<method name="swap" cv="noexcept(allocator_traits_type::is_always_equal::value &amp;&amp;boost::container::dtl::is_nothrow_swappable&lt; Compare &gt;::value))"><type>void</type><parameter name="x"><paramtype><classname>flat_multiset</classname> &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Swaps the contents of *this and x.</para><para><emphasis role="bold">Throws</emphasis>: Nothing.</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></method>
<method name="clear" cv="noexcept"><type>void</type><description><para><emphasis role="bold">Effects</emphasis>: erase(a.begin(),a.end()).</para><para><emphasis role="bold">Postcondition</emphasis>: size() == 0.</para><para><emphasis role="bold">Complexity</emphasis>: linear in size(). </para></description></method>
<method name="key_comp" cv="const"><type>key_compare</type><description><para><emphasis role="bold">Effects</emphasis>: Returns the comparison object out of which a was constructed.</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></method>
<method name="value_comp" cv="const"><type>value_compare</type><description><para><emphasis role="bold">Effects</emphasis>: Returns an object of value_compare constructed out of the comparison object.</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></method>
@@ -1399,7 +1393,7 @@
<method name="adopt_sequence"><type>void</type><parameter name="seq"><paramtype>sequence_type &amp;&amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Discards the internally hold sequence container and adopts the one passed externally using the move assignment.</para><para><emphasis role="bold">Complexity</emphasis>: Assuming O(1) move assignment, O(NlogN) with N = seq.size()</para><para><emphasis role="bold">Throws</emphasis>: If the comparison or the move constructor throws </para></description></method>
<method name="adopt_sequence"><type>void</type><parameter name=""><paramtype><classname>ordered_range_t</classname></paramtype></parameter><parameter name="seq"><paramtype>sequence_type &amp;&amp;</paramtype></parameter><description><para><emphasis role="bold">Requires</emphasis>: seq shall be ordered according to this-&gt;compare()</para><para><emphasis role="bold">Effects</emphasis>: Discards the internally hold sequence container and adopts the one passed externally using the move assignment.</para><para><emphasis role="bold">Complexity</emphasis>: Assuming O(1) move assignment, O(1)</para><para><emphasis role="bold">Throws</emphasis>: If the move assignment throws </para></description></method>
</method-group>
-<constructor cv="noexcept(container_detail::is_nothrow_default_constructible&lt; AllocatorOrContainer &gt;::value &amp;&amp;container_detail::is_nothrow_default_constructible&lt; Compare &gt;::value))"><description><para><emphasis role="bold">Effects</emphasis>: Default constructs an empty container.</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></constructor>
+<constructor cv="noexcept(dtl::is_nothrow_default_constructible&lt; AllocatorOrContainer &gt;::value &amp;&amp;dtl::is_nothrow_default_constructible&lt; Compare &gt;::value))"><description><para><emphasis role="bold">Effects</emphasis>: Default constructs an empty container.</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></constructor>
<constructor specifiers="explicit"><parameter name="comp"><paramtype>const Compare &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Constructs an empty container using the specified comparison object.</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></constructor>
<constructor specifiers="explicit"><parameter name="a"><paramtype>const allocator_type &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Constructs an empty container using the specified allocator.</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></constructor>
<constructor><parameter name="comp"><paramtype>const Compare &amp;</paramtype></parameter><parameter name="a"><paramtype>const allocator_type &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Constructs an empty container using the specified comparison object and allocator.</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></constructor>
@@ -1432,11 +1426,11 @@
<constructor><parameter name=""><paramtype><classname>ordered_range_t</classname></paramtype></parameter><parameter name="il"><paramtype>std::initializer_list&lt; value_type &gt;</paramtype></parameter><parameter name="comp"><paramtype>const Compare &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Constructs an empty container using the specified comparison object and inserts elements from the ordered unique range [il.begin(), il.end()). This function is more efficient than the normal range creation for ordered ranges.</para><para><emphasis role="bold">Requires</emphasis>: [il.begin(), il.end()) must be ordered according to the predicate.</para><para><emphasis role="bold">Complexity</emphasis>: Linear in N.</para><para><emphasis role="bold">Note</emphasis>: Non-standard extension. </para></description></constructor>
<constructor><parameter name=""><paramtype><classname>ordered_range_t</classname></paramtype></parameter><parameter name="il"><paramtype>std::initializer_list&lt; value_type &gt;</paramtype></parameter><parameter name="comp"><paramtype>const Compare &amp;</paramtype></parameter><parameter name="a"><paramtype>const allocator_type &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Constructs an empty container using the specified comparison object and allocator, and inserts elements from the ordered unique range [il.begin(), il.end()). This function is more efficient than the normal range creation for ordered ranges.</para><para><emphasis role="bold">Requires</emphasis>: [il.begin(), il.end()) must be ordered according to the predicate.</para><para><emphasis role="bold">Complexity</emphasis>: Linear in N.</para><para><emphasis role="bold">Note</emphasis>: Non-standard extension. </para></description></constructor>
<constructor><parameter name="x"><paramtype>const <classname>flat_multiset</classname> &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Copy constructs the container.</para><para><emphasis role="bold">Complexity</emphasis>: Linear in x.size(). </para></description></constructor>
-<constructor cv="noexcept(boost::container::container_detail::is_nothrow_move_constructible&lt; Compare &gt;::value))"><parameter name="x"><paramtype><classname>flat_multiset</classname> &amp;&amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Move constructs thecontainer. Constructs *this using x's resources.</para><para><emphasis role="bold">Complexity</emphasis>: Constant.</para><para><emphasis role="bold">Postcondition</emphasis>: x is emptied. </para></description></constructor>
+<constructor cv="noexcept(boost::container::dtl::is_nothrow_move_constructible&lt; Compare &gt;::value))"><parameter name="x"><paramtype><classname>flat_multiset</classname> &amp;&amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Move constructs thecontainer. Constructs *this using x's resources.</para><para><emphasis role="bold">Complexity</emphasis>: Constant.</para><para><emphasis role="bold">Postcondition</emphasis>: x is emptied. </para></description></constructor>
<constructor><parameter name="x"><paramtype>const <classname>flat_multiset</classname> &amp;</paramtype></parameter><parameter name="a"><paramtype>const allocator_type &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Copy constructs a container using the specified allocator.</para><para><emphasis role="bold">Complexity</emphasis>: Linear in x.size(). </para></description></constructor>
<constructor><parameter name="x"><paramtype><classname>flat_multiset</classname> &amp;&amp;</paramtype></parameter><parameter name="a"><paramtype>const allocator_type &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Move constructs a container using the specified allocator. Constructs *this using x's resources.</para><para><emphasis role="bold">Complexity</emphasis>: Constant if a == x.get_allocator(), linear otherwise </para></description></constructor>
<copy-assignment><type><classname>flat_multiset</classname> &amp;</type><parameter name="x"><paramtype>const <classname>flat_multiset</classname> &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Makes *this a copy of x.</para><para><emphasis role="bold">Complexity</emphasis>: Linear in x.size(). </para></description></copy-assignment>
-<copy-assignment cv="noexcept((allocator_traits_type::propagate_on_container_move_assignment::value||allocator_traits_type::is_always_equal::value)&amp;&amp;boost::container::container_detail::is_nothrow_move_assignable&lt; Compare &gt;::value))"><type><classname>flat_multiset</classname> &amp;</type><parameter name="x"><paramtype><classname>flat_multiset</classname> &amp;&amp;</paramtype></parameter><description><para><emphasis role="bold">Throws</emphasis>: If allocator_traits_type::propagate_on_container_move_assignment is false and (allocation throws or value_type's move constructor throws)</para><para><emphasis role="bold">Complexity</emphasis>: Constant if allocator_traits_type:: propagate_on_container_move_assignment is true or this-&gt;get&gt;allocator() == x.get_allocator(). Linear otherwise. </para></description></copy-assignment>
+<copy-assignment cv="noexcept((allocator_traits_type::propagate_on_container_move_assignment::value||allocator_traits_type::is_always_equal::value)&amp;&amp;boost::container::dtl::is_nothrow_move_assignable&lt; Compare &gt;::value))"><type><classname>flat_multiset</classname> &amp;</type><parameter name="x"><paramtype><classname>flat_multiset</classname> &amp;&amp;</paramtype></parameter><description><para><emphasis role="bold">Throws</emphasis>: If allocator_traits_type::propagate_on_container_move_assignment is false and (allocation throws or value_type's move constructor throws)</para><para><emphasis role="bold">Complexity</emphasis>: Constant if allocator_traits_type:: propagate_on_container_move_assignment is true or this-&gt;get&gt;allocator() == x.get_allocator(). Linear otherwise. </para></description></copy-assignment>
<copy-assignment><type><classname>flat_multiset</classname> &amp;</type><parameter name="il"><paramtype>std::initializer_list&lt; value_type &gt;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Copy all elements from il to *this.</para><para><emphasis role="bold">Complexity</emphasis>: Linear in il.size(). </para></description></copy-assignment>
<method-group name="friend functions">
<method name="operator=="><type>friend bool</type><parameter name="x"><paramtype>const <classname>flat_multiset</classname> &amp;</paramtype></parameter><parameter name="y"><paramtype>const <classname>flat_multiset</classname> &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Returns true if x and y are equal</para><para><emphasis role="bold">Complexity</emphasis>: Linear to the number of elements in the container. </para></description></method>
@@ -1515,12 +1509,10 @@
<struct name="flat_set_of"><template>
<template-type-parameter name="Key"/>
<template-type-parameter name="Compare"><default>std::less&lt;Key&gt;</default></template-type-parameter>
- <template-type-parameter name="Options"><default>tree_assoc_defaults</default></template-type-parameter>
</template><description><para>A portable metafunction to obtain a <classname alt="boost::container::flat_set">flat_set</classname> that uses a polymorphic allocator </para></description><typedef name="type"><type><classname>boost::container::flat_set</classname>&lt; Key, Compare, <classname>polymorphic_allocator</classname>&lt; Key &gt; &gt;</type></typedef>
</struct><struct name="flat_multiset_of"><template>
<template-type-parameter name="Key"/>
<template-type-parameter name="Compare"><default>std::less&lt;Key&gt;</default></template-type-parameter>
- <template-type-parameter name="Options"><default>tree_assoc_defaults</default></template-type-parameter>
</template><description><para>A portable metafunction to obtain a <classname alt="boost::container::flat_multiset">flat_multiset</classname> that uses a polymorphic allocator </para></description><typedef name="type"><type><classname>boost::container::flat_multiset</classname>&lt; Key, Compare, <classname>polymorphic_allocator</classname>&lt; Key &gt; &gt;</type></typedef>
</struct><typedef name="flat_set"><type><classname>boost::container::flat_set</classname>&lt; Key, Compare, <classname>polymorphic_allocator</classname>&lt; Key &gt; &gt;</type></typedef>
<typedef name="flat_multiset"><type><classname>boost::container::flat_multiset</classname>&lt; Key, Compare, <classname>polymorphic_allocator</classname>&lt; Key &gt; &gt;</type></typedef>
@@ -1598,7 +1590,7 @@
<class name="list"><template>
<template-type-parameter name="T"><purpose><para>The type of object that is stored in the list </para></purpose></template-type-parameter>
<template-type-parameter name="Allocator"><default><classname alt="boost::container::new_allocator">new_allocator</classname>&lt;T&gt;</default><purpose><para>The allocator used for all internal memory management </para></purpose></template-type-parameter>
- </template><description><para>A list is a doubly linked list. That is, it is a Sequence that supports both forward and backward traversal, and (amortized) constant time insertion and removal of elements at the beginning or the end, or in the middle. Lists have the important property that insertion and splicing do not invalidate iterators to list elements, and that even removal invalidates only the iterators that point to the elements that are removed. The ordering of iterators may be changed (that is, list&lt;T&gt;::iterator might have a different predecessor or successor after a list operation than it did before), but the iterators themselves will not be invalidated or made to point to different elements unless that invalidation or mutation is explicit.</para><para>
+ </template><inherit access="protected">dtl::node_alloc_holder&lt; Allocator, dtl::intrusive_list_type&lt; Allocator &gt;::type &gt;</inherit><description><para>A list is a doubly linked list. That is, it is a Sequence that supports both forward and backward traversal, and (amortized) constant time insertion and removal of elements at the beginning or the end, or in the middle. Lists have the important property that insertion and splicing do not invalidate iterators to list elements, and that even removal invalidates only the iterators that point to the elements that are removed. The ordering of iterators may be changed (that is, list&lt;T&gt;::iterator might have a different predecessor or successor after a list operation than it did before), but the iterators themselves will not be invalidated or made to point to different elements unless that invalidation or mutation is explicit.</para><para>
</para></description><typedef name="value_type"><type>T</type></typedef>
<typedef name="pointer"><type>::<classname>boost::container::allocator_traits</classname>&lt; Allocator &gt;::pointer</type></typedef>
<typedef name="const_pointer"><type>::<classname>boost::container::allocator_traits</classname>&lt; Allocator &gt;::const_pointer</type></typedef>
@@ -1698,7 +1690,7 @@
</template><parameter name="comp"><paramtype>StrictWeakOrdering</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: This function sorts the list *this according to std::less&lt;value_type&gt;. The sort is stable, that is, the relative order of equivalent elements is preserved.</para><para><emphasis role="bold">Throws</emphasis>: If comp throws.</para><para><emphasis role="bold">Notes</emphasis>: Iterators and references are not invalidated.</para><para><emphasis role="bold">Complexity</emphasis>: The number of comparisons is approximately N log N, where N is the list's size. </para></description></method>
<method name="reverse" cv="noexcept"><type>void</type><description><para><emphasis role="bold">Effects</emphasis>: Reverses the order of elements in the list.</para><para><emphasis role="bold">Throws</emphasis>: Nothing.</para><para><emphasis role="bold">Complexity</emphasis>: This function is linear time.</para><para><emphasis role="bold">Note</emphasis>: Iterators and references are not invalidated </para></description></method>
</method-group>
-<constructor cv="noexcept(container_detail::is_nothrow_default_constructible&lt; Allocator &gt;::value))"><description><para><emphasis role="bold">Effects</emphasis>: Default constructs a list.</para><para><emphasis role="bold">Throws</emphasis>: If allocator_type's default constructor throws.</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></constructor>
+<constructor cv="noexcept(dtl::is_nothrow_default_constructible&lt; Allocator &gt;::value))"><description><para><emphasis role="bold">Effects</emphasis>: Default constructs a list.</para><para><emphasis role="bold">Throws</emphasis>: If allocator_type's default constructor throws.</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></constructor>
<constructor specifiers="explicit" cv="noexcept"><parameter name="a"><paramtype>const allocator_type &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Constructs a list taking the allocator as parameter.</para><para><emphasis role="bold">Throws</emphasis>: Nothing</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></constructor>
<constructor specifiers="explicit"><parameter name="n"><paramtype>size_type</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Constructs a list and inserts n value-initialized value_types.</para><para><emphasis role="bold">Throws</emphasis>: If allocator_type's default constructor throws or T's default or copy constructor throws.</para><para><emphasis role="bold">Complexity</emphasis>: Linear to n. </para></description></constructor>
<constructor><parameter name="n"><paramtype>size_type</paramtype></parameter><parameter name="a"><paramtype>const allocator_type &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Constructs a list that will use a copy of allocator a and inserts n copies of value.</para><para><emphasis role="bold">Throws</emphasis>: If allocator_type's default constructor throws or T's default or copy constructor throws.</para><para><emphasis role="bold">Complexity</emphasis>: Linear to n. </para></description></constructor>
@@ -1894,7 +1886,7 @@
<typedef name="node_type"><type>implementation_defined</type></typedef>
<typedef name="insert_return_type"><type>implementation_defined</type></typedef>
<method-group name="public member functions">
-<method name="BOOST_STATIC_ASSERT"><type/><parameter name=""><paramtype><emphasis>unspecified</emphasis></paramtype></parameter></method>
+<method name="BOOST_STATIC_ASSERT"><type/><parameter name=""><paramtype>(dtl::is_same&lt; typename allocator_type::value_type, std::pair&lt; const Key, T &gt; &gt;::value)</paramtype></parameter></method>
<method name="get_allocator" cv="const"><type>allocator_type</type><description><para><emphasis role="bold">Effects</emphasis>: Returns a copy of the allocator that was passed to the object's constructor.</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></method>
<method name="get_stored_allocator" cv="noexcept"><type>stored_allocator_type &amp;</type><description><para><emphasis role="bold">Effects</emphasis>: Returns a reference to the internal allocator.</para><para><emphasis role="bold">Throws</emphasis>: Nothing</para><para><emphasis role="bold">Complexity</emphasis>: Constant.</para><para><emphasis role="bold">Note</emphasis>: Non-standard extension. </para></description></method>
<method name="get_stored_allocator" cv="const noexcept"><type>const stored_allocator_type &amp;</type><description><para><emphasis role="bold">Effects</emphasis>: Returns a reference to the internal allocator.</para><para><emphasis role="bold">Throws</emphasis>: Nothing</para><para><emphasis role="bold">Complexity</emphasis>: Constant.</para><para><emphasis role="bold">Note</emphasis>: Non-standard extension. </para></description></method>
@@ -1980,7 +1972,7 @@
<method name="merge"><type>void</type><template>
<template-type-parameter name="C2"/>
</template><parameter name="source"><paramtype><classname>multimap</classname>&lt; Key, T, C2, Allocator, Options &gt; &amp;&amp;</paramtype></parameter><description><para><emphasis role="bold">Requires</emphasis>: this-&gt;get_allocator() == source.get_allocator().</para><para><emphasis role="bold">Effects</emphasis>: Attempts to extract each element in source and insert it into a using the comparison object of *this. If there is an element in a with key equivalent to the key of an element from source, then that element is not extracted from source.</para><para><emphasis role="bold">Postcondition</emphasis>: Pointers and references to the transferred elements of source refer to those same elements but as members of *this. Iterators referring to the transferred elements will continue to refer to their elements, but they now behave as iterators into *this, not into source.</para><para><emphasis role="bold">Throws</emphasis>: Nothing unless the comparison object throws.</para><para><emphasis role="bold">Complexity</emphasis>: N log(a.size() + N) (N has the value source.size()) </para></description></method>
-<method name="swap" cv="noexcept(allocator_traits_type::is_always_equal::value &amp;&amp;boost::container::container_detail::is_nothrow_swappable&lt; Compare &gt;::value))"><type>void</type><parameter name="x"><paramtype><classname>map</classname> &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Swaps the contents of *this and x.</para><para><emphasis role="bold">Throws</emphasis>: Nothing.</para><para><emphasis role="bold">Complexity</emphasis>: Constant. <emphasis role="bold">Effects</emphasis>: erase(a.begin(),a.end()).</para><para><emphasis role="bold">Postcondition</emphasis>: size() == 0.</para><para><emphasis role="bold">Complexity</emphasis>: linear in size(). </para></description></method>
+<method name="swap" cv="noexcept(allocator_traits_type::is_always_equal::value &amp;&amp;boost::container::dtl::is_nothrow_swappable&lt; Compare &gt;::value))"><type>void</type><parameter name="x"><paramtype><classname>map</classname> &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Swaps the contents of *this and x.</para><para><emphasis role="bold">Throws</emphasis>: Nothing.</para><para><emphasis role="bold">Complexity</emphasis>: Constant. <emphasis role="bold">Effects</emphasis>: erase(a.begin(),a.end()).</para><para><emphasis role="bold">Postcondition</emphasis>: size() == 0.</para><para><emphasis role="bold">Complexity</emphasis>: linear in size(). </para></description></method>
<method name="key_comp" cv="const"><type>key_compare</type><description><para><emphasis role="bold">Effects</emphasis>: Returns the comparison object out of which a was constructed.</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></method>
<method name="value_comp" cv="const"><type>value_compare</type><description><para><emphasis role="bold">Effects</emphasis>: Returns an object of value_compare constructed out of the comparison object.</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></method>
<method name="find"><type>iterator</type><parameter name="x"><paramtype>const key_type &amp;</paramtype></parameter><description><para><emphasis role="bold">Returns</emphasis>: An iterator pointing to an element with the key equivalent to x, or end() if such an element is not found.</para><para><emphasis role="bold">Complexity</emphasis>: Logarithmic. </para></description></method>
@@ -1994,7 +1986,7 @@
<method name="equal_range" cv="const"><type>std::pair&lt; const_iterator, const_iterator &gt;</type><parameter name="x"><paramtype>const key_type &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Equivalent to std::make_pair(this-&gt;lower_bound(k), this-&gt;upper_bound(k)).</para><para><emphasis role="bold">Complexity</emphasis>: Logarithmic </para></description></method>
<method name="rebalance"><type>void</type><description><para><emphasis role="bold">Effects</emphasis>: Rebalances the tree. It's a no-op for Red-Black and AVL trees.</para><para><emphasis role="bold">Complexity</emphasis>: Linear </para></description></method>
</method-group>
-<constructor cv="noexcept(container_detail::is_nothrow_default_constructible&lt; Allocator &gt;::value &amp;&amp;container_detail::is_nothrow_default_constructible&lt; Compare &gt;::value))"><description><para><emphasis role="bold">Effects</emphasis>: Default constructs an empty map.</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></constructor>
+<constructor cv="noexcept(dtl::is_nothrow_default_constructible&lt; Allocator &gt;::value &amp;&amp;dtl::is_nothrow_default_constructible&lt; Compare &gt;::value))"><description><para><emphasis role="bold">Effects</emphasis>: Default constructs an empty map.</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></constructor>
<constructor><parameter name="comp"><paramtype>const Compare &amp;</paramtype></parameter><parameter name="a"><paramtype>const allocator_type &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Constructs an empty map using the specified comparison object and allocator.</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></constructor>
<constructor specifiers="explicit"><parameter name="comp"><paramtype>const Compare &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Constructs an empty map using the specified comparison object.</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></constructor>
<constructor specifiers="explicit"><parameter name="a"><paramtype>const allocator_type &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Constructs an empty map using the specified allocator.</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></constructor>
@@ -2027,11 +2019,11 @@
<constructor><parameter name=""><paramtype><classname>ordered_unique_range_t</classname></paramtype></parameter><parameter name="il"><paramtype>std::initializer_list&lt; value_type &gt;</paramtype></parameter><parameter name="comp"><paramtype>const Compare &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Constructs an empty map using the specified comparison object, and inserts elements from the ordered unique range [il.begin(), il.end()). This function is more efficient than the normal range creation for ordered ranges.</para><para><emphasis role="bold">Requires</emphasis>: [il.begin(), il.end()) must be ordered according to the predicate and must be unique values.</para><para><emphasis role="bold">Complexity</emphasis>: Linear in N.</para><para><emphasis role="bold">Note</emphasis>: Non-standard extension. </para></description></constructor>
<constructor><parameter name=""><paramtype><classname>ordered_unique_range_t</classname></paramtype></parameter><parameter name="il"><paramtype>std::initializer_list&lt; value_type &gt;</paramtype></parameter><parameter name="comp"><paramtype>const Compare &amp;</paramtype></parameter><parameter name="a"><paramtype>const allocator_type &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Constructs an empty map using the specified comparison object and allocator, and inserts elements from the ordered unique range [il.begin(), il.end()). This function is more efficient than the normal range creation for ordered ranges.</para><para><emphasis role="bold">Requires</emphasis>: [il.begin(), il.end()) must be ordered according to the predicate and must be unique values.</para><para><emphasis role="bold">Complexity</emphasis>: Linear in N.</para><para><emphasis role="bold">Note</emphasis>: Non-standard extension. </para></description></constructor>
<constructor><parameter name="x"><paramtype>const <classname>map</classname> &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Copy constructs a map.</para><para><emphasis role="bold">Complexity</emphasis>: Linear in x.size(). </para></description></constructor>
-<constructor cv="noexcept(boost::container::container_detail::is_nothrow_move_constructible&lt; Compare &gt;::value))"><parameter name="x"><paramtype><classname>map</classname> &amp;&amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Move constructs a map. Constructs *this using x's resources.</para><para><emphasis role="bold">Complexity</emphasis>: Constant.</para><para><emphasis role="bold">Postcondition</emphasis>: x is emptied. </para></description></constructor>
+<constructor cv="noexcept(boost::container::dtl::is_nothrow_move_constructible&lt; Compare &gt;::value))"><parameter name="x"><paramtype><classname>map</classname> &amp;&amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Move constructs a map. Constructs *this using x's resources.</para><para><emphasis role="bold">Complexity</emphasis>: Constant.</para><para><emphasis role="bold">Postcondition</emphasis>: x is emptied. </para></description></constructor>
<constructor><parameter name="x"><paramtype>const <classname>map</classname> &amp;</paramtype></parameter><parameter name="a"><paramtype>const allocator_type &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Copy constructs a map using the specified allocator.</para><para><emphasis role="bold">Complexity</emphasis>: Linear in x.size(). </para></description></constructor>
<constructor><parameter name="x"><paramtype><classname>map</classname> &amp;&amp;</paramtype></parameter><parameter name="a"><paramtype>const allocator_type &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Move constructs a map using the specified allocator. Constructs *this using x's resources.</para><para><emphasis role="bold">Complexity</emphasis>: Constant if x == x.get_allocator(), linear otherwise.</para><para><emphasis role="bold">Postcondition</emphasis>: x is emptied. </para></description></constructor>
<copy-assignment><type><classname>map</classname> &amp;</type><parameter name="x"><paramtype>const <classname>map</classname> &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Makes *this a copy of x.</para><para><emphasis role="bold">Complexity</emphasis>: Linear in x.size(). </para></description></copy-assignment>
-<copy-assignment cv="noexcept((allocator_traits_type::propagate_on_container_move_assignment::value||allocator_traits_type::is_always_equal::value)&amp;&amp;boost::container::container_detail::is_nothrow_move_assignable&lt; Compare &gt;::value))"><type><classname>map</classname> &amp;</type><parameter name="x"><paramtype><classname>map</classname> &amp;&amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: this-&gt;swap(x.get()).</para><para><emphasis role="bold">Throws</emphasis>: If allocator_traits_type::propagate_on_container_move_assignment is false and (allocation throws or value_type's move constructor throws)</para><para><emphasis role="bold">Complexity</emphasis>: Constant if allocator_traits_type:: propagate_on_container_move_assignment is true or this-&gt;get&gt;allocator() == x.get_allocator(). Linear otherwise. </para></description></copy-assignment>
+<copy-assignment cv="noexcept((allocator_traits_type::propagate_on_container_move_assignment::value||allocator_traits_type::is_always_equal::value)&amp;&amp;boost::container::dtl::is_nothrow_move_assignable&lt; Compare &gt;::value))"><type><classname>map</classname> &amp;</type><parameter name="x"><paramtype><classname>map</classname> &amp;&amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: this-&gt;swap(x.get()).</para><para><emphasis role="bold">Throws</emphasis>: If allocator_traits_type::propagate_on_container_move_assignment is false and (allocation throws or value_type's move constructor throws)</para><para><emphasis role="bold">Complexity</emphasis>: Constant if allocator_traits_type:: propagate_on_container_move_assignment is true or this-&gt;get&gt;allocator() == x.get_allocator(). Linear otherwise. </para></description></copy-assignment>
<copy-assignment><type><classname>map</classname> &amp;</type><parameter name="il"><paramtype>std::initializer_list&lt; value_type &gt;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Assign content of il to *this. </para></description></copy-assignment>
<method-group name="friend functions">
<method name="operator=="><type>friend bool</type><parameter name="x"><paramtype>const <classname>map</classname> &amp;</paramtype></parameter><parameter name="y"><paramtype>const <classname>map</classname> &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Returns true if x and y are equal</para><para><emphasis role="bold">Complexity</emphasis>: Linear to the number of elements in the container. </para></description></method>
@@ -2070,7 +2062,7 @@
<typedef name="movable_value_type"><type>implementation_defined</type></typedef>
<typedef name="node_type"><type>implementation_defined</type></typedef>
<method-group name="public member functions">
-<method name="BOOST_STATIC_ASSERT"><type/><parameter name=""><paramtype><emphasis>unspecified</emphasis></paramtype></parameter></method>
+<method name="BOOST_STATIC_ASSERT"><type/><parameter name=""><paramtype>(dtl::is_same&lt; typename allocator_type::value_type, std::pair&lt; const Key, T &gt; &gt;::value)</paramtype></parameter></method>
<method name="get_allocator" cv="const"><type>allocator_type</type><description><para><emphasis role="bold">Effects</emphasis>: Returns a copy of the allocator that was passed to the object's constructor.</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></method>
<method name="get_stored_allocator"><type>stored_allocator_type &amp;</type><description><para><emphasis role="bold">Effects</emphasis>: Returns a reference to the internal allocator.</para><para><emphasis role="bold">Throws</emphasis>: Nothing</para><para><emphasis role="bold">Complexity</emphasis>: Constant.</para><para><emphasis role="bold">Note</emphasis>: Non-standard extension. </para></description></method>
<method name="get_stored_allocator" cv="const"><type>const stored_allocator_type &amp;</type><description><para><emphasis role="bold">Effects</emphasis>: Returns a reference to the internal allocator.</para><para><emphasis role="bold">Throws</emphasis>: Nothing</para><para><emphasis role="bold">Complexity</emphasis>: Constant.</para><para><emphasis role="bold">Note</emphasis>: Non-standard extension. </para></description></method>
@@ -2126,7 +2118,7 @@
<method name="merge"><type>void</type><template>
<template-type-parameter name="C2"/>
</template><parameter name="source"><paramtype><classname>map</classname>&lt; Key, T, C2, Allocator, Options &gt; &amp;&amp;</paramtype></parameter><description><para><emphasis role="bold">Requires</emphasis>: this-&gt;get_allocator() == source.get_allocator().</para><para><emphasis role="bold">Effects</emphasis>: Extracts each element in source and insert it into a using the comparison object of *this.</para><para><emphasis role="bold">Postcondition</emphasis>: Pointers and references to the transferred elements of source refer to those same elements but as members of *this. Iterators referring to the transferred elements will continue to refer to their elements, but they now behave as iterators into *this, not into source.</para><para><emphasis role="bold">Throws</emphasis>: Nothing unless the comparison object throws.</para><para><emphasis role="bold">Complexity</emphasis>: N log(a.size() + N) (N has the value source.size()) </para></description></method>
-<method name="swap" cv="noexcept(allocator_traits_type::is_always_equal::value &amp;&amp;boost::container::container_detail::is_nothrow_swappable&lt; Compare &gt;::value))"><type>void</type><parameter name="x"><paramtype><classname>multiset</classname> &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Swaps the contents of *this and x.</para><para><emphasis role="bold">Throws</emphasis>: Nothing.</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></method>
+<method name="swap" cv="noexcept(allocator_traits_type::is_always_equal::value &amp;&amp;boost::container::dtl::is_nothrow_swappable&lt; Compare &gt;::value))"><type>void</type><parameter name="x"><paramtype><classname>multiset</classname> &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Swaps the contents of *this and x.</para><para><emphasis role="bold">Throws</emphasis>: Nothing.</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></method>
<method name="clear" cv="noexcept"><type>void</type><description><para><emphasis role="bold">Effects</emphasis>: erase(a.begin(),a.end()).</para><para><emphasis role="bold">Postcondition</emphasis>: size() == 0.</para><para><emphasis role="bold">Complexity</emphasis>: linear in size(). </para></description></method>
<method name="key_comp" cv="const"><type>key_compare</type><description><para><emphasis role="bold">Effects</emphasis>: Returns the comparison object out of which a was constructed.</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></method>
<method name="value_comp" cv="const"><type>value_compare</type><description><para><emphasis role="bold">Effects</emphasis>: Returns an object of value_compare constructed out of the comparison object.</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></method>
@@ -2141,7 +2133,7 @@
<method name="equal_range" cv="const"><type>std::pair&lt; const_iterator, const_iterator &gt;</type><parameter name="x"><paramtype>const key_type &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Equivalent to std::make_pair(this-&gt;lower_bound(k), this-&gt;upper_bound(k)).</para><para><emphasis role="bold">Complexity</emphasis>: Logarithmic </para></description></method>
<method name="rebalance"><type>void</type><description><para><emphasis role="bold">Effects</emphasis>: Rebalances the tree. It's a no-op for Red-Black and AVL trees.</para><para><emphasis role="bold">Complexity</emphasis>: Linear </para></description></method>
</method-group>
-<constructor cv="noexcept(container_detail::is_nothrow_default_constructible&lt; Allocator &gt;::value &amp;&amp;container_detail::is_nothrow_default_constructible&lt; Compare &gt;::value))"><description><para><emphasis role="bold">Effects</emphasis>: Default constructs an empty multimap.</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></constructor>
+<constructor cv="noexcept(dtl::is_nothrow_default_constructible&lt; Allocator &gt;::value &amp;&amp;dtl::is_nothrow_default_constructible&lt; Compare &gt;::value))"><description><para><emphasis role="bold">Effects</emphasis>: Default constructs an empty multimap.</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></constructor>
<constructor specifiers="explicit"><parameter name="a"><paramtype>const allocator_type &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Constructs an empty multimap using the specified allocator object and allocator.</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></constructor>
<constructor specifiers="explicit"><parameter name="comp"><paramtype>const Compare &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Constructs an empty multimap using the specified comparison.</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></constructor>
<constructor><parameter name="comp"><paramtype>const Compare &amp;</paramtype></parameter><parameter name="a"><paramtype>const allocator_type &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Constructs an empty multimap using the specified comparison and allocator.</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></constructor>
@@ -2174,11 +2166,11 @@
<constructor><parameter name=""><paramtype><classname>ordered_range_t</classname></paramtype></parameter><parameter name="il"><paramtype>std::initializer_list&lt; value_type &gt;</paramtype></parameter><parameter name="comp"><paramtype>const Compare &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Constructs an empty map using the specified comparison object and inserts elements from the ordered range [il.begin(), il.end()). This function is more efficient than the normal range creation for ordered ranges.</para><para><emphasis role="bold">Requires</emphasis>: [il.begin(), il.end()) must be ordered according to the predicate.</para><para><emphasis role="bold">Complexity</emphasis>: Linear in N.</para><para><emphasis role="bold">Note</emphasis>: Non-standard extension. </para></description></constructor>
<constructor><parameter name=""><paramtype><classname>ordered_range_t</classname></paramtype></parameter><parameter name="il"><paramtype>std::initializer_list&lt; value_type &gt;</paramtype></parameter><parameter name="comp"><paramtype>const Compare &amp;</paramtype></parameter><parameter name="a"><paramtype>const allocator_type &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Constructs an empty map and inserts elements from the ordered range [il.begin(), il.end()). This function is more efficient than the normal range creation for ordered ranges.</para><para><emphasis role="bold">Requires</emphasis>: [il.begin(), il.end()) must be ordered according to the predicate.</para><para><emphasis role="bold">Complexity</emphasis>: Linear in N.</para><para><emphasis role="bold">Note</emphasis>: Non-standard extension. </para></description></constructor>
<constructor><parameter name="x"><paramtype>const <classname>multimap</classname> &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Copy constructs a multimap.</para><para><emphasis role="bold">Complexity</emphasis>: Linear in x.size(). </para></description></constructor>
-<constructor cv="noexcept(boost::container::container_detail::is_nothrow_move_constructible&lt; Compare &gt;::value))"><parameter name="x"><paramtype><classname>multimap</classname> &amp;&amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Move constructs a multimap. Constructs *this using x's resources.</para><para><emphasis role="bold">Complexity</emphasis>: Constant.</para><para><emphasis role="bold">Postcondition</emphasis>: x is emptied. </para></description></constructor>
+<constructor cv="noexcept(boost::container::dtl::is_nothrow_move_constructible&lt; Compare &gt;::value))"><parameter name="x"><paramtype><classname>multimap</classname> &amp;&amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Move constructs a multimap. Constructs *this using x's resources.</para><para><emphasis role="bold">Complexity</emphasis>: Constant.</para><para><emphasis role="bold">Postcondition</emphasis>: x is emptied. </para></description></constructor>
<constructor><parameter name="x"><paramtype>const <classname>multimap</classname> &amp;</paramtype></parameter><parameter name="a"><paramtype>const allocator_type &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Copy constructs a multimap.</para><para><emphasis role="bold">Complexity</emphasis>: Linear in x.size(). </para></description></constructor>
<constructor><parameter name="x"><paramtype><classname>multimap</classname> &amp;&amp;</paramtype></parameter><parameter name="a"><paramtype>const allocator_type &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Move constructs a multimap using the specified allocator. Constructs *this using x's resources. <emphasis role="bold">Complexity</emphasis>: Constant if a == x.get_allocator(), linear otherwise.</para><para><emphasis role="bold">Postcondition</emphasis>: x is emptied. </para></description></constructor>
<copy-assignment><type><classname>multimap</classname> &amp;</type><parameter name="x"><paramtype>const <classname>multimap</classname> &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Makes *this a copy of x.</para><para><emphasis role="bold">Complexity</emphasis>: Linear in x.size(). </para></description></copy-assignment>
-<copy-assignment cv="noexcept((allocator_traits_type::propagate_on_container_move_assignment::value||allocator_traits_type::is_always_equal::value)&amp;&amp;boost::container::container_detail::is_nothrow_move_assignable&lt; Compare &gt;::value))"><type><classname>multimap</classname> &amp;</type><parameter name="x"><paramtype><classname>multimap</classname> &amp;&amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: this-&gt;swap(x.get()).</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></copy-assignment>
+<copy-assignment cv="noexcept((allocator_traits_type::propagate_on_container_move_assignment::value||allocator_traits_type::is_always_equal::value)&amp;&amp;boost::container::dtl::is_nothrow_move_assignable&lt; Compare &gt;::value))"><type><classname>multimap</classname> &amp;</type><parameter name="x"><paramtype><classname>multimap</classname> &amp;&amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: this-&gt;swap(x.get()).</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></copy-assignment>
<copy-assignment><type><classname>multimap</classname> &amp;</type><parameter name="il"><paramtype>std::initializer_list&lt; value_type &gt;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Assign content of il to *this. </para></description></copy-assignment>
<method-group name="friend functions">
<method name="operator=="><type>friend bool</type><parameter name="x"><paramtype>const <classname>multimap</classname> &amp;</paramtype></parameter><parameter name="y"><paramtype>const <classname>multimap</classname> &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Returns true if x and y are equal</para><para><emphasis role="bold">Complexity</emphasis>: Linear to the number of elements in the container. </para></description></method>
@@ -2258,13 +2250,13 @@
<template-type-parameter name="Key"/>
<template-type-parameter name="T"/>
<template-type-parameter name="Compare"><default>std::less&lt;Key&gt;</default></template-type-parameter>
- <template-type-parameter name="Options"><default>tree_assoc_defaults</default></template-type-parameter>
+ <template-type-parameter name="Options"><default>void</default></template-type-parameter>
</template><description><para>A portable metafunction to obtain a map that uses a polymorphic allocator </para></description><typedef name="type"><type><classname>boost::container::map</classname>&lt; Key, T, Compare, <classname>polymorphic_allocator</classname>&lt; std::pair&lt; const Key, T &gt; &gt;, Options &gt;</type></typedef>
</struct><struct name="multimap_of"><template>
<template-type-parameter name="Key"/>
<template-type-parameter name="T"/>
<template-type-parameter name="Compare"><default>std::less&lt;Key&gt;</default></template-type-parameter>
- <template-type-parameter name="Options"><default>tree_assoc_defaults</default></template-type-parameter>
+ <template-type-parameter name="Options"><default>void</default></template-type-parameter>
</template><description><para>A portable metafunction to obtain a multimap that uses a polymorphic allocator </para></description><typedef name="type"><type><classname>boost::container::multimap</classname>&lt; Key, T, Compare, <classname>polymorphic_allocator</classname>&lt; std::pair&lt; const Key, T &gt; &gt;, Options &gt;</type></typedef>
</struct><typedef name="map"><type><classname>boost::container::map</classname>&lt; Key, T, Compare, <classname>polymorphic_allocator</classname>&lt; std::pair&lt; const Key, T &gt; &gt;, Options &gt;</type></typedef>
<typedef name="multimap"><type><classname>boost::container::multimap</classname>&lt; Key, T, Compare, <classname>polymorphic_allocator</classname>&lt; std::pair&lt; const Key, T &gt; &gt;, Options &gt;</type></typedef>
@@ -2462,11 +2454,11 @@
</struct><typedef name="value_type"><type>T</type></typedef>
<typedef name="pointer"><type>T *</type></typedef>
<typedef name="const_pointer"><type>const T *</type></typedef>
-<typedef name="reference"><type><emphasis>unspecified</emphasis></type></typedef>
-<typedef name="const_reference"><type><emphasis>unspecified</emphasis></type></typedef>
+<typedef name="reference"><type>::boost::container::dtl::unvoid_ref&lt; T &gt;::type</type></typedef>
+<typedef name="const_reference"><type>::boost::container::dtl::unvoid_ref&lt; const T &gt;::type</type></typedef>
<typedef name="size_type"><type>std::size_t</type></typedef>
<typedef name="difference_type"><type>std::ptrdiff_t</type></typedef>
-<typedef name="version"><type><emphasis>unspecified</emphasis></type></typedef>
+<typedef name="version"><type>boost::container::dtl::version_type&lt; self_t, Version &gt;</type></typedef>
<method-group name="public member functions">
<method name="max_size" cv="const"><type>size_type</type><description><para>Returns the number of elements that could be allocated. Never throws </para></description></method>
<method name="allocate"><type>pointer</type><parameter name="count"><paramtype>size_type</paramtype></parameter><parameter name=""><paramtype>const void *</paramtype><default>0</default></parameter><description><para>Allocate memory for an array of count elements. Throws std::bad_alloc if there is no enough memory </para></description></method>
@@ -2590,7 +2582,7 @@
<constructor cv="noexcept"><parameter name="p"><paramtype>node_pointer</paramtype></parameter><parameter name="al"><paramtype>const nallocator_type &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Constructs a <classname alt="boost::container::node_handle">node_handle</classname> object initializing internal pointer with p. If p != nullptr copy constructs internal allocator from al. </para></description></constructor>
<constructor cv="noexcept"><template>
<template-type-parameter name="KeyMapped2"/>
- </template><parameter name="nh"><paramtype><classname>node_handle</classname>&lt; NodeAllocator, KeyMapped2 &gt; &amp;&amp;</paramtype></parameter><parameter name=""><paramtype><emphasis>unspecified</emphasis></paramtype><default>0</default></parameter><description><para><emphasis role="bold">Effects</emphasis>: Constructs a <classname alt="boost::container::node_handle">node_handle</classname> 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.</para><para><emphasis role="bold">Postcondition</emphasis>: nh.empty()</para><para><emphasis role="bold">Note</emphasis>: Two <classname alt="boost::container::node_handle">node_handle</classname>'s are related if only one of KeyMapped template parameter of a node handle is void. </para></description></constructor>
+ </template><parameter name="nh"><paramtype><classname>node_handle</classname>&lt; NodeAllocator, KeyMapped2 &gt; &amp;&amp;</paramtype></parameter><parameter name=""><paramtype>typename dtl::enable_if_c&lt; ((unsigned) dtl::is_same&lt; KeyMapped, void &gt;::value+(unsigned) dtl::is_same&lt; KeyMapped2, void &gt;::value)==1u &gt;::type *</paramtype><default>0</default></parameter><description><para><emphasis role="bold">Effects</emphasis>: Constructs a <classname alt="boost::container::node_handle">node_handle</classname> 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.</para><para><emphasis role="bold">Postcondition</emphasis>: nh.empty()</para><para><emphasis role="bold">Note</emphasis>: Two <classname alt="boost::container::node_handle">node_handle</classname>'s are related if only one of KeyMapped template parameter of a node handle is void. </para></description></constructor>
<constructor cv="noexcept"><parameter name="nh"><paramtype><classname>node_handle</classname> &amp;&amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Constructs a <classname alt="boost::container::node_handle">node_handle</classname> 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.</para><para><emphasis role="bold">Postcondition</emphasis>: nh.empty() </para></description></constructor>
<destructor><description><para><emphasis role="bold">Effects</emphasis>: If !this-&gt;empty(), destroys the value_type subobject in the container_node_type object pointed to by c by calling allocator_traits&lt;impl_defined&gt;::destroy, then deallocates m_ptr by calling nator_traits::rebind_traits&lt;container_node_type&gt;::deallocate. </para></description></destructor>
<copy-assignment cv="noexcept"><type><classname>node_handle</classname> &amp;</type><parameter name="nh"><paramtype><classname>node_handle</classname> &amp;&amp;</paramtype></parameter><description><para><emphasis role="bold">Requires</emphasis>: Either this-&gt;empty(), or nator_traits::propagate_on_container_move_assignment is true, or node_alloc() == nh.node_alloc().</para><para><emphasis role="bold">Effects</emphasis>: 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-&gt;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().</para><para><emphasis role="bold">Returns</emphasis>: *this.</para><para><emphasis role="bold">Throws</emphasis>: Nothing. </para></description></copy-assignment>
@@ -2688,7 +2680,24 @@
</template><description><para>This option setter specifies if node size is optimized storing rebalancing data masked into pointers for ordered associative containers </para></description></struct><struct name="tree_assoc_options"><template>
<template-nontype-parameter name="Options"><type>class...</type></template-nontype-parameter>
</template><description><para>Helper metafunction to combine options into a single type to be used by <computeroutput><classname alt="boost::container::set">boost::container::set</classname></computeroutput>, <computeroutput><classname alt="boost::container::multiset">boost::container::multiset</classname></computeroutput> <computeroutput><classname alt="boost::container::map">boost::container::map</classname></computeroutput> and <computeroutput><classname alt="boost::container::multimap">boost::container::multimap</classname></computeroutput>. Supported options are: <computeroutput><classname alt="boost::container::optimize_size">boost::container::optimize_size</classname></computeroutput> and <computeroutput><classname alt="boost::container::tree_type">boost::container::tree_type</classname></computeroutput> </para></description><typedef name="type"><type>implementation_defined</type></typedef>
-</struct>
+</struct><struct name="growth_factor_50"><purpose>defined(BOOST_CONTAINER_DOXYGEN_INVOKED) </purpose><description><para>This growth factor argument specifies that the container should increase it's capacity a 50% when existing capacity is exhausted. </para></description></struct><struct name="growth_factor_60"><description><para>This growth factor argument specifies that the container should increase it's capacity a 60% when existing capacity is exhausted. </para></description></struct><struct name="growth_factor_100"><description><para>This growth factor argument specifies that the container should increase it's capacity a 100% (doubling its capacity) when existing capacity is exhausted. </para></description></struct><struct name="growth_factor"><template>
+ <template-type-parameter name="GrowthFactor"><purpose><para>A function object that has the following signature:<sbr/>
+<sbr/>
+ <computeroutput>template&lt;class SizeType&gt;</computeroutput><sbr/>
+ <computeroutput>SizeType operator()(SizeType cur_cap, SizeType add_min_cap, SizeType max_cap) const;</computeroutput>.<sbr/>
+<sbr/>
+ <computeroutput>cur_cap</computeroutput> is the current capacity, <computeroutput>add_min_cap</computeroutput> is the minimum additional capacity we want to achieve and <computeroutput>max_cap</computeroutput> is the maximum capacity that the allocator or other factors allow. The implementation should return a value between <computeroutput>cur_cap</computeroutput> + <computeroutput>add_min_cap</computeroutput> and <computeroutput>max_cap</computeroutput>. <computeroutput>cur_cap</computeroutput> + <computeroutput>add_min_cap</computeroutput> is guaranteed not to overflow/wraparound, but the implementation should handle wraparound produced by the growth factor.</para></purpose></template-type-parameter>
+ </template><purpose>defined(BOOST_CONTAINER_DOXYGEN_INVOKED) </purpose><description><para>This option setter specifies the growth factor strategy of the underlying vector.</para><para>
+Predefined growth factors that can be passed as arguments to this option are: <computeroutput><classname alt="boost::container::growth_factor_50">boost::container::growth_factor_50</classname></computeroutput> <computeroutput><classname alt="boost::container::growth_factor_60">boost::container::growth_factor_60</classname></computeroutput> <computeroutput><classname alt="boost::container::growth_factor_100">boost::container::growth_factor_100</classname></computeroutput> </para><para>If this option is not specified, a default will be used by the container. </para></description></struct><struct name="stored_size"><template>
+ <template-type-parameter name="StoredSizeType"><purpose><para>A unsigned integer type. It shall be smaller than than the size of the size_type deduced from <computeroutput><classname alt="boost::container::allocator_traits">allocator_traits</classname>&lt;A&gt;::size_type</computeroutput> or the same type.</para></purpose></template-type-parameter>
+ </template><description><para>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).</para><para>
+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.</para><para>Note that alignment requirements can disallow theoritical space savings. Example: <computeroutput>vector</computeroutput> 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 <computeroutput><classname alt="boost::container::stored_size">stored_size</classname></computeroutput> will always lead to a smaller sizeof(container).</para><para>If a user tries to insert more elements than representable by <computeroutput><classname alt="boost::container::stored_size">stored_size</classname></computeroutput>, vector will throw a length_error.</para><para>If this option is not specified, <computeroutput><classname alt="boost::container::allocator_traits">allocator_traits</classname>&lt;A&gt;::size_type</computeroutput> (usually std::size_t) will be used to store size-related information inside the container. </para></description></struct><struct name="vector_options"><template>
+ <template-nontype-parameter name="Options"><type>class...</type></template-nontype-parameter>
+ </template><description><para>Helper metafunction to combine options into a single type to be used by <computeroutput><classname alt="boost::container::vector">boost::container::vector</classname></computeroutput>. Supported options are: <computeroutput><classname alt="boost::container::growth_factor">boost::container::growth_factor</classname></computeroutput> and <computeroutput><classname alt="boost::container::stored_size">boost::container::stored_size</classname></computeroutput> </para></description><typedef name="type"><type>implementation_defined</type></typedef>
+</struct><enum name="tree_type_enum"><enumvalue name="red_black_tree"/><enumvalue name="avl_tree"/><enumvalue name="scapegoat_tree"/><enumvalue name="splay_tree"/><description><para>Enumeration used to configure ordered associative containers with a concrete tree implementation. </para></description></enum>
+<typedef name="tree_assoc_options_t"><description><para>Helper alias metafunction to combine options into a single type to be used by tree-based associative containers </para></description><type>typename <classname>boost::container::tree_assoc_options</classname>&lt; Options...&gt;::type</type></typedef>
+<typedef name="vector_options_t"><description><para>Helper alias metafunction to combine options into a single type to be used by <computeroutput><classname alt="boost::container::vector">boost::container::vector</classname></computeroutput>. Supported options are: <computeroutput><classname alt="boost::container::growth_factor">boost::container::growth_factor</classname></computeroutput> and <computeroutput><classname alt="boost::container::stored_size">boost::container::stored_size</classname></computeroutput> </para></description><type>typename <classname>boost::container::vector_options</classname>&lt; Options...&gt;::type</type></typedef>
+
@@ -3475,7 +3484,7 @@
<class name="scoped_allocator_adaptor"><template>
<template-type-parameter name="OuterAlloc"/>
<template-nontype-parameter name="InnerAllocs"><type>typename...</type></template-nontype-parameter>
- </template><description><para>This class is a C++03-compatible implementation of std::scoped_allocator_adaptor. The class template <classname alt="boost::container::scoped_allocator_adaptor">scoped_allocator_adaptor</classname> is an allocator template that specifies the memory resource (the outer allocator) to be used by a container (as any other allocator does) and also specifies an inner allocator resource to be passed to the constructor of every element within the container.</para><para>This adaptor is instantiated with one outer and zero or more inner allocator types. If instantiated with only one allocator type, the inner allocator becomes the <classname alt="boost::container::scoped_allocator_adaptor">scoped_allocator_adaptor</classname> itself, thus using the same allocator resource for the container and every element within the container and, if the elements themselves are containers, each of their elements recursively. If instantiated with more than one allocator, the first allocator is the outer allocator for use by the container, the second allocator is passed to the constructors of the container's elements, and, if the elements themselves are containers, the third allocator is passed to the elements' elements, and so on. If containers are nested to a depth greater than the number of allocators, the last allocator is used repeatedly, as in the single-allocator case, for any remaining recursions.</para><para>[<emphasis role="bold">Note</emphasis>: The <classname alt="boost::container::scoped_allocator_adaptor">scoped_allocator_adaptor</classname> is derived from the outer allocator type so it can be substituted for the outer allocator type in most expressions. -end note]</para><para>In the construct member functions, <computeroutput>OUTERMOST(x)</computeroutput> is x if x does not have an <computeroutput>outer_allocator()</computeroutput> member function and <computeroutput>OUTERMOST(x.outer_allocator())</computeroutput> otherwise; <computeroutput>OUTERMOST_ALLOC_TRAITS(x)</computeroutput> is <computeroutput>allocator_traits&lt;decltype(OUTERMOST(x))&gt;</computeroutput>.</para><para>[<emphasis role="bold">Note</emphasis>: <computeroutput>OUTERMOST(x)</computeroutput> and <computeroutput>OUTERMOST_ALLOC_TRAITS(x)</computeroutput> are recursive operations. It is incumbent upon the definition of <computeroutput>outer_allocator()</computeroutput> to ensure that the recursion terminates. It will terminate for all instantiations of <classname alt="boost::container::scoped_allocator_adaptor">scoped_allocator_adaptor</classname>. -end note] </para></description><struct name="rebind"><template>
+ </template><inherit access="public">dtl::scoped_allocator_adaptor_base&lt; OuterAlloc, InnerAllocs...&gt;</inherit><description><para>This class is a C++03-compatible implementation of std::scoped_allocator_adaptor. The class template <classname alt="boost::container::scoped_allocator_adaptor">scoped_allocator_adaptor</classname> is an allocator template that specifies the memory resource (the outer allocator) to be used by a container (as any other allocator does) and also specifies an inner allocator resource to be passed to the constructor of every element within the container.</para><para>This adaptor is instantiated with one outer and zero or more inner allocator types. If instantiated with only one allocator type, the inner allocator becomes the <classname alt="boost::container::scoped_allocator_adaptor">scoped_allocator_adaptor</classname> itself, thus using the same allocator resource for the container and every element within the container and, if the elements themselves are containers, each of their elements recursively. If instantiated with more than one allocator, the first allocator is the outer allocator for use by the container, the second allocator is passed to the constructors of the container's elements, and, if the elements themselves are containers, the third allocator is passed to the elements' elements, and so on. If containers are nested to a depth greater than the number of allocators, the last allocator is used repeatedly, as in the single-allocator case, for any remaining recursions.</para><para>[<emphasis role="bold">Note</emphasis>: The <classname alt="boost::container::scoped_allocator_adaptor">scoped_allocator_adaptor</classname> is derived from the outer allocator type so it can be substituted for the outer allocator type in most expressions. -end note]</para><para>In the construct member functions, <computeroutput>OUTERMOST(x)</computeroutput> is x if x does not have an <computeroutput>outer_allocator()</computeroutput> member function and <computeroutput>OUTERMOST(x.outer_allocator())</computeroutput> otherwise; <computeroutput>OUTERMOST_ALLOC_TRAITS(x)</computeroutput> is <computeroutput>allocator_traits&lt;decltype(OUTERMOST(x))&gt;</computeroutput>.</para><para>[<emphasis role="bold">Note</emphasis>: <computeroutput>OUTERMOST(x)</computeroutput> and <computeroutput>OUTERMOST_ALLOC_TRAITS(x)</computeroutput> are recursive operations. It is incumbent upon the definition of <computeroutput>outer_allocator()</computeroutput> to ensure that the recursion terminates. It will terminate for all instantiations of <classname alt="boost::container::scoped_allocator_adaptor">scoped_allocator_adaptor</classname>. -end note] </para></description><struct name="rebind"><template>
<template-type-parameter name="U"/>
</template><description><para>Type: Rebinds scoped allocator to <computeroutput>typedef <classname alt="boost::container::scoped_allocator_adaptor">scoped_allocator_adaptor</classname> &lt; typename outer_traits_type::template portable_rebind_alloc&lt;U&gt;::type , InnerAllocs... &gt;</computeroutput> </para></description><typedef name="other"><type><classname>scoped_allocator_adaptor</classname>&lt; typename outer_traits_type::template portable_rebind_alloc&lt; U &gt;::type, InnerAllocs...&gt;</type></typedef>
</struct><typedef name="outer_allocator_type"><type>OuterAlloc</type></typedef>
@@ -3670,7 +3679,7 @@
<template-type-parameter name="Key"><purpose><para>is the type to be inserted in the set, which is also the key_type </para></purpose></template-type-parameter>
<template-type-parameter name="Compare"><default>std::less&lt;Key&gt;</default><purpose><para>is the comparison functor used to order keys </para></purpose></template-type-parameter>
<template-type-parameter name="Allocator"><default><classname alt="boost::container::new_allocator">new_allocator</classname>&lt;Key&gt;</default><purpose><para>is the allocator to be used to allocate memory for this container </para></purpose></template-type-parameter>
- <template-type-parameter name="Options"><default>tree_assoc_defaults</default><purpose><para>is an packed option type generated using using <classname alt="boost::container::tree_assoc_options">boost::container::tree_assoc_options</classname>. </para></purpose></template-type-parameter>
+ <template-type-parameter name="Options"><default>void</default><purpose><para>is an packed option type generated using using <classname alt="boost::container::tree_assoc_options">boost::container::tree_assoc_options</classname>. </para></purpose></template-type-parameter>
</template><description><para>A set is a kind of associative container that supports unique keys (contains at most one of each key value) and provides for fast retrieval of the keys themselves. Class set supports bidirectional iterators.</para><para>A set satisfies all of the requirements of a container and of a reversible container , and of an associative container. A set also provides most operations described in for unique keys.</para><para>
</para></description><typedef name="key_type"><type>Key</type></typedef>
<typedef name="value_type"><type>Key</type></typedef>
@@ -3743,7 +3752,7 @@
<method name="erase"><type>iterator</type><parameter name="first"><paramtype>const_iterator</paramtype></parameter><parameter name="last"><paramtype>const_iterator</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Erases all the elements in the range [first, last).</para><para><emphasis role="bold">Returns</emphasis>: Returns last.</para><para><emphasis role="bold">Complexity</emphasis>: log(size())+N where N is the distance from first to last. </para></description></method>
<method name="extract"><type>node_type</type><parameter name="p"><paramtype>const_iterator</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Removes the element pointed to by "position".</para><para><emphasis role="bold">Returns</emphasis>: A node_type owning the element, otherwise an empty node_type.</para><para><emphasis role="bold">Complexity</emphasis>: Amortized constant. </para></description></method>
<method name="extract"><type>node_type</type><parameter name="x"><paramtype>const key_type &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Removes the first element in the container with key equivalent to k.</para><para><emphasis role="bold">Returns</emphasis>: A node_type owning the element if found, otherwise an empty node_type.</para><para><emphasis role="bold">Complexity</emphasis>: log(a.size()). </para></description></method>
-<method name="swap" cv="noexcept(allocator_traits_type::is_always_equal::value &amp;&amp;boost::container::container_detail::is_nothrow_swappable&lt; Compare &gt;::value))"><type>void</type><parameter name="x"><paramtype><classname>set</classname> &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Swaps the contents of *this and x.</para><para><emphasis role="bold">Throws</emphasis>: Nothing.</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></method>
+<method name="swap" cv="noexcept(allocator_traits_type::is_always_equal::value &amp;&amp;boost::container::dtl::is_nothrow_swappable&lt; Compare &gt;::value))"><type>void</type><parameter name="x"><paramtype><classname>set</classname> &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Swaps the contents of *this and x.</para><para><emphasis role="bold">Throws</emphasis>: Nothing.</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></method>
<method name="clear"><type>void</type><description><para><emphasis role="bold">Effects</emphasis>: erase(a.begin(),a.end()).</para><para><emphasis role="bold">Postcondition</emphasis>: size() == 0.</para><para><emphasis role="bold">Complexity</emphasis>: linear in size(). </para></description></method>
<method name="key_comp" cv="const"><type>key_compare</type><description><para><emphasis role="bold">Effects</emphasis>: Returns the comparison object out of which a was constructed.</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></method>
<method name="value_comp" cv="const"><type>value_compare</type><description><para><emphasis role="bold">Effects</emphasis>: Returns an object of value_compare constructed out of the comparison object.</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></method>
@@ -3761,7 +3770,7 @@
<method name="equal_range" cv="const"><type>std::pair&lt; const_iterator, const_iterator &gt;</type><parameter name="x"><paramtype>const key_type &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Equivalent to std::make_pair(this-&gt;lower_bound(k), this-&gt;upper_bound(k)).</para><para><emphasis role="bold">Complexity</emphasis>: Logarithmic </para></description></method>
<method name="rebalance"><type>void</type><description><para><emphasis role="bold">Effects</emphasis>: Rebalances the tree. It's a no-op for Red-Black and AVL trees.</para><para><emphasis role="bold">Complexity</emphasis>: Linear </para></description></method>
</method-group>
-<constructor cv="noexcept(container_detail::is_nothrow_default_constructible&lt; Allocator &gt;::value &amp;&amp;container_detail::is_nothrow_default_constructible&lt; Compare &gt;::value))"><description><para><emphasis role="bold">Effects</emphasis>: Default constructs an empty set.</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></constructor>
+<constructor cv="noexcept(dtl::is_nothrow_default_constructible&lt; Allocator &gt;::value &amp;&amp;dtl::is_nothrow_default_constructible&lt; Compare &gt;::value))"><description><para><emphasis role="bold">Effects</emphasis>: Default constructs an empty set.</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></constructor>
<constructor specifiers="explicit"><parameter name="a"><paramtype>const allocator_type &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Constructs an empty set using the specified allocator object.</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></constructor>
<constructor specifiers="explicit"><parameter name="comp"><paramtype>const Compare &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Constructs an empty set using the specified comparison object.</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></constructor>
<constructor><parameter name="comp"><paramtype>const Compare &amp;</paramtype></parameter><parameter name="a"><paramtype>const allocator_type &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Constructs an empty set using the specified comparison object and allocator.</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></constructor>
@@ -3794,11 +3803,11 @@
<constructor><parameter name=""><paramtype><classname>ordered_unique_range_t</classname></paramtype></parameter><parameter name="il"><paramtype>std::initializer_list&lt; value_type &gt;</paramtype></parameter><parameter name="comp"><paramtype>const Compare &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Constructs an empty set using the specified comparison object and inserts elements from the ordered unique range [il.begin(), il.end()). This function is more efficient than the normal range creation for ordered ranges.</para><para><emphasis role="bold">Requires</emphasis>: [il.begin(), il.end()) must be ordered according to the predicate and must be unique values.</para><para><emphasis role="bold">Complexity</emphasis>: Linear in N.</para><para><emphasis role="bold">Note</emphasis>: Non-standard extension. </para></description></constructor>
<constructor><parameter name=""><paramtype><classname>ordered_unique_range_t</classname></paramtype></parameter><parameter name="il"><paramtype>std::initializer_list&lt; value_type &gt;</paramtype></parameter><parameter name="comp"><paramtype>const Compare &amp;</paramtype></parameter><parameter name="a"><paramtype>const allocator_type &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Constructs an empty set using the specified comparison object and allocator, and inserts elements from the ordered unique range [il.begin(), il.end()). This function is more efficient than the normal range creation for ordered ranges.</para><para><emphasis role="bold">Requires</emphasis>: [il.begin(), il.end()) must be ordered according to the predicate and must be unique values.</para><para><emphasis role="bold">Complexity</emphasis>: Linear in N.</para><para><emphasis role="bold">Note</emphasis>: Non-standard extension. </para></description></constructor>
<constructor><parameter name="x"><paramtype>const <classname>set</classname> &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Copy constructs a set.</para><para><emphasis role="bold">Complexity</emphasis>: Linear in x.size(). </para></description></constructor>
-<constructor cv="noexcept(boost::container::container_detail::is_nothrow_move_constructible&lt; Compare &gt;::value))"><parameter name="x"><paramtype><classname>set</classname> &amp;&amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Move constructs a set. Constructs *this using x's resources.</para><para><emphasis role="bold">Complexity</emphasis>: Constant.</para><para><emphasis role="bold">Postcondition</emphasis>: x is emptied. </para></description></constructor>
+<constructor cv="noexcept(boost::container::dtl::is_nothrow_move_constructible&lt; Compare &gt;::value))"><parameter name="x"><paramtype><classname>set</classname> &amp;&amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Move constructs a set. Constructs *this using x's resources.</para><para><emphasis role="bold">Complexity</emphasis>: Constant.</para><para><emphasis role="bold">Postcondition</emphasis>: x is emptied. </para></description></constructor>
<constructor><parameter name="x"><paramtype>const <classname>set</classname> &amp;</paramtype></parameter><parameter name="a"><paramtype>const allocator_type &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Copy constructs a set using the specified allocator.</para><para><emphasis role="bold">Complexity</emphasis>: Linear in x.size(). </para></description></constructor>
<constructor><parameter name="x"><paramtype><classname>set</classname> &amp;&amp;</paramtype></parameter><parameter name="a"><paramtype>const allocator_type &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Move constructs a set using the specified allocator. Constructs *this using x's resources.</para><para><emphasis role="bold">Complexity</emphasis>: Constant if a == x.get_allocator(), linear otherwise. </para></description></constructor>
<copy-assignment><type><classname>set</classname> &amp;</type><parameter name="x"><paramtype>const <classname>set</classname> &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Makes *this a copy of x.</para><para><emphasis role="bold">Complexity</emphasis>: Linear in x.size(). </para></description></copy-assignment>
-<copy-assignment cv="noexcept((allocator_traits_type::propagate_on_container_move_assignment::value||allocator_traits_type::is_always_equal::value)&amp;&amp;boost::container::container_detail::is_nothrow_move_assignable&lt; Compare &gt;::value))"><type><classname>set</classname> &amp;</type><parameter name="x"><paramtype><classname>set</classname> &amp;&amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: this-&gt;swap(x.get()).</para><para><emphasis role="bold">Throws</emphasis>: If allocator_traits_type::propagate_on_container_move_assignment is false and (allocation throws or value_type's move constructor throws)</para><para><emphasis role="bold">Complexity</emphasis>: Constant if allocator_traits_type:: propagate_on_container_move_assignment is true or this-&gt;get&gt;allocator() == x.get_allocator(). Linear otherwise. </para></description></copy-assignment>
+<copy-assignment cv="noexcept((allocator_traits_type::propagate_on_container_move_assignment::value||allocator_traits_type::is_always_equal::value)&amp;&amp;boost::container::dtl::is_nothrow_move_assignable&lt; Compare &gt;::value))"><type><classname>set</classname> &amp;</type><parameter name="x"><paramtype><classname>set</classname> &amp;&amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: this-&gt;swap(x.get()).</para><para><emphasis role="bold">Throws</emphasis>: If allocator_traits_type::propagate_on_container_move_assignment is false and (allocation throws or value_type's move constructor throws)</para><para><emphasis role="bold">Complexity</emphasis>: Constant if allocator_traits_type:: propagate_on_container_move_assignment is true or this-&gt;get&gt;allocator() == x.get_allocator(). Linear otherwise. </para></description></copy-assignment>
<copy-assignment><type><classname>set</classname> &amp;</type><parameter name="il"><paramtype>std::initializer_list&lt; value_type &gt;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Copy all elements from il to *this.</para><para><emphasis role="bold">Complexity</emphasis>: Linear in il.size(). </para></description></copy-assignment>
<method-group name="friend functions">
<method name="operator=="><type>friend bool</type><parameter name="x"><paramtype>const <classname>set</classname> &amp;</paramtype></parameter><parameter name="y"><paramtype>const <classname>set</classname> &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Returns true if x and y are equal</para><para><emphasis role="bold">Complexity</emphasis>: Linear to the number of elements in the container. </para></description></method>
@@ -3885,7 +3894,7 @@
<method name="erase"><type>iterator</type><parameter name="first"><paramtype>const_iterator</paramtype></parameter><parameter name="last"><paramtype>const_iterator</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Erases all the elements in the range [first, last).</para><para><emphasis role="bold">Returns</emphasis>: Returns last.</para><para><emphasis role="bold">Complexity</emphasis>: log(size())+N where N is the distance from first to last. </para></description></method>
<method name="extract"><type>node_type</type><parameter name="p"><paramtype>const_iterator</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Removes the element pointed to by "position".</para><para><emphasis role="bold">Returns</emphasis>: A node_type owning the element, otherwise an empty node_type.</para><para><emphasis role="bold">Complexity</emphasis>: Amortized constant. </para></description></method>
<method name="extract"><type>node_type</type><parameter name="x"><paramtype>const key_type &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Removes the first element in the container with key equivalent to k.</para><para><emphasis role="bold">Returns</emphasis>: A node_type owning the element if found, otherwise an empty node_type.</para><para><emphasis role="bold">Complexity</emphasis>: log(a.size()). </para></description></method>
-<method name="swap" cv="noexcept(allocator_traits_type::is_always_equal::value &amp;&amp;boost::container::container_detail::is_nothrow_swappable&lt; Compare &gt;::value))"><type>void</type><parameter name="x"><paramtype><classname>multiset</classname> &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Swaps the contents of *this and x.</para><para><emphasis role="bold">Throws</emphasis>: Nothing.</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></method>
+<method name="swap" cv="noexcept(allocator_traits_type::is_always_equal::value &amp;&amp;boost::container::dtl::is_nothrow_swappable&lt; Compare &gt;::value))"><type>void</type><parameter name="x"><paramtype><classname>multiset</classname> &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Swaps the contents of *this and x.</para><para><emphasis role="bold">Throws</emphasis>: Nothing.</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></method>
<method name="clear" cv="noexcept"><type>void</type><description><para><emphasis role="bold">Effects</emphasis>: erase(a.begin(),a.end()).</para><para><emphasis role="bold">Postcondition</emphasis>: size() == 0.</para><para><emphasis role="bold">Complexity</emphasis>: linear in size(). </para></description></method>
<method name="key_comp" cv="const"><type>key_compare</type><description><para><emphasis role="bold">Effects</emphasis>: Returns the comparison object out of which a was constructed.</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></method>
<method name="value_comp" cv="const"><type>value_compare</type><description><para><emphasis role="bold">Effects</emphasis>: Returns an object of value_compare constructed out of the comparison object.</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></method>
@@ -3900,7 +3909,7 @@
<method name="equal_range"><type>std::pair&lt; iterator, iterator &gt;</type><parameter name="x"><paramtype>const key_type &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Equivalent to std::make_pair(this-&gt;lower_bound(k), this-&gt;upper_bound(k)).</para><para><emphasis role="bold">Complexity</emphasis>: Logarithmic </para></description></method>
<method name="rebalance"><type>void</type><description><para><emphasis role="bold">Effects</emphasis>: Rebalances the tree. It's a no-op for Red-Black and AVL trees.</para><para><emphasis role="bold">Complexity</emphasis>: Linear </para></description></method>
</method-group>
-<constructor cv="noexcept(container_detail::is_nothrow_default_constructible&lt; Allocator &gt;::value &amp;&amp;container_detail::is_nothrow_default_constructible&lt; Compare &gt;::value))"><description><para><emphasis role="bold">Effects</emphasis>: Default constructs an empty set.</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></constructor>
+<constructor cv="noexcept(dtl::is_nothrow_default_constructible&lt; Allocator &gt;::value &amp;&amp;dtl::is_nothrow_default_constructible&lt; Compare &gt;::value))"><description><para><emphasis role="bold">Effects</emphasis>: Default constructs an empty set.</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></constructor>
<constructor specifiers="explicit"><parameter name="a"><paramtype>const allocator_type &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Constructs an empty set using the specified allocator object.</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></constructor>
<constructor specifiers="explicit"><parameter name="comp"><paramtype>const Compare &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Constructs an empty set using the specified comparison object.</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></constructor>
<constructor><parameter name="comp"><paramtype>const Compare &amp;</paramtype></parameter><parameter name="a"><paramtype>const allocator_type &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Constructs an empty set using the specified comparison object and allocator.</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></constructor>
@@ -3933,11 +3942,11 @@
<constructor><parameter name=""><paramtype><classname>ordered_range_t</classname></paramtype></parameter><parameter name="il"><paramtype>std::initializer_list&lt; value_type &gt;</paramtype></parameter><parameter name="comp"><paramtype>const Compare &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Constructs an empty set using the specified comparison object and inserts elements from the ordered unique range [il.begin(), il.end()). This function is more efficient than the normal range creation for ordered ranges.</para><para><emphasis role="bold">Requires</emphasis>: [il.begin(), il.end()) must be ordered according to the predicate and must be unique values.</para><para><emphasis role="bold">Complexity</emphasis>: Linear in N.</para><para><emphasis role="bold">Note</emphasis>: Non-standard extension. </para></description></constructor>
<constructor><parameter name=""><paramtype><classname>ordered_range_t</classname></paramtype></parameter><parameter name="il"><paramtype>std::initializer_list&lt; value_type &gt;</paramtype></parameter><parameter name="comp"><paramtype>const Compare &amp;</paramtype></parameter><parameter name="a"><paramtype>const allocator_type &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Constructs an empty set using the specified comparison object and allocator, and inserts elements from the ordered unique range [il.begin(), il.end()). This function is more efficient than the normal range creation for ordered ranges.</para><para><emphasis role="bold">Requires</emphasis>: [il.begin(), il.end()) must be ordered according to the predicate and must be unique values.</para><para><emphasis role="bold">Complexity</emphasis>: Linear in N.</para><para><emphasis role="bold">Note</emphasis>: Non-standard extension. </para></description></constructor>
<constructor><parameter name="x"><paramtype>const <classname>multiset</classname> &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Copy constructs a set.</para><para><emphasis role="bold">Complexity</emphasis>: Linear in x.size(). </para></description></constructor>
-<constructor cv="noexcept(boost::container::container_detail::is_nothrow_move_constructible&lt; Compare &gt;::value))"><parameter name="x"><paramtype><classname>multiset</classname> &amp;&amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Move constructs a set. Constructs *this using x's resources.</para><para><emphasis role="bold">Complexity</emphasis>: Constant.</para><para><emphasis role="bold">Postcondition</emphasis>: x is emptied. </para></description></constructor>
+<constructor cv="noexcept(boost::container::dtl::is_nothrow_move_constructible&lt; Compare &gt;::value))"><parameter name="x"><paramtype><classname>multiset</classname> &amp;&amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Move constructs a set. Constructs *this using x's resources.</para><para><emphasis role="bold">Complexity</emphasis>: Constant.</para><para><emphasis role="bold">Postcondition</emphasis>: x is emptied. </para></description></constructor>
<constructor><parameter name="x"><paramtype>const <classname>multiset</classname> &amp;</paramtype></parameter><parameter name="a"><paramtype>const allocator_type &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Copy constructs a set using the specified allocator.</para><para><emphasis role="bold">Complexity</emphasis>: Linear in x.size(). </para></description></constructor>
<constructor><parameter name="x"><paramtype><classname>multiset</classname> &amp;&amp;</paramtype></parameter><parameter name="a"><paramtype>const allocator_type &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Move constructs a set using the specified allocator. Constructs *this using x's resources.</para><para><emphasis role="bold">Complexity</emphasis>: Constant if a == x.get_allocator(), linear otherwise. </para></description></constructor>
<copy-assignment><type><classname>multiset</classname> &amp;</type><parameter name="x"><paramtype>const <classname>multiset</classname> &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Makes *this a copy of x.</para><para><emphasis role="bold">Complexity</emphasis>: Linear in x.size(). </para></description></copy-assignment>
-<copy-assignment cv="noexcept((allocator_traits_type::propagate_on_container_move_assignment::value||allocator_traits_type::is_always_equal::value)&amp;&amp;boost::container::container_detail::is_nothrow_move_assignable&lt; Compare &gt;::value))"><type><classname>multiset</classname> &amp;</type><parameter name="x"><paramtype><classname>multiset</classname> &amp;&amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: this-&gt;swap(x.get()).</para><para><emphasis role="bold">Throws</emphasis>: If allocator_traits_type::propagate_on_container_move_assignment is false and (allocation throws or value_type's move constructor throws)</para><para><emphasis role="bold">Complexity</emphasis>: Constant if allocator_traits_type:: propagate_on_container_move_assignment is true or this-&gt;get&gt;allocator() == x.get_allocator(). Linear otherwise. </para></description></copy-assignment>
+<copy-assignment cv="noexcept((allocator_traits_type::propagate_on_container_move_assignment::value||allocator_traits_type::is_always_equal::value)&amp;&amp;boost::container::dtl::is_nothrow_move_assignable&lt; Compare &gt;::value))"><type><classname>multiset</classname> &amp;</type><parameter name="x"><paramtype><classname>multiset</classname> &amp;&amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: this-&gt;swap(x.get()).</para><para><emphasis role="bold">Throws</emphasis>: If allocator_traits_type::propagate_on_container_move_assignment is false and (allocation throws or value_type's move constructor throws)</para><para><emphasis role="bold">Complexity</emphasis>: Constant if allocator_traits_type:: propagate_on_container_move_assignment is true or this-&gt;get&gt;allocator() == x.get_allocator(). Linear otherwise. </para></description></copy-assignment>
<copy-assignment><type><classname>multiset</classname> &amp;</type><parameter name="il"><paramtype>std::initializer_list&lt; value_type &gt;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Copy all elements from il to *this.</para><para><emphasis role="bold">Complexity</emphasis>: Linear in il.size(). </para></description></copy-assignment>
<method-group name="friend functions">
<method name="operator=="><type>friend bool</type><parameter name="x"><paramtype>const <classname>multiset</classname> &amp;</paramtype></parameter><parameter name="y"><paramtype>const <classname>multiset</classname> &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Returns true if x and y are equal</para><para><emphasis role="bold">Complexity</emphasis>: Linear to the number of elements in the container. </para></description></method>
@@ -4016,12 +4025,12 @@
<struct name="set_of"><template>
<template-type-parameter name="Key"/>
<template-type-parameter name="Compare"><default>std::less&lt;Key&gt;</default></template-type-parameter>
- <template-type-parameter name="Options"><default>tree_assoc_defaults</default></template-type-parameter>
+ <template-type-parameter name="Options"><default>void</default></template-type-parameter>
</template><description><para>A portable metafunction to obtain a set that uses a polymorphic allocator </para></description><typedef name="type"><type><classname>boost::container::set</classname>&lt; Key, Compare, <classname>polymorphic_allocator</classname>&lt; Key &gt;, Options &gt;</type></typedef>
</struct><struct name="multiset_of"><template>
<template-type-parameter name="Key"/>
<template-type-parameter name="Compare"><default>std::less&lt;Key&gt;</default></template-type-parameter>
- <template-type-parameter name="Options"><default>tree_assoc_defaults</default></template-type-parameter>
+ <template-type-parameter name="Options"><default>void</default></template-type-parameter>
</template><description><para>A portable metafunction to obtain a multiset that uses a polymorphic allocator </para></description><typedef name="type"><type><classname>boost::container::multiset</classname>&lt; Key, Compare, <classname>polymorphic_allocator</classname>&lt; Key &gt;, Options &gt;</type></typedef>
</struct><typedef name="set"><type><classname>boost::container::set</classname>&lt; Key, Compare, <classname>polymorphic_allocator</classname>&lt; Key &gt;, Options &gt;</type></typedef>
<typedef name="multiset"><type><classname>boost::container::multiset</classname>&lt; Key, Compare, <classname>polymorphic_allocator</classname>&lt; Key &gt;, Options &gt;</type></typedef>
@@ -4099,7 +4108,7 @@
<class name="slist"><template>
<template-type-parameter name="T"><purpose><para>The type of object that is stored in the list </para></purpose></template-type-parameter>
<template-type-parameter name="Allocator"><default><classname alt="boost::container::new_allocator">new_allocator</classname>&lt;T&gt;</default><purpose><para>The allocator used for all internal memory management </para></purpose></template-type-parameter>
- </template><description><para>An slist is a singly linked list: a list where each element is linked to the next element, but not to the previous element. That is, it is a Sequence that supports forward but not backward traversal, and (amortized) constant time insertion and removal of elements. Slists, like lists, have the important property that insertion and splicing do not invalidate iterators to list elements, and that even removal invalidates only the iterators that point to the elements that are removed. The ordering of iterators may be changed (that is, slist&lt;T&gt;::iterator might have a different predecessor or successor after a list operation than it did before), but the iterators themselves will not be invalidated or made to point to different elements unless that invalidation or mutation is explicit.</para><para>The main difference between slist and list is that list's iterators are bidirectional iterators, while slist's iterators are forward iterators. This means that slist is less versatile than list; frequently, however, bidirectional iterators are unnecessary. You should usually use slist unless you actually need the extra functionality of list, because singly linked lists are smaller and faster than double linked lists.</para><para>Important performance note: like every other Sequence, slist defines the member functions insert and erase. Using these member functions carelessly, however, can result in disastrously slow programs. The problem is that insert's first argument is an iterator p, and that it inserts the new element(s) before p. This means that insert must find the iterator just before p; this is a constant-time operation for list, since list has bidirectional iterators, but for slist it must find that iterator by traversing the list from the beginning up to p. In other words: insert and erase are slow operations anywhere but near the beginning of the slist.</para><para>Slist provides the member functions insert_after and erase_after, which are constant time operations: you should always use insert_after and erase_after whenever possible. If you find that insert_after and erase_after aren't adequate for your needs, and that you often need to use insert and erase in the middle of the list, then you should probably use list instead of slist.</para><para>
+ </template><inherit access="protected">dtl::node_alloc_holder&lt; Allocator, dtl::intrusive_slist_type&lt; Allocator &gt;::type &gt;</inherit><description><para>An slist is a singly linked list: a list where each element is linked to the next element, but not to the previous element. That is, it is a Sequence that supports forward but not backward traversal, and (amortized) constant time insertion and removal of elements. Slists, like lists, have the important property that insertion and splicing do not invalidate iterators to list elements, and that even removal invalidates only the iterators that point to the elements that are removed. The ordering of iterators may be changed (that is, slist&lt;T&gt;::iterator might have a different predecessor or successor after a list operation than it did before), but the iterators themselves will not be invalidated or made to point to different elements unless that invalidation or mutation is explicit.</para><para>The main difference between slist and list is that list's iterators are bidirectional iterators, while slist's iterators are forward iterators. This means that slist is less versatile than list; frequently, however, bidirectional iterators are unnecessary. You should usually use slist unless you actually need the extra functionality of list, because singly linked lists are smaller and faster than double linked lists.</para><para>Important performance note: like every other Sequence, slist defines the member functions insert and erase. Using these member functions carelessly, however, can result in disastrously slow programs. The problem is that insert's first argument is an iterator p, and that it inserts the new element(s) before p. This means that insert must find the iterator just before p; this is a constant-time operation for list, since list has bidirectional iterators, but for slist it must find that iterator by traversing the list from the beginning up to p. In other words: insert and erase are slow operations anywhere but near the beginning of the slist.</para><para>Slist provides the member functions insert_after and erase_after, which are constant time operations: you should always use insert_after and erase_after whenever possible. If you find that insert_after and erase_after aren't adequate for your needs, and that you often need to use insert and erase in the middle of the list, then you should probably use list instead of slist.</para><para>
</para></description><typedef name="value_type"><type>T</type></typedef>
<typedef name="pointer"><type>::<classname>boost::container::allocator_traits</classname>&lt; Allocator &gt;::pointer</type></typedef>
<typedef name="const_pointer"><type>::<classname>boost::container::allocator_traits</classname>&lt; Allocator &gt;::const_pointer</type></typedef>
@@ -4206,7 +4215,7 @@
<method name="splice" cv="noexcept"><type>void</type><parameter name="p"><paramtype>const_iterator</paramtype></parameter><parameter name="x"><paramtype><classname>slist</classname> &amp;</paramtype></parameter><parameter name="first"><paramtype>const_iterator</paramtype></parameter><parameter name="last"><paramtype>const_iterator</paramtype></parameter><description><para><emphasis role="bold">Requires</emphasis>: p must point to an element contained by this list. first and last must point to elements contained in list x.</para><para><emphasis role="bold">Effects</emphasis>: Transfers the range pointed by first and last from list x to this list, before the element pointed by p. No destructors or copy constructors are called. this' allocator and x's allocator shall compare equal.</para><para><emphasis role="bold">Throws</emphasis>: Nothing</para><para><emphasis role="bold">Complexity</emphasis>: Linear in distance(begin(), p), in distance(x.begin(), first), and in distance(first, last).</para><para><emphasis role="bold">Note</emphasis>: Iterators of values obtained from list x now point to elements of this list. Iterators of this list and all the references are not invalidated. </para></description></method>
<method name="splice" cv="noexcept"><type>void</type><parameter name="p"><paramtype>const_iterator</paramtype></parameter><parameter name="x"><paramtype><classname>slist</classname> &amp;&amp;</paramtype></parameter><parameter name="first"><paramtype>const_iterator</paramtype></parameter><parameter name="last"><paramtype>const_iterator</paramtype></parameter><description><para><emphasis role="bold">Requires</emphasis>: p must point to an element contained by this list. first and last must point to elements contained in list x. this' allocator and x's allocator shall compare equal</para><para><emphasis role="bold">Effects</emphasis>: Transfers the range pointed by first and last from list x to this list, before the element pointed by p. No destructors or copy constructors are called.</para><para><emphasis role="bold">Throws</emphasis>: Nothing</para><para><emphasis role="bold">Complexity</emphasis>: Linear in distance(begin(), p), in distance(x.begin(), first), and in distance(first, last).</para><para><emphasis role="bold">Note</emphasis>: Iterators of values obtained from list x now point to elements of this list. Iterators of this list and all the references are not invalidated. </para></description></method>
</method-group>
-<constructor cv="noexcept(container_detail::is_nothrow_default_constructible&lt; Allocator &gt;::value))"><description><para><emphasis role="bold">Effects</emphasis>: Constructs a list taking the allocator as parameter.</para><para><emphasis role="bold">Throws</emphasis>: If allocator_type's copy constructor throws.</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></constructor>
+<constructor cv="noexcept(dtl::is_nothrow_default_constructible&lt; Allocator &gt;::value))"><description><para><emphasis role="bold">Effects</emphasis>: Constructs a list taking the allocator as parameter.</para><para><emphasis role="bold">Throws</emphasis>: If allocator_type's copy constructor throws.</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></constructor>
<constructor specifiers="explicit" cv="noexcept"><parameter name="a"><paramtype>const allocator_type &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Constructs a list taking the allocator as parameter.</para><para><emphasis role="bold">Throws</emphasis>: Nothing</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></constructor>
<constructor specifiers="explicit"><parameter name="n"><paramtype>size_type</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Constructs a list and inserts n value-initialized value_types.</para><para><emphasis role="bold">Throws</emphasis>: If allocator_type's default constructor throws or T's default or copy constructor throws.</para><para><emphasis role="bold">Complexity</emphasis>: Linear to n. </para></description></constructor>
<constructor><parameter name="n"><paramtype>size_type</paramtype></parameter><parameter name="a"><paramtype>const allocator_type &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Constructs a list that will use a copy of allocator a and inserts n copies of value.</para><para><emphasis role="bold">Throws</emphasis>: If allocator_type's default constructor throws or T's default or copy constructor throws.</para><para><emphasis role="bold">Complexity</emphasis>: Linear to n. </para></description></constructor>
@@ -4471,7 +4480,7 @@ void some_function()
</para></description><method-group name="public member functions">
<method name="swap"><type>void</type><parameter name="other"><paramtype><classname>small_vector</classname> &amp;</paramtype></parameter></method>
</method-group>
-<constructor cv="noexcept(container_detail::is_nothrow_default_constructible&lt; Allocator &gt;::value))"/>
+<constructor cv="noexcept(dtl::is_nothrow_default_constructible&lt; Allocator &gt;::value))"/>
<constructor specifiers="explicit"><parameter name="a"><paramtype>const <classname>allocator_type</classname> &amp;</paramtype></parameter></constructor>
<constructor specifiers="explicit"><parameter name="n"><paramtype>size_type</paramtype></parameter></constructor>
<constructor><parameter name="n"><paramtype>size_type</paramtype></parameter><parameter name="a"><paramtype>const <classname>allocator_type</classname> &amp;</paramtype></parameter></constructor>
@@ -4717,7 +4726,7 @@ void some_function()
<method name="swap" cv="noexcept(allocator_traits_type::propagate_on_container_swap::value||allocator_traits_type::is_always_equal::value))"><type>void</type><parameter name="x"><paramtype><classname>stable_vector</classname> &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Swaps the contents of *this and x.</para><para><emphasis role="bold">Throws</emphasis>: Nothing.</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></method>
<method name="clear" cv="noexcept"><type>void</type><description><para><emphasis role="bold">Effects</emphasis>: Erases all the elements of the <classname alt="boost::container::stable_vector">stable_vector</classname>.</para><para><emphasis role="bold">Throws</emphasis>: Nothing.</para><para><emphasis role="bold">Complexity</emphasis>: Linear to the number of elements in the <classname alt="boost::container::stable_vector">stable_vector</classname>. </para></description></method>
</method-group>
-<constructor cv="noexcept(container_detail::is_nothrow_default_constructible&lt; Allocator &gt;::value))"><description><para><emphasis role="bold">Effects</emphasis>: Default constructs a <classname alt="boost::container::stable_vector">stable_vector</classname>.</para><para><emphasis role="bold">Throws</emphasis>: If allocator_type's default constructor throws.</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></constructor>
+<constructor cv="noexcept(dtl::is_nothrow_default_constructible&lt; Allocator &gt;::value))"><description><para><emphasis role="bold">Effects</emphasis>: Default constructs a <classname alt="boost::container::stable_vector">stable_vector</classname>.</para><para><emphasis role="bold">Throws</emphasis>: If allocator_type's default constructor throws.</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></constructor>
<constructor specifiers="explicit" cv="noexcept"><parameter name="al"><paramtype>const allocator_type &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Constructs a <classname alt="boost::container::stable_vector">stable_vector</classname> taking the allocator as parameter.</para><para><emphasis role="bold">Throws</emphasis>: Nothing</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></constructor>
<constructor specifiers="explicit"><parameter name="n"><paramtype>size_type</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Constructs a <classname alt="boost::container::stable_vector">stable_vector</classname> and inserts n value initialized values.</para><para><emphasis role="bold">Throws</emphasis>: If allocator_type's default constructor throws or T's default or copy constructor throws.</para><para><emphasis role="bold">Complexity</emphasis>: Linear to n. </para></description></constructor>
<constructor><parameter name="n"><paramtype>size_type</paramtype></parameter><parameter name=""><paramtype><classname>default_init_t</classname></paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Constructs a <classname alt="boost::container::stable_vector">stable_vector</classname> and inserts n default initialized values.</para><para><emphasis role="bold">Throws</emphasis>: If allocator_type's default constructor throws or T's default or copy constructor throws.</para><para><emphasis role="bold">Complexity</emphasis>: Linear to n.</para><para><emphasis role="bold">Note</emphasis>: Non-standard extension </para></description></constructor>
@@ -4888,7 +4897,7 @@ void some_function()
<class name="static_vector"><template>
<template-type-parameter name="Value"><purpose><para>The type of element that will be stored. </para></purpose></template-type-parameter>
<template-nontype-parameter name="Capacity"><type>std::size_t</type><purpose><para>The maximum number of elements <classname alt="boost::container::static_vector">static_vector</classname> can store, fixed at compile time. </para></purpose></template-nontype-parameter>
- </template><purpose>A variable-size array container with fixed capacity. </purpose><description><para><classname alt="boost::container::static_vector">static_vector</classname> is a sequence container like <classname alt="boost::container::vector">boost::container::vector</classname> with contiguous storage that can change in size, along with the static allocation, low overhead, and fixed capacity of boost::array.</para><para>A <classname alt="boost::container::static_vector">static_vector</classname> is a sequence that supports random access to elements, constant time insertion and removal of elements at the end, and linear time insertion and removal of elements at the beginning or in the middle. The number of elements in a <classname alt="boost::container::static_vector">static_vector</classname> may vary dynamically up to a fixed capacity because elements are stored within the object itself similarly to an array. However, objects are initialized as they are inserted into <classname alt="boost::container::static_vector">static_vector</classname> unlike C arrays or std::array which must construct all elements on instantiation. The behavior of <classname alt="boost::container::static_vector">static_vector</classname> enables the use of statically allocated elements in cases with complex object lifetime requirements that would otherwise not be trivially possible.</para><para><formalpara><title>Error Handling</title><para>Insertion beyond the capacity result in throwing std::bad_alloc() if exceptions are enabled or calling throw_bad_alloc() if not enabled.</para></formalpara>
+ </template><inherit access="public">boost::container::vector&lt; Value, dtl::static_storage_allocator&lt; Value, Capacity &gt; &gt;</inherit><purpose>A variable-size array container with fixed capacity. </purpose><description><para><classname alt="boost::container::static_vector">static_vector</classname> is a sequence container like <classname alt="boost::container::vector">boost::container::vector</classname> with contiguous storage that can change in size, along with the static allocation, low overhead, and fixed capacity of boost::array.</para><para>A <classname alt="boost::container::static_vector">static_vector</classname> is a sequence that supports random access to elements, constant time insertion and removal of elements at the end, and linear time insertion and removal of elements at the beginning or in the middle. The number of elements in a <classname alt="boost::container::static_vector">static_vector</classname> may vary dynamically up to a fixed capacity because elements are stored within the object itself similarly to an array. However, objects are initialized as they are inserted into <classname alt="boost::container::static_vector">static_vector</classname> unlike C arrays or std::array which must construct all elements on instantiation. The behavior of <classname alt="boost::container::static_vector">static_vector</classname> enables the use of statically allocated elements in cases with complex object lifetime requirements that would otherwise not be trivially possible.</para><para><formalpara><title>Error Handling</title><para>Insertion beyond the capacity result in throwing std::bad_alloc() if exceptions are enabled or calling throw_bad_alloc() if not enabled.</para></formalpara>
std::out_of_range is thrown if out of bound access is performed in <computeroutput>at()</computeroutput> if exceptions are enabled, throw_out_of_range() if not enabled.</para><para>
</para></description><typedef name="value_type"><purpose>The type of elements stored in the container. </purpose><type>base_t::value_type</type></typedef>
<typedef name="size_type"><purpose>The unsigned integral type used by the container. </purpose><type>base_t::size_type</type></typedef>
@@ -5247,7 +5256,7 @@ std::out_of_range is thrown if out of bound access is performed in <computeroutp
<formalpara><title>Complexity</title><para>Linear O(N). </para></formalpara>
</para></description></constructor>
<constructor><parameter name="other"><paramtype><classname>static_vector</classname> const &amp;</paramtype></parameter><parameter name=""><paramtype>const allocator_type &amp;</paramtype></parameter></constructor>
-<constructor cv="noexcept(boost::container::container_detail::is_nothrow_move_constructible&lt; value_type &gt;::value))"><parameter name="other"><paramtype><classname>static_vector</classname> &amp;&amp;</paramtype></parameter><parameter name=""><paramtype>const allocator_type &amp;</paramtype></parameter></constructor>
+<constructor cv="noexcept(boost::container::dtl::is_nothrow_move_constructible&lt; value_type &gt;::value))"><parameter name="other"><paramtype><classname>static_vector</classname> &amp;&amp;</paramtype></parameter><parameter name=""><paramtype>const allocator_type &amp;</paramtype></parameter></constructor>
<constructor specifiers="explicit"><parameter name=""><paramtype>const allocator_type &amp;</paramtype></parameter></constructor>
<constructor><template>
<template-nontype-parameter name="C"><type>std::size_t</type></template-nontype-parameter>
@@ -5256,7 +5265,7 @@ std::out_of_range is thrown if out of bound access is performed in <computeroutp
<formalpara><title>Throws</title><para>If Value's copy constructor throws.</para></formalpara>
<formalpara><title>Complexity</title><para>Linear O(N). </para></formalpara>
</para></description><requires><para><computeroutput>other.size() &lt;= capacity()</computeroutput>.</para></requires></constructor>
-<constructor cv="noexcept(boost::container::container_detail::is_nothrow_move_constructible&lt; value_type &gt;::value))"><parameter name="other"><paramtype><classname>static_vector</classname> &amp;&amp;</paramtype><description><para>The <classname alt="boost::container::static_vector">static_vector</classname> which content will be moved to this one.</para></description></parameter><purpose>Move constructor. Moves Values stored in the other <classname alt="boost::container::static_vector">static_vector</classname> to this one. </purpose><description><para>
+<constructor cv="noexcept(boost::container::dtl::is_nothrow_move_constructible&lt; value_type &gt;::value))"><parameter name="other"><paramtype><classname>static_vector</classname> &amp;&amp;</paramtype><description><para>The <classname alt="boost::container::static_vector">static_vector</classname> which content will be moved to this one.</para></description></parameter><purpose>Move constructor. Moves Values stored in the other <classname alt="boost::container::static_vector">static_vector</classname> to this one. </purpose><description><para>
<formalpara><title>Throws</title><para><itemizedlist>
<listitem><para>If <computeroutput>has_nothrow_move&lt;Value&gt;::value</computeroutput> is <computeroutput>true</computeroutput> and Value's move constructor throws. </para></listitem>
<listitem><para>If <computeroutput>has_nothrow_move&lt;Value&gt;::value</computeroutput> is <computeroutput>false</computeroutput> and Value's copy constructor throws.</para></listitem>
@@ -5438,7 +5447,7 @@ std::out_of_range is thrown if out of bound access is performed in <computeroutp
<template-type-parameter name="CharT"><purpose><para>The type of character it contains. </para></purpose></template-type-parameter>
<template-type-parameter name="Traits"><default>std::char_traits&lt;CharT&gt;</default><purpose><para>The Character Traits type, which encapsulates basic character operations </para></purpose></template-type-parameter>
<template-type-parameter name="Allocator"><default><classname alt="boost::container::new_allocator">new_allocator</classname>&lt;CharT&gt;</default><purpose><para>The allocator, used for internal memory management. </para></purpose></template-type-parameter>
- </template><description><para>The <classname alt="boost::container::basic_string">basic_string</classname> class represents a Sequence of characters. It contains all the usual operations of a Sequence, and, additionally, it contains standard string operations such as search and concatenation.</para><para>The <classname alt="boost::container::basic_string">basic_string</classname> class is parameterized by character type, and by that type's Character Traits.</para><para>This class has performance characteristics very much like vector&lt;&gt;, meaning, for example, that it does not perform reference-count or copy-on-write, and that concatenation of two strings is an O(N) operation.</para><para>Some of <classname alt="boost::container::basic_string">basic_string</classname>'s member functions use an unusual method of specifying positions and ranges. In addition to the conventional method using iterators, many of <classname alt="boost::container::basic_string">basic_string</classname>'s member functions use a single value pos of type size_type to represent a position (in which case the position is begin() + pos, and many of <classname alt="boost::container::basic_string">basic_string</classname>'s member functions use two values, pos and n, to represent a range. In that case pos is the beginning of the range and n is its size. That is, the range is [begin() + pos, begin() + pos + n).</para><para>Note that the C++ standard does not specify the complexity of <classname alt="boost::container::basic_string">basic_string</classname> operations. In this implementation, <classname alt="boost::container::basic_string">basic_string</classname> has performance characteristics very similar to those of vector: access to a single character is O(1), while copy and concatenation are O(N).</para><para>In this implementation, begin(), end(), rbegin(), rend(), operator[], c_str(), and data() do not invalidate iterators. In this implementation, iterators are only invalidated by member functions that explicitly change the string's contents.</para><para>
+ </template><inherit access="private">dtl::basic_string_base&lt; Allocator &gt;</inherit><description><para>The <classname alt="boost::container::basic_string">basic_string</classname> class represents a Sequence of characters. It contains all the usual operations of a Sequence, and, additionally, it contains standard string operations such as search and concatenation.</para><para>The <classname alt="boost::container::basic_string">basic_string</classname> class is parameterized by character type, and by that type's Character Traits.</para><para>This class has performance characteristics very much like vector&lt;&gt;, meaning, for example, that it does not perform reference-count or copy-on-write, and that concatenation of two strings is an O(N) operation.</para><para>Some of <classname alt="boost::container::basic_string">basic_string</classname>'s member functions use an unusual method of specifying positions and ranges. In addition to the conventional method using iterators, many of <classname alt="boost::container::basic_string">basic_string</classname>'s member functions use a single value pos of type size_type to represent a position (in which case the position is begin() + pos, and many of <classname alt="boost::container::basic_string">basic_string</classname>'s member functions use two values, pos and n, to represent a range. In that case pos is the beginning of the range and n is its size. That is, the range is [begin() + pos, begin() + pos + n).</para><para>Note that the C++ standard does not specify the complexity of <classname alt="boost::container::basic_string">basic_string</classname> operations. In this implementation, <classname alt="boost::container::basic_string">basic_string</classname> has performance characteristics very similar to those of vector: access to a single character is O(1), while copy and concatenation are O(N).</para><para>In this implementation, begin(), end(), rbegin(), rend(), operator[], c_str(), and data() do not invalidate iterators. In this implementation, iterators are only invalidated by member functions that explicitly change the string's contents.</para><para>
</para></description><typedef name="traits_type"><type>Traits</type></typedef>
<typedef name="value_type"><type>CharT</type></typedef>
<typedef name="pointer"><type>::<classname>boost::container::allocator_traits</classname>&lt; Allocator &gt;::pointer</type></typedef>
@@ -5633,7 +5642,7 @@ std::out_of_range is thrown if out of bound access is performed in <computeroutp
<method name="compare" cv="const"><type>int</type><parameter name="pos1"><paramtype>size_type</paramtype></parameter><parameter name="n1"><paramtype>size_type</paramtype></parameter><parameter name="s"><paramtype>const CharT *</paramtype></parameter><parameter name="n2"><paramtype>size_type</paramtype></parameter><description><para><emphasis role="bold">Requires</emphasis>: pos1 &gt; size() and s points to an array of at least n2 elements of CharT.</para><para><emphasis role="bold">Throws</emphasis>: out_of_range if pos1 &gt; size()</para><para><emphasis role="bold">Returns</emphasis>: basic_string(*this, pos, n1).compare(basic_string(s, n2)). </para></description></method>
<method name="compare" cv="const"><type>int</type><parameter name="pos1"><paramtype>size_type</paramtype></parameter><parameter name="n1"><paramtype>size_type</paramtype></parameter><parameter name="s"><paramtype>const CharT *</paramtype></parameter><description><para><emphasis role="bold">Requires</emphasis>: pos1 &gt; size() and s points to an array of at least traits::length(s) + 1 elements of CharT.</para><para><emphasis role="bold">Throws</emphasis>: out_of_range if pos1 &gt; size()</para><para><emphasis role="bold">Returns</emphasis>: basic_string(*this, pos, n1).compare(basic_string(s, n2)). </para></description></method>
</method-group>
-<constructor cv="noexcept(container_detail::is_nothrow_default_constructible&lt; Allocator &gt;::value))"><description><para><emphasis role="bold">Effects</emphasis>: Default constructs a <classname alt="boost::container::basic_string">basic_string</classname>.</para><para><emphasis role="bold">Throws</emphasis>: If allocator_type's default constructor throws. </para></description></constructor>
+<constructor cv="noexcept(dtl::is_nothrow_default_constructible&lt; Allocator &gt;::value))"><description><para><emphasis role="bold">Effects</emphasis>: Default constructs a <classname alt="boost::container::basic_string">basic_string</classname>.</para><para><emphasis role="bold">Throws</emphasis>: If allocator_type's default constructor throws. </para></description></constructor>
<constructor specifiers="explicit" cv="noexcept"><parameter name="a"><paramtype>const allocator_type &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Constructs a <classname alt="boost::container::basic_string">basic_string</classname> taking the allocator as parameter.</para><para><emphasis role="bold">Throws</emphasis>: Nothing </para></description></constructor>
<constructor><parameter name="s"><paramtype>const <classname>basic_string</classname> &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Copy constructs a <classname alt="boost::container::basic_string">basic_string</classname>.</para><para><emphasis role="bold">Postcondition</emphasis>: x == *this.</para><para><emphasis role="bold">Throws</emphasis>: If allocator_type's default constructor or allocation throws. </para></description></constructor>
<constructor specifiers="explicit"><template>
@@ -6113,7 +6122,7 @@ std::out_of_range is thrown if out of bound access is performed in <computeroutp
</struct><struct name="uses_allocator"><template>
<template-type-parameter name="T"/>
<template-type-parameter name="Allocator"/>
- </template><description><para><emphasis role="bold">Remark</emphasis>: Automatically detects whether T has a nested allocator_type that is convertible from Allocator. Meets the BinaryTypeTrait requirements ([meta.rqmts] 20.4.1). A program may specialize this type to define uses_allocator&lt;X&gt;::value as true for a T of user-defined type if T does not have a nested allocator_type but is nonetheless constructible using the specified Allocator where either: the first argument of a constructor has type allocator_arg_t and the second argument has type Alloc or the last argument of a constructor has type Alloc.</para><para><emphasis role="bold">Result</emphasis>: uses_allocator&lt;T, Allocator&gt;::value== true if a type T::allocator_type exists and either is_convertible&lt;Alloc, T::allocator_type&gt;::value != false or T::allocator_type is an alias <computeroutput><classname alt="boost::container::erased_type">erased_type</classname></computeroutput>. False otherwise. </para></description></struct>
+ </template><inherit access="public">dtl::uses_allocator_imp&lt; T, Allocator &gt;</inherit><description><para><emphasis role="bold">Remark</emphasis>: Automatically detects whether T has a nested allocator_type that is convertible from Allocator. Meets the BinaryTypeTrait requirements ([meta.rqmts] 20.4.1). A program may specialize this type to define uses_allocator&lt;X&gt;::value as true for a T of user-defined type if T does not have a nested allocator_type but is nonetheless constructible using the specified Allocator where either: the first argument of a constructor has type allocator_arg_t and the second argument has type Alloc or the last argument of a constructor has type Alloc.</para><para><emphasis role="bold">Result</emphasis>: uses_allocator&lt;T, Allocator&gt;::value== true if a type T::allocator_type exists and either is_convertible&lt;Alloc, T::allocator_type&gt;::value != false or T::allocator_type is an alias <computeroutput><classname alt="boost::container::erased_type">erased_type</classname></computeroutput>. False otherwise. </para></description></struct>
@@ -6246,6 +6255,7 @@ std::out_of_range is thrown if out of bound access is performed in <computeroutp
<class name="vector"><template>
<template-type-parameter name="T"><purpose><para>The type of object that is stored in the vector </para></purpose></template-type-parameter>
<template-type-parameter name="Allocator"><default><classname alt="boost::container::new_allocator">new_allocator</classname>&lt;T&gt;</default><purpose><para>The allocator used for all internal memory management </para></purpose></template-type-parameter>
+ <template-type-parameter name="Options"><default>void</default><purpose><para>A type produced from <computeroutput><classname alt="boost::container::vector_options">boost::container::vector_options</classname></computeroutput>. </para></purpose></template-type-parameter>
</template><description><para>A vector is a sequence that supports random access to elements, constant time insertion and removal of elements at the end, and linear time insertion and removal of elements at the beginning or in the middle. The number of elements in a vector may vary dynamically; memory management is automatic.</para><para>
</para></description><typedef name="value_type"><type>T</type></typedef>
<typedef name="pointer"><type>::<classname>boost::container::allocator_traits</classname>&lt; Allocator &gt;::pointer</type></typedef>
@@ -6328,10 +6338,10 @@ std::out_of_range is thrown if out of bound access is performed in <computeroutp
<method name="pop_back" cv="noexcept"><type>void</type><description><para><emphasis role="bold">Effects</emphasis>: Removes the last element from the container.</para><para><emphasis role="bold">Throws</emphasis>: Nothing.</para><para><emphasis role="bold">Complexity</emphasis>: Constant time. </para></description></method>
<method name="erase"><type>iterator</type><parameter name="position"><paramtype>const_iterator</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Erases the element at position pos.</para><para><emphasis role="bold">Throws</emphasis>: Nothing.</para><para><emphasis role="bold">Complexity</emphasis>: Linear to the elements between pos and the last element. Constant if pos is the last element. </para></description></method>
<method name="erase"><type>iterator</type><parameter name="first"><paramtype>const_iterator</paramtype></parameter><parameter name="last"><paramtype>const_iterator</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Erases the elements pointed by [first, last).</para><para><emphasis role="bold">Throws</emphasis>: Nothing.</para><para><emphasis role="bold">Complexity</emphasis>: Linear to the distance between first and last plus linear to the elements between pos and the last element. </para></description></method>
-<method name="swap" cv="noexcept(((allocator_traits_type::propagate_on_container_swap::value||allocator_traits_type::is_always_equal::value)&amp;&amp;!container_detail::is_version&lt; Allocator, 0 &gt;::value)))"><type>void</type><parameter name="x"><paramtype><classname>vector</classname> &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Swaps the contents of *this and x.</para><para><emphasis role="bold">Throws</emphasis>: Nothing.</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></method>
+<method name="swap" cv="noexcept(((allocator_traits_type::propagate_on_container_swap::value||allocator_traits_type::is_always_equal::value)&amp;&amp;!dtl::is_version&lt; Allocator, 0 &gt;::value)))"><type>void</type><parameter name="x"><paramtype><classname>vector</classname> &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Swaps the contents of *this and x.</para><para><emphasis role="bold">Throws</emphasis>: Nothing.</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></method>
<method name="clear" cv="noexcept"><type>void</type><description><para><emphasis role="bold">Effects</emphasis>: Erases all the elements of the vector.</para><para><emphasis role="bold">Throws</emphasis>: Nothing.</para><para><emphasis role="bold">Complexity</emphasis>: Linear to the number of elements in the container. </para></description></method>
</method-group>
-<constructor cv="noexcept(container_detail::is_nothrow_default_constructible&lt; Allocator &gt;::value))"><description><para><emphasis role="bold">Effects</emphasis>: Constructs a vector taking the allocator as parameter.</para><para><emphasis role="bold">Throws</emphasis>: Nothing.</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></constructor>
+<constructor cv="noexcept(dtl::is_nothrow_default_constructible&lt; Allocator &gt;::value))"><description><para><emphasis role="bold">Effects</emphasis>: Constructs a vector taking the allocator as parameter.</para><para><emphasis role="bold">Throws</emphasis>: Nothing.</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></constructor>
<constructor specifiers="explicit" cv="noexcept"><parameter name="a"><paramtype>const allocator_type &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Constructs a vector taking the allocator as parameter.</para><para><emphasis role="bold">Throws</emphasis>: Nothing</para><para><emphasis role="bold">Complexity</emphasis>: Constant. </para></description></constructor>
<constructor specifiers="explicit"><parameter name="n"><paramtype>size_type</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Constructs a vector and inserts n value initialized values.</para><para><emphasis role="bold">Throws</emphasis>: If allocator_type's allocation throws or T's value initialization throws.</para><para><emphasis role="bold">Complexity</emphasis>: Linear to n. </para></description></constructor>
<constructor specifiers="explicit"><parameter name="n"><paramtype>size_type</paramtype></parameter><parameter name="a"><paramtype>const allocator_type &amp;</paramtype></parameter><description><para><emphasis role="bold">Effects</emphasis>: Constructs a vector that will use a copy of allocator a and inserts n value initialized values.</para><para><emphasis role="bold">Throws</emphasis>: If allocator_type's allocation throws or T's value initialization throws.</para><para><emphasis role="bold">Complexity</emphasis>: Linear to n. </para></description></constructor>
diff --git a/libs/container/doc/container.qbk b/libs/container/doc/container.qbk
index 4d232fa2ac..cb45341967 100644
--- a/libs/container/doc/container.qbk
+++ b/libs/container/doc/container.qbk
@@ -8,7 +8,7 @@
[library Boost.Container
[quickbook 1.5]
[authors [Gaztanaga, Ion]]
- [copyright 2009-2015 Ion Gaztanaga]
+ [copyright 2009-2017 Ion Gaztanaga]
[id container]
[dirname container]
[purpose Containers library]
@@ -31,10 +31,13 @@ that don't comply with the latest C++ standard.
In short, what does [*Boost.Container] offer?
-* Move semantics are implemented, including move emulation for pre-C++11 compilers.
-* New advanced features (e.g. placement insertion, recursive containers) are present.
+* Emplacement and move semantics are implemented, including emulation for pre-C++11 compilers.
+* Polymorphic allocators and memory resources, including implementation and emulation for pre-C++17 compilers
+* New advanced features (e.g. recursive containers, configuration options for containers) are present.
* Containers support stateful allocators and are compatible with [*Boost.Interprocess]
(they can be safely placed in shared memory).
+* Users obtain a more uniform performance across all plataforms,
+ including [link container.main_features.scary_iterators SCARY iterators].
* The library offers new useful containers:
* [classref boost::container::flat_map flat_map],
[classref boost::container::flat_set flat_set],
@@ -44,6 +47,12 @@ In short, what does [*Boost.Container] offer?
searches.
* [classref boost::container::stable_vector stable_vector]: a std::list and std::vector hybrid
container: vector-like random-access iterators and list-like iterator stability in insertions and erasures.
+ * [classref boost::container::static_vector static_vector ]: a vector-like container that internally embeds
+ (statically allocates) all needed memory up to the maximum capacity. Maximum capacity can't be increased and
+ it's specified at compile time.
+ * [classref boost::container::small_vector small_vector ]: a vector-like container that internally embeds
+ (statically allocates) a minimum amount of memory, but dynamically allocates elements when capacity
+ has to be increased. This minimum capacity is specified at compile time.
* [classref boost::container::slist slist]: the classic pre-standard singly linked list implementation
offering constant-time `size()`. Note that C++11 `forward_list` has no `size()`.
@@ -52,8 +61,8 @@ In short, what does [*Boost.Container] offer?
There is no need to compile [*Boost.Container], since it's a header-only library,
just include your Boost header directory in your compiler include path *except if you use*:
-* [link container.extended_functionality.extended_allocators Extended Allocators]
-* Some [link container.extended_functionality.polymorphic_memory_resources Polymorphic Memory Resources] classes.
+* [link container.extended_allocators Extended Allocators]
+* Some [link container.polymorphic_memory_resources Polymorphic Memory Resources] classes.
Those exceptions are are implemented as a separately compiled library, so in those cases you must install binaries
in a location that can be found by your linker.
@@ -159,9 +168,11 @@ unless specifically allowed for that component]].
Fortunately all [*Boost.Container] containers except
[classref boost::container::static_vector static_vector] and
+[classref boost::container::small_vector small_vector] and
[classref boost::container::basic_string basic_string] are designed to support incomplete types.
-[classref boost::container::static_vector static_vector] is special because
-it statically allocates memory for `value_type` and this requires complete types and
+[classref boost::container::static_vector static_vector] and
+[classref boost::container::small_vector small_vector] are special because
+they statically allocates memory for `value_type` and this requires complete types.
[classref boost::container::basic_string basic_string] implements Small String Optimization which
also requires complete types.
@@ -311,7 +322,7 @@ can a stable design approach the behavior of `vector` (random access iterators,
insertion/deletion, minimal memory overhead, etc.)?
The following image describes the layout of a possible data structure upon which to base the design of a stable vector:
-[$../../libs/container/doc/html/images/stable_vector.png [width 50%] [align center] ]
+[$../../libs/container/doc/images/stable_vector.png [width 50%] [align center] ]
Each element is stored in its own separate node. All the nodes are referenced from a contiguous array of pointers, but
also every node contains an "up" pointer referring back to the associated array cell. This up pointer is the key element
@@ -533,7 +544,7 @@ stateful allocators, etc.
[endsect]
-[section:extended_functionality Extended functionality]
+[section:extended_functionality Extended functionality: Basic extensions]
[section:default_initialialization Default initialization for vector-like containers]
@@ -569,6 +580,48 @@ times.
[endsect]
+[section:constant_time_range_splice Constant-time range splice for `(s)list`]
+
+In the first C++ standard `list::size()` was not required to be constant-time,
+and that caused some controversy in the C++ community. Quoting Howard Hinnant's
+[@http://howardhinnant.github.io/On_list_size.html ['On List Size]] paper:
+
+[: ['There is a considerable debate on whether `std::list<T>::size()` should be O(1) or O(N).
+The usual argument notes that it is a tradeoff with:]
+
+`splice(iterator position, list& x, iterator first, iterator last);`
+
+['If size() is O(1) and this != &x, then this method must perform a linear operation so that it
+can adjust the size member in each list]]
+
+C++11 definitely required `size()` to be O(1), so range splice became O(N). However,
+Howard Hinnant's paper proposed a new `splice` overload so that even O(1) `list:size()`
+implementations could achieve O(1) range splice when the range size was known to the caller:
+
+[: `void splice(iterator position, list& x, iterator first, iterator last, size_type n);`
+
+ [*Effects]: Inserts elements in the range [first, last) before position and removes the elements from x.
+
+ [*Requires]: [first, last) is a valid range in x. The result is undefined if position is an iterator in the range [first, last). Invalidates only the iterators and references to the spliced elements. n == distance(first, last).
+
+ [*Throws]: Nothing.
+
+ [*Complexity]: Constant time.
+]
+
+This new splice signature allows the client to pass the distance of the input range in.
+This information is often available at the call site. If it is passed in,
+then the operation is constant time, even with an O(1) size.
+
+[*Boost.Container] implements this overload for `list` and a modified version of it for `slist`
+(as `slist::size()` is also `O(1)`).
+
+[endsect]
+
+[endsect]
+
+[section:configurable_containers Extended functionality: Configurable containers]
+
[section:configurable_tree_based_associative_containers Configurable tree-based associative ordered containers]
[classref boost::container::set set], [classref boost::container::multiset multiset],
@@ -578,9 +631,7 @@ C++ standard for associative containers.
[*Boost.Container] offers the possibility to configure at compile time some parameters of the binary search tree
implementation. This configuration is passed as the last template parameter and defined using the utility class
-[classref boost::container::tree_assoc_options tree_assoc_options].
-
-The following parameters can be configured:
+[classref boost::container::tree_assoc_options tree_assoc_options]. The following parameters can be configured:
* The underlying [*tree implementation] type ([classref boost::container::tree_type tree_type]).
By default these containers use a red-black tree but the user can use other tree types:
@@ -609,45 +660,39 @@ used to customize these containers:
[endsect]
-[section:constant_time_range_splice Constant-time range splice for `(s)list`]
-
-In the first C++ standard `list::size()` was not required to be constant-time,
-and that caused some controversy in the C++ community. Quoting Howard Hinnant's
-[@http://howardhinnant.github.io/On_list_size.html ['On List Size]] paper:
-
-[: ['There is a considerable debate on whether `std::list<T>::size()` should be O(1) or O(N).
-The usual argument notes that it is a tradeoff with:]
-
-`splice(iterator position, list& x, iterator first, iterator last);`
-
-['If size() is O(1) and this != &x, then this method must perform a linear operation so that it
-can adjust the size member in each list]]
-
-C++11 definitely required `size()` to be O(1), so range splice became O(N). However,
-Howard Hinnant's paper proposed a new `splice` overload so that even O(1) `list:size()`
-implementations could achieve O(1) range splice when the range size was known to the caller:
+[section:configurable_vectors Configurable vectors]
-[: `void splice(iterator position, list& x, iterator first, iterator last, size_type n);`
+[*Boost.Container] offers the possibility to configure at compile time some parameters of
+[classref boost::container::vector vector] implementation. This configuration is passed as
+the last template parameter and defined using the utility class
+[classref boost::container::vector_options vector_options]. The following parameters can be configured:
- [*Effects]: Inserts elements in the range [first, last) before position and removes the elements from x.
+* [classref boost::container::growth_factor growth_factor]: the growth policy of the vector.
+ The rate at which the capacity of a vector grows is implementation dependent and
+ implementations choose exponential growth in order to meet the amortized constant time requirement for push_back.
+ A higher growth factor will make it faster as it will require less data movement, but it will have a greater memory
+ impact (on average, more memory will be unused). A user can provide it's own implementation and some predefined
+ policies are available: [classref boost::container::growth_factor_50 growth_factor_50],
+ [classref boost::container::growth_factor_60 growth_factor_60] and
+ [classref boost::container::growth_factor_50 growth_factor_100].
- [*Requires]: [first, last) is a valid range in x. The result is undefined if position is an iterator in the range [first, last). Invalidates only the iterators and references to the spliced elements. n == distance(first, last).
+* [classref boost::container::stored_size stored_size]: the type that will be used to store size-related
+ parameters inside of the vector. Sometimes, when the maximum capacity to be used is much less than the
+ theoretical maximum that a vector can hold, it's interesting to use smaller unsigned integer types to represent
+ `size()` and `capacity()` inside vector, so that the size of an empty vector is minimized and cache
+ performance might be improved. See [classref boost::container::stored_size stored_size] for more details.
- [*Throws]: Nothing.
+See the following example to see how [classref boost::container::vector_options vector_options] can be
+used to customize `vector` container:
- [*Complexity]: Constant time.
-]
+[import ../example/doc_custom_vector.cpp]
+[doc_custom_vector]
-This new splice signature allows the client to pass the distance of the input range in.
-This information is often available at the call site. If it is passed in,
-then the operation is constant time, even with an O(1) size.
-
-[*Boost.Container] implements this overload for `list` and a modified version of it for `slist`
-(as `slist::size()` is also `O(1)`).
+[endsect]
[endsect]
-[section:extended_allocators Extended allocators]
+[section:extended_allocators Extended functionality: Extended allocators]
Many C++ programmers have ever wondered where does good old realloc fit in C++. And that's a good question.
Could we improve [classref boost::container::vector vector] performance using memory expansion mechanisms
@@ -700,7 +745,7 @@ Use them simply specifying the new allocator in the corresponding template argum
[endsect]
-[section:polymorphic_memory_resources Polymorphic Memory Resources ]
+[section:polymorphic_memory_resources Extended Functionality: Polymorphic Memory Resources ]
The document
[@http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4480.html C++ Extensions for Library Fundamentals (Final draft: N4480)]
@@ -818,31 +863,6 @@ type-erasured allocator-capable classes even in C++03 compilers.
[endsect]
-[/
-/a__section:previous_element_slist Previous element for slist__a
-/
-/The C++11 `std::forward_list` class implement a singly linked list, similar to `slist`, and these
-/containers only offer forward iterators and implement insertions and splice operations that operate with ranges
-/to be inserted ['after] that position. In those cases, sometimes it's interesting to obtain an iterator pointing
-/to the previous element of another element. This operation can be implemented
-/
-/a__endsect__a
-]
-
-[/
-/a__section:get_stored_allocator Obtain stored allocator__a
-/
-/STL containers offer a `get_allocator()` member to obtain a copy of the allocator that
-/the container is using to allocate and construct elements. For performance reasons, some
-/applications need o
-/
-/http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2271.html
-/
-/a__endsect__a
-/]
-
-[endsect]
-
[section:Cpp11_conformance C++11/C++14 Conformance]
[*Boost.Container] aims for full C++11 conformance except reasoned deviations,
@@ -985,7 +1005,7 @@ members.
This strong exception guarantee also precludes the possibility of using some type of
in-place reallocations that can further improve the insertion performance of `vector` See
-[link container.extended_functionality.extended_allocators Extended Allocators] to know more
+[link container.extended_allocators Extended Allocators] to know more
about these optimizations.
[classref boost::container::vector vector] always uses move constructors/assignments
@@ -1212,6 +1232,21 @@ use [*Boost.Container]? There are several reasons for that:
[section:release_notes Release Notes]
+[section:release_notes_boost_1_67_00 Boost 1.67 Release]
+
+* ['vector] can now have options, using [classref boost::container::vector_options vector_options].
+ The growth factor and the stored size type can be specified.
+
+* Improved range insertion in ['flat_[multi]map/set] containers overall complexity is reduced to O(NlogN).
+
+* Fixed bugs:
+ * [@https://github.com/boostorg/container/pull/61 GitHub #61: ['"Compile problems on Android ndk r16 beta 1"]].
+ * [@https://github.com/boostorg/container/pull/64 GitHub #64: ['"Fix splice for slist"]].
+ * [@https://github.com/boostorg/container/issues/58 GitHub #65: ['"`pmr::monotonic_buffer_resource::allocate()` can return a pointer to freed memory after `release()` is called"]].
+ * [@https://svn.boost.org/trac/boost/ticket/13500 Trac #13500: ['"Memory leak when using erase on string vectors"]].
+
+[endsect]
+
[section:release_notes_boost_1_66_00 Boost 1.66 Release]
* ['flat_[multi]map/set] can now work as container adaptors, as proposed in [@http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0429r1.pdf P0429R1].
@@ -1302,7 +1337,7 @@ use [*Boost.Container]? There are several reasons for that:
[section:release_notes_boost_1_60_00 Boost 1.60 Release]
-* Implemented [link container.extended_functionality.polymorphic_memory_resources Polymorphic Memory Resources].
+* Implemented [link container.polymorphic_memory_resources Polymorphic Memory Resources].
* Add more BOOST_ASSERT checks to test preconditions in some operations (like `pop_back`, `pop_front`, `back`, `front`, etc.)
* Added C++11 `back`/`front` operations to [classref boost::container::basic_string basic_string].
* Fixed bugs:
@@ -1360,9 +1395,9 @@ use [*Boost.Container]? There are several reasons for that:
[section:release_notes_boost_1_56_00 Boost 1.56 Release]
-* Added DlMalloc-based [link container.extended_functionality.extended_allocators Extended Allocators].
+* Added DlMalloc-based [link container.extended_allocators Extended Allocators].
-* [link container.extended_functionality.configurable_tree_based_associative_containers Improved configurability]
+* [link container.configurable_containers.configurable_tree_based_associative_containers Improved configurability]
of tree-based ordered associative containers. AVL, Scapegoat and Splay trees are now available
to implement [classref boost::container::set set], [classref boost::container::multiset multiset],
[classref boost::container::map map] and [classref boost::container::multimap multimap].
diff --git a/libs/container/doc/html/images/stable_vector.png b/libs/container/doc/images/stable_vector.png
index 26af7af6d8..26af7af6d8 100644
--- a/libs/container/doc/html/images/stable_vector.png
+++ b/libs/container/doc/images/stable_vector.png
Binary files differ
diff --git a/libs/container/example/Jamfile.v2 b/libs/container/example/Jamfile.v2
index 58ebcdd0e1..0ba75ac4d4 100644
--- a/libs/container/example/Jamfile.v2
+++ b/libs/container/example/Jamfile.v2
@@ -21,7 +21,7 @@ rule test_all
for local fileb in [ glob doc_*.cpp ]
{
- all_rules += [ run $(fileb) /boost/container//boost_container /boost/timer//boost_timer
+ all_rules += [ run $(fileb) /boost/container//boost_container
: # additional args
: # test-files
: # requirements
diff --git a/libs/container/example/doc_custom_tree.cpp b/libs/container/example/doc_custom_tree.cpp
index f14d2d4705..ad9d9e0a69 100644
--- a/libs/container/example/doc_custom_tree.cpp
+++ b/libs/container/example/doc_custom_tree.cpp
@@ -11,6 +11,11 @@
#include <boost/container/detail/workaround.hpp>
//[doc_custom_tree
#include <boost/container/set.hpp>
+
+//Make sure assertions are active
+#ifdef NDEBUG
+#undef NDEBUG
+#endif
#include <cassert>
int main ()
diff --git a/libs/container/example/doc_custom_vector.cpp b/libs/container/example/doc_custom_vector.cpp
new file mode 100644
index 0000000000..08dfad7484
--- /dev/null
+++ b/libs/container/example/doc_custom_vector.cpp
@@ -0,0 +1,54 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (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.
+//
+//////////////////////////////////////////////////////////////////////////////
+//[doc_custom_vector
+#include <boost/container/vector.hpp>
+#include <boost/static_assert.hpp>
+
+//Make sure assertions are active
+#ifdef NDEBUG
+#undef NDEBUG
+#endif
+#include <cassert>
+
+int main ()
+{
+ using namespace boost::container;
+
+ //This option specifies that a vector that will use "unsigned char" as
+ //the type to store capacity or size internally.
+ typedef vector_options< stored_size<unsigned char> >::type size_option_t;
+
+ //Size-optimized vector is smaller than the default one.
+ typedef vector<int, new_allocator<int>, size_option_t > size_optimized_vector_t;
+ BOOST_STATIC_ASSERT(( sizeof(size_optimized_vector_t) < sizeof(vector<int>) ));
+
+ //Requesting capacity for more elements than representable by "unsigned char"
+ //is an error in the size optimized vector.
+ bool exception_thrown = false;
+ try { size_optimized_vector_t v(256); }
+ catch(...){ exception_thrown = true; }
+ assert(exception_thrown == true);
+
+ //This option specifies that a vector will increase its capacity 50%
+ //each time the previous capacity was exhausted.
+ typedef vector_options< growth_factor<growth_factor_50> >::type growth_50_option_t;
+
+ //Fill the vector until full capacity is reached
+ vector<int, new_allocator<int>, growth_50_option_t > growth_50_vector(5, 0);
+ const std::size_t old_cap = growth_50_vector.capacity();
+ growth_50_vector.resize(old_cap);
+
+ //Now insert an additional item and check the new buffer is 50% bigger
+ growth_50_vector.push_back(1);
+ assert(growth_50_vector.capacity() == old_cap*3/2);
+
+ return 0;
+}
+//]
diff --git a/libs/container/proj/vc7ide/container.sln b/libs/container/proj/vc7ide/container.sln
index bce3d02295..d4947fb362 100644
--- a/libs/container/proj/vc7ide/container.sln
+++ b/libs/container/proj/vc7ide/container.sln
@@ -1,72 +1,4 @@
Microsoft Visual Studio Solution File, Format Version 8.00
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "set_test", "set_test.vcproj", "{58CCE183-6092-48FE-A4F7-BA0D3A792606}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "map_test", "map_test.vcproj", "{58CCE183-6092-48FE-A4F7-BA0D3A792606}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_emplace", "doc_emplace.vcproj", "{5CE11C83-FA84-295A-4FA2-D7921A0BAB02}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_move_containers", "doc_move_containers.vcproj", "{5D1C8E13-255A-FA84-4FA2-DA92100BAD42}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_recursive_containers", "doc_recursive_containers.vcproj", "{5D1C8E13-255A-FA84-4FA2-DA92100BAD42}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_type_erasure", "doc_type_erasure.vcproj", "{5C8E1C13-A4F4-2C55-4FA2-D100BA6A9041}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "alloc_basic_test", "alloc_basic_test.vcproj", "{CD57C283-1862-42FE-BF87-B96D3A2A7912}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "alloc_full_test", "alloc_full_test.vcproj", "{CD57C283-1862-9FE5-BF87-BA91293A76D3}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_alloc_lib", "alloc_lib.vcproj", "{685AC59C-E667-4096-9DAA-AB76083C7092}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "allocator_traits_test", "allocator_traits_test.vcproj", "{5CE11C83-096A-84FE-4FA2-D3A6BA792002}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "bench_adaptive_node_pool", "bench_adaptive_node_pool.vcproj", "{C8AD2618-79EB-8612-42FE-2A3AC9667A13}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "bench_alloc_expand_bwd", "bench_alloc_expand_bwd.vcproj", "{C7C283A2-7BF8-8612-42FE-B9D26A0793A1}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "bench_alloc", "bench_alloc.vcproj", "{7CC83A22-8612-7BF8-2F4E-BD9493C6A071}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "bench_alloc_expand_fwd", "bench_alloc_expand_fwd.vcproj", "{C7C283A2-7BF8-8612-42FE-B9D26A0793A1}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "bench_alloc_shrink_to_fit", "bench_alloc_shrink_to_fit.vcproj", "{C7C283A2-7BF8-8612-42FE-B9D26A0793A1}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "bench_set", "bench_set.vcproj", "{5E1C1C23-26A9-4FE5-A24E-DA735271C32B}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "bench_static_vector", "bench_static_vector.vcproj", "{55E1C1C3-84FE-26A9-4A2E-D7901C32BA02}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_containerlib", "container.vcproj", "{FF56BAF1-32EC-4B22-B6BD-95A3A67C3135}"
ProjectSection(ProjectDependencies) = postProject
EndProjectSection
@@ -319,6 +251,86 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "flat_tree_test", "flat_tree
ProjectSection(ProjectDependencies) = postProject
EndProjectSection
EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vector_options_test", "vector_options_test.vcproj", "{3E10C8C3-4F8E-96A0-4FA2-D032BA7A6092}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_custom_vector", "doc_custom_vector.vcproj", "{5E11C8B3-A8C4-4A2F-295A-7951A0EDAA02}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_alloc_lib", "alloc_lib.vcproj", "{685AC59C-E667-4096-9DAA-AB76083C7092}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "bench_alloc", "bench_alloc.vcproj", "{7CC83A22-8612-7BF8-2F4E-BD9493C6A071}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "bench_adaptive_node_pool", "bench_adaptive_node_pool.vcproj", "{C8AD2618-79EB-8612-42FE-2A3AC9667A13}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "bench_alloc_expand_bwd", "bench_alloc_expand_bwd.vcproj", "{C7C283A2-7BF8-8612-42FE-B9D26A0793A1}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "bench_alloc_shrink_to_fit", "bench_alloc_shrink_to_fit.vcproj", "{C7C283A2-7BF8-8612-42FE-B9D26A0793A1}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "bench_alloc_expand_fwd", "bench_alloc_expand_fwd.vcproj", "{C7C283A2-7BF8-8612-42FE-B9D26A0793A1}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "bench_set", "bench_set.vcproj", "{5E1C1C23-26A9-4FE5-A24E-DA735271C32B}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "bench_static_vector", "bench_static_vector.vcproj", "{55E1C1C3-84FE-26A9-4A2E-D7901C32BA02}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_emplace", "doc_emplace.vcproj", "{5CE11C83-FA84-295A-4FA2-D7921A0BAB02}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_move_containers", "doc_move_containers.vcproj", "{5D1C8E13-255A-FA84-4FA2-DA92100BAD42}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_recursive_containers", "doc_recursive_containers.vcproj", "{1B51C8B2-A832-F55A-4FA2-210AF9D43BD2}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_type_erasure", "doc_type_erasure.vcproj", "{5C8E1C13-A4F4-2C55-4FA2-D100BA6A9041}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "map_test", "map_test.vcproj", "{58CCE183-6092-48FE-A4F7-BA0D3A792606}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pmr_string_test", "pmr_slist_test.vcproj", "{85EADC21-42FA-F8A3-306C-A2029D5E7235}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "set_test", "set_test.vcproj", "{58CCE183-6092-48FE-A4F7-BA0D3A792606}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "alloc_basic_test", "alloc_basic_test.vcproj", "{CD57C283-1862-42FE-BF87-B96D3A2A7912}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "alloc_full_test", "alloc_full_test.vcproj", "{CD57C283-1862-9FE5-BF87-BA91293A76D3}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "allocator_traits_test", "allocator_traits_test.vcproj", "{5CE11C83-096A-84FE-4FA2-D3A6BA792002}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
Global
GlobalSection(SolutionConfiguration) = preSolution
Debug = Debug
@@ -327,74 +339,6 @@ Global
GlobalSection(ProjectDependencies) = postSolution
EndGlobalSection
GlobalSection(ProjectConfiguration) = postSolution
- {58CCE183-6092-48FE-A4F7-BA0D3A792606}.Debug.ActiveCfg = Debug|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792606}.Debug.Build.0 = Debug|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792606}.Release.ActiveCfg = Release|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792606}.Release.Build.0 = Release|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792606}.Debug.ActiveCfg = Debug|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792606}.Debug.Build.0 = Debug|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792606}.Release.ActiveCfg = Release|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792606}.Release.Build.0 = Release|Win32
- {5CE11C83-FA84-295A-4FA2-D7921A0BAB02}.Debug.ActiveCfg = Debug|Win32
- {5CE11C83-FA84-295A-4FA2-D7921A0BAB02}.Debug.Build.0 = Debug|Win32
- {5CE11C83-FA84-295A-4FA2-D7921A0BAB02}.Release.ActiveCfg = Release|Win32
- {5CE11C83-FA84-295A-4FA2-D7921A0BAB02}.Release.Build.0 = Release|Win32
- {5D1C8E13-255A-FA84-4FA2-DA92100BAD42}.Debug.ActiveCfg = Debug|Win32
- {5D1C8E13-255A-FA84-4FA2-DA92100BAD42}.Debug.Build.0 = Debug|Win32
- {5D1C8E13-255A-FA84-4FA2-DA92100BAD42}.Release.ActiveCfg = Release|Win32
- {5D1C8E13-255A-FA84-4FA2-DA92100BAD42}.Release.Build.0 = Release|Win32
- {5D1C8E13-255A-FA84-4FA2-DA92100BAD42}.Debug.ActiveCfg = Debug|Win32
- {5D1C8E13-255A-FA84-4FA2-DA92100BAD42}.Debug.Build.0 = Debug|Win32
- {5D1C8E13-255A-FA84-4FA2-DA92100BAD42}.Release.ActiveCfg = Release|Win32
- {5D1C8E13-255A-FA84-4FA2-DA92100BAD42}.Release.Build.0 = Release|Win32
- {5C8E1C13-A4F4-2C55-4FA2-D100BA6A9041}.Debug.ActiveCfg = Debug|Win32
- {5C8E1C13-A4F4-2C55-4FA2-D100BA6A9041}.Debug.Build.0 = Debug|Win32
- {5C8E1C13-A4F4-2C55-4FA2-D100BA6A9041}.Release.ActiveCfg = Release|Win32
- {5C8E1C13-A4F4-2C55-4FA2-D100BA6A9041}.Release.Build.0 = Release|Win32
- {CD57C283-1862-42FE-BF87-B96D3A2A7912}.Debug.ActiveCfg = Debug|Win32
- {CD57C283-1862-42FE-BF87-B96D3A2A7912}.Debug.Build.0 = Debug|Win32
- {CD57C283-1862-42FE-BF87-B96D3A2A7912}.Release.ActiveCfg = Release|Win32
- {CD57C283-1862-42FE-BF87-B96D3A2A7912}.Release.Build.0 = Release|Win32
- {CD57C283-1862-9FE5-BF87-BA91293A76D3}.Debug.ActiveCfg = Debug|Win32
- {CD57C283-1862-9FE5-BF87-BA91293A76D3}.Debug.Build.0 = Debug|Win32
- {CD57C283-1862-9FE5-BF87-BA91293A76D3}.Release.ActiveCfg = Release|Win32
- {CD57C283-1862-9FE5-BF87-BA91293A76D3}.Release.Build.0 = Release|Win32
- {685AC59C-E667-4096-9DAA-AB76083C7092}.Debug.ActiveCfg = Debug|Win32
- {685AC59C-E667-4096-9DAA-AB76083C7092}.Debug.Build.0 = Debug|Win32
- {685AC59C-E667-4096-9DAA-AB76083C7092}.Release.ActiveCfg = Release|Win32
- {685AC59C-E667-4096-9DAA-AB76083C7092}.Release.Build.0 = Release|Win32
- {5CE11C83-096A-84FE-4FA2-D3A6BA792002}.Debug.ActiveCfg = Debug|Win32
- {5CE11C83-096A-84FE-4FA2-D3A6BA792002}.Debug.Build.0 = Debug|Win32
- {5CE11C83-096A-84FE-4FA2-D3A6BA792002}.Release.ActiveCfg = Release|Win32
- {5CE11C83-096A-84FE-4FA2-D3A6BA792002}.Release.Build.0 = Release|Win32
- {C8AD2618-79EB-8612-42FE-2A3AC9667A13}.Debug.ActiveCfg = Debug|Win32
- {C8AD2618-79EB-8612-42FE-2A3AC9667A13}.Debug.Build.0 = Debug|Win32
- {C8AD2618-79EB-8612-42FE-2A3AC9667A13}.Release.ActiveCfg = Release|Win32
- {C8AD2618-79EB-8612-42FE-2A3AC9667A13}.Release.Build.0 = Release|Win32
- {C7C283A2-7BF8-8612-42FE-B9D26A0793A1}.Debug.ActiveCfg = Debug|Win32
- {C7C283A2-7BF8-8612-42FE-B9D26A0793A1}.Debug.Build.0 = Debug|Win32
- {C7C283A2-7BF8-8612-42FE-B9D26A0793A1}.Release.ActiveCfg = Release|Win32
- {C7C283A2-7BF8-8612-42FE-B9D26A0793A1}.Release.Build.0 = Release|Win32
- {7CC83A22-8612-7BF8-2F4E-BD9493C6A071}.Debug.ActiveCfg = Debug|Win32
- {7CC83A22-8612-7BF8-2F4E-BD9493C6A071}.Debug.Build.0 = Debug|Win32
- {7CC83A22-8612-7BF8-2F4E-BD9493C6A071}.Release.ActiveCfg = Release|Win32
- {7CC83A22-8612-7BF8-2F4E-BD9493C6A071}.Release.Build.0 = Release|Win32
- {C7C283A2-7BF8-8612-42FE-B9D26A0793A1}.Debug.ActiveCfg = Debug|Win32
- {C7C283A2-7BF8-8612-42FE-B9D26A0793A1}.Debug.Build.0 = Debug|Win32
- {C7C283A2-7BF8-8612-42FE-B9D26A0793A1}.Release.ActiveCfg = Release|Win32
- {C7C283A2-7BF8-8612-42FE-B9D26A0793A1}.Release.Build.0 = Release|Win32
- {C7C283A2-7BF8-8612-42FE-B9D26A0793A1}.Debug.ActiveCfg = Debug|Win32
- {C7C283A2-7BF8-8612-42FE-B9D26A0793A1}.Debug.Build.0 = Debug|Win32
- {C7C283A2-7BF8-8612-42FE-B9D26A0793A1}.Release.ActiveCfg = Release|Win32
- {C7C283A2-7BF8-8612-42FE-B9D26A0793A1}.Release.Build.0 = Release|Win32
- {5E1C1C23-26A9-4FE5-A24E-DA735271C32B}.Debug.ActiveCfg = Debug|Win32
- {5E1C1C23-26A9-4FE5-A24E-DA735271C32B}.Debug.Build.0 = Debug|Win32
- {5E1C1C23-26A9-4FE5-A24E-DA735271C32B}.Release.ActiveCfg = Release|Win32
- {5E1C1C23-26A9-4FE5-A24E-DA735271C32B}.Release.Build.0 = Release|Win32
- {55E1C1C3-84FE-26A9-4A2E-D7901C32BA02}.Debug.ActiveCfg = Debug|Win32
- {55E1C1C3-84FE-26A9-4A2E-D7901C32BA02}.Debug.Build.0 = Debug|Win32
- {55E1C1C3-84FE-26A9-4A2E-D7901C32BA02}.Release.ActiveCfg = Release|Win32
- {55E1C1C3-84FE-26A9-4A2E-D7901C32BA02}.Release.Build.0 = Release|Win32
{FF56BAF1-32EC-4B22-B6BD-95A3A67C3135}.Debug.ActiveCfg = Debug|Win32
{FF56BAF1-32EC-4B22-B6BD-95A3A67C3135}.Debug.Build.0 = Debug|Win32
{FF56BAF1-32EC-4B22-B6BD-95A3A67C3135}.Release.ActiveCfg = Release|Win32
@@ -645,6 +589,86 @@ Global
{DE1834C3-2609-FE38-4FA5-0BA0D3CD0796}.Debug.Build.0 = Debug|Win32
{DE1834C3-2609-FE38-4FA5-0BA0D3CD0796}.Release.ActiveCfg = Release|Win32
{DE1834C3-2609-FE38-4FA5-0BA0D3CD0796}.Release.Build.0 = Release|Win32
+ {3E10C8C3-4F8E-96A0-4FA2-D032BA7A6092}.Debug.ActiveCfg = Debug|Win32
+ {3E10C8C3-4F8E-96A0-4FA2-D032BA7A6092}.Debug.Build.0 = Debug|Win32
+ {3E10C8C3-4F8E-96A0-4FA2-D032BA7A6092}.Release.ActiveCfg = Release|Win32
+ {3E10C8C3-4F8E-96A0-4FA2-D032BA7A6092}.Release.Build.0 = Release|Win32
+ {5E11C8B3-A8C4-4A2F-295A-7951A0EDAA02}.Debug.ActiveCfg = Debug|Win32
+ {5E11C8B3-A8C4-4A2F-295A-7951A0EDAA02}.Debug.Build.0 = Debug|Win32
+ {5E11C8B3-A8C4-4A2F-295A-7951A0EDAA02}.Release.ActiveCfg = Release|Win32
+ {5E11C8B3-A8C4-4A2F-295A-7951A0EDAA02}.Release.Build.0 = Release|Win32
+ {685AC59C-E667-4096-9DAA-AB76083C7092}.Debug.ActiveCfg = Debug|Win32
+ {685AC59C-E667-4096-9DAA-AB76083C7092}.Debug.Build.0 = Debug|Win32
+ {685AC59C-E667-4096-9DAA-AB76083C7092}.Release.ActiveCfg = Release|Win32
+ {685AC59C-E667-4096-9DAA-AB76083C7092}.Release.Build.0 = Release|Win32
+ {7CC83A22-8612-7BF8-2F4E-BD9493C6A071}.Debug.ActiveCfg = Debug|Win32
+ {7CC83A22-8612-7BF8-2F4E-BD9493C6A071}.Debug.Build.0 = Debug|Win32
+ {7CC83A22-8612-7BF8-2F4E-BD9493C6A071}.Release.ActiveCfg = Release|Win32
+ {7CC83A22-8612-7BF8-2F4E-BD9493C6A071}.Release.Build.0 = Release|Win32
+ {C8AD2618-79EB-8612-42FE-2A3AC9667A13}.Debug.ActiveCfg = Debug|Win32
+ {C8AD2618-79EB-8612-42FE-2A3AC9667A13}.Debug.Build.0 = Debug|Win32
+ {C8AD2618-79EB-8612-42FE-2A3AC9667A13}.Release.ActiveCfg = Release|Win32
+ {C8AD2618-79EB-8612-42FE-2A3AC9667A13}.Release.Build.0 = Release|Win32
+ {C7C283A2-7BF8-8612-42FE-B9D26A0793A1}.Debug.ActiveCfg = Debug|Win32
+ {C7C283A2-7BF8-8612-42FE-B9D26A0793A1}.Debug.Build.0 = Debug|Win32
+ {C7C283A2-7BF8-8612-42FE-B9D26A0793A1}.Release.ActiveCfg = Release|Win32
+ {C7C283A2-7BF8-8612-42FE-B9D26A0793A1}.Release.Build.0 = Release|Win32
+ {C7C283A2-7BF8-8612-42FE-B9D26A0793A1}.Debug.ActiveCfg = Debug|Win32
+ {C7C283A2-7BF8-8612-42FE-B9D26A0793A1}.Debug.Build.0 = Debug|Win32
+ {C7C283A2-7BF8-8612-42FE-B9D26A0793A1}.Release.ActiveCfg = Release|Win32
+ {C7C283A2-7BF8-8612-42FE-B9D26A0793A1}.Release.Build.0 = Release|Win32
+ {C7C283A2-7BF8-8612-42FE-B9D26A0793A1}.Debug.ActiveCfg = Debug|Win32
+ {C7C283A2-7BF8-8612-42FE-B9D26A0793A1}.Debug.Build.0 = Debug|Win32
+ {C7C283A2-7BF8-8612-42FE-B9D26A0793A1}.Release.ActiveCfg = Release|Win32
+ {C7C283A2-7BF8-8612-42FE-B9D26A0793A1}.Release.Build.0 = Release|Win32
+ {5E1C1C23-26A9-4FE5-A24E-DA735271C32B}.Debug.ActiveCfg = Debug|Win32
+ {5E1C1C23-26A9-4FE5-A24E-DA735271C32B}.Debug.Build.0 = Debug|Win32
+ {5E1C1C23-26A9-4FE5-A24E-DA735271C32B}.Release.ActiveCfg = Release|Win32
+ {5E1C1C23-26A9-4FE5-A24E-DA735271C32B}.Release.Build.0 = Release|Win32
+ {55E1C1C3-84FE-26A9-4A2E-D7901C32BA02}.Debug.ActiveCfg = Debug|Win32
+ {55E1C1C3-84FE-26A9-4A2E-D7901C32BA02}.Debug.Build.0 = Debug|Win32
+ {55E1C1C3-84FE-26A9-4A2E-D7901C32BA02}.Release.ActiveCfg = Release|Win32
+ {55E1C1C3-84FE-26A9-4A2E-D7901C32BA02}.Release.Build.0 = Release|Win32
+ {5CE11C83-FA84-295A-4FA2-D7921A0BAB02}.Debug.ActiveCfg = Debug|Win32
+ {5CE11C83-FA84-295A-4FA2-D7921A0BAB02}.Debug.Build.0 = Debug|Win32
+ {5CE11C83-FA84-295A-4FA2-D7921A0BAB02}.Release.ActiveCfg = Release|Win32
+ {5CE11C83-FA84-295A-4FA2-D7921A0BAB02}.Release.Build.0 = Release|Win32
+ {5D1C8E13-255A-FA84-4FA2-DA92100BAD42}.Debug.ActiveCfg = Debug|Win32
+ {5D1C8E13-255A-FA84-4FA2-DA92100BAD42}.Debug.Build.0 = Debug|Win32
+ {5D1C8E13-255A-FA84-4FA2-DA92100BAD42}.Release.ActiveCfg = Release|Win32
+ {5D1C8E13-255A-FA84-4FA2-DA92100BAD42}.Release.Build.0 = Release|Win32
+ {1B51C8B2-A832-F55A-4FA2-210AF9D43BD2}.Debug.ActiveCfg = Debug|Win32
+ {1B51C8B2-A832-F55A-4FA2-210AF9D43BD2}.Debug.Build.0 = Debug|Win32
+ {1B51C8B2-A832-F55A-4FA2-210AF9D43BD2}.Release.ActiveCfg = Release|Win32
+ {1B51C8B2-A832-F55A-4FA2-210AF9D43BD2}.Release.Build.0 = Release|Win32
+ {5C8E1C13-A4F4-2C55-4FA2-D100BA6A9041}.Debug.ActiveCfg = Debug|Win32
+ {5C8E1C13-A4F4-2C55-4FA2-D100BA6A9041}.Debug.Build.0 = Debug|Win32
+ {5C8E1C13-A4F4-2C55-4FA2-D100BA6A9041}.Release.ActiveCfg = Release|Win32
+ {5C8E1C13-A4F4-2C55-4FA2-D100BA6A9041}.Release.Build.0 = Release|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792606}.Debug.ActiveCfg = Debug|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792606}.Debug.Build.0 = Debug|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792606}.Release.ActiveCfg = Release|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792606}.Release.Build.0 = Release|Win32
+ {85EADC21-42FA-F8A3-306C-A2029D5E7235}.Debug.ActiveCfg = Debug|Win32
+ {85EADC21-42FA-F8A3-306C-A2029D5E7235}.Debug.Build.0 = Debug|Win32
+ {85EADC21-42FA-F8A3-306C-A2029D5E7235}.Release.ActiveCfg = Release|Win32
+ {85EADC21-42FA-F8A3-306C-A2029D5E7235}.Release.Build.0 = Release|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792606}.Debug.ActiveCfg = Debug|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792606}.Debug.Build.0 = Debug|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792606}.Release.ActiveCfg = Release|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792606}.Release.Build.0 = Release|Win32
+ {CD57C283-1862-42FE-BF87-B96D3A2A7912}.Debug.ActiveCfg = Debug|Win32
+ {CD57C283-1862-42FE-BF87-B96D3A2A7912}.Debug.Build.0 = Debug|Win32
+ {CD57C283-1862-42FE-BF87-B96D3A2A7912}.Release.ActiveCfg = Release|Win32
+ {CD57C283-1862-42FE-BF87-B96D3A2A7912}.Release.Build.0 = Release|Win32
+ {CD57C283-1862-9FE5-BF87-BA91293A76D3}.Debug.ActiveCfg = Debug|Win32
+ {CD57C283-1862-9FE5-BF87-BA91293A76D3}.Debug.Build.0 = Debug|Win32
+ {CD57C283-1862-9FE5-BF87-BA91293A76D3}.Release.ActiveCfg = Release|Win32
+ {CD57C283-1862-9FE5-BF87-BA91293A76D3}.Release.Build.0 = Release|Win32
+ {5CE11C83-096A-84FE-4FA2-D3A6BA792002}.Debug.ActiveCfg = Debug|Win32
+ {5CE11C83-096A-84FE-4FA2-D3A6BA792002}.Debug.Build.0 = Debug|Win32
+ {5CE11C83-096A-84FE-4FA2-D3A6BA792002}.Release.ActiveCfg = Release|Win32
+ {5CE11C83-096A-84FE-4FA2-D3A6BA792002}.Release.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
EndGlobalSection
diff --git a/libs/container/proj/vc7ide/doc_custom_tree.vcproj b/libs/container/proj/vc7ide/doc_custom_tree.vcproj
index f0f0363003..937a294a79 100644
--- a/libs/container/proj/vc7ide/doc_custom_tree.vcproj
+++ b/libs/container/proj/vc7ide/doc_custom_tree.vcproj
@@ -13,7 +13,7 @@
<Configuration
Name="Debug|Win32"
OutputDirectory="../../Bin/Win32/Debug"
- IntermediateDirectory="Debug/vector_test"
+ IntermediateDirectory="Debug/doc_custom_tree"
ConfigurationType="1"
CharacterSet="2">
<Tool
diff --git a/libs/container/proj/vc7ide/doc_custom_vector.vcproj b/libs/container/proj/vc7ide/doc_custom_vector.vcproj
new file mode 100644
index 0000000000..8faafca820
--- /dev/null
+++ b/libs/container/proj/vc7ide/doc_custom_vector.vcproj
@@ -0,0 +1,136 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="7.10"
+ Name="doc_custom_vector"
+ ProjectGUID="{5E11C8B3-A8C4-4A2F-295A-7951A0EDAA02}"
+ Keyword="Win32Proj">
+ <Platforms>
+ <Platform
+ Name="Win32"/>
+ </Platforms>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="../../Bin/Win32/Debug"
+ IntermediateDirectory="Debug/doc_custom_vector"
+ ConfigurationType="1"
+ CharacterSet="2">
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="../../../.."
+ PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
+ MinimalRebuild="TRUE"
+ ExceptionHandling="TRUE"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ TreatWChar_tAsBuiltInType="TRUE"
+ ForceConformanceInForLoopScope="FALSE"
+ UsePrecompiledHeader="0"
+ WarningLevel="4"
+ Detect64BitPortabilityProblems="TRUE"
+ DebugInformationFormat="3"/>
+ <Tool
+ Name="VCCustomBuildTool"/>
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="winmm.lib"
+ OutputFile="$(OutDir)/doc_custom_vector_d.exe"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="../../../../stage/lib"
+ GenerateDebugInformation="TRUE"
+ ProgramDatabaseFile="$(OutDir)/doc_custom_vector.pdb"
+ SubSystem="1"
+ TargetMachine="1"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCMIDLTool"/>
+ <Tool
+ Name="VCPostBuildEventTool"/>
+ <Tool
+ Name="VCPreBuildEventTool"/>
+ <Tool
+ Name="VCPreLinkEventTool"/>
+ <Tool
+ Name="VCResourceCompilerTool"/>
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"/>
+ <Tool
+ Name="VCXMLDataGeneratorTool"/>
+ <Tool
+ Name="VCWebDeploymentTool"/>
+ <Tool
+ Name="VCManagedWrapperGeneratorTool"/>
+ <Tool
+ Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="../../Bin/Win32/Release"
+ IntermediateDirectory="Release/doc_custom_vector"
+ ConfigurationType="1"
+ CharacterSet="2">
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories="../../../.."
+ PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
+ RuntimeLibrary="2"
+ TreatWChar_tAsBuiltInType="TRUE"
+ ForceConformanceInForLoopScope="FALSE"
+ UsePrecompiledHeader="0"
+ WarningLevel="4"
+ Detect64BitPortabilityProblems="TRUE"
+ DebugInformationFormat="0"/>
+ <Tool
+ Name="VCCustomBuildTool"/>
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="winmm.lib"
+ OutputFile="$(OutDir)/doc_custom_vector.exe"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="../../../../stage/lib"
+ GenerateDebugInformation="TRUE"
+ SubSystem="1"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="1"
+ FixedBaseAddress="1"/>
+ <Tool
+ Name="VCMIDLTool"/>
+ <Tool
+ Name="VCPostBuildEventTool"/>
+ <Tool
+ Name="VCPreBuildEventTool"/>
+ <Tool
+ Name="VCPreLinkEventTool"/>
+ <Tool
+ Name="VCResourceCompilerTool"/>
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"/>
+ <Tool
+ Name="VCXMLDataGeneratorTool"/>
+ <Tool
+ Name="VCWebDeploymentTool"/>
+ <Tool
+ Name="VCManagedWrapperGeneratorTool"/>
+ <Tool
+ Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4F4737BC-032A-5430-AC75-A32542AA2D1F}">
+ <File
+ RelativePath="..\..\example\doc_custom_vector.cpp">
+ </File>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/libs/container/proj/vc7ide/doc_extended_allocators.vcproj b/libs/container/proj/vc7ide/doc_extended_allocators.vcproj
index 945ace3c06..2ffacc32dc 100644
--- a/libs/container/proj/vc7ide/doc_extended_allocators.vcproj
+++ b/libs/container/proj/vc7ide/doc_extended_allocators.vcproj
@@ -13,7 +13,7 @@
<Configuration
Name="Debug|Win32"
OutputDirectory="../../Bin/Win32/Debug"
- IntermediateDirectory="Debug/vector_test"
+ IntermediateDirectory="Debug/doc_extended_allocators"
ConfigurationType="1"
CharacterSet="2">
<Tool
diff --git a/libs/container/proj/vc7ide/doc_move_containers.vcproj b/libs/container/proj/vc7ide/doc_move_containers.vcproj
index 6417ab10c1..46f4392a7c 100644
--- a/libs/container/proj/vc7ide/doc_move_containers.vcproj
+++ b/libs/container/proj/vc7ide/doc_move_containers.vcproj
@@ -13,7 +13,7 @@
<Configuration
Name="Debug|Win32"
OutputDirectory="../../Bin/Win32/Debug"
- IntermediateDirectory="Debug/vector_test"
+ IntermediateDirectory="Debug/doc_move_containers"
ConfigurationType="1"
CharacterSet="2">
<Tool
diff --git a/libs/container/proj/vc7ide/doc_pmr.vcproj b/libs/container/proj/vc7ide/doc_pmr.vcproj
index 9806522064..ef0a461a45 100644
--- a/libs/container/proj/vc7ide/doc_pmr.vcproj
+++ b/libs/container/proj/vc7ide/doc_pmr.vcproj
@@ -13,7 +13,7 @@
<Configuration
Name="Debug|Win32"
OutputDirectory="../../Bin/Win32/Debug"
- IntermediateDirectory="Debug/vector_test"
+ IntermediateDirectory="Debug/doc_pmr"
ConfigurationType="1"
CharacterSet="2">
<Tool
diff --git a/libs/container/proj/vc7ide/doc_recursive_containers.vcproj b/libs/container/proj/vc7ide/doc_recursive_containers.vcproj
index 363f7960fc..5874d8d0dd 100644
--- a/libs/container/proj/vc7ide/doc_recursive_containers.vcproj
+++ b/libs/container/proj/vc7ide/doc_recursive_containers.vcproj
@@ -13,7 +13,7 @@
<Configuration
Name="Debug|Win32"
OutputDirectory="../../Bin/Win32/Debug"
- IntermediateDirectory="Debug/vector_test"
+ IntermediateDirectory="Debug/doc_recursive_containers"
ConfigurationType="1"
CharacterSet="2">
<Tool
diff --git a/libs/container/proj/vc7ide/doc_type_erasure.vcproj b/libs/container/proj/vc7ide/doc_type_erasure.vcproj
index fd10787a20..6f5d3ae61e 100644
--- a/libs/container/proj/vc7ide/doc_type_erasure.vcproj
+++ b/libs/container/proj/vc7ide/doc_type_erasure.vcproj
@@ -13,7 +13,7 @@
<Configuration
Name="Debug|Win32"
OutputDirectory="../../Bin/Win32/Debug"
- IntermediateDirectory="Debug/vector_test"
+ IntermediateDirectory="Debug/doc_type_erasure"
ConfigurationType="1"
CharacterSet="2">
<Tool
diff --git a/libs/container/proj/vc7ide/vector_options_test.vcproj b/libs/container/proj/vc7ide/vector_options_test.vcproj
new file mode 100644
index 0000000000..8d1608f41c
--- /dev/null
+++ b/libs/container/proj/vc7ide/vector_options_test.vcproj
@@ -0,0 +1,135 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="7.10"
+ Name="vector_options_test"
+ ProjectGUID="{3E10C8C3-4F8E-96A0-4FA2-D032BA7A6092}"
+ Keyword="Win32Proj">
+ <Platforms>
+ <Platform
+ Name="Win32"/>
+ </Platforms>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="../../Bin/Win32/Debug"
+ IntermediateDirectory="Debug/vector_options_test"
+ ConfigurationType="1"
+ CharacterSet="2">
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="../../../.."
+ PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
+ MinimalRebuild="TRUE"
+ ExceptionHandling="TRUE"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ TreatWChar_tAsBuiltInType="TRUE"
+ ForceConformanceInForLoopScope="FALSE"
+ UsePrecompiledHeader="0"
+ WarningLevel="4"
+ Detect64BitPortabilityProblems="TRUE"
+ DebugInformationFormat="3"/>
+ <Tool
+ Name="VCCustomBuildTool"/>
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="winmm.lib"
+ OutputFile="$(OutDir)/vector_options_test_d.exe"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="../../../../stage/lib"
+ GenerateDebugInformation="TRUE"
+ ProgramDatabaseFile="$(OutDir)/vector_options_test.pdb"
+ SubSystem="1"
+ TargetMachine="1"
+ FixedBaseAddress="1"/>
+ <Tool
+ Name="VCMIDLTool"/>
+ <Tool
+ Name="VCPostBuildEventTool"/>
+ <Tool
+ Name="VCPreBuildEventTool"/>
+ <Tool
+ Name="VCPreLinkEventTool"/>
+ <Tool
+ Name="VCResourceCompilerTool"/>
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"/>
+ <Tool
+ Name="VCXMLDataGeneratorTool"/>
+ <Tool
+ Name="VCWebDeploymentTool"/>
+ <Tool
+ Name="VCManagedWrapperGeneratorTool"/>
+ <Tool
+ Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="../../Bin/Win32/Release"
+ IntermediateDirectory="Release/vector_options_test"
+ ConfigurationType="1"
+ CharacterSet="2">
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories="../../../.."
+ PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
+ RuntimeLibrary="2"
+ TreatWChar_tAsBuiltInType="TRUE"
+ ForceConformanceInForLoopScope="FALSE"
+ UsePrecompiledHeader="0"
+ WarningLevel="4"
+ Detect64BitPortabilityProblems="TRUE"
+ DebugInformationFormat="0"/>
+ <Tool
+ Name="VCCustomBuildTool"/>
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="winmm.lib"
+ OutputFile="$(OutDir)/vector_options_test.exe"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="../../../../stage/lib"
+ GenerateDebugInformation="TRUE"
+ SubSystem="1"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="1"
+ FixedBaseAddress="1"/>
+ <Tool
+ Name="VCMIDLTool"/>
+ <Tool
+ Name="VCPostBuildEventTool"/>
+ <Tool
+ Name="VCPreBuildEventTool"/>
+ <Tool
+ Name="VCPreLinkEventTool"/>
+ <Tool
+ Name="VCResourceCompilerTool"/>
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"/>
+ <Tool
+ Name="VCXMLDataGeneratorTool"/>
+ <Tool
+ Name="VCWebDeploymentTool"/>
+ <Tool
+ Name="VCManagedWrapperGeneratorTool"/>
+ <Tool
+ Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{3BCC4057-7AC5-1273-6AD6-5A3296A32D7F}">
+ <File
+ RelativePath="..\..\test\vector_options_test.cpp">
+ </File>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/libs/container/src/dlmalloc_ext_2_8_6.c b/libs/container/src/dlmalloc_ext_2_8_6.c
index 2b6b138729..3328d72975 100644
--- a/libs/container/src/dlmalloc_ext_2_8_6.c
+++ b/libs/container/src/dlmalloc_ext_2_8_6.c
@@ -1092,7 +1092,7 @@ int boost_cont_multialloc_arrays
/*Doug Lea malloc extensions*/
static boost_cont_malloc_stats_t get_malloc_stats(mstate m)
{
- boost_cont_malloc_stats_t ret;
+ boost_cont_malloc_stats_t ret = { 0, 0, 0 };
ensure_initialization();
if (!PREACTION(m)) {
size_t maxfp = 0;
diff --git a/libs/container/src/monotonic_buffer_resource.cpp b/libs/container/src/monotonic_buffer_resource.cpp
index 8e5cc892f2..f9f6f4cbe5 100644
--- a/libs/container/src/monotonic_buffer_resource.cpp
+++ b/libs/container/src/monotonic_buffer_resource.cpp
@@ -60,14 +60,14 @@ void monotonic_buffer_resource::increase_next_buffer_at_least_to(std::size_t min
monotonic_buffer_resource::monotonic_buffer_resource(memory_resource* upstream) BOOST_NOEXCEPT
: m_memory_blocks(upstream ? *upstream : *get_default_resource())
- , m_current_buffer(0u)
+ , m_current_buffer(0)
, m_current_buffer_size(0u)
, m_next_buffer_size(initial_next_buffer_size)
{}
monotonic_buffer_resource::monotonic_buffer_resource(std::size_t initial_size, memory_resource* upstream) BOOST_NOEXCEPT
: m_memory_blocks(upstream ? *upstream : *get_default_resource())
- , m_current_buffer(0u)
+ , m_current_buffer(0)
, m_current_buffer_size(0u)
, m_next_buffer_size(minimum_buffer_size)
{ //In case initial_size is zero
@@ -80,14 +80,19 @@ monotonic_buffer_resource::monotonic_buffer_resource(void* buffer, std::size_t b
, m_current_buffer_size(buffer_size)
, m_next_buffer_size
(bi::detail::previous_or_equal_pow2
- (boost::container::container_detail::max_value(buffer_size, std::size_t(initial_next_buffer_size))))
+ (boost::container::dtl::max_value(buffer_size, std::size_t(initial_next_buffer_size))))
{ this->increase_next_buffer(); }
monotonic_buffer_resource::~monotonic_buffer_resource()
{ this->release(); }
void monotonic_buffer_resource::release() BOOST_NOEXCEPT
-{ m_memory_blocks.release(); }
+{
+ m_memory_blocks.release();
+ m_current_buffer = 0u;
+ m_current_buffer_size = 0u;
+ m_next_buffer_size = initial_next_buffer_size;
+}
memory_resource* monotonic_buffer_resource::upstream_resource() const BOOST_NOEXCEPT
{ return &m_memory_blocks.upstream_resource(); }
diff --git a/libs/container/src/pool_resource.cpp b/libs/container/src/pool_resource.cpp
index 45f1564ad6..e6829e28e7 100644
--- a/libs/container/src/pool_resource.cpp
+++ b/libs/container/src/pool_resource.cpp
@@ -66,9 +66,9 @@ class pool_data_t
void replenish(memory_resource &mr, std::size_t pool_block, std::size_t max_blocks_per_chunk)
{
//Limit max value
- std::size_t blocks_per_chunk = boost::container::container_detail::min_value(max_blocks_per_chunk, next_blocks_per_chunk);
+ std::size_t blocks_per_chunk = boost::container::dtl::min_value(max_blocks_per_chunk, next_blocks_per_chunk);
//Avoid overflow
- blocks_per_chunk = boost::container::container_detail::min_value(blocks_per_chunk, std::size_t(-1)/pool_block);
+ blocks_per_chunk = boost::container::dtl::min_value(blocks_per_chunk, std::size_t(-1)/pool_block);
//Minimum block size is at least max_align, so all pools allocate sizes that are multiple of max_align,
//meaning that all blocks are max_align-aligned.
@@ -108,7 +108,7 @@ void pool_resource::priv_limit_option(std::size_t &val, std::size_t min, std::si
val = max;
}
else{
- val = val < min ? min : boost::container::container_detail::min_value(val, max);
+ val = val < min ? min : boost::container::dtl::min_value(val, max);
}
}
@@ -116,7 +116,7 @@ std::size_t pool_resource::priv_pool_index(std::size_t block_size) //static
{
//For allocations equal or less than pool_options_minimum_largest_required_pool_block
//the smallest pool is used
- block_size = boost::container::container_detail::max_value(block_size, pool_options_minimum_largest_required_pool_block);
+ block_size = boost::container::dtl::max_value(block_size, pool_options_minimum_largest_required_pool_block);
return bi::detail::ceil_log2(block_size)
- bi::detail::ceil_log2(pool_options_minimum_largest_required_pool_block);
}
diff --git a/libs/container/test/Jamfile.v2 b/libs/container/test/Jamfile.v2
index 55e22455e0..2b4995beef 100644
--- a/libs/container/test/Jamfile.v2
+++ b/libs/container/test/Jamfile.v2
@@ -27,7 +27,7 @@ rule test_all
for local fileb in [ glob *.cpp ]
{
- all_rules += [ run $(fileb) /boost/container//boost_container /boost/timer//boost_timer
+ all_rules += [ run $(fileb) /boost/container//boost_container
: # additional args
: # test-files
: # requirements
diff --git a/libs/container/test/allocator_argument_tester.hpp b/libs/container/test/allocator_argument_tester.hpp
index 5050ff409d..73993285e9 100644
--- a/libs/container/test/allocator_argument_tester.hpp
+++ b/libs/container/test/allocator_argument_tester.hpp
@@ -27,10 +27,10 @@ class propagation_test_allocator
typedef propagation_test_allocator<U, Id, HasTrueTypes> other;
};
- typedef boost::container::container_detail::bool_<HasTrueTypes> propagate_on_container_copy_assignment;
- typedef boost::container::container_detail::bool_<HasTrueTypes> propagate_on_container_move_assignment;
- typedef boost::container::container_detail::bool_<HasTrueTypes> propagate_on_container_swap;
- typedef boost::container::container_detail::bool_<HasTrueTypes> is_always_equal;
+ typedef boost::container::dtl::bool_<HasTrueTypes> propagate_on_container_copy_assignment;
+ typedef boost::container::dtl::bool_<HasTrueTypes> propagate_on_container_move_assignment;
+ typedef boost::container::dtl::bool_<HasTrueTypes> propagate_on_container_swap;
+ typedef boost::container::dtl::bool_<HasTrueTypes> is_always_equal;
typedef T value_type;
propagation_test_allocator()
diff --git a/libs/container/test/allocator_traits_test.cpp b/libs/container/test/allocator_traits_test.cpp
index 0885f0bd66..4014424149 100644
--- a/libs/container/test/allocator_traits_test.cpp
+++ b/libs/container/test/allocator_traits_test.cpp
@@ -27,7 +27,7 @@ class SimpleAllocator
bool allocate_called_;
bool deallocate_called_;
- typedef boost::container::container_detail::
+ typedef boost::container::dtl::
true_type is_always_equal;
typedef T value_type;
@@ -106,20 +106,20 @@ class ComplexAllocator
typedef SimpleSmartPtr<T> pointer;
typedef SimpleSmartPtr<const T> const_pointer;
typedef typename ::boost::container::
- container_detail::unvoid_ref<T>::type reference;
+ dtl::unvoid_ref<T>::type reference;
typedef typename ::boost::container::
- container_detail::unvoid_ref<const T>::type const_reference;
+ dtl::unvoid_ref<const T>::type const_reference;
typedef SimpleSmartPtr<void> void_pointer;
typedef SimpleSmartPtr<const void> const_void_pointer;
typedef signed short difference_type;
typedef unsigned short size_type;
- typedef boost::container::container_detail::
+ typedef boost::container::dtl::
true_type propagate_on_container_copy_assignment;
- typedef boost::container::container_detail::
+ typedef boost::container::dtl::
true_type propagate_on_container_move_assignment;
- typedef boost::container::container_detail::
+ typedef boost::container::dtl::
true_type propagate_on_container_swap;
- typedef boost::container::container_detail::
+ typedef boost::container::dtl::
true_type is_partially_propagable;
ComplexAllocator()
@@ -247,7 +247,7 @@ void test_void_allocator()
int main()
{
- using namespace boost::container::container_detail;
+ using namespace boost::container::dtl;
test_void_allocator();
//SimpleAllocator
diff --git a/libs/container/test/check_equal_containers.hpp b/libs/container/test/check_equal_containers.hpp
index 86d9fb2f82..617089d1ff 100644
--- a/libs/container/test/check_equal_containers.hpp
+++ b/libs/container/test/check_equal_containers.hpp
@@ -25,9 +25,9 @@ namespace test{
template< class T1, class T2>
bool CheckEqual( const T1 &t1, const T2 &t2
- , typename boost::container::container_detail::enable_if_c
- <!boost::container::container_detail::is_pair<T1>::value &&
- !boost::container::container_detail::is_pair<T2>::value
+ , typename boost::container::dtl::enable_if_c
+ <!boost::container::dtl::is_pair<T1>::value &&
+ !boost::container::dtl::is_pair<T2>::value
>::type* = 0)
{ return t1 == t2; }
@@ -50,9 +50,9 @@ bool CheckEqualIt( const T1 &i1, const T2 &i2, const C1 &c1, const C2 &c2 )
template< class Pair1, class Pair2>
bool CheckEqual( const Pair1 &pair1, const Pair2 &pair2
- , typename boost::container::container_detail::enable_if_c
- <boost::container::container_detail::is_pair<Pair1>::value &&
- boost::container::container_detail::is_pair<Pair2>::value
+ , typename boost::container::dtl::enable_if_c
+ <boost::container::dtl::is_pair<Pair1>::value &&
+ boost::container::dtl::is_pair<Pair2>::value
>::type* = 0)
{
return CheckEqual(pair1.first, pair2.first) && CheckEqual(pair1.second, pair2.second);
diff --git a/libs/container/test/deque_test.cpp b/libs/container/test/deque_test.cpp
index 9ed8cf87a4..bb9e162994 100644
--- a/libs/container/test/deque_test.cpp
+++ b/libs/container/test/deque_test.cpp
@@ -51,14 +51,14 @@ template class boost::container::deque
//Function to check if both sets are equal
template<class V1, class V2>
-bool deque_copyable_only(V1 &, V2 &, container_detail::false_type)
+bool deque_copyable_only(V1 &, V2 &, dtl::false_type)
{
return true;
}
//Function to check if both sets are equal
template<class V1, class V2>
-bool deque_copyable_only(V1 &cntdeque, V2 &stddeque, container_detail::true_type)
+bool deque_copyable_only(V1 &cntdeque, V2 &stddeque, dtl::true_type)
{
typedef typename V1::value_type IntType;
std::size_t size = cntdeque.size();
@@ -246,7 +246,7 @@ bool do_test()
}
if(!deque_copyable_only(cntdeque, stddeque
- ,container_detail::bool_<boost::container::test::is_copyable<IntType>::value>())){
+ ,dtl::bool_<boost::container::test::is_copyable<IntType>::value>())){
return false;
}
diff --git a/libs/container/test/dummy_test_allocator.hpp b/libs/container/test/dummy_test_allocator.hpp
index 7576d45897..024ab0e0ef 100644
--- a/libs/container/test/dummy_test_allocator.hpp
+++ b/libs/container/test/dummy_test_allocator.hpp
@@ -85,11 +85,11 @@ class propagation_test_allocator
public:
typedef T value_type;
- typedef boost::container::container_detail::bool_<PropagateOnContCopyAssign>
+ typedef boost::container::dtl::bool_<PropagateOnContCopyAssign>
propagate_on_container_copy_assignment;
- typedef boost::container::container_detail::bool_<PropagateOnContMoveAssign>
+ typedef boost::container::dtl::bool_<PropagateOnContMoveAssign>
propagate_on_container_move_assignment;
- typedef boost::container::container_detail::bool_<PropagateOnContSwap>
+ typedef boost::container::dtl::bool_<PropagateOnContSwap>
propagate_on_container_swap;
template<class T2>
diff --git a/libs/container/test/emplace_test.hpp b/libs/container/test/emplace_test.hpp
index 89f425598a..cd8147bb73 100644
--- a/libs/container/test/emplace_test.hpp
+++ b/libs/container/test/emplace_test.hpp
@@ -144,7 +144,7 @@ bool test_expected_container(const Container &ec, const std::pair<EmplaceInt, Em
}
typedef std::pair<EmplaceInt, EmplaceInt> EmplaceIntPair;
-static boost::container::container_detail::aligned_storage<sizeof(EmplaceIntPair)*10>::type pair_storage;
+static boost::container::dtl::aligned_storage<sizeof(EmplaceIntPair)*10>::type pair_storage;
static EmplaceIntPair* initialize_emplace_int_pair()
{
@@ -160,7 +160,7 @@ static EmplaceIntPair * expected_pair = initialize_emplace_int_pair();
template<class Container>
-bool test_emplace_back(container_detail::true_)
+bool test_emplace_back(dtl::true_)
{
std::cout << "Starting test_emplace_back." << std::endl << " Class: "
<< typeid(Container).name() << std::endl;
@@ -209,11 +209,11 @@ bool test_emplace_back(container_detail::true_)
}
template<class Container>
-bool test_emplace_back(container_detail::false_)
+bool test_emplace_back(dtl::false_)
{ return true; }
template<class Container>
-bool test_emplace_front(container_detail::true_)
+bool test_emplace_front(dtl::true_)
{
std::cout << "Starting test_emplace_front." << std::endl << " Class: "
<< typeid(Container).name() << std::endl;
@@ -261,11 +261,11 @@ bool test_emplace_front(container_detail::true_)
}
template<class Container>
-bool test_emplace_front(container_detail::false_)
+bool test_emplace_front(dtl::false_)
{ return true; }
template<class Container>
-bool test_emplace_before(container_detail::true_)
+bool test_emplace_before(dtl::true_)
{
std::cout << "Starting test_emplace_before." << std::endl << " Class: "
<< typeid(Container).name() << std::endl;
@@ -373,11 +373,11 @@ bool test_emplace_before(container_detail::true_)
}
template<class Container>
-bool test_emplace_before(container_detail::false_)
+bool test_emplace_before(dtl::false_)
{ return true; }
template<class Container>
-bool test_emplace_after(container_detail::true_)
+bool test_emplace_after(dtl::true_)
{
std::cout << "Starting test_emplace_after." << std::endl << " Class: "
<< typeid(Container).name() << std::endl;
@@ -459,11 +459,11 @@ bool test_emplace_after(container_detail::true_)
}
template<class Container>
-bool test_emplace_after(container_detail::false_)
+bool test_emplace_after(dtl::false_)
{ return true; }
template<class Container>
-bool test_emplace_assoc(container_detail::true_)
+bool test_emplace_assoc(dtl::true_)
{
std::cout << "Starting test_emplace_assoc." << std::endl << " Class: "
<< typeid(Container).name() << std::endl;
@@ -506,11 +506,11 @@ bool test_emplace_assoc(container_detail::true_)
}
template<class Container>
-bool test_emplace_assoc(container_detail::false_)
+bool test_emplace_assoc(dtl::false_)
{ return true; }
template<class Container>
-bool test_emplace_hint(container_detail::true_)
+bool test_emplace_hint(dtl::true_)
{
std::cout << "Starting test_emplace_hint." << std::endl << " Class: "
<< typeid(Container).name() << std::endl;
@@ -556,11 +556,11 @@ bool test_emplace_hint(container_detail::true_)
}
template<class Container>
-bool test_emplace_hint(container_detail::false_)
+bool test_emplace_hint(dtl::false_)
{ return true; }
template<class Container>
-bool test_emplace_assoc_pair(container_detail::true_)
+bool test_emplace_assoc_pair(dtl::true_)
{
std::cout << "Starting test_emplace_assoc_pair." << std::endl << " Class: "
<< typeid(Container).name() << std::endl;
@@ -594,11 +594,11 @@ bool test_emplace_assoc_pair(container_detail::true_)
}
template<class Container>
-bool test_emplace_assoc_pair(container_detail::false_)
+bool test_emplace_assoc_pair(dtl::false_)
{ return true; }
template<class Container>
-bool test_emplace_hint_pair(container_detail::true_)
+bool test_emplace_hint_pair(dtl::true_)
{
std::cout << "Starting test_emplace_hint_pair." << std::endl << " Class: "
<< typeid(Container).name() << std::endl;
@@ -633,14 +633,14 @@ bool test_emplace_hint_pair(container_detail::true_)
}
template<class Container>
-bool test_emplace_hint_pair(container_detail::false_)
+bool test_emplace_hint_pair(dtl::false_)
{ return true; }
template <EmplaceOptions O, EmplaceOptions Mask>
struct emplace_active
{
static const bool value = (0 != (O & Mask));
- typedef container_detail::bool_<value> type;
+ typedef dtl::bool_<value> type;
operator type() const{ return type(); }
};
diff --git a/libs/container/test/expand_bwd_test_allocator.hpp b/libs/container/test/expand_bwd_test_allocator.hpp
index 2e1609384c..3a5bb6c1df 100644
--- a/libs/container/test/expand_bwd_test_allocator.hpp
+++ b/libs/container/test/expand_bwd_test_allocator.hpp
@@ -62,14 +62,14 @@ class expand_bwd_test_allocator
typedef T value_type;
typedef T * pointer;
typedef const T * const_pointer;
- typedef typename container_detail::add_reference
+ typedef typename dtl::add_reference
<value_type>::type reference;
- typedef typename container_detail::add_reference
+ typedef typename dtl::add_reference
<const value_type>::type const_reference;
typedef std::size_t size_type;
typedef std::ptrdiff_t difference_type;
- typedef boost::container::container_detail::version_type<expand_bwd_test_allocator, 2> version;
+ typedef boost::container::dtl::version_type<expand_bwd_test_allocator, 2> version;
//Dummy multiallocation chain
struct multiallocation_chain{};
@@ -95,10 +95,10 @@ class expand_bwd_test_allocator
, m_offset(other.m_offset), m_allocations(0){ }
pointer address(reference value)
- { return pointer(container_detail::addressof(value)); }
+ { return pointer(dtl::addressof(value)); }
const_pointer address(const_reference value) const
- { return const_pointer(container_detail::addressof(value)); }
+ { return const_pointer(dtl::addressof(value)); }
pointer allocate(size_type , cvoid_ptr hint = 0)
{ (void)hint; return 0; }
diff --git a/libs/container/test/flat_map_test.cpp b/libs/container/test/flat_map_test.cpp
index ca0a3a11e2..bb6326a17e 100644
--- a/libs/container/test/flat_map_test.cpp
+++ b/libs/container/test/flat_map_test.cpp
@@ -370,13 +370,13 @@ struct GetMapContainer
typedef flat_map< ValueType
, ValueType
, std::less<ValueType>
- , typename boost::container::container_detail::container_or_allocator_rebind<VoidAllocatorOrContainer, type_t>::type
+ , typename boost::container::dtl::container_or_allocator_rebind<VoidAllocatorOrContainer, type_t>::type
> map_type;
typedef flat_multimap< ValueType
, ValueType
, std::less<ValueType>
- , typename boost::container::container_detail::container_or_allocator_rebind<VoidAllocatorOrContainer, type_t>::type
+ , typename boost::container::dtl::container_or_allocator_rebind<VoidAllocatorOrContainer, type_t>::type
> multimap_type;
};
};
diff --git a/libs/container/test/flat_set_test.cpp b/libs/container/test/flat_set_test.cpp
index a092a74fff..e23cf7a74b 100644
--- a/libs/container/test/flat_set_test.cpp
+++ b/libs/container/test/flat_set_test.cpp
@@ -316,6 +316,25 @@ bool flat_tree_ordered_insertion_test()
int_set4.insert(int_even_set.begin(), int_even_set.end());
if(!CheckEqualContainers(int_set4, fset))
return false;
+
+ //add even/odd values with not enough capacity
+ flat_set<int>().swap(fset);
+ int_set4.clear();
+ int_set.clear();
+
+ fset.reserve(int_even_set.size());
+ fset.insert(ordered_unique_range, int_even_set.begin(), int_even_set.end());
+ int_set4.insert(int_even_set.begin(), int_even_set.end());
+
+ for(std::size_t i = 0; i < NumElements*2; i+=2){
+ int_set.insert(static_cast<int>(i));
+ int_set.insert(static_cast<int>(i+1));
+ }
+
+ fset.insert(ordered_unique_range, int_set.begin(), int_set.end());
+ int_set4.insert(int_set.begin(), int_set.end());
+ if(!CheckEqualContainers(int_set4, fset))
+ return false;
}
return true;
@@ -441,12 +460,12 @@ struct GetSetContainer
{
typedef flat_set < ValueType
, std::less<ValueType>
- , typename boost::container::container_detail::container_or_allocator_rebind<VoidAllocatorOrContainer, ValueType>::type
+ , typename boost::container::dtl::container_or_allocator_rebind<VoidAllocatorOrContainer, ValueType>::type
> set_type;
typedef flat_multiset < ValueType
, std::less<ValueType>
- , typename boost::container::container_detail::container_or_allocator_rebind<VoidAllocatorOrContainer, ValueType>::type
+ , typename boost::container::dtl::container_or_allocator_rebind<VoidAllocatorOrContainer, ValueType>::type
> multiset_type;
};
};
diff --git a/libs/container/test/flat_tree_test.cpp b/libs/container/test/flat_tree_test.cpp
index a8c944a67d..b70fb4a190 100644
--- a/libs/container/test/flat_tree_test.cpp
+++ b/libs/container/test/flat_tree_test.cpp
@@ -17,14 +17,14 @@
using namespace boost::container;
-typedef boost::container::container_detail::pair<test::movable_and_copyable_int, test::movable_and_copyable_int> pair_t;
+typedef boost::container::dtl::pair<test::movable_and_copyable_int, test::movable_and_copyable_int> pair_t;
namespace boost {
namespace container {
//Explicit instantiation to detect compilation errors
-namespace container_detail {
+namespace dtl {
template class flat_tree
< pair_t
@@ -89,7 +89,7 @@ template class flat_tree
, static_vector<test::movable_and_copyable_int, 10>
>;
-} //container_detail {
+} //dtl {
}} //boost::container
#if (__cplusplus > 201103L)
@@ -97,7 +97,7 @@ template class flat_tree
namespace boost{
namespace container{
-namespace container_detail{
+namespace dtl{
template class flat_tree
< test::movable_and_copyable_int
@@ -113,7 +113,7 @@ template class flat_tree
, std::vector<pair_t>
>;
-} //container_detail {
+} //dtl {
}} //boost::container
#endif
diff --git a/libs/container/test/global_resource_test.cpp b/libs/container/test/global_resource_test.cpp
index 860b46393a..c04816ac4f 100644
--- a/libs/container/test/global_resource_test.cpp
+++ b/libs/container/test/global_resource_test.cpp
@@ -27,7 +27,7 @@ std::size_t allocation_count = 0;
#pragma warning (disable : 4290)
#endif
-#if defined(BOOST_GCC) && (BOOST_GCC >= 40700) && (__cplusplus >= 201103L)
+#if __cplusplus >= 201103L
#define BOOST_CONTAINER_NEW_EXCEPTION_SPECIFIER
#define BOOST_CONTAINER_DELETE_EXCEPTION_SPECIFIER noexcept
#else
diff --git a/libs/container/test/list_test.cpp b/libs/container/test/list_test.cpp
index 065fa2806b..aa56b099c6 100644
--- a/libs/container/test/list_test.cpp
+++ b/libs/container/test/list_test.cpp
@@ -34,7 +34,7 @@ template class boost::container::list
< test::movable_and_copyable_int
, adaptive_pool<test::movable_and_copyable_int> >;
-namespace container_detail {
+namespace dtl {
template class iterator_from_iiterator
<intrusive_list_type< std::allocator<int> >::container_type::iterator, true >;
diff --git a/libs/container/test/list_test.hpp b/libs/container/test/list_test.hpp
index aec82c6f3f..9640ec099d 100644
--- a/libs/container/test/list_test.hpp
+++ b/libs/container/test/list_test.hpp
@@ -28,14 +28,14 @@ namespace container {
namespace test{
template<class V1, class V2>
-bool list_copyable_only(V1 &, V2 &, boost::container::container_detail::false_type)
+bool list_copyable_only(V1 &, V2 &, boost::container::dtl::false_type)
{
return true;
}
//Function to check if both sets are equal
template<class V1, class V2>
-bool list_copyable_only(V1 &boostlist, V2 &stdlist, boost::container::container_detail::true_type)
+bool list_copyable_only(V1 &boostlist, V2 &stdlist, boost::container::dtl::true_type)
{
typedef typename V1::value_type IntType;
boostlist.insert(boostlist.end(), 50, IntType(1));
@@ -403,7 +403,7 @@ int list_test (bool copied_allocators_equal = true)
}
if(!list_copyable_only(boostlist, stdlist
- ,container_detail::bool_<boost::container::test::is_copyable<IntType>::value>())){
+ ,dtl::bool_<boost::container::test::is_copyable<IntType>::value>())){
return 1;
}
}
diff --git a/libs/container/test/map_test.hpp b/libs/container/test/map_test.hpp
index 01dd4c4cee..93dbf2fa6e 100644
--- a/libs/container/test/map_test.hpp
+++ b/libs/container/test/map_test.hpp
@@ -42,11 +42,11 @@ namespace container {
namespace test{
template<class C>
-void map_test_rebalanceable(C &, boost::container::container_detail::false_type)
+void map_test_rebalanceable(C &, boost::container::dtl::false_type)
{}
template<class C>
-void map_test_rebalanceable(C &c, boost::container::container_detail::true_type)
+void map_test_rebalanceable(C &c, boost::container::dtl::true_type)
{
c.rebalance();
}
@@ -55,17 +55,17 @@ template<class MyBoostMap
,class MyStdMap
,class MyBoostMultiMap
,class MyStdMultiMap>
-int map_test_copyable(boost::container::container_detail::false_type)
+int map_test_copyable(boost::container::dtl::false_type)
{ return 0; }
template<class MyBoostMap
,class MyStdMap
,class MyBoostMultiMap
,class MyStdMultiMap>
-int map_test_copyable(boost::container::container_detail::true_type)
+int map_test_copyable(boost::container::dtl::true_type)
{
typedef typename MyBoostMap::key_type IntType;
- typedef container_detail::pair<IntType, IntType> IntPairType;
+ typedef dtl::pair<IntType, IntType> IntPairType;
typedef typename MyStdMap::value_type StdPairType;
const int MaxElem = 50;
@@ -136,7 +136,7 @@ template<class MyBoostMap
int map_test()
{
typedef typename MyBoostMap::key_type IntType;
- typedef container_detail::pair<IntType, IntType> IntPairType;
+ typedef dtl::pair<IntType, IntType> IntPairType;
typedef typename MyStdMap::value_type StdPairType;
const int MaxElem = 50;
typedef typename MyStdMap::value_type StdValueType;
@@ -615,13 +615,13 @@ int map_test()
return 1;
map_test_rebalanceable(boostmap
- , container_detail::bool_<has_member_rebalance<MyBoostMap>::value>());
+ , dtl::bool_<has_member_rebalance<MyBoostMap>::value>());
if(!CheckEqualContainers(boostmap, stdmap)){
std::cout << "Error in boostmap.rebalance()" << std::endl;
return 1;
}
map_test_rebalanceable(boostmultimap
- , container_detail::bool_<has_member_rebalance<MyBoostMap>::value>());
+ , dtl::bool_<has_member_rebalance<MyBoostMap>::value>());
if(!CheckEqualContainers(boostmultimap, stdmultimap)){
std::cout << "Error in boostmultimap.rebalance()" << std::endl;
return 1;
@@ -898,7 +898,7 @@ int map_test()
}
if(map_test_copyable<MyBoostMap, MyStdMap, MyBoostMultiMap, MyStdMultiMap>
- (container_detail::bool_<boost::container::test::is_copyable<IntType>::value>())){
+ (dtl::bool_<boost::container::test::is_copyable<IntType>::value>())){
return 1;
}
return 0;
diff --git a/libs/container/test/node_handle_test.cpp b/libs/container/test/node_handle_test.cpp
index 94ce2ed5d9..3c26379461 100644
--- a/libs/container/test/node_handle_test.cpp
+++ b/libs/container/test/node_handle_test.cpp
@@ -174,16 +174,16 @@ typedef allocator_traits<node_alloc_t>::portable_rebind_alloc<test_pair>::type v
void test_types()
{
//set
- BOOST_STATIC_ASSERT(( container_detail::is_same<node_handle_set_t::value_type, test_pair>::value ));
- BOOST_STATIC_ASSERT(( container_detail::is_same<node_handle_set_t::key_type, test_pair>::value ));
- BOOST_STATIC_ASSERT(( container_detail::is_same<node_handle_set_t::mapped_type, test_pair>::value ));
- BOOST_STATIC_ASSERT(( container_detail::is_same<node_handle_set_t::allocator_type, value_allocator_type>::value ));
+ BOOST_STATIC_ASSERT(( dtl::is_same<node_handle_set_t::value_type, test_pair>::value ));
+ BOOST_STATIC_ASSERT(( dtl::is_same<node_handle_set_t::key_type, test_pair>::value ));
+ BOOST_STATIC_ASSERT(( dtl::is_same<node_handle_set_t::mapped_type, test_pair>::value ));
+ BOOST_STATIC_ASSERT(( dtl::is_same<node_handle_set_t::allocator_type, value_allocator_type>::value ));
//map
- BOOST_STATIC_ASSERT(( container_detail::is_same<node_handle_map_t::value_type, test_pair>::value ));
- BOOST_STATIC_ASSERT(( container_detail::is_same<node_handle_map_t::key_type, int>::value ));
- BOOST_STATIC_ASSERT(( container_detail::is_same<node_handle_map_t::mapped_type, unsigned>::value ));
- BOOST_STATIC_ASSERT(( container_detail::is_same<node_handle_map_t::allocator_type, value_allocator_type>::value ));
+ BOOST_STATIC_ASSERT(( dtl::is_same<node_handle_map_t::value_type, test_pair>::value ));
+ BOOST_STATIC_ASSERT(( dtl::is_same<node_handle_map_t::key_type, int>::value ));
+ BOOST_STATIC_ASSERT(( dtl::is_same<node_handle_map_t::mapped_type, unsigned>::value ));
+ BOOST_STATIC_ASSERT(( dtl::is_same<node_handle_map_t::allocator_type, value_allocator_type>::value ));
}
void test_default_constructor()
diff --git a/libs/container/test/null_iterators_test.cpp b/libs/container/test/null_iterators_test.cpp
index faf60be139..f081dbe0ec 100644
--- a/libs/container/test/null_iterators_test.cpp
+++ b/libs/container/test/null_iterators_test.cpp
@@ -28,7 +28,7 @@
using namespace boost::container;
-typedef boost::container::container_detail::aligned_storage<sizeof(void*)*4>::type buffer_t;
+typedef boost::container::dtl::aligned_storage<sizeof(void*)*4>::type buffer_t;
static buffer_t buffer_0x00;
static buffer_t buffer_0xFF;
diff --git a/libs/container/test/pair_test.cpp b/libs/container/test/pair_test.cpp
index a8f4b0af55..fcab0fb510 100644
--- a/libs/container/test/pair_test.cpp
+++ b/libs/container/test/pair_test.cpp
@@ -36,50 +36,50 @@ using namespace ::boost::container;
int main ()
{
{
- container_detail::pair<test::non_copymovable_int, test::non_copymovable_int> p1;
- container_detail::pair<test::copyable_int, test::copyable_int> p2;
- container_detail::pair<test::movable_int, test::movable_int> p3;
- container_detail::pair<test::movable_and_copyable_int, test::movable_and_copyable_int> p4;
+ dtl::pair<test::non_copymovable_int, test::non_copymovable_int> p1;
+ dtl::pair<test::copyable_int, test::copyable_int> p2;
+ dtl::pair<test::movable_int, test::movable_int> p3;
+ dtl::pair<test::movable_and_copyable_int, test::movable_and_copyable_int> p4;
}
{ //Constructible from two values
- container_detail::pair<test::non_copymovable_int, test::non_copymovable_int> p1(1, 2);
- container_detail::pair<test::copyable_int, test::copyable_int> p2(1, 2);
- container_detail::pair<test::movable_int, test::movable_int> p3(1, 2);
- container_detail::pair<test::movable_and_copyable_int, test::movable_and_copyable_int> p4(1, 2);
+ dtl::pair<test::non_copymovable_int, test::non_copymovable_int> p1(1, 2);
+ dtl::pair<test::copyable_int, test::copyable_int> p2(1, 2);
+ dtl::pair<test::movable_int, test::movable_int> p3(1, 2);
+ dtl::pair<test::movable_and_copyable_int, test::movable_and_copyable_int> p4(1, 2);
}
{ //Constructible from internal types
- container_detail::pair<test::copyable_int, test::copyable_int> p2(test::copyable_int(1), test::copyable_int(2));
+ dtl::pair<test::copyable_int, test::copyable_int> p2(test::copyable_int(1), test::copyable_int(2));
{
test::movable_int a(1), b(2);
- container_detail::pair<test::movable_int, test::movable_int> p3(::boost::move(a), ::boost::move(b));
+ dtl::pair<test::movable_int, test::movable_int> p3(::boost::move(a), ::boost::move(b));
}
{
test::movable_and_copyable_int a(1), b(2);
- container_detail::pair<test::movable_and_copyable_int, test::movable_and_copyable_int> p4(::boost::move(a), ::boost::move(b));
+ dtl::pair<test::movable_and_copyable_int, test::movable_and_copyable_int> p4(::boost::move(a), ::boost::move(b));
}
}
{ //piecewise construct from boost tuple
using namespace boost::tuples;
{
- boost::container::container_detail::pair<int, float> p(piecewise_construct, tuple<>(), tuple<>());
+ boost::container::dtl::pair<int, float> p(piecewise_construct, tuple<>(), tuple<>());
BOOST_TEST(p.first == 0);
BOOST_TEST(p.second == 0.f);
}
{
- boost::container::container_detail::pair<int, float> p(piecewise_construct, tuple<>(), tuple<float>(2.f));
+ boost::container::dtl::pair<int, float> p(piecewise_construct, tuple<>(), tuple<float>(2.f));
BOOST_TEST(p.first == 0);
BOOST_TEST(p.second == 2.f);
}
{
- boost::container::container_detail::pair<int, float> p(piecewise_construct, tuple<int>(2), tuple<float>(1.f));
+ boost::container::dtl::pair<int, float> p(piecewise_construct, tuple<int>(2), tuple<float>(1.f));
BOOST_TEST(p.first == 2);
BOOST_TEST(p.second == 1.f);
}
{
- boost::container::container_detail::pair
- < boost::container::container_detail::pair<int, float>
- , boost::container::container_detail::pair<double, char>
+ boost::container::dtl::pair
+ < boost::container::dtl::pair<int, float>
+ , boost::container::dtl::pair<double, char>
> p(piecewise_construct, tuple<int, float>(3, 4.f), tuple<double, char>(8.,'a'));
BOOST_TEST(p.first.first == 3);
BOOST_TEST(p.first.second == 4.f);
@@ -87,7 +87,7 @@ int main ()
BOOST_TEST(p.second.second == 'a');
}
{
- boost::container::container_detail::pair
+ boost::container::dtl::pair
< tuple<int, float, double>
, char
> p(piecewise_construct, tuple<int, float, double>(3, 16.f, 32.), tuple<char>('b'));
@@ -101,24 +101,24 @@ int main ()
{ //piecewise construct from std tuple
using std::tuple;
{
- boost::container::container_detail::pair<int, float> p(piecewise_construct, tuple<>(), tuple<>());
+ boost::container::dtl::pair<int, float> p(piecewise_construct, tuple<>(), tuple<>());
BOOST_TEST(p.first == 0);
BOOST_TEST(p.second == 0.f);
}
{
- boost::container::container_detail::pair<int, float> p(piecewise_construct, tuple<>(), tuple<float>(2.f));
+ boost::container::dtl::pair<int, float> p(piecewise_construct, tuple<>(), tuple<float>(2.f));
BOOST_TEST(p.first == 0);
BOOST_TEST(p.second == 2.f);
}
{
- boost::container::container_detail::pair<int, float> p(piecewise_construct, tuple<int>(2), tuple<float>(1.f));
+ boost::container::dtl::pair<int, float> p(piecewise_construct, tuple<int>(2), tuple<float>(1.f));
BOOST_TEST(p.first == 2);
BOOST_TEST(p.second == 1.f);
}
{
- boost::container::container_detail::pair
- < boost::container::container_detail::pair<int, float>
- , boost::container::container_detail::pair<double, char>
+ boost::container::dtl::pair
+ < boost::container::dtl::pair<int, float>
+ , boost::container::dtl::pair<double, char>
> p(piecewise_construct, tuple<int, float>(3, 4.f), tuple<double, char>(8.,'a'));
BOOST_TEST(p.first.first == 3);
BOOST_TEST(p.first.second == 4.f);
@@ -126,7 +126,7 @@ int main ()
BOOST_TEST(p.second.second == 'a');
}
{
- boost::container::container_detail::pair
+ boost::container::dtl::pair
< tuple<int, float, double>
, char
> p(piecewise_construct, tuple<int, float, double>(3, 16.f, 32.), tuple<char>('b'));
@@ -136,12 +136,12 @@ int main ()
BOOST_TEST(p.second == 'b');
}
#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) && !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
- typedef container_detail::pair<test::movable_int, test::movable_int> movable_pair_t;
- typedef container_detail::pair<movable_pair_t, movable_pair_t> movable_pair_pair_t;
+ typedef dtl::pair<test::movable_int, test::movable_int> movable_pair_t;
+ typedef dtl::pair<movable_pair_t, movable_pair_t> movable_pair_pair_t;
test::movable_int a(1), b(2), c(3), d(4);
movable_pair_pair_t p( piecewise_construct
- , container_detail::forward_as_tuple(boost::move(a), boost::move(b))
- , container_detail::forward_as_tuple(boost::move(c), boost::move(d))
+ , dtl::forward_as_tuple(boost::move(a), boost::move(b))
+ , dtl::forward_as_tuple(boost::move(c), boost::move(d))
);
BOOST_TEST(p.first.first == 1);
BOOST_TEST(p.first.second == 2);
diff --git a/libs/container/test/pmr_deque_test.cpp b/libs/container/test/pmr_deque_test.cpp
index 1b1a4bdfeb..15c67e2a62 100644
--- a/libs/container/test/pmr_deque_test.cpp
+++ b/libs/container/test/pmr_deque_test.cpp
@@ -15,7 +15,7 @@
int main()
{
using namespace boost::container;
- using boost::container::container_detail::is_same;
+ using boost::container::dtl::is_same;
typedef deque<int, pmr::polymorphic_allocator<int> > intcontainer_t;
BOOST_STATIC_ASSERT(( is_same<intcontainer_t, pmr::deque_of<int>::type >::value ));
diff --git a/libs/container/test/pmr_flat_map_test.cpp b/libs/container/test/pmr_flat_map_test.cpp
index 2969db2b30..f98e497bfa 100644
--- a/libs/container/test/pmr_flat_map_test.cpp
+++ b/libs/container/test/pmr_flat_map_test.cpp
@@ -15,7 +15,7 @@
int main()
{
using namespace boost::container;
- using boost::container::container_detail::is_same;
+ using boost::container::dtl::is_same;
typedef flat_map<int, float, std::less<int>, pmr::polymorphic_allocator<std::pair<int, float> > > intcontainer_t;
BOOST_STATIC_ASSERT(( is_same<intcontainer_t, pmr::flat_map_of<int, float>::type >::value ));
diff --git a/libs/container/test/pmr_flat_set_test.cpp b/libs/container/test/pmr_flat_set_test.cpp
index 55cd5b3bd1..5c9efe1a70 100644
--- a/libs/container/test/pmr_flat_set_test.cpp
+++ b/libs/container/test/pmr_flat_set_test.cpp
@@ -15,7 +15,7 @@
int main()
{
using namespace boost::container;
- using boost::container::container_detail::is_same;
+ using boost::container::dtl::is_same;
typedef flat_set<int, std::less<int>, pmr::polymorphic_allocator<int> > intcontainer_t;
BOOST_STATIC_ASSERT(( is_same<intcontainer_t, pmr::flat_set_of<int>::type >::value ));
diff --git a/libs/container/test/pmr_list_test.cpp b/libs/container/test/pmr_list_test.cpp
index 8b3bd22c83..794ccf524b 100644
--- a/libs/container/test/pmr_list_test.cpp
+++ b/libs/container/test/pmr_list_test.cpp
@@ -15,7 +15,7 @@
int main()
{
using namespace boost::container;
- using boost::container::container_detail::is_same;
+ using boost::container::dtl::is_same;
typedef list<int, pmr::polymorphic_allocator<int> > intcontainer_t;
BOOST_STATIC_ASSERT(( is_same<intcontainer_t, pmr::list_of<int>::type >::value ));
diff --git a/libs/container/test/pmr_map_test.cpp b/libs/container/test/pmr_map_test.cpp
index d50c10f679..5db3f10912 100644
--- a/libs/container/test/pmr_map_test.cpp
+++ b/libs/container/test/pmr_map_test.cpp
@@ -15,7 +15,7 @@
int main()
{
using namespace boost::container;
- using boost::container::container_detail::is_same;
+ using boost::container::dtl::is_same;
typedef map<int, float, std::less<int>, pmr::polymorphic_allocator<std::pair<const int, float> > > intcontainer_t;
BOOST_STATIC_ASSERT(( is_same<intcontainer_t, pmr::map_of<int, float>::type >::value ));
diff --git a/libs/container/test/pmr_set_test.cpp b/libs/container/test/pmr_set_test.cpp
index 6788eb56ed..3093fd4340 100644
--- a/libs/container/test/pmr_set_test.cpp
+++ b/libs/container/test/pmr_set_test.cpp
@@ -15,7 +15,7 @@
int main()
{
using namespace boost::container;
- using boost::container::container_detail::is_same;
+ using boost::container::dtl::is_same;
typedef set<int, std::less<int>, pmr::polymorphic_allocator<int> > intcontainer_t;
BOOST_STATIC_ASSERT(( is_same<intcontainer_t, pmr::set_of<int>::type >::value ));
diff --git a/libs/container/test/pmr_small_vector_test.cpp b/libs/container/test/pmr_small_vector_test.cpp
index cc6a0bd6de..334588da37 100644
--- a/libs/container/test/pmr_small_vector_test.cpp
+++ b/libs/container/test/pmr_small_vector_test.cpp
@@ -15,7 +15,7 @@
int main()
{
using namespace boost::container;
- using boost::container::container_detail::is_same;
+ using boost::container::dtl::is_same;
typedef small_vector<int, 2, pmr::polymorphic_allocator<int> > intcontainer_t;
BOOST_STATIC_ASSERT(( is_same<intcontainer_t, pmr::small_vector_of<int, 2>::type >::value ));
diff --git a/libs/container/test/pmr_stable_vector_test.cpp b/libs/container/test/pmr_stable_vector_test.cpp
index d0a280f182..246f071c34 100644
--- a/libs/container/test/pmr_stable_vector_test.cpp
+++ b/libs/container/test/pmr_stable_vector_test.cpp
@@ -15,7 +15,7 @@
int main()
{
using namespace boost::container;
- using boost::container::container_detail::is_same;
+ using boost::container::dtl::is_same;
typedef stable_vector<int, pmr::polymorphic_allocator<int> > intcontainer_t;
BOOST_STATIC_ASSERT(( is_same<intcontainer_t, pmr::stable_vector_of<int>::type >::value ));
diff --git a/libs/container/test/pmr_string_test.cpp b/libs/container/test/pmr_string_test.cpp
index 628865f92b..c8d81a5ba7 100644
--- a/libs/container/test/pmr_string_test.cpp
+++ b/libs/container/test/pmr_string_test.cpp
@@ -15,7 +15,7 @@
int main()
{
using namespace boost::container;
- using boost::container::container_detail::is_same;
+ using boost::container::dtl::is_same;
typedef basic_string<char, std::char_traits<char>, pmr::polymorphic_allocator<char> > string_t;
typedef basic_string<wchar_t, std::char_traits<wchar_t>, pmr::polymorphic_allocator<wchar_t> > wstring_t;
diff --git a/libs/container/test/pmr_vector_test.cpp b/libs/container/test/pmr_vector_test.cpp
index df0cac121b..293291ce09 100644
--- a/libs/container/test/pmr_vector_test.cpp
+++ b/libs/container/test/pmr_vector_test.cpp
@@ -15,7 +15,7 @@
int main()
{
using namespace boost::container;
- using boost::container::container_detail::is_same;
+ using boost::container::dtl::is_same;
typedef vector<int, pmr::polymorphic_allocator<int> > intcontainer_t;
BOOST_STATIC_ASSERT(( is_same<intcontainer_t, pmr::vector_of<int>::type >::value ));
diff --git a/libs/container/test/polymorphic_allocator_test.cpp b/libs/container/test/polymorphic_allocator_test.cpp
index 449b706c2c..10899cac1e 100644
--- a/libs/container/test/polymorphic_allocator_test.cpp
+++ b/libs/container/test/polymorphic_allocator_test.cpp
@@ -63,7 +63,7 @@ void test_allocate()
BOOST_TEST(d.do_allocate_return == &dummy);
//It shall allocate 2*sizeof(int), alignment_of<int>
BOOST_TEST(d.do_allocate_bytes == 2*sizeof(int));
- BOOST_TEST(d.do_allocate_alignment == container_detail::alignment_of<int>::value);
+ BOOST_TEST(d.do_allocate_alignment == dtl::alignment_of<int>::value);
}
void test_deallocate()
@@ -77,7 +77,7 @@ void test_deallocate()
//It shall deallocate 2*sizeof(int), alignment_of<int>
BOOST_TEST(d.do_deallocate_p == &dummy);
BOOST_TEST(d.do_deallocate_bytes == 3*sizeof(int));
- BOOST_TEST(d.do_deallocate_alignment == container_detail::alignment_of<int>::value);
+ BOOST_TEST(d.do_deallocate_alignment == dtl::alignment_of<int>::value);
}
void test_construct()
diff --git a/libs/container/test/propagation_test_allocator.hpp b/libs/container/test/propagation_test_allocator.hpp
index ca6d8e5fe4..7c8643c556 100644
--- a/libs/container/test/propagation_test_allocator.hpp
+++ b/libs/container/test/propagation_test_allocator.hpp
@@ -29,10 +29,10 @@ class propagation_test_allocator
typedef propagation_test_allocator<U, Id, HasTrueTypes> other;
};
- typedef boost::container::container_detail::bool_<HasTrueTypes> propagate_on_container_copy_assignment;
- typedef boost::container::container_detail::bool_<HasTrueTypes> propagate_on_container_move_assignment;
- typedef boost::container::container_detail::bool_<HasTrueTypes> propagate_on_container_swap;
- typedef boost::container::container_detail::bool_<HasTrueTypes> is_always_equal;
+ typedef boost::container::dtl::bool_<HasTrueTypes> propagate_on_container_copy_assignment;
+ typedef boost::container::dtl::bool_<HasTrueTypes> propagate_on_container_move_assignment;
+ typedef boost::container::dtl::bool_<HasTrueTypes> propagate_on_container_swap;
+ typedef boost::container::dtl::bool_<HasTrueTypes> is_always_equal;
typedef T value_type;
propagation_test_allocator()
diff --git a/libs/container/test/scoped_allocator_adaptor_test.cpp b/libs/container/test/scoped_allocator_adaptor_test.cpp
index 51d6ee155f..6a051e2793 100644
--- a/libs/container/test/scoped_allocator_adaptor_test.cpp
+++ b/libs/container/test/scoped_allocator_adaptor_test.cpp
@@ -98,81 +98,81 @@ int main()
, InnerAlloc2 > Rebound9Scoped2Inner;
//outer_allocator_type
- BOOST_STATIC_ASSERT(( container_detail::is_same< OuterAlloc
+ BOOST_STATIC_ASSERT(( dtl::is_same< OuterAlloc
, Scoped0Inner::outer_allocator_type>::value ));
- BOOST_STATIC_ASSERT(( container_detail::is_same< OuterAlloc
+ BOOST_STATIC_ASSERT(( dtl::is_same< OuterAlloc
, Scoped1Inner::outer_allocator_type>::value ));
- BOOST_STATIC_ASSERT(( container_detail::is_same< OuterAlloc
+ BOOST_STATIC_ASSERT(( dtl::is_same< OuterAlloc
, Scoped2Inner::outer_allocator_type>::value ));
//value_type
- BOOST_STATIC_ASSERT(( container_detail::is_same< allocator_traits<OuterAlloc>::value_type
+ BOOST_STATIC_ASSERT(( dtl::is_same< allocator_traits<OuterAlloc>::value_type
, Scoped0Inner::value_type>::value ));
- BOOST_STATIC_ASSERT(( container_detail::is_same< allocator_traits<OuterAlloc>::value_type
+ BOOST_STATIC_ASSERT(( dtl::is_same< allocator_traits<OuterAlloc>::value_type
, Scoped1Inner::value_type>::value ));
- BOOST_STATIC_ASSERT(( container_detail::is_same< allocator_traits<OuterAlloc>::value_type
+ BOOST_STATIC_ASSERT(( dtl::is_same< allocator_traits<OuterAlloc>::value_type
, Scoped2Inner::value_type>::value ));
//size_type
- BOOST_STATIC_ASSERT(( container_detail::is_same< allocator_traits<OuterAlloc>::size_type
+ BOOST_STATIC_ASSERT(( dtl::is_same< allocator_traits<OuterAlloc>::size_type
, Scoped0Inner::size_type>::value ));
- BOOST_STATIC_ASSERT(( container_detail::is_same< allocator_traits<OuterAlloc>::size_type
+ BOOST_STATIC_ASSERT(( dtl::is_same< allocator_traits<OuterAlloc>::size_type
, Scoped1Inner::size_type>::value ));
- BOOST_STATIC_ASSERT(( container_detail::is_same< allocator_traits<OuterAlloc>::size_type
+ BOOST_STATIC_ASSERT(( dtl::is_same< allocator_traits<OuterAlloc>::size_type
, Scoped2Inner::size_type>::value ));
//difference_type
- BOOST_STATIC_ASSERT(( container_detail::is_same< allocator_traits<OuterAlloc>::difference_type
+ BOOST_STATIC_ASSERT(( dtl::is_same< allocator_traits<OuterAlloc>::difference_type
, Scoped0Inner::difference_type>::value ));
- BOOST_STATIC_ASSERT(( container_detail::is_same< allocator_traits<OuterAlloc>::difference_type
+ BOOST_STATIC_ASSERT(( dtl::is_same< allocator_traits<OuterAlloc>::difference_type
, Scoped1Inner::difference_type>::value ));
- BOOST_STATIC_ASSERT(( container_detail::is_same< allocator_traits<OuterAlloc>::difference_type
+ BOOST_STATIC_ASSERT(( dtl::is_same< allocator_traits<OuterAlloc>::difference_type
, Scoped2Inner::difference_type>::value ));
//pointer
- BOOST_STATIC_ASSERT(( container_detail::is_same< allocator_traits<OuterAlloc>::pointer
+ BOOST_STATIC_ASSERT(( dtl::is_same< allocator_traits<OuterAlloc>::pointer
, Scoped0Inner::pointer>::value ));
- BOOST_STATIC_ASSERT(( container_detail::is_same< allocator_traits<OuterAlloc>::pointer
+ BOOST_STATIC_ASSERT(( dtl::is_same< allocator_traits<OuterAlloc>::pointer
, Scoped1Inner::pointer>::value ));
- BOOST_STATIC_ASSERT(( container_detail::is_same< allocator_traits<OuterAlloc>::pointer
+ BOOST_STATIC_ASSERT(( dtl::is_same< allocator_traits<OuterAlloc>::pointer
, Scoped2Inner::pointer>::value ));
//const_pointer
- BOOST_STATIC_ASSERT(( container_detail::is_same< allocator_traits<OuterAlloc>::const_pointer
+ BOOST_STATIC_ASSERT(( dtl::is_same< allocator_traits<OuterAlloc>::const_pointer
, Scoped0Inner::const_pointer>::value ));
- BOOST_STATIC_ASSERT(( container_detail::is_same< allocator_traits<OuterAlloc>::const_pointer
+ BOOST_STATIC_ASSERT(( dtl::is_same< allocator_traits<OuterAlloc>::const_pointer
, Scoped1Inner::const_pointer>::value ));
- BOOST_STATIC_ASSERT(( container_detail::is_same< allocator_traits<OuterAlloc>::const_pointer
+ BOOST_STATIC_ASSERT(( dtl::is_same< allocator_traits<OuterAlloc>::const_pointer
, Scoped2Inner::const_pointer>::value ));
//void_pointer
- BOOST_STATIC_ASSERT(( container_detail::is_same< allocator_traits<OuterAlloc>::void_pointer
+ BOOST_STATIC_ASSERT(( dtl::is_same< allocator_traits<OuterAlloc>::void_pointer
, Scoped0Inner::void_pointer>::value ));
- BOOST_STATIC_ASSERT(( container_detail::is_same< allocator_traits<OuterAlloc>::void_pointer
+ BOOST_STATIC_ASSERT(( dtl::is_same< allocator_traits<OuterAlloc>::void_pointer
, Scoped1Inner::void_pointer>::value ));
- BOOST_STATIC_ASSERT(( container_detail::is_same< allocator_traits<OuterAlloc>::void_pointer
+ BOOST_STATIC_ASSERT(( dtl::is_same< allocator_traits<OuterAlloc>::void_pointer
, Scoped2Inner::void_pointer>::value ));
//const_void_pointer
- BOOST_STATIC_ASSERT(( container_detail::is_same< allocator_traits<OuterAlloc>::const_void_pointer
+ BOOST_STATIC_ASSERT(( dtl::is_same< allocator_traits<OuterAlloc>::const_void_pointer
, Scoped0Inner::const_void_pointer>::value ));
- BOOST_STATIC_ASSERT(( container_detail::is_same< allocator_traits<OuterAlloc>::const_void_pointer
+ BOOST_STATIC_ASSERT(( dtl::is_same< allocator_traits<OuterAlloc>::const_void_pointer
, Scoped1Inner::const_void_pointer>::value ));
- BOOST_STATIC_ASSERT(( container_detail::is_same< allocator_traits<OuterAlloc>::const_void_pointer
+ BOOST_STATIC_ASSERT(( dtl::is_same< allocator_traits<OuterAlloc>::const_void_pointer
, Scoped2Inner::const_void_pointer>::value ));
//rebind
- BOOST_STATIC_ASSERT(( container_detail::is_same<Scoped0Inner::rebind< tagged_integer<9> >::other
+ BOOST_STATIC_ASSERT(( dtl::is_same<Scoped0Inner::rebind< tagged_integer<9> >::other
, Rebound9Scoped0Inner >::value ));
- BOOST_STATIC_ASSERT(( container_detail::is_same<Scoped1Inner::rebind< tagged_integer<9> >::other
+ BOOST_STATIC_ASSERT(( dtl::is_same<Scoped1Inner::rebind< tagged_integer<9> >::other
, Rebound9Scoped1Inner >::value ));
- BOOST_STATIC_ASSERT(( container_detail::is_same<Scoped2Inner::rebind< tagged_integer<9> >::other
+ BOOST_STATIC_ASSERT(( dtl::is_same<Scoped2Inner::rebind< tagged_integer<9> >::other
, Rebound9Scoped2Inner >::value ));
//inner_allocator_type
- BOOST_STATIC_ASSERT(( container_detail::is_same< Scoped0Inner
+ BOOST_STATIC_ASSERT(( dtl::is_same< Scoped0Inner
, Scoped0Inner::inner_allocator_type>::value ));
- BOOST_STATIC_ASSERT(( container_detail::is_same< scoped_allocator_adaptor<InnerAlloc1>
+ BOOST_STATIC_ASSERT(( dtl::is_same< scoped_allocator_adaptor<InnerAlloc1>
, Scoped1Inner::inner_allocator_type>::value ));
- BOOST_STATIC_ASSERT(( container_detail::is_same< scoped_allocator_adaptor<InnerAlloc1, InnerAlloc2>
+ BOOST_STATIC_ASSERT(( dtl::is_same< scoped_allocator_adaptor<InnerAlloc1, InnerAlloc2>
, Scoped2Inner::inner_allocator_type>::value ));
{
@@ -685,15 +685,15 @@ int main()
//Check outer_allocator_type is scoped
BOOST_STATIC_ASSERT(( is_scoped_allocator
<ScopedScoped0Inner::outer_allocator_type>::value ));
- BOOST_STATIC_ASSERT(( container_detail::is_same
+ BOOST_STATIC_ASSERT(( dtl::is_same
< outermost_allocator<ScopedScoped0Inner>::type
, Outer10IdAlloc
>::value ));
- BOOST_STATIC_ASSERT(( container_detail::is_same
+ BOOST_STATIC_ASSERT(( dtl::is_same
< ScopedScoped0Inner::outer_allocator_type
, scoped_allocator_adaptor<Outer10IdAlloc>
>::value ));
- BOOST_STATIC_ASSERT(( container_detail::is_same
+ BOOST_STATIC_ASSERT(( dtl::is_same
< scoped_allocator_adaptor<Outer10IdAlloc>::outer_allocator_type
, Outer10IdAlloc
>::value ));
@@ -768,15 +768,15 @@ int main()
//Check outer_allocator_type is scoped
BOOST_STATIC_ASSERT(( is_scoped_allocator
<ScopedScoped1Inner::outer_allocator_type>::value ));
- BOOST_STATIC_ASSERT(( container_detail::is_same
+ BOOST_STATIC_ASSERT(( dtl::is_same
< outermost_allocator<ScopedScoped1Inner>::type
, Outer10IdAlloc
>::value ));
- BOOST_STATIC_ASSERT(( container_detail::is_same
+ BOOST_STATIC_ASSERT(( dtl::is_same
< ScopedScoped1Inner::outer_allocator_type
, scoped_allocator_adaptor<Outer10IdAlloc, Inner11IdAlloc1>
>::value ));
- BOOST_STATIC_ASSERT(( container_detail::is_same
+ BOOST_STATIC_ASSERT(( dtl::is_same
< scoped_allocator_adaptor<Outer10IdAlloc, Inner11IdAlloc1>::outer_allocator_type
, Outer10IdAlloc
>::value ));
@@ -856,7 +856,7 @@ int main()
//used to construct types.
////////////////////////////////////////////////////////////
{
- using container_detail::pair;
+ using dtl::pair;
typedef propagation_test_allocator< pair< tagged_integer<0>
, tagged_integer<0> >, 0> OuterPairAlloc;
//
diff --git a/libs/container/test/scoped_allocator_usage_test.cpp b/libs/container/test/scoped_allocator_usage_test.cpp
index 8cf9311ec5..6eb1438116 100644
--- a/libs/container/test/scoped_allocator_usage_test.cpp
+++ b/libs/container/test/scoped_allocator_usage_test.cpp
@@ -341,7 +341,7 @@ bool test_value_and_state_equals(const alloc_int &r, int value, int state)
{ return r.get_value() == value && r.get_allocator_state() == state; }
template<class F, class S>
-bool test_value_and_state_equals(const container_detail::pair<F, S> &p, int value, int state)
+bool test_value_and_state_equals(const dtl::pair<F, S> &p, int value, int state)
{ return test_value_and_state_equals(p.first, value, state) && test_alloc_state_equals(p.second, value, state); }
template<class F, class S>
diff --git a/libs/container/test/set_test.hpp b/libs/container/test/set_test.hpp
index c78b6bbbfe..b8ca6494f6 100644
--- a/libs/container/test/set_test.hpp
+++ b/libs/container/test/set_test.hpp
@@ -30,11 +30,11 @@ namespace container {
namespace test{
template<class C>
-void set_test_rebalanceable(C &, boost::container::container_detail::false_type)
+void set_test_rebalanceable(C &, boost::container::dtl::false_type)
{}
template<class C>
-void set_test_rebalanceable(C &c, boost::container::container_detail::true_type)
+void set_test_rebalanceable(C &c, boost::container::dtl::true_type)
{
c.rebalance();
}
@@ -43,7 +43,7 @@ template<class MyBoostSet
,class MyStdSet
,class MyBoostMultiSet
,class MyStdMultiSet>
-int set_test_copyable(boost::container::container_detail::false_type)
+int set_test_copyable(boost::container::dtl::false_type)
{ return 0; }
const int MaxElem = 50;
@@ -52,7 +52,7 @@ template<class MyBoostSet
,class MyStdSet
,class MyBoostMultiSet
,class MyStdMultiSet>
-int set_test_copyable(boost::container::container_detail::true_type)
+int set_test_copyable(boost::container::dtl::true_type)
{
typedef typename MyBoostSet::value_type IntType;
@@ -388,12 +388,12 @@ int set_test ()
boostset.insert(boost::make_move_iterator(&aux_vect[0]), boost::make_move_iterator(&aux_vect[0] + 50));
stdset.insert(&aux_vect2[0], &aux_vect2[0] + 50);
- boostmultiset.insert(boost::make_move_iterator(&aux_vect3[0]), boost::make_move_iterator(aux_vect3 + 50));
- stdmultiset.insert(&aux_vect2[0], &aux_vect2[0] + 50);
if(!CheckEqualContainers(boostset, stdset)){
- std::cout << "Error in boostset.insert(boost::make_move_iterator(&aux_vect[0])..." << std::endl;
+ std::cout << "Error in boostset.insert(boost::make_move_iterator(&aux_vect3[0])..." << std::endl;
return 1;
}
+ boostmultiset.insert(boost::make_move_iterator(&aux_vect3[0]), boost::make_move_iterator(aux_vect3 + 50));
+ stdmultiset.insert(&aux_vect2[0], &aux_vect2[0] + 50);
if(!CheckEqualContainers(boostmultiset, stdmultiset)){
std::cout << "Error in boostmultiset.insert(boost::make_move_iterator(&aux_vect3[0]), ..." << std::endl;
return 1;
@@ -447,14 +447,14 @@ int set_test ()
boostset.insert(boost::make_move_iterator(&aux_vect3[0]), boost::make_move_iterator(&aux_vect3[0] + 50));
stdset.insert(&aux_vect2[0], &aux_vect2[0] + 50);
stdset.insert(&aux_vect2[0], &aux_vect2[0] + 50);
- boostmultiset.insert(boost::make_move_iterator(&aux_vect4[0]), boost::make_move_iterator(&aux_vect4[0] + 50));
- boostmultiset.insert(boost::make_move_iterator(&aux_vect5[0]), boost::make_move_iterator(&aux_vect5[0] + 50));
- stdmultiset.insert(&aux_vect2[0], &aux_vect2[0] + 50);
- stdmultiset.insert(&aux_vect2[0], &aux_vect2[0] + 50);
if(!CheckEqualContainers(boostset, stdset)){
std::cout << "Error in boostset.insert(boost::make_move_iterator(&aux_vect3[0])..." << std::endl;
return 1;
}
+ boostmultiset.insert(boost::make_move_iterator(&aux_vect4[0]), boost::make_move_iterator(&aux_vect4[0] + 50));
+ boostmultiset.insert(boost::make_move_iterator(&aux_vect5[0]), boost::make_move_iterator(&aux_vect5[0] + 50));
+ stdmultiset.insert(&aux_vect2[0], &aux_vect2[0] + 50);
+ stdmultiset.insert(&aux_vect2[0], &aux_vect2[0] + 50);
if(!CheckEqualContainers(boostmultiset, stdmultiset)){
std::cout << "Error in boostmultiset.insert(boost::make_move_iterator(&aux_vect5[0])..." << std::endl;
return 1;
@@ -462,12 +462,12 @@ int set_test ()
boostset.erase(*boostset.begin());
stdset.erase(*stdset.begin());
- boostmultiset.erase(*boostmultiset.begin());
- stdmultiset.erase(*stdmultiset.begin());
if(!CheckEqualContainers(boostset, stdset)){
std::cout << "Error in boostset.erase(*boostset.begin())" << std::endl;
return 1;
}
+ boostmultiset.erase(*boostmultiset.begin());
+ stdmultiset.erase(*stdmultiset.begin());
if(!CheckEqualContainers(boostmultiset, stdmultiset)){
std::cout << "Error in boostmultiset.erase(*boostmultiset.begin())" << std::endl;
return 1;
@@ -564,13 +564,13 @@ int set_test ()
return 1;
}
set_test_rebalanceable(boostset
- , container_detail::bool_<has_member_function_callable_with_rebalance<MyBoostSet>::value>());
+ , dtl::bool_<has_member_function_callable_with_rebalance<MyBoostSet>::value>());
if(!CheckEqualContainers(boostset, stdset)){
std::cout << "Error in boostset.rebalance()" << std::endl;
return 1;
}
set_test_rebalanceable(boostmultiset
- , container_detail::bool_<has_member_function_callable_with_rebalance<MyBoostMultiSet>::value>());
+ , dtl::bool_<has_member_function_callable_with_rebalance<MyBoostMultiSet>::value>());
if(!CheckEqualContainers(boostmultiset, stdmultiset)){
std::cout << "Error in boostmultiset.rebalance()" << std::endl;
return 1;
@@ -794,7 +794,7 @@ int set_test ()
}
if(set_test_copyable<MyBoostSet, MyStdSet, MyBoostMultiSet, MyStdMultiSet>
- (container_detail::bool_<boost::container::test::is_copyable<IntType>::value>())){
+ (dtl::bool_<boost::container::test::is_copyable<IntType>::value>())){
return 1;
}
diff --git a/libs/container/test/slist_test.cpp b/libs/container/test/slist_test.cpp
index c07af6275a..9d0c17e5de 100644
--- a/libs/container/test/slist_test.cpp
+++ b/libs/container/test/slist_test.cpp
@@ -135,6 +135,33 @@ bool test_support_for_initializer_list()
return true;
}
+bool test_for_splice()
+{
+ {
+ slist<int> list1; list1.push_front(3); list1.push_front(2); list1.push_front(1); list1.push_front(0);
+ slist<int> list2;
+ slist<int> expected1; expected1.push_front(3); expected1.push_front(2); expected1.push_front(0);
+ slist<int> expected2; expected2.push_front(1);
+
+ list2.splice(list2.begin(), list1, ++list1.begin());
+
+ if (!(expected1 == list1 && expected2 == list2))
+ return false;
+ }
+ {
+ slist<int> list1; list1.push_front(3); list1.push_front(2); list1.push_front(1); list1.push_front(0);
+ slist<int> list2;
+ slist<int> expected1;
+ slist<int> expected2; expected2.push_front(3); expected2.push_front(2); expected2.push_front(1); expected2.push_front(0);
+
+ list2.splice(list2.begin(), list1, list1.begin(), list1.end());
+
+ if (!(expected1 == list1 && expected2 == list2))
+ return false;
+ }
+ return true;
+}
+
struct boost_container_slist;
namespace boost {
@@ -208,6 +235,12 @@ int main ()
return 1;
////////////////////////////////////
+ // Splice testing
+ ////////////////////////////////////
+ if(!test_for_splice())
+ return 1;
+
+ ////////////////////////////////////
// Iterator testing
////////////////////////////////////
{
diff --git a/libs/container/test/tree_test.cpp b/libs/container/test/tree_test.cpp
index d1140dd0f2..c1a1c3da0e 100644
--- a/libs/container/test/tree_test.cpp
+++ b/libs/container/test/tree_test.cpp
@@ -22,7 +22,7 @@ namespace container {
//Explicit instantiation to detect compilation errors
-namespace container_detail {
+namespace dtl {
//Instantiate base class as previous instantiations don't instantiate inherited members
template class tree
@@ -73,7 +73,7 @@ template class tree
, tree_assoc_defaults
>;
-} //container_detail {
+} //dtl {
}} //boost::container
diff --git a/libs/container/test/vector_options_test.cpp b/libs/container/test/vector_options_test.cpp
new file mode 100644
index 0000000000..9b414fb8dc
--- /dev/null
+++ b/libs/container/test/vector_options_test.cpp
@@ -0,0 +1,121 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2004-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.
+//
+//////////////////////////////////////////////////////////////////////////////
+#include <boost/container/vector.hpp>
+#include <boost/container/allocator.hpp>
+#include <boost/container/detail/next_capacity.hpp>
+#include <boost/core/lightweight_test.hpp>
+
+using namespace boost::container;
+
+template<class Unsigned, class VectorType>
+void test_stored_size_type_impl()
+{
+ VectorType v;
+ typedef typename VectorType::size_type size_type;
+ typedef typename VectorType::value_type value_type;
+ size_type const max = Unsigned(-1);
+ v.resize(5);
+ v.resize(max);
+ BOOST_TEST_THROWS(v.resize(max+1), std::exception);
+ BOOST_TEST_THROWS(v.push_back(value_type(1)), std::exception);
+ BOOST_TEST_THROWS(v.insert(v.begin(), value_type(1)), std::exception);
+ BOOST_TEST_THROWS(v.emplace(v.begin(), value_type(1)),std::exception);
+ BOOST_TEST_THROWS(v.reserve(max+1), std::exception);
+ BOOST_TEST_THROWS(VectorType v2(max+1), std::exception);
+}
+
+template<class Unsigned>
+void test_stored_size_type()
+{
+ #if !defined(BOOST_NO_CXX11_TEMPLATE_ALIASES)
+ using options_t = vector_options_t< stored_size<Unsigned> >;
+ #else
+ typedef typename vector_options
+ < stored_size<Unsigned> >::type options_t;
+ #endif
+
+ //Test first with a typical allocator
+ {
+ typedef vector<unsigned char, new_allocator<unsigned char>, options_t> vector_t;
+ test_stored_size_type_impl<Unsigned, vector_t>();
+ }
+ //Test with a V2 allocator
+ {
+ typedef vector<unsigned char, allocator<unsigned char>, options_t> vector_t;
+ test_stored_size_type_impl<Unsigned, vector_t>();
+ }
+}
+
+void test_growth_factor_50()
+{
+ #if !defined(BOOST_NO_CXX11_TEMPLATE_ALIASES)
+ using options_t = vector_options_t< growth_factor<growth_factor_50> >;
+ #else
+ typedef vector_options
+ < growth_factor<growth_factor_50> >::type options_t;
+ #endif
+
+ vector<int, new_allocator<int>, options_t> v;
+
+ v.resize(5);
+ v.resize(v.capacity());
+ std::size_t old_capacity = v.capacity();
+ v.push_back(0);
+ std::size_t new_capacity = v.capacity();
+ BOOST_TEST(new_capacity == old_capacity + old_capacity/2);
+}
+
+void test_growth_factor_60()
+{
+ #if !defined(BOOST_NO_CXX11_TEMPLATE_ALIASES)
+ using options_t = vector_options_t< growth_factor<growth_factor_60> >;
+ #else
+ typedef vector_options
+ < growth_factor<growth_factor_60> >::type options_t;
+ #endif
+
+ vector<int, new_allocator<int>, options_t> v;
+
+ v.resize(5);
+ v.resize(v.capacity());
+ std::size_t old_capacity = v.capacity();
+ v.push_back(0);
+ std::size_t new_capacity = v.capacity();
+ BOOST_TEST(new_capacity == old_capacity + 3*old_capacity/5);
+}
+
+void test_growth_factor_100()
+{
+ #if !defined(BOOST_NO_CXX11_TEMPLATE_ALIASES)
+ using options_t = vector_options_t< growth_factor<growth_factor_100> >;
+ #else
+ typedef vector_options
+ < growth_factor<growth_factor_100> >::type options_t;
+ #endif
+
+ vector<int, new_allocator<int>, options_t> v;
+
+ v.resize(5);
+ v.resize(v.capacity());
+ std::size_t old_capacity = v.capacity();
+ v.push_back(0);
+ std::size_t new_capacity = v.capacity();
+ BOOST_TEST(new_capacity == 2*old_capacity);
+}
+
+int main()
+{
+ test_growth_factor_50();
+ test_growth_factor_60();
+ test_growth_factor_100();
+ test_stored_size_type<unsigned char>();
+ test_stored_size_type<unsigned short>();
+ return ::boost::report_errors();
+}
diff --git a/libs/container/test/vector_test.cpp b/libs/container/test/vector_test.cpp
index a52cba75a1..6c1597ad06 100644
--- a/libs/container/test/vector_test.cpp
+++ b/libs/container/test/vector_test.cpp
@@ -7,6 +7,13 @@
// See http://www.boost.org/libs/container for documentation.
//
//////////////////////////////////////////////////////////////////////////////
+
+// the tests trigger deprecation warnings when compiled with msvc in C++17 mode
+#if defined(_MSVC_LANG) && _MSVC_LANG > 201402
+// warning STL4009: std::allocator<void> is deprecated in C++17
+# define _SILENCE_CXX17_ALLOCATOR_VOID_DEPRECATION_WARNING
+#endif
+
#include <memory>
#include <iostream>
@@ -38,13 +45,9 @@ template class boost::container::vector
< test::movable_and_copyable_int
, allocator<test::movable_and_copyable_int> >;
-namespace container_detail {
-
template class vec_iterator<int*, true >;
template class vec_iterator<int*, false>;
-}
-
}}
int test_expand_bwd()
diff --git a/libs/container/test/vector_test.hpp b/libs/container/test/vector_test.hpp
index 659f1408a0..a2573cffc8 100644
--- a/libs/container/test/vector_test.hpp
+++ b/libs/container/test/vector_test.hpp
@@ -55,13 +55,13 @@ struct vector_hash_function_capacity
};
template<class V1, class V2>
-bool vector_vector_hash_function_capacity_only(V1&, V2&, boost::container::container_detail::false_type)
+bool vector_vector_hash_function_capacity_only(V1&, V2&, boost::container::dtl::false_type)
{
return true;
}
template<class MyBoostVector, class MyStdVector>
-bool vector_vector_hash_function_capacity_only(MyBoostVector&boostvector, MyStdVector&stdvector, boost::container::container_detail::true_type)
+bool vector_vector_hash_function_capacity_only(MyBoostVector&boostvector, MyStdVector&stdvector, boost::container::dtl::true_type)
{
//deque has no reserve
boostvector.reserve(boostvector.size()*2);
@@ -89,14 +89,14 @@ bool vector_vector_hash_function_capacity_only(MyBoostVector&boostvector, MyStdV
template<class V1, class V2>
-bool vector_copyable_only(V1&, V2&, boost::container::container_detail::false_type)
+bool vector_copyable_only(V1&, V2&, boost::container::dtl::false_type)
{
return true;
}
//Function to check if both sets are equal
template<class MyBoostVector, class MyStdVector>
-bool vector_copyable_only(MyBoostVector &boostvector, MyStdVector &stdvector, boost::container::container_detail::true_type)
+bool vector_copyable_only(MyBoostVector &boostvector, MyStdVector &stdvector, boost::container::dtl::true_type)
{
typedef typename MyBoostVector::value_type IntType;
std::size_t size = boostvector.size();
@@ -403,7 +403,7 @@ int vector_test()
}
if(!vector_copyable_only(boostvector, stdvector
- ,container_detail::bool_<boost::container::test::is_copyable<IntType>::value>())){
+ ,dtl::bool_<boost::container::test::is_copyable<IntType>::value>())){
return 1;
}
@@ -453,7 +453,7 @@ int vector_test()
if(!test::CheckEqualContainers(boostvector, stdvector)) return 1;
}
- if(!vector_vector_hash_function_capacity_only(boostvector, stdvector, container_detail::bool_<vector_hash_function_capacity<MyBoostVector>::value>()))
+ if(!vector_vector_hash_function_capacity_only(boostvector, stdvector, dtl::bool_<vector_hash_function_capacity<MyBoostVector>::value>()))
return 1;
boostvector.clear();