forked from boostorg/unordered
Add deduction guides
This commit is contained in:
@ -795,6 +795,97 @@ namespace boost {
|
|||||||
return c.erase_if(pred);
|
return c.erase_if(pred);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef BOOST_UNORDERED_TEMPLATE_DEDUCTION_GUIDES
|
||||||
|
|
||||||
|
template <class InputIterator,
|
||||||
|
class Hash =
|
||||||
|
boost::hash<boost::unordered::detail::iter_key_t<InputIterator> >,
|
||||||
|
class Pred =
|
||||||
|
std::equal_to<boost::unordered::detail::iter_key_t<InputIterator> >,
|
||||||
|
class Allocator = std::allocator<
|
||||||
|
boost::unordered::detail::iter_to_alloc_t<InputIterator> >,
|
||||||
|
class = boost::enable_if_t<detail::is_input_iterator_v<InputIterator> >,
|
||||||
|
class = boost::enable_if_t<detail::is_hash_v<Hash> >,
|
||||||
|
class = boost::enable_if_t<detail::is_pred_v<Pred> >,
|
||||||
|
class = boost::enable_if_t<detail::is_allocator_v<Allocator> > >
|
||||||
|
concurrent_flat_map(InputIterator, InputIterator,
|
||||||
|
std::size_t = boost::unordered::detail::foa::default_bucket_count,
|
||||||
|
Hash = Hash(), Pred = Pred(), Allocator = Allocator())
|
||||||
|
-> concurrent_flat_map<
|
||||||
|
boost::unordered::detail::iter_key_t<InputIterator>,
|
||||||
|
boost::unordered::detail::iter_val_t<InputIterator>, Hash, Pred,
|
||||||
|
Allocator>;
|
||||||
|
|
||||||
|
template <class Key, class T,
|
||||||
|
class Hash = boost::hash<boost::remove_const_t<Key> >,
|
||||||
|
class Pred = std::equal_to<boost::remove_const_t<Key> >,
|
||||||
|
class Allocator = std::allocator<std::pair<const Key, T> >,
|
||||||
|
class = boost::enable_if_t<detail::is_hash_v<Hash> >,
|
||||||
|
class = boost::enable_if_t<detail::is_pred_v<Pred> >,
|
||||||
|
class = boost::enable_if_t<detail::is_allocator_v<Allocator> > >
|
||||||
|
concurrent_flat_map(std::initializer_list<std::pair<Key, T> >,
|
||||||
|
std::size_t = boost::unordered::detail::foa::default_bucket_count,
|
||||||
|
Hash = Hash(), Pred = Pred(), Allocator = Allocator())
|
||||||
|
-> concurrent_flat_map<boost::remove_const_t<Key>, T, Hash, Pred,
|
||||||
|
Allocator>;
|
||||||
|
|
||||||
|
template <class InputIterator, class Allocator,
|
||||||
|
class = boost::enable_if_t<detail::is_input_iterator_v<InputIterator> >,
|
||||||
|
class = boost::enable_if_t<detail::is_allocator_v<Allocator> > >
|
||||||
|
concurrent_flat_map(InputIterator, InputIterator, std::size_t, Allocator)
|
||||||
|
-> concurrent_flat_map<
|
||||||
|
boost::unordered::detail::iter_key_t<InputIterator>,
|
||||||
|
boost::unordered::detail::iter_val_t<InputIterator>,
|
||||||
|
boost::hash<boost::unordered::detail::iter_key_t<InputIterator> >,
|
||||||
|
std::equal_to<boost::unordered::detail::iter_key_t<InputIterator> >,
|
||||||
|
Allocator>;
|
||||||
|
|
||||||
|
template <class InputIterator, class Allocator,
|
||||||
|
class = boost::enable_if_t<detail::is_input_iterator_v<InputIterator> >,
|
||||||
|
class = boost::enable_if_t<detail::is_allocator_v<Allocator> > >
|
||||||
|
concurrent_flat_map(InputIterator, InputIterator, Allocator)
|
||||||
|
-> concurrent_flat_map<
|
||||||
|
boost::unordered::detail::iter_key_t<InputIterator>,
|
||||||
|
boost::unordered::detail::iter_val_t<InputIterator>,
|
||||||
|
boost::hash<boost::unordered::detail::iter_key_t<InputIterator> >,
|
||||||
|
std::equal_to<boost::unordered::detail::iter_key_t<InputIterator> >,
|
||||||
|
Allocator>;
|
||||||
|
|
||||||
|
template <class InputIterator, class Hash, class Allocator,
|
||||||
|
class = boost::enable_if_t<detail::is_hash_v<Hash> >,
|
||||||
|
class = boost::enable_if_t<detail::is_input_iterator_v<InputIterator> >,
|
||||||
|
class = boost::enable_if_t<detail::is_allocator_v<Allocator> > >
|
||||||
|
concurrent_flat_map(
|
||||||
|
InputIterator, InputIterator, std::size_t, Hash, Allocator)
|
||||||
|
-> concurrent_flat_map<
|
||||||
|
boost::unordered::detail::iter_key_t<InputIterator>,
|
||||||
|
boost::unordered::detail::iter_val_t<InputIterator>, Hash,
|
||||||
|
std::equal_to<boost::unordered::detail::iter_key_t<InputIterator> >,
|
||||||
|
Allocator>;
|
||||||
|
|
||||||
|
template <class Key, class T, class Allocator,
|
||||||
|
class = boost::enable_if_t<detail::is_allocator_v<Allocator> > >
|
||||||
|
concurrent_flat_map(std::initializer_list<std::pair<Key, T> >, std::size_t,
|
||||||
|
Allocator) -> concurrent_flat_map<boost::remove_const_t<Key>, T,
|
||||||
|
boost::hash<boost::remove_const_t<Key> >,
|
||||||
|
std::equal_to<boost::remove_const_t<Key> >, Allocator>;
|
||||||
|
|
||||||
|
template <class Key, class T, class Allocator,
|
||||||
|
class = boost::enable_if_t<detail::is_allocator_v<Allocator> > >
|
||||||
|
concurrent_flat_map(std::initializer_list<std::pair<Key, T> >, Allocator)
|
||||||
|
-> concurrent_flat_map<boost::remove_const_t<Key>, T,
|
||||||
|
boost::hash<boost::remove_const_t<Key> >,
|
||||||
|
std::equal_to<boost::remove_const_t<Key> >, Allocator>;
|
||||||
|
|
||||||
|
template <class Key, class T, class Hash, class Allocator,
|
||||||
|
class = boost::enable_if_t<detail::is_hash_v<Hash> >,
|
||||||
|
class = boost::enable_if_t<detail::is_allocator_v<Allocator> > >
|
||||||
|
concurrent_flat_map(std::initializer_list<std::pair<Key, T> >, std::size_t,
|
||||||
|
Hash, Allocator) -> concurrent_flat_map<boost::remove_const_t<Key>, T,
|
||||||
|
Hash, std::equal_to<boost::remove_const_t<Key> >, Allocator>;
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
} // namespace unordered
|
} // namespace unordered
|
||||||
|
|
||||||
using unordered::concurrent_flat_map;
|
using unordered::concurrent_flat_map;
|
||||||
|
@ -20,6 +20,9 @@
|
|||||||
#include <boost/type_traits/enable_if.hpp>
|
#include <boost/type_traits/enable_if.hpp>
|
||||||
#include <boost/type_traits/is_integral.hpp>
|
#include <boost/type_traits/is_integral.hpp>
|
||||||
#include <boost/type_traits/remove_const.hpp>
|
#include <boost/type_traits/remove_const.hpp>
|
||||||
|
|
||||||
|
#include <iterator>
|
||||||
|
#include <utility>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// BOOST_UNORDERED_TEMPLATE_DEDUCTION_GUIDES
|
// BOOST_UNORDERED_TEMPLATE_DEDUCTION_GUIDES
|
||||||
@ -101,6 +104,16 @@ namespace boost {
|
|||||||
!boost::is_integral<H>::value && !is_allocator_v<H>;
|
!boost::is_integral<H>::value && !is_allocator_v<H>;
|
||||||
|
|
||||||
template <class P> constexpr bool const is_pred_v = !is_allocator_v<P>;
|
template <class P> constexpr bool const is_pred_v = !is_allocator_v<P>;
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
using iter_key_t =
|
||||||
|
typename std::iterator_traits<T>::value_type::first_type;
|
||||||
|
template <typename T>
|
||||||
|
using iter_val_t =
|
||||||
|
typename std::iterator_traits<T>::value_type::second_type;
|
||||||
|
template <typename T>
|
||||||
|
using iter_to_alloc_t =
|
||||||
|
typename std::pair<iter_key_t<T> const, iter_val_t<T> >;
|
||||||
#endif
|
#endif
|
||||||
} // namespace detail
|
} // namespace detail
|
||||||
} // namespace unordered
|
} // namespace unordered
|
||||||
|
@ -741,18 +741,6 @@ namespace boost {
|
|||||||
|
|
||||||
#if BOOST_UNORDERED_TEMPLATE_DEDUCTION_GUIDES
|
#if BOOST_UNORDERED_TEMPLATE_DEDUCTION_GUIDES
|
||||||
|
|
||||||
namespace detail {
|
|
||||||
template <typename T>
|
|
||||||
using iter_key_t =
|
|
||||||
typename std::iterator_traits<T>::value_type::first_type;
|
|
||||||
template <typename T>
|
|
||||||
using iter_val_t =
|
|
||||||
typename std::iterator_traits<T>::value_type::second_type;
|
|
||||||
template <typename T>
|
|
||||||
using iter_to_alloc_t =
|
|
||||||
typename std::pair<iter_key_t<T> const, iter_val_t<T> >;
|
|
||||||
} // namespace detail
|
|
||||||
|
|
||||||
template <class InputIterator,
|
template <class InputIterator,
|
||||||
class Hash =
|
class Hash =
|
||||||
boost::hash<boost::unordered::detail::iter_key_t<InputIterator> >,
|
boost::hash<boost::unordered::detail::iter_key_t<InputIterator> >,
|
||||||
|
@ -1061,18 +1061,6 @@ namespace boost {
|
|||||||
|
|
||||||
#if BOOST_UNORDERED_TEMPLATE_DEDUCTION_GUIDES
|
#if BOOST_UNORDERED_TEMPLATE_DEDUCTION_GUIDES
|
||||||
|
|
||||||
namespace detail {
|
|
||||||
template <typename T>
|
|
||||||
using iter_key_t =
|
|
||||||
typename std::iterator_traits<T>::value_type::first_type;
|
|
||||||
template <typename T>
|
|
||||||
using iter_val_t =
|
|
||||||
typename std::iterator_traits<T>::value_type::second_type;
|
|
||||||
template <typename T>
|
|
||||||
using iter_to_alloc_t =
|
|
||||||
typename std::pair<iter_key_t<T> const, iter_val_t<T> >;
|
|
||||||
} // namespace detail
|
|
||||||
|
|
||||||
template <class InputIterator,
|
template <class InputIterator,
|
||||||
class Hash =
|
class Hash =
|
||||||
boost::hash<boost::unordered::detail::iter_key_t<InputIterator> >,
|
boost::hash<boost::unordered::detail::iter_key_t<InputIterator> >,
|
||||||
|
@ -893,18 +893,6 @@ namespace boost {
|
|||||||
|
|
||||||
#if BOOST_UNORDERED_TEMPLATE_DEDUCTION_GUIDES
|
#if BOOST_UNORDERED_TEMPLATE_DEDUCTION_GUIDES
|
||||||
|
|
||||||
namespace detail {
|
|
||||||
template <typename T>
|
|
||||||
using iter_key_t =
|
|
||||||
typename std::iterator_traits<T>::value_type::first_type;
|
|
||||||
template <typename T>
|
|
||||||
using iter_val_t =
|
|
||||||
typename std::iterator_traits<T>::value_type::second_type;
|
|
||||||
template <typename T>
|
|
||||||
using iter_to_alloc_t =
|
|
||||||
typename std::pair<iter_key_t<T> const, iter_val_t<T> >;
|
|
||||||
} // namespace detail
|
|
||||||
|
|
||||||
template <class InputIterator,
|
template <class InputIterator,
|
||||||
class Hash =
|
class Hash =
|
||||||
boost::hash<boost::unordered::detail::iter_key_t<InputIterator> >,
|
boost::hash<boost::unordered::detail::iter_key_t<InputIterator> >,
|
||||||
|
@ -13,6 +13,7 @@
|
|||||||
|
|
||||||
#include <boost/unordered/unordered_flat_map.hpp>
|
#include <boost/unordered/unordered_flat_map.hpp>
|
||||||
#include <boost/unordered/unordered_flat_set.hpp>
|
#include <boost/unordered/unordered_flat_set.hpp>
|
||||||
|
#include <boost/unordered/concurrent_flat_map.hpp>
|
||||||
|
|
||||||
struct hash_equals
|
struct hash_equals
|
||||||
{
|
{
|
||||||
@ -432,6 +433,7 @@ int main()
|
|||||||
map_tests<boost::unordered_map>();
|
map_tests<boost::unordered_map>();
|
||||||
map_tests<boost::unordered_multimap>();
|
map_tests<boost::unordered_multimap>();
|
||||||
map_tests<boost::unordered_flat_map>();
|
map_tests<boost::unordered_flat_map>();
|
||||||
|
map_tests<boost::concurrent_flat_map>();
|
||||||
set_tests<boost::unordered_set>();
|
set_tests<boost::unordered_set>();
|
||||||
set_tests<boost::unordered_multiset>();
|
set_tests<boost::unordered_multiset>();
|
||||||
set_tests<boost::unordered_flat_set>();
|
set_tests<boost::unordered_flat_set>();
|
||||||
|
Reference in New Issue
Block a user