aboutsummaryrefslogtreecommitdiff
path: root/tests/libcxx/include/__hash_table
diff options
context:
space:
mode:
Diffstat (limited to 'tests/libcxx/include/__hash_table')
-rw-r--r--tests/libcxx/include/__hash_table1819
1 files changed, 0 insertions, 1819 deletions
diff --git a/tests/libcxx/include/__hash_table b/tests/libcxx/include/__hash_table
deleted file mode 100644
index ae9ee1c5..00000000
--- a/tests/libcxx/include/__hash_table
+++ /dev/null
@@ -1,1819 +0,0 @@
-// -*- C++ -*-
-//===----------------------------------------------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP__HASH_TABLE
-#define _LIBCPP__HASH_TABLE
-
-#include <__config>
-#include <initializer_list>
-#include <memory>
-#include <iterator>
-#include <algorithm>
-#include <cmath>
-
-#pragma GCC system_header
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-_LIBCPP_VISIBLE
-size_t __next_prime(size_t);
-
-template <class _NodePtr>
-struct __hash_node_base
-{
- typedef __hash_node_base __first_node;
- typedef _NodePtr pointer;
-
- pointer __next_;
-
- _LIBCPP_INLINE_VISIBILITY __hash_node_base() : __next_(nullptr) {}
-};
-
-template <class _Tp, class _VoidPtr>
-struct __hash_node
- : public __hash_node_base
- <
- typename pointer_traits<_VoidPtr>::template
-#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
- rebind<__hash_node<_Tp, _VoidPtr> >
-#else
- rebind<__hash_node<_Tp, _VoidPtr> >::other
-#endif
- >
-{
- typedef _Tp value_type;
-
- size_t __hash_;
- value_type __value_;
-};
-
-template <class, class, class, class> class __hash_table;
-template <class> class __hash_const_iterator;
-template <class> class __hash_map_iterator;
-template <class> class __hash_map_const_iterator;
-template <class, class, class, class, class> class _LIBCPP_VISIBLE unordered_map;
-
-template <class _NodePtr>
-class _LIBCPP_VISIBLE __hash_iterator
-{
- typedef _NodePtr __node_pointer;
-
- __node_pointer __node_;
-
-public:
- typedef forward_iterator_tag iterator_category;
- typedef typename pointer_traits<__node_pointer>::element_type::value_type value_type;
- typedef typename pointer_traits<__node_pointer>::difference_type difference_type;
- typedef value_type& reference;
- typedef typename pointer_traits<__node_pointer>::template
-#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
- rebind<value_type>
-#else
- rebind<value_type>::other
-#endif
- pointer;
-
- _LIBCPP_INLINE_VISIBILITY __hash_iterator() {}
-
- _LIBCPP_INLINE_VISIBILITY
- reference operator*() const {return __node_->__value_;}
- _LIBCPP_INLINE_VISIBILITY
- pointer operator->() const {return addressof(__node_->__value_);}
-
- _LIBCPP_INLINE_VISIBILITY
- __hash_iterator& operator++()
- {
- __node_ = __node_->__next_;
- return *this;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- __hash_iterator operator++(int)
- {
- __hash_iterator __t(*this);
- ++(*this);
- return __t;
- }
-
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const __hash_iterator& __x, const __hash_iterator& __y)
- {return __x.__node_ == __y.__node_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const __hash_iterator& __x, const __hash_iterator& __y)
- {return __x.__node_ != __y.__node_;}
-
-private:
- _LIBCPP_INLINE_VISIBILITY
- __hash_iterator(__node_pointer __node)
- : __node_(__node)
- {}
-
- template <class, class, class, class> friend class __hash_table;
- template <class> friend class _LIBCPP_VISIBLE __hash_const_iterator;
- template <class> friend class _LIBCPP_VISIBLE __hash_map_iterator;
- template <class, class, class, class, class> friend class _LIBCPP_VISIBLE unordered_map;
- template <class, class, class, class, class> friend class _LIBCPP_VISIBLE unordered_multimap;
-};
-
-template <class _ConstNodePtr>
-class _LIBCPP_VISIBLE __hash_const_iterator
-{
- typedef _ConstNodePtr __node_pointer;
-
- __node_pointer __node_;
-
- typedef typename remove_const<
- typename pointer_traits<__node_pointer>::element_type
- >::type __node;
-
-public:
- typedef forward_iterator_tag iterator_category;
- typedef typename __node::value_type value_type;
- typedef typename pointer_traits<__node_pointer>::difference_type difference_type;
- typedef const value_type& reference;
- typedef typename pointer_traits<__node_pointer>::template
-#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
- rebind<const value_type>
-#else
- rebind<const value_type>::other
-#endif
- pointer;
- typedef typename pointer_traits<__node_pointer>::template
-#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
- rebind<__node>
-#else
- rebind<__node>::other
-#endif
- __non_const_node_pointer;
- typedef __hash_iterator<__non_const_node_pointer> __non_const_iterator;
-
- _LIBCPP_INLINE_VISIBILITY __hash_const_iterator() {}
- _LIBCPP_INLINE_VISIBILITY
- __hash_const_iterator(const __non_const_iterator& __x)
- : __node_(__x.__node_)
- {}
-
- _LIBCPP_INLINE_VISIBILITY
- reference operator*() const {return __node_->__value_;}
- _LIBCPP_INLINE_VISIBILITY
- pointer operator->() const {return addressof(__node_->__value_);}
-
- _LIBCPP_INLINE_VISIBILITY
- __hash_const_iterator& operator++()
- {
- __node_ = __node_->__next_;
- return *this;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- __hash_const_iterator operator++(int)
- {
- __hash_const_iterator __t(*this);
- ++(*this);
- return __t;
- }
-
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const __hash_const_iterator& __x, const __hash_const_iterator& __y)
- {return __x.__node_ == __y.__node_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const __hash_const_iterator& __x, const __hash_const_iterator& __y)
- {return __x.__node_ != __y.__node_;}
-
-private:
- _LIBCPP_INLINE_VISIBILITY
- __hash_const_iterator(__node_pointer __node)
- : __node_(__node)
- {}
-
- template <class, class, class, class> friend class __hash_table;
- template <class> friend class _LIBCPP_VISIBLE __hash_map_const_iterator;
- template <class, class, class, class, class> friend class _LIBCPP_VISIBLE unordered_map;
- template <class, class, class, class, class> friend class _LIBCPP_VISIBLE unordered_multimap;
-};
-
-template <class> class _LIBCPP_VISIBLE __hash_const_local_iterator;
-
-template <class _NodePtr>
-class _LIBCPP_VISIBLE __hash_local_iterator
-{
- typedef _NodePtr __node_pointer;
-
- __node_pointer __node_;
- size_t __bucket_;
- size_t __bucket_count_;
-
- typedef pointer_traits<__node_pointer> __pointer_traits;
-public:
- typedef forward_iterator_tag iterator_category;
- typedef typename __pointer_traits::element_type::value_type value_type;
- typedef typename __pointer_traits::difference_type difference_type;
- typedef value_type& reference;
- typedef typename __pointer_traits::template
-#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
- rebind<value_type>
-#else
- rebind<value_type>::other
-#endif
- pointer;
-
- _LIBCPP_INLINE_VISIBILITY __hash_local_iterator() {}
-
- _LIBCPP_INLINE_VISIBILITY
- reference operator*() const {return __node_->__value_;}
- _LIBCPP_INLINE_VISIBILITY
- pointer operator->() const {return &__node_->__value_;}
-
- _LIBCPP_INLINE_VISIBILITY
- __hash_local_iterator& operator++()
- {
- __node_ = __node_->__next_;
- if (__node_ != nullptr && __node_->__hash_ % __bucket_count_ != __bucket_)
- __node_ = nullptr;
- return *this;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- __hash_local_iterator operator++(int)
- {
- __hash_local_iterator __t(*this);
- ++(*this);
- return __t;
- }
-
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const __hash_local_iterator& __x, const __hash_local_iterator& __y)
- {return __x.__node_ == __y.__node_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const __hash_local_iterator& __x, const __hash_local_iterator& __y)
- {return __x.__node_ != __y.__node_;}
-
-private:
- _LIBCPP_INLINE_VISIBILITY
- __hash_local_iterator(__node_pointer __node, size_t __bucket,
- size_t __bucket_count)
- : __node_(__node),
- __bucket_(__bucket),
- __bucket_count_(__bucket_count)
- {
- if (__node_ != nullptr)
- __node_ = __node_->__next_;
- }
-
- template <class, class, class, class> friend class __hash_table;
- template <class> friend class _LIBCPP_VISIBLE __hash_const_local_iterator;
- template <class> friend class _LIBCPP_VISIBLE __hash_map_iterator;
-};
-
-template <class _ConstNodePtr>
-class _LIBCPP_VISIBLE __hash_const_local_iterator
-{
- typedef _ConstNodePtr __node_pointer;
-
- __node_pointer __node_;
- size_t __bucket_;
- size_t __bucket_count_;
-
- typedef pointer_traits<__node_pointer> __pointer_traits;
- typedef typename __pointer_traits::element_type __node;
- typedef typename remove_const<__node>::type __non_const_node;
- typedef typename pointer_traits<__node_pointer>::template
-#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
- rebind<__non_const_node>
-#else
- rebind<__non_const_node>::other
-#endif
- __non_const_node_pointer;
- typedef __hash_local_iterator<__non_const_node_pointer>
- __non_const_iterator;
-public:
- typedef forward_iterator_tag iterator_category;
- typedef typename remove_const<
- typename __pointer_traits::element_type::value_type
- >::type value_type;
- typedef typename __pointer_traits::difference_type difference_type;
- typedef const value_type& reference;
- typedef typename __pointer_traits::template
-#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
- rebind<const value_type>
-#else
- rebind<const value_type>::other
-#endif
- pointer;
-
- _LIBCPP_INLINE_VISIBILITY __hash_const_local_iterator() {}
- _LIBCPP_INLINE_VISIBILITY
- __hash_const_local_iterator(const __non_const_iterator& __x)
- : __node_(__x.__node_),
- __bucket_(__x.__bucket_),
- __bucket_count_(__x.__bucket_count_)
- {}
-
- _LIBCPP_INLINE_VISIBILITY
- reference operator*() const {return __node_->__value_;}
- _LIBCPP_INLINE_VISIBILITY
- pointer operator->() const {return &__node_->__value_;}
-
- _LIBCPP_INLINE_VISIBILITY
- __hash_const_local_iterator& operator++()
- {
- __node_ = __node_->__next_;
- if (__node_ != nullptr && __node_->__hash_ % __bucket_count_ != __bucket_)
- __node_ = nullptr;
- return *this;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- __hash_const_local_iterator operator++(int)
- {
- __hash_const_local_iterator __t(*this);
- ++(*this);
- return __t;
- }
-
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const __hash_const_local_iterator& __x, const __hash_const_local_iterator& __y)
- {return __x.__node_ == __y.__node_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const __hash_const_local_iterator& __x, const __hash_const_local_iterator& __y)
- {return __x.__node_ != __y.__node_;}
-
-private:
- _LIBCPP_INLINE_VISIBILITY
- __hash_const_local_iterator(__node_pointer __node, size_t __bucket,
- size_t __bucket_count)
- : __node_(__node),
- __bucket_(__bucket),
- __bucket_count_(__bucket_count)
- {
- if (__node_ != nullptr)
- __node_ = __node_->__next_;
- }
-
- template <class, class, class, class> friend class __hash_table;
- template <class> friend class _LIBCPP_VISIBLE __hash_map_const_iterator;
-};
-
-template <class _Alloc>
-class __bucket_list_deallocator
-{
- typedef _Alloc allocator_type;
- typedef allocator_traits<allocator_type> __alloc_traits;
- typedef typename __alloc_traits::size_type size_type;
-
- __compressed_pair<size_type, allocator_type> __data_;
-public:
- typedef typename __alloc_traits::pointer pointer;
-
- _LIBCPP_INLINE_VISIBILITY
- __bucket_list_deallocator()
- : __data_(0) {}
-
- _LIBCPP_INLINE_VISIBILITY
- __bucket_list_deallocator(const allocator_type& __a, size_type __size)
- : __data_(__size, __a) {}
-
-#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
-
- _LIBCPP_INLINE_VISIBILITY
- __bucket_list_deallocator(__bucket_list_deallocator&& __x)
- : __data_(_STD::move(__x.__data_))
- {
- __x.size() = 0;
- }
-
-#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
-
- _LIBCPP_INLINE_VISIBILITY size_type& size() {return __data_.first();}
- _LIBCPP_INLINE_VISIBILITY size_type size() const {return __data_.first();}
-
- _LIBCPP_INLINE_VISIBILITY allocator_type& __alloc() {return __data_.second();}
- _LIBCPP_INLINE_VISIBILITY const allocator_type& __alloc() const {return __data_.second();}
-
- _LIBCPP_INLINE_VISIBILITY
- void operator()(pointer __p)
- {
- __alloc_traits::deallocate(__alloc(), __p, size());
- }
-};
-
-template <class> class __hash_map_node_destructor;
-
-template <class _Alloc>
-class __hash_node_destructor
-{
- typedef _Alloc allocator_type;
- typedef allocator_traits<allocator_type> __alloc_traits;
- typedef typename __alloc_traits::value_type::value_type value_type;
-public:
- typedef typename __alloc_traits::pointer pointer;
-private:
-
- allocator_type& __na_;
-
- __hash_node_destructor& operator=(const __hash_node_destructor&);
-
-public:
- bool __value_constructed;
-
- _LIBCPP_INLINE_VISIBILITY
- explicit __hash_node_destructor(allocator_type& __na)
- : __na_(__na),
- __value_constructed(false)
- {}
-
- _LIBCPP_INLINE_VISIBILITY
- void operator()(pointer __p)
- {
- if (__value_constructed)
- __alloc_traits::destroy(__na_, addressof(__p->__value_));
- if (__p)
- __alloc_traits::deallocate(__na_, __p, 1);
- }
-
- template <class> friend class __hash_map_node_destructor;
-};
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-class __hash_table
-{
-public:
- typedef _Tp value_type;
- typedef _Hash hasher;
- typedef _Equal key_equal;
- typedef _Alloc allocator_type;
-
-private:
- typedef allocator_traits<allocator_type> __alloc_traits;
-public:
- typedef value_type& reference;
- typedef const value_type& const_reference;
- typedef typename __alloc_traits::pointer pointer;
- typedef typename __alloc_traits::const_pointer const_pointer;
- typedef typename __alloc_traits::size_type size_type;
- typedef typename __alloc_traits::difference_type difference_type;
-public:
- // Create __node
- typedef __hash_node<value_type, typename __alloc_traits::void_pointer> __node;
- typedef typename __node::__first_node __first_node;
- typedef typename __alloc_traits::template
-#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
- rebind_alloc<__node>
-#else
- rebind_alloc<__node>::other
-#endif
- __node_allocator;
- typedef allocator_traits<__node_allocator> __node_traits;
- typedef typename __node_traits::pointer __node_pointer;
- typedef typename __node_traits::const_pointer __node_const_pointer;
-
-private:
-
- typedef typename __node_traits::template
-#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
- rebind_alloc<__node_pointer>
-#else
- rebind_alloc<__node_pointer>::other
-#endif
- __pointer_allocator;
- typedef __bucket_list_deallocator<__pointer_allocator> __bucket_list_deleter;
- typedef unique_ptr<__node_pointer[], __bucket_list_deleter> __bucket_list;
- typedef allocator_traits<__pointer_allocator> __pointer_alloc_traits;
- typedef typename __bucket_list_deleter::pointer __node_pointer_pointer;
-
- // --- Member data begin ---
- __bucket_list __bucket_list_;
- __compressed_pair<__first_node, __node_allocator> __p1_;
- __compressed_pair<size_type, hasher> __p2_;
- __compressed_pair<float, key_equal> __p3_;
- // --- Member data end ---
-
- _LIBCPP_INLINE_VISIBILITY size_type& size() {return __p2_.first();}
-public:
- _LIBCPP_INLINE_VISIBILITY size_type size() const {return __p2_.first();}
-
- _LIBCPP_INLINE_VISIBILITY hasher& hash_function() {return __p2_.second();}
- _LIBCPP_INLINE_VISIBILITY const hasher& hash_function() const {return __p2_.second();}
-
- _LIBCPP_INLINE_VISIBILITY float& max_load_factor() {return __p3_.first();}
- _LIBCPP_INLINE_VISIBILITY float max_load_factor() const {return __p3_.first();}
-
- _LIBCPP_INLINE_VISIBILITY key_equal& key_eq() {return __p3_.second();}
- _LIBCPP_INLINE_VISIBILITY const key_equal& key_eq() const {return __p3_.second();}
-
- _LIBCPP_INLINE_VISIBILITY __node_allocator& __node_alloc() {return __p1_.second();}
- _LIBCPP_INLINE_VISIBILITY const __node_allocator& __node_alloc() const {return __p1_.second();}
-
-public:
- typedef __hash_iterator<__node_pointer> iterator;
- typedef __hash_const_iterator<__node_const_pointer> const_iterator;
- typedef __hash_local_iterator<__node_pointer> local_iterator;
- typedef __hash_const_local_iterator<__node_const_pointer> const_local_iterator;
-
- __hash_table();
- __hash_table(const hasher& __hf, const key_equal& __eql);
- __hash_table(const hasher& __hf, const key_equal& __eql,
- const allocator_type& __a);
- explicit __hash_table(const allocator_type& __a);
- __hash_table(const __hash_table& __u);
- __hash_table(const __hash_table& __u, const allocator_type& __a);
-#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
- __hash_table(__hash_table&& __u);
- __hash_table(__hash_table&& __u, const allocator_type& __a);
-#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
- ~__hash_table();
-
- __hash_table& operator=(const __hash_table& __u);
-#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
- __hash_table& operator=(__hash_table&& __u);
-#endif
- template <class _InputIterator>
- void __assign_unique(_InputIterator __first, _InputIterator __last);
- template <class _InputIterator>
- void __assign_multi(_InputIterator __first, _InputIterator __last);
-
- _LIBCPP_INLINE_VISIBILITY
- size_type max_size() const
- {
- return allocator_traits<__pointer_allocator>::max_size(
- __bucket_list_.get_deleter().__alloc());
- }
-
- pair<iterator, bool> __node_insert_unique(__node_pointer __nd);
- iterator __node_insert_multi(__node_pointer __nd);
- iterator __node_insert_multi(const_iterator __p,
- __node_pointer __nd);
-
-#if !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS)
- template <class... _Args>
- pair<iterator, bool> __emplace_unique(_Args&&... __args);
- template <class... _Args>
- iterator __emplace_multi(_Args&&... __args);
- template <class... _Args>
- iterator __emplace_hint_multi(const_iterator __p, _Args&&... __args);
-#endif // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS)
-
- pair<iterator, bool> __insert_unique(const value_type& __x);
-
-#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
- template <class _P>
- pair<iterator, bool> __insert_unique(_P&& __x);
-#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
-
-#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
- template <class _P>
- iterator __insert_multi(_P&& __x);
- template <class _P>
- iterator __insert_multi(const_iterator __p, _P&& __x);
-#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES
- iterator __insert_multi(const value_type& __x);
- iterator __insert_multi(const_iterator __p, const value_type& __x);
-#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
-
- void clear();
- void rehash(size_type __n);
- _LIBCPP_INLINE_VISIBILITY void reserve(size_type __n)
- {rehash(static_cast<size_type>(ceil(__n / max_load_factor())));}
-
- _LIBCPP_INLINE_VISIBILITY
- size_type bucket_count() const
- {
- return __bucket_list_.get_deleter().size();
- }
-
- iterator begin();
- iterator end();
- const_iterator begin() const;
- const_iterator end() const;
-
- template <class _Key>
- _LIBCPP_INLINE_VISIBILITY
- size_type bucket(const _Key& __k) const
- {return hash_function()(__k) % bucket_count();}
-
- template <class _Key>
- iterator find(const _Key& __x);
- template <class _Key>
- const_iterator find(const _Key& __x) const;
-
- typedef __hash_node_destructor<__node_allocator> _D;
- typedef unique_ptr<__node, _D> __node_holder;
-
- iterator erase(const_iterator __p);
- iterator erase(const_iterator __first, const_iterator __last);
- template <class _Key>
- size_type __erase_unique(const _Key& __k);
- template <class _Key>
- size_type __erase_multi(const _Key& __k);
- __node_holder remove(const_iterator __p);
-
- template <class _Key>
- size_type __count_unique(const _Key& __k) const;
- template <class _Key>
- size_type __count_multi(const _Key& __k) const;
-
- template <class _Key>
- pair<iterator, iterator>
- __equal_range_unique(const _Key& __k);
- template <class _Key>
- pair<const_iterator, const_iterator>
- __equal_range_unique(const _Key& __k) const;
-
- template <class _Key>
- pair<iterator, iterator>
- __equal_range_multi(const _Key& __k);
- template <class _Key>
- pair<const_iterator, const_iterator>
- __equal_range_multi(const _Key& __k) const;
-
- void swap(__hash_table& __u);
-
- _LIBCPP_INLINE_VISIBILITY
- size_type max_bucket_count() const
- {return __bucket_list_.get_deleter().__alloc().max_size();}
- size_type bucket_size(size_type __n) const;
- _LIBCPP_INLINE_VISIBILITY float load_factor() const
- {
- size_type __bc = bucket_count();
- return __bc != 0 ? (float)size() / __bc : 0.f;
- }
- _LIBCPP_INLINE_VISIBILITY void max_load_factor(float __mlf)
- {max_load_factor() = _STD::max(__mlf, load_factor());}
-
- _LIBCPP_INLINE_VISIBILITY local_iterator begin(size_type __n)
- {return local_iterator(__bucket_list_[__n], __n, bucket_count());}
- _LIBCPP_INLINE_VISIBILITY local_iterator end(size_type __n)
- {return local_iterator(nullptr, __n, bucket_count());}
- _LIBCPP_INLINE_VISIBILITY const_local_iterator cbegin(size_type __n) const
- {return const_local_iterator(__bucket_list_[__n], __n, bucket_count());}
- _LIBCPP_INLINE_VISIBILITY const_local_iterator cend(size_type __n) const
- {return const_local_iterator(nullptr, __n, bucket_count());}
-private:
- void __rehash(size_type __n);
-
-#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
-#ifndef _LIBCPP_HAS_NO_VARIADICS
- template <class ..._Args>
- __node_holder __construct_node(_Args&& ...__args);
-#endif // _LIBCPP_HAS_NO_VARIADICS
- __node_holder __construct_node(value_type&& __v, size_t __hash);
-#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES
- __node_holder __construct_node(const value_type& __v);
-#endif
- __node_holder __construct_node(const value_type& __v, size_t __hash);
-
- _LIBCPP_INLINE_VISIBILITY
- void __copy_assign_alloc(const __hash_table& __u)
- {__copy_assign_alloc(__u, integral_constant<bool,
- __node_traits::propagate_on_container_copy_assignment::value>());}
- void __copy_assign_alloc(const __hash_table& __u, true_type);
- _LIBCPP_INLINE_VISIBILITY
- void __copy_assign_alloc(const __hash_table& __u, false_type) {}
-
- void __move_assign(__hash_table& __u, false_type);
- void __move_assign(__hash_table& __u, true_type);
- _LIBCPP_INLINE_VISIBILITY void __move_assign_alloc(__hash_table& __u)
- {__move_assign_alloc(__u, integral_constant<bool,
- __node_traits::propagate_on_container_move_assignment::value>());}
- _LIBCPP_INLINE_VISIBILITY
- void __move_assign_alloc(__hash_table& __u, true_type)
- {
- __bucket_list_.get_deleter().__alloc() =
- _STD::move(__u.__bucket_list_.get_deleter().__alloc());
- __node_alloc() = _STD::move(__u.__node_alloc());
- }
- _LIBCPP_INLINE_VISIBILITY
- void __move_assign_alloc(__hash_table&, false_type) {}
-
- template <class _A>
- _LIBCPP_INLINE_VISIBILITY
- static
- void
- __swap_alloc(_A& __x, _A& __y)
- {
- __swap_alloc(__x, __y,
- integral_constant<bool,
- allocator_traits<_A>::propagate_on_container_swap::value
- >());
- }
-
- template <class _A>
- _LIBCPP_INLINE_VISIBILITY
- static
- void
- __swap_alloc(_A& __x, _A& __y, true_type)
- {
- using _STD::swap;
- swap(__x, __y);
- }
-
- template <class _A>
- _LIBCPP_INLINE_VISIBILITY
- static
- void
- __swap_alloc(_A& __x, _A& __y, false_type) {}
-
- void __deallocate(__node_pointer __np);
- __node_pointer __detach();
-};
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-inline _LIBCPP_INLINE_VISIBILITY
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__hash_table()
- : __p2_(0),
- __p3_(1.0f)
-{
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-inline _LIBCPP_INLINE_VISIBILITY
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__hash_table(const hasher& __hf,
- const key_equal& __eql)
- : __bucket_list_(nullptr, __bucket_list_deleter()),
- __p1_(),
- __p2_(0, __hf),
- __p3_(1.0f, __eql)
-{
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__hash_table(const hasher& __hf,
- const key_equal& __eql,
- const allocator_type& __a)
- : __bucket_list_(nullptr, __bucket_list_deleter(__pointer_allocator(__a), 0)),
- __p1_(__node_allocator(__a)),
- __p2_(0, __hf),
- __p3_(1.0f, __eql)
-{
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__hash_table(const allocator_type& __a)
- : __bucket_list_(nullptr, __bucket_list_deleter(__pointer_allocator(__a), 0)),
- __p1_(__node_allocator(__a)),
- __p2_(0),
- __p3_(1.0f)
-{
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__hash_table(const __hash_table& __u)
- : __bucket_list_(nullptr,
- __bucket_list_deleter(allocator_traits<__pointer_allocator>::
- select_on_container_copy_construction(
- __u.__bucket_list_.get_deleter().__alloc()), 0)),
- __p1_(allocator_traits<__node_allocator>::
- select_on_container_copy_construction(__u.__node_alloc())),
- __p2_(0, __u.hash_function()),
- __p3_(__u.__p3_)
-{
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__hash_table(const __hash_table& __u,
- const allocator_type& __a)
- : __bucket_list_(nullptr, __bucket_list_deleter(__pointer_allocator(__a), 0)),
- __p1_(__node_allocator(__a)),
- __p2_(0, __u.hash_function()),
- __p3_(__u.__p3_)
-{
-}
-
-#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__hash_table(__hash_table&& __u)
- : __bucket_list_(_STD::move(__u.__bucket_list_)),
- __p1_(_STD::move(__u.__p1_)),
- __p2_(_STD::move(__u.__p2_)),
- __p3_(_STD::move(__u.__p3_))
-{
- if (size() > 0)
- {
- __bucket_list_[__p1_.first().__next_->__hash_ % bucket_count()] =
- static_cast<__node_pointer>(addressof(__p1_.first()));
- __u.__p1_.first().__next_ = nullptr;
- __u.size() = 0;
- }
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__hash_table(__hash_table&& __u,
- const allocator_type& __a)
- : __bucket_list_(nullptr, __bucket_list_deleter(__pointer_allocator(__a), 0)),
- __p1_(__node_allocator(__a)),
- __p2_(0, _STD::move(__u.hash_function())),
- __p3_(_STD::move(__u.__p3_))
-{
- if (__a == allocator_type(__u.__node_alloc()))
- {
- __bucket_list_.reset(__u.__bucket_list_.release());
- __bucket_list_.get_deleter().size() = __u.__bucket_list_.get_deleter().size();
- __u.__bucket_list_.get_deleter().size() = 0;
- if (__u.size() > 0)
- {
- __p1_.first().__next_ = __u.__p1_.first().__next_;
- __u.__p1_.first().__next_ = nullptr;
- __bucket_list_[__p1_.first().__next_->__hash_ % bucket_count()] =
- static_cast<__node_pointer>(addressof(__p1_.first()));
- size() = __u.size();
- __u.size() = 0;
- }
- }
-}
-
-#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::~__hash_table()
-{
- __deallocate(__p1_.first().__next_);
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-void
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__copy_assign_alloc(
- const __hash_table& __u, true_type)
-{
- if (__node_alloc() != __u.__node_alloc())
- {
- clear();
- __bucket_list_.reset();
- __bucket_list_.get_deleter().size() = 0;
- }
- __bucket_list_.get_deleter().__alloc() = __u.__bucket_list_.get_deleter().__alloc();
- __node_alloc() = __u.__node_alloc();
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-__hash_table<_Tp, _Hash, _Equal, _Alloc>&
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::operator=(const __hash_table& __u)
-{
- if (this != &__u)
- {
- __copy_assign_alloc(__u);
- hash_function() = __u.hash_function();
- key_eq() = __u.key_eq();
- max_load_factor() = __u.max_load_factor();
- __assign_multi(__u.begin(), __u.end());
- }
- return *this;
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-void
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__deallocate(__node_pointer __np)
-{
- __node_allocator& __na = __node_alloc();
- while (__np != nullptr)
- {
- __node_pointer __next = __np->__next_;
- __node_traits::destroy(__na, addressof(__np->__value_));
- __node_traits::deallocate(__na, __np, 1);
- __np = __next;
- }
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::__node_pointer
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__detach()
-{
- size_type __bc = bucket_count();
- for (size_type __i = 0; __i < __bc; ++__i)
- __bucket_list_[__i] = nullptr;
- size() = 0;
- __node_pointer __cache = __p1_.first().__next_;
- __p1_.first().__next_ = nullptr;
- return __cache;
-}
-
-#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-void
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__move_assign(
- __hash_table& __u, true_type)
-{
- clear();
- __bucket_list_.reset(__u.__bucket_list_.release());
- __bucket_list_.get_deleter().size() = __u.__bucket_list_.get_deleter().size();
- __u.__bucket_list_.get_deleter().size() = 0;
- __move_assign_alloc(__u);
- size() = __u.size();
- hash_function() = _STD::move(__u.hash_function());
- max_load_factor() = __u.max_load_factor();
- key_eq() = _STD::move(__u.key_eq());
- __p1_.first().__next_ = __u.__p1_.first().__next_;
- if (size() > 0)
- {
- __bucket_list_[__p1_.first().__next_->__hash_ % bucket_count()] =
- static_cast<__node_pointer>(addressof(__p1_.first()));
- __u.__p1_.first().__next_ = nullptr;
- __u.size() = 0;
- }
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-void
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__move_assign(
- __hash_table& __u, false_type)
-{
- if (__node_alloc() == __u.__node_alloc())
- __move_assign(__u, true_type());
- else
- {
- hash_function() = _STD::move(__u.hash_function());
- key_eq() = _STD::move(__u.key_eq());
- max_load_factor() = __u.max_load_factor();
- if (bucket_count() != 0)
- {
- __node_pointer __cache = __detach();
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- const_iterator __i = __u.begin();
- while (__cache != nullptr && __u.size() != 0)
- {
- __cache->__value_ = _STD::move(__u.remove(__i++)->__value_);
- __node_pointer __next = __cache->__next_;
- __node_insert_multi(__cache);
- __cache = __next;
- }
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- __deallocate(__cache);
- throw;
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
- __deallocate(__cache);
- }
- const_iterator __i = __u.begin();
- while (__u.size() != 0)
- {
- __node_holder __h =
- __construct_node(_STD::move(__u.remove(__i++)->__value_));
- __node_insert_multi(__h.get());
- __h.release();
- }
- }
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-inline _LIBCPP_INLINE_VISIBILITY
-__hash_table<_Tp, _Hash, _Equal, _Alloc>&
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::operator=(__hash_table&& __u)
-{
- __move_assign(__u, integral_constant<bool,
- __node_traits::propagate_on_container_move_assignment::value>());
- return *this;
-}
-
-#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-template <class _InputIterator>
-void
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__assign_unique(_InputIterator __first,
- _InputIterator __last)
-{
- if (bucket_count() != 0)
- {
- __node_pointer __cache = __detach();
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try