Complete pull #94 with flat_set/map/set containers

This commit is contained in:
Ion Gaztañaga
2018-11-29 23:37:10 +01:00
parent 7f3d3ef8f9
commit 51669a5330
5 changed files with 187 additions and 164 deletions

View File

@@ -69,6 +69,9 @@ class back_emplacer
template<class InputIterator> template<class InputIterator>
using it_based_non_const_first_type_t = typename dtl::remove_const<typename iterator_traits<InputIterator>::value_type::first_type>::type; using it_based_non_const_first_type_t = typename dtl::remove_const<typename iterator_traits<InputIterator>::value_type::first_type>::type;
template<class InputIterator>
using it_based_const_first_type_t = const typename dtl::remove_const<typename iterator_traits<InputIterator>::value_type::first_type>::type;
template<class InputIterator> template<class InputIterator>
using it_based_second_type_t = typename iterator_traits<InputIterator>::value_type::second_type; using it_based_second_type_t = typename iterator_traits<InputIterator>::value_type::second_type;

View File

@@ -49,10 +49,6 @@
#include <initializer_list> #include <initializer_list>
#endif #endif
#ifndef BOOST_CONTAINER_NO_CXX17_CTAD
#include <type_traits>
#endif
namespace boost { namespace boost {
namespace container { namespace container {
@@ -1593,16 +1589,16 @@ template < typename InputIterator, typename AllocatorOrCompare>
flat_map(InputIterator, InputIterator, AllocatorOrCompare const&) -> flat_map(InputIterator, InputIterator, AllocatorOrCompare const&) ->
flat_map< it_based_non_const_first_type_t<InputIterator> flat_map< it_based_non_const_first_type_t<InputIterator>
, it_based_second_type_t<InputIterator> , it_based_second_type_t<InputIterator>
, std::conditional_t< // Compare , typename dtl::if_c< // Compare
dtl::is_allocator<AllocatorOrCompare>::value dtl::is_allocator<AllocatorOrCompare>::value
, std::less<it_based_non_const_first_type_t<InputIterator>> , std::less<it_based_non_const_first_type_t<InputIterator>>
, AllocatorOrCompare , AllocatorOrCompare
> >::type
, std::conditional_t< // Allocator , typename dtl::if_c< // Allocator
dtl::is_allocator<AllocatorOrCompare>::value dtl::is_allocator<AllocatorOrCompare>::value
, AllocatorOrCompare , AllocatorOrCompare
, new_allocator<std::pair<it_based_non_const_first_type_t<InputIterator>, it_based_second_type_t<InputIterator>>> , new_allocator<std::pair<it_based_non_const_first_type_t<InputIterator>, it_based_second_type_t<InputIterator>>>
> >::type
>; >;
template < typename InputIterator, typename Compare, typename Allocator template < typename InputIterator, typename Compare, typename Allocator
@@ -1623,16 +1619,16 @@ template < typename InputIterator, typename AllocatorOrCompare>
flat_map(ordered_unique_range_t, InputIterator, InputIterator, AllocatorOrCompare const&) -> flat_map(ordered_unique_range_t, InputIterator, InputIterator, AllocatorOrCompare const&) ->
flat_map< it_based_non_const_first_type_t<InputIterator> flat_map< it_based_non_const_first_type_t<InputIterator>
, it_based_second_type_t<InputIterator> , it_based_second_type_t<InputIterator>
, std::conditional_t< // Compare , typename dtl::if_c< // Compare
dtl::is_allocator<AllocatorOrCompare>::value dtl::is_allocator<AllocatorOrCompare>::value
, std::less<it_based_non_const_first_type_t<InputIterator>> , std::less<it_based_non_const_first_type_t<InputIterator>>
, AllocatorOrCompare , AllocatorOrCompare
> >::type
, std::conditional_t< // Allocator , typename dtl::if_c< // Allocator
dtl::is_allocator<AllocatorOrCompare>::value dtl::is_allocator<AllocatorOrCompare>::value
, AllocatorOrCompare , AllocatorOrCompare
, new_allocator<std::pair<it_based_non_const_first_type_t<InputIterator>, it_based_second_type_t<InputIterator>>> , new_allocator<std::pair<it_based_non_const_first_type_t<InputIterator>, it_based_second_type_t<InputIterator>>>
> >::type
>; >;
template < typename InputIterator, typename Compare, typename Allocator template < typename InputIterator, typename Compare, typename Allocator
@@ -2901,16 +2897,16 @@ template < typename InputIterator, typename AllocatorOrCompare>
flat_multimap(InputIterator, InputIterator, AllocatorOrCompare const&) -> flat_multimap(InputIterator, InputIterator, AllocatorOrCompare const&) ->
flat_multimap< it_based_non_const_first_type_t<InputIterator> flat_multimap< it_based_non_const_first_type_t<InputIterator>
, it_based_second_type_t<InputIterator> , it_based_second_type_t<InputIterator>
, std::conditional_t< // Compare , typename dtl::if_c< // Compare
dtl::is_allocator<AllocatorOrCompare>::value dtl::is_allocator<AllocatorOrCompare>::value
, std::less<it_based_non_const_first_type_t<InputIterator>> , std::less<it_based_non_const_first_type_t<InputIterator>>
, AllocatorOrCompare , AllocatorOrCompare
> >::type
, std::conditional_t< // Allocator , typename dtl::if_c< // Allocator
dtl::is_allocator<AllocatorOrCompare>::value dtl::is_allocator<AllocatorOrCompare>::value
, AllocatorOrCompare , AllocatorOrCompare
, new_allocator<std::pair<it_based_non_const_first_type_t<InputIterator>, it_based_second_type_t<InputIterator>>> , new_allocator<std::pair<it_based_non_const_first_type_t<InputIterator>, it_based_second_type_t<InputIterator>>>
> >::type
>; >;
template < typename InputIterator, typename Compare, typename Allocator template < typename InputIterator, typename Compare, typename Allocator
@@ -2931,16 +2927,16 @@ template < typename InputIterator, typename AllocatorOrCompare>
flat_multimap(ordered_range_t, InputIterator, InputIterator, AllocatorOrCompare const&) -> flat_multimap(ordered_range_t, InputIterator, InputIterator, AllocatorOrCompare const&) ->
flat_multimap< it_based_non_const_first_type_t<InputIterator> flat_multimap< it_based_non_const_first_type_t<InputIterator>
, it_based_second_type_t<InputIterator> , it_based_second_type_t<InputIterator>
, std::conditional_t< // Compare , typename dtl::if_c< // Compare
dtl::is_allocator<AllocatorOrCompare>::value dtl::is_allocator<AllocatorOrCompare>::value
, std::less<it_based_non_const_first_type_t<InputIterator>> , std::less<it_based_non_const_first_type_t<InputIterator>>
, AllocatorOrCompare , AllocatorOrCompare
> >::type
, std::conditional_t< // Allocator , typename dtl::if_c< // Allocator
dtl::is_allocator<AllocatorOrCompare>::value dtl::is_allocator<AllocatorOrCompare>::value
, AllocatorOrCompare , AllocatorOrCompare
, new_allocator<std::pair<it_based_non_const_first_type_t<InputIterator>, it_based_second_type_t<InputIterator>>> , new_allocator<std::pair<it_based_non_const_first_type_t<InputIterator>, it_based_second_type_t<InputIterator>>>
> >::type
>; >;
template < typename InputIterator, typename Compare, typename Allocator template < typename InputIterator, typename Compare, typename Allocator

View File

@@ -1130,18 +1130,20 @@ template <typename InputIterator>
flat_set(InputIterator, InputIterator) -> flat_set(InputIterator, InputIterator) ->
flat_set< it_based_value_type_t<InputIterator> >; flat_set< it_based_value_type_t<InputIterator> >;
template < typename InputIterator, typename Allocator template < typename InputIterator, typename AllocatorOrCompare>
, typename = dtl::require_allocator_t<Allocator>> flat_set(InputIterator, InputIterator, AllocatorOrCompare const&) ->
flat_set(InputIterator, InputIterator, Allocator const&) -> flat_set< it_based_value_type_t<InputIterator>
flat_set< it_based_value_type_t<InputIterator> , typename dtl::if_c< // Compare
, std::less<it_based_value_type_t<InputIterator>> dtl::is_allocator<AllocatorOrCompare>::value
, Allocator>; , std::less<it_based_value_type_t<InputIterator>>
, AllocatorOrCompare
template < typename InputIterator, typename Compare >::type
, typename = dtl::require_nonallocator_t<Compare>> , typename dtl::if_c< // Allocator
flat_set(InputIterator, InputIterator, Compare const&) -> dtl::is_allocator<AllocatorOrCompare>::value
flat_set< it_based_value_type_t<InputIterator> , AllocatorOrCompare
, Compare>; , new_allocator<it_based_value_type_t<InputIterator>>
>::type
>;
template < typename InputIterator, typename Compare, typename Allocator template < typename InputIterator, typename Compare, typename Allocator
, typename = dtl::require_nonallocator_t<Compare> , typename = dtl::require_nonallocator_t<Compare>
@@ -1155,18 +1157,21 @@ template <typename InputIterator>
flat_set(ordered_unique_range_t, InputIterator, InputIterator) -> flat_set(ordered_unique_range_t, InputIterator, InputIterator) ->
flat_set< it_based_value_type_t<InputIterator>>; flat_set< it_based_value_type_t<InputIterator>>;
template < typename InputIterator, typename Allocator
, typename = dtl::require_allocator_t<Allocator>>
flat_set(ordered_unique_range_t, InputIterator, InputIterator, Allocator const&) ->
flat_set< it_based_value_type_t<InputIterator>
, std::less<it_based_value_type_t<InputIterator>>
, Allocator>;
template < typename InputIterator, typename Compare template < typename InputIterator, typename AllocatorOrCompare>
, typename = dtl::require_nonallocator_t<Compare>> flat_set(ordered_unique_range_t, InputIterator, InputIterator, AllocatorOrCompare const&) ->
flat_set(ordered_unique_range_t, InputIterator, InputIterator, Compare const&) -> flat_set< it_based_value_type_t<InputIterator>
flat_set< it_based_value_type_t<InputIterator> , typename dtl::if_c< // Compare
, Compare>; dtl::is_allocator<AllocatorOrCompare>::value
, std::less<it_based_value_type_t<InputIterator>>
, AllocatorOrCompare
>::type
, typename dtl::if_c< // Allocator
dtl::is_allocator<AllocatorOrCompare>::value
, AllocatorOrCompare
, new_allocator<it_based_value_type_t<InputIterator>>
>::type
>;
template < typename InputIterator, typename Compare, typename Allocator template < typename InputIterator, typename Compare, typename Allocator
, typename = dtl::require_nonallocator_t<Compare> , typename = dtl::require_nonallocator_t<Compare>
@@ -1859,18 +1864,21 @@ template <typename InputIterator>
flat_multiset(InputIterator, InputIterator) -> flat_multiset(InputIterator, InputIterator) ->
flat_multiset< it_based_value_type_t<InputIterator> >; flat_multiset< it_based_value_type_t<InputIterator> >;
template < typename InputIterator, typename Allocator
, typename = dtl::require_allocator_t<Allocator>>
flat_multiset(InputIterator, InputIterator, Allocator const&) ->
flat_multiset< it_based_value_type_t<InputIterator>
, std::less<it_based_value_type_t<InputIterator>>
, Allocator>;
template < typename InputIterator, typename Compare template < typename InputIterator, typename AllocatorOrCompare>
, typename = dtl::require_nonallocator_t<Compare>> flat_multiset(InputIterator, InputIterator, AllocatorOrCompare const&) ->
flat_multiset(InputIterator, InputIterator, Compare const&) -> flat_multiset < it_based_value_type_t<InputIterator>
flat_multiset< it_based_value_type_t<InputIterator> , typename dtl::if_c< // Compare
, Compare>; dtl::is_allocator<AllocatorOrCompare>::value
, std::less<it_based_value_type_t<InputIterator>>
, AllocatorOrCompare
>::type
, typename dtl::if_c< // Allocator
dtl::is_allocator<AllocatorOrCompare>::value
, AllocatorOrCompare
, new_allocator<it_based_value_type_t<InputIterator>>
>::type
>;
template < typename InputIterator, typename Compare, typename Allocator template < typename InputIterator, typename Compare, typename Allocator
, typename = dtl::require_nonallocator_t<Compare> , typename = dtl::require_nonallocator_t<Compare>
@@ -1884,18 +1892,20 @@ template <typename InputIterator>
flat_multiset(ordered_range_t, InputIterator, InputIterator) -> flat_multiset(ordered_range_t, InputIterator, InputIterator) ->
flat_multiset< it_based_value_type_t<InputIterator>>; flat_multiset< it_based_value_type_t<InputIterator>>;
template < typename InputIterator, typename Allocator template < typename InputIterator, typename AllocatorOrCompare>
, typename = dtl::require_allocator_t<Allocator>> flat_multiset(ordered_range_t, InputIterator, InputIterator, AllocatorOrCompare const&) ->
flat_multiset(ordered_range_t, InputIterator, InputIterator, Allocator const&) -> flat_multiset < it_based_value_type_t<InputIterator>
flat_multiset< it_based_value_type_t<InputIterator> , typename dtl::if_c< // Compare
, std::less<it_based_value_type_t<InputIterator>> dtl::is_allocator<AllocatorOrCompare>::value
, Allocator>; , std::less<it_based_value_type_t<InputIterator>>
, AllocatorOrCompare
template < typename InputIterator, typename Compare >::type
, typename = dtl::require_nonallocator_t<Compare>> , typename dtl::if_c< // Allocator
flat_multiset(ordered_range_t, InputIterator, InputIterator, Compare const&) -> dtl::is_allocator<AllocatorOrCompare>::value
flat_multiset< it_based_value_type_t<InputIterator> , AllocatorOrCompare
, Compare>; , new_allocator<it_based_value_type_t<InputIterator>>
>::type
>;
template < typename InputIterator, typename Compare, typename Allocator template < typename InputIterator, typename Compare, typename Allocator
, typename = dtl::require_nonallocator_t<Compare> , typename = dtl::require_nonallocator_t<Compare>

View File

@@ -1302,20 +1302,21 @@ map(InputIterator, InputIterator) ->
map< it_based_non_const_first_type_t<InputIterator> map< it_based_non_const_first_type_t<InputIterator>
, it_based_second_type_t<InputIterator>>; , it_based_second_type_t<InputIterator>>;
template < typename InputIterator, typename Allocator template < typename InputIterator, typename AllocatorOrCompare>
, typename = dtl::require_allocator_t<Allocator>> map(InputIterator, InputIterator, AllocatorOrCompare const&) ->
map(InputIterator, InputIterator, Allocator const&) -> map< it_based_non_const_first_type_t<InputIterator>
map< it_based_non_const_first_type_t<InputIterator> , it_based_second_type_t<InputIterator>
, it_based_second_type_t<InputIterator> , typename dtl::if_c< // Compare
, std::less<it_based_non_const_first_type_t<InputIterator>> dtl::is_allocator<AllocatorOrCompare>::value
, Allocator>; , std::less<it_based_non_const_first_type_t<InputIterator>>
, AllocatorOrCompare
template < typename InputIterator, typename Compare >::type
, typename = dtl::require_nonallocator_t<Compare>> , typename dtl::if_c< // Allocator
map(InputIterator, InputIterator, Compare const&) -> dtl::is_allocator<AllocatorOrCompare>::value
map< it_based_non_const_first_type_t<InputIterator> , AllocatorOrCompare
, it_based_second_type_t<InputIterator> , new_allocator<std::pair<it_based_const_first_type_t<InputIterator>, it_based_second_type_t<InputIterator>>>
, Compare>; >::type
>;
template < typename InputIterator, typename Compare, typename Allocator template < typename InputIterator, typename Compare, typename Allocator
, typename = dtl::require_nonallocator_t<Compare> , typename = dtl::require_nonallocator_t<Compare>
@@ -1331,20 +1332,21 @@ map(ordered_unique_range_t, InputIterator, InputIterator) ->
map< it_based_non_const_first_type_t<InputIterator> map< it_based_non_const_first_type_t<InputIterator>
, it_based_second_type_t<InputIterator>>; , it_based_second_type_t<InputIterator>>;
template < typename InputIterator, typename Allocator template < typename InputIterator, typename AllocatorOrCompare>
, typename = dtl::require_allocator_t<Allocator>> map(ordered_unique_range_t, InputIterator, InputIterator, AllocatorOrCompare const&) ->
map(ordered_unique_range_t, InputIterator, InputIterator, Allocator const&) ->
map< it_based_non_const_first_type_t<InputIterator> map< it_based_non_const_first_type_t<InputIterator>
, it_based_second_type_t<InputIterator> , it_based_second_type_t<InputIterator>
, std::less<it_based_non_const_first_type_t<InputIterator>> , typename dtl::if_c< // Compare
, Allocator>; dtl::is_allocator<AllocatorOrCompare>::value
, std::less<it_based_non_const_first_type_t<InputIterator>>
template < typename InputIterator, typename Compare , AllocatorOrCompare
, typename = dtl::require_nonallocator_t<Compare>> >::type
map(ordered_unique_range_t, InputIterator, InputIterator, Compare const&) -> , typename dtl::if_c< // Allocator
map< it_based_non_const_first_type_t<InputIterator> dtl::is_allocator<AllocatorOrCompare>::value
, it_based_second_type_t<InputIterator> , AllocatorOrCompare
, Compare>; , new_allocator<std::pair<it_based_const_first_type_t<InputIterator>, it_based_second_type_t<InputIterator>>>
>::type
>;
template < typename InputIterator, typename Compare, typename Allocator template < typename InputIterator, typename Compare, typename Allocator
, typename = dtl::require_nonallocator_t<Compare> , typename = dtl::require_nonallocator_t<Compare>
@@ -2229,20 +2231,21 @@ multimap(InputIterator, InputIterator) ->
multimap< it_based_non_const_first_type_t<InputIterator> multimap< it_based_non_const_first_type_t<InputIterator>
, it_based_second_type_t<InputIterator>>; , it_based_second_type_t<InputIterator>>;
template < typename InputIterator, typename Allocator template < typename InputIterator, typename AllocatorOrCompare>
, typename = dtl::require_allocator_t<Allocator>> multimap(InputIterator, InputIterator, AllocatorOrCompare const&) ->
multimap(InputIterator, InputIterator, Allocator const&) ->
multimap< it_based_non_const_first_type_t<InputIterator> multimap< it_based_non_const_first_type_t<InputIterator>
, it_based_second_type_t<InputIterator> , it_based_second_type_t<InputIterator>
, std::less<it_based_non_const_first_type_t<InputIterator>> , typename dtl::if_c< // Compare
, Allocator>; dtl::is_allocator<AllocatorOrCompare>::value
, std::less<it_based_non_const_first_type_t<InputIterator>>
template < typename InputIterator, typename Compare , AllocatorOrCompare
, typename = dtl::require_nonallocator_t<Compare>> >::type
multimap(InputIterator, InputIterator, Compare const&) -> , typename dtl::if_c< // Allocator
multimap< it_based_non_const_first_type_t<InputIterator> dtl::is_allocator<AllocatorOrCompare>::value
, it_based_second_type_t<InputIterator> , AllocatorOrCompare
, Compare>; , new_allocator<std::pair<it_based_const_first_type_t<InputIterator>, it_based_second_type_t<InputIterator>>>
>::type
>;
template < typename InputIterator, typename Compare, typename Allocator template < typename InputIterator, typename Compare, typename Allocator
, typename = dtl::require_nonallocator_t<Compare> , typename = dtl::require_nonallocator_t<Compare>
@@ -2258,20 +2261,21 @@ multimap(ordered_range_t, InputIterator, InputIterator) ->
multimap< it_based_non_const_first_type_t<InputIterator> multimap< it_based_non_const_first_type_t<InputIterator>
, it_based_second_type_t<InputIterator>>; , it_based_second_type_t<InputIterator>>;
template < typename InputIterator, typename Allocator template < typename InputIterator, typename AllocatorOrCompare>
, typename = dtl::require_allocator_t<Allocator>> multimap(ordered_range_t, InputIterator, InputIterator, AllocatorOrCompare const&) ->
multimap(ordered_range_t, InputIterator, InputIterator, Allocator const&) ->
multimap< it_based_non_const_first_type_t<InputIterator> multimap< it_based_non_const_first_type_t<InputIterator>
, it_based_second_type_t<InputIterator> , it_based_second_type_t<InputIterator>
, std::less<it_based_non_const_first_type_t<InputIterator>> , typename dtl::if_c< // Compare
, Allocator>; dtl::is_allocator<AllocatorOrCompare>::value
, std::less<it_based_const_first_type_t<InputIterator>>
template < typename InputIterator, typename Compare , AllocatorOrCompare
, typename = dtl::require_nonallocator_t<Compare>> >::type
multimap(ordered_range_t, InputIterator, InputIterator, Compare const&) -> , typename dtl::if_c< // Allocator
multimap< it_based_non_const_first_type_t<InputIterator> dtl::is_allocator<AllocatorOrCompare>::value
, it_based_second_type_t<InputIterator> , AllocatorOrCompare
, Compare>; , new_allocator<std::pair<it_based_const_first_type_t<InputIterator>, it_based_second_type_t<InputIterator>>>
>::type
>;
template < typename InputIterator, typename Compare, typename Allocator template < typename InputIterator, typename Compare, typename Allocator
, typename = dtl::require_nonallocator_t<Compare> , typename = dtl::require_nonallocator_t<Compare>

View File

@@ -965,18 +965,20 @@ template <typename InputIterator>
set(InputIterator, InputIterator) -> set(InputIterator, InputIterator) ->
set< it_based_value_type_t<InputIterator> >; set< it_based_value_type_t<InputIterator> >;
template < typename InputIterator, typename Allocator template < typename InputIterator, typename AllocatorOrCompare>
, typename = dtl::require_allocator_t<Allocator>> set(InputIterator, InputIterator, AllocatorOrCompare const&) ->
set(InputIterator, InputIterator, Allocator const&) -> set< it_based_value_type_t<InputIterator>
set< it_based_value_type_t<InputIterator> , typename dtl::if_c< // Compare
, std::less<it_based_value_type_t<InputIterator>> dtl::is_allocator<AllocatorOrCompare>::value
, Allocator>; , std::less<it_based_value_type_t<InputIterator>>
, AllocatorOrCompare
template < typename InputIterator, typename Compare >::type
, typename = dtl::require_nonallocator_t<Compare>> , typename dtl::if_c< // Allocator
set(InputIterator, InputIterator, Compare const&) -> dtl::is_allocator<AllocatorOrCompare>::value
set< it_based_value_type_t<InputIterator> , AllocatorOrCompare
, Compare>; , new_allocator<it_based_value_type_t<InputIterator>>
>::type
>;
template < typename InputIterator, typename Compare, typename Allocator template < typename InputIterator, typename Compare, typename Allocator
, typename = dtl::require_nonallocator_t<Compare> , typename = dtl::require_nonallocator_t<Compare>
@@ -990,18 +992,21 @@ template <typename InputIterator>
set(ordered_unique_range_t, InputIterator, InputIterator) -> set(ordered_unique_range_t, InputIterator, InputIterator) ->
set< it_based_value_type_t<InputIterator>>; set< it_based_value_type_t<InputIterator>>;
template < typename InputIterator, typename Allocator
, typename = dtl::require_allocator_t<Allocator>>
set(ordered_unique_range_t, InputIterator, InputIterator, Allocator const&) ->
set< it_based_value_type_t<InputIterator>
, std::less<it_based_value_type_t<InputIterator>>
, Allocator>;
template < typename InputIterator, typename Compare template < typename InputIterator, typename AllocatorOrCompare>
, typename = dtl::require_nonallocator_t<Compare>> set(ordered_unique_range_t, InputIterator, InputIterator, AllocatorOrCompare const&) ->
set(ordered_unique_range_t, InputIterator, InputIterator, Compare const&) -> set< it_based_value_type_t<InputIterator>
set< it_based_value_type_t<InputIterator> , typename dtl::if_c< // Compare
, Compare>; dtl::is_allocator<AllocatorOrCompare>::value
, std::less<it_based_value_type_t<InputIterator>>
, AllocatorOrCompare
>::type
, typename dtl::if_c< // Allocator
dtl::is_allocator<AllocatorOrCompare>::value
, AllocatorOrCompare
, new_allocator<it_based_value_type_t<InputIterator>>
>::type
>;
template < typename InputIterator, typename Compare, typename Allocator template < typename InputIterator, typename Compare, typename Allocator
, typename = dtl::require_nonallocator_t<Compare> , typename = dtl::require_nonallocator_t<Compare>
@@ -1626,18 +1631,21 @@ template <typename InputIterator>
multiset(InputIterator, InputIterator) -> multiset(InputIterator, InputIterator) ->
multiset< it_based_value_type_t<InputIterator> >; multiset< it_based_value_type_t<InputIterator> >;
template < typename InputIterator, typename Allocator
, typename = dtl::require_allocator_t<Allocator>>
multiset(InputIterator, InputIterator, Allocator const&) ->
multiset< it_based_value_type_t<InputIterator>
, std::less<it_based_value_type_t<InputIterator>>
, Allocator>;
template < typename InputIterator, typename Compare template < typename InputIterator, typename AllocatorOrCompare>
, typename = dtl::require_nonallocator_t<Compare>> multiset(InputIterator, InputIterator, AllocatorOrCompare const&) ->
multiset(InputIterator, InputIterator, Compare const&) -> multiset < it_based_value_type_t<InputIterator>
multiset< it_based_value_type_t<InputIterator> , typename dtl::if_c< // Compare
, Compare>; dtl::is_allocator<AllocatorOrCompare>::value
, std::less<it_based_value_type_t<InputIterator>>
, AllocatorOrCompare
>::type
, typename dtl::if_c< // Allocator
dtl::is_allocator<AllocatorOrCompare>::value
, AllocatorOrCompare
, new_allocator<it_based_value_type_t<InputIterator>>
>::type
>;
template < typename InputIterator, typename Compare, typename Allocator template < typename InputIterator, typename Compare, typename Allocator
, typename = dtl::require_nonallocator_t<Compare> , typename = dtl::require_nonallocator_t<Compare>
@@ -1651,18 +1659,20 @@ template <typename InputIterator>
multiset(ordered_range_t, InputIterator, InputIterator) -> multiset(ordered_range_t, InputIterator, InputIterator) ->
multiset< it_based_value_type_t<InputIterator>>; multiset< it_based_value_type_t<InputIterator>>;
template < typename InputIterator, typename Allocator template < typename InputIterator, typename AllocatorOrCompare>
, typename = dtl::require_allocator_t<Allocator>> multiset(ordered_range_t, InputIterator, InputIterator, AllocatorOrCompare const&) ->
multiset(ordered_range_t, InputIterator, InputIterator, Allocator const&) -> multiset < it_based_value_type_t<InputIterator>
multiset< it_based_value_type_t<InputIterator> , typename dtl::if_c< // Compare
, std::less<it_based_value_type_t<InputIterator>> dtl::is_allocator<AllocatorOrCompare>::value
, Allocator>; , std::less<it_based_value_type_t<InputIterator>>
, AllocatorOrCompare
template < typename InputIterator, typename Compare >::type
, typename = dtl::require_nonallocator_t<Compare>> , typename dtl::if_c< // Allocator
multiset(ordered_range_t, InputIterator, InputIterator, Compare const&) -> dtl::is_allocator<AllocatorOrCompare>::value
multiset< it_based_value_type_t<InputIterator> , AllocatorOrCompare
, Compare>; , new_allocator<it_based_value_type_t<InputIterator>>
>::type
>;
template < typename InputIterator, typename Compare, typename Allocator template < typename InputIterator, typename Compare, typename Allocator
, typename = dtl::require_nonallocator_t<Compare> , typename = dtl::require_nonallocator_t<Compare>