diff --git a/libcxx/include/__hash_table b/libcxx/include/__hash_table index 6f6050d33ebb..2b282d33a9e3 100644 --- a/libcxx/include/__hash_table +++ b/libcxx/include/__hash_table @@ -33,7 +33,6 @@ template struct __hash_node_base { typedef __hash_node_base __first_node; - // typedef _NodePtr pointer; _NodePtr __next_; @@ -111,7 +110,7 @@ public: _LIBCPP_INLINE_VISIBILITY reference operator*() const {return __node_->__value_;} _LIBCPP_INLINE_VISIBILITY - pointer operator->() const {return _VSTD::addressof(__node_->__value_);} + pointer operator->() const {return pointer_traits::pointer_to(__node_->__value_);} _LIBCPP_INLINE_VISIBILITY __hash_iterator& operator++() @@ -189,7 +188,7 @@ public: _LIBCPP_INLINE_VISIBILITY reference operator*() const {return __node_->__value_;} _LIBCPP_INLINE_VISIBILITY - pointer operator->() const {return _VSTD::addressof(__node_->__value_);} + pointer operator->() const {return pointer_traits::pointer_to(__node_->__value_);} _LIBCPP_INLINE_VISIBILITY __hash_const_iterator& operator++() @@ -255,7 +254,7 @@ public: _LIBCPP_INLINE_VISIBILITY reference operator*() const {return __node_->__value_;} _LIBCPP_INLINE_VISIBILITY - pointer operator->() const {return &__node_->__value_;} + pointer operator->() const {return pointer_traits::pointer_to(__node_->__value_);} _LIBCPP_INLINE_VISIBILITY __hash_local_iterator& operator++() @@ -345,7 +344,7 @@ public: _LIBCPP_INLINE_VISIBILITY reference operator*() const {return __node_->__value_;} _LIBCPP_INLINE_VISIBILITY - pointer operator->() const {return &__node_->__value_;} + pointer operator->() const {return pointer_traits::pointer_to(__node_->__value_);} _LIBCPP_INLINE_VISIBILITY __hash_const_local_iterator& operator++() @@ -505,8 +504,15 @@ public: __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; + typedef typename __node_traits::pointer __node_const_pointer; typedef __hash_node_base<__node_pointer> __first_node; + typedef typename pointer_traits<__node_pointer>::template +#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES + rebind<__first_node> +#else + rebind<__first_node>::other +#endif + __node_base_pointer; private: @@ -558,9 +564,9 @@ public: public: typedef __hash_iterator<__node_pointer> iterator; - typedef __hash_const_iterator<__node_const_pointer> const_iterator; + typedef __hash_const_iterator<__node_pointer> const_iterator; typedef __hash_local_iterator<__node_pointer> local_iterator; - typedef __hash_const_local_iterator<__node_const_pointer> const_local_iterator; + typedef __hash_const_local_iterator<__node_pointer> const_local_iterator; __hash_table() _NOEXCEPT_( @@ -706,7 +712,7 @@ public: _LIBCPP_INLINE_VISIBILITY size_type max_bucket_count() const _NOEXCEPT - {return __bucket_list_.get_deleter().__alloc().max_size();} + {return __pointer_alloc_traits::max_size(__bucket_list_.get_deleter().__alloc());} size_type bucket_size(size_type __n) const; _LIBCPP_INLINE_VISIBILITY float load_factor() const _NOEXCEPT { @@ -807,6 +813,9 @@ private: void __deallocate(__node_pointer __np) _NOEXCEPT; __node_pointer __detach() _NOEXCEPT; + + template friend class _LIBCPP_TYPE_VIS unordered_map; + template friend class _LIBCPP_TYPE_VIS unordered_multimap; }; template @@ -893,7 +902,7 @@ __hash_table<_Tp, _Hash, _Equal, _Alloc>::__hash_table(__hash_table&& __u) if (size() > 0) { __bucket_list_[__constrain_hash(__p1_.first().__next_->__hash_, bucket_count())] = - static_cast<__node_pointer>(_VSTD::addressof(__p1_.first())); + static_cast<__node_pointer>(pointer_traits<__node_base_pointer>::pointer_to(__p1_.first())); __u.__p1_.first().__next_ = nullptr; __u.size() = 0; } @@ -917,7 +926,7 @@ __hash_table<_Tp, _Hash, _Equal, _Alloc>::__hash_table(__hash_table&& __u, __p1_.first().__next_ = __u.__p1_.first().__next_; __u.__p1_.first().__next_ = nullptr; __bucket_list_[__constrain_hash(__p1_.first().__next_->__hash_, bucket_count())] = - static_cast<__node_pointer>(_VSTD::addressof(__p1_.first())); + static_cast<__node_pointer>(pointer_traits<__node_base_pointer>::pointer_to(__p1_.first())); size() = __u.size(); __u.size() = 0; } @@ -1014,7 +1023,7 @@ __hash_table<_Tp, _Hash, _Equal, _Alloc>::__move_assign( if (size() > 0) { __bucket_list_[__constrain_hash(__p1_.first().__next_->__hash_, bucket_count())] = - static_cast<__node_pointer>(_VSTD::addressof(__p1_.first())); + static_cast<__node_pointer>(pointer_traits<__node_base_pointer>::pointer_to(__p1_.first())); __u.__p1_.first().__next_ = nullptr; __u.size() = 0; } @@ -1236,7 +1245,7 @@ __hash_table<_Tp, _Hash, _Equal, _Alloc>::__node_insert_unique(__node_pointer __ __node_pointer __pn = __bucket_list_[__chash]; if (__pn == nullptr) { - __pn = static_cast<__node_pointer>(_VSTD::addressof(__p1_.first())); + __pn = static_cast<__node_pointer>(pointer_traits<__node_base_pointer>::pointer_to(__p1_.first())); __nd->__next_ = __pn->__next_; __pn->__next_ = __nd; // fix up __bucket_list_ @@ -1274,7 +1283,7 @@ __hash_table<_Tp, _Hash, _Equal, _Alloc>::__node_insert_multi(__node_pointer __c __node_pointer __pn = __bucket_list_[__chash]; if (__pn == nullptr) { - __pn = static_cast<__node_pointer>(_VSTD::addressof(__p1_.first())); + __pn = static_cast<__node_pointer>(pointer_traits<__node_base_pointer>::pointer_to(__p1_.first())); __cp->__next_ = __pn->__next_; __pn->__next_ = __cp; // fix up __bucket_list_ @@ -1322,7 +1331,7 @@ __hash_table<_Tp, _Hash, _Equal, _Alloc>::__node_insert_multi( { if (__p != end() && key_eq()(*__p, __cp->__value_)) { - __node_pointer __np = const_cast<__node_pointer>(__p.__node_); + __node_pointer __np = __p.__node_; __cp->__hash_ = __np->__hash_; size_type __bc = bucket_count(); if (size()+1 > __bc * max_load_factor() || __bc == 0) @@ -1380,7 +1389,7 @@ __hash_table<_Tp, _Hash, _Equal, _Alloc>::__insert_unique(const value_type& __x) __node_pointer __pn = __bucket_list_[__chash]; if (__pn == nullptr) { - __pn = static_cast<__node_pointer>(_VSTD::addressof(__p1_.first())); + __pn = static_cast<__node_pointer>(pointer_traits<__node_base_pointer>::pointer_to(__p1_.first())); __h->__next_ = __pn->__next_; __pn->__next_ = __h.get(); // fix up __bucket_list_ @@ -1542,7 +1551,7 @@ __hash_table<_Tp, _Hash, _Equal, _Alloc>::__rehash(size_type __nbc) { for (size_type __i = 0; __i < __nbc; ++__i) __bucket_list_[__i] = nullptr; - __node_pointer __pp(static_cast<__node_pointer>(_VSTD::addressof(__p1_.first()))); + __node_pointer __pp(static_cast<__node_pointer>(pointer_traits<__node_base_pointer>::pointer_to(__p1_.first()))); __node_pointer __cp = __pp->__next_; if (__cp != nullptr) { @@ -1700,7 +1709,7 @@ template typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator __hash_table<_Tp, _Hash, _Equal, _Alloc>::erase(const_iterator __p) { - __node_pointer __np = const_cast<__node_pointer>(__p.__node_); + __node_pointer __np = __p.__node_; iterator __r(__np); ++__r; remove(__p); @@ -1717,7 +1726,7 @@ __hash_table<_Tp, _Hash, _Equal, _Alloc>::erase(const_iterator __first, ++__first; erase(__p); } - __node_pointer __np = const_cast<__node_pointer>(__last.__node_); + __node_pointer __np = __last.__node_; return iterator (__np); } @@ -1757,7 +1766,7 @@ typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::__node_holder __hash_table<_Tp, _Hash, _Equal, _Alloc>::remove(const_iterator __p) _NOEXCEPT { // current node - __node_pointer __cn = const_cast<__node_pointer>(__p.__node_); + __node_pointer __cn = __p.__node_; size_type __bc = bucket_count(); size_t __chash = __constrain_hash(__cn->__hash_, __bc); // find previous node @@ -1767,7 +1776,8 @@ __hash_table<_Tp, _Hash, _Equal, _Alloc>::remove(const_iterator __p) _NOEXCEPT // Fix up __bucket_list_ // if __pn is not in same bucket (before begin is not in same bucket) && // if __cn->__next_ is not in same bucket (nullptr is not in same bucket) - if (__pn == _VSTD::addressof(__p1_.first()) || __constrain_hash(__pn->__hash_, __bc) != __chash) + if (__pn == static_cast<__node_pointer>(pointer_traits<__node_base_pointer>::pointer_to(__p1_.first())) + || __constrain_hash(__pn->__hash_, __bc) != __chash) { if (__cn->__next_ == nullptr || __constrain_hash(__cn->__next_->__hash_, __bc) != __chash) __bucket_list_[__chash] = nullptr; @@ -1907,10 +1917,10 @@ __hash_table<_Tp, _Hash, _Equal, _Alloc>::swap(__hash_table& __u) __p3_.swap(__u.__p3_); if (size() > 0) __bucket_list_[__constrain_hash(__p1_.first().__next_->__hash_, bucket_count())] = - static_cast<__node_pointer>(_VSTD::addressof(__p1_.first())); + static_cast<__node_pointer>(pointer_traits<__node_base_pointer>::pointer_to(__p1_.first())); if (__u.size() > 0) __u.__bucket_list_[__constrain_hash(__u.__p1_.first().__next_->__hash_, __u.bucket_count())] = - static_cast<__node_pointer>(_VSTD::addressof(__u.__p1_.first())); + static_cast<__node_pointer>(pointer_traits<__node_base_pointer>::pointer_to(__u.__p1_.first())); } template diff --git a/libcxx/include/unordered_map b/libcxx/include/unordered_map index 235b2eabb603..772c44b6f4b7 100644 --- a/libcxx/include/unordered_map +++ b/libcxx/include/unordered_map @@ -492,8 +492,8 @@ class __hash_map_node_destructor public: typedef typename __alloc_traits::pointer pointer; private: - typedef typename value_type::first_type first_type; - typedef typename value_type::second_type second_type; + typedef typename value_type::value_type::first_type first_type; + typedef typename value_type::value_type::second_type second_type; allocator_type& __na_; @@ -535,9 +535,9 @@ public: void operator()(pointer __p) _NOEXCEPT { if (__second_constructed) - __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.second)); + __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.__cc.second)); if (__first_constructed) - __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.first)); + __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.__cc.first)); if (__p) __alloc_traits::deallocate(__na_, __p, 1); } @@ -549,8 +549,8 @@ class _LIBCPP_TYPE_VIS __hash_map_iterator _HashIterator __i_; typedef pointer_traits __pointer_traits; - typedef const typename _HashIterator::value_type::first_type key_type; - typedef typename _HashIterator::value_type::second_type mapped_type; + typedef const typename _HashIterator::value_type::value_type::first_type key_type; + typedef typename _HashIterator::value_type::value_type::second_type mapped_type; public: typedef forward_iterator_tag iterator_category; typedef pair value_type; @@ -571,9 +571,9 @@ public: __hash_map_iterator(_HashIterator __i) _NOEXCEPT : __i_(__i) {} _LIBCPP_INLINE_VISIBILITY - reference operator*() const {return *operator->();} + reference operator*() const {return __i_->__cc;} _LIBCPP_INLINE_VISIBILITY - pointer operator->() const {return (pointer)__i_.operator->();} + pointer operator->() const {return pointer_traits::pointer_to(__i_->__cc);} _LIBCPP_INLINE_VISIBILITY __hash_map_iterator& operator++() {++__i_; return *this;} @@ -605,8 +605,8 @@ class _LIBCPP_TYPE_VIS __hash_map_const_iterator _HashIterator __i_; typedef pointer_traits __pointer_traits; - typedef const typename _HashIterator::value_type::first_type key_type; - typedef typename _HashIterator::value_type::second_type mapped_type; + typedef const typename _HashIterator::value_type::value_type::first_type key_type; + typedef typename _HashIterator::value_type::value_type::second_type mapped_type; public: typedef forward_iterator_tag iterator_category; typedef pair value_type; @@ -632,9 +632,9 @@ public: : __i_(__i.__i_) {} _LIBCPP_INLINE_VISIBILITY - reference operator*() const {return *operator->();} + reference operator*() const {return __i_->__cc;} _LIBCPP_INLINE_VISIBILITY - pointer operator->() const {return (pointer)__i_.operator->();} + pointer operator->() const {return pointer_traits::pointer_to(__i_->__cc);} _LIBCPP_INLINE_VISIBILITY __hash_map_const_iterator& operator++() {++__i_; return *this;} @@ -671,11 +671,58 @@ public: typedef _Pred key_equal; typedef _Alloc allocator_type; typedef pair value_type; + typedef pair __nc_value_type; typedef value_type& reference; typedef const value_type& const_reference; private: - typedef pair __value_type; +#if __cplusplus >= 201103L + union __value_type + { + typedef typename unordered_map::value_type value_type; + typedef typename unordered_map::__nc_value_type __nc_value_type; + value_type __cc; + __nc_value_type __nc; + + template + __value_type(_Args&& ...__args) + : __cc(std::forward<_Args>(__args)...) {} + + __value_type(const __value_type& __v) + : __cc(std::move(__v.__cc)) {} + + __value_type(__value_type&& __v) + : __nc(std::move(__v.__nc)) {} + + __value_type& operator=(const __value_type& __v) + {__nc = __v.__cc; return *this;} + + __value_type& operator=(__value_type&& __v) + {__nc = std::move(__v.__nc); return *this;} + + ~__value_type() {__cc.~value_type();} + + operator const value_type& () const {return __cc;} + }; +#else + struct __value_type + { + typedef typename unordered_map::value_type value_type; + value_type __cc; + + __value_type() {} + + template + __value_type(const _A0& __a0) + : __cc(__a0) {} + + template + __value_type(const _A0& __a0, const _A1& __a1) + : __cc(__a0, __a1) {} + + operator const value_type& () const {return __cc;} + }; +#endif typedef __unordered_map_hasher __hasher; typedef __unordered_map_equal __key_equal; typedef typename allocator_traits::template @@ -750,7 +797,16 @@ public: _LIBCPP_INLINE_VISIBILITY unordered_map& operator=(const unordered_map& __u) { +#if __cplusplus >= 201103L __table_ = __u.__table_; +#else + __table_.clear(); + __table_.hash_function() = __u.__table_.hash_function(); + __table_.key_eq() = __u.__table_.key_eq(); + __table_.max_load_factor() = __u.__table_.max_load_factor(); + __table_.__copy_assign_alloc(__u.__table_); + insert(__u.begin(), __u.end()); +#endif return *this; } #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES @@ -1132,10 +1188,10 @@ unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__construct_node(_A0&& __a0) { __node_allocator& __na = __table_.__node_alloc(); __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na)); - __node_traits::construct(__na, _VSTD::addressof(__h->__value_.first), + __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__cc.first), _VSTD::forward<_A0>(__a0)); __h.get_deleter().__first_constructed = true; - __node_traits::construct(__na, _VSTD::addressof(__h->__value_.second)); + __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__cc.second)); __h.get_deleter().__second_constructed = true; return __h; } @@ -1180,9 +1236,9 @@ unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__construct_node(const key_type& { __node_allocator& __na = __table_.__node_alloc(); __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na)); - __node_traits::construct(__na, _VSTD::addressof(__h->__value_.first), __k); + __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__cc.first), __k); __h.get_deleter().__first_constructed = true; - __node_traits::construct(__na, _VSTD::addressof(__h->__value_.second)); + __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__cc.second)); __h.get_deleter().__second_constructed = true; return _VSTD::move(__h); } @@ -1304,11 +1360,58 @@ public: typedef _Pred key_equal; typedef _Alloc allocator_type; typedef pair value_type; + typedef pair __nc_value_type; typedef value_type& reference; typedef const value_type& const_reference; private: - typedef pair __value_type; +#if __cplusplus >= 201103L + union __value_type + { + typedef typename unordered_multimap::value_type value_type; + typedef typename unordered_multimap::__nc_value_type __nc_value_type; + value_type __cc; + __nc_value_type __nc; + + template + __value_type(_Args&& ...__args) + : __cc(std::forward<_Args>(__args)...) {} + + __value_type(const __value_type& __v) + : __cc(std::move(__v.__cc)) {} + + __value_type(__value_type&& __v) + : __nc(std::move(__v.__nc)) {} + + __value_type& operator=(const __value_type& __v) + {__nc = __v.__cc; return *this;} + + __value_type& operator=(__value_type&& __v) + {__nc = std::move(__v.__nc); return *this;} + + ~__value_type() {__cc.~value_type();} + + operator const value_type& () const {return __cc;} + }; +#else + struct __value_type + { + typedef typename unordered_multimap::value_type value_type; + value_type __cc; + + __value_type() {} + + template + __value_type(const _A0& __a0) + : __cc(__a0) {} + + template + __value_type(const _A0& __a0, const _A1& __a1) + : __cc(__a0, __a1) {} + + operator const value_type& () const {return __cc;} + }; +#endif typedef __unordered_map_hasher __hasher; typedef __unordered_map_equal __key_equal; typedef typename allocator_traits::template @@ -1382,7 +1485,16 @@ public: _LIBCPP_INLINE_VISIBILITY unordered_multimap& operator=(const unordered_multimap& __u) { +#if __cplusplus >= 201103L __table_ = __u.__table_; +#else + __table_.clear(); + __table_.hash_function() = __u.__table_.hash_function(); + __table_.key_eq() = __u.__table_.key_eq(); + __table_.max_load_factor() = __u.__table_.max_load_factor(); + __table_.__copy_assign_alloc(__u.__table_); + insert(__u.begin(), __u.end()); +#endif return *this; } #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES @@ -1754,10 +1866,10 @@ unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::__construct_node(_A0&& __a0 { __node_allocator& __na = __table_.__node_alloc(); __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na)); - __node_traits::construct(__na, _VSTD::addressof(__h->__value_.first), + __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__cc.first), _VSTD::forward<_A0>(__a0)); __h.get_deleter().__first_constructed = true; - __node_traits::construct(__na, _VSTD::addressof(__h->__value_.second)); + __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__cc.second)); __h.get_deleter().__second_constructed = true; return __h; } diff --git a/libcxx/lib/buildit b/libcxx/lib/buildit index 1f77dbb6c12f..e84618d40968 100755 --- a/libcxx/lib/buildit +++ b/libcxx/lib/buildit @@ -35,7 +35,7 @@ then RC_ProjectSourceVersion=1 fi -EXTRA_FLAGS="-std=c++0x -fstrict-aliasing -Wall -Wextra -Wshadow -Wconversion \ +EXTRA_FLAGS="-std=c++11 -fstrict-aliasing -Wall -Wextra -Wshadow -Wconversion \ -Wnewline-eof -Wpadded -Wmissing-prototypes -Wstrict-aliasing=2 \ -Wstrict-overflow=4 " @@ -48,7 +48,7 @@ case $TRIPLE in SOEXT=dylib if [ "$MACOSX_DEPLOYMENT_TARGET" == "10.6" ] then - EXTRA_FLAGS="-std=c++0x -U__STRICT_ANSI__" + EXTRA_FLAGS="-std=c++11 -U__STRICT_ANSI__" LDSHARED_FLAGS="-o libc++.1.dylib \ -dynamiclib -nodefaultlibs -current_version 1 \ -compatibility_version 1 \ diff --git a/libcxx/test/containers/unord/unord.map/bucket.pass.cpp b/libcxx/test/containers/unord/unord.map/bucket.pass.cpp index 6cb6fbb08913..f7ff18eca785 100644 --- a/libcxx/test/containers/unord/unord.map/bucket.pass.cpp +++ b/libcxx/test/containers/unord/unord.map/bucket.pass.cpp @@ -19,6 +19,8 @@ #include #include +#include "../../min_allocator.h" + int main() { { @@ -39,4 +41,25 @@ int main() for (size_t i = 0; i < 13; ++i) assert(c.bucket(i) == i % bc); } +#if __cplusplus >= 201103L + { + typedef std::unordered_map, std::equal_to, + min_allocator>> C; + typedef std::pair P; + P a[] = + { + P(1, "one"), + P(2, "two"), + P(3, "three"), + P(4, "four"), + P(1, "four"), + P(2, "four"), + }; + const C c(std::begin(a), std::end(a)); + size_t bc = c.bucket_count(); + assert(bc >= 5); + for (size_t i = 0; i < 13; ++i) + assert(c.bucket(i) == i % bc); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.map/bucket_count.pass.cpp b/libcxx/test/containers/unord/unord.map/bucket_count.pass.cpp index 478f9ade386a..dbc24eed7377 100644 --- a/libcxx/test/containers/unord/unord.map/bucket_count.pass.cpp +++ b/libcxx/test/containers/unord/unord.map/bucket_count.pass.cpp @@ -19,6 +19,8 @@ #include #include +#include "../../min_allocator.h" + int main() { { @@ -46,4 +48,33 @@ int main() const C c(std::begin(a), std::end(a)); assert(c.bucket_count() >= 11); } +#if __cplusplus >= 201103L + { + typedef std::unordered_map, std::equal_to, + min_allocator>> C; + typedef C::const_iterator I; + typedef std::pair P; + const C c; + assert(c.bucket_count() == 0); + } + { + typedef std::unordered_map, std::equal_to, + min_allocator>> C; + typedef C::const_iterator I; + typedef std::pair P; + P a[] = + { + P(10, "ten"), + P(20, "twenty"), + P(30, "thirty"), + P(40, "fourty"), + P(50, "fifty"), + P(60, "sixty"), + P(70, "seventy"), + P(80, "eighty"), + }; + const C c(std::begin(a), std::end(a)); + assert(c.bucket_count() >= 11); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.map/bucket_size.pass.cpp b/libcxx/test/containers/unord/unord.map/bucket_size.pass.cpp index ab1f68493e9f..967bb8d9f95e 100644 --- a/libcxx/test/containers/unord/unord.map/bucket_size.pass.cpp +++ b/libcxx/test/containers/unord/unord.map/bucket_size.pass.cpp @@ -19,6 +19,8 @@ #include #include +#include "../../min_allocator.h" + int main() { { @@ -41,4 +43,27 @@ int main() assert(c.bucket_size(3) == 1); assert(c.bucket_size(4) == 1); } +#if __cplusplus >= 201103L + { + typedef std::unordered_map, std::equal_to, + min_allocator>> C; + typedef std::pair P; + P a[] = + { + P(1, "one"), + P(2, "two"), + P(3, "three"), + P(4, "four"), + P(1, "four"), + P(2, "four"), + }; + const C c(std::begin(a), std::end(a)); + assert(c.bucket_count() >= 5); + assert(c.bucket_size(0) == 0); + assert(c.bucket_size(1) == 1); + assert(c.bucket_size(2) == 1); + assert(c.bucket_size(3) == 1); + assert(c.bucket_size(4) == 1); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.map/count.pass.cpp b/libcxx/test/containers/unord/unord.map/count.pass.cpp index fa40d0a1e6ca..04d169912607 100644 --- a/libcxx/test/containers/unord/unord.map/count.pass.cpp +++ b/libcxx/test/containers/unord/unord.map/count.pass.cpp @@ -19,6 +19,8 @@ #include #include +#include "../../min_allocator.h" + int main() { { @@ -39,4 +41,25 @@ int main() assert(c.count(30) == 1); assert(c.count(5) == 0); } +#if __cplusplus >= 201103L + { + typedef std::unordered_map, std::equal_to, + min_allocator>> C; + typedef std::pair P; + P a[] = + { + P(10, "ten"), + P(20, "twenty"), + P(30, "thirty"), + P(40, "fourty"), + P(50, "fifty"), + P(60, "sixty"), + P(70, "seventy"), + P(80, "eighty"), + }; + const C c(std::begin(a), std::end(a)); + assert(c.count(30) == 1); + assert(c.count(5) == 0); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.map/eq.pass.cpp b/libcxx/test/containers/unord/unord.map/eq.pass.cpp index 8e7ed99ba7e7..ec1378577a08 100644 --- a/libcxx/test/containers/unord/unord.map/eq.pass.cpp +++ b/libcxx/test/containers/unord/unord.map/eq.pass.cpp @@ -23,6 +23,8 @@ #include #include +#include "../../min_allocator.h" + int main() { { @@ -89,4 +91,73 @@ int main() assert( (c1 == c2)); assert(!(c1 != c2)); } +#if __cplusplus >= 201103L + { + typedef std::unordered_map, std::equal_to, + min_allocator>> C; + typedef std::pair P; + P a[] = + { + P(10, "ten"), + P(20, "twenty"), + P(30, "thirty"), + P(40, "fourty"), + P(50, "fifty"), + P(60, "sixty"), + P(70, "seventy"), + P(80, "eighty"), + }; + const C c1(std::begin(a), std::end(a)); + const C c2; + assert(!(c1 == c2)); + assert( (c1 != c2)); + } + { + typedef std::unordered_map, std::equal_to, + min_allocator>> C; + typedef std::pair P; + P a[] = + { + P(10, "ten"), + P(20, "twenty"), + P(30, "thirty"), + P(40, "fourty"), + P(50, "fifty"), + P(60, "sixty"), + P(70, "seventy"), + P(80, "eighty"), + }; + const C c1(std::begin(a), std::end(a)); + const C c2 = c1; + assert( (c1 == c2)); + assert(!(c1 != c2)); + } + { + typedef std::unordered_map, std::equal_to, + min_allocator>> C; + typedef std::pair P; + P a[] = + { + P(10, "ten"), + P(20, "twenty"), + P(30, "thirty"), + P(40, "fourty"), + P(50, "fifty"), + P(60, "sixty"), + P(70, "seventy"), + P(80, "eighty"), + }; + C c1(std::begin(a), std::end(a)); + C c2 = c1; + c2.rehash(30); + assert( (c1 == c2)); + assert(!(c1 != c2)); + c2.insert(P(90, "ninety")); + assert(!(c1 == c2)); + assert( (c1 != c2)); + c1.insert(P(90, "ninety")); + assert( (c1 == c2)); + assert(!(c1 != c2)); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.map/equal_range_const.pass.cpp b/libcxx/test/containers/unord/unord.map/equal_range_const.pass.cpp index 766d740a43a7..8f9c58e44f2f 100644 --- a/libcxx/test/containers/unord/unord.map/equal_range_const.pass.cpp +++ b/libcxx/test/containers/unord/unord.map/equal_range_const.pass.cpp @@ -19,6 +19,8 @@ #include #include +#include "../../min_allocator.h" + int main() { { @@ -44,4 +46,30 @@ int main() r = c.equal_range(5); assert(std::distance(r.first, r.second) == 0); } +#if __cplusplus >= 201103L + { + typedef std::unordered_map, std::equal_to, + min_allocator>> C; + typedef C::const_iterator I; + typedef std::pair P; + P a[] = + { + P(10, "ten"), + P(20, "twenty"), + P(30, "thirty"), + P(40, "fourty"), + P(50, "fifty"), + P(60, "sixty"), + P(70, "seventy"), + P(80, "eighty"), + }; + const C c(std::begin(a), std::end(a)); + std::pair r = c.equal_range(30); + assert(std::distance(r.first, r.second) == 1); + assert(r.first->first == 30); + assert(r.first->second == "thirty"); + r = c.equal_range(5); + assert(std::distance(r.first, r.second) == 0); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.map/equal_range_non_const.pass.cpp b/libcxx/test/containers/unord/unord.map/equal_range_non_const.pass.cpp index ddc930fbb2a5..9291eb4fda7a 100644 --- a/libcxx/test/containers/unord/unord.map/equal_range_non_const.pass.cpp +++ b/libcxx/test/containers/unord/unord.map/equal_range_non_const.pass.cpp @@ -19,6 +19,8 @@ #include #include +#include "../../min_allocator.h" + int main() { { @@ -44,4 +46,30 @@ int main() r = c.equal_range(5); assert(std::distance(r.first, r.second) == 0); } +#if __cplusplus >= 201103L + { + typedef std::unordered_map, std::equal_to, + min_allocator>> C; + typedef C::iterator I; + typedef std::pair P; + P a[] = + { + P(10, "ten"), + P(20, "twenty"), + P(30, "thirty"), + P(40, "fourty"), + P(50, "fifty"), + P(60, "sixty"), + P(70, "seventy"), + P(80, "eighty"), + }; + C c(std::begin(a), std::end(a)); + std::pair r = c.equal_range(30); + assert(std::distance(r.first, r.second) == 1); + assert(r.first->first == 30); + assert(r.first->second == "thirty"); + r = c.equal_range(5); + assert(std::distance(r.first, r.second) == 0); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.map/find_const.pass.cpp b/libcxx/test/containers/unord/unord.map/find_const.pass.cpp index 5d4eefb89fba..c049d2392c89 100644 --- a/libcxx/test/containers/unord/unord.map/find_const.pass.cpp +++ b/libcxx/test/containers/unord/unord.map/find_const.pass.cpp @@ -19,6 +19,8 @@ #include #include +#include "../../min_allocator.h" + int main() { { @@ -42,4 +44,28 @@ int main() i = c.find(5); assert(i == c.cend()); } +#if __cplusplus >= 201103L + { + typedef std::unordered_map, std::equal_to, + min_allocator>> C; + typedef std::pair P; + P a[] = + { + P(10, "ten"), + P(20, "twenty"), + P(30, "thirty"), + P(40, "fourty"), + P(50, "fifty"), + P(60, "sixty"), + P(70, "seventy"), + P(80, "eighty"), + }; + const C c(std::begin(a), std::end(a)); + C::const_iterator i = c.find(30); + assert(i->first == 30); + assert(i->second == "thirty"); + i = c.find(5); + assert(i == c.cend()); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.map/find_non_const.pass.cpp b/libcxx/test/containers/unord/unord.map/find_non_const.pass.cpp index c6ebe63b29a7..04126938815a 100644 --- a/libcxx/test/containers/unord/unord.map/find_non_const.pass.cpp +++ b/libcxx/test/containers/unord/unord.map/find_non_const.pass.cpp @@ -19,6 +19,8 @@ #include #include +#include "../../min_allocator.h" + int main() { { @@ -42,4 +44,28 @@ int main() i = c.find(5); assert(i == c.end()); } +#if __cplusplus >= 201103L + { + typedef std::unordered_map, std::equal_to, + min_allocator>> C; + typedef std::pair P; + P a[] = + { + P(10, "ten"), + P(20, "twenty"), + P(30, "thirty"), + P(40, "fourty"), + P(50, "fifty"), + P(60, "sixty"), + P(70, "seventy"), + P(80, "eighty"), + }; + C c(std::begin(a), std::end(a)); + C::iterator i = c.find(30); + assert(i->first == 30); + assert(i->second == "thirty"); + i = c.find(5); + assert(i == c.end()); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.map/iterators.pass.cpp b/libcxx/test/containers/unord/unord.map/iterators.pass.cpp index c8a52660539d..7d99fdf9d295 100644 --- a/libcxx/test/containers/unord/unord.map/iterators.pass.cpp +++ b/libcxx/test/containers/unord/unord.map/iterators.pass.cpp @@ -24,6 +24,8 @@ #include #include +#include "../../min_allocator.h" + int main() { { @@ -64,4 +66,46 @@ int main() assert(std::distance(c.cbegin(), c.cend()) == c.size()); C::const_iterator i; } +#if __cplusplus >= 201103L + { + typedef std::unordered_map, std::equal_to, + min_allocator>> C; + typedef std::pair P; + P a[] = + { + P(1, "one"), + P(2, "two"), + P(3, "three"), + P(4, "four"), + P(1, "four"), + P(2, "four"), + }; + C c(a, a + sizeof(a)/sizeof(a[0])); + assert(c.bucket_count() >= 5); + assert(c.size() == 4); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + C::iterator i; + } + { + typedef std::unordered_map, std::equal_to, + min_allocator>> C; + typedef std::pair P; + P a[] = + { + P(1, "one"), + P(2, "two"), + P(3, "three"), + P(4, "four"), + P(1, "four"), + P(2, "four"), + }; + const C c(a, a + sizeof(a)/sizeof(a[0])); + assert(c.bucket_count() >= 5); + assert(c.size() == 4); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + C::const_iterator i; + } +#endif } diff --git a/libcxx/test/containers/unord/unord.map/load_factor.pass.cpp b/libcxx/test/containers/unord/unord.map/load_factor.pass.cpp index fcb2b9b32eec..70e6048c59a7 100644 --- a/libcxx/test/containers/unord/unord.map/load_factor.pass.cpp +++ b/libcxx/test/containers/unord/unord.map/load_factor.pass.cpp @@ -20,6 +20,8 @@ #include #include +#include "../../min_allocator.h" + int main() { { @@ -45,4 +47,31 @@ int main() const C c; assert(c.load_factor() == 0); } +#if __cplusplus >= 201103L + { + typedef std::unordered_map, std::equal_to, + min_allocator>> C; + typedef std::pair P; + P a[] = + { + P(10, "ten"), + P(20, "twenty"), + P(30, "thirty"), + P(40, "fourty"), + P(50, "fifty"), + P(60, "sixty"), + P(70, "seventy"), + P(80, "eighty"), + }; + const C c(std::begin(a), std::end(a)); + assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); + } + { + typedef std::unordered_map, std::equal_to, + min_allocator>> C; + typedef std::pair P; + const C c; + assert(c.load_factor() == 0); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.map/local_iterators.pass.cpp b/libcxx/test/containers/unord/unord.map/local_iterators.pass.cpp index c9812d042e1c..ec10f50b8b1f 100644 --- a/libcxx/test/containers/unord/unord.map/local_iterators.pass.cpp +++ b/libcxx/test/containers/unord/unord.map/local_iterators.pass.cpp @@ -24,6 +24,8 @@ #include #include +#include "../../min_allocator.h" + int main() { { @@ -218,4 +220,202 @@ int main() assert(i->first == 4); assert(i->second == "four"); } +#if __cplusplus >= 201103L + { + typedef std::unordered_map, std::equal_to, + min_allocator>> C; + typedef std::pair P; + typedef C::local_iterator I; + P a[] = + { + P(1, "one"), + P(2, "two"), + P(3, "three"), + P(4, "four"), + P(1, "four"), + P(2, "four"), + }; + C c(a, a + sizeof(a)/sizeof(a[0])); + assert(c.bucket_count() >= 5); + C::size_type b = c.bucket(0); + I i = c.begin(b); + I j = c.end(b); + assert(std::distance(i, j) == 0); + + b = c.bucket(1); + i = c.begin(b); + j = c.end(b); + assert(std::distance(i, j) == 1); + assert(i->first == 1); + assert(i->second == "one"); + + b = c.bucket(2); + i = c.begin(b); + j = c.end(b); + assert(std::distance(i, j) == 1); + assert(i->first == 2); + assert(i->second == "two"); + + b = c.bucket(3); + i = c.begin(b); + j = c.end(b); + assert(std::distance(i, j) == 1); + assert(i->first == 3); + assert(i->second == "three"); + + b = c.bucket(4); + i = c.begin(b); + j = c.end(b); + assert(std::distance(i, j) == 1); + assert(i->first == 4); + assert(i->second == "four"); + } + { + typedef std::unordered_map, std::equal_to, + min_allocator>> C; + typedef std::pair P; + typedef C::const_local_iterator I; + P a[] = + { + P(1, "one"), + P(2, "two"), + P(3, "three"), + P(4, "four"), + P(1, "four"), + P(2, "four"), + }; + const C c(a, a + sizeof(a)/sizeof(a[0])); + assert(c.bucket_count() >= 5); + C::size_type b = c.bucket(0); + I i = c.begin(b); + I j = c.end(b); + assert(std::distance(i, j) == 0); + + b = c.bucket(1); + i = c.begin(b); + j = c.end(b); + assert(std::distance(i, j) == 1); + assert(i->first == 1); + assert(i->second == "one"); + + b = c.bucket(2); + i = c.begin(b); + j = c.end(b); + assert(std::distance(i, j) == 1); + assert(i->first == 2); + assert(i->second == "two"); + + b = c.bucket(3); + i = c.begin(b); + j = c.end(b); + assert(std::distance(i, j) == 1); + assert(i->first == 3); + assert(i->second == "three"); + + b = c.bucket(4); + i = c.begin(b); + j = c.end(b); + assert(std::distance(i, j) == 1); + assert(i->first == 4); + assert(i->second == "four"); + } + { + typedef std::unordered_map, std::equal_to, + min_allocator>> C; + typedef std::pair P; + typedef C::const_local_iterator I; + P a[] = + { + P(1, "one"), + P(2, "two"), + P(3, "three"), + P(4, "four"), + P(1, "four"), + P(2, "four"), + }; + C c(a, a + sizeof(a)/sizeof(a[0])); + assert(c.bucket_count() >= 5); + C::size_type b = c.bucket(0); + I i = c.cbegin(b); + I j = c.cend(b); + assert(std::distance(i, j) == 0); + + b = c.bucket(1); + i = c.cbegin(b); + j = c.cend(b); + assert(std::distance(i, j) == 1); + assert(i->first == 1); + assert(i->second == "one"); + + b = c.bucket(2); + i = c.cbegin(b); + j = c.cend(b); + assert(std::distance(i, j) == 1); + assert(i->first == 2); + assert(i->second == "two"); + + b = c.bucket(3); + i = c.cbegin(b); + j = c.cend(b); + assert(std::distance(i, j) == 1); + assert(i->first == 3); + assert(i->second == "three"); + + b = c.bucket(4); + i = c.cbegin(b); + j = c.cend(b); + assert(std::distance(i, j) == 1); + assert(i->first == 4); + assert(i->second == "four"); + } + { + typedef std::unordered_map, std::equal_to, + min_allocator>> C; + typedef std::pair P; + typedef C::const_local_iterator I; + P a[] = + { + P(1, "one"), + P(2, "two"), + P(3, "three"), + P(4, "four"), + P(1, "four"), + P(2, "four"), + }; + const C c(a, a + sizeof(a)/sizeof(a[0])); + assert(c.bucket_count() >= 5); + C::size_type b = c.bucket(0); + I i = c.cbegin(b); + I j = c.cend(b); + assert(std::distance(i, j) == 0); + + b = c.bucket(1); + i = c.cbegin(b); + j = c.cend(b); + assert(std::distance(i, j) == 1); + assert(i->first == 1); + assert(i->second == "one"); + + b = c.bucket(2); + i = c.cbegin(b); + j = c.cend(b); + assert(std::distance(i, j) == 1); + assert(i->first == 2); + assert(i->second == "two"); + + b = c.bucket(3); + i = c.cbegin(b); + j = c.cend(b); + assert(std::distance(i, j) == 1); + assert(i->first == 3); + assert(i->second == "three"); + + b = c.bucket(4); + i = c.cbegin(b); + j = c.cend(b); + assert(std::distance(i, j) == 1); + assert(i->first == 4); + assert(i->second == "four"); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.map/max_bucket_count.pass.cpp b/libcxx/test/containers/unord/unord.map/max_bucket_count.pass.cpp index 2a89f5c0eeda..a1f1c3c3faa7 100644 --- a/libcxx/test/containers/unord/unord.map/max_bucket_count.pass.cpp +++ b/libcxx/test/containers/unord/unord.map/max_bucket_count.pass.cpp @@ -19,6 +19,8 @@ #include #include +#include "../../min_allocator.h" + int main() { { @@ -28,4 +30,14 @@ int main() const C c; assert(c.max_bucket_count() > 0); } +#if __cplusplus >= 201103L + { + typedef std::unordered_map, std::equal_to, + min_allocator>> C; + typedef C::const_iterator I; + typedef std::pair P; + const C c; + assert(c.max_bucket_count() > 0); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.map/max_load_factor.pass.cpp b/libcxx/test/containers/unord/unord.map/max_load_factor.pass.cpp index 57b64b29fafb..a644e7bf4736 100644 --- a/libcxx/test/containers/unord/unord.map/max_load_factor.pass.cpp +++ b/libcxx/test/containers/unord/unord.map/max_load_factor.pass.cpp @@ -20,6 +20,8 @@ #include #include +#include "../../min_allocator.h" + int main() { { @@ -36,4 +38,22 @@ int main() c.max_load_factor(2.5); assert(c.max_load_factor() == 2.5); } +#if __cplusplus >= 201103L + { + typedef std::unordered_map, std::equal_to, + min_allocator>> C; + typedef std::pair P; + const C c; + assert(c.max_load_factor() == 1); + } + { + typedef std::unordered_map, std::equal_to, + min_allocator>> C; + typedef std::pair P; + C c; + assert(c.max_load_factor() == 1); + c.max_load_factor(2.5); + assert(c.max_load_factor() == 2.5); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.map/max_size.pass.cpp b/libcxx/test/containers/unord/unord.map/max_size.pass.cpp index bde1e2da37e7..1993741d0dc2 100644 --- a/libcxx/test/containers/unord/unord.map/max_size.pass.cpp +++ b/libcxx/test/containers/unord/unord.map/max_size.pass.cpp @@ -18,10 +18,19 @@ #include #include +#include "../../min_allocator.h" + int main() { { std::unordered_map u; assert(u.max_size() > 0); } +#if __cplusplus >= 201103L + { + std::unordered_map, std::equal_to, + min_allocator>> u; + assert(u.max_size() > 0); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.map/rehash.pass.cpp b/libcxx/test/containers/unord/unord.map/rehash.pass.cpp index 61cd4f57d252..c516872c6179 100644 --- a/libcxx/test/containers/unord/unord.map/rehash.pass.cpp +++ b/libcxx/test/containers/unord/unord.map/rehash.pass.cpp @@ -19,7 +19,10 @@ #include #include -void test(const std::unordered_map& c) +#include "../../min_allocator.h" + +template +void test(const C& c) { assert(c.size() == 4); assert(c.at(1) == "one"); @@ -56,4 +59,33 @@ int main() assert(c.bucket_count() == 31); test(c); } +#if __cplusplus >= 201103L + { + typedef std::unordered_map, std::equal_to, + min_allocator>> C; + typedef std::pair P; + P a[] = + { + P(1, "one"), + P(2, "two"), + P(3, "three"), + P(4, "four"), + P(1, "four"), + P(2, "four"), + }; + C c(a, a + sizeof(a)/sizeof(a[0])); + test(c); + assert(c.bucket_count() >= 5); + c.rehash(3); + assert(c.bucket_count() == 5); + test(c); + c.max_load_factor(2); + c.rehash(3); + assert(c.bucket_count() == 3); + test(c); + c.rehash(31); + assert(c.bucket_count() == 31); + test(c); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.map/reserve.pass.cpp b/libcxx/test/containers/unord/unord.map/reserve.pass.cpp index 9a8eb8bcc0a6..753316f7f0c9 100644 --- a/libcxx/test/containers/unord/unord.map/reserve.pass.cpp +++ b/libcxx/test/containers/unord/unord.map/reserve.pass.cpp @@ -19,7 +19,10 @@ #include #include -void test(const std::unordered_map& c) +#include "../../min_allocator.h" + +template +void test(const C& c) { assert(c.size() == 4); assert(c.at(1) == "one"); @@ -56,4 +59,33 @@ int main() assert(c.bucket_count() >= 16); test(c); } +#if __cplusplus >= 201103L + { + typedef std::unordered_map, std::equal_to, + min_allocator>> C; + typedef std::pair P; + P a[] = + { + P(1, "one"), + P(2, "two"), + P(3, "three"), + P(4, "four"), + P(1, "four"), + P(2, "four"), + }; + C c(a, a + sizeof(a)/sizeof(a[0])); + test(c); + assert(c.bucket_count() >= 5); + c.reserve(3); + assert(c.bucket_count() == 5); + test(c); + c.max_load_factor(2); + c.reserve(3); + assert(c.bucket_count() >= 2); + test(c); + c.reserve(31); + assert(c.bucket_count() >= 16); + test(c); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.map/swap_member.pass.cpp b/libcxx/test/containers/unord/unord.map/swap_member.pass.cpp index 871815b273fa..311a9a541e41 100644 --- a/libcxx/test/containers/unord/unord.map/swap_member.pass.cpp +++ b/libcxx/test/containers/unord/unord.map/swap_member.pass.cpp @@ -22,6 +22,7 @@ #include "../../test_compare.h" #include "../../test_hash.h" #include "../../test_allocator.h" +#include "../../min_allocator.h" int main() { @@ -386,4 +387,186 @@ int main() assert(std::distance(c2.cbegin(), c2.cend()) == c2.size()); assert(c2.max_load_factor() == 1); } +#if __cplusplus >= 201103L + { + typedef test_hash > Hash; + typedef test_compare > Compare; + typedef min_allocator > Alloc; + typedef std::unordered_map C; + typedef std::pair P; + C c1(0, Hash(1), Compare(1), Alloc()); + C c2(0, Hash(2), Compare(2), Alloc()); + c2.max_load_factor(2); + c1.swap(c2); + + assert(c1.bucket_count() == 0); + assert(c1.size() == 0); + assert(c1.hash_function() == Hash(2)); + assert(c1.key_eq() == Compare(2)); + assert(c1.get_allocator() == Alloc()); + assert(std::distance(c1.begin(), c1.end()) == c1.size()); + assert(std::distance(c1.cbegin(), c1.cend()) == c1.size()); + assert(c1.max_load_factor() == 2); + + assert(c2.bucket_count() == 0); + assert(c2.size() == 0); + assert(c2.hash_function() == Hash(1)); + assert(c2.key_eq() == Compare(1)); + assert(c2.get_allocator() == Alloc()); + assert(std::distance(c2.begin(), c2.end()) == c2.size()); + assert(std::distance(c2.cbegin(), c2.cend()) == c2.size()); + assert(c2.max_load_factor() == 1); + } + { + typedef test_hash > Hash; + typedef test_compare > Compare; + typedef min_allocator > Alloc; + typedef std::unordered_map C; + typedef std::pair P; + P a2[] = + { + P(10, "ten"), + P(20, "twenty"), + P(30, "thirty"), + P(40, "fourty"), + P(50, "fifty"), + P(60, "sixty"), + P(70, "seventy"), + P(80, "eighty"), + }; + C c1(0, Hash(1), Compare(1), Alloc()); + C c2(std::begin(a2), std::end(a2), 0, Hash(2), Compare(2), Alloc()); + c2.max_load_factor(2); + c1.swap(c2); + + assert(c1.bucket_count() >= 11); + assert(c1.size() == 8); + assert(c1.at(10) == "ten"); + assert(c1.at(20) == "twenty"); + assert(c1.at(30) == "thirty"); + assert(c1.at(40) == "fourty"); + assert(c1.at(50) == "fifty"); + assert(c1.at(60) == "sixty"); + assert(c1.at(70) == "seventy"); + assert(c1.at(80) == "eighty"); + assert(c1.hash_function() == Hash(2)); + assert(c1.key_eq() == Compare(2)); + assert(c1.get_allocator() == Alloc()); + assert(std::distance(c1.begin(), c1.end()) == c1.size()); + assert(std::distance(c1.cbegin(), c1.cend()) == c1.size()); + assert(c1.max_load_factor() == 2); + + assert(c2.bucket_count() == 0); + assert(c2.size() == 0); + assert(c2.hash_function() == Hash(1)); + assert(c2.key_eq() == Compare(1)); + assert(c2.get_allocator() == Alloc()); + assert(std::distance(c2.begin(), c2.end()) == c2.size()); + assert(std::distance(c2.cbegin(), c2.cend()) == c2.size()); + assert(c2.max_load_factor() == 1); + } + { + typedef test_hash > Hash; + typedef test_compare > Compare; + typedef min_allocator > Alloc; + typedef std::unordered_map C; + typedef std::pair P; + P a1[] = + { + P(1, "one"), + P(2, "two"), + P(3, "three"), + P(4, "four"), + P(1, "four"), + P(2, "four"), + }; + C c1(std::begin(a1), std::end(a1), 0, Hash(1), Compare(1), Alloc()); + C c2(0, Hash(2), Compare(2), Alloc()); + c2.max_load_factor(2); + c1.swap(c2); + + assert(c1.bucket_count() == 0); + assert(c1.size() == 0); + assert(c1.hash_function() == Hash(2)); + assert(c1.key_eq() == Compare(2)); + assert(c1.get_allocator() == Alloc()); + assert(std::distance(c1.begin(), c1.end()) == c1.size()); + assert(std::distance(c1.cbegin(), c1.cend()) == c1.size()); + assert(c1.max_load_factor() == 2); + + assert(c2.bucket_count() >= 5); + assert(c2.size() == 4); + assert(c2.at(1) == "one"); + assert(c2.at(2) == "two"); + assert(c2.at(3) == "three"); + assert(c2.at(4) == "four"); + assert(c2.hash_function() == Hash(1)); + assert(c2.key_eq() == Compare(1)); + assert(c2.get_allocator() == Alloc()); + assert(std::distance(c2.begin(), c2.end()) == c2.size()); + assert(std::distance(c2.cbegin(), c2.cend()) == c2.size()); + assert(c2.max_load_factor() == 1); + } + { + typedef test_hash > Hash; + typedef test_compare > Compare; + typedef min_allocator > Alloc; + typedef std::unordered_map C; + typedef std::pair P; + P a1[] = + { + P(1, "one"), + P(2, "two"), + P(3, "three"), + P(4, "four"), + P(1, "four"), + P(2, "four"), + }; + P a2[] = + { + P(10, "ten"), + P(20, "twenty"), + P(30, "thirty"), + P(40, "fourty"), + P(50, "fifty"), + P(60, "sixty"), + P(70, "seventy"), + P(80, "eighty"), + }; + C c1(std::begin(a1), std::end(a1), 0, Hash(1), Compare(1), Alloc()); + C c2(std::begin(a2), std::end(a2), 0, Hash(2), Compare(2), Alloc()); + c2.max_load_factor(2); + c1.swap(c2); + + assert(c1.bucket_count() >= 11); + assert(c1.size() == 8); + assert(c1.at(10) == "ten"); + assert(c1.at(20) == "twenty"); + assert(c1.at(30) == "thirty"); + assert(c1.at(40) == "fourty"); + assert(c1.at(50) == "fifty"); + assert(c1.at(60) == "sixty"); + assert(c1.at(70) == "seventy"); + assert(c1.at(80) == "eighty"); + assert(c1.hash_function() == Hash(2)); + assert(c1.key_eq() == Compare(2)); + assert(c1.get_allocator() == Alloc()); + assert(std::distance(c1.begin(), c1.end()) == c1.size()); + assert(std::distance(c1.cbegin(), c1.cend()) == c1.size()); + assert(c1.max_load_factor() == 2); + + assert(c2.bucket_count() >= 5); + assert(c2.size() == 4); + assert(c2.at(1) == "one"); + assert(c2.at(2) == "two"); + assert(c2.at(3) == "three"); + assert(c2.at(4) == "four"); + assert(c2.hash_function() == Hash(1)); + assert(c2.key_eq() == Compare(1)); + assert(c2.get_allocator() == Alloc()); + assert(std::distance(c2.begin(), c2.end()) == c2.size()); + assert(std::distance(c2.cbegin(), c2.cend()) == c2.size()); + assert(c2.max_load_factor() == 1); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.map/types.pass.cpp b/libcxx/test/containers/unord/unord.map/types.pass.cpp index da7d56965999..4bf459169d12 100644 --- a/libcxx/test/containers/unord/unord.map/types.pass.cpp +++ b/libcxx/test/containers/unord/unord.map/types.pass.cpp @@ -31,6 +31,8 @@ #include #include +#include "../../min_allocator.h" + int main() { { @@ -48,4 +50,22 @@ int main() static_assert((std::is_same::value), ""); static_assert((std::is_same::value), ""); } +#if __cplusplus >= 201103L + { + typedef std::unordered_map, std::equal_to, + min_allocator>> C; + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same >::value), ""); + static_assert((std::is_same >::value), ""); + static_assert((std::is_same >::value), ""); + static_assert((std::is_same >::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same>::value), ""); + static_assert((std::is_same>::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.map/unord.map.cnstr/allocator.pass.cpp b/libcxx/test/containers/unord/unord.map/unord.map.cnstr/allocator.pass.cpp index 7bb7355292d1..0f9e4cefb597 100644 --- a/libcxx/test/containers/unord/unord.map/unord.map.cnstr/allocator.pass.cpp +++ b/libcxx/test/containers/unord/unord.map/unord.map.cnstr/allocator.pass.cpp @@ -22,6 +22,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -44,4 +45,25 @@ int main() assert(c.load_factor() == 0); assert(c.max_load_factor() == 1); } +#if __cplusplus >= 201103L + { + typedef std::unordered_map >, + test_compare >, + min_allocator > + > C; + C c(min_allocator >{}); + assert(c.bucket_count() == 0); + assert(c.hash_function() == test_hash >()); + assert(c.key_eq() == test_compare >()); + assert(c.get_allocator() == + (min_allocator >())); + assert(c.size() == 0); + assert(c.empty()); + assert(std::distance(c.begin(), c.end()) == 0); + assert(c.load_factor() == 0); + assert(c.max_load_factor() == 1); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.map/unord.map.cnstr/assign_copy.pass.cpp b/libcxx/test/containers/unord/unord.map/unord.map.cnstr/assign_copy.pass.cpp index dda88e3be7f0..8e8f97d95862 100644 --- a/libcxx/test/containers/unord/unord.map/unord.map.cnstr/assign_copy.pass.cpp +++ b/libcxx/test/containers/unord/unord.map/unord.map.cnstr/assign_copy.pass.cpp @@ -23,6 +23,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -116,4 +117,51 @@ int main() assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); assert(c.max_load_factor() == 1); } +#if __cplusplus >= 201103L + { + typedef min_allocator > A; + typedef std::unordered_map >, + test_compare >, + A + > C; + typedef std::pair P; + P a[] = + { + P(1, "one"), + P(2, "two"), + P(3, "three"), + P(4, "four"), + P(1, "four"), + P(2, "four"), + }; + C c0(a, a + sizeof(a)/sizeof(a[0]), + 7, + test_hash >(8), + test_compare >(9), + A() + ); + C c(a, a + 2, + 7, + test_hash >(2), + test_compare >(3), + A() + ); + c = c0; + assert(c.bucket_count() == 7); + assert(c.size() == 4); + assert(c.at(1) == "one"); + assert(c.at(2) == "two"); + assert(c.at(3) == "three"); + assert(c.at(4) == "four"); + assert(c.hash_function() == test_hash >(8)); + assert(c.key_eq() == test_compare >(9)); + assert(c.get_allocator() == A()); + assert(!c.empty()); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); + assert(c.max_load_factor() == 1); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.map/unord.map.cnstr/assign_init.pass.cpp b/libcxx/test/containers/unord/unord.map/unord.map.cnstr/assign_init.pass.cpp index 54e41e43aac9..86d44f20642a 100644 --- a/libcxx/test/containers/unord/unord.map/unord.map.cnstr/assign_init.pass.cpp +++ b/libcxx/test/containers/unord/unord.map/unord.map.cnstr/assign_init.pass.cpp @@ -22,6 +22,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" +#include "../../../min_allocator.h" int main() { @@ -58,5 +59,39 @@ int main() assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); assert(c.max_load_factor() == 1); } +#if __cplusplus >= 201103L + { + typedef min_allocator > A; + typedef std::unordered_map >, + test_compare >, + A + > C; + typedef std::pair P; + C c = { + P(4, "four"), + P(1, "four"), + P(2, "four"), + }; + c = { + P(1, "one"), + P(2, "two"), + P(3, "three"), + P(4, "four"), + P(1, "four"), + P(2, "four"), + }; + assert(c.bucket_count() >= 5); + assert(c.size() == 4); + assert(c.at(1) == "one"); + assert(c.at(2) == "two"); + assert(c.at(3) == "three"); + assert(c.at(4) == "four"); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); + assert(c.max_load_factor() == 1); + } +#endif #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS } diff --git a/libcxx/test/containers/unord/unord.map/unord.map.cnstr/assign_move.pass.cpp b/libcxx/test/containers/unord/unord.map/unord.map.cnstr/assign_move.pass.cpp index 826ccb477a8d..97924edbf356 100644 --- a/libcxx/test/containers/unord/unord.map/unord.map.cnstr/assign_move.pass.cpp +++ b/libcxx/test/containers/unord/unord.map/unord.map.cnstr/assign_move.pass.cpp @@ -23,6 +23,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -164,5 +165,53 @@ int main() assert(c.max_load_factor() == 1); assert(c0.size() == 0); } +#if __cplusplus >= 201103L + { + typedef min_allocator > A; + typedef std::unordered_map >, + test_compare >, + A + > C; + typedef std::pair P; + P a[] = + { + P(1, "one"), + P(2, "two"), + P(3, "three"), + P(4, "four"), + P(1, "four"), + P(2, "four"), + }; + C c0(a, a + sizeof(a)/sizeof(a[0]), + 7, + test_hash >(8), + test_compare >(9), + A() + ); + C c(a, a + 2, + 7, + test_hash >(2), + test_compare >(3), + A() + ); + c = std::move(c0); + assert(c.bucket_count() == 7); + assert(c.size() == 4); + assert(c.at(1) == "one"); + assert(c.at(2) == "two"); + assert(c.at(3) == "three"); + assert(c.at(4) == "four"); + assert(c.hash_function() == test_hash >(8)); + assert(c.key_eq() == test_compare >(9)); + assert(c.get_allocator() == A()); + assert(!c.empty()); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); + assert(c.max_load_factor() == 1); + assert(c0.size() == 0); + } +#endif #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES } diff --git a/libcxx/test/containers/unord/unord.map/unord.map.cnstr/copy.pass.cpp b/libcxx/test/containers/unord/unord.map/unord.map.cnstr/copy.pass.cpp index 7bb294c8f23f..398f2fd822b1 100644 --- a/libcxx/test/containers/unord/unord.map/unord.map.cnstr/copy.pass.cpp +++ b/libcxx/test/containers/unord/unord.map/unord.map.cnstr/copy.pass.cpp @@ -23,6 +23,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -106,4 +107,45 @@ int main() assert(c.max_load_factor() == 1); } #endif // _LIBCPP_HAS_NO_ADVANCED_SFINAE +#if __cplusplus >= 201103L + { + typedef std::unordered_map >, + test_compare >, + min_allocator > + > C; + typedef std::pair P; + P a[] = + { + P(1, "one"), + P(2, "two"), + P(3, "three"), + P(4, "four"), + P(1, "four"), + P(2, "four"), + }; + C c0(a, a + sizeof(a)/sizeof(a[0]), + 7, + test_hash >(8), + test_compare >(9), + min_allocator >() + ); + C c = c0; + assert(c.bucket_count() == 7); + assert(c.size() == 4); + assert(c.at(1) == "one"); + assert(c.at(2) == "two"); + assert(c.at(3) == "three"); + assert(c.at(4) == "four"); + assert(c.hash_function() == test_hash >(8)); + assert(c.key_eq() == test_compare >(9)); + assert(c.get_allocator() == + (min_allocator >())); + assert(!c.empty()); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); + assert(c.max_load_factor() == 1); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.map/unord.map.cnstr/copy_alloc.pass.cpp b/libcxx/test/containers/unord/unord.map/unord.map.cnstr/copy_alloc.pass.cpp index 87dc2493fe66..c7d5396e77ab 100644 --- a/libcxx/test/containers/unord/unord.map/unord.map.cnstr/copy_alloc.pass.cpp +++ b/libcxx/test/containers/unord/unord.map/unord.map.cnstr/copy_alloc.pass.cpp @@ -23,6 +23,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -65,4 +66,45 @@ int main() assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); assert(c.max_load_factor() == 1); } +#if __cplusplus >= 201103L + { + typedef std::unordered_map >, + test_compare >, + min_allocator > + > C; + typedef std::pair P; + P a[] = + { + P(1, "one"), + P(2, "two"), + P(3, "three"), + P(4, "four"), + P(1, "four"), + P(2, "four"), + }; + C c0(a, a + sizeof(a)/sizeof(a[0]), + 7, + test_hash >(8), + test_compare >(9), + min_allocator >() + ); + C c(c0, min_allocator >()); + assert(c.bucket_count() == 7); + assert(c.size() == 4); + assert(c.at(1) == "one"); + assert(c.at(2) == "two"); + assert(c.at(3) == "three"); + assert(c.at(4) == "four"); + assert(c.hash_function() == test_hash >(8)); + assert(c.key_eq() == test_compare >(9)); + assert(c.get_allocator() == + (min_allocator >())); + assert(!c.empty()); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); + assert(c.max_load_factor() == 1); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.map/unord.map.cnstr/default.pass.cpp b/libcxx/test/containers/unord/unord.map/unord.map.cnstr/default.pass.cpp index 762d5282d637..b32c260e8207 100644 --- a/libcxx/test/containers/unord/unord.map/unord.map.cnstr/default.pass.cpp +++ b/libcxx/test/containers/unord/unord.map/unord.map.cnstr/default.pass.cpp @@ -22,6 +22,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -44,4 +45,25 @@ int main() assert(c.load_factor() == 0); assert(c.max_load_factor() == 1); } +#if __cplusplus >= 201103L + { + typedef std::unordered_map >, + test_compare >, + min_allocator > + > C; + C c; + assert(c.bucket_count() == 0); + assert(c.hash_function() == test_hash >()); + assert(c.key_eq() == test_compare >()); + assert(c.get_allocator() == + (min_allocator >())); + assert(c.size() == 0); + assert(c.empty()); + assert(std::distance(c.begin(), c.end()) == 0); + assert(c.load_factor() == 0); + assert(c.max_load_factor() == 1); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.map/unord.map.cnstr/init.pass.cpp b/libcxx/test/containers/unord/unord.map/unord.map.cnstr/init.pass.cpp index 5b3fe7e87dcc..be5a70fcbf50 100644 --- a/libcxx/test/containers/unord/unord.map/unord.map.cnstr/init.pass.cpp +++ b/libcxx/test/containers/unord/unord.map/unord.map.cnstr/init.pass.cpp @@ -23,6 +23,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -58,5 +59,38 @@ int main() assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); assert(c.max_load_factor() == 1); } +#if __cplusplus >= 201103L + { + typedef std::unordered_map >, + test_compare >, + min_allocator > + > C; + typedef std::pair P; + C c = { + P(1, "one"), + P(2, "two"), + P(3, "three"), + P(4, "four"), + P(1, "four"), + P(2, "four"), + }; + assert(c.bucket_count() >= 5); + assert(c.size() == 4); + assert(c.at(1) == "one"); + assert(c.at(2) == "two"); + assert(c.at(3) == "three"); + assert(c.at(4) == "four"); + assert(c.hash_function() == test_hash >()); + assert(c.key_eq() == test_compare >()); + assert(c.get_allocator() == + (min_allocator >())); + assert(!c.empty()); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); + assert(c.max_load_factor() == 1); + } +#endif #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS } diff --git a/libcxx/test/containers/unord/unord.map/unord.map.cnstr/init_size.pass.cpp b/libcxx/test/containers/unord/unord.map/unord.map.cnstr/init_size.pass.cpp index 4aa1ea62c226..fd28845f243b 100644 --- a/libcxx/test/containers/unord/unord.map/unord.map.cnstr/init_size.pass.cpp +++ b/libcxx/test/containers/unord/unord.map/unord.map.cnstr/init_size.pass.cpp @@ -23,6 +23,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -60,5 +61,40 @@ int main() assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); assert(c.max_load_factor() == 1); } +#if __cplusplus >= 201103L + { + typedef std::unordered_map >, + test_compare >, + min_allocator > + > C; + typedef std::pair P; + C c({ + P(1, "one"), + P(2, "two"), + P(3, "three"), + P(4, "four"), + P(1, "four"), + P(2, "four"), + }, + 7 + ); + assert(c.bucket_count() == 7); + assert(c.size() == 4); + assert(c.at(1) == "one"); + assert(c.at(2) == "two"); + assert(c.at(3) == "three"); + assert(c.at(4) == "four"); + assert(c.hash_function() == test_hash >()); + assert(c.key_eq() == test_compare >()); + assert(c.get_allocator() == + (min_allocator >())); + assert(!c.empty()); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); + assert(c.max_load_factor() == 1); + } +#endif #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS } diff --git a/libcxx/test/containers/unord/unord.map/unord.map.cnstr/init_size_hash.pass.cpp b/libcxx/test/containers/unord/unord.map/unord.map.cnstr/init_size_hash.pass.cpp index d499adc28faf..bcc97b67dce6 100644 --- a/libcxx/test/containers/unord/unord.map/unord.map.cnstr/init_size_hash.pass.cpp +++ b/libcxx/test/containers/unord/unord.map/unord.map.cnstr/init_size_hash.pass.cpp @@ -23,6 +23,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -61,5 +62,41 @@ int main() assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); assert(c.max_load_factor() == 1); } +#if __cplusplus >= 201103L + { + typedef std::unordered_map >, + test_compare >, + min_allocator > + > C; + typedef std::pair P; + C c({ + P(1, "one"), + P(2, "two"), + P(3, "three"), + P(4, "four"), + P(1, "four"), + P(2, "four"), + }, + 7, + test_hash >(8) + ); + assert(c.bucket_count() == 7); + assert(c.size() == 4); + assert(c.at(1) == "one"); + assert(c.at(2) == "two"); + assert(c.at(3) == "three"); + assert(c.at(4) == "four"); + assert(c.hash_function() == test_hash >(8)); + assert(c.key_eq() == test_compare >()); + assert(c.get_allocator() == + (min_allocator >())); + assert(!c.empty()); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); + assert(c.max_load_factor() == 1); + } +#endif #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS } diff --git a/libcxx/test/containers/unord/unord.map/unord.map.cnstr/init_size_hash_equal.pass.cpp b/libcxx/test/containers/unord/unord.map/unord.map.cnstr/init_size_hash_equal.pass.cpp index 25c212e6dea3..5e21873796d5 100644 --- a/libcxx/test/containers/unord/unord.map/unord.map.cnstr/init_size_hash_equal.pass.cpp +++ b/libcxx/test/containers/unord/unord.map/unord.map.cnstr/init_size_hash_equal.pass.cpp @@ -24,6 +24,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -63,5 +64,42 @@ int main() assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); assert(c.max_load_factor() == 1); } +#if __cplusplus >= 201103L + { + typedef std::unordered_map >, + test_compare >, + min_allocator > + > C; + typedef std::pair P; + C c({ + P(1, "one"), + P(2, "two"), + P(3, "three"), + P(4, "four"), + P(1, "four"), + P(2, "four"), + }, + 7, + test_hash >(8), + test_compare >(9) + ); + assert(c.bucket_count() == 7); + assert(c.size() == 4); + assert(c.at(1) == "one"); + assert(c.at(2) == "two"); + assert(c.at(3) == "three"); + assert(c.at(4) == "four"); + assert(c.hash_function() == test_hash >(8)); + assert(c.key_eq() == test_compare >(9)); + assert(c.get_allocator() == + (min_allocator >())); + assert(!c.empty()); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); + assert(c.max_load_factor() == 1); + } +#endif #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS } diff --git a/libcxx/test/containers/unord/unord.map/unord.map.cnstr/init_size_hash_equal_allocator.pass.cpp b/libcxx/test/containers/unord/unord.map/unord.map.cnstr/init_size_hash_equal_allocator.pass.cpp index d33efeec6d99..0f5e7b587298 100644 --- a/libcxx/test/containers/unord/unord.map/unord.map.cnstr/init_size_hash_equal_allocator.pass.cpp +++ b/libcxx/test/containers/unord/unord.map/unord.map.cnstr/init_size_hash_equal_allocator.pass.cpp @@ -24,6 +24,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -64,5 +65,43 @@ int main() assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); assert(c.max_load_factor() == 1); } +#if __cplusplus >= 201103L + { + typedef std::unordered_map >, + test_compare >, + min_allocator > + > C; + typedef std::pair P; + C c({ + P(1, "one"), + P(2, "two"), + P(3, "three"), + P(4, "four"), + P(1, "four"), + P(2, "four"), + }, + 7, + test_hash >(8), + test_compare >(9), + min_allocator >() + ); + assert(c.bucket_count() == 7); + assert(c.size() == 4); + assert(c.at(1) == "one"); + assert(c.at(2) == "two"); + assert(c.at(3) == "three"); + assert(c.at(4) == "four"); + assert(c.hash_function() == test_hash >(8)); + assert(c.key_eq() == test_compare >(9)); + assert(c.get_allocator() == + (min_allocator >())); + assert(!c.empty()); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); + assert(c.max_load_factor() == 1); + } +#endif #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS } diff --git a/libcxx/test/containers/unord/unord.map/unord.map.cnstr/move.pass.cpp b/libcxx/test/containers/unord/unord.map/unord.map.cnstr/move.pass.cpp index b094330ce989..5c5c53a4d595 100644 --- a/libcxx/test/containers/unord/unord.map/unord.map.cnstr/move.pass.cpp +++ b/libcxx/test/containers/unord/unord.map/unord.map.cnstr/move.pass.cpp @@ -23,6 +23,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -104,5 +105,84 @@ int main() assert(c0.empty()); } +#if __cplusplus >= 201103L + { + typedef std::unordered_map >, + test_compare >, + min_allocator > + > C; + typedef std::pair P; + P a[] = + { + P(1, "one"), + P(2, "two"), + P(3, "three"), + P(4, "four"), + P(1, "four"), + P(2, "four"), + }; + C c0(7, + test_hash >(8), + test_compare >(9), + min_allocator >() + ); + C c = std::move(c0); + assert(c.bucket_count() == 7); + assert(c.size() == 0); + assert(c.hash_function() == test_hash >(8)); + assert(c.key_eq() == test_compare >(9)); + assert(c.get_allocator() == + (min_allocator >())); + assert(c.empty()); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + assert(c.load_factor() == 0); + assert(c.max_load_factor() == 1); + + assert(c0.empty()); + } + { + typedef std::unordered_map >, + test_compare >, + min_allocator > + > C; + typedef std::pair P; + P a[] = + { + P(1, "one"), + P(2, "two"), + P(3, "three"), + P(4, "four"), + P(1, "four"), + P(2, "four"), + }; + C c0(a, a + sizeof(a)/sizeof(a[0]), + 7, + test_hash >(8), + test_compare >(9), + min_allocator >() + ); + C c = std::move(c0); + assert(c.bucket_count() == 7); + assert(c.size() == 4); + assert(c.at(1) == "one"); + assert(c.at(2) == "two"); + assert(c.at(3) == "three"); + assert(c.at(4) == "four"); + assert(c.hash_function() == test_hash >(8)); + assert(c.key_eq() == test_compare >(9)); + assert(c.get_allocator() == + (min_allocator >())); + assert(!c.empty()); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); + assert(c.max_load_factor() == 1); + + assert(c0.empty()); + } +#endif #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES } diff --git a/libcxx/test/containers/unord/unord.map/unord.map.cnstr/move_alloc.pass.cpp b/libcxx/test/containers/unord/unord.map/unord.map.cnstr/move_alloc.pass.cpp index a1434a52b78e..0f7348087f9b 100644 --- a/libcxx/test/containers/unord/unord.map/unord.map.cnstr/move_alloc.pass.cpp +++ b/libcxx/test/containers/unord/unord.map/unord.map.cnstr/move_alloc.pass.cpp @@ -23,6 +23,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -109,5 +110,48 @@ int main() assert(c0.empty()); } +#if __cplusplus >= 201103L + { + typedef std::pair P; + typedef min_allocator> A; + typedef std::unordered_map >, + test_compare >, + A + > C; + P a[] = + { + P(1, "one"), + P(2, "two"), + P(3, "three"), + P(4, "four"), + P(1, "four"), + P(2, "four"), + }; + C c0(a, a + sizeof(a)/sizeof(a[0]), + 7, + test_hash >(8), + test_compare >(9), + A() + ); + C c(std::move(c0), A()); + assert(c.bucket_count() == 7); + assert(c.size() == 4); + assert(c.at(1) == "one"); + assert(c.at(2) == "two"); + assert(c.at(3) == "three"); + assert(c.at(4) == "four"); + assert(c.hash_function() == test_hash >(8)); + assert(c.key_eq() == test_compare >(9)); + assert(c.get_allocator() == A()); + assert(!c.empty()); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); + assert(c.max_load_factor() == 1); + + assert(c0.empty()); + } +#endif #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES } diff --git a/libcxx/test/containers/unord/unord.map/unord.map.cnstr/range.pass.cpp b/libcxx/test/containers/unord/unord.map/unord.map.cnstr/range.pass.cpp index 0c4ccec7f393..25e1d8d641d3 100644 --- a/libcxx/test/containers/unord/unord.map/unord.map.cnstr/range.pass.cpp +++ b/libcxx/test/containers/unord/unord.map/unord.map.cnstr/range.pass.cpp @@ -26,6 +26,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -62,4 +63,39 @@ int main() assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); assert(c.max_load_factor() == 1); } +#if __cplusplus >= 201103L + { + typedef std::unordered_map >, + test_compare >, + min_allocator > + > C; + typedef std::pair P; + P a[] = + { + P(1, "one"), + P(2, "two"), + P(3, "three"), + P(4, "four"), + P(1, "four"), + P(2, "four"), + }; + C c(input_iterator(a), input_iterator(a + sizeof(a)/sizeof(a[0]))); + assert(c.bucket_count() >= 5); + assert(c.size() == 4); + assert(c.at(1) == "one"); + assert(c.at(2) == "two"); + assert(c.at(3) == "three"); + assert(c.at(4) == "four"); + assert(c.hash_function() == test_hash >()); + assert(c.key_eq() == test_compare >()); + assert(c.get_allocator() == + (min_allocator >())); + assert(!c.empty()); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); + assert(c.max_load_factor() == 1); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.map/unord.map.cnstr/range_size.pass.cpp b/libcxx/test/containers/unord/unord.map/unord.map.cnstr/range_size.pass.cpp index 0d8b1a7e4ce0..42822bc6e8fb 100644 --- a/libcxx/test/containers/unord/unord.map/unord.map.cnstr/range_size.pass.cpp +++ b/libcxx/test/containers/unord/unord.map/unord.map.cnstr/range_size.pass.cpp @@ -26,6 +26,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -64,4 +65,41 @@ int main() assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); assert(c.max_load_factor() == 1); } +#if __cplusplus >= 201103L + { + typedef std::unordered_map >, + test_compare >, + min_allocator > + > C; + typedef std::pair P; + P a[] = + { + P(1, "one"), + P(2, "two"), + P(3, "three"), + P(4, "four"), + P(1, "four"), + P(2, "four"), + }; + C c(input_iterator(a), input_iterator(a + sizeof(a)/sizeof(a[0])), + 10 + ); + assert(c.bucket_count() == 11); + assert(c.size() == 4); + assert(c.at(1) == "one"); + assert(c.at(2) == "two"); + assert(c.at(3) == "three"); + assert(c.at(4) == "four"); + assert(c.hash_function() == test_hash >()); + assert(c.key_eq() == test_compare >()); + assert(c.get_allocator() == + (min_allocator >())); + assert(!c.empty()); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); + assert(c.max_load_factor() == 1); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.map/unord.map.cnstr/range_size_hash.pass.cpp b/libcxx/test/containers/unord/unord.map/unord.map.cnstr/range_size_hash.pass.cpp index 0d55b26c1af2..f6f294fded98 100644 --- a/libcxx/test/containers/unord/unord.map/unord.map.cnstr/range_size_hash.pass.cpp +++ b/libcxx/test/containers/unord/unord.map/unord.map.cnstr/range_size_hash.pass.cpp @@ -27,6 +27,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -66,4 +67,42 @@ int main() assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); assert(c.max_load_factor() == 1); } +#if __cplusplus >= 201103L + { + typedef std::unordered_map >, + test_compare >, + min_allocator > + > C; + typedef std::pair P; + P a[] = + { + P(1, "one"), + P(2, "two"), + P(3, "three"), + P(4, "four"), + P(1, "four"), + P(2, "four"), + }; + C c(input_iterator(a), input_iterator(a + sizeof(a)/sizeof(a[0])), + 7, + test_hash >(8) + ); + assert(c.bucket_count() == 7); + assert(c.size() == 4); + assert(c.at(1) == "one"); + assert(c.at(2) == "two"); + assert(c.at(3) == "three"); + assert(c.at(4) == "four"); + assert(c.hash_function() == test_hash >(8)); + assert(c.key_eq() == test_compare >()); + assert(c.get_allocator() == + (min_allocator >())); + assert(!c.empty()); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); + assert(c.max_load_factor() == 1); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.map/unord.map.cnstr/range_size_hash_equal.pass.cpp b/libcxx/test/containers/unord/unord.map/unord.map.cnstr/range_size_hash_equal.pass.cpp index 0c81503e17f0..16b7f8bf34e8 100644 --- a/libcxx/test/containers/unord/unord.map/unord.map.cnstr/range_size_hash_equal.pass.cpp +++ b/libcxx/test/containers/unord/unord.map/unord.map.cnstr/range_size_hash_equal.pass.cpp @@ -27,6 +27,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -67,4 +68,43 @@ int main() assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); assert(c.max_load_factor() == 1); } +#if __cplusplus >= 201103L + { + typedef std::unordered_map >, + test_compare >, + min_allocator > + > C; + typedef std::pair P; + P a[] = + { + P(1, "one"), + P(2, "two"), + P(3, "three"), + P(4, "four"), + P(1, "four"), + P(2, "four"), + }; + C c(input_iterator(a), input_iterator(a + sizeof(a)/sizeof(a[0])), + 7, + test_hash >(8), + test_compare >(9) + ); + assert(c.bucket_count() == 7); + assert(c.size() == 4); + assert(c.at(1) == "one"); + assert(c.at(2) == "two"); + assert(c.at(3) == "three"); + assert(c.at(4) == "four"); + assert(c.hash_function() == test_hash >(8)); + assert(c.key_eq() == test_compare >(9)); + assert(c.get_allocator() == + (min_allocator >())); + assert(!c.empty()); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); + assert(c.max_load_factor() == 1); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.map/unord.map.cnstr/range_size_hash_equal_allocator.pass.cpp b/libcxx/test/containers/unord/unord.map/unord.map.cnstr/range_size_hash_equal_allocator.pass.cpp index c8371ce006e5..82825ce5f854 100644 --- a/libcxx/test/containers/unord/unord.map/unord.map.cnstr/range_size_hash_equal_allocator.pass.cpp +++ b/libcxx/test/containers/unord/unord.map/unord.map.cnstr/range_size_hash_equal_allocator.pass.cpp @@ -28,6 +28,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -69,4 +70,44 @@ int main() assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); assert(c.max_load_factor() == 1); } +#if __cplusplus >= 201103L + { + typedef std::unordered_map >, + test_compare >, + min_allocator > + > C; + typedef std::pair P; + P a[] = + { + P(1, "one"), + P(2, "two"), + P(3, "three"), + P(4, "four"), + P(1, "four"), + P(2, "four"), + }; + C c(input_iterator(a), input_iterator(a + sizeof(a)/sizeof(a[0])), + 7, + test_hash >(8), + test_compare >(9), + min_allocator >() + ); + assert(c.bucket_count() == 7); + assert(c.size() == 4); + assert(c.at(1) == "one"); + assert(c.at(2) == "two"); + assert(c.at(3) == "three"); + assert(c.at(4) == "four"); + assert(c.hash_function() == test_hash >(8)); + assert(c.key_eq() == test_compare >(9)); + assert(c.get_allocator() == + (min_allocator >())); + assert(!c.empty()); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); + assert(c.max_load_factor() == 1); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.map/unord.map.cnstr/size.fail.cpp b/libcxx/test/containers/unord/unord.map/unord.map.cnstr/size.fail.cpp index ce19c1776d83..71303660cc39 100644 --- a/libcxx/test/containers/unord/unord.map/unord.map.cnstr/size.fail.cpp +++ b/libcxx/test/containers/unord/unord.map/unord.map.cnstr/size.fail.cpp @@ -22,6 +22,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -44,4 +45,25 @@ int main() assert(c.load_factor() == 0); assert(c.max_load_factor() == 1); } +#if __cplusplus >= 201103L + { + typedef std::unordered_map >, + test_compare >, + min_allocator > + > C; + C c = 7; + assert(c.bucket_count() == 7); + assert(c.hash_function() == test_hash >()); + assert(c.key_eq() == test_compare >()); + assert(c.get_allocator() == + (min_allocator >())); + assert(c.size() == 0); + assert(c.empty()); + assert(std::distance(c.begin(), c.end()) == 0); + assert(c.load_factor() == 0); + assert(c.max_load_factor() == 1); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.map/unord.map.cnstr/size.pass.cpp b/libcxx/test/containers/unord/unord.map/unord.map.cnstr/size.pass.cpp index ab2b1866b0d0..81cb07ddb7e6 100644 --- a/libcxx/test/containers/unord/unord.map/unord.map.cnstr/size.pass.cpp +++ b/libcxx/test/containers/unord/unord.map/unord.map.cnstr/size.pass.cpp @@ -22,6 +22,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -44,4 +45,25 @@ int main() assert(c.load_factor() == 0); assert(c.max_load_factor() == 1); } +#if __cplusplus >= 201103L + { + typedef std::unordered_map >, + test_compare >, + min_allocator > + > C; + C c(7); + assert(c.bucket_count() == 7); + assert(c.hash_function() == test_hash >()); + assert(c.key_eq() == test_compare >()); + assert(c.get_allocator() == + (min_allocator >())); + assert(c.size() == 0); + assert(c.empty()); + assert(std::distance(c.begin(), c.end()) == 0); + assert(c.load_factor() == 0); + assert(c.max_load_factor() == 1); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.map/unord.map.cnstr/size_hash.pass.cpp b/libcxx/test/containers/unord/unord.map/unord.map.cnstr/size_hash.pass.cpp index 0d4d7a156fb7..783189c7aa45 100644 --- a/libcxx/test/containers/unord/unord.map/unord.map.cnstr/size_hash.pass.cpp +++ b/libcxx/test/containers/unord/unord.map/unord.map.cnstr/size_hash.pass.cpp @@ -22,6 +22,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -46,4 +47,27 @@ int main() assert(c.load_factor() == 0); assert(c.max_load_factor() == 1); } +#if __cplusplus >= 201103L + { + typedef std::unordered_map >, + test_compare >, + min_allocator > + > C; + C c(7, + test_hash >(8) + ); + assert(c.bucket_count() == 7); + assert(c.hash_function() == test_hash >(8)); + assert(c.key_eq() == test_compare >()); + assert(c.get_allocator() == + (min_allocator >())); + assert(c.size() == 0); + assert(c.empty()); + assert(std::distance(c.begin(), c.end()) == 0); + assert(c.load_factor() == 0); + assert(c.max_load_factor() == 1); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.map/unord.map.cnstr/size_hash_equal.pass.cpp b/libcxx/test/containers/unord/unord.map/unord.map.cnstr/size_hash_equal.pass.cpp index 44fcc30ca99b..9c7f2b57359e 100644 --- a/libcxx/test/containers/unord/unord.map/unord.map.cnstr/size_hash_equal.pass.cpp +++ b/libcxx/test/containers/unord/unord.map/unord.map.cnstr/size_hash_equal.pass.cpp @@ -22,6 +22,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -47,4 +48,28 @@ int main() assert(c.load_factor() == 0); assert(c.max_load_factor() == 1); } +#if __cplusplus >= 201103L + { + typedef std::unordered_map >, + test_compare >, + min_allocator > + > C; + C c(7, + test_hash >(8), + test_compare >(9) + ); + assert(c.bucket_count() == 7); + assert(c.hash_function() == test_hash >(8)); + assert(c.key_eq() == test_compare >(9)); + assert(c.get_allocator() == + (min_allocator >())); + assert(c.size() == 0); + assert(c.empty()); + assert(std::distance(c.begin(), c.end()) == 0); + assert(c.load_factor() == 0); + assert(c.max_load_factor() == 1); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.map/unord.map.cnstr/size_hash_equal_allocator.pass.cpp b/libcxx/test/containers/unord/unord.map/unord.map.cnstr/size_hash_equal_allocator.pass.cpp index be0897829f70..139ffad1295b 100644 --- a/libcxx/test/containers/unord/unord.map/unord.map.cnstr/size_hash_equal_allocator.pass.cpp +++ b/libcxx/test/containers/unord/unord.map/unord.map.cnstr/size_hash_equal_allocator.pass.cpp @@ -22,6 +22,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -48,4 +49,29 @@ int main() assert(c.load_factor() == 0); assert(c.max_load_factor() == 1); } +#if __cplusplus >= 201103L + { + typedef std::unordered_map >, + test_compare >, + min_allocator > + > C; + C c(7, + test_hash >(8), + test_compare >(9), + min_allocator >() + ); + assert(c.bucket_count() == 7); + assert(c.hash_function() == test_hash >(8)); + assert(c.key_eq() == test_compare >(9)); + assert(c.get_allocator() == + (min_allocator >())); + assert(c.size() == 0); + assert(c.empty()); + assert(std::distance(c.begin(), c.end()) == 0); + assert(c.load_factor() == 0); + assert(c.max_load_factor() == 1); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.map/unord.map.elem/at.pass.cpp b/libcxx/test/containers/unord/unord.map/unord.map.elem/at.pass.cpp index 720a7c599fb5..c8eade2fba16 100644 --- a/libcxx/test/containers/unord/unord.map/unord.map.elem/at.pass.cpp +++ b/libcxx/test/containers/unord/unord.map/unord.map.elem/at.pass.cpp @@ -21,6 +21,7 @@ #include #include "../../../MoveOnly.h" +#include "../../../min_allocator.h" int main() { @@ -75,4 +76,59 @@ int main() } assert(c.size() == 4); } +#if __cplusplus >= 201103L + { + typedef std::unordered_map, std::equal_to, + min_allocator>> C; + typedef std::pair P; + P a[] = + { + P(1, "one"), + P(2, "two"), + P(3, "three"), + P(4, "four"), + P(1, "four"), + P(2, "four"), + }; + C c(a, a + sizeof(a)/sizeof(a[0])); + assert(c.size() == 4); + c.at(1) = "ONE"; + assert(c.at(1) == "ONE"); + try + { + c.at(11) = "eleven"; + assert(false); + } + catch (std::out_of_range&) + { + } + assert(c.size() == 4); + } + { + typedef std::unordered_map, std::equal_to, + min_allocator>> C; + typedef std::pair P; + P a[] = + { + P(1, "one"), + P(2, "two"), + P(3, "three"), + P(4, "four"), + P(1, "four"), + P(2, "four"), + }; + const C c(a, a + sizeof(a)/sizeof(a[0])); + assert(c.size() == 4); + assert(c.at(1) == "one"); + try + { + c.at(11); + assert(false); + } + catch (std::out_of_range&) + { + } + assert(c.size() == 4); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.map/unord.map.elem/index.pass.cpp b/libcxx/test/containers/unord/unord.map/unord.map.elem/index.pass.cpp index 071e059b8af7..bbee80d938cc 100644 --- a/libcxx/test/containers/unord/unord.map/unord.map.elem/index.pass.cpp +++ b/libcxx/test/containers/unord/unord.map/unord.map.elem/index.pass.cpp @@ -20,6 +20,7 @@ #include #include "../../../MoveOnly.h" +#include "../../../min_allocator.h" int main() { @@ -65,4 +66,50 @@ int main() assert(c.at(11) == "eleven"); } #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES +#if __cplusplus >= 201103L + { + typedef std::unordered_map, std::equal_to, + min_allocator>> C; + typedef std::pair P; + P a[] = + { + P(1, "one"), + P(2, "two"), + P(3, "three"), + P(4, "four"), + P(1, "four"), + P(2, "four"), + }; + C c(a, a + sizeof(a)/sizeof(a[0])); + assert(c.size() == 4); + c[1] = "ONE"; + assert(c.at(1) == "ONE"); + c[11] = "eleven"; + assert(c.size() == 5); + assert(c.at(11) == "eleven"); + } +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + { + typedef std::unordered_map, std::equal_to, + min_allocator>> C; + typedef std::pair P; + P a[] = + { + P(1, "one"), + P(2, "two"), + P(3, "three"), + P(4, "four"), + P(1, "four"), + P(2, "four"), + }; + C c(a, a + sizeof(a)/sizeof(a[0])); + assert(c.size() == 4); + c[1] = "ONE"; + assert(c.at(1) == "ONE"); + c[11] = "eleven"; + assert(c.size() == 5); + assert(c.at(11) == "eleven"); + } +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES +#endif } diff --git a/libcxx/test/containers/unord/unord.map/unord.map.swap/swap_non_member.pass.cpp b/libcxx/test/containers/unord/unord.map/unord.map.swap/swap_non_member.pass.cpp index 450fed38e916..224286ab9648 100644 --- a/libcxx/test/containers/unord/unord.map/unord.map.swap/swap_non_member.pass.cpp +++ b/libcxx/test/containers/unord/unord.map/unord.map.swap/swap_non_member.pass.cpp @@ -22,6 +22,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -386,4 +387,186 @@ int main() assert(std::distance(c2.cbegin(), c2.cend()) == c2.size()); assert(c2.max_load_factor() == 1); } +#if __cplusplus >= 201103L + { + typedef test_hash > Hash; + typedef test_compare > Compare; + typedef min_allocator > Alloc; + typedef std::unordered_map C; + typedef std::pair P; + C c1(0, Hash(1), Compare(1), Alloc()); + C c2(0, Hash(2), Compare(2), Alloc()); + c2.max_load_factor(2); + swap(c1, c2); + + assert(c1.bucket_count() == 0); + assert(c1.size() == 0); + assert(c1.hash_function() == Hash(2)); + assert(c1.key_eq() == Compare(2)); + assert(c1.get_allocator() == Alloc()); + assert(std::distance(c1.begin(), c1.end()) == c1.size()); + assert(std::distance(c1.cbegin(), c1.cend()) == c1.size()); + assert(c1.max_load_factor() == 2); + + assert(c2.bucket_count() == 0); + assert(c2.size() == 0); + assert(c2.hash_function() == Hash(1)); + assert(c2.key_eq() == Compare(1)); + assert(c2.get_allocator() == Alloc()); + assert(std::distance(c2.begin(), c2.end()) == c2.size()); + assert(std::distance(c2.cbegin(), c2.cend()) == c2.size()); + assert(c2.max_load_factor() == 1); + } + { + typedef test_hash > Hash; + typedef test_compare > Compare; + typedef min_allocator > Alloc; + typedef std::unordered_map C; + typedef std::pair P; + P a2[] = + { + P(10, "ten"), + P(20, "twenty"), + P(30, "thirty"), + P(40, "fourty"), + P(50, "fifty"), + P(60, "sixty"), + P(70, "seventy"), + P(80, "eighty"), + }; + C c1(0, Hash(1), Compare(1), Alloc()); + C c2(std::begin(a2), std::end(a2), 0, Hash(2), Compare(2), Alloc()); + c2.max_load_factor(2); + swap(c1, c2); + + assert(c1.bucket_count() >= 11); + assert(c1.size() == 8); + assert(c1.at(10) == "ten"); + assert(c1.at(20) == "twenty"); + assert(c1.at(30) == "thirty"); + assert(c1.at(40) == "fourty"); + assert(c1.at(50) == "fifty"); + assert(c1.at(60) == "sixty"); + assert(c1.at(70) == "seventy"); + assert(c1.at(80) == "eighty"); + assert(c1.hash_function() == Hash(2)); + assert(c1.key_eq() == Compare(2)); + assert(c1.get_allocator() == Alloc()); + assert(std::distance(c1.begin(), c1.end()) == c1.size()); + assert(std::distance(c1.cbegin(), c1.cend()) == c1.size()); + assert(c1.max_load_factor() == 2); + + assert(c2.bucket_count() == 0); + assert(c2.size() == 0); + assert(c2.hash_function() == Hash(1)); + assert(c2.key_eq() == Compare(1)); + assert(c2.get_allocator() == Alloc()); + assert(std::distance(c2.begin(), c2.end()) == c2.size()); + assert(std::distance(c2.cbegin(), c2.cend()) == c2.size()); + assert(c2.max_load_factor() == 1); + } + { + typedef test_hash > Hash; + typedef test_compare > Compare; + typedef min_allocator > Alloc; + typedef std::unordered_map C; + typedef std::pair P; + P a1[] = + { + P(1, "one"), + P(2, "two"), + P(3, "three"), + P(4, "four"), + P(1, "four"), + P(2, "four"), + }; + C c1(std::begin(a1), std::end(a1), 0, Hash(1), Compare(1), Alloc()); + C c2(0, Hash(2), Compare(2), Alloc()); + c2.max_load_factor(2); + swap(c1, c2); + + assert(c1.bucket_count() == 0); + assert(c1.size() == 0); + assert(c1.hash_function() == Hash(2)); + assert(c1.key_eq() == Compare(2)); + assert(c1.get_allocator() == Alloc()); + assert(std::distance(c1.begin(), c1.end()) == c1.size()); + assert(std::distance(c1.cbegin(), c1.cend()) == c1.size()); + assert(c1.max_load_factor() == 2); + + assert(c2.bucket_count() >= 5); + assert(c2.size() == 4); + assert(c2.at(1) == "one"); + assert(c2.at(2) == "two"); + assert(c2.at(3) == "three"); + assert(c2.at(4) == "four"); + assert(c2.hash_function() == Hash(1)); + assert(c2.key_eq() == Compare(1)); + assert(c2.get_allocator() == Alloc()); + assert(std::distance(c2.begin(), c2.end()) == c2.size()); + assert(std::distance(c2.cbegin(), c2.cend()) == c2.size()); + assert(c2.max_load_factor() == 1); + } + { + typedef test_hash > Hash; + typedef test_compare > Compare; + typedef min_allocator > Alloc; + typedef std::unordered_map C; + typedef std::pair P; + P a1[] = + { + P(1, "one"), + P(2, "two"), + P(3, "three"), + P(4, "four"), + P(1, "four"), + P(2, "four"), + }; + P a2[] = + { + P(10, "ten"), + P(20, "twenty"), + P(30, "thirty"), + P(40, "fourty"), + P(50, "fifty"), + P(60, "sixty"), + P(70, "seventy"), + P(80, "eighty"), + }; + C c1(std::begin(a1), std::end(a1), 0, Hash(1), Compare(1), Alloc()); + C c2(std::begin(a2), std::end(a2), 0, Hash(2), Compare(2), Alloc()); + c2.max_load_factor(2); + swap(c1, c2); + + assert(c1.bucket_count() >= 11); + assert(c1.size() == 8); + assert(c1.at(10) == "ten"); + assert(c1.at(20) == "twenty"); + assert(c1.at(30) == "thirty"); + assert(c1.at(40) == "fourty"); + assert(c1.at(50) == "fifty"); + assert(c1.at(60) == "sixty"); + assert(c1.at(70) == "seventy"); + assert(c1.at(80) == "eighty"); + assert(c1.hash_function() == Hash(2)); + assert(c1.key_eq() == Compare(2)); + assert(c1.get_allocator() == Alloc()); + assert(std::distance(c1.begin(), c1.end()) == c1.size()); + assert(std::distance(c1.cbegin(), c1.cend()) == c1.size()); + assert(c1.max_load_factor() == 2); + + assert(c2.bucket_count() >= 5); + assert(c2.size() == 4); + assert(c2.at(1) == "one"); + assert(c2.at(2) == "two"); + assert(c2.at(3) == "three"); + assert(c2.at(4) == "four"); + assert(c2.hash_function() == Hash(1)); + assert(c2.key_eq() == Compare(1)); + assert(c2.get_allocator() == Alloc()); + assert(std::distance(c2.begin(), c2.end()) == c2.size()); + assert(std::distance(c2.cbegin(), c2.cend()) == c2.size()); + assert(c2.max_load_factor() == 1); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.map/unorder.map.modifiers/clear.pass.cpp b/libcxx/test/containers/unord/unord.map/unorder.map.modifiers/clear.pass.cpp index c51e3d095edf..0e0f188be788 100644 --- a/libcxx/test/containers/unord/unord.map/unorder.map.modifiers/clear.pass.cpp +++ b/libcxx/test/containers/unord/unord.map/unorder.map.modifiers/clear.pass.cpp @@ -19,6 +19,8 @@ #include #include +#include "../../../min_allocator.h" + int main() { { @@ -37,4 +39,23 @@ int main() c.clear(); assert(c.size() == 0); } +#if __cplusplus >= 201103L + { + typedef std::unordered_map, std::equal_to, + min_allocator>> C; + typedef std::pair P; + P a[] = + { + P(1, "one"), + P(2, "two"), + P(3, "three"), + P(4, "four"), + P(1, "four"), + P(2, "four"), + }; + C c(a, a + sizeof(a)/sizeof(a[0])); + c.clear(); + assert(c.size() == 0); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.map/unorder.map.modifiers/emplace.pass.cpp b/libcxx/test/containers/unord/unord.map/unorder.map.modifiers/emplace.pass.cpp index 488d2ba00536..515b32925ca0 100644 --- a/libcxx/test/containers/unord/unord.map/unorder.map.modifiers/emplace.pass.cpp +++ b/libcxx/test/containers/unord/unord.map/unorder.map.modifiers/emplace.pass.cpp @@ -20,6 +20,7 @@ #include #include "../../../Emplaceable.h" +#include "../../../min_allocator.h" int main() { @@ -47,5 +48,31 @@ int main() assert(r.first->first == 5); assert(r.first->second == Emplaceable(6, 7)); } +#if __cplusplus >= 201103L + { + typedef std::unordered_map, std::equal_to, + min_allocator>> C; + typedef std::pair R; + C c; + R r = c.emplace(3); + assert(r.second); + assert(c.size() == 1); + assert(r.first->first == 3); + assert(r.first->second == Emplaceable()); + + r = c.emplace(std::pair(4, Emplaceable(5, 6))); + assert(r.second); + assert(c.size() == 2); + assert(r.first->first == 4); + assert(r.first->second == Emplaceable(5, 6)); + + r = c.emplace(std::piecewise_construct, std::forward_as_tuple(5), + std::forward_as_tuple(6, 7)); + assert(r.second); + assert(c.size() == 3); + assert(r.first->first == 5); + assert(r.first->second == Emplaceable(6, 7)); + } +#endif #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES } diff --git a/libcxx/test/containers/unord/unord.map/unorder.map.modifiers/emplace_hint.pass.cpp b/libcxx/test/containers/unord/unord.map/unorder.map.modifiers/emplace_hint.pass.cpp index 463fc3b53a67..6c2a75a2913d 100644 --- a/libcxx/test/containers/unord/unord.map/unorder.map.modifiers/emplace_hint.pass.cpp +++ b/libcxx/test/containers/unord/unord.map/unorder.map.modifiers/emplace_hint.pass.cpp @@ -20,6 +20,7 @@ #include #include "../../../Emplaceable.h" +#include "../../../min_allocator.h" int main() { @@ -45,5 +46,29 @@ int main() assert(r->first == 5); assert(r->second == Emplaceable(6, 7)); } +#if __cplusplus >= 201103L + { + typedef std::unordered_map, std::equal_to, + min_allocator>> C; + typedef C::iterator R; + C c; + C::const_iterator e = c.end(); + R r = c.emplace_hint(e, 3); + assert(c.size() == 1); + assert(r->first == 3); + assert(r->second == Emplaceable()); + + r = c.emplace_hint(e, std::pair(4, Emplaceable(5, 6))); + assert(c.size() == 2); + assert(r->first == 4); + assert(r->second == Emplaceable(5, 6)); + + r = c.emplace_hint(e, std::piecewise_construct, std::forward_as_tuple(5), + std::forward_as_tuple(6, 7)); + assert(c.size() == 3); + assert(r->first == 5); + assert(r->second == Emplaceable(6, 7)); + } +#endif #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES } diff --git a/libcxx/test/containers/unord/unord.map/unorder.map.modifiers/erase_const_iter.pass.cpp b/libcxx/test/containers/unord/unord.map/unorder.map.modifiers/erase_const_iter.pass.cpp index f7127d51e365..977581cdf1c9 100644 --- a/libcxx/test/containers/unord/unord.map/unorder.map.modifiers/erase_const_iter.pass.cpp +++ b/libcxx/test/containers/unord/unord.map/unorder.map.modifiers/erase_const_iter.pass.cpp @@ -19,6 +19,8 @@ #include #include +#include "../../../min_allocator.h" + int main() { { @@ -41,4 +43,27 @@ int main() assert(c.at(3) == "three"); assert(c.at(4) == "four"); } +#if __cplusplus >= 201103L + { + typedef std::unordered_map, std::equal_to, + min_allocator>> C; + typedef std::pair P; + P a[] = + { + P(1, "one"), + P(2, "two"), + P(3, "three"), + P(4, "four"), + P(1, "four"), + P(2, "four"), + }; + C c(a, a + sizeof(a)/sizeof(a[0])); + C::const_iterator i = c.find(2); + C::iterator j = c.erase(i); + assert(c.size() == 3); + assert(c.at(1) == "one"); + assert(c.at(3) == "three"); + assert(c.at(4) == "four"); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.map/unorder.map.modifiers/erase_key.pass.cpp b/libcxx/test/containers/unord/unord.map/unorder.map.modifiers/erase_key.pass.cpp index cc59bb906301..c2a8666b1dcb 100644 --- a/libcxx/test/containers/unord/unord.map/unorder.map.modifiers/erase_key.pass.cpp +++ b/libcxx/test/containers/unord/unord.map/unorder.map.modifiers/erase_key.pass.cpp @@ -19,6 +19,8 @@ #include #include +#include "../../../min_allocator.h" + int main() { { @@ -77,4 +79,63 @@ int main() assert(c.erase(3) == 0); assert(c.size() == 0); } +#if __cplusplus >= 201103L + { + typedef std::unordered_map, std::equal_to, + min_allocator>> C; + typedef std::pair P; + P a[] = + { + P(1, "one"), + P(2, "two"), + P(3, "three"), + P(4, "four"), + P(1, "four"), + P(2, "four"), + }; + C c(a, a + sizeof(a)/sizeof(a[0])); + assert(c.erase(5) == 0); + assert(c.size() == 4); + assert(c.at(1) == "one"); + assert(c.at(2) == "two"); + assert(c.at(3) == "three"); + assert(c.at(4) == "four"); + + assert(c.erase(2) == 1); + assert(c.size() == 3); + assert(c.at(1) == "one"); + assert(c.at(3) == "three"); + assert(c.at(4) == "four"); + + assert(c.erase(2) == 0); + assert(c.size() == 3); + assert(c.at(1) == "one"); + assert(c.at(3) == "three"); + assert(c.at(4) == "four"); + + assert(c.erase(4) == 1); + assert(c.size() == 2); + assert(c.at(1) == "one"); + assert(c.at(3) == "three"); + + assert(c.erase(4) == 0); + assert(c.size() == 2); + assert(c.at(1) == "one"); + assert(c.at(3) == "three"); + + assert(c.erase(1) == 1); + assert(c.size() == 1); + assert(c.at(3) == "three"); + + assert(c.erase(1) == 0); + assert(c.size() == 1); + assert(c.at(3) == "three"); + + assert(c.erase(3) == 1); + assert(c.size() == 0); + + assert(c.erase(3) == 0); + assert(c.size() == 0); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.map/unorder.map.modifiers/erase_range.pass.cpp b/libcxx/test/containers/unord/unord.map/unorder.map.modifiers/erase_range.pass.cpp index b5c438374e1b..ad915fd63c9b 100644 --- a/libcxx/test/containers/unord/unord.map/unorder.map.modifiers/erase_range.pass.cpp +++ b/libcxx/test/containers/unord/unord.map/unorder.map.modifiers/erase_range.pass.cpp @@ -19,6 +19,8 @@ #include #include +#include "../../../min_allocator.h" + int main() { { @@ -56,4 +58,42 @@ int main() assert(c.size() == 0); assert(k == c.end()); } +#if __cplusplus >= 201103L + { + typedef std::unordered_map, std::equal_to, + min_allocator>> C; + typedef std::pair P; + P a[] = + { + P(1, "one"), + P(2, "two"), + P(3, "three"), + P(4, "four"), + P(1, "four"), + P(2, "four"), + }; + C c(a, a + sizeof(a)/sizeof(a[0])); + C::const_iterator i = c.find(2); + C::const_iterator j = next(i, 1); + C::iterator k = c.erase(i, i); + assert(k == i); + assert(c.size() == 4); + assert(c.at(1) == "one"); + assert(c.at(2) == "two"); + assert(c.at(3) == "three"); + assert(c.at(4) == "four"); + + k = c.erase(i, j); + assert(c.size() == 3); + assert(k == j); + assert(c.at(1) == "one"); + assert(c.at(3) == "three"); + assert(c.at(4) == "four"); + + k = c.erase(c.cbegin(), c.cend()); + assert(k == c.cend()); + assert(c.size() == 0); + assert(k == c.end()); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.map/unorder.map.modifiers/insert_const_lvalue.pass.cpp b/libcxx/test/containers/unord/unord.map/unorder.map.modifiers/insert_const_lvalue.pass.cpp index d9ab4156d4af..8bf66caf806e 100644 --- a/libcxx/test/containers/unord/unord.map/unorder.map.modifiers/insert_const_lvalue.pass.cpp +++ b/libcxx/test/containers/unord/unord.map/unorder.map.modifiers/insert_const_lvalue.pass.cpp @@ -18,6 +18,8 @@ #include #include +#include "../../../min_allocator.h" + int main() { { @@ -49,4 +51,36 @@ int main() assert(r.first->first == 5.5); assert(r.first->second == 4); } +#if __cplusplus >= 201103L + { + typedef std::unordered_map, std::equal_to, + min_allocator>> C; + typedef std::pair R; + typedef C::value_type P; + C c; + R r = c.insert(P(3.5, 3)); + assert(r.second); + assert(c.size() == 1); + assert(r.first->first == 3.5); + assert(r.first->second == 3); + + r = c.insert(P(3.5, 4)); + assert(!r.second); + assert(c.size() == 1); + assert(r.first->first == 3.5); + assert(r.first->second == 3); + + r = c.insert(P(4.5, 4)); + assert(r.second); + assert(c.size() == 2); + assert(r.first->first == 4.5); + assert(r.first->second == 4); + + r = c.insert(P(5.5, 4)); + assert(r.second); + assert(c.size() == 3); + assert(r.first->first == 5.5); + assert(r.first->second == 4); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.map/unorder.map.modifiers/insert_hint_const_lvalue.pass.cpp b/libcxx/test/containers/unord/unord.map/unorder.map.modifiers/insert_hint_const_lvalue.pass.cpp index 0d2ffe3911e0..788105e74590 100644 --- a/libcxx/test/containers/unord/unord.map/unorder.map.modifiers/insert_hint_const_lvalue.pass.cpp +++ b/libcxx/test/containers/unord/unord.map/unorder.map.modifiers/insert_hint_const_lvalue.pass.cpp @@ -18,6 +18,8 @@ #include #include +#include "../../../min_allocator.h" + int main() { { @@ -46,4 +48,33 @@ int main() assert(r->first == 5.5); assert(r->second == 4); } +#if __cplusplus >= 201103L + { + typedef std::unordered_map, std::equal_to, + min_allocator>> C; + typedef C::iterator R; + typedef C::value_type P; + C c; + C::const_iterator e = c.end(); + R r = c.insert(e, P(3.5, 3)); + assert(c.size() == 1); + assert(r->first == 3.5); + assert(r->second == 3); + + r = c.insert(e, P(3.5, 4)); + assert(c.size() == 1); + assert(r->first == 3.5); + assert(r->second == 3); + + r = c.insert(e, P(4.5, 4)); + assert(c.size() == 2); + assert(r->first == 4.5); + assert(r->second == 4); + + r = c.insert(e, P(5.5, 4)); + assert(c.size() == 3); + assert(r->first == 5.5); + assert(r->second == 4); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.map/unorder.map.modifiers/insert_hint_rvalue.pass.cpp b/libcxx/test/containers/unord/unord.map/unorder.map.modifiers/insert_hint_rvalue.pass.cpp index 6fc6e8ed762c..3fef2701b63e 100644 --- a/libcxx/test/containers/unord/unord.map/unorder.map.modifiers/insert_hint_rvalue.pass.cpp +++ b/libcxx/test/containers/unord/unord.map/unorder.map.modifiers/insert_hint_rvalue.pass.cpp @@ -21,6 +21,7 @@ #include #include "../../../MoveOnly.h" +#include "../../../min_allocator.h" int main() { @@ -78,4 +79,62 @@ int main() assert(r->second == 4); } #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES +#if __cplusplus >= 201103L + { + typedef std::unordered_map, std::equal_to, + min_allocator>> C; + typedef C::iterator R; + typedef std::pair P; + C c; + C::const_iterator e = c.end(); + R r = c.insert(e, P(3.5, 3)); + assert(c.size() == 1); + assert(r->first == 3.5); + assert(r->second == 3); + + r = c.insert(e, P(3.5, 4)); + assert(c.size() == 1); + assert(r->first == 3.5); + assert(r->second == 3); + + r = c.insert(e, P(4.5, 4)); + assert(c.size() == 2); + assert(r->first == 4.5); + assert(r->second == 4); + + r = c.insert(e, P(5.5, 4)); + assert(c.size() == 3); + assert(r->first == 5.5); + assert(r->second == 4); + } +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + { + typedef std::unordered_map, std::equal_to, + min_allocator>> C; + typedef C::iterator R; + typedef std::pair P; + C c; + C::const_iterator e = c.end(); + R r = c.insert(e, P(3, 3)); + assert(c.size() == 1); + assert(r->first == 3); + assert(r->second == 3); + + r = c.insert(e, P(3, 4)); + assert(c.size() == 1); + assert(r->first == 3); + assert(r->second == 3); + + r = c.insert(e, P(4, 4)); + assert(c.size() == 2); + assert(r->first == 4); + assert(r->second == 4); + + r = c.insert(e, P(5, 4)); + assert(c.size() == 3); + assert(r->first == 5); + assert(r->second == 4); + } +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES +#endif } diff --git a/libcxx/test/containers/unord/unord.map/unorder.map.modifiers/insert_init.pass.cpp b/libcxx/test/containers/unord/unord.map/unorder.map.modifiers/insert_init.pass.cpp index 532c7cb22cc7..b667c7e45332 100644 --- a/libcxx/test/containers/unord/unord.map/unorder.map.modifiers/insert_init.pass.cpp +++ b/libcxx/test/containers/unord/unord.map/unorder.map.modifiers/insert_init.pass.cpp @@ -20,6 +20,7 @@ #include #include "test_iterators.h" +#include "../../../min_allocator.h" int main() { @@ -44,5 +45,28 @@ int main() assert(c.at(3) == "three"); assert(c.at(4) == "four"); } +#if __cplusplus >= 201103L + { + typedef std::unordered_map, std::equal_to, + min_allocator>> C; + typedef std::pair P; + C c; + c.insert( + { + P(1, "one"), + P(2, "two"), + P(3, "three"), + P(4, "four"), + P(1, "four"), + P(2, "four"), + } + ); + assert(c.size() == 4); + assert(c.at(1) == "one"); + assert(c.at(2) == "two"); + assert(c.at(3) == "three"); + assert(c.at(4) == "four"); + } +#endif #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS } diff --git a/libcxx/test/containers/unord/unord.map/unorder.map.modifiers/insert_range.pass.cpp b/libcxx/test/containers/unord/unord.map/unorder.map.modifiers/insert_range.pass.cpp index eda189a7a1a9..68cb25c8e87f 100644 --- a/libcxx/test/containers/unord/unord.map/unorder.map.modifiers/insert_range.pass.cpp +++ b/libcxx/test/containers/unord/unord.map/unorder.map.modifiers/insert_range.pass.cpp @@ -21,6 +21,7 @@ #include #include "test_iterators.h" +#include "../../../min_allocator.h" int main() { @@ -44,4 +45,27 @@ int main() assert(c.at(3) == "three"); assert(c.at(4) == "four"); } +#if __cplusplus >= 201103L + { + typedef std::unordered_map, std::equal_to, + min_allocator>> C; + typedef std::pair P; + P a[] = + { + P(1, "one"), + P(2, "two"), + P(3, "three"), + P(4, "four"), + P(1, "four"), + P(2, "four"), + }; + C c; + c.insert(input_iterator(a), input_iterator(a + sizeof(a)/sizeof(a[0]))); + assert(c.size() == 4); + assert(c.at(1) == "one"); + assert(c.at(2) == "two"); + assert(c.at(3) == "three"); + assert(c.at(4) == "four"); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.map/unorder.map.modifiers/insert_rvalue.pass.cpp b/libcxx/test/containers/unord/unord.map/unorder.map.modifiers/insert_rvalue.pass.cpp index 3b156ff67f39..3e050e943017 100644 --- a/libcxx/test/containers/unord/unord.map/unorder.map.modifiers/insert_rvalue.pass.cpp +++ b/libcxx/test/containers/unord/unord.map/unorder.map.modifiers/insert_rvalue.pass.cpp @@ -21,6 +21,7 @@ #include #include "../../../MoveOnly.h" +#include "../../../min_allocator.h" int main() { @@ -84,4 +85,68 @@ int main() assert(r.first->second == 4); } #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES +#if __cplusplus >= 201103L + { + typedef std::unordered_map, std::equal_to, + min_allocator>> C; + typedef std::pair R; + typedef std::pair P; + C c; + R r = c.insert(P(3.5, 3)); + assert(r.second); + assert(c.size() == 1); + assert(r.first->first == 3.5); + assert(r.first->second == 3); + + r = c.insert(P(3.5, 4)); + assert(!r.second); + assert(c.size() == 1); + assert(r.first->first == 3.5); + assert(r.first->second == 3); + + r = c.insert(P(4.5, 4)); + assert(r.second); + assert(c.size() == 2); + assert(r.first->first == 4.5); + assert(r.first->second == 4); + + r = c.insert(P(5.5, 4)); + assert(r.second); + assert(c.size() == 3); + assert(r.first->first == 5.5); + assert(r.first->second == 4); + } +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + { + typedef std::unordered_map, std::equal_to, + min_allocator>> C; + typedef std::pair R; + typedef std::pair P; + C c; + R r = c.insert(P(3, 3)); + assert(r.second); + assert(c.size() == 1); + assert(r.first->first == 3); + assert(r.first->second == 3); + + r = c.insert(P(3, 4)); + assert(!r.second); + assert(c.size() == 1); + assert(r.first->first == 3); + assert(r.first->second == 3); + + r = c.insert(P(4, 4)); + assert(r.second); + assert(c.size() == 2); + assert(r.first->first == 4); + assert(r.first->second == 4); + + r = c.insert(P(5, 4)); + assert(r.second); + assert(c.size() == 3); + assert(r.first->first == 5); + assert(r.first->second == 4); + } +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES +#endif } diff --git a/libcxx/test/containers/unord/unord.multimap/bucket.pass.cpp b/libcxx/test/containers/unord/unord.multimap/bucket.pass.cpp index b1f9d36cd507..e53b492bbcc6 100644 --- a/libcxx/test/containers/unord/unord.multimap/bucket.pass.cpp +++ b/libcxx/test/containers/unord/unord.multimap/bucket.pass.cpp @@ -19,6 +19,8 @@ #include #include +#include "../../min_allocator.h" + int main() { { @@ -39,4 +41,25 @@ int main() for (size_t i = 0; i < 13; ++i) assert(c.bucket(i) == i % bc); } +#if __cplusplus >= 201103L + { + typedef std::unordered_multimap, std::equal_to, + min_allocator>> C; + typedef std::pair P; + P a[] = + { + P(1, "one"), + P(2, "two"), + P(3, "three"), + P(4, "four"), + P(1, "four"), + P(2, "four"), + }; + const C c(std::begin(a), std::end(a)); + size_t bc = c.bucket_count(); + assert(bc >= 7); + for (size_t i = 0; i < 13; ++i) + assert(c.bucket(i) == i % bc); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.multimap/bucket_size.pass.cpp b/libcxx/test/containers/unord/unord.multimap/bucket_size.pass.cpp index d8f784a2630c..79e53d2e92ae 100644 --- a/libcxx/test/containers/unord/unord.multimap/bucket_size.pass.cpp +++ b/libcxx/test/containers/unord/unord.multimap/bucket_size.pass.cpp @@ -19,6 +19,8 @@ #include #include +#include "../../min_allocator.h" + int main() { { @@ -43,4 +45,29 @@ int main() assert(c.bucket_size(5) == 0); assert(c.bucket_size(6) == 0); } +#if __cplusplus >= 201103L + { + typedef std::unordered_multimap, std::equal_to, + min_allocator>> C; + typedef std::pair P; + P a[] = + { + P(1, "one"), + P(2, "two"), + P(3, "three"), + P(4, "four"), + P(1, "four"), + P(2, "four"), + }; + const C c(std::begin(a), std::end(a)); + assert(c.bucket_count() >= 7); + assert(c.bucket_size(0) == 0); + assert(c.bucket_size(1) == 2); + assert(c.bucket_size(2) == 2); + assert(c.bucket_size(3) == 1); + assert(c.bucket_size(4) == 1); + assert(c.bucket_size(5) == 0); + assert(c.bucket_size(6) == 0); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.multimap/count.pass.cpp b/libcxx/test/containers/unord/unord.multimap/count.pass.cpp index 3bfac4da07c1..a1d0432b3c5d 100644 --- a/libcxx/test/containers/unord/unord.multimap/count.pass.cpp +++ b/libcxx/test/containers/unord/unord.multimap/count.pass.cpp @@ -19,6 +19,8 @@ #include #include +#include "../../min_allocator.h" + int main() { { @@ -42,4 +44,28 @@ int main() assert(c.count(50) == 3); assert(c.count(5) == 0); } +#if __cplusplus >= 201103L + { + typedef std::unordered_multimap, std::equal_to, + min_allocator>> C; + typedef std::pair P; + P a[] = + { + P(10, "ten"), + P(20, "twenty"), + P(30, "thirty"), + P(40, "fourty"), + P(50, "fifty"), + P(50, "fiftyA"), + P(50, "fiftyB"), + P(60, "sixty"), + P(70, "seventy"), + P(80, "eighty"), + }; + const C c(std::begin(a), std::end(a)); + assert(c.count(30) == 1); + assert(c.count(50) == 3); + assert(c.count(5) == 0); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.multimap/eq.pass.cpp b/libcxx/test/containers/unord/unord.multimap/eq.pass.cpp index 6461cae14908..b069ded55afb 100644 --- a/libcxx/test/containers/unord/unord.multimap/eq.pass.cpp +++ b/libcxx/test/containers/unord/unord.multimap/eq.pass.cpp @@ -23,6 +23,8 @@ #include #include +#include "../../min_allocator.h" + int main() { { @@ -98,4 +100,82 @@ int main() assert( (c1 == c2)); assert(!(c1 != c2)); } +#if __cplusplus >= 201103L + { + typedef std::unordered_multimap, std::equal_to, + min_allocator>> C; + typedef std::pair P; + P a[] = + { + P(10, "ten"), + P(20, "twenty"), + P(20, "twenty 2"), + P(30, "thirty"), + P(40, "fourty"), + P(50, "fifty"), + P(50, "fifty 2"), + P(50, "fifty 3"), + P(60, "sixty"), + P(70, "seventy"), + P(80, "eighty"), + }; + const C c1(std::begin(a), std::end(a)); + const C c2; + assert(!(c1 == c2)); + assert( (c1 != c2)); + } + { + typedef std::unordered_multimap, std::equal_to, + min_allocator>> C; + typedef std::pair P; + P a[] = + { + P(10, "ten"), + P(20, "twenty"), + P(20, "twenty 2"), + P(30, "thirty"), + P(40, "fourty"), + P(50, "fifty"), + P(50, "fifty 2"), + P(50, "fifty 3"), + P(60, "sixty"), + P(70, "seventy"), + P(80, "eighty"), + }; + const C c1(std::begin(a), std::end(a)); + const C c2 = c1; + assert( (c1 == c2)); + assert(!(c1 != c2)); + } + { + typedef std::unordered_multimap, std::equal_to, + min_allocator>> C; + typedef std::pair P; + P a[] = + { + P(10, "ten"), + P(20, "twenty"), + P(20, "twenty 2"), + P(30, "thirty"), + P(40, "fourty"), + P(50, "fifty"), + P(50, "fifty 2"), + P(50, "fifty 3"), + P(60, "sixty"), + P(70, "seventy"), + P(80, "eighty"), + }; + C c1(std::begin(a), std::end(a)); + C c2 = c1; + c2.rehash(30); + assert( (c1 == c2)); + assert(!(c1 != c2)); + c2.insert(P(90, "ninety")); + assert(!(c1 == c2)); + assert( (c1 != c2)); + c1.insert(P(90, "ninety")); + assert( (c1 == c2)); + assert(!(c1 != c2)); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.multimap/equal_range_const.pass.cpp b/libcxx/test/containers/unord/unord.multimap/equal_range_const.pass.cpp index 394ebb8b1f2d..bc0c703bf81f 100644 --- a/libcxx/test/containers/unord/unord.multimap/equal_range_const.pass.cpp +++ b/libcxx/test/containers/unord/unord.multimap/equal_range_const.pass.cpp @@ -19,6 +19,8 @@ #include #include +#include "../../min_allocator.h" + int main() { { @@ -55,4 +57,41 @@ int main() assert(r.first->first == 50); assert(r.first->second == "fiftyB"); } +#if __cplusplus >= 201103L + { + typedef std::unordered_multimap, std::equal_to, + min_allocator>> C; + typedef C::const_iterator I; + typedef std::pair P; + P a[] = + { + P(10, "ten"), + P(20, "twenty"), + P(30, "thirty"), + P(40, "fourty"), + P(50, "fifty"), + P(50, "fiftyA"), + P(50, "fiftyB"), + P(60, "sixty"), + P(70, "seventy"), + P(80, "eighty"), + }; + const C c(std::begin(a), std::end(a)); + std::pair r = c.equal_range(30); + assert(std::distance(r.first, r.second) == 1); + assert(r.first->first == 30); + assert(r.first->second == "thirty"); + r = c.equal_range(5); + assert(std::distance(r.first, r.second) == 0); + r = c.equal_range(50); + assert(r.first->first == 50); + assert(r.first->second == "fifty"); + ++r.first; + assert(r.first->first == 50); + assert(r.first->second == "fiftyA"); + ++r.first; + assert(r.first->first == 50); + assert(r.first->second == "fiftyB"); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.multimap/equal_range_non_const.pass.cpp b/libcxx/test/containers/unord/unord.multimap/equal_range_non_const.pass.cpp index 3fe83faac3c5..8b78f70b5158 100644 --- a/libcxx/test/containers/unord/unord.multimap/equal_range_non_const.pass.cpp +++ b/libcxx/test/containers/unord/unord.multimap/equal_range_non_const.pass.cpp @@ -19,6 +19,8 @@ #include #include +#include "../../min_allocator.h" + int main() { { @@ -55,4 +57,41 @@ int main() assert(r.first->first == 50); assert(r.first->second == "fiftyB"); } +#if __cplusplus >= 201103L + { + typedef std::unordered_multimap, std::equal_to, + min_allocator>> C; + typedef C::iterator I; + typedef std::pair P; + P a[] = + { + P(10, "ten"), + P(20, "twenty"), + P(30, "thirty"), + P(40, "fourty"), + P(50, "fifty"), + P(50, "fiftyA"), + P(50, "fiftyB"), + P(60, "sixty"), + P(70, "seventy"), + P(80, "eighty"), + }; + C c(std::begin(a), std::end(a)); + std::pair r = c.equal_range(30); + assert(std::distance(r.first, r.second) == 1); + assert(r.first->first == 30); + assert(r.first->second == "thirty"); + r = c.equal_range(5); + assert(std::distance(r.first, r.second) == 0); + r = c.equal_range(50); + assert(r.first->first == 50); + assert(r.first->second == "fifty"); + ++r.first; + assert(r.first->first == 50); + assert(r.first->second == "fiftyA"); + ++r.first; + assert(r.first->first == 50); + assert(r.first->second == "fiftyB"); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.multimap/find_const.pass.cpp b/libcxx/test/containers/unord/unord.multimap/find_const.pass.cpp index 8700dcf39962..b967a5132f45 100644 --- a/libcxx/test/containers/unord/unord.multimap/find_const.pass.cpp +++ b/libcxx/test/containers/unord/unord.multimap/find_const.pass.cpp @@ -19,6 +19,8 @@ #include #include +#include "../../min_allocator.h" + int main() { { @@ -42,4 +44,28 @@ int main() i = c.find(5); assert(i == c.cend()); } +#if __cplusplus >= 201103L + { + typedef std::unordered_multimap, std::equal_to, + min_allocator>> C; + typedef std::pair P; + P a[] = + { + P(10, "ten"), + P(20, "twenty"), + P(30, "thirty"), + P(40, "fourty"), + P(50, "fifty"), + P(60, "sixty"), + P(70, "seventy"), + P(80, "eighty"), + }; + const C c(std::begin(a), std::end(a)); + C::const_iterator i = c.find(30); + assert(i->first == 30); + assert(i->second == "thirty"); + i = c.find(5); + assert(i == c.cend()); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.multimap/find_non_const.pass.cpp b/libcxx/test/containers/unord/unord.multimap/find_non_const.pass.cpp index cb3aab9d9b63..8da85ba9aa5b 100644 --- a/libcxx/test/containers/unord/unord.multimap/find_non_const.pass.cpp +++ b/libcxx/test/containers/unord/unord.multimap/find_non_const.pass.cpp @@ -19,6 +19,8 @@ #include #include +#include "../../min_allocator.h" + int main() { { @@ -42,4 +44,28 @@ int main() i = c.find(5); assert(i == c.end()); } +#if __cplusplus >= 201103L + { + typedef std::unordered_multimap, std::equal_to, + min_allocator>> C; + typedef std::pair P; + P a[] = + { + P(10, "ten"), + P(20, "twenty"), + P(30, "thirty"), + P(40, "fourty"), + P(50, "fifty"), + P(60, "sixty"), + P(70, "seventy"), + P(80, "eighty"), + }; + C c(std::begin(a), std::end(a)); + C::iterator i = c.find(30); + assert(i->first == 30); + assert(i->second == "thirty"); + i = c.find(5); + assert(i == c.end()); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.multimap/iterators.pass.cpp b/libcxx/test/containers/unord/unord.multimap/iterators.pass.cpp index 573fc63058da..c2fc44bcbb61 100644 --- a/libcxx/test/containers/unord/unord.multimap/iterators.pass.cpp +++ b/libcxx/test/containers/unord/unord.multimap/iterators.pass.cpp @@ -24,6 +24,8 @@ #include #include +#include "../../min_allocator.h" + int main() { { @@ -67,4 +69,49 @@ int main() assert(std::distance(c.cbegin(), c.cend()) == c.size()); C::const_iterator i; } +#if __cplusplus >= 201103L + { + typedef std::unordered_multimap, std::equal_to, + min_allocator>> C; + typedef std::pair P; + P a[] = + { + P(1, "one"), + P(2, "two"), + P(3, "three"), + P(4, "four"), + P(1, "four"), + P(2, "four"), + }; + C c(a, a + sizeof(a)/sizeof(a[0])); + assert(c.bucket_count() >= 7); + assert(c.size() == 6); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + C::iterator i; + i = c.begin(); + i->second = "ONE"; + assert(i->second == "ONE"); + } + { + typedef std::unordered_multimap, std::equal_to, + min_allocator>> C; + typedef std::pair P; + P a[] = + { + P(1, "one"), + P(2, "two"), + P(3, "three"), + P(4, "four"), + P(1, "four"), + P(2, "four"), + }; + const C c(a, a + sizeof(a)/sizeof(a[0])); + assert(c.bucket_count() >= 7); + assert(c.size() == 6); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + C::const_iterator i; + } +#endif } diff --git a/libcxx/test/containers/unord/unord.multimap/load_factor.pass.cpp b/libcxx/test/containers/unord/unord.multimap/load_factor.pass.cpp index 250509d2d284..29cf689e0018 100644 --- a/libcxx/test/containers/unord/unord.multimap/load_factor.pass.cpp +++ b/libcxx/test/containers/unord/unord.multimap/load_factor.pass.cpp @@ -20,6 +20,8 @@ #include #include +#include "../../min_allocator.h" + int main() { { @@ -45,4 +47,31 @@ int main() const C c; assert(c.load_factor() == 0); } +#if __cplusplus >= 201103L + { + typedef std::unordered_multimap, std::equal_to, + min_allocator>> C; + typedef std::pair P; + P a[] = + { + P(10, "ten"), + P(20, "twenty"), + P(30, "thirty"), + P(40, "fourty"), + P(50, "fifty"), + P(60, "sixty"), + P(70, "seventy"), + P(80, "eighty"), + }; + const C c(std::begin(a), std::end(a)); + assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); + } + { + typedef std::unordered_multimap, std::equal_to, + min_allocator>> C; + typedef std::pair P; + const C c; + assert(c.load_factor() == 0); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.multimap/local_iterators.pass.cpp b/libcxx/test/containers/unord/unord.multimap/local_iterators.pass.cpp index 7a292f90a5dd..695953d0012a 100644 --- a/libcxx/test/containers/unord/unord.multimap/local_iterators.pass.cpp +++ b/libcxx/test/containers/unord/unord.multimap/local_iterators.pass.cpp @@ -24,6 +24,8 @@ #include #include +#include "../../min_allocator.h" + int main() { { @@ -282,4 +284,266 @@ int main() j = c.cend(b); assert(std::distance(i, j) == 0); } +#if __cplusplus >= 201103L + { + typedef std::unordered_multimap, std::equal_to, + min_allocator>> C; + typedef std::pair P; + typedef C::local_iterator I; + P a[] = + { + P(1, "one"), + P(2, "two"), + P(3, "three"), + P(4, "four"), + P(1, "four"), + P(2, "four"), + }; + C c(a, a + sizeof(a)/sizeof(a[0])); + assert(c.bucket_count() >= 7); + C::size_type b = c.bucket(0); + I i = c.begin(b); + I j = c.end(b); + assert(std::distance(i, j) == 0); + + b = c.bucket(1); + i = c.begin(b); + j = c.end(b); + assert(std::distance(i, j) == 2); + assert(i->first == 1); + assert(i->second == "one"); + ++i; + assert(i->first == 1); + assert(i->second == "four"); + + b = c.bucket(2); + i = c.begin(b); + j = c.end(b); + assert(std::distance(i, j) == 2); + assert(i->first == 2); + assert(i->second == "two"); + ++i; + assert(i->first == 2); + assert(i->second == "four"); + + b = c.bucket(3); + i = c.begin(b); + j = c.end(b); + assert(std::distance(i, j) == 1); + assert(i->first == 3); + assert(i->second == "three"); + + b = c.bucket(4); + i = c.begin(b); + j = c.end(b); + assert(std::distance(i, j) == 1); + assert(i->first == 4); + assert(i->second == "four"); + + b = c.bucket(5); + i = c.begin(b); + j = c.end(b); + assert(std::distance(i, j) == 0); + + b = c.bucket(6); + i = c.begin(b); + j = c.end(b); + assert(std::distance(i, j) == 0); + } + { + typedef std::unordered_multimap, std::equal_to, + min_allocator>> C; + typedef std::pair P; + typedef C::const_local_iterator I; + P a[] = + { + P(1, "one"), + P(2, "two"), + P(3, "three"), + P(4, "four"), + P(1, "four"), + P(2, "four"), + }; + const C c(a, a + sizeof(a)/sizeof(a[0])); + assert(c.bucket_count() >= 7); + C::size_type b = c.bucket(0); + I i = c.begin(b); + I j = c.end(b); + assert(std::distance(i, j) == 0); + + b = c.bucket(1); + i = c.begin(b); + j = c.end(b); + assert(std::distance(i, j) == 2); + assert(i->first == 1); + assert(i->second == "one"); + ++i; + assert(i->first == 1); + assert(i->second == "four"); + + b = c.bucket(2); + i = c.begin(b); + j = c.end(b); + assert(std::distance(i, j) == 2); + assert(i->first == 2); + assert(i->second == "two"); + ++i; + assert(i->first == 2); + assert(i->second == "four"); + + b = c.bucket(3); + i = c.begin(b); + j = c.end(b); + assert(std::distance(i, j) == 1); + assert(i->first == 3); + assert(i->second == "three"); + + b = c.bucket(4); + i = c.begin(b); + j = c.end(b); + assert(std::distance(i, j) == 1); + assert(i->first == 4); + assert(i->second == "four"); + + b = c.bucket(5); + i = c.begin(b); + j = c.end(b); + assert(std::distance(i, j) == 0); + + b = c.bucket(6); + i = c.begin(b); + j = c.end(b); + assert(std::distance(i, j) == 0); + } + { + typedef std::unordered_multimap, std::equal_to, + min_allocator>> C; + typedef std::pair P; + typedef C::const_local_iterator I; + P a[] = + { + P(1, "one"), + P(2, "two"), + P(3, "three"), + P(4, "four"), + P(1, "four"), + P(2, "four"), + }; + C c(a, a + sizeof(a)/sizeof(a[0])); + assert(c.bucket_count() >= 7); + C::size_type b = c.bucket(0); + I i = c.cbegin(b); + I j = c.cend(b); + assert(std::distance(i, j) == 0); + + b = c.bucket(1); + i = c.cbegin(b); + j = c.cend(b); + assert(std::distance(i, j) == 2); + assert(i->first == 1); + assert(i->second == "one"); + ++i; + assert(i->first == 1); + assert(i->second == "four"); + + b = c.bucket(2); + i = c.cbegin(b); + j = c.cend(b); + assert(std::distance(i, j) == 2); + assert(i->first == 2); + assert(i->second == "two"); + ++i; + assert(i->first == 2); + assert(i->second == "four"); + + b = c.bucket(3); + i = c.cbegin(b); + j = c.cend(b); + assert(std::distance(i, j) == 1); + assert(i->first == 3); + assert(i->second == "three"); + + b = c.bucket(4); + i = c.cbegin(b); + j = c.cend(b); + assert(std::distance(i, j) == 1); + assert(i->first == 4); + assert(i->second == "four"); + + b = c.bucket(5); + i = c.cbegin(b); + j = c.cend(b); + assert(std::distance(i, j) == 0); + + b = c.bucket(6); + i = c.cbegin(b); + j = c.cend(b); + assert(std::distance(i, j) == 0); + } + { + typedef std::unordered_multimap, std::equal_to, + min_allocator>> C; + typedef std::pair P; + typedef C::const_local_iterator I; + P a[] = + { + P(1, "one"), + P(2, "two"), + P(3, "three"), + P(4, "four"), + P(1, "four"), + P(2, "four"), + }; + const C c(a, a + sizeof(a)/sizeof(a[0])); + assert(c.bucket_count() >= 7); + C::size_type b = c.bucket(0); + I i = c.cbegin(b); + I j = c.cend(b); + assert(std::distance(i, j) == 0); + + b = c.bucket(1); + i = c.cbegin(b); + j = c.cend(b); + assert(std::distance(i, j) == 2); + assert(i->first == 1); + assert(i->second == "one"); + ++i; + assert(i->first == 1); + assert(i->second == "four"); + + b = c.bucket(2); + i = c.cbegin(b); + j = c.cend(b); + assert(std::distance(i, j) == 2); + assert(i->first == 2); + assert(i->second == "two"); + ++i; + assert(i->first == 2); + assert(i->second == "four"); + + b = c.bucket(3); + i = c.cbegin(b); + j = c.cend(b); + assert(std::distance(i, j) == 1); + assert(i->first == 3); + assert(i->second == "three"); + + b = c.bucket(4); + i = c.cbegin(b); + j = c.cend(b); + assert(std::distance(i, j) == 1); + assert(i->first == 4); + assert(i->second == "four"); + + b = c.bucket(5); + i = c.cbegin(b); + j = c.cend(b); + assert(std::distance(i, j) == 0); + + b = c.bucket(6); + i = c.cbegin(b); + j = c.cend(b); + assert(std::distance(i, j) == 0); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.multimap/max_bucket_count.pass.cpp b/libcxx/test/containers/unord/unord.multimap/max_bucket_count.pass.cpp index e512eb888619..0504db0666ea 100644 --- a/libcxx/test/containers/unord/unord.multimap/max_bucket_count.pass.cpp +++ b/libcxx/test/containers/unord/unord.multimap/max_bucket_count.pass.cpp @@ -19,6 +19,8 @@ #include #include +#include "../../min_allocator.h" + int main() { { @@ -28,4 +30,14 @@ int main() const C c; assert(c.max_bucket_count() > 0); } +#if __cplusplus >= 201103L + { + typedef std::unordered_multimap, std::equal_to, + min_allocator>> C; + typedef C::const_iterator I; + typedef std::pair P; + const C c; + assert(c.max_bucket_count() > 0); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.multimap/max_load_factor.pass.cpp b/libcxx/test/containers/unord/unord.multimap/max_load_factor.pass.cpp index 1d30084fdd56..5fcca6b13feb 100644 --- a/libcxx/test/containers/unord/unord.multimap/max_load_factor.pass.cpp +++ b/libcxx/test/containers/unord/unord.multimap/max_load_factor.pass.cpp @@ -20,6 +20,8 @@ #include #include +#include "../../min_allocator.h" + int main() { { @@ -36,4 +38,22 @@ int main() c.max_load_factor(2.5); assert(c.max_load_factor() == 2.5); } +#if __cplusplus >= 201103L + { + typedef std::unordered_multimap, std::equal_to, + min_allocator>> C; + typedef std::pair P; + const C c; + assert(c.max_load_factor() == 1); + } + { + typedef std::unordered_multimap, std::equal_to, + min_allocator>> C; + typedef std::pair P; + C c; + assert(c.max_load_factor() == 1); + c.max_load_factor(2.5); + assert(c.max_load_factor() == 2.5); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.multimap/max_size.pass.cpp b/libcxx/test/containers/unord/unord.multimap/max_size.pass.cpp index b9e72a829581..ac247d7674c5 100644 --- a/libcxx/test/containers/unord/unord.multimap/max_size.pass.cpp +++ b/libcxx/test/containers/unord/unord.multimap/max_size.pass.cpp @@ -18,10 +18,19 @@ #include #include +#include "../../min_allocator.h" + int main() { { std::unordered_multimap u; assert(u.max_size() > 0); } +#if __cplusplus >= 201103L + { + std::unordered_multimap, std::equal_to, + min_allocator>> u; + assert(u.max_size() > 0); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.multimap/rehash.pass.cpp b/libcxx/test/containers/unord/unord.multimap/rehash.pass.cpp index 42764360abd8..e722c04ac9ee 100644 --- a/libcxx/test/containers/unord/unord.multimap/rehash.pass.cpp +++ b/libcxx/test/containers/unord/unord.multimap/rehash.pass.cpp @@ -20,14 +20,16 @@ #include #include -void test(const std::unordered_multimap& c) +#include "../../min_allocator.h" + +template +void test(const C& c) { - typedef std::unordered_multimap C; assert(c.size() == 6); - typedef std::pair Eq; + typedef std::pair Eq; Eq eq = c.equal_range(1); assert(std::distance(eq.first, eq.second) == 2); - C::const_iterator i = eq.first; + typename C::const_iterator i = eq.first; assert(i->first == 1); assert(i->second == "one"); ++i; @@ -85,4 +87,33 @@ int main() assert(c.bucket_count() == 31); test(c); } +#if __cplusplus >= 201103L + { + typedef std::unordered_multimap, std::equal_to, + min_allocator>> C; + typedef std::pair P; + P a[] = + { + P(1, "one"), + P(2, "two"), + P(3, "three"), + P(4, "four"), + P(1, "four"), + P(2, "four"), + }; + C c(a, a + sizeof(a)/sizeof(a[0])); + test(c); + assert(c.bucket_count() >= 7); + c.rehash(3); + assert(c.bucket_count() == 7); + test(c); + c.max_load_factor(2); + c.rehash(3); + assert(c.bucket_count() == 3); + test(c); + c.rehash(31); + assert(c.bucket_count() == 31); + test(c); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.multimap/reserve.pass.cpp b/libcxx/test/containers/unord/unord.multimap/reserve.pass.cpp index 3f652ad46888..f13ae73b0bdc 100644 --- a/libcxx/test/containers/unord/unord.multimap/reserve.pass.cpp +++ b/libcxx/test/containers/unord/unord.multimap/reserve.pass.cpp @@ -19,7 +19,10 @@ #include #include -void test(const std::unordered_multimap& c) +#include "../../min_allocator.h" + +template +void test(const C& c) { assert(c.size() == 6); assert(c.find(1)->second == "one"); @@ -58,4 +61,33 @@ int main() assert(c.bucket_count() >= 16); test(c); } +#if __cplusplus >= 201103L + { + typedef std::unordered_multimap, std::equal_to, + min_allocator>> C; + typedef std::pair P; + P a[] = + { + P(1, "one"), + P(2, "two"), + P(3, "three"), + P(4, "four"), + P(1, "four"), + P(2, "four"), + }; + C c(a, a + sizeof(a)/sizeof(a[0])); + test(c); + assert(c.bucket_count() >= 7); + c.reserve(3); + assert(c.bucket_count() == 7); + test(c); + c.max_load_factor(2); + c.reserve(3); + assert(c.bucket_count() == 3); + test(c); + c.reserve(31); + assert(c.bucket_count() >= 16); + test(c); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.multimap/swap_member.pass.cpp b/libcxx/test/containers/unord/unord.multimap/swap_member.pass.cpp index 2388e5266a84..41b34ddae75d 100644 --- a/libcxx/test/containers/unord/unord.multimap/swap_member.pass.cpp +++ b/libcxx/test/containers/unord/unord.multimap/swap_member.pass.cpp @@ -23,6 +23,8 @@ #include "../../test_hash.h" #include "../../test_allocator.h" +#include "../../min_allocator.h" + int main() { { @@ -394,4 +396,190 @@ int main() assert(std::distance(c2.cbegin(), c2.cend()) == c2.size()); assert(c2.max_load_factor() == 1); } +#if __cplusplus >= 201103L + { + typedef test_hash > Hash; + typedef test_compare > Compare; + typedef min_allocator > Alloc; + typedef std::unordered_multimap C; + typedef std::pair P; + C c1(0, Hash(1), Compare(1), Alloc()); + C c2(0, Hash(2), Compare(2), Alloc()); + c2.max_load_factor(2); + c1.swap(c2); + + assert(c1.bucket_count() == 0); + assert(c1.size() == 0); + assert(c1.hash_function() == Hash(2)); + assert(c1.key_eq() == Compare(2)); + assert(c1.get_allocator() == Alloc()); + assert(std::distance(c1.begin(), c1.end()) == c1.size()); + assert(std::distance(c1.cbegin(), c1.cend()) == c1.size()); + assert(c1.max_load_factor() == 2); + + assert(c2.bucket_count() == 0); + assert(c2.size() == 0); + assert(c2.hash_function() == Hash(1)); + assert(c2.key_eq() == Compare(1)); + assert(c2.get_allocator() == Alloc()); + assert(std::distance(c2.begin(), c2.end()) == c2.size()); + assert(std::distance(c2.cbegin(), c2.cend()) == c2.size()); + assert(c2.max_load_factor() == 1); + } + { + typedef test_hash > Hash; + typedef test_compare > Compare; + typedef min_allocator > Alloc; + typedef std::unordered_multimap C; + typedef std::pair P; + P a2[] = + { + P(10, "ten"), + P(20, "twenty"), + P(30, "thirty"), + P(40, "fourty"), + P(50, "fifty"), + P(60, "sixty"), + P(70, "seventy"), + P(80, "eighty"), + }; + C c1(0, Hash(1), Compare(1), Alloc()); + C c2(std::begin(a2), std::end(a2), 0, Hash(2), Compare(2), Alloc()); + c2.max_load_factor(2); + c1.swap(c2); + + assert(c1.bucket_count() >= 11); + assert(c1.size() == 8); + assert(c1.find(10)->second == "ten"); + assert(c1.find(20)->second == "twenty"); + assert(c1.find(30)->second == "thirty"); + assert(c1.find(40)->second == "fourty"); + assert(c1.find(50)->second == "fifty"); + assert(c1.find(60)->second == "sixty"); + assert(c1.find(70)->second == "seventy"); + assert(c1.find(80)->second == "eighty"); + assert(c1.hash_function() == Hash(2)); + assert(c1.key_eq() == Compare(2)); + assert(c1.get_allocator() == Alloc()); + assert(std::distance(c1.begin(), c1.end()) == c1.size()); + assert(std::distance(c1.cbegin(), c1.cend()) == c1.size()); + assert(c1.max_load_factor() == 2); + + assert(c2.bucket_count() == 0); + assert(c2.size() == 0); + assert(c2.hash_function() == Hash(1)); + assert(c2.key_eq() == Compare(1)); + assert(c2.get_allocator() == Alloc()); + assert(std::distance(c2.begin(), c2.end()) == c2.size()); + assert(std::distance(c2.cbegin(), c2.cend()) == c2.size()); + assert(c2.max_load_factor() == 1); + } + { + typedef test_hash > Hash; + typedef test_compare > Compare; + typedef min_allocator > Alloc; + typedef std::unordered_multimap C; + typedef std::pair P; + P a1[] = + { + P(1, "one"), + P(2, "two"), + P(3, "three"), + P(4, "four"), + P(1, "four"), + P(2, "four"), + }; + C c1(std::begin(a1), std::end(a1), 0, Hash(1), Compare(1), Alloc()); + C c2(0, Hash(2), Compare(2), Alloc()); + c2.max_load_factor(2); + c1.swap(c2); + + assert(c1.bucket_count() == 0); + assert(c1.size() == 0); + assert(c1.hash_function() == Hash(2)); + assert(c1.key_eq() == Compare(2)); + assert(c1.get_allocator() == Alloc()); + assert(std::distance(c1.begin(), c1.end()) == c1.size()); + assert(std::distance(c1.cbegin(), c1.cend()) == c1.size()); + assert(c1.max_load_factor() == 2); + + assert(c2.bucket_count() >= 7); + assert(c2.size() == 6); + assert(c2.find(1)->second == "one"); + assert(next(c2.find(1))->second == "four"); + assert(c2.find(2)->second == "two"); + assert(next(c2.find(2))->second == "four"); + assert(c2.find(3)->second == "three"); + assert(c2.find(4)->second == "four"); + assert(c2.hash_function() == Hash(1)); + assert(c2.key_eq() == Compare(1)); + assert(c2.get_allocator() == Alloc()); + assert(std::distance(c2.begin(), c2.end()) == c2.size()); + assert(std::distance(c2.cbegin(), c2.cend()) == c2.size()); + assert(c2.max_load_factor() == 1); + } + { + typedef test_hash > Hash; + typedef test_compare > Compare; + typedef min_allocator > Alloc; + typedef std::unordered_multimap C; + typedef std::pair P; + P a1[] = + { + P(1, "one"), + P(2, "two"), + P(3, "three"), + P(4, "four"), + P(1, "four"), + P(2, "four"), + }; + P a2[] = + { + P(10, "ten"), + P(20, "twenty"), + P(30, "thirty"), + P(40, "fourty"), + P(50, "fifty"), + P(60, "sixty"), + P(70, "seventy"), + P(80, "eighty"), + }; + C c1(std::begin(a1), std::end(a1), 0, Hash(1), Compare(1), Alloc()); + C c2(std::begin(a2), std::end(a2), 0, Hash(2), Compare(2), Alloc()); + c2.max_load_factor(2); + c1.swap(c2); + + assert(c1.bucket_count() >= 11); + assert(c1.size() == 8); + assert(c1.find(10)->second == "ten"); + assert(c1.find(20)->second == "twenty"); + assert(c1.find(30)->second == "thirty"); + assert(c1.find(40)->second == "fourty"); + assert(c1.find(50)->second == "fifty"); + assert(c1.find(60)->second == "sixty"); + assert(c1.find(70)->second == "seventy"); + assert(c1.find(80)->second == "eighty"); + assert(c1.hash_function() == Hash(2)); + assert(c1.key_eq() == Compare(2)); + assert(c1.get_allocator() == Alloc()); + assert(std::distance(c1.begin(), c1.end()) == c1.size()); + assert(std::distance(c1.cbegin(), c1.cend()) == c1.size()); + assert(c1.max_load_factor() == 2); + + assert(c2.bucket_count() >= 7); + assert(c2.size() == 6); + assert(c2.find(1)->second == "one"); + assert(next(c2.find(1))->second == "four"); + assert(c2.find(2)->second == "two"); + assert(next(c2.find(2))->second == "four"); + assert(c2.find(3)->second == "three"); + assert(c2.find(4)->second == "four"); + assert(c2.hash_function() == Hash(1)); + assert(c2.key_eq() == Compare(1)); + assert(c2.get_allocator() == Alloc()); + assert(std::distance(c2.begin(), c2.end()) == c2.size()); + assert(std::distance(c2.cbegin(), c2.cend()) == c2.size()); + assert(c2.max_load_factor() == 1); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.multimap/types.pass.cpp b/libcxx/test/containers/unord/unord.multimap/types.pass.cpp index 13cd3d7610b7..369063cffd4a 100644 --- a/libcxx/test/containers/unord/unord.multimap/types.pass.cpp +++ b/libcxx/test/containers/unord/unord.multimap/types.pass.cpp @@ -31,6 +31,8 @@ #include #include +#include "../../min_allocator.h" + int main() { { @@ -48,4 +50,22 @@ int main() static_assert((std::is_same::value), ""); static_assert((std::is_same::value), ""); } +#if __cplusplus >= 201103L + { + typedef std::unordered_multimap, std::equal_to, + min_allocator>> C; + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same >::value), ""); + static_assert((std::is_same >::value), ""); + static_assert((std::is_same >::value), ""); + static_assert((std::is_same >::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same>::value), ""); + static_assert((std::is_same>::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/allocator.pass.cpp b/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/allocator.pass.cpp index bc3a2feb68a7..1f7f4034057d 100644 --- a/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/allocator.pass.cpp +++ b/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/allocator.pass.cpp @@ -22,6 +22,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -44,4 +45,25 @@ int main() assert(c.load_factor() == 0); assert(c.max_load_factor() == 1); } +#if __cplusplus >= 201103L + { + typedef std::unordered_multimap >, + test_compare >, + min_allocator > + > C; + C c(min_allocator >{}); + assert(c.bucket_count() == 0); + assert(c.hash_function() == test_hash >()); + assert(c.key_eq() == test_compare >()); + assert(c.get_allocator() == + (min_allocator >())); + assert(c.size() == 0); + assert(c.empty()); + assert(std::distance(c.begin(), c.end()) == 0); + assert(c.load_factor() == 0); + assert(c.max_load_factor() == 1); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/assign_copy.pass.cpp b/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/assign_copy.pass.cpp index 54d42dceeab1..5c074ec4ed41 100644 --- a/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/assign_copy.pass.cpp +++ b/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/assign_copy.pass.cpp @@ -23,6 +23,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -144,4 +145,65 @@ int main() assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); assert(c.max_load_factor() == 1); } +#if __cplusplus >= 201103L + { + typedef min_allocator > A; + typedef std::unordered_multimap >, + test_compare >, + A + > C; + typedef std::pair P; + P a[] = + { + P(1, "one"), + P(2, "two"), + P(3, "three"), + P(4, "four"), + P(1, "four"), + P(2, "four"), + }; + C c0(a, a + sizeof(a)/sizeof(a[0]), + 7, + test_hash >(8), + test_compare >(9), + A() + ); + C c(a, a + 2, + 7, + test_hash >(2), + test_compare >(3), + A() + ); + c = c0; + assert(c.bucket_count() == 7); + assert(c.size() == 6); + C::const_iterator i = c.cbegin(); + assert(i->first == 1); + assert(i->second == "one"); + ++i; + assert(i->first == 1); + assert(i->second == "four"); + ++i; + assert(i->first == 2); + assert(i->second == "two"); + ++i; + assert(i->first == 2); + assert(i->second == "four"); + ++i; + assert(i->first == 3); + assert(i->second == "three"); + ++i; + assert(i->first == 4); + assert(i->second == "four"); + assert(c.hash_function() == test_hash >(8)); + assert(c.key_eq() == test_compare >(9)); + assert(c.get_allocator() == A()); + assert(!c.empty()); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); + assert(c.max_load_factor() == 1); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/assign_init.pass.cpp b/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/assign_init.pass.cpp index a80870865f1b..a48f2ea05e5f 100644 --- a/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/assign_init.pass.cpp +++ b/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/assign_init.pass.cpp @@ -23,6 +23,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -83,5 +84,63 @@ int main() assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); assert(c.max_load_factor() == 1); } +#if __cplusplus >= 201103L + { + typedef min_allocator > A; + typedef std::unordered_multimap >, + test_compare >, + A + > C; + typedef std::pair P; + C c = { + P(4, "four"), + P(1, "four"), + P(2, "four"), + }; + c = { + P(1, "one"), + P(2, "two"), + P(3, "three"), + P(4, "four"), + P(1, "four"), + P(2, "four"), + }; + assert(c.bucket_count() >= 7); + assert(c.size() == 6); + typedef std::pair Eq; + Eq eq = c.equal_range(1); + assert(std::distance(eq.first, eq.second) == 2); + C::const_iterator i = eq.first; + assert(i->first == 1); + assert(i->second == "one"); + ++i; + assert(i->first == 1); + assert(i->second == "four"); + eq = c.equal_range(2); + assert(std::distance(eq.first, eq.second) == 2); + i = eq.first; + assert(i->first == 2); + assert(i->second == "two"); + ++i; + assert(i->first == 2); + assert(i->second == "four"); + + eq = c.equal_range(3); + assert(std::distance(eq.first, eq.second) == 1); + i = eq.first; + assert(i->first == 3); + assert(i->second == "three"); + eq = c.equal_range(4); + assert(std::distance(eq.first, eq.second) == 1); + i = eq.first; + assert(i->first == 4); + assert(i->second == "four"); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); + assert(c.max_load_factor() == 1); + } +#endif #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS } diff --git a/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/assign_move.pass.cpp b/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/assign_move.pass.cpp index f01b6fda6c3c..721743aeef2e 100644 --- a/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/assign_move.pass.cpp +++ b/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/assign_move.pass.cpp @@ -23,6 +23,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -222,5 +223,72 @@ int main() assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); assert(c.max_load_factor() == 1); } +#if __cplusplus >= 201103L + { + typedef min_allocator > A; + typedef std::unordered_multimap >, + test_compare >, + A + > C; + typedef std::pair P; + P a[] = + { + P(1, "one"), + P(2, "two"), + P(3, "three"), + P(4, "four"), + P(1, "four"), + P(2, "four"), + }; + C c0(a, a + sizeof(a)/sizeof(a[0]), + 7, + test_hash >(8), + test_compare >(9), + A() + ); + C c(a, a + 2, + 7, + test_hash >(2), + test_compare >(3), + A() + ); + c = std::move(c0); + assert(c.bucket_count() == 7); + assert(c.size() == 6); + typedef std::pair Eq; + Eq eq = c.equal_range(1); + assert(std::distance(eq.first, eq.second) == 2); + C::const_iterator i = eq.first; + assert(i->first == 1); + assert(i->second == "one"); + ++i; + assert(i->first == 1); + assert(i->second == "four"); + eq = c.equal_range(2); + assert(std::distance(eq.first, eq.second) == 2); + i = eq.first; + assert(i->first == 2); + assert(i->second == "two"); + ++i; + assert(i->first == 2); + assert(i->second == "four"); + + eq = c.equal_range(3); + assert(std::distance(eq.first, eq.second) == 1); + i = eq.first; + assert(i->first == 3); + assert(i->second == "three"); + eq = c.equal_range(4); + assert(std::distance(eq.first, eq.second) == 1); + i = eq.first; + assert(i->first == 4); + assert(i->second == "four"); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); + assert(c.max_load_factor() == 1); + } +#endif #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES } diff --git a/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/copy.pass.cpp b/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/copy.pass.cpp index 9dc901485e5e..d46ba1c05bee 100644 --- a/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/copy.pass.cpp +++ b/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/copy.pass.cpp @@ -23,6 +23,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -134,4 +135,59 @@ int main() assert(c.max_load_factor() == 1); } #endif // _LIBCPP_HAS_NO_ADVANCED_SFINAE +#if __cplusplus >= 201103L + { + typedef std::unordered_multimap >, + test_compare >, + min_allocator > + > C; + typedef std::pair P; + P a[] = + { + P(1, "one"), + P(2, "two"), + P(3, "three"), + P(4, "four"), + P(1, "four"), + P(2, "four"), + }; + C c0(a, a + sizeof(a)/sizeof(a[0]), + 7, + test_hash >(8), + test_compare >(9), + min_allocator >() + ); + C c = c0; + assert(c.bucket_count() == 7); + assert(c.size() == 6); + C::const_iterator i = c.cbegin(); + assert(i->first == 1); + assert(i->second == "one"); + ++i; + assert(i->first == 1); + assert(i->second == "four"); + ++i; + assert(i->first == 2); + assert(i->second == "two"); + ++i; + assert(i->first == 2); + assert(i->second == "four"); + ++i; + assert(i->first == 3); + assert(i->second == "three"); + ++i; + assert(i->first == 4); + assert(i->second == "four"); + assert(c.hash_function() == test_hash >(8)); + assert(c.key_eq() == test_compare >(9)); + assert(c.get_allocator() == + (min_allocator >())); + assert(!c.empty()); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); + assert(c.max_load_factor() == 1); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/copy_alloc.pass.cpp b/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/copy_alloc.pass.cpp index 4160a9f97783..0e0d864d7a55 100644 --- a/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/copy_alloc.pass.cpp +++ b/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/copy_alloc.pass.cpp @@ -23,6 +23,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -79,4 +80,59 @@ int main() assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); assert(c.max_load_factor() == 1); } +#if __cplusplus >= 201103L + { + typedef std::unordered_multimap >, + test_compare >, + min_allocator > + > C; + typedef std::pair P; + P a[] = + { + P(1, "one"), + P(2, "two"), + P(3, "three"), + P(4, "four"), + P(1, "four"), + P(2, "four"), + }; + C c0(a, a + sizeof(a)/sizeof(a[0]), + 7, + test_hash >(8), + test_compare >(9), + min_allocator >() + ); + C c(c0, min_allocator >()); + assert(c.bucket_count() == 7); + assert(c.size() == 6); + C::const_iterator i = c.cbegin(); + assert(i->first == 1); + assert(i->second == "one"); + ++i; + assert(i->first == 1); + assert(i->second == "four"); + ++i; + assert(i->first == 2); + assert(i->second == "two"); + ++i; + assert(i->first == 2); + assert(i->second == "four"); + ++i; + assert(i->first == 3); + assert(i->second == "three"); + ++i; + assert(i->first == 4); + assert(i->second == "four"); + assert(c.hash_function() == test_hash >(8)); + assert(c.key_eq() == test_compare >(9)); + assert(c.get_allocator() == + (min_allocator >())); + assert(!c.empty()); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); + assert(c.max_load_factor() == 1); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/default.pass.cpp b/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/default.pass.cpp index b40d43df4554..f450455d97a6 100644 --- a/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/default.pass.cpp +++ b/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/default.pass.cpp @@ -22,6 +22,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -44,4 +45,25 @@ int main() assert(c.load_factor() == 0); assert(c.max_load_factor() == 1); } +#if __cplusplus >= 201103L + { + typedef std::unordered_multimap >, + test_compare >, + min_allocator > + > C; + C c; + assert(c.bucket_count() == 0); + assert(c.hash_function() == test_hash >()); + assert(c.key_eq() == test_compare >()); + assert(c.get_allocator() == + (min_allocator >())); + assert(c.size() == 0); + assert(c.empty()); + assert(std::distance(c.begin(), c.end()) == 0); + assert(c.load_factor() == 0); + assert(c.max_load_factor() == 1); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/init.pass.cpp b/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/init.pass.cpp index a8c9e6bd71d3..b4b2ac58f1c2 100644 --- a/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/init.pass.cpp +++ b/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/init.pass.cpp @@ -23,6 +23,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -80,5 +81,60 @@ int main() assert(c.key_eq() == test_compare >()); assert((c.get_allocator() == test_allocator >())); } +#if __cplusplus >= 201103L + { + typedef std::unordered_multimap >, + test_compare >, + min_allocator > + > C; + typedef std::pair P; + C c = { + P(1, "one"), + P(2, "two"), + P(3, "three"), + P(4, "four"), + P(1, "four"), + P(2, "four"), + }; + assert(c.bucket_count() >= 7); + assert(c.size() == 6); + typedef std::pair Eq; + Eq eq = c.equal_range(1); + assert(std::distance(eq.first, eq.second) == 2); + C::const_iterator i = eq.first; + assert(i->first == 1); + assert(i->second == "one"); + ++i; + assert(i->first == 1); + assert(i->second == "four"); + eq = c.equal_range(2); + assert(std::distance(eq.first, eq.second) == 2); + i = eq.first; + assert(i->first == 2); + assert(i->second == "two"); + ++i; + assert(i->first == 2); + assert(i->second == "four"); + + eq = c.equal_range(3); + assert(std::distance(eq.first, eq.second) == 1); + i = eq.first; + assert(i->first == 3); + assert(i->second == "three"); + eq = c.equal_range(4); + assert(std::distance(eq.first, eq.second) == 1); + i = eq.first; + assert(i->first == 4); + assert(i->second == "four"); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); + assert(c.max_load_factor() == 1); + assert(c.hash_function() == test_hash >()); + assert(c.key_eq() == test_compare >()); + assert((c.get_allocator() == min_allocator >())); + } +#endif #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS } diff --git a/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/init_size.pass.cpp b/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/init_size.pass.cpp index a4a265a5ff11..7cb292744c5c 100644 --- a/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/init_size.pass.cpp +++ b/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/init_size.pass.cpp @@ -23,6 +23,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -82,5 +83,62 @@ int main() assert(c.key_eq() == test_compare >()); assert((c.get_allocator() == test_allocator >())); } +#if __cplusplus >= 201103L + { + typedef std::unordered_multimap >, + test_compare >, + min_allocator > + > C; + typedef std::pair P; + C c({ + P(1, "one"), + P(2, "two"), + P(3, "three"), + P(4, "four"), + P(1, "four"), + P(2, "four"), + }, + 7 + ); + assert(c.bucket_count() == 7); + assert(c.size() == 6); + typedef std::pair Eq; + Eq eq = c.equal_range(1); + assert(std::distance(eq.first, eq.second) == 2); + C::const_iterator i = eq.first; + assert(i->first == 1); + assert(i->second == "one"); + ++i; + assert(i->first == 1); + assert(i->second == "four"); + eq = c.equal_range(2); + assert(std::distance(eq.first, eq.second) == 2); + i = eq.first; + assert(i->first == 2); + assert(i->second == "two"); + ++i; + assert(i->first == 2); + assert(i->second == "four"); + + eq = c.equal_range(3); + assert(std::distance(eq.first, eq.second) == 1); + i = eq.first; + assert(i->first == 3); + assert(i->second == "three"); + eq = c.equal_range(4); + assert(std::distance(eq.first, eq.second) == 1); + i = eq.first; + assert(i->first == 4); + assert(i->second == "four"); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); + assert(c.max_load_factor() == 1); + assert(c.hash_function() == test_hash >()); + assert(c.key_eq() == test_compare >()); + assert((c.get_allocator() == min_allocator >())); + } +#endif #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS } diff --git a/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/init_size_hash.pass.cpp b/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/init_size_hash.pass.cpp index 21155e692327..7a2faaa66f43 100644 --- a/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/init_size_hash.pass.cpp +++ b/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/init_size_hash.pass.cpp @@ -23,6 +23,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -83,5 +84,63 @@ int main() assert(c.key_eq() == test_compare >()); assert((c.get_allocator() == test_allocator >())); } +#if __cplusplus >= 201103L + { + typedef std::unordered_multimap >, + test_compare >, + min_allocator > + > C; + typedef std::pair P; + C c({ + P(1, "one"), + P(2, "two"), + P(3, "three"), + P(4, "four"), + P(1, "four"), + P(2, "four"), + }, + 7, + test_hash >(8) + ); + assert(c.bucket_count() == 7); + assert(c.size() == 6); + typedef std::pair Eq; + Eq eq = c.equal_range(1); + assert(std::distance(eq.first, eq.second) == 2); + C::const_iterator i = eq.first; + assert(i->first == 1); + assert(i->second == "one"); + ++i; + assert(i->first == 1); + assert(i->second == "four"); + eq = c.equal_range(2); + assert(std::distance(eq.first, eq.second) == 2); + i = eq.first; + assert(i->first == 2); + assert(i->second == "two"); + ++i; + assert(i->first == 2); + assert(i->second == "four"); + + eq = c.equal_range(3); + assert(std::distance(eq.first, eq.second) == 1); + i = eq.first; + assert(i->first == 3); + assert(i->second == "three"); + eq = c.equal_range(4); + assert(std::distance(eq.first, eq.second) == 1); + i = eq.first; + assert(i->first == 4); + assert(i->second == "four"); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); + assert(c.max_load_factor() == 1); + assert(c.hash_function() == test_hash >(8)); + assert(c.key_eq() == test_compare >()); + assert((c.get_allocator() == min_allocator >())); + } +#endif #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS } diff --git a/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/init_size_hash_equal.pass.cpp b/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/init_size_hash_equal.pass.cpp index 79936ff4d249..73c0ec2851e0 100644 --- a/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/init_size_hash_equal.pass.cpp +++ b/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/init_size_hash_equal.pass.cpp @@ -24,6 +24,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -85,5 +86,64 @@ int main() assert(c.key_eq() == test_compare >(9)); assert((c.get_allocator() == test_allocator >())); } +#if __cplusplus >= 201103L + { + typedef std::unordered_multimap >, + test_compare >, + min_allocator > + > C; + typedef std::pair P; + C c({ + P(1, "one"), + P(2, "two"), + P(3, "three"), + P(4, "four"), + P(1, "four"), + P(2, "four"), + }, + 7, + test_hash >(8), + test_compare >(9) + ); + assert(c.bucket_count() == 7); + assert(c.size() == 6); + typedef std::pair Eq; + Eq eq = c.equal_range(1); + assert(std::distance(eq.first, eq.second) == 2); + C::const_iterator i = eq.first; + assert(i->first == 1); + assert(i->second == "one"); + ++i; + assert(i->first == 1); + assert(i->second == "four"); + eq = c.equal_range(2); + assert(std::distance(eq.first, eq.second) == 2); + i = eq.first; + assert(i->first == 2); + assert(i->second == "two"); + ++i; + assert(i->first == 2); + assert(i->second == "four"); + + eq = c.equal_range(3); + assert(std::distance(eq.first, eq.second) == 1); + i = eq.first; + assert(i->first == 3); + assert(i->second == "three"); + eq = c.equal_range(4); + assert(std::distance(eq.first, eq.second) == 1); + i = eq.first; + assert(i->first == 4); + assert(i->second == "four"); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); + assert(c.max_load_factor() == 1); + assert(c.hash_function() == test_hash >(8)); + assert(c.key_eq() == test_compare >(9)); + assert((c.get_allocator() == min_allocator >())); + } +#endif #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS } diff --git a/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/init_size_hash_equal_allocator.pass.cpp b/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/init_size_hash_equal_allocator.pass.cpp index 53c7090fbc89..bc59d64b0e8c 100644 --- a/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/init_size_hash_equal_allocator.pass.cpp +++ b/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/init_size_hash_equal_allocator.pass.cpp @@ -24,6 +24,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -86,5 +87,65 @@ int main() assert(c.key_eq() == test_compare >(9)); assert((c.get_allocator() == test_allocator >(10))); } +#if __cplusplus >= 201103L + { + typedef std::unordered_multimap >, + test_compare >, + min_allocator > + > C; + typedef std::pair P; + C c({ + P(1, "one"), + P(2, "two"), + P(3, "three"), + P(4, "four"), + P(1, "four"), + P(2, "four"), + }, + 7, + test_hash >(8), + test_compare >(9), + min_allocator >() + ); + assert(c.bucket_count() == 7); + assert(c.size() == 6); + typedef std::pair Eq; + Eq eq = c.equal_range(1); + assert(std::distance(eq.first, eq.second) == 2); + C::const_iterator i = eq.first; + assert(i->first == 1); + assert(i->second == "one"); + ++i; + assert(i->first == 1); + assert(i->second == "four"); + eq = c.equal_range(2); + assert(std::distance(eq.first, eq.second) == 2); + i = eq.first; + assert(i->first == 2); + assert(i->second == "two"); + ++i; + assert(i->first == 2); + assert(i->second == "four"); + + eq = c.equal_range(3); + assert(std::distance(eq.first, eq.second) == 1); + i = eq.first; + assert(i->first == 3); + assert(i->second == "three"); + eq = c.equal_range(4); + assert(std::distance(eq.first, eq.second) == 1); + i = eq.first; + assert(i->first == 4); + assert(i->second == "four"); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); + assert(c.max_load_factor() == 1); + assert(c.hash_function() == test_hash >(8)); + assert(c.key_eq() == test_compare >(9)); + assert((c.get_allocator() == min_allocator >())); + } +#endif #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS } diff --git a/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/move.pass.cpp b/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/move.pass.cpp index 5ebb217baa86..3d4e59208767 100644 --- a/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/move.pass.cpp +++ b/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/move.pass.cpp @@ -23,6 +23,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -126,5 +127,106 @@ int main() assert(c0.empty()); } +#if __cplusplus >= 201103L + { + typedef std::unordered_multimap >, + test_compare >, + min_allocator > + > C; + typedef std::pair P; + P a[] = + { + P(1, "one"), + P(2, "two"), + P(3, "three"), + P(4, "four"), + P(1, "four"), + P(2, "four"), + }; + C c0(7, + test_hash >(8), + test_compare >(9), + min_allocator >() + ); + C c = std::move(c0); + assert(c.bucket_count() == 7); + assert(c.size() == 0); + assert(c.hash_function() == test_hash >(8)); + assert(c.key_eq() == test_compare >(9)); + assert(c.get_allocator() == + (min_allocator >())); + assert(c.empty()); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + assert(c.load_factor() == 0); + assert(c.max_load_factor() == 1); + + assert(c0.empty()); + } + { + typedef std::unordered_multimap >, + test_compare >, + min_allocator > + > C; + typedef std::pair P; + P a[] = + { + P(1, "one"), + P(2, "two"), + P(3, "three"), + P(4, "four"), + P(1, "four"), + P(2, "four"), + }; + C c0(a, a + sizeof(a)/sizeof(a[0]), + 7, + test_hash >(8), + test_compare >(9), + min_allocator >() + ); + C c = std::move(c0); + assert(c.bucket_count() == 7); + assert(c.size() == 6); + typedef std::pair Eq; + Eq eq = c.equal_range(1); + assert(std::distance(eq.first, eq.second) == 2); + C::const_iterator i = eq.first; + assert(i->first == 1); + assert(i->second == "one"); + ++i; + assert(i->first == 1); + assert(i->second == "four"); + eq = c.equal_range(2); + assert(std::distance(eq.first, eq.second) == 2); + i = eq.first; + assert(i->first == 2); + assert(i->second == "two"); + ++i; + assert(i->first == 2); + assert(i->second == "four"); + + eq = c.equal_range(3); + assert(std::distance(eq.first, eq.second) == 1); + i = eq.first; + assert(i->first == 3); + assert(i->second == "three"); + eq = c.equal_range(4); + assert(std::distance(eq.first, eq.second) == 1); + i = eq.first; + assert(i->first == 4); + assert(i->second == "four"); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); + assert(c.max_load_factor() == 1); + assert(c.hash_function() == test_hash >(8)); + assert(c.key_eq() == test_compare >(9)); + assert((c.get_allocator() == min_allocator >())); + + assert(c0.empty()); + } +#endif #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES } diff --git a/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/move_alloc.pass.cpp b/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/move_alloc.pass.cpp index e40dc8b3d347..6f0cba8fb68c 100644 --- a/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/move_alloc.pass.cpp +++ b/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/move_alloc.pass.cpp @@ -25,6 +25,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -157,5 +158,71 @@ int main() assert(c0.empty()); } +#if __cplusplus >= 201103L + { + typedef std::pair P; + typedef min_allocator> A; + typedef std::unordered_multimap >, + test_compare >, + A + > C; + P a[] = + { + P(1, "one"), + P(2, "two"), + P(3, "three"), + P(4, "four"), + P(1, "four"), + P(2, "four"), + }; + C c0(a, a + sizeof(a)/sizeof(a[0]), + 7, + test_hash >(8), + test_compare >(9), + A() + ); + C c(std::move(c0), A()); + assert(c.bucket_count() == 7); + assert(c.size() == 6); + typedef std::pair Eq; + Eq eq = c.equal_range(1); + assert(std::distance(eq.first, eq.second) == 2); + C::const_iterator i = eq.first; + assert(i->first == 1); + assert(i->second == "one"); + ++i; + assert(i->first == 1); + assert(i->second == "four"); + eq = c.equal_range(2); + assert(std::distance(eq.first, eq.second) == 2); + i = eq.first; + assert(i->first == 2); + assert(i->second == "two"); + ++i; + assert(i->first == 2); + assert(i->second == "four"); + + eq = c.equal_range(3); + assert(std::distance(eq.first, eq.second) == 1); + i = eq.first; + assert(i->first == 3); + assert(i->second == "three"); + eq = c.equal_range(4); + assert(std::distance(eq.first, eq.second) == 1); + i = eq.first; + assert(i->first == 4); + assert(i->second == "four"); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); + assert(c.max_load_factor() == 1); + assert(c.hash_function() == test_hash >(8)); + assert(c.key_eq() == test_compare >(9)); + assert((c.get_allocator() == min_allocator >())); + + assert(c0.empty()); + } +#endif #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES } diff --git a/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/range.pass.cpp b/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/range.pass.cpp index 5894e63792c6..74171c71f70b 100644 --- a/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/range.pass.cpp +++ b/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/range.pass.cpp @@ -26,6 +26,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -84,4 +85,61 @@ int main() assert(c.key_eq() == test_compare >()); assert((c.get_allocator() == test_allocator >())); } +#if __cplusplus >= 201103L + { + typedef std::unordered_multimap >, + test_compare >, + min_allocator > + > C; + typedef std::pair P; + P a[] = + { + P(1, "one"), + P(2, "two"), + P(3, "three"), + P(4, "four"), + P(1, "four"), + P(2, "four"), + }; + C c(input_iterator(a), input_iterator(a + sizeof(a)/sizeof(a[0]))); + assert(c.bucket_count() >= 7); + assert(c.size() == 6); + typedef std::pair Eq; + Eq eq = c.equal_range(1); + assert(std::distance(eq.first, eq.second) == 2); + C::const_iterator i = eq.first; + assert(i->first == 1); + assert(i->second == "one"); + ++i; + assert(i->first == 1); + assert(i->second == "four"); + eq = c.equal_range(2); + assert(std::distance(eq.first, eq.second) == 2); + i = eq.first; + assert(i->first == 2); + assert(i->second == "two"); + ++i; + assert(i->first == 2); + assert(i->second == "four"); + + eq = c.equal_range(3); + assert(std::distance(eq.first, eq.second) == 1); + i = eq.first; + assert(i->first == 3); + assert(i->second == "three"); + eq = c.equal_range(4); + assert(std::distance(eq.first, eq.second) == 1); + i = eq.first; + assert(i->first == 4); + assert(i->second == "four"); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); + assert(c.max_load_factor() == 1); + assert(c.hash_function() == test_hash >()); + assert(c.key_eq() == test_compare >()); + assert((c.get_allocator() == min_allocator >())); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/range_size.pass.cpp b/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/range_size.pass.cpp index c02aa5336d6a..53a50de40186 100644 --- a/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/range_size.pass.cpp +++ b/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/range_size.pass.cpp @@ -26,6 +26,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -86,4 +87,63 @@ int main() assert(c.key_eq() == test_compare >()); assert((c.get_allocator() == test_allocator >())); } +#if __cplusplus >= 201103L + { + typedef std::unordered_multimap >, + test_compare >, + min_allocator > + > C; + typedef std::pair P; + P a[] = + { + P(1, "one"), + P(2, "two"), + P(3, "three"), + P(4, "four"), + P(1, "four"), + P(2, "four"), + }; + C c(input_iterator(a), input_iterator(a + sizeof(a)/sizeof(a[0])), + 10 + ); + assert(c.bucket_count() == 11); + assert(c.size() == 6); + typedef std::pair Eq; + Eq eq = c.equal_range(1); + assert(std::distance(eq.first, eq.second) == 2); + C::const_iterator i = eq.first; + assert(i->first == 1); + assert(i->second == "one"); + ++i; + assert(i->first == 1); + assert(i->second == "four"); + eq = c.equal_range(2); + assert(std::distance(eq.first, eq.second) == 2); + i = eq.first; + assert(i->first == 2); + assert(i->second == "two"); + ++i; + assert(i->first == 2); + assert(i->second == "four"); + + eq = c.equal_range(3); + assert(std::distance(eq.first, eq.second) == 1); + i = eq.first; + assert(i->first == 3); + assert(i->second == "three"); + eq = c.equal_range(4); + assert(std::distance(eq.first, eq.second) == 1); + i = eq.first; + assert(i->first == 4); + assert(i->second == "four"); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); + assert(c.max_load_factor() == 1); + assert(c.hash_function() == test_hash >()); + assert(c.key_eq() == test_compare >()); + assert((c.get_allocator() == min_allocator >())); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/range_size_hash.pass.cpp b/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/range_size_hash.pass.cpp index c3ce6189dcea..02cfb2fa52d6 100644 --- a/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/range_size_hash.pass.cpp +++ b/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/range_size_hash.pass.cpp @@ -27,6 +27,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -88,4 +89,64 @@ int main() assert(c.key_eq() == test_compare >()); assert((c.get_allocator() == test_allocator >())); } +#if __cplusplus >= 201103L + { + typedef std::unordered_multimap >, + test_compare >, + min_allocator > + > C; + typedef std::pair P; + P a[] = + { + P(1, "one"), + P(2, "two"), + P(3, "three"), + P(4, "four"), + P(1, "four"), + P(2, "four"), + }; + C c(input_iterator(a), input_iterator(a + sizeof(a)/sizeof(a[0])), + 7, + test_hash >(8) + ); + assert(c.bucket_count() == 7); + assert(c.size() == 6); + typedef std::pair Eq; + Eq eq = c.equal_range(1); + assert(std::distance(eq.first, eq.second) == 2); + C::const_iterator i = eq.first; + assert(i->first == 1); + assert(i->second == "one"); + ++i; + assert(i->first == 1); + assert(i->second == "four"); + eq = c.equal_range(2); + assert(std::distance(eq.first, eq.second) == 2); + i = eq.first; + assert(i->first == 2); + assert(i->second == "two"); + ++i; + assert(i->first == 2); + assert(i->second == "four"); + + eq = c.equal_range(3); + assert(std::distance(eq.first, eq.second) == 1); + i = eq.first; + assert(i->first == 3); + assert(i->second == "three"); + eq = c.equal_range(4); + assert(std::distance(eq.first, eq.second) == 1); + i = eq.first; + assert(i->first == 4); + assert(i->second == "four"); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); + assert(c.max_load_factor() == 1); + assert(c.hash_function() == test_hash >(8)); + assert(c.key_eq() == test_compare >()); + assert((c.get_allocator() == min_allocator >())); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/range_size_hash_equal.pass.cpp b/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/range_size_hash_equal.pass.cpp index a13eba0e9c32..e4fdfd3d9121 100644 --- a/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/range_size_hash_equal.pass.cpp +++ b/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/range_size_hash_equal.pass.cpp @@ -27,6 +27,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -89,4 +90,65 @@ int main() assert(c.key_eq() == test_compare >(9)); assert((c.get_allocator() == test_allocator >())); } +#if __cplusplus >= 201103L + { + typedef std::unordered_multimap >, + test_compare >, + min_allocator > + > C; + typedef std::pair P; + P a[] = + { + P(1, "one"), + P(2, "two"), + P(3, "three"), + P(4, "four"), + P(1, "four"), + P(2, "four"), + }; + C c(input_iterator(a), input_iterator(a + sizeof(a)/sizeof(a[0])), + 7, + test_hash >(8), + test_compare >(9) + ); + assert(c.bucket_count() == 7); + assert(c.size() == 6); + typedef std::pair Eq; + Eq eq = c.equal_range(1); + assert(std::distance(eq.first, eq.second) == 2); + C::const_iterator i = eq.first; + assert(i->first == 1); + assert(i->second == "one"); + ++i; + assert(i->first == 1); + assert(i->second == "four"); + eq = c.equal_range(2); + assert(std::distance(eq.first, eq.second) == 2); + i = eq.first; + assert(i->first == 2); + assert(i->second == "two"); + ++i; + assert(i->first == 2); + assert(i->second == "four"); + + eq = c.equal_range(3); + assert(std::distance(eq.first, eq.second) == 1); + i = eq.first; + assert(i->first == 3); + assert(i->second == "three"); + eq = c.equal_range(4); + assert(std::distance(eq.first, eq.second) == 1); + i = eq.first; + assert(i->first == 4); + assert(i->second == "four"); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); + assert(c.max_load_factor() == 1); + assert(c.hash_function() == test_hash >(8)); + assert(c.key_eq() == test_compare >(9)); + assert((c.get_allocator() == min_allocator >())); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/range_size_hash_equal_allocator.pass.cpp b/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/range_size_hash_equal_allocator.pass.cpp index 402ef6bef929..640de3556e8f 100644 --- a/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/range_size_hash_equal_allocator.pass.cpp +++ b/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/range_size_hash_equal_allocator.pass.cpp @@ -28,6 +28,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -91,4 +92,66 @@ int main() assert(c.key_eq() == test_compare >(9)); assert((c.get_allocator() == test_allocator >(10))); } +#if __cplusplus >= 201103L + { + typedef std::unordered_multimap >, + test_compare >, + min_allocator > + > C; + typedef std::pair P; + P a[] = + { + P(1, "one"), + P(2, "two"), + P(3, "three"), + P(4, "four"), + P(1, "four"), + P(2, "four"), + }; + C c(input_iterator(a), input_iterator(a + sizeof(a)/sizeof(a[0])), + 7, + test_hash >(8), + test_compare >(9), + min_allocator >() + ); + assert(c.bucket_count() == 7); + assert(c.size() == 6); + typedef std::pair Eq; + Eq eq = c.equal_range(1); + assert(std::distance(eq.first, eq.second) == 2); + C::const_iterator i = eq.first; + assert(i->first == 1); + assert(i->second == "one"); + ++i; + assert(i->first == 1); + assert(i->second == "four"); + eq = c.equal_range(2); + assert(std::distance(eq.first, eq.second) == 2); + i = eq.first; + assert(i->first == 2); + assert(i->second == "two"); + ++i; + assert(i->first == 2); + assert(i->second == "four"); + + eq = c.equal_range(3); + assert(std::distance(eq.first, eq.second) == 1); + i = eq.first; + assert(i->first == 3); + assert(i->second == "three"); + eq = c.equal_range(4); + assert(std::distance(eq.first, eq.second) == 1); + i = eq.first; + assert(i->first == 4); + assert(i->second == "four"); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); + assert(c.max_load_factor() == 1); + assert(c.hash_function() == test_hash >(8)); + assert(c.key_eq() == test_compare >(9)); + assert((c.get_allocator() == min_allocator >())); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/size.fail.cpp b/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/size.fail.cpp index f9b7eb7f0760..95ba70bbea73 100644 --- a/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/size.fail.cpp +++ b/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/size.fail.cpp @@ -22,6 +22,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -44,4 +45,25 @@ int main() assert(c.load_factor() == 0); assert(c.max_load_factor() == 1); } +#if __cplusplus >= 201103L + { + typedef std::unordered_multimap >, + test_compare >, + min_allocator > + > C; + C c = 7; + assert(c.bucket_count() == 7); + assert(c.hash_function() == test_hash >()); + assert(c.key_eq() == test_compare >()); + assert(c.get_allocator() == + (min_allocator >())); + assert(c.size() == 0); + assert(c.empty()); + assert(std::distance(c.begin(), c.end()) == 0); + assert(c.load_factor() == 0); + assert(c.max_load_factor() == 1); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/size.pass.cpp b/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/size.pass.cpp index d16957c94eec..d9fac2ff3f18 100644 --- a/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/size.pass.cpp +++ b/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/size.pass.cpp @@ -22,6 +22,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -44,4 +45,25 @@ int main() assert(c.load_factor() == 0); assert(c.max_load_factor() == 1); } +#if __cplusplus >= 201103L + { + typedef std::unordered_multimap >, + test_compare >, + min_allocator > + > C; + C c(7); + assert(c.bucket_count() == 7); + assert(c.hash_function() == test_hash >()); + assert(c.key_eq() == test_compare >()); + assert(c.get_allocator() == + (min_allocator >())); + assert(c.size() == 0); + assert(c.empty()); + assert(std::distance(c.begin(), c.end()) == 0); + assert(c.load_factor() == 0); + assert(c.max_load_factor() == 1); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/size_hash.pass.cpp b/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/size_hash.pass.cpp index afa255175017..d691dd9cd65e 100644 --- a/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/size_hash.pass.cpp +++ b/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/size_hash.pass.cpp @@ -22,6 +22,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -46,4 +47,27 @@ int main() assert(c.load_factor() == 0); assert(c.max_load_factor() == 1); } +#if __cplusplus >= 201103L + { + typedef std::unordered_multimap >, + test_compare >, + min_allocator > + > C; + C c(7, + test_hash >(8) + ); + assert(c.bucket_count() == 7); + assert(c.hash_function() == test_hash >(8)); + assert(c.key_eq() == test_compare >()); + assert(c.get_allocator() == + (min_allocator >())); + assert(c.size() == 0); + assert(c.empty()); + assert(std::distance(c.begin(), c.end()) == 0); + assert(c.load_factor() == 0); + assert(c.max_load_factor() == 1); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/size_hash_equal.pass.cpp b/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/size_hash_equal.pass.cpp index 5a3c2628e123..9f9027518202 100644 --- a/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/size_hash_equal.pass.cpp +++ b/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/size_hash_equal.pass.cpp @@ -22,6 +22,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -47,4 +48,28 @@ int main() assert(c.load_factor() == 0); assert(c.max_load_factor() == 1); } +#if __cplusplus >= 201103L + { + typedef std::unordered_multimap >, + test_compare >, + min_allocator > + > C; + C c(7, + test_hash >(8), + test_compare >(9) + ); + assert(c.bucket_count() == 7); + assert(c.hash_function() == test_hash >(8)); + assert(c.key_eq() == test_compare >(9)); + assert(c.get_allocator() == + (min_allocator >())); + assert(c.size() == 0); + assert(c.empty()); + assert(std::distance(c.begin(), c.end()) == 0); + assert(c.load_factor() == 0); + assert(c.max_load_factor() == 1); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/size_hash_equal_allocator.pass.cpp b/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/size_hash_equal_allocator.pass.cpp index 6394ad460e09..23fae577503b 100644 --- a/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/size_hash_equal_allocator.pass.cpp +++ b/libcxx/test/containers/unord/unord.multimap/unord.multimap.cnstr/size_hash_equal_allocator.pass.cpp @@ -22,6 +22,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -48,4 +49,29 @@ int main() assert(c.load_factor() == 0); assert(c.max_load_factor() == 1); } +#if __cplusplus >= 201103L + { + typedef std::unordered_multimap >, + test_compare >, + min_allocator > + > C; + C c(7, + test_hash >(8), + test_compare >(9), + min_allocator >() + ); + assert(c.bucket_count() == 7); + assert(c.hash_function() == test_hash >(8)); + assert(c.key_eq() == test_compare >(9)); + assert(c.get_allocator() == + (min_allocator >())); + assert(c.size() == 0); + assert(c.empty()); + assert(std::distance(c.begin(), c.end()) == 0); + assert(c.load_factor() == 0); + assert(c.max_load_factor() == 1); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.multimap/unord.multimap.modifiers/clear.pass.cpp b/libcxx/test/containers/unord/unord.multimap/unord.multimap.modifiers/clear.pass.cpp index e2071fb66854..a731f5b04c44 100644 --- a/libcxx/test/containers/unord/unord.multimap/unord.multimap.modifiers/clear.pass.cpp +++ b/libcxx/test/containers/unord/unord.multimap/unord.multimap.modifiers/clear.pass.cpp @@ -19,6 +19,8 @@ #include #include +#include "../../../min_allocator.h" + int main() { { @@ -37,4 +39,23 @@ int main() c.clear(); assert(c.size() == 0); } +#if __cplusplus >= 201103L + { + typedef std::unordered_multimap, std::equal_to, + min_allocator>> C; + typedef std::pair P; + P a[] = + { + P(1, "one"), + P(2, "two"), + P(3, "three"), + P(4, "four"), + P(1, "four"), + P(2, "four"), + }; + C c(a, a + sizeof(a)/sizeof(a[0])); + c.clear(); + assert(c.size() == 0); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.multimap/unord.multimap.modifiers/emplace.pass.cpp b/libcxx/test/containers/unord/unord.multimap/unord.multimap.modifiers/emplace.pass.cpp index f05edd88f259..244419dc221e 100644 --- a/libcxx/test/containers/unord/unord.multimap/unord.multimap.modifiers/emplace.pass.cpp +++ b/libcxx/test/containers/unord/unord.multimap/unord.multimap.modifiers/emplace.pass.cpp @@ -20,6 +20,7 @@ #include #include "../../../Emplaceable.h" +#include "../../../min_allocator.h" int main() { @@ -44,5 +45,28 @@ int main() assert(r->first == 5); assert(r->second == Emplaceable(6, 7)); } +#if __cplusplus >= 201103L + { + typedef std::unordered_multimap, std::equal_to, + min_allocator>> C; + typedef C::iterator R; + C c; + R r = c.emplace(3); + assert(c.size() == 1); + assert(r->first == 3); + assert(r->second == Emplaceable()); + + r = c.emplace(std::pair(4, Emplaceable(5, 6))); + assert(c.size() == 2); + assert(r->first == 4); + assert(r->second == Emplaceable(5, 6)); + + r = c.emplace(std::piecewise_construct, std::forward_as_tuple(5), + std::forward_as_tuple(6, 7)); + assert(c.size() == 3); + assert(r->first == 5); + assert(r->second == Emplaceable(6, 7)); + } +#endif #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES } diff --git a/libcxx/test/containers/unord/unord.multimap/unord.multimap.modifiers/emplace_hint.pass.cpp b/libcxx/test/containers/unord/unord.multimap/unord.multimap.modifiers/emplace_hint.pass.cpp index 302451f1d681..576be4e37aae 100644 --- a/libcxx/test/containers/unord/unord.multimap/unord.multimap.modifiers/emplace_hint.pass.cpp +++ b/libcxx/test/containers/unord/unord.multimap/unord.multimap.modifiers/emplace_hint.pass.cpp @@ -20,6 +20,7 @@ #include #include "../../../Emplaceable.h" +#include "../../../min_allocator.h" int main() { @@ -53,5 +54,37 @@ int main() assert(r->first == 3); assert(r->second == Emplaceable(5, 6)); } +#if __cplusplus >= 201103L + { + typedef std::unordered_multimap, std::equal_to, + min_allocator>> C; + typedef C::iterator R; + C c; + C::const_iterator e = c.end(); + R r = c.emplace_hint(e, 3); + assert(c.size() == 1); + assert(r->first == 3); + assert(r->second == Emplaceable()); + + r = c.emplace_hint(e, std::pair(3, Emplaceable(5, 6))); + assert(c.size() == 2); + assert(r->first == 3); + assert(r->second == Emplaceable(5, 6)); + assert(r == next(c.begin())); + + r = c.emplace_hint(r, std::piecewise_construct, std::forward_as_tuple(3), + std::forward_as_tuple(6, 7)); + assert(c.size() == 3); + assert(r->first == 3); + assert(r->second == Emplaceable(6, 7)); + assert(r == next(c.begin())); + r = c.begin(); + assert(r->first == 3); + assert(r->second == Emplaceable()); + r = next(r, 2); + assert(r->first == 3); + assert(r->second == Emplaceable(5, 6)); + } +#endif #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES } diff --git a/libcxx/test/containers/unord/unord.multimap/unord.multimap.modifiers/erase_const_iter.pass.cpp b/libcxx/test/containers/unord/unord.multimap/unord.multimap.modifiers/erase_const_iter.pass.cpp index b1df0f56d511..2b1d4d206671 100644 --- a/libcxx/test/containers/unord/unord.multimap/unord.multimap.modifiers/erase_const_iter.pass.cpp +++ b/libcxx/test/containers/unord/unord.multimap/unord.multimap.modifiers/erase_const_iter.pass.cpp @@ -19,6 +19,8 @@ #include #include +#include "../../../min_allocator.h" + int main() { { @@ -65,4 +67,51 @@ int main() assert(std::distance(c.begin(), c.end()) == c.size()); assert(std::distance(c.cbegin(), c.cend()) == c.size()); } +#if __cplusplus >= 201103L + { + typedef std::unordered_multimap, std::equal_to, + min_allocator>> C; + typedef std::pair P; + P a[] = + { + P(1, "one"), + P(2, "two"), + P(3, "three"), + P(4, "four"), + P(1, "four"), + P(2, "four"), + }; + C c(a, a + sizeof(a)/sizeof(a[0])); + C::const_iterator i = c.find(2); + C::iterator j = c.erase(i); + + assert(c.size() == 5); + typedef std::pair Eq; + Eq eq = c.equal_range(1); + assert(std::distance(eq.first, eq.second) == 2); + C::const_iterator k = eq.first; + assert(k->first == 1); + assert(k->second == "one"); + ++k; + assert(k->first == 1); + assert(k->second == "four"); + eq = c.equal_range(2); + assert(std::distance(eq.first, eq.second) == 1); + k = eq.first; + assert(k->first == 2); + assert(k->second == "four"); + eq = c.equal_range(3); + assert(std::distance(eq.first, eq.second) == 1); + k = eq.first; + assert(k->first == 3); + assert(k->second == "three"); + eq = c.equal_range(4); + assert(std::distance(eq.first, eq.second) == 1); + k = eq.first; + assert(k->first == 4); + assert(k->second == "four"); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.multimap/unord.multimap.modifiers/erase_key.pass.cpp b/libcxx/test/containers/unord/unord.multimap/unord.multimap.modifiers/erase_key.pass.cpp index 07f423b74952..d59609a20a81 100644 --- a/libcxx/test/containers/unord/unord.multimap/unord.multimap.modifiers/erase_key.pass.cpp +++ b/libcxx/test/containers/unord/unord.multimap/unord.multimap.modifiers/erase_key.pass.cpp @@ -19,6 +19,8 @@ #include #include +#include "../../../min_allocator.h" + int main() { { @@ -182,4 +184,168 @@ int main() assert(std::distance(c.begin(), c.end()) == c.size()); assert(std::distance(c.cbegin(), c.cend()) == c.size()); } +#if __cplusplus >= 201103L + { + typedef std::unordered_multimap, std::equal_to, + min_allocator>> C; + typedef std::pair P; + P a[] = + { + P(1, "one"), + P(2, "two"), + P(3, "three"), + P(4, "four"), + P(1, "four"), + P(2, "four"), + }; + C c(a, a + sizeof(a)/sizeof(a[0])); + assert(c.erase(5) == 0); + assert(c.size() == 6); + typedef std::pair Eq; + Eq eq = c.equal_range(1); + assert(std::distance(eq.first, eq.second) == 2); + C::const_iterator k = eq.first; + assert(k->first == 1); + assert(k->second == "one"); + ++k; + assert(k->first == 1); + assert(k->second == "four"); + eq = c.equal_range(2); + assert(std::distance(eq.first, eq.second) == 2); + k = eq.first; + assert(k->first == 2); + assert(k->second == "two"); + ++k; + assert(k->first == 2); + assert(k->second == "four"); + eq = c.equal_range(3); + assert(std::distance(eq.first, eq.second) == 1); + k = eq.first; + assert(k->first == 3); + assert(k->second == "three"); + eq = c.equal_range(4); + assert(std::distance(eq.first, eq.second) == 1); + k = eq.first; + assert(k->first == 4); + assert(k->second == "four"); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + + assert(c.erase(2) == 2); + assert(c.size() == 4); + eq = c.equal_range(1); + assert(std::distance(eq.first, eq.second) == 2); + k = eq.first; + assert(k->first == 1); + assert(k->second == "one"); + ++k; + assert(k->first == 1); + assert(k->second == "four"); + eq = c.equal_range(3); + assert(std::distance(eq.first, eq.second) == 1); + k = eq.first; + assert(k->first == 3); + assert(k->second == "three"); + eq = c.equal_range(4); + assert(std::distance(eq.first, eq.second) == 1); + k = eq.first; + assert(k->first == 4); + assert(k->second == "four"); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + + assert(c.erase(2) == 0); + assert(c.size() == 4); + eq = c.equal_range(1); + assert(std::distance(eq.first, eq.second) == 2); + k = eq.first; + assert(k->first == 1); + assert(k->second == "one"); + ++k; + assert(k->first == 1); + assert(k->second == "four"); + eq = c.equal_range(3); + assert(std::distance(eq.first, eq.second) == 1); + k = eq.first; + assert(k->first == 3); + assert(k->second == "three"); + eq = c.equal_range(4); + assert(std::distance(eq.first, eq.second) == 1); + k = eq.first; + assert(k->first == 4); + assert(k->second == "four"); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + + assert(c.erase(4) == 1); + assert(c.size() == 3); + eq = c.equal_range(1); + assert(std::distance(eq.first, eq.second) == 2); + k = eq.first; + assert(k->first == 1); + assert(k->second == "one"); + ++k; + assert(k->first == 1); + assert(k->second == "four"); + eq = c.equal_range(3); + assert(std::distance(eq.first, eq.second) == 1); + k = eq.first; + assert(k->first == 3); + assert(k->second == "three"); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + + assert(c.erase(4) == 0); + assert(c.size() == 3); + eq = c.equal_range(1); + assert(std::distance(eq.first, eq.second) == 2); + k = eq.first; + assert(k->first == 1); + assert(k->second == "one"); + ++k; + assert(k->first == 1); + assert(k->second == "four"); + eq = c.equal_range(3); + assert(std::distance(eq.first, eq.second) == 1); + k = eq.first; + assert(k->first == 3); + assert(k->second == "three"); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + + assert(c.erase(1) == 2); + assert(c.size() == 1); + eq = c.equal_range(3); + assert(std::distance(eq.first, eq.second) == 1); + k = eq.first; + assert(k->first == 3); + assert(k->second == "three"); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + + assert(c.erase(1) == 0); + assert(c.size() == 1); + eq = c.equal_range(3); + assert(std::distance(eq.first, eq.second) == 1); + k = eq.first; + assert(k->first == 3); + assert(k->second == "three"); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + + assert(c.erase(3) == 1); + assert(c.size() == 0); + eq = c.equal_range(3); + assert(std::distance(eq.first, eq.second) == 0); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + + assert(c.erase(3) == 0); + assert(c.size() == 0); + eq = c.equal_range(3); + assert(std::distance(eq.first, eq.second) == 0); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.multimap/unord.multimap.modifiers/erase_range.pass.cpp b/libcxx/test/containers/unord/unord.multimap/unord.multimap.modifiers/erase_range.pass.cpp index 08e77266749a..3ca3a3610fdf 100644 --- a/libcxx/test/containers/unord/unord.multimap/unord.multimap.modifiers/erase_range.pass.cpp +++ b/libcxx/test/containers/unord/unord.multimap/unord.multimap.modifiers/erase_range.pass.cpp @@ -19,6 +19,8 @@ #include #include +#include "../../../min_allocator.h" + int main() { { @@ -96,4 +98,82 @@ int main() assert(c.size() == 0); assert(k == c.end()); } +#if __cplusplus >= 201103L + { + typedef std::unordered_multimap, std::equal_to, + min_allocator>> C; + typedef std::pair P; + P a[] = + { + P(1, "one"), + P(2, "two"), + P(3, "three"), + P(4, "four"), + P(1, "four"), + P(2, "four"), + }; + C c(a, a + sizeof(a)/sizeof(a[0])); + C::const_iterator i = c.find(2); + C::const_iterator j = next(i, 2); + C::iterator k = c.erase(i, i); + assert(k == i); + assert(c.size() == 6); + typedef std::pair Eq; + Eq eq = c.equal_range(1); + assert(std::distance(eq.first, eq.second) == 2); + k = eq.first; + assert(k->first == 1); + assert(k->second == "one"); + ++k; + assert(k->first == 1); + assert(k->second == "four"); + eq = c.equal_range(2); + assert(std::distance(eq.first, eq.second) == 2); + k = eq.first; + assert(k->first == 2); + assert(k->second == "two"); + ++k; + assert(k->first == 2); + assert(k->second == "four"); + eq = c.equal_range(3); + assert(std::distance(eq.first, eq.second) == 1); + k = eq.first; + assert(k->first == 3); + assert(k->second == "three"); + eq = c.equal_range(4); + assert(std::distance(eq.first, eq.second) == 1); + k = eq.first; + assert(k->first == 4); + assert(k->second == "four"); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + + k = c.erase(i, j); + assert(c.size() == 4); + eq = c.equal_range(1); + assert(std::distance(eq.first, eq.second) == 2); + k = eq.first; + assert(k->first == 1); + assert(k->second == "one"); + ++k; + assert(k->first == 1); + assert(k->second == "four"); + eq = c.equal_range(3); + assert(std::distance(eq.first, eq.second) == 1); + k = eq.first; + assert(k->first == 3); + assert(k->second == "three"); + eq = c.equal_range(4); + assert(std::distance(eq.first, eq.second) == 1); + k = eq.first; + assert(k->first == 4); + assert(k->second == "four"); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + + k = c.erase(c.cbegin(), c.cend()); + assert(c.size() == 0); + assert(k == c.end()); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.multimap/unord.multimap.modifiers/insert_const_lvalue.pass.cpp b/libcxx/test/containers/unord/unord.multimap/unord.multimap.modifiers/insert_const_lvalue.pass.cpp index 39bcefee224d..0528714d79e4 100644 --- a/libcxx/test/containers/unord/unord.multimap/unord.multimap.modifiers/insert_const_lvalue.pass.cpp +++ b/libcxx/test/containers/unord/unord.multimap/unord.multimap.modifiers/insert_const_lvalue.pass.cpp @@ -18,6 +18,8 @@ #include #include +#include "../../../min_allocator.h" + int main() { { @@ -45,4 +47,32 @@ int main() assert(r->first == 5.5); assert(r->second == 4); } +#if __cplusplus >= 201103L + { + typedef std::unordered_multimap, std::equal_to, + min_allocator>> C; + typedef C::iterator R; + typedef C::value_type P; + C c; + R r = c.insert(P(3.5, 3)); + assert(c.size() == 1); + assert(r->first == 3.5); + assert(r->second == 3); + + r = c.insert(P(3.5, 4)); + assert(c.size() == 2); + assert(r->first == 3.5); + assert(r->second == 4); + + r = c.insert(P(4.5, 4)); + assert(c.size() == 3); + assert(r->first == 4.5); + assert(r->second == 4); + + r = c.insert(P(5.5, 4)); + assert(c.size() == 4); + assert(r->first == 5.5); + assert(r->second == 4); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.multimap/unord.multimap.modifiers/insert_hint_const_lvalue.pass.cpp b/libcxx/test/containers/unord/unord.multimap/unord.multimap.modifiers/insert_hint_const_lvalue.pass.cpp index 038a2f3a7f48..9e3f1280be32 100644 --- a/libcxx/test/containers/unord/unord.multimap/unord.multimap.modifiers/insert_hint_const_lvalue.pass.cpp +++ b/libcxx/test/containers/unord/unord.multimap/unord.multimap.modifiers/insert_hint_const_lvalue.pass.cpp @@ -18,6 +18,8 @@ #include #include +#include "../../../min_allocator.h" + int main() { { @@ -46,4 +48,33 @@ int main() assert(r->first == 5.5); assert(r->second == 4); } +#if __cplusplus >= 201103L + { + typedef std::unordered_multimap, std::equal_to, + min_allocator>> C; + typedef C::iterator R; + typedef C::value_type P; + C c; + C::const_iterator e = c.end(); + R r = c.insert(e, P(3.5, 3)); + assert(c.size() == 1); + assert(r->first == 3.5); + assert(r->second == 3); + + r = c.insert(e, P(3.5, 4)); + assert(c.size() == 2); + assert(r->first == 3.5); + assert(r->second == 4); + + r = c.insert(e, P(4.5, 4)); + assert(c.size() == 3); + assert(r->first == 4.5); + assert(r->second == 4); + + r = c.insert(e, P(5.5, 4)); + assert(c.size() == 4); + assert(r->first == 5.5); + assert(r->second == 4); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.multimap/unord.multimap.modifiers/insert_hint_rvalue.pass.cpp b/libcxx/test/containers/unord/unord.multimap/unord.multimap.modifiers/insert_hint_rvalue.pass.cpp index fbcaa03a08c7..c8dd38d56add 100644 --- a/libcxx/test/containers/unord/unord.multimap/unord.multimap.modifiers/insert_hint_rvalue.pass.cpp +++ b/libcxx/test/containers/unord/unord.multimap/unord.multimap.modifiers/insert_hint_rvalue.pass.cpp @@ -21,6 +21,7 @@ #include #include "../../../MoveOnly.h" +#include "../../../min_allocator.h" int main() { @@ -78,4 +79,62 @@ int main() assert(r->second == 4); } #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES +#if __cplusplus >= 201103L + { + typedef std::unordered_multimap, std::equal_to, + min_allocator>> C; + typedef C::iterator R; + typedef std::pair P; + C c; + C::const_iterator e = c.end(); + R r = c.insert(e, P(3.5, 3)); + assert(c.size() == 1); + assert(r->first == 3.5); + assert(r->second == 3); + + r = c.insert(r, P(3.5, 4)); + assert(c.size() == 2); + assert(r->first == 3.5); + assert(r->second == 4); + + r = c.insert(e, P(4.5, 4)); + assert(c.size() == 3); + assert(r->first == 4.5); + assert(r->second == 4); + + r = c.insert(e, P(5.5, 4)); + assert(c.size() == 4); + assert(r->first == 5.5); + assert(r->second == 4); + } +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + { + typedef std::unordered_multimap, std::equal_to, + min_allocator>> C; + typedef C::iterator R; + typedef std::pair P; + C c; + C::const_iterator e = c.end(); + R r = c.insert(e, P(3, 3)); + assert(c.size() == 1); + assert(r->first == 3); + assert(r->second == 3); + + r = c.insert(r, P(3, 4)); + assert(c.size() == 2); + assert(r->first == 3); + assert(r->second == 4); + + r = c.insert(e, P(4, 4)); + assert(c.size() == 3); + assert(r->first == 4); + assert(r->second == 4); + + r = c.insert(e, P(5, 4)); + assert(c.size() == 4); + assert(r->first == 5); + assert(r->second == 4); + } +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES +#endif } diff --git a/libcxx/test/containers/unord/unord.multimap/unord.multimap.modifiers/insert_init.pass.cpp b/libcxx/test/containers/unord/unord.multimap/unord.multimap.modifiers/insert_init.pass.cpp index cab85081d873..0a7d8ea55ac9 100644 --- a/libcxx/test/containers/unord/unord.multimap/unord.multimap.modifiers/insert_init.pass.cpp +++ b/libcxx/test/containers/unord/unord.multimap/unord.multimap.modifiers/insert_init.pass.cpp @@ -20,6 +20,7 @@ #include #include "test_iterators.h" +#include "../../../min_allocator.h" int main() { @@ -69,5 +70,53 @@ int main() assert(std::distance(c.begin(), c.end()) == c.size()); assert(std::distance(c.cbegin(), c.cend()) == c.size()); } +#if __cplusplus >= 201103L + { + typedef std::unordered_multimap, std::equal_to, + min_allocator>> C; + typedef std::pair P; + C c; + c.insert( + { + P(1, "one"), + P(2, "two"), + P(3, "three"), + P(4, "four"), + P(1, "four"), + P(2, "four"), + } + ); + assert(c.size() == 6); + typedef std::pair Eq; + Eq eq = c.equal_range(1); + assert(std::distance(eq.first, eq.second) == 2); + C::iterator k = eq.first; + assert(k->first == 1); + assert(k->second == "one"); + ++k; + assert(k->first == 1); + assert(k->second == "four"); + eq = c.equal_range(2); + assert(std::distance(eq.first, eq.second) == 2); + k = eq.first; + assert(k->first == 2); + assert(k->second == "two"); + ++k; + assert(k->first == 2); + assert(k->second == "four"); + eq = c.equal_range(3); + assert(std::distance(eq.first, eq.second) == 1); + k = eq.first; + assert(k->first == 3); + assert(k->second == "three"); + eq = c.equal_range(4); + assert(std::distance(eq.first, eq.second) == 1); + k = eq.first; + assert(k->first == 4); + assert(k->second == "four"); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + } +#endif #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS } diff --git a/libcxx/test/containers/unord/unord.multimap/unord.multimap.modifiers/insert_range.pass.cpp b/libcxx/test/containers/unord/unord.multimap/unord.multimap.modifiers/insert_range.pass.cpp index fa445472774e..bda1958c251c 100644 --- a/libcxx/test/containers/unord/unord.multimap/unord.multimap.modifiers/insert_range.pass.cpp +++ b/libcxx/test/containers/unord/unord.multimap/unord.multimap.modifiers/insert_range.pass.cpp @@ -21,6 +21,7 @@ #include #include "test_iterators.h" +#include "../../../min_allocator.h" int main() { @@ -69,4 +70,52 @@ int main() assert(std::distance(c.begin(), c.end()) == c.size()); assert(std::distance(c.cbegin(), c.cend()) == c.size()); } +#if __cplusplus >= 201103L + { + typedef std::unordered_multimap, std::equal_to, + min_allocator>> C; + typedef std::pair P; + P a[] = + { + P(1, "one"), + P(2, "two"), + P(3, "three"), + P(4, "four"), + P(1, "four"), + P(2, "four"), + }; + C c; + c.insert(input_iterator(a), input_iterator(a + sizeof(a)/sizeof(a[0]))); + assert(c.size() == 6); + typedef std::pair Eq; + Eq eq = c.equal_range(1); + assert(std::distance(eq.first, eq.second) == 2); + C::iterator k = eq.first; + assert(k->first == 1); + assert(k->second == "one"); + ++k; + assert(k->first == 1); + assert(k->second == "four"); + eq = c.equal_range(2); + assert(std::distance(eq.first, eq.second) == 2); + k = eq.first; + assert(k->first == 2); + assert(k->second == "two"); + ++k; + assert(k->first == 2); + assert(k->second == "four"); + eq = c.equal_range(3); + assert(std::distance(eq.first, eq.second) == 1); + k = eq.first; + assert(k->first == 3); + assert(k->second == "three"); + eq = c.equal_range(4); + assert(std::distance(eq.first, eq.second) == 1); + k = eq.first; + assert(k->first == 4); + assert(k->second == "four"); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.multimap/unord.multimap.modifiers/insert_rvalue.pass.cpp b/libcxx/test/containers/unord/unord.multimap/unord.multimap.modifiers/insert_rvalue.pass.cpp index dceada2e1037..c8bd1284ab41 100644 --- a/libcxx/test/containers/unord/unord.multimap/unord.multimap.modifiers/insert_rvalue.pass.cpp +++ b/libcxx/test/containers/unord/unord.multimap/unord.multimap.modifiers/insert_rvalue.pass.cpp @@ -21,6 +21,7 @@ #include #include "../../../MoveOnly.h" +#include "../../../min_allocator.h" int main() { @@ -76,4 +77,60 @@ int main() assert(r->second == 4); } #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES +#if __cplusplus >= 201103L + { + typedef std::unordered_multimap, std::equal_to, + min_allocator>> C; + typedef C::iterator R; + typedef std::pair P; + C c; + R r = c.insert(P(3.5, 3)); + assert(c.size() == 1); + assert(r->first == 3.5); + assert(r->second == 3); + + r = c.insert(P(3.5, 4)); + assert(c.size() == 2); + assert(r->first == 3.5); + assert(r->second == 4); + + r = c.insert(P(4.5, 4)); + assert(c.size() == 3); + assert(r->first == 4.5); + assert(r->second == 4); + + r = c.insert(P(5.5, 4)); + assert(c.size() == 4); + assert(r->first == 5.5); + assert(r->second == 4); + } +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + { + typedef std::unordered_multimap, std::equal_to, + min_allocator>> C; + typedef C::iterator R; + typedef std::pair P; + C c; + R r = c.insert(P(3, 3)); + assert(c.size() == 1); + assert(r->first == 3); + assert(r->second == 3); + + r = c.insert(P(3, 4)); + assert(c.size() == 2); + assert(r->first == 3); + assert(r->second == 4); + + r = c.insert(P(4, 4)); + assert(c.size() == 3); + assert(r->first == 4); + assert(r->second == 4); + + r = c.insert(P(5, 4)); + assert(c.size() == 4); + assert(r->first == 5); + assert(r->second == 4); + } +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES +#endif } diff --git a/libcxx/test/containers/unord/unord.multimap/unord.multimap.swap/swap_non_member.pass.cpp b/libcxx/test/containers/unord/unord.multimap/unord.multimap.swap/swap_non_member.pass.cpp index d7f25700afa5..0b5c5c3cd9fb 100644 --- a/libcxx/test/containers/unord/unord.multimap/unord.multimap.swap/swap_non_member.pass.cpp +++ b/libcxx/test/containers/unord/unord.multimap/unord.multimap.swap/swap_non_member.pass.cpp @@ -22,6 +22,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -394,4 +395,190 @@ int main() assert(std::distance(c2.cbegin(), c2.cend()) == c2.size()); assert(c2.max_load_factor() == 1); } +#if __cplusplus >= 201103L + { + typedef test_hash > Hash; + typedef test_compare > Compare; + typedef min_allocator > Alloc; + typedef std::unordered_multimap C; + typedef std::pair P; + C c1(0, Hash(1), Compare(1), Alloc()); + C c2(0, Hash(2), Compare(2), Alloc()); + c2.max_load_factor(2); + swap(c1, c2); + + assert(c1.bucket_count() == 0); + assert(c1.size() == 0); + assert(c1.hash_function() == Hash(2)); + assert(c1.key_eq() == Compare(2)); + assert(c1.get_allocator() == Alloc()); + assert(std::distance(c1.begin(), c1.end()) == c1.size()); + assert(std::distance(c1.cbegin(), c1.cend()) == c1.size()); + assert(c1.max_load_factor() == 2); + + assert(c2.bucket_count() == 0); + assert(c2.size() == 0); + assert(c2.hash_function() == Hash(1)); + assert(c2.key_eq() == Compare(1)); + assert(c2.get_allocator() == Alloc()); + assert(std::distance(c2.begin(), c2.end()) == c2.size()); + assert(std::distance(c2.cbegin(), c2.cend()) == c2.size()); + assert(c2.max_load_factor() == 1); + } + { + typedef test_hash > Hash; + typedef test_compare > Compare; + typedef min_allocator > Alloc; + typedef std::unordered_multimap C; + typedef std::pair P; + P a2[] = + { + P(10, "ten"), + P(20, "twenty"), + P(30, "thirty"), + P(40, "fourty"), + P(50, "fifty"), + P(60, "sixty"), + P(70, "seventy"), + P(80, "eighty"), + }; + C c1(0, Hash(1), Compare(1), Alloc()); + C c2(std::begin(a2), std::end(a2), 0, Hash(2), Compare(2), Alloc()); + c2.max_load_factor(2); + swap(c1, c2); + + assert(c1.bucket_count() >= 11); + assert(c1.size() == 8); + assert(c1.find(10)->second == "ten"); + assert(c1.find(20)->second == "twenty"); + assert(c1.find(30)->second == "thirty"); + assert(c1.find(40)->second == "fourty"); + assert(c1.find(50)->second == "fifty"); + assert(c1.find(60)->second == "sixty"); + assert(c1.find(70)->second == "seventy"); + assert(c1.find(80)->second == "eighty"); + assert(c1.hash_function() == Hash(2)); + assert(c1.key_eq() == Compare(2)); + assert(c1.get_allocator() == Alloc()); + assert(std::distance(c1.begin(), c1.end()) == c1.size()); + assert(std::distance(c1.cbegin(), c1.cend()) == c1.size()); + assert(c1.max_load_factor() == 2); + + assert(c2.bucket_count() == 0); + assert(c2.size() == 0); + assert(c2.hash_function() == Hash(1)); + assert(c2.key_eq() == Compare(1)); + assert(c2.get_allocator() == Alloc()); + assert(std::distance(c2.begin(), c2.end()) == c2.size()); + assert(std::distance(c2.cbegin(), c2.cend()) == c2.size()); + assert(c2.max_load_factor() == 1); + } + { + typedef test_hash > Hash; + typedef test_compare > Compare; + typedef min_allocator > Alloc; + typedef std::unordered_multimap C; + typedef std::pair P; + P a1[] = + { + P(1, "one"), + P(2, "two"), + P(3, "three"), + P(4, "four"), + P(1, "four"), + P(2, "four"), + }; + C c1(std::begin(a1), std::end(a1), 0, Hash(1), Compare(1), Alloc()); + C c2(0, Hash(2), Compare(2), Alloc()); + c2.max_load_factor(2); + swap(c1, c2); + + assert(c1.bucket_count() == 0); + assert(c1.size() == 0); + assert(c1.hash_function() == Hash(2)); + assert(c1.key_eq() == Compare(2)); + assert(c1.get_allocator() == Alloc()); + assert(std::distance(c1.begin(), c1.end()) == c1.size()); + assert(std::distance(c1.cbegin(), c1.cend()) == c1.size()); + assert(c1.max_load_factor() == 2); + + assert(c2.bucket_count() >= 7); + assert(c2.size() == 6); + assert(c2.find(1)->second == "one"); + assert(next(c2.find(1))->second == "four"); + assert(c2.find(2)->second == "two"); + assert(next(c2.find(2))->second == "four"); + assert(c2.find(3)->second == "three"); + assert(c2.find(4)->second == "four"); + assert(c2.hash_function() == Hash(1)); + assert(c2.key_eq() == Compare(1)); + assert(c2.get_allocator() == Alloc()); + assert(std::distance(c2.begin(), c2.end()) == c2.size()); + assert(std::distance(c2.cbegin(), c2.cend()) == c2.size()); + assert(c2.max_load_factor() == 1); + } + { + typedef test_hash > Hash; + typedef test_compare > Compare; + typedef min_allocator > Alloc; + typedef std::unordered_multimap C; + typedef std::pair P; + P a1[] = + { + P(1, "one"), + P(2, "two"), + P(3, "three"), + P(4, "four"), + P(1, "four"), + P(2, "four"), + }; + P a2[] = + { + P(10, "ten"), + P(20, "twenty"), + P(30, "thirty"), + P(40, "fourty"), + P(50, "fifty"), + P(60, "sixty"), + P(70, "seventy"), + P(80, "eighty"), + }; + C c1(std::begin(a1), std::end(a1), 0, Hash(1), Compare(1), Alloc()); + C c2(std::begin(a2), std::end(a2), 0, Hash(2), Compare(2), Alloc()); + c2.max_load_factor(2); + swap(c1, c2); + + assert(c1.bucket_count() >= 11); + assert(c1.size() == 8); + assert(c1.find(10)->second == "ten"); + assert(c1.find(20)->second == "twenty"); + assert(c1.find(30)->second == "thirty"); + assert(c1.find(40)->second == "fourty"); + assert(c1.find(50)->second == "fifty"); + assert(c1.find(60)->second == "sixty"); + assert(c1.find(70)->second == "seventy"); + assert(c1.find(80)->second == "eighty"); + assert(c1.hash_function() == Hash(2)); + assert(c1.key_eq() == Compare(2)); + assert(c1.get_allocator() == Alloc()); + assert(std::distance(c1.begin(), c1.end()) == c1.size()); + assert(std::distance(c1.cbegin(), c1.cend()) == c1.size()); + assert(c1.max_load_factor() == 2); + + assert(c2.bucket_count() >= 7); + assert(c2.size() == 6); + assert(c2.find(1)->second == "one"); + assert(next(c2.find(1))->second == "four"); + assert(c2.find(2)->second == "two"); + assert(next(c2.find(2))->second == "four"); + assert(c2.find(3)->second == "three"); + assert(c2.find(4)->second == "four"); + assert(c2.hash_function() == Hash(1)); + assert(c2.key_eq() == Compare(1)); + assert(c2.get_allocator() == Alloc()); + assert(std::distance(c2.begin(), c2.end()) == c2.size()); + assert(std::distance(c2.cbegin(), c2.cend()) == c2.size()); + assert(c2.max_load_factor() == 1); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.multiset/bucket.pass.cpp b/libcxx/test/containers/unord/unord.multiset/bucket.pass.cpp index cab661be19c5..99a72ab8498f 100644 --- a/libcxx/test/containers/unord/unord.multiset/bucket.pass.cpp +++ b/libcxx/test/containers/unord/unord.multiset/bucket.pass.cpp @@ -18,6 +18,8 @@ #include #include +#include "../../min_allocator.h" + int main() { { @@ -38,4 +40,25 @@ int main() for (size_t i = 0; i < 13; ++i) assert(c.bucket(i) == i % bc); } +#if __cplusplus >= 201103L + { + typedef std::unordered_multiset, + std::equal_to, min_allocator> C; + typedef int P; + P a[] = + { + P(1), + P(2), + P(3), + P(4), + P(1), + P(2) + }; + const C c(std::begin(a), std::end(a)); + size_t bc = c.bucket_count(); + assert(bc >= 7); + for (size_t i = 0; i < 13; ++i) + assert(c.bucket(i) == i % bc); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.multiset/bucket_count.pass.cpp b/libcxx/test/containers/unord/unord.multiset/bucket_count.pass.cpp index d2469b62b8d8..36c45b0554b0 100644 --- a/libcxx/test/containers/unord/unord.multiset/bucket_count.pass.cpp +++ b/libcxx/test/containers/unord/unord.multiset/bucket_count.pass.cpp @@ -18,6 +18,8 @@ #include #include +#include "../../min_allocator.h" + int main() { { @@ -45,4 +47,33 @@ int main() const C c(std::begin(a), std::end(a)); assert(c.bucket_count() >= 11); } +#if __cplusplus >= 201103L + { + typedef std::unordered_multiset, + std::equal_to, min_allocator> C; + typedef C::const_iterator I; + typedef int P; + const C c; + assert(c.bucket_count() == 0); + } + { + typedef std::unordered_multiset, + std::equal_to, min_allocator> C; + typedef C::const_iterator I; + typedef int P; + P a[] = + { + P(10), + P(20), + P(30), + P(40), + P(50), + P(60), + P(70), + P(80) + }; + const C c(std::begin(a), std::end(a)); + assert(c.bucket_count() >= 11); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.multiset/bucket_size.pass.cpp b/libcxx/test/containers/unord/unord.multiset/bucket_size.pass.cpp index 6e04ccf874b7..0f2977ded8de 100644 --- a/libcxx/test/containers/unord/unord.multiset/bucket_size.pass.cpp +++ b/libcxx/test/containers/unord/unord.multiset/bucket_size.pass.cpp @@ -18,6 +18,8 @@ #include #include +#include "../../min_allocator.h" + int main() { { @@ -42,4 +44,29 @@ int main() assert(c.bucket_size(5) == 0); assert(c.bucket_size(6) == 0); } +#if __cplusplus >= 201103L + { + typedef std::unordered_multiset, + std::equal_to, min_allocator> C; + typedef int P; + P a[] = + { + P(1), + P(2), + P(3), + P(4), + P(1), + P(2) + }; + const C c(std::begin(a), std::end(a)); + assert(c.bucket_count() >= 7); + assert(c.bucket_size(0) == 0); + assert(c.bucket_size(1) == 2); + assert(c.bucket_size(2) == 2); + assert(c.bucket_size(3) == 1); + assert(c.bucket_size(4) == 1); + assert(c.bucket_size(5) == 0); + assert(c.bucket_size(6) == 0); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.multiset/clear.pass.cpp b/libcxx/test/containers/unord/unord.multiset/clear.pass.cpp index 21c9a90b9691..73916312d6ea 100644 --- a/libcxx/test/containers/unord/unord.multiset/clear.pass.cpp +++ b/libcxx/test/containers/unord/unord.multiset/clear.pass.cpp @@ -18,6 +18,8 @@ #include #include +#include "../../min_allocator.h" + int main() { { @@ -36,4 +38,23 @@ int main() c.clear(); assert(c.size() == 0); } +#if __cplusplus >= 201103L + { + typedef std::unordered_multiset, + std::equal_to, min_allocator> C; + typedef int P; + P a[] = + { + P(1), + P(2), + P(3), + P(4), + P(1), + P(2) + }; + C c(a, a + sizeof(a)/sizeof(a[0])); + c.clear(); + assert(c.size() == 0); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.multiset/count.pass.cpp b/libcxx/test/containers/unord/unord.multiset/count.pass.cpp index 74447ef2fbd1..426b5f88b56b 100644 --- a/libcxx/test/containers/unord/unord.multiset/count.pass.cpp +++ b/libcxx/test/containers/unord/unord.multiset/count.pass.cpp @@ -18,6 +18,8 @@ #include #include +#include "../../min_allocator.h" + int main() { { @@ -41,4 +43,28 @@ int main() assert(c.count(50) == 3); assert(c.count(5) == 0); } +#if __cplusplus >= 201103L + { + typedef std::unordered_multiset, + std::equal_to, min_allocator> C; + typedef int P; + P a[] = + { + P(10), + P(20), + P(30), + P(40), + P(50), + P(50), + P(50), + P(60), + P(70), + P(80) + }; + const C c(std::begin(a), std::end(a)); + assert(c.count(30) == 1); + assert(c.count(50) == 3); + assert(c.count(5) == 0); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.multiset/emplace.pass.cpp b/libcxx/test/containers/unord/unord.multiset/emplace.pass.cpp index b1513054b379..78478831bd26 100644 --- a/libcxx/test/containers/unord/unord.multiset/emplace.pass.cpp +++ b/libcxx/test/containers/unord/unord.multiset/emplace.pass.cpp @@ -20,6 +20,7 @@ #include #include "../../Emplaceable.h" +#include "../../min_allocator.h" int main() { @@ -40,5 +41,24 @@ int main() assert(c.size() == 3); assert(*r == Emplaceable(5, 6)); } +#if __cplusplus >= 201103L + { + typedef std::unordered_multiset, + std::equal_to, min_allocator> C; + typedef C::iterator R; + C c; + R r = c.emplace(); + assert(c.size() == 1); + assert(*r == Emplaceable()); + + r = c.emplace(Emplaceable(5, 6)); + assert(c.size() == 2); + assert(*r == Emplaceable(5, 6)); + + r = c.emplace(5, 6); + assert(c.size() == 3); + assert(*r == Emplaceable(5, 6)); + } +#endif #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES } diff --git a/libcxx/test/containers/unord/unord.multiset/emplace_hint.pass.cpp b/libcxx/test/containers/unord/unord.multiset/emplace_hint.pass.cpp index 1e529b0cb240..25a3b7591cdf 100644 --- a/libcxx/test/containers/unord/unord.multiset/emplace_hint.pass.cpp +++ b/libcxx/test/containers/unord/unord.multiset/emplace_hint.pass.cpp @@ -20,6 +20,7 @@ #include #include "../../Emplaceable.h" +#include "../../min_allocator.h" int main() { @@ -41,5 +42,25 @@ int main() assert(c.size() == 3); assert(*r == Emplaceable(5, 6)); } +#if __cplusplus >= 201103L + { + typedef std::unordered_multiset, + std::equal_to, min_allocator> C; + typedef C::iterator R; + C c; + C::const_iterator e = c.end(); + R r = c.emplace_hint(e); + assert(c.size() == 1); + assert(*r == Emplaceable()); + + r = c.emplace_hint(e, Emplaceable(5, 6)); + assert(c.size() == 2); + assert(*r == Emplaceable(5, 6)); + + r = c.emplace_hint(r, 5, 6); + assert(c.size() == 3); + assert(*r == Emplaceable(5, 6)); + } +#endif #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES } diff --git a/libcxx/test/containers/unord/unord.multiset/eq.pass.cpp b/libcxx/test/containers/unord/unord.multiset/eq.pass.cpp index 6ac9ac8e26a6..7350e4444ae3 100644 --- a/libcxx/test/containers/unord/unord.multiset/eq.pass.cpp +++ b/libcxx/test/containers/unord/unord.multiset/eq.pass.cpp @@ -22,6 +22,8 @@ #include #include +#include "../../min_allocator.h" + int main() { { @@ -97,4 +99,82 @@ int main() assert( (c1 == c2)); assert(!(c1 != c2)); } +#if __cplusplus >= 201103L + { + typedef std::unordered_multiset, + std::equal_to, min_allocator> C; + typedef int P; + P a[] = + { + P(10), + P(20), + P(20), + P(30), + P(40), + P(50), + P(50), + P(50), + P(60), + P(70), + P(80) + }; + const C c1(std::begin(a), std::end(a)); + const C c2; + assert(!(c1 == c2)); + assert( (c1 != c2)); + } + { + typedef std::unordered_multiset, + std::equal_to, min_allocator> C; + typedef int P; + P a[] = + { + P(10), + P(20), + P(20), + P(30), + P(40), + P(50), + P(50), + P(50), + P(60), + P(70), + P(80) + }; + const C c1(std::begin(a), std::end(a)); + const C c2 = c1; + assert( (c1 == c2)); + assert(!(c1 != c2)); + } + { + typedef std::unordered_multiset, + std::equal_to, min_allocator> C; + typedef int P; + P a[] = + { + P(10), + P(20), + P(20), + P(30), + P(40), + P(50), + P(50), + P(50), + P(60), + P(70), + P(80) + }; + C c1(std::begin(a), std::end(a)); + C c2 = c1; + c2.rehash(30); + assert( (c1 == c2)); + assert(!(c1 != c2)); + c2.insert(P(90)); + assert(!(c1 == c2)); + assert( (c1 != c2)); + c1.insert(P(90)); + assert( (c1 == c2)); + assert(!(c1 != c2)); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.multiset/equal_range_const.pass.cpp b/libcxx/test/containers/unord/unord.multiset/equal_range_const.pass.cpp index 91df12767947..3fe242f58eb2 100644 --- a/libcxx/test/containers/unord/unord.multiset/equal_range_const.pass.cpp +++ b/libcxx/test/containers/unord/unord.multiset/equal_range_const.pass.cpp @@ -18,6 +18,8 @@ #include #include +#include "../../min_allocator.h" + int main() { { @@ -51,4 +53,38 @@ int main() ++r.first; assert(*r.first == 50); } +#if __cplusplus >= 201103L + { + typedef std::unordered_multiset, + std::equal_to, min_allocator> C; + typedef C::const_iterator I; + typedef int P; + P a[] = + { + P(10), + P(20), + P(30), + P(40), + P(50), + P(50), + P(50), + P(60), + P(70), + P(80) + }; + const C c(std::begin(a), std::end(a)); + std::pair r = c.equal_range(30); + assert(std::distance(r.first, r.second) == 1); + assert(*r.first == 30); + r = c.equal_range(5); + assert(std::distance(r.first, r.second) == 0); + r = c.equal_range(50); + assert(std::distance(r.first, r.second) == 3); + assert(*r.first == 50); + ++r.first; + assert(*r.first == 50); + ++r.first; + assert(*r.first == 50); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.multiset/equal_range_non_const.pass.cpp b/libcxx/test/containers/unord/unord.multiset/equal_range_non_const.pass.cpp index c0f974ae4733..ebda719bdcb5 100644 --- a/libcxx/test/containers/unord/unord.multiset/equal_range_non_const.pass.cpp +++ b/libcxx/test/containers/unord/unord.multiset/equal_range_non_const.pass.cpp @@ -18,6 +18,8 @@ #include #include +#include "../../min_allocator.h" + int main() { { @@ -51,4 +53,38 @@ int main() ++r.first; assert(*r.first == 50); } +#if __cplusplus >= 201103L + { + typedef std::unordered_multiset, + std::equal_to, min_allocator> C; + typedef C::iterator I; + typedef int P; + P a[] = + { + P(10), + P(20), + P(30), + P(40), + P(50), + P(50), + P(50), + P(60), + P(70), + P(80) + }; + C c(std::begin(a), std::end(a)); + std::pair r = c.equal_range(30); + assert(std::distance(r.first, r.second) == 1); + assert(*r.first == 30); + r = c.equal_range(5); + assert(std::distance(r.first, r.second) == 0); + r = c.equal_range(50); + assert(std::distance(r.first, r.second) == 3); + assert(*r.first == 50); + ++r.first; + assert(*r.first == 50); + ++r.first; + assert(*r.first == 50); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.multiset/erase_const_iter.pass.cpp b/libcxx/test/containers/unord/unord.multiset/erase_const_iter.pass.cpp index 658f50fba60f..6cb2c72cccd4 100644 --- a/libcxx/test/containers/unord/unord.multiset/erase_const_iter.pass.cpp +++ b/libcxx/test/containers/unord/unord.multiset/erase_const_iter.pass.cpp @@ -18,6 +18,8 @@ #include #include +#include "../../min_allocator.h" + int main() { { @@ -41,4 +43,28 @@ int main() assert(c.count(3) == 1); assert(c.count(4) == 1); } +#if __cplusplus >= 201103L + { + typedef std::unordered_multiset, + std::equal_to, min_allocator> C; + typedef int P; + P a[] = + { + P(1), + P(2), + P(3), + P(4), + P(1), + P(2) + }; + C c(a, a + sizeof(a)/sizeof(a[0])); + C::const_iterator i = c.find(2); + C::iterator j = c.erase(i); + assert(c.size() == 5); + assert(c.count(1) == 2); + assert(c.count(2) == 1); + assert(c.count(3) == 1); + assert(c.count(4) == 1); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.multiset/erase_key.pass.cpp b/libcxx/test/containers/unord/unord.multiset/erase_key.pass.cpp index ecb974ea9aca..b0b681586665 100644 --- a/libcxx/test/containers/unord/unord.multiset/erase_key.pass.cpp +++ b/libcxx/test/containers/unord/unord.multiset/erase_key.pass.cpp @@ -19,6 +19,8 @@ #include #include +#include "../../min_allocator.h" + int main() { { @@ -77,4 +79,63 @@ int main() assert(c.erase(3) == 0); assert(c.size() == 0); } +#if __cplusplus >= 201103L + { + typedef std::unordered_multiset, + std::equal_to, min_allocator> C; + typedef int P; + P a[] = + { + P(1), + P(2), + P(3), + P(4), + P(1), + P(2) + }; + C c(a, a + sizeof(a)/sizeof(a[0])); + assert(c.erase(5) == 0); + assert(c.size() == 6); + assert(c.count(1) == 2); + assert(c.count(2) == 2); + assert(c.count(3) == 1); + assert(c.count(4) == 1); + + assert(c.erase(2) == 2); + assert(c.size() == 4); + assert(c.count(1) == 2); + assert(c.count(3) == 1); + assert(c.count(4) == 1); + + assert(c.erase(2) == 0); + assert(c.size() == 4); + assert(c.count(1) == 2); + assert(c.count(3) == 1); + assert(c.count(4) == 1); + + assert(c.erase(4) == 1); + assert(c.size() == 3); + assert(c.count(1) == 2); + assert(c.count(3) == 1); + + assert(c.erase(4) == 0); + assert(c.size() == 3); + assert(c.count(1) == 2); + assert(c.count(3) == 1); + + assert(c.erase(1) == 2); + assert(c.size() == 1); + assert(c.count(3) == 1); + + assert(c.erase(1) == 0); + assert(c.size() == 1); + assert(c.count(3) == 1); + + assert(c.erase(3) == 1); + assert(c.size() == 0); + + assert(c.erase(3) == 0); + assert(c.size() == 0); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.multiset/erase_range.pass.cpp b/libcxx/test/containers/unord/unord.multiset/erase_range.pass.cpp index cf2777517d15..601c4b3be1e9 100644 --- a/libcxx/test/containers/unord/unord.multiset/erase_range.pass.cpp +++ b/libcxx/test/containers/unord/unord.multiset/erase_range.pass.cpp @@ -18,6 +18,8 @@ #include #include +#include "../../min_allocator.h" + int main() { { @@ -53,4 +55,40 @@ int main() assert(c.size() == 0); assert(k == c.end()); } +#if __cplusplus >= 201103L + { + typedef std::unordered_multiset, + std::equal_to, min_allocator> C; + typedef int P; + P a[] = + { + P(1), + P(2), + P(3), + P(4), + P(1), + P(2) + }; + C c(a, a + sizeof(a)/sizeof(a[0])); + C::const_iterator i = c.find(2); + C::const_iterator j = next(i, 2); + C::iterator k = c.erase(i, i); + assert(k == i); + assert(c.size() == 6); + assert(c.count(1) == 2); + assert(c.count(2) == 2); + assert(c.count(3) == 1); + assert(c.count(4) == 1); + + k = c.erase(i, j); + assert(c.size() == 4); + assert(c.count(1) == 2); + assert(c.count(3) == 1); + assert(c.count(4) == 1); + + k = c.erase(c.cbegin(), c.cend()); + assert(c.size() == 0); + assert(k == c.end()); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.multiset/find_const.pass.cpp b/libcxx/test/containers/unord/unord.multiset/find_const.pass.cpp index b39e46f4267e..dbe4eae54f23 100644 --- a/libcxx/test/containers/unord/unord.multiset/find_const.pass.cpp +++ b/libcxx/test/containers/unord/unord.multiset/find_const.pass.cpp @@ -18,6 +18,8 @@ #include #include +#include "../../min_allocator.h" + int main() { { @@ -40,4 +42,27 @@ int main() i = c.find(5); assert(i == c.cend()); } +#if __cplusplus >= 201103L + { + typedef std::unordered_multiset, + std::equal_to, min_allocator> C; + typedef int P; + P a[] = + { + P(10), + P(20), + P(30), + P(40), + P(50), + P(60), + P(70), + P(80) + }; + const C c(std::begin(a), std::end(a)); + C::const_iterator i = c.find(30); + assert(*i == 30); + i = c.find(5); + assert(i == c.cend()); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.multiset/find_non_const.pass.cpp b/libcxx/test/containers/unord/unord.multiset/find_non_const.pass.cpp index e6ac8551cbcc..af6301807414 100644 --- a/libcxx/test/containers/unord/unord.multiset/find_non_const.pass.cpp +++ b/libcxx/test/containers/unord/unord.multiset/find_non_const.pass.cpp @@ -18,6 +18,8 @@ #include #include +#include "../../min_allocator.h" + int main() { { @@ -40,4 +42,27 @@ int main() i = c.find(5); assert(i == c.cend()); } +#if __cplusplus >= 201103L + { + typedef std::unordered_multiset, + std::equal_to, min_allocator> C; + typedef int P; + P a[] = + { + P(10), + P(20), + P(30), + P(40), + P(50), + P(60), + P(70), + P(80) + }; + C c(std::begin(a), std::end(a)); + C::iterator i = c.find(30); + assert(*i == 30); + i = c.find(5); + assert(i == c.cend()); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.multiset/insert_const_lvalue.pass.cpp b/libcxx/test/containers/unord/unord.multiset/insert_const_lvalue.pass.cpp index 6e4b9a10ef2e..ce469976c827 100644 --- a/libcxx/test/containers/unord/unord.multiset/insert_const_lvalue.pass.cpp +++ b/libcxx/test/containers/unord/unord.multiset/insert_const_lvalue.pass.cpp @@ -18,6 +18,8 @@ #include #include +#include "../../min_allocator.h" + int main() { { @@ -41,4 +43,28 @@ int main() assert(c.size() == 4); assert(*r == 5.5); } +#if __cplusplus >= 201103L + { + typedef std::unordered_multiset, + std::equal_to, min_allocator> C; + typedef C::iterator R; + typedef C::value_type P; + C c; + R r = c.insert(P(3.5)); + assert(c.size() == 1); + assert(*r == 3.5); + + r = c.insert(P(3.5)); + assert(c.size() == 2); + assert(*r == 3.5); + + r = c.insert(P(4.5)); + assert(c.size() == 3); + assert(*r == 4.5); + + r = c.insert(P(5.5)); + assert(c.size() == 4); + assert(*r == 5.5); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.multiset/insert_hint_const_lvalue.pass.cpp b/libcxx/test/containers/unord/unord.multiset/insert_hint_const_lvalue.pass.cpp index 4d949e49fd6f..02b8375f7fea 100644 --- a/libcxx/test/containers/unord/unord.multiset/insert_hint_const_lvalue.pass.cpp +++ b/libcxx/test/containers/unord/unord.multiset/insert_hint_const_lvalue.pass.cpp @@ -18,6 +18,8 @@ #include #include +#include "../../min_allocator.h" + int main() { { @@ -42,4 +44,29 @@ int main() assert(c.size() == 4); assert(*r == 5.5); } +#if __cplusplus >= 201103L + { + typedef std::unordered_multiset, + std::equal_to, min_allocator> C; + typedef C::iterator R; + typedef C::value_type P; + C c; + C::const_iterator e = c.end(); + R r = c.insert(e, P(3.5)); + assert(c.size() == 1); + assert(*r == 3.5); + + r = c.insert(e, P(3.5)); + assert(c.size() == 2); + assert(*r == 3.5); + + r = c.insert(e, P(4.5)); + assert(c.size() == 3); + assert(*r == 4.5); + + r = c.insert(e, P(5.5)); + assert(c.size() == 4); + assert(*r == 5.5); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.multiset/insert_hint_rvalue.pass.cpp b/libcxx/test/containers/unord/unord.multiset/insert_hint_rvalue.pass.cpp index 8239b3432d44..590baa057827 100644 --- a/libcxx/test/containers/unord/unord.multiset/insert_hint_rvalue.pass.cpp +++ b/libcxx/test/containers/unord/unord.multiset/insert_hint_rvalue.pass.cpp @@ -19,6 +19,7 @@ #include #include "../../MoveOnly.h" +#include "../../min_allocator.h" int main() { @@ -68,4 +69,54 @@ int main() assert(*r == 5); } #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES +#if __cplusplus >= 201103L + { + typedef std::unordered_multiset, + std::equal_to, min_allocator> C; + typedef C::iterator R; + typedef double P; + C c; + C::const_iterator e = c.end(); + R r = c.insert(e, P(3.5)); + assert(c.size() == 1); + assert(*r == 3.5); + + r = c.insert(r, P(3.5)); + assert(c.size() == 2); + assert(*r == 3.5); + + r = c.insert(e, P(4.5)); + assert(c.size() == 3); + assert(*r == 4.5); + + r = c.insert(e, P(5.5)); + assert(c.size() == 4); + assert(*r == 5.5); + } +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + { + typedef std::unordered_multiset, + std::equal_to, min_allocator> C; + typedef C::iterator R; + typedef MoveOnly P; + C c; + C::const_iterator e = c.end(); + R r = c.insert(e, P(3)); + assert(c.size() == 1); + assert(*r == 3); + + r = c.insert(r, P(3)); + assert(c.size() == 2); + assert(*r == 3); + + r = c.insert(e, P(4)); + assert(c.size() == 3); + assert(*r == 4); + + r = c.insert(e, P(5)); + assert(c.size() == 4); + assert(*r == 5); + } +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES +#endif } diff --git a/libcxx/test/containers/unord/unord.multiset/insert_init.pass.cpp b/libcxx/test/containers/unord/unord.multiset/insert_init.pass.cpp index db82f65ac5ae..7a9d3f7cfbd9 100644 --- a/libcxx/test/containers/unord/unord.multiset/insert_init.pass.cpp +++ b/libcxx/test/containers/unord/unord.multiset/insert_init.pass.cpp @@ -19,6 +19,7 @@ #include #include "test_iterators.h" +#include "../../min_allocator.h" int main() { @@ -43,5 +44,28 @@ int main() assert(c.count(3) == 1); assert(c.count(4) == 1); } +#if __cplusplus >= 201103L + { + typedef std::unordered_multiset, + std::equal_to, min_allocator> C; + typedef int P; + C c; + c.insert( + { + P(1), + P(2), + P(3), + P(4), + P(1), + P(2) + } + ); + assert(c.size() == 6); + assert(c.count(1) == 2); + assert(c.count(2) == 2); + assert(c.count(3) == 1); + assert(c.count(4) == 1); + } +#endif #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS } diff --git a/libcxx/test/containers/unord/unord.multiset/insert_range.pass.cpp b/libcxx/test/containers/unord/unord.multiset/insert_range.pass.cpp index 93d5e8377352..28637f5f47c8 100644 --- a/libcxx/test/containers/unord/unord.multiset/insert_range.pass.cpp +++ b/libcxx/test/containers/unord/unord.multiset/insert_range.pass.cpp @@ -20,6 +20,7 @@ #include #include "test_iterators.h" +#include "../../min_allocator.h" int main() { @@ -43,4 +44,27 @@ int main() assert(c.count(3) == 1); assert(c.count(4) == 1); } +#if __cplusplus >= 201103L + { + typedef std::unordered_multiset, + std::equal_to, min_allocator> C; + typedef int P; + P a[] = + { + P(1), + P(2), + P(3), + P(4), + P(1), + P(2) + }; + C c; + c.insert(input_iterator(a), input_iterator(a + sizeof(a)/sizeof(a[0]))); + assert(c.size() == 6); + assert(c.count(1) == 2); + assert(c.count(2) == 2); + assert(c.count(3) == 1); + assert(c.count(4) == 1); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.multiset/insert_rvalue.pass.cpp b/libcxx/test/containers/unord/unord.multiset/insert_rvalue.pass.cpp index dd33e4b06115..7cddb0d9094c 100644 --- a/libcxx/test/containers/unord/unord.multiset/insert_rvalue.pass.cpp +++ b/libcxx/test/containers/unord/unord.multiset/insert_rvalue.pass.cpp @@ -19,6 +19,7 @@ #include #include "../../MoveOnly.h" +#include "../../min_allocator.h" int main() { @@ -66,4 +67,52 @@ int main() assert(*r == 5); } #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES +#if __cplusplus >= 201103L + { + typedef std::unordered_multiset, + std::equal_to, min_allocator> C; + typedef C::iterator R; + typedef double P; + C c; + R r = c.insert(P(3.5)); + assert(c.size() == 1); + assert(*r == 3.5); + + r = c.insert(P(3.5)); + assert(c.size() == 2); + assert(*r == 3.5); + + r = c.insert(P(4.5)); + assert(c.size() == 3); + assert(*r == 4.5); + + r = c.insert(P(5.5)); + assert(c.size() == 4); + assert(*r == 5.5); + } +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + { + typedef std::unordered_multiset, + std::equal_to, min_allocator> C; + typedef C::iterator R; + typedef MoveOnly P; + C c; + R r = c.insert(P(3)); + assert(c.size() == 1); + assert(*r == 3); + + r = c.insert(P(3)); + assert(c.size() == 2); + assert(*r == 3); + + r = c.insert(P(4)); + assert(c.size() == 3); + assert(*r == 4); + + r = c.insert(P(5)); + assert(c.size() == 4); + assert(*r == 5); + } +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES +#endif } diff --git a/libcxx/test/containers/unord/unord.multiset/iterators.pass.cpp b/libcxx/test/containers/unord/unord.multiset/iterators.pass.cpp index 1da860676627..ddfc3742f5c7 100644 --- a/libcxx/test/containers/unord/unord.multiset/iterators.pass.cpp +++ b/libcxx/test/containers/unord/unord.multiset/iterators.pass.cpp @@ -23,6 +23,8 @@ #include #include +#include "../../min_allocator.h" + int main() { { @@ -63,4 +65,46 @@ int main() assert(std::distance(c.cbegin(), c.cend()) == c.size()); C::const_iterator i; } +#if __cplusplus >= 201103L + { + typedef std::unordered_multiset, + std::equal_to, min_allocator> C; + typedef int P; + P a[] = + { + P(1), + P(2), + P(3), + P(4), + P(1), + P(2) + }; + C c(a, a + sizeof(a)/sizeof(a[0])); + assert(c.bucket_count() >= 7); + assert(c.size() == 6); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + C::iterator i; + } + { + typedef std::unordered_multiset, + std::equal_to, min_allocator> C; + typedef int P; + P a[] = + { + P(1), + P(2), + P(3), + P(4), + P(1), + P(2) + }; + const C c(a, a + sizeof(a)/sizeof(a[0])); + assert(c.bucket_count() >= 7); + assert(c.size() == 6); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + C::const_iterator i; + } +#endif } diff --git a/libcxx/test/containers/unord/unord.multiset/load_factor.pass.cpp b/libcxx/test/containers/unord/unord.multiset/load_factor.pass.cpp index 664a2a790e61..c6e4825fcbaa 100644 --- a/libcxx/test/containers/unord/unord.multiset/load_factor.pass.cpp +++ b/libcxx/test/containers/unord/unord.multiset/load_factor.pass.cpp @@ -19,6 +19,8 @@ #include #include +#include "../../min_allocator.h" + int main() { { @@ -44,4 +46,31 @@ int main() const C c; assert(c.load_factor() == 0); } +#if __cplusplus >= 201103L + { + typedef std::unordered_multiset, + std::equal_to, min_allocator> C; + typedef int P; + P a[] = + { + P(10), + P(20), + P(30), + P(40), + P(50), + P(60), + P(70), + P(80) + }; + const C c(std::begin(a), std::end(a)); + assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); + } + { + typedef std::unordered_multiset, + std::equal_to, min_allocator> C; + typedef int P; + const C c; + assert(c.load_factor() == 0); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.multiset/local_iterators.pass.cpp b/libcxx/test/containers/unord/unord.multiset/local_iterators.pass.cpp index 51481ac483fb..6cc07b600d84 100644 --- a/libcxx/test/containers/unord/unord.multiset/local_iterators.pass.cpp +++ b/libcxx/test/containers/unord/unord.multiset/local_iterators.pass.cpp @@ -23,6 +23,8 @@ #include #include +#include "../../min_allocator.h" + int main() { { @@ -257,4 +259,242 @@ int main() j = c.cend(b); assert(std::distance(i, j) == 0); } +#if __cplusplus >= 201103L + { + typedef std::unordered_multiset, + std::equal_to, min_allocator> C; + typedef int P; + typedef C::local_iterator I; + P a[] = + { + P(1), + P(2), + P(3), + P(4), + P(1), + P(2) + }; + C c(a, a + sizeof(a)/sizeof(a[0])); + assert(c.bucket_count() >= 7); + C::size_type b = c.bucket(0); + I i = c.begin(b); + I j = c.end(b); + assert(std::distance(i, j) == 0); + + b = c.bucket(1); + i = c.begin(b); + j = c.end(b); + assert(std::distance(i, j) == 2); + assert(*i == 1); + ++i; + assert(*i == 1); + + b = c.bucket(2); + i = c.begin(b); + j = c.end(b); + assert(std::distance(i, j) == 2); + assert(*i == 2); + ++i; + assert(*i == 2); + + b = c.bucket(3); + i = c.begin(b); + j = c.end(b); + assert(std::distance(i, j) == 1); + assert(*i == 3); + + b = c.bucket(4); + i = c.begin(b); + j = c.end(b); + assert(std::distance(i, j) == 1); + assert(*i == 4); + + b = c.bucket(5); + i = c.begin(b); + j = c.end(b); + assert(std::distance(i, j) == 0); + + b = c.bucket(6); + i = c.begin(b); + j = c.end(b); + assert(std::distance(i, j) == 0); + } + { + typedef std::unordered_multiset, + std::equal_to, min_allocator> C; + typedef int P; + typedef C::const_local_iterator I; + P a[] = + { + P(1), + P(2), + P(3), + P(4), + P(1), + P(2) + }; + const C c(a, a + sizeof(a)/sizeof(a[0])); + assert(c.bucket_count() >= 7); + C::size_type b = c.bucket(0); + I i = c.begin(b); + I j = c.end(b); + assert(std::distance(i, j) == 0); + + b = c.bucket(1); + i = c.begin(b); + j = c.end(b); + assert(std::distance(i, j) == 2); + assert(*i == 1); + ++i; + assert(*i == 1); + + b = c.bucket(2); + i = c.begin(b); + j = c.end(b); + assert(std::distance(i, j) == 2); + assert(*i == 2); + ++i; + assert(*i == 2); + + b = c.bucket(3); + i = c.begin(b); + j = c.end(b); + assert(std::distance(i, j) == 1); + assert(*i == 3); + + b = c.bucket(4); + i = c.begin(b); + j = c.end(b); + assert(std::distance(i, j) == 1); + assert(*i == 4); + + b = c.bucket(5); + i = c.begin(b); + j = c.end(b); + assert(std::distance(i, j) == 0); + + b = c.bucket(6); + i = c.begin(b); + j = c.end(b); + assert(std::distance(i, j) == 0); + } + { + typedef std::unordered_multiset, + std::equal_to, min_allocator> C; + typedef int P; + typedef C::const_local_iterator I; + P a[] = + { + P(1), + P(2), + P(3), + P(4), + P(1), + P(2) + }; + C c(a, a + sizeof(a)/sizeof(a[0])); + assert(c.bucket_count() >= 7); + C::size_type b = c.bucket(0); + I i = c.cbegin(b); + I j = c.cend(b); + assert(std::distance(i, j) == 0); + + b = c.bucket(1); + i = c.cbegin(b); + j = c.cend(b); + assert(std::distance(i, j) == 2); + assert(*i == 1); + ++i; + assert(*i == 1); + + b = c.bucket(2); + i = c.cbegin(b); + j = c.cend(b); + assert(std::distance(i, j) == 2); + assert(*i == 2); + ++i; + assert(*i == 2); + + b = c.bucket(3); + i = c.cbegin(b); + j = c.cend(b); + assert(std::distance(i, j) == 1); + assert(*i == 3); + + b = c.bucket(4); + i = c.cbegin(b); + j = c.cend(b); + assert(std::distance(i, j) == 1); + assert(*i == 4); + + b = c.bucket(5); + i = c.cbegin(b); + j = c.cend(b); + assert(std::distance(i, j) == 0); + + b = c.bucket(6); + i = c.cbegin(b); + j = c.cend(b); + assert(std::distance(i, j) == 0); + } + { + typedef std::unordered_multiset, + std::equal_to, min_allocator> C; + typedef int P; + typedef C::const_local_iterator I; + P a[] = + { + P(1), + P(2), + P(3), + P(4), + P(1), + P(2) + }; + const C c(a, a + sizeof(a)/sizeof(a[0])); + assert(c.bucket_count() >= 7); + C::size_type b = c.bucket(0); + I i = c.cbegin(b); + I j = c.cend(b); + assert(std::distance(i, j) == 0); + + b = c.bucket(1); + i = c.cbegin(b); + j = c.cend(b); + assert(std::distance(i, j) == 2); + assert(*i == 1); + ++i; + assert(*i == 1); + + b = c.bucket(2); + i = c.cbegin(b); + j = c.cend(b); + assert(std::distance(i, j) == 2); + assert(*i == 2); + ++i; + assert(*i == 2); + + b = c.bucket(3); + i = c.cbegin(b); + j = c.cend(b); + assert(std::distance(i, j) == 1); + assert(*i == 3); + + b = c.bucket(4); + i = c.cbegin(b); + j = c.cend(b); + assert(std::distance(i, j) == 1); + assert(*i == 4); + + b = c.bucket(5); + i = c.cbegin(b); + j = c.cend(b); + assert(std::distance(i, j) == 0); + + b = c.bucket(6); + i = c.cbegin(b); + j = c.cend(b); + assert(std::distance(i, j) == 0); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.multiset/max_bucket_count.pass.cpp b/libcxx/test/containers/unord/unord.multiset/max_bucket_count.pass.cpp index db6d98874be5..fa55a1f8ef22 100644 --- a/libcxx/test/containers/unord/unord.multiset/max_bucket_count.pass.cpp +++ b/libcxx/test/containers/unord/unord.multiset/max_bucket_count.pass.cpp @@ -18,6 +18,8 @@ #include #include +#include "../../min_allocator.h" + int main() { { @@ -25,4 +27,12 @@ int main() const C c; assert(c.max_bucket_count() > 0); } +#if __cplusplus >= 201103L + { + typedef std::unordered_multiset, + std::equal_to, min_allocator> C; + const C c; + assert(c.max_bucket_count() > 0); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.multiset/max_load_factor.pass.cpp b/libcxx/test/containers/unord/unord.multiset/max_load_factor.pass.cpp index d1212d8a885d..f2beb8fe576d 100644 --- a/libcxx/test/containers/unord/unord.multiset/max_load_factor.pass.cpp +++ b/libcxx/test/containers/unord/unord.multiset/max_load_factor.pass.cpp @@ -19,6 +19,8 @@ #include #include +#include "../../min_allocator.h" + int main() { { @@ -35,4 +37,22 @@ int main() c.max_load_factor(2.5); assert(c.max_load_factor() == 2.5); } +#if __cplusplus >= 201103L + { + typedef std::unordered_multiset, + std::equal_to, min_allocator> C; + typedef int P; + const C c; + assert(c.max_load_factor() == 1); + } + { + typedef std::unordered_multiset, + std::equal_to, min_allocator> C; + typedef int P; + C c; + assert(c.max_load_factor() == 1); + c.max_load_factor(2.5); + assert(c.max_load_factor() == 2.5); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.multiset/max_size.pass.cpp b/libcxx/test/containers/unord/unord.multiset/max_size.pass.cpp index fa2938ea9d73..23171294d711 100644 --- a/libcxx/test/containers/unord/unord.multiset/max_size.pass.cpp +++ b/libcxx/test/containers/unord/unord.multiset/max_size.pass.cpp @@ -18,10 +18,19 @@ #include #include +#include "../../min_allocator.h" + int main() { { std::unordered_multiset u; assert(u.max_size() > 0); } +#if __cplusplus >= 201103L + { + std::unordered_multiset, + std::equal_to, min_allocator> u; + assert(u.max_size() > 0); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.multiset/rehash.pass.cpp b/libcxx/test/containers/unord/unord.multiset/rehash.pass.cpp index e82664bf4f35..9358c327c570 100644 --- a/libcxx/test/containers/unord/unord.multiset/rehash.pass.cpp +++ b/libcxx/test/containers/unord/unord.multiset/rehash.pass.cpp @@ -18,7 +18,10 @@ #include #include -void test(const std::unordered_multiset& c) +#include "../../min_allocator.h" + +template +void test(const C& c) { assert(c.size() == 6); assert(c.count(1) == 2); @@ -55,4 +58,33 @@ int main() assert(c.bucket_count() == 31); test(c); } +#if __cplusplus >= 201103L + { + typedef std::unordered_multiset, + std::equal_to, min_allocator> C; + typedef int P; + P a[] = + { + P(1), + P(2), + P(3), + P(4), + P(1), + P(2) + }; + C c(a, a + sizeof(a)/sizeof(a[0])); + test(c); + assert(c.bucket_count() >= 7); + c.rehash(3); + assert(c.bucket_count() == 7); + test(c); + c.max_load_factor(2); + c.rehash(3); + assert(c.bucket_count() == 3); + test(c); + c.rehash(31); + assert(c.bucket_count() == 31); + test(c); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.multiset/reserve.pass.cpp b/libcxx/test/containers/unord/unord.multiset/reserve.pass.cpp index bce82132ef8e..e1c9e0a0f38d 100644 --- a/libcxx/test/containers/unord/unord.multiset/reserve.pass.cpp +++ b/libcxx/test/containers/unord/unord.multiset/reserve.pass.cpp @@ -18,7 +18,10 @@ #include #include -void test(const std::unordered_multiset& c) +#include "../../min_allocator.h" + +template +void test(const C& c) { assert(c.size() == 6); assert(c.count(1) == 2); @@ -55,4 +58,33 @@ int main() assert(c.bucket_count() >= 16); test(c); } +#if __cplusplus >= 201103L + { + typedef std::unordered_multiset, + std::equal_to, min_allocator> C; + typedef int P; + P a[] = + { + P(1), + P(2), + P(3), + P(4), + P(1), + P(2) + }; + C c(a, a + sizeof(a)/sizeof(a[0])); + test(c); + assert(c.bucket_count() >= 7); + c.reserve(3); + assert(c.bucket_count() == 7); + test(c); + c.max_load_factor(2); + c.reserve(3); + assert(c.bucket_count() == 3); + test(c); + c.reserve(31); + assert(c.bucket_count() >= 16); + test(c); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.multiset/swap_member.pass.cpp b/libcxx/test/containers/unord/unord.multiset/swap_member.pass.cpp index 3392eccbfde7..3a7c506f56a6 100644 --- a/libcxx/test/containers/unord/unord.multiset/swap_member.pass.cpp +++ b/libcxx/test/containers/unord/unord.multiset/swap_member.pass.cpp @@ -21,6 +21,7 @@ #include "../../test_compare.h" #include "../../test_hash.h" #include "../../test_allocator.h" +#include "../../min_allocator.h" int main() { @@ -385,4 +386,186 @@ int main() assert(std::distance(c2.cbegin(), c2.cend()) == c2.size()); assert(c2.max_load_factor() == 1); } +#if __cplusplus >= 201103L + { + typedef test_hash > Hash; + typedef test_compare > Compare; + typedef min_allocator Alloc; + typedef std::unordered_multiset C; + typedef int P; + C c1(0, Hash(1), Compare(1), Alloc()); + C c2(0, Hash(2), Compare(2), Alloc()); + c2.max_load_factor(2); + c1.swap(c2); + + assert(c1.bucket_count() == 0); + assert(c1.size() == 0); + assert(c1.hash_function() == Hash(2)); + assert(c1.key_eq() == Compare(2)); + assert(c1.get_allocator() == Alloc()); + assert(std::distance(c1.begin(), c1.end()) == c1.size()); + assert(std::distance(c1.cbegin(), c1.cend()) == c1.size()); + assert(c1.max_load_factor() == 2); + + assert(c2.bucket_count() == 0); + assert(c2.size() == 0); + assert(c2.hash_function() == Hash(1)); + assert(c2.key_eq() == Compare(1)); + assert(c2.get_allocator() == Alloc()); + assert(std::distance(c2.begin(), c2.end()) == c2.size()); + assert(std::distance(c2.cbegin(), c2.cend()) == c2.size()); + assert(c2.max_load_factor() == 1); + } + { + typedef test_hash > Hash; + typedef test_compare > Compare; + typedef min_allocator Alloc; + typedef std::unordered_multiset C; + typedef int P; + P a2[] = + { + P(10), + P(20), + P(30), + P(40), + P(50), + P(60), + P(70), + P(80) + }; + C c1(0, Hash(1), Compare(1), Alloc()); + C c2(std::begin(a2), std::end(a2), 0, Hash(2), Compare(2), Alloc()); + c2.max_load_factor(2); + c1.swap(c2); + + assert(c1.bucket_count() >= 11); + assert(c1.size() == 8); + assert(*c1.find(10) == 10); + assert(*c1.find(20) == 20); + assert(*c1.find(30) == 30); + assert(*c1.find(40) == 40); + assert(*c1.find(50) == 50); + assert(*c1.find(60) == 60); + assert(*c1.find(70) == 70); + assert(*c1.find(80) == 80); + assert(c1.hash_function() == Hash(2)); + assert(c1.key_eq() == Compare(2)); + assert(c1.get_allocator() == Alloc()); + assert(std::distance(c1.begin(), c1.end()) == c1.size()); + assert(std::distance(c1.cbegin(), c1.cend()) == c1.size()); + assert(c1.max_load_factor() == 2); + + assert(c2.bucket_count() == 0); + assert(c2.size() == 0); + assert(c2.hash_function() == Hash(1)); + assert(c2.key_eq() == Compare(1)); + assert(c2.get_allocator() == Alloc()); + assert(std::distance(c2.begin(), c2.end()) == c2.size()); + assert(std::distance(c2.cbegin(), c2.cend()) == c2.size()); + assert(c2.max_load_factor() == 1); + } + { + typedef test_hash > Hash; + typedef test_compare > Compare; + typedef min_allocator Alloc; + typedef std::unordered_multiset C; + typedef int P; + P a1[] = + { + P(1), + P(2), + P(3), + P(4), + P(1), + P(2) + }; + C c1(std::begin(a1), std::end(a1), 0, Hash(1), Compare(1), Alloc()); + C c2(0, Hash(2), Compare(2), Alloc()); + c2.max_load_factor(2); + c1.swap(c2); + + assert(c1.bucket_count() == 0); + assert(c1.size() == 0); + assert(c1.hash_function() == Hash(2)); + assert(c1.key_eq() == Compare(2)); + assert(c1.get_allocator() == Alloc()); + assert(std::distance(c1.begin(), c1.end()) == c1.size()); + assert(std::distance(c1.cbegin(), c1.cend()) == c1.size()); + assert(c1.max_load_factor() == 2); + + assert(c2.bucket_count() >= 7); + assert(c2.size() == 6); + assert(c2.count(1) == 2); + assert(c2.count(2) == 2); + assert(c2.count(3) == 1); + assert(c2.count(4) == 1); + assert(c2.hash_function() == Hash(1)); + assert(c2.key_eq() == Compare(1)); + assert(c2.get_allocator() == Alloc()); + assert(std::distance(c2.begin(), c2.end()) == c2.size()); + assert(std::distance(c2.cbegin(), c2.cend()) == c2.size()); + assert(c2.max_load_factor() == 1); + } + { + typedef test_hash > Hash; + typedef test_compare > Compare; + typedef min_allocator Alloc; + typedef std::unordered_multiset C; + typedef int P; + P a1[] = + { + P(1), + P(2), + P(3), + P(4), + P(1), + P(2) + }; + P a2[] = + { + P(10), + P(20), + P(30), + P(40), + P(50), + P(60), + P(70), + P(80) + }; + C c1(std::begin(a1), std::end(a1), 0, Hash(1), Compare(1), Alloc()); + C c2(std::begin(a2), std::end(a2), 0, Hash(2), Compare(2), Alloc()); + c2.max_load_factor(2); + c1.swap(c2); + + assert(c1.bucket_count() >= 11); + assert(c1.size() == 8); + assert(*c1.find(10) == 10); + assert(*c1.find(20) == 20); + assert(*c1.find(30) == 30); + assert(*c1.find(40) == 40); + assert(*c1.find(50) == 50); + assert(*c1.find(60) == 60); + assert(*c1.find(70) == 70); + assert(*c1.find(80) == 80); + assert(c1.hash_function() == Hash(2)); + assert(c1.key_eq() == Compare(2)); + assert(c1.get_allocator() == Alloc()); + assert(std::distance(c1.begin(), c1.end()) == c1.size()); + assert(std::distance(c1.cbegin(), c1.cend()) == c1.size()); + assert(c1.max_load_factor() == 2); + + assert(c2.bucket_count() >= 7); + assert(c2.size() == 6); + assert(c2.count(1) == 2); + assert(c2.count(2) == 2); + assert(c2.count(3) == 1); + assert(c2.count(4) == 1); + assert(c2.hash_function() == Hash(1)); + assert(c2.key_eq() == Compare(1)); + assert(c2.get_allocator() == Alloc()); + assert(std::distance(c2.begin(), c2.end()) == c2.size()); + assert(std::distance(c2.cbegin(), c2.cend()) == c2.size()); + assert(c2.max_load_factor() == 1); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.multiset/types.pass.cpp b/libcxx/test/containers/unord/unord.multiset/types.pass.cpp index 67a8eb6fc6de..5d7fa3aa6afb 100644 --- a/libcxx/test/containers/unord/unord.multiset/types.pass.cpp +++ b/libcxx/test/containers/unord/unord.multiset/types.pass.cpp @@ -30,6 +30,8 @@ #include #include +#include "../../min_allocator.h" + int main() { { @@ -46,4 +48,21 @@ int main() static_assert((std::is_same::value), ""); static_assert((std::is_same::value), ""); } +#if __cplusplus >= 201103L + { + typedef std::unordered_multiset, + std::equal_to, min_allocator> C; + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same >::value), ""); + static_assert((std::is_same >::value), ""); + static_assert((std::is_same >::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same>::value), ""); + static_assert((std::is_same>::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/allocator.pass.cpp b/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/allocator.pass.cpp index 2299b5e79806..db8ba0e79bd1 100644 --- a/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/allocator.pass.cpp +++ b/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/allocator.pass.cpp @@ -22,6 +22,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -42,4 +43,23 @@ int main() assert(c.load_factor() == 0); assert(c.max_load_factor() == 1); } +#if __cplusplus >= 201103L + { + typedef std::unordered_multiset >, + test_compare >, + min_allocator + > C; + C c(min_allocator{}); + assert(c.bucket_count() == 0); + assert(c.hash_function() == test_hash >()); + assert(c.key_eq() == test_compare >()); + assert(c.get_allocator() == min_allocator()); + assert(c.size() == 0); + assert(c.empty()); + assert(std::distance(c.begin(), c.end()) == 0); + assert(c.load_factor() == 0); + assert(c.max_load_factor() == 1); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/assign_copy.pass.cpp b/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/assign_copy.pass.cpp index dbeda949df73..5f5cac2ffe84 100644 --- a/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/assign_copy.pass.cpp +++ b/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/assign_copy.pass.cpp @@ -22,6 +22,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -131,4 +132,59 @@ int main() assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); assert(c.max_load_factor() == 1); } +#if __cplusplus >= 201103L + { + typedef min_allocator A; + typedef std::unordered_multiset >, + test_compare >, + A + > C; + typedef int P; + P a[] = + { + P(1), + P(2), + P(3), + P(4), + P(1), + P(2) + }; + C c0(a, a + sizeof(a)/sizeof(a[0]), + 7, + test_hash >(8), + test_compare >(9), + A() + ); + C c(a, a + 2, + 7, + test_hash >(2), + test_compare >(3), + A() + ); + c = c0; + assert(c.bucket_count() == 7); + assert(c.size() == 6); + C::const_iterator i = c.cbegin(); + assert(*i == 1); + ++i; + assert(*i == 1); + ++i; + assert(*i == 2); + ++i; + assert(*i == 2); + ++i; + assert(*i == 3); + ++i; + assert(*i == 4); + assert(c.hash_function() == test_hash >(8)); + assert(c.key_eq() == test_compare >(9)); + assert(c.get_allocator() == A()); + assert(!c.empty()); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); + assert(c.max_load_factor() == 1); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/assign_init.pass.cpp b/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/assign_init.pass.cpp index d1c3cb1711aa..23ca1fc4b784 100644 --- a/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/assign_init.pass.cpp +++ b/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/assign_init.pass.cpp @@ -22,6 +22,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -58,5 +59,39 @@ int main() assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); assert(c.max_load_factor() == 1); } +#if __cplusplus >= 201103L + { + typedef min_allocator A; + typedef std::unordered_multiset >, + test_compare >, + A + > C; + typedef int P; + C c = { + P(4), + P(1), + P(2) + }; + c = { + P(1), + P(2), + P(3), + P(4), + P(1), + P(2) + }; + assert(c.bucket_count() >= 7); + assert(c.size() == 6); + assert(c.count(1) == 2); + assert(c.count(2) == 2); + assert(c.count(3) == 1); + assert(c.count(4) == 1); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); + assert(c.max_load_factor() == 1); + } +#endif #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS } diff --git a/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/assign_move.pass.cpp b/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/assign_move.pass.cpp index 881a0d777f2b..292f50ffd84b 100644 --- a/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/assign_move.pass.cpp +++ b/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/assign_move.pass.cpp @@ -22,6 +22,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -169,5 +170,105 @@ int main() assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); assert(c.max_load_factor() == 1); } +#if __cplusplus >= 201103L + { + typedef test_allocator A; + typedef std::unordered_multiset >, + test_compare >, + A + > C; + typedef int P; + P a[] = + { + P(1), + P(2), + P(3), + P(4), + P(1), + P(2) + }; + C c0(a, a + sizeof(a)/sizeof(a[0]), + 7, + test_hash >(8), + test_compare >(9), + A() + ); + C c(a, a + 2, + 7, + test_hash >(2), + test_compare >(3), + A() + ); + c = std::move(c0); + assert(c.bucket_count() == 7); + assert(c.size() == 6); + C::const_iterator i = c.cbegin(); + assert(*i == 4); + ++i; + assert(*i == 3); + ++i; + assert(*i == 2); + ++i; + assert(*i == 2); + ++i; + assert(*i == 1); + ++i; + assert(*i == 1); + assert(c.hash_function() == test_hash >(8)); + assert(c.key_eq() == test_compare >(9)); + assert(c.get_allocator() == A()); + assert(!c.empty()); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); + assert(c.max_load_factor() == 1); + } + { + typedef min_allocator A; + typedef std::unordered_multiset >, + test_compare >, + A + > C; + typedef int P; + P a[] = + { + P(1), + P(2), + P(3), + P(4), + P(1), + P(2) + }; + C c0(a, a + sizeof(a)/sizeof(a[0]), + 7, + test_hash >(8), + test_compare >(9), + A() + ); + C c(a, a + 2, + 7, + test_hash >(2), + test_compare >(3), + A() + ); + c = std::move(c0); + assert(c.bucket_count() == 7); + assert(c.size() == 6); + assert(c.count(1) == 2); + assert(c.count(2) == 2); + assert(c.count(3) == 1); + assert(c.count(4) == 1); + assert(c.hash_function() == test_hash >(8)); + assert(c.key_eq() == test_compare >(9)); + assert(c.get_allocator() == A()); + assert(!c.empty()); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); + assert(c.max_load_factor() == 1); + } +#endif #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES } diff --git a/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/copy.pass.cpp b/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/copy.pass.cpp index 20f5644eb77b..300a4db8bba6 100644 --- a/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/copy.pass.cpp +++ b/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/copy.pass.cpp @@ -22,6 +22,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -119,4 +120,52 @@ int main() assert(c.max_load_factor() == 1); } #endif // _LIBCPP_HAS_NO_ADVANCED_SFINAE +#if __cplusplus >= 201103L + { + typedef std::unordered_multiset >, + test_compare >, + min_allocator + > C; + typedef int P; + P a[] = + { + P(1), + P(2), + P(3), + P(4), + P(1), + P(2) + }; + C c0(a, a + sizeof(a)/sizeof(a[0]), + 7, + test_hash >(8), + test_compare >(9), + min_allocator() + ); + C c = c0; + assert(c.bucket_count() == 7); + assert(c.size() == 6); + C::const_iterator i = c.cbegin(); + assert(*i == 1); + ++i; + assert(*i == 1); + ++i; + assert(*i == 2); + ++i; + assert(*i == 2); + ++i; + assert(*i == 3); + ++i; + assert(*i == 4); + assert(c.hash_function() == test_hash >(8)); + assert(c.key_eq() == test_compare >(9)); + assert(c.get_allocator() == min_allocator()); + assert(!c.empty()); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); + assert(c.max_load_factor() == 1); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/copy_alloc.pass.cpp b/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/copy_alloc.pass.cpp index b3357a80944f..636f644944da 100644 --- a/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/copy_alloc.pass.cpp +++ b/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/copy_alloc.pass.cpp @@ -22,6 +22,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -71,4 +72,52 @@ int main() assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); assert(c.max_load_factor() == 1); } +#if __cplusplus >= 201103L + { + typedef std::unordered_multiset >, + test_compare >, + min_allocator + > C; + typedef int P; + P a[] = + { + P(1), + P(2), + P(3), + P(4), + P(1), + P(2) + }; + C c0(a, a + sizeof(a)/sizeof(a[0]), + 7, + test_hash >(8), + test_compare >(9), + min_allocator() + ); + C c(c0, min_allocator()); + assert(c.bucket_count() == 7); + assert(c.size() == 6); + C::const_iterator i = c.cbegin(); + assert(*i == 1); + ++i; + assert(*i == 1); + ++i; + assert(*i == 2); + ++i; + assert(*i == 2); + ++i; + assert(*i == 3); + ++i; + assert(*i == 4); + assert(c.hash_function() == test_hash >(8)); + assert(c.key_eq() == test_compare >(9)); + assert(c.get_allocator() == min_allocator()); + assert(!c.empty()); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); + assert(c.max_load_factor() == 1); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/default.pass.cpp b/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/default.pass.cpp index d2761b182380..4546d5971392 100644 --- a/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/default.pass.cpp +++ b/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/default.pass.cpp @@ -22,6 +22,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -42,4 +43,23 @@ int main() assert(c.load_factor() == 0); assert(c.max_load_factor() == 1); } +#if __cplusplus >= 201103L + { + typedef std::unordered_multiset >, + test_compare >, + min_allocator + > C; + C c; + assert(c.bucket_count() == 0); + assert(c.hash_function() == test_hash >()); + assert(c.key_eq() == test_compare >()); + assert(c.get_allocator() == (min_allocator())); + assert(c.size() == 0); + assert(c.empty()); + assert(std::distance(c.begin(), c.end()) == 0); + assert(c.load_factor() == 0); + assert(c.max_load_factor() == 1); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/init.pass.cpp b/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/init.pass.cpp index ce16ebf5cd51..29729b5a4b0e 100644 --- a/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/init.pass.cpp +++ b/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/init.pass.cpp @@ -22,6 +22,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -56,5 +57,37 @@ int main() assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); assert(c.max_load_factor() == 1); } +#if __cplusplus >= 201103L + { + typedef std::unordered_multiset >, + test_compare >, + min_allocator + > C; + typedef int P; + C c = { + P(1), + P(2), + P(3), + P(4), + P(1), + P(2) + }; + assert(c.bucket_count() >= 7); + assert(c.size() == 6); + assert(c.count(1) == 2); + assert(c.count(2) == 2); + assert(c.count(3) == 1); + assert(c.count(4) == 1); + assert(c.hash_function() == test_hash >()); + assert(c.key_eq() == test_compare >()); + assert(c.get_allocator() == min_allocator()); + assert(!c.empty()); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); + assert(c.max_load_factor() == 1); + } +#endif #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS } diff --git a/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/init_size.pass.cpp b/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/init_size.pass.cpp index b473d2616d06..f16c2321211e 100644 --- a/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/init_size.pass.cpp +++ b/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/init_size.pass.cpp @@ -22,6 +22,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -58,5 +59,39 @@ int main() assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); assert(c.max_load_factor() == 1); } +#if __cplusplus >= 201103L + { + typedef std::unordered_multiset >, + test_compare >, + min_allocator + > C; + typedef int P; + C c({ + P(1), + P(2), + P(3), + P(4), + P(1), + P(2) + }, + 7 + ); + assert(c.bucket_count() == 7); + assert(c.size() == 6); + assert(c.count(1) == 2); + assert(c.count(2) == 2); + assert(c.count(3) == 1); + assert(c.count(4) == 1); + assert(c.hash_function() == test_hash >()); + assert(c.key_eq() == test_compare >()); + assert(c.get_allocator() == min_allocator()); + assert(!c.empty()); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); + assert(c.max_load_factor() == 1); + } +#endif #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS } diff --git a/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/init_size_hash.pass.cpp b/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/init_size_hash.pass.cpp index 4b474fc5b960..53bf1953345e 100644 --- a/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/init_size_hash.pass.cpp +++ b/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/init_size_hash.pass.cpp @@ -23,6 +23,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -60,5 +61,40 @@ int main() assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); assert(c.max_load_factor() == 1); } +#if __cplusplus >= 201103L + { + typedef std::unordered_multiset >, + test_compare >, + min_allocator + > C; + typedef int P; + C c({ + P(1), + P(2), + P(3), + P(4), + P(1), + P(2) + }, + 7, + test_hash >(8) + ); + assert(c.bucket_count() == 7); + assert(c.size() == 6); + assert(c.count(1) == 2); + assert(c.count(2) == 2); + assert(c.count(3) == 1); + assert(c.count(4) == 1); + assert(c.hash_function() == test_hash >(8)); + assert(c.key_eq() == test_compare >()); + assert(c.get_allocator() == min_allocator()); + assert(!c.empty()); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); + assert(c.max_load_factor() == 1); + } +#endif #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS } diff --git a/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/init_size_hash_equal.pass.cpp b/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/init_size_hash_equal.pass.cpp index ca8fde42e688..bd2c3188d80e 100644 --- a/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/init_size_hash_equal.pass.cpp +++ b/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/init_size_hash_equal.pass.cpp @@ -23,6 +23,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -61,5 +62,41 @@ int main() assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); assert(c.max_load_factor() == 1); } +#if __cplusplus >= 201103L + { + typedef std::unordered_multiset >, + test_compare >, + min_allocator + > C; + typedef int P; + C c({ + P(1), + P(2), + P(3), + P(4), + P(1), + P(2) + }, + 7, + test_hash >(8), + test_compare >(9) + ); + assert(c.bucket_count() == 7); + assert(c.size() == 6); + assert(c.count(1) == 2); + assert(c.count(2) == 2); + assert(c.count(3) == 1); + assert(c.count(4) == 1); + assert(c.hash_function() == test_hash >(8)); + assert(c.key_eq() == test_compare >(9)); + assert(c.get_allocator() == min_allocator()); + assert(!c.empty()); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); + assert(c.max_load_factor() == 1); + } +#endif #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS } diff --git a/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/init_size_hash_equal_allocator.pass.cpp b/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/init_size_hash_equal_allocator.pass.cpp index ba1ec05b3da2..d7c69359527b 100644 --- a/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/init_size_hash_equal_allocator.pass.cpp +++ b/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/init_size_hash_equal_allocator.pass.cpp @@ -23,6 +23,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -62,5 +63,42 @@ int main() assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); assert(c.max_load_factor() == 1); } +#if __cplusplus >= 201103L + { + typedef std::unordered_multiset >, + test_compare >, + min_allocator + > C; + typedef int P; + C c({ + P(1), + P(2), + P(3), + P(4), + P(1), + P(2) + }, + 7, + test_hash >(8), + test_compare >(9), + min_allocator() + ); + assert(c.bucket_count() == 7); + assert(c.size() == 6); + assert(c.count(1) == 2); + assert(c.count(2) == 2); + assert(c.count(3) == 1); + assert(c.count(4) == 1); + assert(c.hash_function() == test_hash >(8)); + assert(c.key_eq() == test_compare >(9)); + assert(c.get_allocator() == min_allocator()); + assert(!c.empty()); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); + assert(c.max_load_factor() == 1); + } +#endif #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS } diff --git a/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/move.pass.cpp b/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/move.pass.cpp index 969d35d79037..e24d8f387cf8 100644 --- a/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/move.pass.cpp +++ b/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/move.pass.cpp @@ -22,6 +22,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -101,5 +102,82 @@ int main() assert(c0.empty()); } +#if __cplusplus >= 201103L + { + typedef std::unordered_multiset >, + test_compare >, + min_allocator + > C; + typedef int P; + P a[] = + { + P(1), + P(2), + P(3), + P(4), + P(1), + P(2) + }; + C c0(7, + test_hash >(8), + test_compare >(9), + min_allocator() + ); + C c = std::move(c0); + assert(c.bucket_count() == 7); + assert(c.size() == 0); + assert(c.hash_function() == test_hash >(8)); + assert(c.key_eq() == test_compare >(9)); + assert(c.get_allocator() == min_allocator()); + assert(c.empty()); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + assert(c.load_factor() == 0); + assert(c.max_load_factor() == 1); + + assert(c0.empty()); + } + { + typedef std::unordered_multiset >, + test_compare >, + min_allocator + > C; + typedef int P; + P a[] = + { + P(1), + P(2), + P(3), + P(4), + P(1), + P(2) + }; + C c0(a, a + sizeof(a)/sizeof(a[0]), + 7, + test_hash >(8), + test_compare >(9), + min_allocator() + ); + C c = std::move(c0); + assert(c.bucket_count() == 7); + assert(c.size() == 6); + assert(c.count(1) == 2); + assert(c.count(2) == 2); + assert(c.count(3) == 1); + assert(c.count(4) == 1); + assert(c.hash_function() == test_hash >(8)); + assert(c.key_eq() == test_compare >(9)); + assert(c.get_allocator() == min_allocator()); + assert(!c.empty()); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); + assert(c.max_load_factor() == 1); + + assert(c0.empty()); + } +#endif #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES } diff --git a/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/move_alloc.pass.cpp b/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/move_alloc.pass.cpp index 77d6d81b3ea1..e5283168ac73 100644 --- a/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/move_alloc.pass.cpp +++ b/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/move_alloc.pass.cpp @@ -22,6 +22,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -116,5 +117,97 @@ int main() assert(c0.empty()); } +#if __cplusplus >= 201103L + { + typedef int P; + typedef min_allocator A; + typedef std::unordered_multiset >, + test_compare >, + A + > C; + P a[] = + { + P(1), + P(2), + P(3), + P(4), + P(1), + P(2) + }; + C c0(a, a + sizeof(a)/sizeof(a[0]), + 7, + test_hash >(8), + test_compare >(9), + A() + ); + C c(std::move(c0), A()); + assert(c.bucket_count() >= 7); + assert(c.size() == 6); + C::const_iterator i = c.cbegin(); + assert(*i == 4); + ++i; + assert(*i == 3); + ++i; + assert(*i == 2); + ++i; + assert(*i == 2); + ++i; + assert(*i == 1); + ++i; + assert(*i == 1); + assert(c.hash_function() == test_hash >(8)); + assert(c.key_eq() == test_compare >(9)); + assert(c.get_allocator() == A()); + assert(!c.empty()); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); + assert(c.max_load_factor() == 1); + + assert(c0.empty()); + } + { + typedef int P; + typedef min_allocator A; + typedef std::unordered_multiset >, + test_compare >, + A + > C; + P a[] = + { + P(1), + P(2), + P(3), + P(4), + P(1), + P(2) + }; + C c0(a, a + sizeof(a)/sizeof(a[0]), + 7, + test_hash >(8), + test_compare >(9), + A() + ); + C c(std::move(c0), A()); + assert(c.bucket_count() == 7); + assert(c.size() == 6); + assert(c.count(1) == 2); + assert(c.count(2) == 2); + assert(c.count(3) == 1); + assert(c.count(4) == 1); + assert(c.hash_function() == test_hash >(8)); + assert(c.key_eq() == test_compare >(9)); + assert(c.get_allocator() == A()); + assert(!c.empty()); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); + assert(c.max_load_factor() == 1); + + assert(c0.empty()); + } +#endif #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES } diff --git a/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/range.pass.cpp b/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/range.pass.cpp index 92a5e98d0e40..8c0828ae4170 100644 --- a/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/range.pass.cpp +++ b/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/range.pass.cpp @@ -24,6 +24,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -59,4 +60,38 @@ int main() assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); assert(c.max_load_factor() == 1); } +#if __cplusplus >= 201103L + { + typedef std::unordered_multiset >, + test_compare >, + min_allocator + > C; + typedef int P; + P a[] = + { + P(1), + P(2), + P(3), + P(4), + P(1), + P(2) + }; + C c(input_iterator(a), input_iterator(a + sizeof(a)/sizeof(a[0]))); + assert(c.bucket_count() >= 7); + assert(c.size() == 6); + assert(c.count(1) == 2); + assert(c.count(2) == 2); + assert(c.count(3) == 1); + assert(c.count(4) == 1); + assert(c.hash_function() == test_hash >()); + assert(c.key_eq() == test_compare >()); + assert(c.get_allocator() == min_allocator()); + assert(!c.empty()); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); + assert(c.max_load_factor() == 1); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/range_size.pass.cpp b/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/range_size.pass.cpp index 6d2aff60601a..5fa494b91fbd 100644 --- a/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/range_size.pass.cpp +++ b/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/range_size.pass.cpp @@ -24,6 +24,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -61,4 +62,40 @@ int main() assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); assert(c.max_load_factor() == 1); } +#if __cplusplus >= 201103L + { + typedef std::unordered_multiset >, + test_compare >, + min_allocator + > C; + typedef int P; + P a[] = + { + P(1), + P(2), + P(3), + P(4), + P(1), + P(2) + }; + C c(input_iterator(a), input_iterator(a + sizeof(a)/sizeof(a[0])), + 7 + ); + assert(c.bucket_count() == 7); + assert(c.size() == 6); + assert(c.count(1) == 2); + assert(c.count(2) == 2); + assert(c.count(3) == 1); + assert(c.count(4) == 1); + assert(c.hash_function() == test_hash >()); + assert(c.key_eq() == test_compare >()); + assert(c.get_allocator() == min_allocator()); + assert(!c.empty()); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); + assert(c.max_load_factor() == 1); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/range_size_hash.pass.cpp b/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/range_size_hash.pass.cpp index fbec983692c4..bace36a85387 100644 --- a/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/range_size_hash.pass.cpp +++ b/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/range_size_hash.pass.cpp @@ -25,6 +25,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -63,4 +64,41 @@ int main() assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); assert(c.max_load_factor() == 1); } +#if __cplusplus >= 201103L + { + typedef std::unordered_multiset >, + test_compare >, + min_allocator + > C; + typedef int P; + P a[] = + { + P(1), + P(2), + P(3), + P(4), + P(1), + P(2) + }; + C c(input_iterator(a), input_iterator(a + sizeof(a)/sizeof(a[0])), + 7, + test_hash >(8) + ); + assert(c.bucket_count() == 7); + assert(c.size() == 6); + assert(c.count(1) == 2); + assert(c.count(2) == 2); + assert(c.count(3) == 1); + assert(c.count(4) == 1); + assert(c.hash_function() == test_hash >(8)); + assert(c.key_eq() == test_compare >()); + assert(c.get_allocator() == min_allocator()); + assert(!c.empty()); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); + assert(c.max_load_factor() == 1); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/range_size_hash_equal.pass.cpp b/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/range_size_hash_equal.pass.cpp index c70187566ab6..a97750eb5678 100644 --- a/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/range_size_hash_equal.pass.cpp +++ b/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/range_size_hash_equal.pass.cpp @@ -25,6 +25,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -64,4 +65,42 @@ int main() assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); assert(c.max_load_factor() == 1); } +#if __cplusplus >= 201103L + { + typedef std::unordered_multiset >, + test_compare >, + min_allocator + > C; + typedef int P; + P a[] = + { + P(1), + P(2), + P(3), + P(4), + P(1), + P(2) + }; + C c(input_iterator(a), input_iterator(a + sizeof(a)/sizeof(a[0])), + 7, + test_hash >(8), + test_compare >(9) + ); + assert(c.bucket_count() == 7); + assert(c.size() == 6); + assert(c.count(1) == 2); + assert(c.count(2) == 2); + assert(c.count(3) == 1); + assert(c.count(4) == 1); + assert(c.hash_function() == test_hash >(8)); + assert(c.key_eq() == test_compare >(9)); + assert(c.get_allocator() == min_allocator()); + assert(!c.empty()); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); + assert(c.max_load_factor() == 1); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/range_size_hash_equal_allocator.pass.cpp b/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/range_size_hash_equal_allocator.pass.cpp index ba94ac43e4cd..41f2e27797e6 100644 --- a/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/range_size_hash_equal_allocator.pass.cpp +++ b/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/range_size_hash_equal_allocator.pass.cpp @@ -26,6 +26,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -66,4 +67,43 @@ int main() assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); assert(c.max_load_factor() == 1); } +#if __cplusplus >= 201103L + { + typedef std::unordered_multiset >, + test_compare >, + min_allocator + > C; + typedef int P; + P a[] = + { + P(1), + P(2), + P(3), + P(4), + P(1), + P(2) + }; + C c(input_iterator(a), input_iterator(a + sizeof(a)/sizeof(a[0])), + 7, + test_hash >(8), + test_compare >(9), + min_allocator() + ); + assert(c.bucket_count() == 7); + assert(c.size() == 6); + assert(c.count(1) == 2); + assert(c.count(2) == 2); + assert(c.count(3) == 1); + assert(c.count(4) == 1); + assert(c.hash_function() == test_hash >(8)); + assert(c.key_eq() == test_compare >(9)); + assert(c.get_allocator() == min_allocator()); + assert(!c.empty()); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); + assert(c.max_load_factor() == 1); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/size.fail.cpp b/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/size.fail.cpp index 11010e4a40df..1916b6b8072a 100644 --- a/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/size.fail.cpp +++ b/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/size.fail.cpp @@ -22,6 +22,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -42,4 +43,23 @@ int main() assert(c.load_factor() == 0); assert(c.max_load_factor() == 1); } +#if __cplusplus >= 201103L + { + typedef std::unordered_multiset >, + test_compare >, + min_allocator + > C; + C c = 7; + assert(c.bucket_count() == 7); + assert(c.hash_function() == test_hash >()); + assert(c.key_eq() == test_compare >()); + assert(c.get_allocator() == (min_allocator())); + assert(c.size() == 0); + assert(c.empty()); + assert(std::distance(c.begin(), c.end()) == 0); + assert(c.load_factor() == 0); + assert(c.max_load_factor() == 1); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/size.pass.cpp b/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/size.pass.cpp index afeedb4a2812..4e9903745c00 100644 --- a/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/size.pass.cpp +++ b/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/size.pass.cpp @@ -22,6 +22,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -42,4 +43,23 @@ int main() assert(c.load_factor() == 0); assert(c.max_load_factor() == 1); } +#if __cplusplus >= 201103L + { + typedef std::unordered_multiset >, + test_compare >, + min_allocator + > C; + C c(7); + assert(c.bucket_count() == 7); + assert(c.hash_function() == test_hash >()); + assert(c.key_eq() == test_compare >()); + assert(c.get_allocator() == (min_allocator())); + assert(c.size() == 0); + assert(c.empty()); + assert(std::distance(c.begin(), c.end()) == 0); + assert(c.load_factor() == 0); + assert(c.max_load_factor() == 1); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/size_hash.pass.cpp b/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/size_hash.pass.cpp index bc5b49a6441b..19f4440a8f6f 100644 --- a/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/size_hash.pass.cpp +++ b/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/size_hash.pass.cpp @@ -22,6 +22,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -44,4 +45,25 @@ int main() assert(c.load_factor() == 0); assert(c.max_load_factor() == 1); } +#if __cplusplus >= 201103L + { + typedef std::unordered_multiset >, + test_compare >, + min_allocator + > C; + C c(7, + test_hash >(8) + ); + assert(c.bucket_count() == 7); + assert(c.hash_function() == test_hash >(8)); + assert(c.key_eq() == test_compare >()); + assert(c.get_allocator() == (min_allocator())); + assert(c.size() == 0); + assert(c.empty()); + assert(std::distance(c.begin(), c.end()) == 0); + assert(c.load_factor() == 0); + assert(c.max_load_factor() == 1); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/size_hash_equal.pass.cpp b/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/size_hash_equal.pass.cpp index 106775ff5f9e..59eba5321a07 100644 --- a/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/size_hash_equal.pass.cpp +++ b/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/size_hash_equal.pass.cpp @@ -22,6 +22,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -45,4 +46,26 @@ int main() assert(c.load_factor() == 0); assert(c.max_load_factor() == 1); } +#if __cplusplus >= 201103L + { + typedef std::unordered_multiset >, + test_compare >, + min_allocator + > C; + C c(7, + test_hash >(8), + test_compare >(9) + ); + assert(c.bucket_count() == 7); + assert(c.hash_function() == test_hash >(8)); + assert(c.key_eq() == test_compare >(9)); + assert(c.get_allocator() == (min_allocator())); + assert(c.size() == 0); + assert(c.empty()); + assert(std::distance(c.begin(), c.end()) == 0); + assert(c.load_factor() == 0); + assert(c.max_load_factor() == 1); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/size_hash_equal_allocator.pass.cpp b/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/size_hash_equal_allocator.pass.cpp index b90044da2257..ca71ab3709b4 100644 --- a/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/size_hash_equal_allocator.pass.cpp +++ b/libcxx/test/containers/unord/unord.multiset/unord.multiset.cnstr/size_hash_equal_allocator.pass.cpp @@ -22,6 +22,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -46,4 +47,27 @@ int main() assert(c.load_factor() == 0); assert(c.max_load_factor() == 1); } +#if __cplusplus >= 201103L + { + typedef std::unordered_multiset >, + test_compare >, + min_allocator + > C; + C c(7, + test_hash >(8), + test_compare >(9), + min_allocator >() + ); + assert(c.bucket_count() == 7); + assert(c.hash_function() == test_hash >(8)); + assert(c.key_eq() == test_compare >(9)); + assert(c.get_allocator() == (min_allocator())); + assert(c.size() == 0); + assert(c.empty()); + assert(std::distance(c.begin(), c.end()) == 0); + assert(c.load_factor() == 0); + assert(c.max_load_factor() == 1); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.multiset/unord.multiset.swap/swap_non_member.pass.cpp b/libcxx/test/containers/unord/unord.multiset/unord.multiset.swap/swap_non_member.pass.cpp index f56e247478d6..b75816a9ab47 100644 --- a/libcxx/test/containers/unord/unord.multiset/unord.multiset.swap/swap_non_member.pass.cpp +++ b/libcxx/test/containers/unord/unord.multiset/unord.multiset.swap/swap_non_member.pass.cpp @@ -21,6 +21,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -385,4 +386,186 @@ int main() assert(std::distance(c2.cbegin(), c2.cend()) == c2.size()); assert(c2.max_load_factor() == 1); } +#if __cplusplus >= 201103L + { + typedef test_hash > Hash; + typedef test_compare > Compare; + typedef min_allocator Alloc; + typedef std::unordered_multiset C; + typedef int P; + C c1(0, Hash(1), Compare(1), Alloc()); + C c2(0, Hash(2), Compare(2), Alloc()); + c2.max_load_factor(2); + swap(c1, c2); + + assert(c1.bucket_count() == 0); + assert(c1.size() == 0); + assert(c1.hash_function() == Hash(2)); + assert(c1.key_eq() == Compare(2)); + assert(c1.get_allocator() == Alloc()); + assert(std::distance(c1.begin(), c1.end()) == c1.size()); + assert(std::distance(c1.cbegin(), c1.cend()) == c1.size()); + assert(c1.max_load_factor() == 2); + + assert(c2.bucket_count() == 0); + assert(c2.size() == 0); + assert(c2.hash_function() == Hash(1)); + assert(c2.key_eq() == Compare(1)); + assert(c2.get_allocator() == Alloc()); + assert(std::distance(c2.begin(), c2.end()) == c2.size()); + assert(std::distance(c2.cbegin(), c2.cend()) == c2.size()); + assert(c2.max_load_factor() == 1); + } + { + typedef test_hash > Hash; + typedef test_compare > Compare; + typedef min_allocator Alloc; + typedef std::unordered_multiset C; + typedef int P; + P a2[] = + { + P(10), + P(20), + P(30), + P(40), + P(50), + P(60), + P(70), + P(80) + }; + C c1(0, Hash(1), Compare(1), Alloc()); + C c2(std::begin(a2), std::end(a2), 0, Hash(2), Compare(2), Alloc()); + c2.max_load_factor(2); + swap(c1, c2); + + assert(c1.bucket_count() >= 11); + assert(c1.size() == 8); + assert(*c1.find(10) == 10); + assert(*c1.find(20) == 20); + assert(*c1.find(30) == 30); + assert(*c1.find(40) == 40); + assert(*c1.find(50) == 50); + assert(*c1.find(60) == 60); + assert(*c1.find(70) == 70); + assert(*c1.find(80) == 80); + assert(c1.hash_function() == Hash(2)); + assert(c1.key_eq() == Compare(2)); + assert(c1.get_allocator() == Alloc()); + assert(std::distance(c1.begin(), c1.end()) == c1.size()); + assert(std::distance(c1.cbegin(), c1.cend()) == c1.size()); + assert(c1.max_load_factor() == 2); + + assert(c2.bucket_count() == 0); + assert(c2.size() == 0); + assert(c2.hash_function() == Hash(1)); + assert(c2.key_eq() == Compare(1)); + assert(c2.get_allocator() == Alloc()); + assert(std::distance(c2.begin(), c2.end()) == c2.size()); + assert(std::distance(c2.cbegin(), c2.cend()) == c2.size()); + assert(c2.max_load_factor() == 1); + } + { + typedef test_hash > Hash; + typedef test_compare > Compare; + typedef min_allocator Alloc; + typedef std::unordered_multiset C; + typedef int P; + P a1[] = + { + P(1), + P(2), + P(3), + P(4), + P(1), + P(2) + }; + C c1(std::begin(a1), std::end(a1), 0, Hash(1), Compare(1), Alloc()); + C c2(0, Hash(2), Compare(2), Alloc()); + c2.max_load_factor(2); + swap(c1, c2); + + assert(c1.bucket_count() == 0); + assert(c1.size() == 0); + assert(c1.hash_function() == Hash(2)); + assert(c1.key_eq() == Compare(2)); + assert(c1.get_allocator() == Alloc()); + assert(std::distance(c1.begin(), c1.end()) == c1.size()); + assert(std::distance(c1.cbegin(), c1.cend()) == c1.size()); + assert(c1.max_load_factor() == 2); + + assert(c2.bucket_count() >= 7); + assert(c2.size() == 6); + assert(c2.count(1) == 2); + assert(c2.count(2) == 2); + assert(c2.count(3) == 1); + assert(c2.count(4) == 1); + assert(c2.hash_function() == Hash(1)); + assert(c2.key_eq() == Compare(1)); + assert(c2.get_allocator() == Alloc()); + assert(std::distance(c2.begin(), c2.end()) == c2.size()); + assert(std::distance(c2.cbegin(), c2.cend()) == c2.size()); + assert(c2.max_load_factor() == 1); + } + { + typedef test_hash > Hash; + typedef test_compare > Compare; + typedef min_allocator Alloc; + typedef std::unordered_multiset C; + typedef int P; + P a1[] = + { + P(1), + P(2), + P(3), + P(4), + P(1), + P(2) + }; + P a2[] = + { + P(10), + P(20), + P(30), + P(40), + P(50), + P(60), + P(70), + P(80) + }; + C c1(std::begin(a1), std::end(a1), 0, Hash(1), Compare(1), Alloc()); + C c2(std::begin(a2), std::end(a2), 0, Hash(2), Compare(2), Alloc()); + c2.max_load_factor(2); + swap(c1, c2); + + assert(c1.bucket_count() >= 11); + assert(c1.size() == 8); + assert(*c1.find(10) == 10); + assert(*c1.find(20) == 20); + assert(*c1.find(30) == 30); + assert(*c1.find(40) == 40); + assert(*c1.find(50) == 50); + assert(*c1.find(60) == 60); + assert(*c1.find(70) == 70); + assert(*c1.find(80) == 80); + assert(c1.hash_function() == Hash(2)); + assert(c1.key_eq() == Compare(2)); + assert(c1.get_allocator() == Alloc()); + assert(std::distance(c1.begin(), c1.end()) == c1.size()); + assert(std::distance(c1.cbegin(), c1.cend()) == c1.size()); + assert(c1.max_load_factor() == 2); + + assert(c2.bucket_count() >= 7); + assert(c2.size() == 6); + assert(c2.count(1) == 2); + assert(c2.count(2) == 2); + assert(c2.count(3) == 1); + assert(c2.count(4) == 1); + assert(c2.hash_function() == Hash(1)); + assert(c2.key_eq() == Compare(1)); + assert(c2.get_allocator() == Alloc()); + assert(std::distance(c2.begin(), c2.end()) == c2.size()); + assert(std::distance(c2.cbegin(), c2.cend()) == c2.size()); + assert(c2.max_load_factor() == 1); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.set/bucket.pass.cpp b/libcxx/test/containers/unord/unord.set/bucket.pass.cpp index bdbd523a6f8f..25f65815a92c 100644 --- a/libcxx/test/containers/unord/unord.set/bucket.pass.cpp +++ b/libcxx/test/containers/unord/unord.set/bucket.pass.cpp @@ -18,6 +18,8 @@ #include #include +#include "../../min_allocator.h" + int main() { { @@ -38,4 +40,24 @@ int main() for (size_t i = 0; i < 13; ++i) assert(c.bucket(i) == i % bc); } +#if __cplusplus >= 201103L + { + typedef std::unordered_set, std::equal_to, min_allocator> C; + typedef int P; + P a[] = + { + P(1), + P(2), + P(3), + P(4), + P(1), + P(2) + }; + const C c(std::begin(a), std::end(a)); + size_t bc = c.bucket_count(); + assert(bc >= 5); + for (size_t i = 0; i < 13; ++i) + assert(c.bucket(i) == i % bc); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.set/bucket_count.pass.cpp b/libcxx/test/containers/unord/unord.set/bucket_count.pass.cpp index 5cfc71d591c5..649aaa150e61 100644 --- a/libcxx/test/containers/unord/unord.set/bucket_count.pass.cpp +++ b/libcxx/test/containers/unord/unord.set/bucket_count.pass.cpp @@ -18,6 +18,8 @@ #include #include +#include "../../min_allocator.h" + int main() { { @@ -45,4 +47,31 @@ int main() const C c(std::begin(a), std::end(a)); assert(c.bucket_count() >= 11); } +#if __cplusplus >= 201103L + { + typedef std::unordered_set, std::equal_to, min_allocator> C; + typedef C::const_iterator I; + typedef int P; + const C c; + assert(c.bucket_count() == 0); + } + { + typedef std::unordered_set, std::equal_to, min_allocator> C; + typedef C::const_iterator I; + typedef int P; + P a[] = + { + P(10), + P(20), + P(30), + P(40), + P(50), + P(60), + P(70), + P(80) + }; + const C c(std::begin(a), std::end(a)); + assert(c.bucket_count() >= 11); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.set/bucket_size.pass.cpp b/libcxx/test/containers/unord/unord.set/bucket_size.pass.cpp index 3c0f120e1eed..aecb2585196e 100644 --- a/libcxx/test/containers/unord/unord.set/bucket_size.pass.cpp +++ b/libcxx/test/containers/unord/unord.set/bucket_size.pass.cpp @@ -18,6 +18,8 @@ #include #include +#include "../../min_allocator.h" + int main() { { @@ -40,4 +42,26 @@ int main() assert(c.bucket_size(3) == 1); assert(c.bucket_size(4) == 1); } +#if __cplusplus >= 201103L + { + typedef std::unordered_set, std::equal_to, min_allocator> C; + typedef int P; + P a[] = + { + P(1), + P(2), + P(3), + P(4), + P(1), + P(2) + }; + const C c(std::begin(a), std::end(a)); + assert(c.bucket_count() >= 5); + assert(c.bucket_size(0) == 0); + assert(c.bucket_size(1) == 1); + assert(c.bucket_size(2) == 1); + assert(c.bucket_size(3) == 1); + assert(c.bucket_size(4) == 1); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.set/clear.pass.cpp b/libcxx/test/containers/unord/unord.set/clear.pass.cpp index 3052087eae1b..1f97ab75b133 100644 --- a/libcxx/test/containers/unord/unord.set/clear.pass.cpp +++ b/libcxx/test/containers/unord/unord.set/clear.pass.cpp @@ -18,6 +18,8 @@ #include #include +#include "../../min_allocator.h" + int main() { { @@ -36,4 +38,22 @@ int main() c.clear(); assert(c.size() == 0); } +#if __cplusplus >= 201103L + { + typedef std::unordered_set, std::equal_to, min_allocator> C; + typedef int P; + P a[] = + { + P(1), + P(2), + P(3), + P(4), + P(1), + P(2) + }; + C c(a, a + sizeof(a)/sizeof(a[0])); + c.clear(); + assert(c.size() == 0); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.set/count.pass.cpp b/libcxx/test/containers/unord/unord.set/count.pass.cpp index bbd02d63bbe6..d850a7e57544 100644 --- a/libcxx/test/containers/unord/unord.set/count.pass.cpp +++ b/libcxx/test/containers/unord/unord.set/count.pass.cpp @@ -18,6 +18,8 @@ #include #include +#include "../../min_allocator.h" + int main() { { @@ -41,4 +43,27 @@ int main() assert(c.count(50) == 1); assert(c.count(5) == 0); } +#if __cplusplus >= 201103L + { + typedef std::unordered_set, std::equal_to, min_allocator> C; + typedef int P; + P a[] = + { + P(10), + P(20), + P(30), + P(40), + P(50), + P(50), + P(50), + P(60), + P(70), + P(80) + }; + const C c(std::begin(a), std::end(a)); + assert(c.count(30) == 1); + assert(c.count(50) == 1); + assert(c.count(5) == 0); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.set/emplace.pass.cpp b/libcxx/test/containers/unord/unord.set/emplace.pass.cpp index 70ffeb9b66f7..a6faecb3a75d 100644 --- a/libcxx/test/containers/unord/unord.set/emplace.pass.cpp +++ b/libcxx/test/containers/unord/unord.set/emplace.pass.cpp @@ -20,6 +20,7 @@ #include #include "../../Emplaceable.h" +#include "../../min_allocator.h" int main() { @@ -43,5 +44,27 @@ int main() assert(*r.first == Emplaceable(5, 6)); assert(!r.second); } +#if __cplusplus >= 201103L + { + typedef std::unordered_set, + std::equal_to, min_allocator> C; + typedef std::pair R; + C c; + R r = c.emplace(); + assert(c.size() == 1); + assert(*r.first == Emplaceable()); + assert(r.second); + + r = c.emplace(Emplaceable(5, 6)); + assert(c.size() == 2); + assert(*r.first == Emplaceable(5, 6)); + assert(r.second); + + r = c.emplace(5, 6); + assert(c.size() == 2); + assert(*r.first == Emplaceable(5, 6)); + assert(!r.second); + } +#endif #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES } diff --git a/libcxx/test/containers/unord/unord.set/emplace_hint.pass.cpp b/libcxx/test/containers/unord/unord.set/emplace_hint.pass.cpp index 59cf44559c2e..de00ebeea0f6 100644 --- a/libcxx/test/containers/unord/unord.set/emplace_hint.pass.cpp +++ b/libcxx/test/containers/unord/unord.set/emplace_hint.pass.cpp @@ -20,6 +20,7 @@ #include #include "../../Emplaceable.h" +#include "../../min_allocator.h" int main() { @@ -41,5 +42,25 @@ int main() assert(c.size() == 2); assert(*r == Emplaceable(5, 6)); } +#if __cplusplus >= 201103L + { + typedef std::unordered_set, + std::equal_to, min_allocator> C; + typedef C::iterator R; + C c; + C::const_iterator e = c.end(); + R r = c.emplace_hint(e); + assert(c.size() == 1); + assert(*r == Emplaceable()); + + r = c.emplace_hint(e, Emplaceable(5, 6)); + assert(c.size() == 2); + assert(*r == Emplaceable(5, 6)); + + r = c.emplace_hint(r, 5, 6); + assert(c.size() == 2); + assert(*r == Emplaceable(5, 6)); + } +#endif #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES } diff --git a/libcxx/test/containers/unord/unord.set/eq.pass.cpp b/libcxx/test/containers/unord/unord.set/eq.pass.cpp index 52d8304be31e..7b5569e24bb8 100644 --- a/libcxx/test/containers/unord/unord.set/eq.pass.cpp +++ b/libcxx/test/containers/unord/unord.set/eq.pass.cpp @@ -22,6 +22,8 @@ #include #include +#include "../../min_allocator.h" + int main() { { @@ -88,4 +90,70 @@ int main() assert( (c1 == c2)); assert(!(c1 != c2)); } +#if __cplusplus >= 201103L + { + typedef std::unordered_set, std::equal_to, min_allocator> C; + typedef int P; + P a[] = + { + P(10), + P(20), + P(30), + P(40), + P(50), + P(60), + P(70), + P(80) + }; + const C c1(std::begin(a), std::end(a)); + const C c2; + assert(!(c1 == c2)); + assert( (c1 != c2)); + } + { + typedef std::unordered_set, std::equal_to, min_allocator> C; + typedef int P; + P a[] = + { + P(10), + P(20), + P(30), + P(40), + P(50), + P(60), + P(70), + P(80) + }; + const C c1(std::begin(a), std::end(a)); + const C c2 = c1; + assert( (c1 == c2)); + assert(!(c1 != c2)); + } + { + typedef std::unordered_set, std::equal_to, min_allocator> C; + typedef int P; + P a[] = + { + P(10), + P(20), + P(30), + P(40), + P(50), + P(60), + P(70), + P(80) + }; + C c1(std::begin(a), std::end(a)); + C c2 = c1; + c2.rehash(30); + assert( (c1 == c2)); + assert(!(c1 != c2)); + c2.insert(P(90)); + assert(!(c1 == c2)); + assert( (c1 != c2)); + c1.insert(P(90)); + assert( (c1 == c2)); + assert(!(c1 != c2)); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.set/equal_range_const.pass.cpp b/libcxx/test/containers/unord/unord.set/equal_range_const.pass.cpp index 98e4885c68c5..c64e0af34bfe 100644 --- a/libcxx/test/containers/unord/unord.set/equal_range_const.pass.cpp +++ b/libcxx/test/containers/unord/unord.set/equal_range_const.pass.cpp @@ -18,6 +18,8 @@ #include #include +#include "../../min_allocator.h" + int main() { { @@ -47,4 +49,33 @@ int main() assert(std::distance(r.first, r.second) == 1); assert(*r.first == 50); } +#if __cplusplus >= 201103L + { + typedef std::unordered_set, std::equal_to, min_allocator> C; + typedef C::const_iterator I; + typedef int P; + P a[] = + { + P(10), + P(20), + P(30), + P(40), + P(50), + P(50), + P(50), + P(60), + P(70), + P(80) + }; + const C c(std::begin(a), std::end(a)); + std::pair r = c.equal_range(30); + assert(std::distance(r.first, r.second) == 1); + assert(*r.first == 30); + r = c.equal_range(5); + assert(std::distance(r.first, r.second) == 0); + r = c.equal_range(50); + assert(std::distance(r.first, r.second) == 1); + assert(*r.first == 50); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.set/equal_range_non_const.pass.cpp b/libcxx/test/containers/unord/unord.set/equal_range_non_const.pass.cpp index ba7ba0d1b0fc..6d7e044b5f5b 100644 --- a/libcxx/test/containers/unord/unord.set/equal_range_non_const.pass.cpp +++ b/libcxx/test/containers/unord/unord.set/equal_range_non_const.pass.cpp @@ -18,6 +18,8 @@ #include #include +#include "../../min_allocator.h" + int main() { { @@ -47,4 +49,33 @@ int main() assert(std::distance(r.first, r.second) == 1); assert(*r.first == 50); } +#if __cplusplus >= 201103L + { + typedef std::unordered_set, std::equal_to, min_allocator> C; + typedef C::iterator I; + typedef int P; + P a[] = + { + P(10), + P(20), + P(30), + P(40), + P(50), + P(50), + P(50), + P(60), + P(70), + P(80) + }; + C c(std::begin(a), std::end(a)); + std::pair r = c.equal_range(30); + assert(std::distance(r.first, r.second) == 1); + assert(*r.first == 30); + r = c.equal_range(5); + assert(std::distance(r.first, r.second) == 0); + r = c.equal_range(50); + assert(std::distance(r.first, r.second) == 1); + assert(*r.first == 50); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.set/erase_const_iter.pass.cpp b/libcxx/test/containers/unord/unord.set/erase_const_iter.pass.cpp index a6038a4f667d..ff746016a976 100644 --- a/libcxx/test/containers/unord/unord.set/erase_const_iter.pass.cpp +++ b/libcxx/test/containers/unord/unord.set/erase_const_iter.pass.cpp @@ -18,6 +18,8 @@ #include #include +#include "../../min_allocator.h" + int main() { { @@ -40,4 +42,26 @@ int main() assert(c.count(3) == 1); assert(c.count(4) == 1); } +#if __cplusplus >= 201103L + { + typedef std::unordered_set, std::equal_to, min_allocator> C; + typedef int P; + P a[] = + { + P(1), + P(2), + P(3), + P(4), + P(1), + P(2) + }; + C c(a, a + sizeof(a)/sizeof(a[0])); + C::const_iterator i = c.find(2); + C::iterator j = c.erase(i); + assert(c.size() == 3); + assert(c.count(1) == 1); + assert(c.count(3) == 1); + assert(c.count(4) == 1); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.set/erase_key.pass.cpp b/libcxx/test/containers/unord/unord.set/erase_key.pass.cpp index c4483ec7c1ba..187f11826f38 100644 --- a/libcxx/test/containers/unord/unord.set/erase_key.pass.cpp +++ b/libcxx/test/containers/unord/unord.set/erase_key.pass.cpp @@ -19,6 +19,8 @@ #include #include +#include "../../min_allocator.h" + int main() { { @@ -77,4 +79,62 @@ int main() assert(c.erase(3) == 0); assert(c.size() == 0); } +#if __cplusplus >= 201103L + { + typedef std::unordered_set, std::equal_to, min_allocator> C; + typedef int P; + P a[] = + { + P(1), + P(2), + P(3), + P(4), + P(1), + P(2) + }; + C c(a, a + sizeof(a)/sizeof(a[0])); + assert(c.erase(5) == 0); + assert(c.size() == 4); + assert(c.count(1) == 1); + assert(c.count(2) == 1); + assert(c.count(3) == 1); + assert(c.count(4) == 1); + + assert(c.erase(2) == 1); + assert(c.size() == 3); + assert(c.count(1) == 1); + assert(c.count(3) == 1); + assert(c.count(4) == 1); + + assert(c.erase(2) == 0); + assert(c.size() == 3); + assert(c.count(1) == 1); + assert(c.count(3) == 1); + assert(c.count(4) == 1); + + assert(c.erase(4) == 1); + assert(c.size() == 2); + assert(c.count(1) == 1); + assert(c.count(3) == 1); + + assert(c.erase(4) == 0); + assert(c.size() == 2); + assert(c.count(1) == 1); + assert(c.count(3) == 1); + + assert(c.erase(1) == 1); + assert(c.size() == 1); + assert(c.count(3) == 1); + + assert(c.erase(1) == 0); + assert(c.size() == 1); + assert(c.count(3) == 1); + + assert(c.erase(3) == 1); + assert(c.size() == 0); + + assert(c.erase(3) == 0); + assert(c.size() == 0); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.set/erase_range.pass.cpp b/libcxx/test/containers/unord/unord.set/erase_range.pass.cpp index ba51efaf006a..98b7d4d42971 100644 --- a/libcxx/test/containers/unord/unord.set/erase_range.pass.cpp +++ b/libcxx/test/containers/unord/unord.set/erase_range.pass.cpp @@ -18,6 +18,8 @@ #include #include +#include "../../min_allocator.h" + int main() { { @@ -53,4 +55,39 @@ int main() assert(c.size() == 0); assert(k == c.end()); } +#if __cplusplus >= 201103L + { + typedef std::unordered_set, std::equal_to, min_allocator> C; + typedef int P; + P a[] = + { + P(1), + P(2), + P(3), + P(4), + P(1), + P(2) + }; + C c(a, a + sizeof(a)/sizeof(a[0])); + C::const_iterator i = c.find(2); + C::const_iterator j = next(i); + C::iterator k = c.erase(i, i); + assert(k == i); + assert(c.size() == 4); + assert(c.count(1) == 1); + assert(c.count(2) == 1); + assert(c.count(3) == 1); + assert(c.count(4) == 1); + + k = c.erase(i, j); + assert(c.size() == 3); + assert(c.count(1) == 1); + assert(c.count(3) == 1); + assert(c.count(4) == 1); + + k = c.erase(c.cbegin(), c.cend()); + assert(c.size() == 0); + assert(k == c.end()); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.set/find_const.pass.cpp b/libcxx/test/containers/unord/unord.set/find_const.pass.cpp index 80dca545bfc3..ca8b9e6a0324 100644 --- a/libcxx/test/containers/unord/unord.set/find_const.pass.cpp +++ b/libcxx/test/containers/unord/unord.set/find_const.pass.cpp @@ -18,6 +18,8 @@ #include #include +#include "../../min_allocator.h" + int main() { { @@ -40,4 +42,26 @@ int main() i = c.find(5); assert(i == c.cend()); } +#if __cplusplus >= 201103L + { + typedef std::unordered_set, std::equal_to, min_allocator> C; + typedef int P; + P a[] = + { + P(10), + P(20), + P(30), + P(40), + P(50), + P(60), + P(70), + P(80) + }; + const C c(std::begin(a), std::end(a)); + C::const_iterator i = c.find(30); + assert(*i == 30); + i = c.find(5); + assert(i == c.cend()); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.set/find_non_const.pass.cpp b/libcxx/test/containers/unord/unord.set/find_non_const.pass.cpp index 8ff0fe4b08d8..a2ab80425fc9 100644 --- a/libcxx/test/containers/unord/unord.set/find_non_const.pass.cpp +++ b/libcxx/test/containers/unord/unord.set/find_non_const.pass.cpp @@ -18,6 +18,8 @@ #include #include +#include "../../min_allocator.h" + int main() { { @@ -40,4 +42,26 @@ int main() i = c.find(5); assert(i == c.cend()); } +#if __cplusplus >= 201103L + { + typedef std::unordered_set, std::equal_to, min_allocator> C; + typedef int P; + P a[] = + { + P(10), + P(20), + P(30), + P(40), + P(50), + P(60), + P(70), + P(80) + }; + C c(std::begin(a), std::end(a)); + C::iterator i = c.find(30); + assert(*i == 30); + i = c.find(5); + assert(i == c.cend()); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.set/insert_const_lvalue.pass.cpp b/libcxx/test/containers/unord/unord.set/insert_const_lvalue.pass.cpp index 36ee2cfbb656..b5d2733e1220 100644 --- a/libcxx/test/containers/unord/unord.set/insert_const_lvalue.pass.cpp +++ b/libcxx/test/containers/unord/unord.set/insert_const_lvalue.pass.cpp @@ -18,6 +18,8 @@ #include #include +#include "../../min_allocator.h" + int main() { { @@ -45,4 +47,32 @@ int main() assert(*r.first == 5.5); assert(r.second); } +#if __cplusplus >= 201103L + { + typedef std::unordered_set, + std::equal_to, min_allocator> C; + typedef std::pair R; + typedef C::value_type P; + C c; + R r = c.insert(P(3.5)); + assert(c.size() == 1); + assert(*r.first == 3.5); + assert(r.second); + + r = c.insert(P(3.5)); + assert(c.size() == 1); + assert(*r.first == 3.5); + assert(!r.second); + + r = c.insert(P(4.5)); + assert(c.size() == 2); + assert(*r.first == 4.5); + assert(r.second); + + r = c.insert(P(5.5)); + assert(c.size() == 3); + assert(*r.first == 5.5); + assert(r.second); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.set/insert_hint_const_lvalue.pass.cpp b/libcxx/test/containers/unord/unord.set/insert_hint_const_lvalue.pass.cpp index 88b317aa5cc9..cbc212aacad7 100644 --- a/libcxx/test/containers/unord/unord.set/insert_hint_const_lvalue.pass.cpp +++ b/libcxx/test/containers/unord/unord.set/insert_hint_const_lvalue.pass.cpp @@ -18,6 +18,8 @@ #include #include +#include "../../min_allocator.h" + int main() { { @@ -42,4 +44,29 @@ int main() assert(c.size() == 3); assert(*r == 5.5); } +#if __cplusplus >= 201103L + { + typedef std::unordered_set, + std::equal_to, min_allocator> C; + typedef C::iterator R; + typedef C::value_type P; + C c; + C::const_iterator e = c.end(); + R r = c.insert(e, P(3.5)); + assert(c.size() == 1); + assert(*r == 3.5); + + r = c.insert(e, P(3.5)); + assert(c.size() == 1); + assert(*r == 3.5); + + r = c.insert(e, P(4.5)); + assert(c.size() == 2); + assert(*r == 4.5); + + r = c.insert(e, P(5.5)); + assert(c.size() == 3); + assert(*r == 5.5); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.set/insert_hint_rvalue.pass.cpp b/libcxx/test/containers/unord/unord.set/insert_hint_rvalue.pass.cpp index 3d79fbcc2997..8d7e5ba7a03a 100644 --- a/libcxx/test/containers/unord/unord.set/insert_hint_rvalue.pass.cpp +++ b/libcxx/test/containers/unord/unord.set/insert_hint_rvalue.pass.cpp @@ -19,6 +19,7 @@ #include #include "../../MoveOnly.h" +#include "../../min_allocator.h" int main() { @@ -68,4 +69,54 @@ int main() assert(*r == 5); } #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES +#if __cplusplus >= 201103L + { + typedef std::unordered_set, + std::equal_to, min_allocator> C; + typedef C::iterator R; + typedef double P; + C c; + C::const_iterator e = c.end(); + R r = c.insert(e, P(3.5)); + assert(c.size() == 1); + assert(*r == 3.5); + + r = c.insert(r, P(3.5)); + assert(c.size() == 1); + assert(*r == 3.5); + + r = c.insert(e, P(4.5)); + assert(c.size() == 2); + assert(*r == 4.5); + + r = c.insert(e, P(5.5)); + assert(c.size() == 3); + assert(*r == 5.5); + } +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + { + typedef std::unordered_set, + std::equal_to, min_allocator> C; + typedef C::iterator R; + typedef MoveOnly P; + C c; + C::const_iterator e = c.end(); + R r = c.insert(e, P(3)); + assert(c.size() == 1); + assert(*r == 3); + + r = c.insert(r, P(3)); + assert(c.size() == 1); + assert(*r == 3); + + r = c.insert(e, P(4)); + assert(c.size() == 2); + assert(*r == 4); + + r = c.insert(e, P(5)); + assert(c.size() == 3); + assert(*r == 5); + } +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES +#endif } diff --git a/libcxx/test/containers/unord/unord.set/insert_init.pass.cpp b/libcxx/test/containers/unord/unord.set/insert_init.pass.cpp index 3b1abdf48965..18a97a15314e 100644 --- a/libcxx/test/containers/unord/unord.set/insert_init.pass.cpp +++ b/libcxx/test/containers/unord/unord.set/insert_init.pass.cpp @@ -19,6 +19,7 @@ #include #include "test_iterators.h" +#include "../../min_allocator.h" int main() { @@ -43,5 +44,28 @@ int main() assert(c.count(3) == 1); assert(c.count(4) == 1); } +#if __cplusplus >= 201103L + { + typedef std::unordered_set, + std::equal_to, min_allocator> C; + typedef int P; + C c; + c.insert( + { + P(1), + P(2), + P(3), + P(4), + P(1), + P(2) + } + ); + assert(c.size() == 4); + assert(c.count(1) == 1); + assert(c.count(2) == 1); + assert(c.count(3) == 1); + assert(c.count(4) == 1); + } +#endif #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS } diff --git a/libcxx/test/containers/unord/unord.set/insert_range.pass.cpp b/libcxx/test/containers/unord/unord.set/insert_range.pass.cpp index b0b8fc62874f..aa3b38bbe2a0 100644 --- a/libcxx/test/containers/unord/unord.set/insert_range.pass.cpp +++ b/libcxx/test/containers/unord/unord.set/insert_range.pass.cpp @@ -20,6 +20,7 @@ #include #include "test_iterators.h" +#include "../../min_allocator.h" int main() { @@ -43,4 +44,27 @@ int main() assert(c.count(3) == 1); assert(c.count(4) == 1); } +#if __cplusplus >= 201103L + { + typedef std::unordered_set, + std::equal_to, min_allocator> C; + typedef int P; + P a[] = + { + P(1), + P(2), + P(3), + P(4), + P(1), + P(2) + }; + C c; + c.insert(input_iterator(a), input_iterator(a + sizeof(a)/sizeof(a[0]))); + assert(c.size() == 4); + assert(c.count(1) == 1); + assert(c.count(2) == 1); + assert(c.count(3) == 1); + assert(c.count(4) == 1); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.set/insert_rvalue.pass.cpp b/libcxx/test/containers/unord/unord.set/insert_rvalue.pass.cpp index e3268f0ad6a7..9ed2cda99054 100644 --- a/libcxx/test/containers/unord/unord.set/insert_rvalue.pass.cpp +++ b/libcxx/test/containers/unord/unord.set/insert_rvalue.pass.cpp @@ -19,6 +19,7 @@ #include #include "../../MoveOnly.h" +#include "../../min_allocator.h" int main() { @@ -74,4 +75,60 @@ int main() assert(r.second); } #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES +#if __cplusplus >= 201103L + { + typedef std::unordered_set, + std::equal_to, min_allocator> C; + typedef std::pair R; + typedef double P; + C c; + R r = c.insert(P(3.5)); + assert(c.size() == 1); + assert(*r.first == 3.5); + assert(r.second); + + r = c.insert(P(3.5)); + assert(c.size() == 1); + assert(*r.first == 3.5); + assert(!r.second); + + r = c.insert(P(4.5)); + assert(c.size() == 2); + assert(*r.first == 4.5); + assert(r.second); + + r = c.insert(P(5.5)); + assert(c.size() == 3); + assert(*r.first == 5.5); + assert(r.second); + } +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + { + typedef std::unordered_set, + std::equal_to, min_allocator> C; + typedef std::pair R; + typedef MoveOnly P; + C c; + R r = c.insert(P(3)); + assert(c.size() == 1); + assert(*r.first == 3); + assert(r.second); + + r = c.insert(P(3)); + assert(c.size() == 1); + assert(*r.first == 3); + assert(!r.second); + + r = c.insert(P(4)); + assert(c.size() == 2); + assert(*r.first == 4); + assert(r.second); + + r = c.insert(P(5)); + assert(c.size() == 3); + assert(*r.first == 5); + assert(r.second); + } +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES +#endif } diff --git a/libcxx/test/containers/unord/unord.set/iterators.pass.cpp b/libcxx/test/containers/unord/unord.set/iterators.pass.cpp index ef1ecb9ebc91..7815b9b381e4 100644 --- a/libcxx/test/containers/unord/unord.set/iterators.pass.cpp +++ b/libcxx/test/containers/unord/unord.set/iterators.pass.cpp @@ -23,6 +23,8 @@ #include #include +#include "../../min_allocator.h" + int main() { { @@ -63,4 +65,46 @@ int main() assert(std::distance(c.cbegin(), c.cend()) == c.size()); C::const_iterator i; } +#if __cplusplus >= 201103L + { + typedef std::unordered_set, + std::equal_to, min_allocator> C; + typedef int P; + P a[] = + { + P(1), + P(2), + P(3), + P(4), + P(1), + P(2) + }; + C c(a, a + sizeof(a)/sizeof(a[0])); + assert(c.bucket_count() >= 5); + assert(c.size() == 4); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + C::iterator i; + } + { + typedef std::unordered_set, + std::equal_to, min_allocator> C; + typedef int P; + P a[] = + { + P(1), + P(2), + P(3), + P(4), + P(1), + P(2) + }; + const C c(a, a + sizeof(a)/sizeof(a[0])); + assert(c.bucket_count() >= 5); + assert(c.size() == 4); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + C::const_iterator i; + } +#endif } diff --git a/libcxx/test/containers/unord/unord.set/load_factor.pass.cpp b/libcxx/test/containers/unord/unord.set/load_factor.pass.cpp index 60b0f91e534f..959f384cc37a 100644 --- a/libcxx/test/containers/unord/unord.set/load_factor.pass.cpp +++ b/libcxx/test/containers/unord/unord.set/load_factor.pass.cpp @@ -19,6 +19,8 @@ #include #include +#include "../../min_allocator.h" + int main() { { @@ -44,4 +46,31 @@ int main() const C c; assert(c.load_factor() == 0); } +#if __cplusplus >= 201103L + { + typedef std::unordered_set, + std::equal_to, min_allocator> C; + typedef int P; + P a[] = + { + P(10), + P(20), + P(30), + P(40), + P(50), + P(60), + P(70), + P(80) + }; + const C c(std::begin(a), std::end(a)); + assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); + } + { + typedef std::unordered_set, + std::equal_to, min_allocator> C; + typedef int P; + const C c; + assert(c.load_factor() == 0); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.set/local_iterators.pass.cpp b/libcxx/test/containers/unord/unord.set/local_iterators.pass.cpp index 93d7ea89fd6c..5b82228a3b1e 100644 --- a/libcxx/test/containers/unord/unord.set/local_iterators.pass.cpp +++ b/libcxx/test/containers/unord/unord.set/local_iterators.pass.cpp @@ -23,6 +23,8 @@ #include #include +#include "../../min_allocator.h" + int main() { { @@ -201,4 +203,186 @@ int main() assert(std::distance(i, j) == 1); assert(*i == 4); } +#if __cplusplus >= 201103L + { + typedef std::unordered_set, + std::equal_to, min_allocator> C; + typedef int P; + typedef C::local_iterator I; + P a[] = + { + P(1), + P(2), + P(3), + P(4), + P(1), + P(2) + }; + C c(a, a + sizeof(a)/sizeof(a[0])); + assert(c.bucket_count() >= 5); + C::size_type b = c.bucket(0); + I i = c.begin(b); + I j = c.end(b); + assert(std::distance(i, j) == 0); + + b = c.bucket(1); + i = c.begin(b); + j = c.end(b); + assert(std::distance(i, j) == 1); + assert(*i == 1); + + b = c.bucket(2); + i = c.begin(b); + j = c.end(b); + assert(std::distance(i, j) == 1); + assert(*i == 2); + + b = c.bucket(3); + i = c.begin(b); + j = c.end(b); + assert(std::distance(i, j) == 1); + assert(*i == 3); + + b = c.bucket(4); + i = c.begin(b); + j = c.end(b); + assert(std::distance(i, j) == 1); + assert(*i == 4); + } + { + typedef std::unordered_set, + std::equal_to, min_allocator> C; + typedef int P; + typedef C::const_local_iterator I; + P a[] = + { + P(1), + P(2), + P(3), + P(4), + P(1), + P(2) + }; + const C c(a, a + sizeof(a)/sizeof(a[0])); + assert(c.bucket_count() >= 5); + C::size_type b = c.bucket(0); + I i = c.begin(b); + I j = c.end(b); + assert(std::distance(i, j) == 0); + + b = c.bucket(1); + i = c.begin(b); + j = c.end(b); + assert(std::distance(i, j) == 1); + assert(*i == 1); + + b = c.bucket(2); + i = c.begin(b); + j = c.end(b); + assert(std::distance(i, j) == 1); + assert(*i == 2); + + b = c.bucket(3); + i = c.begin(b); + j = c.end(b); + assert(std::distance(i, j) == 1); + assert(*i == 3); + + b = c.bucket(4); + i = c.begin(b); + j = c.end(b); + assert(std::distance(i, j) == 1); + assert(*i == 4); + } + { + typedef std::unordered_set, + std::equal_to, min_allocator> C; + typedef int P; + typedef C::const_local_iterator I; + P a[] = + { + P(1), + P(2), + P(3), + P(4), + P(1), + P(2) + }; + C c(a, a + sizeof(a)/sizeof(a[0])); + assert(c.bucket_count() >= 5); + C::size_type b = c.bucket(0); + I i = c.cbegin(b); + I j = c.cend(b); + assert(std::distance(i, j) == 0); + + b = c.bucket(1); + i = c.cbegin(b); + j = c.cend(b); + assert(std::distance(i, j) == 1); + assert(*i == 1); + + b = c.bucket(2); + i = c.cbegin(b); + j = c.cend(b); + assert(std::distance(i, j) == 1); + assert(*i == 2); + + b = c.bucket(3); + i = c.cbegin(b); + j = c.cend(b); + assert(std::distance(i, j) == 1); + assert(*i == 3); + + b = c.bucket(4); + i = c.cbegin(b); + j = c.cend(b); + assert(std::distance(i, j) == 1); + assert(*i == 4); + } + { + typedef std::unordered_set, + std::equal_to, min_allocator> C; + typedef int P; + typedef C::const_local_iterator I; + P a[] = + { + P(1), + P(2), + P(3), + P(4), + P(1), + P(2) + }; + const C c(a, a + sizeof(a)/sizeof(a[0])); + assert(c.bucket_count() >= 5); + C::size_type b = c.bucket(0); + I i = c.cbegin(b); + I j = c.cend(b); + assert(std::distance(i, j) == 0); + + b = c.bucket(1); + i = c.cbegin(b); + j = c.cend(b); + assert(std::distance(i, j) == 1); + assert(*i == 1); + + b = c.bucket(2); + i = c.cbegin(b); + j = c.cend(b); + assert(std::distance(i, j) == 1); + assert(*i == 2); + + b = c.bucket(3); + i = c.cbegin(b); + j = c.cend(b); + assert(std::distance(i, j) == 1); + assert(*i == 3); + + b = c.bucket(4); + i = c.cbegin(b); + j = c.cend(b); + assert(std::distance(i, j) == 1); + assert(*i == 4); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.set/max_bucket_count.pass.cpp b/libcxx/test/containers/unord/unord.set/max_bucket_count.pass.cpp index ee36c56988af..80398b8f8bd3 100644 --- a/libcxx/test/containers/unord/unord.set/max_bucket_count.pass.cpp +++ b/libcxx/test/containers/unord/unord.set/max_bucket_count.pass.cpp @@ -18,6 +18,8 @@ #include #include +#include "../../min_allocator.h" + int main() { { @@ -25,4 +27,12 @@ int main() const C c; assert(c.max_bucket_count() > 0); } +#if __cplusplus >= 201103L + { + typedef std::unordered_set, + std::equal_to, min_allocator> C; + const C c; + assert(c.max_bucket_count() > 0); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.set/max_load_factor.pass.cpp b/libcxx/test/containers/unord/unord.set/max_load_factor.pass.cpp index 66470373f53b..db7e78437b47 100644 --- a/libcxx/test/containers/unord/unord.set/max_load_factor.pass.cpp +++ b/libcxx/test/containers/unord/unord.set/max_load_factor.pass.cpp @@ -19,6 +19,8 @@ #include #include +#include "../../min_allocator.h" + int main() { { @@ -35,4 +37,22 @@ int main() c.max_load_factor(2.5); assert(c.max_load_factor() == 2.5); } +#if __cplusplus >= 201103L + { + typedef std::unordered_set, + std::equal_to, min_allocator> C; + typedef int P; + const C c; + assert(c.max_load_factor() == 1); + } + { + typedef std::unordered_set, + std::equal_to, min_allocator> C; + typedef int P; + C c; + assert(c.max_load_factor() == 1); + c.max_load_factor(2.5); + assert(c.max_load_factor() == 2.5); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.set/max_size.pass.cpp b/libcxx/test/containers/unord/unord.set/max_size.pass.cpp index 2c5d3be88ffb..43d66bb6d80a 100644 --- a/libcxx/test/containers/unord/unord.set/max_size.pass.cpp +++ b/libcxx/test/containers/unord/unord.set/max_size.pass.cpp @@ -18,10 +18,19 @@ #include #include +#include "../../min_allocator.h" + int main() { { std::unordered_set u; assert(u.max_size() > 0); } +#if __cplusplus >= 201103L + { + std::unordered_set, + std::equal_to, min_allocator> u; + assert(u.max_size() > 0); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.set/rehash.pass.cpp b/libcxx/test/containers/unord/unord.set/rehash.pass.cpp index ae962c99f052..bf4d31759389 100644 --- a/libcxx/test/containers/unord/unord.set/rehash.pass.cpp +++ b/libcxx/test/containers/unord/unord.set/rehash.pass.cpp @@ -18,7 +18,10 @@ #include #include -void test(const std::unordered_set& c) +#include "../../min_allocator.h" + +template +void test(const C& c) { assert(c.size() == 4); assert(c.count(1) == 1); @@ -55,4 +58,33 @@ int main() assert(c.bucket_count() == 31); test(c); } +#if __cplusplus >= 201103L + { + typedef std::unordered_set, + std::equal_to, min_allocator> C; + typedef int P; + P a[] = + { + P(1), + P(2), + P(3), + P(4), + P(1), + P(2) + }; + C c(a, a + sizeof(a)/sizeof(a[0])); + test(c); + assert(c.bucket_count() >= 5); + c.rehash(3); + assert(c.bucket_count() == 5); + test(c); + c.max_load_factor(2); + c.rehash(3); + assert(c.bucket_count() == 3); + test(c); + c.rehash(31); + assert(c.bucket_count() == 31); + test(c); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.set/reserve.pass.cpp b/libcxx/test/containers/unord/unord.set/reserve.pass.cpp index 79507743590e..525f94384128 100644 --- a/libcxx/test/containers/unord/unord.set/reserve.pass.cpp +++ b/libcxx/test/containers/unord/unord.set/reserve.pass.cpp @@ -18,7 +18,10 @@ #include #include -void test(const std::unordered_set& c) +#include "../../min_allocator.h" + +template +void test(const C& c) { assert(c.size() == 4); assert(c.count(1) == 1); @@ -55,4 +58,33 @@ int main() assert(c.bucket_count() >= 16); test(c); } +#if __cplusplus >= 201103L + { + typedef std::unordered_set, + std::equal_to, min_allocator> C; + typedef int P; + P a[] = + { + P(1), + P(2), + P(3), + P(4), + P(1), + P(2) + }; + C c(a, a + sizeof(a)/sizeof(a[0])); + test(c); + assert(c.bucket_count() >= 5); + c.reserve(3); + assert(c.bucket_count() == 5); + test(c); + c.max_load_factor(2); + c.reserve(3); + assert(c.bucket_count() >= 2); + test(c); + c.reserve(31); + assert(c.bucket_count() >= 16); + test(c); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.set/swap_member.pass.cpp b/libcxx/test/containers/unord/unord.set/swap_member.pass.cpp index 3d9036265f38..9a972b725eb1 100644 --- a/libcxx/test/containers/unord/unord.set/swap_member.pass.cpp +++ b/libcxx/test/containers/unord/unord.set/swap_member.pass.cpp @@ -21,6 +21,7 @@ #include "../../test_compare.h" #include "../../test_hash.h" #include "../../test_allocator.h" +#include "../../min_allocator.h" int main() { @@ -385,4 +386,186 @@ int main() assert(std::distance(c2.cbegin(), c2.cend()) == c2.size()); assert(c2.max_load_factor() == 1); } +#if __cplusplus >= 201103L + { + typedef test_hash > Hash; + typedef test_compare > Compare; + typedef min_allocator Alloc; + typedef std::unordered_set C; + typedef int P; + C c1(0, Hash(1), Compare(1), Alloc()); + C c2(0, Hash(2), Compare(2), Alloc()); + c2.max_load_factor(2); + c1.swap(c2); + + assert(c1.bucket_count() == 0); + assert(c1.size() == 0); + assert(c1.hash_function() == Hash(2)); + assert(c1.key_eq() == Compare(2)); + assert(c1.get_allocator() == Alloc()); + assert(std::distance(c1.begin(), c1.end()) == c1.size()); + assert(std::distance(c1.cbegin(), c1.cend()) == c1.size()); + assert(c1.max_load_factor() == 2); + + assert(c2.bucket_count() == 0); + assert(c2.size() == 0); + assert(c2.hash_function() == Hash(1)); + assert(c2.key_eq() == Compare(1)); + assert(c2.get_allocator() == Alloc()); + assert(std::distance(c2.begin(), c2.end()) == c2.size()); + assert(std::distance(c2.cbegin(), c2.cend()) == c2.size()); + assert(c2.max_load_factor() == 1); + } + { + typedef test_hash > Hash; + typedef test_compare > Compare; + typedef min_allocator Alloc; + typedef std::unordered_set C; + typedef int P; + P a2[] = + { + P(10), + P(20), + P(30), + P(40), + P(50), + P(60), + P(70), + P(80) + }; + C c1(0, Hash(1), Compare(1), Alloc()); + C c2(std::begin(a2), std::end(a2), 0, Hash(2), Compare(2), Alloc()); + c2.max_load_factor(2); + c1.swap(c2); + + assert(c1.bucket_count() >= 11); + assert(c1.size() == 8); + assert(*c1.find(10) == 10); + assert(*c1.find(20) == 20); + assert(*c1.find(30) == 30); + assert(*c1.find(40) == 40); + assert(*c1.find(50) == 50); + assert(*c1.find(60) == 60); + assert(*c1.find(70) == 70); + assert(*c1.find(80) == 80); + assert(c1.hash_function() == Hash(2)); + assert(c1.key_eq() == Compare(2)); + assert(c1.get_allocator() == Alloc()); + assert(std::distance(c1.begin(), c1.end()) == c1.size()); + assert(std::distance(c1.cbegin(), c1.cend()) == c1.size()); + assert(c1.max_load_factor() == 2); + + assert(c2.bucket_count() == 0); + assert(c2.size() == 0); + assert(c2.hash_function() == Hash(1)); + assert(c2.key_eq() == Compare(1)); + assert(c2.get_allocator() == Alloc()); + assert(std::distance(c2.begin(), c2.end()) == c2.size()); + assert(std::distance(c2.cbegin(), c2.cend()) == c2.size()); + assert(c2.max_load_factor() == 1); + } + { + typedef test_hash > Hash; + typedef test_compare > Compare; + typedef min_allocator Alloc; + typedef std::unordered_set C; + typedef int P; + P a1[] = + { + P(1), + P(2), + P(3), + P(4), + P(1), + P(2) + }; + C c1(std::begin(a1), std::end(a1), 0, Hash(1), Compare(1), Alloc()); + C c2(0, Hash(2), Compare(2), Alloc()); + c2.max_load_factor(2); + c1.swap(c2); + + assert(c1.bucket_count() == 0); + assert(c1.size() == 0); + assert(c1.hash_function() == Hash(2)); + assert(c1.key_eq() == Compare(2)); + assert(c1.get_allocator() == Alloc()); + assert(std::distance(c1.begin(), c1.end()) == c1.size()); + assert(std::distance(c1.cbegin(), c1.cend()) == c1.size()); + assert(c1.max_load_factor() == 2); + + assert(c2.bucket_count() >= 5); + assert(c2.size() == 4); + assert(c2.count(1) == 1); + assert(c2.count(2) == 1); + assert(c2.count(3) == 1); + assert(c2.count(4) == 1); + assert(c2.hash_function() == Hash(1)); + assert(c2.key_eq() == Compare(1)); + assert(c2.get_allocator() == Alloc()); + assert(std::distance(c2.begin(), c2.end()) == c2.size()); + assert(std::distance(c2.cbegin(), c2.cend()) == c2.size()); + assert(c2.max_load_factor() == 1); + } + { + typedef test_hash > Hash; + typedef test_compare > Compare; + typedef min_allocator Alloc; + typedef std::unordered_set C; + typedef int P; + P a1[] = + { + P(1), + P(2), + P(3), + P(4), + P(1), + P(2) + }; + P a2[] = + { + P(10), + P(20), + P(30), + P(40), + P(50), + P(60), + P(70), + P(80) + }; + C c1(std::begin(a1), std::end(a1), 0, Hash(1), Compare(1), Alloc()); + C c2(std::begin(a2), std::end(a2), 0, Hash(2), Compare(2), Alloc()); + c2.max_load_factor(2); + c1.swap(c2); + + assert(c1.bucket_count() >= 11); + assert(c1.size() == 8); + assert(*c1.find(10) == 10); + assert(*c1.find(20) == 20); + assert(*c1.find(30) == 30); + assert(*c1.find(40) == 40); + assert(*c1.find(50) == 50); + assert(*c1.find(60) == 60); + assert(*c1.find(70) == 70); + assert(*c1.find(80) == 80); + assert(c1.hash_function() == Hash(2)); + assert(c1.key_eq() == Compare(2)); + assert(c1.get_allocator() == Alloc()); + assert(std::distance(c1.begin(), c1.end()) == c1.size()); + assert(std::distance(c1.cbegin(), c1.cend()) == c1.size()); + assert(c1.max_load_factor() == 2); + + assert(c2.bucket_count() >= 5); + assert(c2.size() == 4); + assert(c2.count(1) == 1); + assert(c2.count(2) == 1); + assert(c2.count(3) == 1); + assert(c2.count(4) == 1); + assert(c2.hash_function() == Hash(1)); + assert(c2.key_eq() == Compare(1)); + assert(c2.get_allocator() == Alloc()); + assert(std::distance(c2.begin(), c2.end()) == c2.size()); + assert(std::distance(c2.cbegin(), c2.cend()) == c2.size()); + assert(c2.max_load_factor() == 1); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.set/types.pass.cpp b/libcxx/test/containers/unord/unord.set/types.pass.cpp index a69eb0a09b28..11d992f9fa0a 100644 --- a/libcxx/test/containers/unord/unord.set/types.pass.cpp +++ b/libcxx/test/containers/unord/unord.set/types.pass.cpp @@ -30,6 +30,8 @@ #include #include +#include "../../min_allocator.h" + int main() { { @@ -46,4 +48,21 @@ int main() static_assert((std::is_same::value), ""); static_assert((std::is_same::value), ""); } +#if __cplusplus >= 201103L + { + typedef std::unordered_set, + std::equal_to, min_allocator> C; + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same >::value), ""); + static_assert((std::is_same >::value), ""); + static_assert((std::is_same >::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same>::value), ""); + static_assert((std::is_same>::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.set/unord.set.cnstr/allocator.pass.cpp b/libcxx/test/containers/unord/unord.set/unord.set.cnstr/allocator.pass.cpp index a5e2368d3906..31878362f1e0 100644 --- a/libcxx/test/containers/unord/unord.set/unord.set.cnstr/allocator.pass.cpp +++ b/libcxx/test/containers/unord/unord.set/unord.set.cnstr/allocator.pass.cpp @@ -22,6 +22,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -42,4 +43,23 @@ int main() assert(c.load_factor() == 0); assert(c.max_load_factor() == 1); } +#if __cplusplus >= 201103L + { + typedef std::unordered_set >, + test_compare >, + min_allocator + > C; + C c(min_allocator{}); + assert(c.bucket_count() == 0); + assert(c.hash_function() == test_hash >()); + assert(c.key_eq() == test_compare >()); + assert(c.get_allocator() == min_allocator()); + assert(c.size() == 0); + assert(c.empty()); + assert(std::distance(c.begin(), c.end()) == 0); + assert(c.load_factor() == 0); + assert(c.max_load_factor() == 1); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.set/unord.set.cnstr/assign_copy.pass.cpp b/libcxx/test/containers/unord/unord.set/unord.set.cnstr/assign_copy.pass.cpp index eaf2e8036fd7..e7fa903636e4 100644 --- a/libcxx/test/containers/unord/unord.set/unord.set.cnstr/assign_copy.pass.cpp +++ b/libcxx/test/containers/unord/unord.set/unord.set.cnstr/assign_copy.pass.cpp @@ -22,6 +22,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -115,4 +116,51 @@ int main() assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); assert(c.max_load_factor() == 1); } +#if __cplusplus >= 201103L + { + typedef min_allocator A; + typedef std::unordered_set >, + test_compare >, + A + > C; + typedef int P; + P a[] = + { + P(1), + P(2), + P(3), + P(4), + P(1), + P(2) + }; + C c0(a, a + sizeof(a)/sizeof(a[0]), + 7, + test_hash >(8), + test_compare >(9), + A() + ); + C c(a, a + 2, + 7, + test_hash >(2), + test_compare >(3), + A() + ); + c = c0; + assert(c.bucket_count() == 7); + assert(c.size() == 4); + assert(c.count(1) == 1); + assert(c.count(2) == 1); + assert(c.count(3) == 1); + assert(c.count(4) == 1); + assert(c.hash_function() == test_hash >(8)); + assert(c.key_eq() == test_compare >(9)); + assert(c.get_allocator() == A()); + assert(!c.empty()); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); + assert(c.max_load_factor() == 1); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.set/unord.set.cnstr/assign_init.pass.cpp b/libcxx/test/containers/unord/unord.set/unord.set.cnstr/assign_init.pass.cpp index 10fff26cfd1e..256f4447c927 100644 --- a/libcxx/test/containers/unord/unord.set/unord.set.cnstr/assign_init.pass.cpp +++ b/libcxx/test/containers/unord/unord.set/unord.set.cnstr/assign_init.pass.cpp @@ -22,6 +22,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -58,5 +59,39 @@ int main() assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); assert(c.max_load_factor() == 1); } +#if __cplusplus >= 201103L + { + typedef min_allocator A; + typedef std::unordered_set >, + test_compare >, + A + > C; + typedef int P; + C c = { + P(4), + P(1), + P(2) + }; + c = { + P(1), + P(2), + P(3), + P(4), + P(1), + P(2) + }; + assert(c.bucket_count() >= 5); + assert(c.size() == 4); + assert(c.count(1) == 1); + assert(c.count(2) == 1); + assert(c.count(3) == 1); + assert(c.count(4) == 1); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); + assert(c.max_load_factor() == 1); + } +#endif #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS } diff --git a/libcxx/test/containers/unord/unord.set/unord.set.cnstr/assign_move.pass.cpp b/libcxx/test/containers/unord/unord.set/unord.set.cnstr/assign_move.pass.cpp index 945c8ef8adde..8dab47b861de 100644 --- a/libcxx/test/containers/unord/unord.set/unord.set.cnstr/assign_move.pass.cpp +++ b/libcxx/test/containers/unord/unord.set/unord.set.cnstr/assign_move.pass.cpp @@ -22,6 +22,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -161,5 +162,52 @@ int main() assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); assert(c.max_load_factor() == 1); } +#if __cplusplus >= 201103L + { + typedef min_allocator A; + typedef std::unordered_set >, + test_compare >, + A + > C; + typedef int P; + P a[] = + { + P(1), + P(2), + P(3), + P(4), + P(1), + P(2) + }; + C c0(a, a + sizeof(a)/sizeof(a[0]), + 7, + test_hash >(8), + test_compare >(9), + A() + ); + C c(a, a + 2, + 7, + test_hash >(2), + test_compare >(3), + A() + ); + c = std::move(c0); + assert(c.bucket_count() == 7); + assert(c.size() == 4); + assert(c.count(1) == 1); + assert(c.count(2) == 1); + assert(c.count(3) == 1); + assert(c.count(4) == 1); + assert(c.hash_function() == test_hash >(8)); + assert(c.key_eq() == test_compare >(9)); + assert(c.get_allocator() == A()); + assert(!c.empty()); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); + assert(c.max_load_factor() == 1); + } +#endif #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES } diff --git a/libcxx/test/containers/unord/unord.set/unord.set.cnstr/copy.pass.cpp b/libcxx/test/containers/unord/unord.set/unord.set.cnstr/copy.pass.cpp index d1ee1fb74e3e..7fe0e15df7ce 100644 --- a/libcxx/test/containers/unord/unord.set/unord.set.cnstr/copy.pass.cpp +++ b/libcxx/test/containers/unord/unord.set/unord.set.cnstr/copy.pass.cpp @@ -22,6 +22,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -103,4 +104,44 @@ int main() assert(c.max_load_factor() == 1); } #endif // _LIBCPP_HAS_NO_ADVANCED_SFINAE +#if __cplusplus >= 201103L + { + typedef std::unordered_set >, + test_compare >, + min_allocator + > C; + typedef int P; + P a[] = + { + P(1), + P(2), + P(3), + P(4), + P(1), + P(2) + }; + C c0(a, a + sizeof(a)/sizeof(a[0]), + 7, + test_hash >(8), + test_compare >(9), + min_allocator() + ); + C c = c0; + assert(c.bucket_count() == 7); + assert(c.size() == 4); + assert(c.count(1) == 1); + assert(c.count(2) == 1); + assert(c.count(3) == 1); + assert(c.count(4) == 1); + assert(c.hash_function() == test_hash >(8)); + assert(c.key_eq() == test_compare >(9)); + assert(c.get_allocator() == min_allocator()); + assert(!c.empty()); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); + assert(c.max_load_factor() == 1); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.set/unord.set.cnstr/copy_alloc.pass.cpp b/libcxx/test/containers/unord/unord.set/unord.set.cnstr/copy_alloc.pass.cpp index 23924f076e7d..67995b3abdc7 100644 --- a/libcxx/test/containers/unord/unord.set/unord.set.cnstr/copy_alloc.pass.cpp +++ b/libcxx/test/containers/unord/unord.set/unord.set.cnstr/copy_alloc.pass.cpp @@ -22,6 +22,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -63,4 +64,44 @@ int main() assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); assert(c.max_load_factor() == 1); } +#if __cplusplus >= 201103L + { + typedef std::unordered_set >, + test_compare >, + min_allocator + > C; + typedef int P; + P a[] = + { + P(1), + P(2), + P(3), + P(4), + P(1), + P(2) + }; + C c0(a, a + sizeof(a)/sizeof(a[0]), + 7, + test_hash >(8), + test_compare >(9), + min_allocator() + ); + C c(c0, min_allocator()); + assert(c.bucket_count() == 7); + assert(c.size() == 4); + assert(c.count(1) == 1); + assert(c.count(2) == 1); + assert(c.count(3) == 1); + assert(c.count(4) == 1); + assert(c.hash_function() == test_hash >(8)); + assert(c.key_eq() == test_compare >(9)); + assert(c.get_allocator() == min_allocator()); + assert(!c.empty()); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); + assert(c.max_load_factor() == 1); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.set/unord.set.cnstr/default.pass.cpp b/libcxx/test/containers/unord/unord.set/unord.set.cnstr/default.pass.cpp index 2e73140ae89d..e53264fc5709 100644 --- a/libcxx/test/containers/unord/unord.set/unord.set.cnstr/default.pass.cpp +++ b/libcxx/test/containers/unord/unord.set/unord.set.cnstr/default.pass.cpp @@ -22,6 +22,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -42,4 +43,23 @@ int main() assert(c.load_factor() == 0); assert(c.max_load_factor() == 1); } +#if __cplusplus >= 201103L + { + typedef std::unordered_set >, + test_compare >, + min_allocator + > C; + C c; + assert(c.bucket_count() == 0); + assert(c.hash_function() == test_hash >()); + assert(c.key_eq() == test_compare >()); + assert(c.get_allocator() == (min_allocator())); + assert(c.size() == 0); + assert(c.empty()); + assert(std::distance(c.begin(), c.end()) == 0); + assert(c.load_factor() == 0); + assert(c.max_load_factor() == 1); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.set/unord.set.cnstr/init.pass.cpp b/libcxx/test/containers/unord/unord.set/unord.set.cnstr/init.pass.cpp index 0d3320e345ec..8dc37e30465b 100644 --- a/libcxx/test/containers/unord/unord.set/unord.set.cnstr/init.pass.cpp +++ b/libcxx/test/containers/unord/unord.set/unord.set.cnstr/init.pass.cpp @@ -22,6 +22,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -56,5 +57,37 @@ int main() assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); assert(c.max_load_factor() == 1); } +#if __cplusplus >= 201103L + { + typedef std::unordered_set >, + test_compare >, + min_allocator + > C; + typedef int P; + C c = { + P(1), + P(2), + P(3), + P(4), + P(1), + P(2) + }; + assert(c.bucket_count() >= 5); + assert(c.size() == 4); + assert(c.count(1) == 1); + assert(c.count(2) == 1); + assert(c.count(3) == 1); + assert(c.count(4) == 1); + assert(c.hash_function() == test_hash >()); + assert(c.key_eq() == test_compare >()); + assert(c.get_allocator() == min_allocator()); + assert(!c.empty()); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); + assert(c.max_load_factor() == 1); + } +#endif #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS } diff --git a/libcxx/test/containers/unord/unord.set/unord.set.cnstr/init_size.pass.cpp b/libcxx/test/containers/unord/unord.set/unord.set.cnstr/init_size.pass.cpp index 3ec3bbe981d0..3cc3cf0ab8c0 100644 --- a/libcxx/test/containers/unord/unord.set/unord.set.cnstr/init_size.pass.cpp +++ b/libcxx/test/containers/unord/unord.set/unord.set.cnstr/init_size.pass.cpp @@ -22,6 +22,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -58,5 +59,39 @@ int main() assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); assert(c.max_load_factor() == 1); } +#if __cplusplus >= 201103L + { + typedef std::unordered_set >, + test_compare >, + min_allocator + > C; + typedef int P; + C c({ + P(1), + P(2), + P(3), + P(4), + P(1), + P(2) + }, + 7 + ); + assert(c.bucket_count() == 7); + assert(c.size() == 4); + assert(c.count(1) == 1); + assert(c.count(2) == 1); + assert(c.count(3) == 1); + assert(c.count(4) == 1); + assert(c.hash_function() == test_hash >()); + assert(c.key_eq() == test_compare >()); + assert(c.get_allocator() == min_allocator()); + assert(!c.empty()); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); + assert(c.max_load_factor() == 1); + } +#endif #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS } diff --git a/libcxx/test/containers/unord/unord.set/unord.set.cnstr/init_size_hash.pass.cpp b/libcxx/test/containers/unord/unord.set/unord.set.cnstr/init_size_hash.pass.cpp index f953c1ef4ea2..9dc61fbb0821 100644 --- a/libcxx/test/containers/unord/unord.set/unord.set.cnstr/init_size_hash.pass.cpp +++ b/libcxx/test/containers/unord/unord.set/unord.set.cnstr/init_size_hash.pass.cpp @@ -23,6 +23,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -60,5 +61,40 @@ int main() assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); assert(c.max_load_factor() == 1); } +#if __cplusplus >= 201103L + { + typedef std::unordered_set >, + test_compare >, + min_allocator + > C; + typedef int P; + C c({ + P(1), + P(2), + P(3), + P(4), + P(1), + P(2) + }, + 7, + test_hash >(8) + ); + assert(c.bucket_count() == 7); + assert(c.size() == 4); + assert(c.count(1) == 1); + assert(c.count(2) == 1); + assert(c.count(3) == 1); + assert(c.count(4) == 1); + assert(c.hash_function() == test_hash >(8)); + assert(c.key_eq() == test_compare >()); + assert(c.get_allocator() == min_allocator()); + assert(!c.empty()); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); + assert(c.max_load_factor() == 1); + } +#endif #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS } diff --git a/libcxx/test/containers/unord/unord.set/unord.set.cnstr/init_size_hash_equal.pass.cpp b/libcxx/test/containers/unord/unord.set/unord.set.cnstr/init_size_hash_equal.pass.cpp index 3b9825107797..a191c7c2f0b1 100644 --- a/libcxx/test/containers/unord/unord.set/unord.set.cnstr/init_size_hash_equal.pass.cpp +++ b/libcxx/test/containers/unord/unord.set/unord.set.cnstr/init_size_hash_equal.pass.cpp @@ -23,6 +23,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -61,5 +62,41 @@ int main() assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); assert(c.max_load_factor() == 1); } +#if __cplusplus >= 201103L + { + typedef std::unordered_set >, + test_compare >, + min_allocator + > C; + typedef int P; + C c({ + P(1), + P(2), + P(3), + P(4), + P(1), + P(2) + }, + 7, + test_hash >(8), + test_compare >(9) + ); + assert(c.bucket_count() == 7); + assert(c.size() == 4); + assert(c.count(1) == 1); + assert(c.count(2) == 1); + assert(c.count(3) == 1); + assert(c.count(4) == 1); + assert(c.hash_function() == test_hash >(8)); + assert(c.key_eq() == test_compare >(9)); + assert(c.get_allocator() == min_allocator()); + assert(!c.empty()); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); + assert(c.max_load_factor() == 1); + } +#endif #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS } diff --git a/libcxx/test/containers/unord/unord.set/unord.set.cnstr/init_size_hash_equal_allocator.pass.cpp b/libcxx/test/containers/unord/unord.set/unord.set.cnstr/init_size_hash_equal_allocator.pass.cpp index 2dc76902215d..4a1fc6cd8a8e 100644 --- a/libcxx/test/containers/unord/unord.set/unord.set.cnstr/init_size_hash_equal_allocator.pass.cpp +++ b/libcxx/test/containers/unord/unord.set/unord.set.cnstr/init_size_hash_equal_allocator.pass.cpp @@ -23,6 +23,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -62,5 +63,42 @@ int main() assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); assert(c.max_load_factor() == 1); } +#if __cplusplus >= 201103L + { + typedef std::unordered_set >, + test_compare >, + min_allocator + > C; + typedef int P; + C c({ + P(1), + P(2), + P(3), + P(4), + P(1), + P(2) + }, + 7, + test_hash >(8), + test_compare >(9), + min_allocator() + ); + assert(c.bucket_count() == 7); + assert(c.size() == 4); + assert(c.count(1) == 1); + assert(c.count(2) == 1); + assert(c.count(3) == 1); + assert(c.count(4) == 1); + assert(c.hash_function() == test_hash >(8)); + assert(c.key_eq() == test_compare >(9)); + assert(c.get_allocator() == min_allocator()); + assert(!c.empty()); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); + assert(c.max_load_factor() == 1); + } +#endif #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS } diff --git a/libcxx/test/containers/unord/unord.set/unord.set.cnstr/move.pass.cpp b/libcxx/test/containers/unord/unord.set/unord.set.cnstr/move.pass.cpp index 7077690f04dc..5c75a3e8acaa 100644 --- a/libcxx/test/containers/unord/unord.set/unord.set.cnstr/move.pass.cpp +++ b/libcxx/test/containers/unord/unord.set/unord.set.cnstr/move.pass.cpp @@ -22,6 +22,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -101,5 +102,82 @@ int main() assert(c0.empty()); } +#if __cplusplus >= 201103L + { + typedef std::unordered_set >, + test_compare >, + min_allocator + > C; + typedef int P; + P a[] = + { + P(1), + P(2), + P(3), + P(4), + P(1), + P(2) + }; + C c0(7, + test_hash >(8), + test_compare >(9), + min_allocator() + ); + C c = std::move(c0); + assert(c.bucket_count() == 7); + assert(c.size() == 0); + assert(c.hash_function() == test_hash >(8)); + assert(c.key_eq() == test_compare >(9)); + assert(c.get_allocator() == min_allocator()); + assert(c.empty()); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + assert(c.load_factor() == 0); + assert(c.max_load_factor() == 1); + + assert(c0.empty()); + } + { + typedef std::unordered_set >, + test_compare >, + min_allocator + > C; + typedef int P; + P a[] = + { + P(1), + P(2), + P(3), + P(4), + P(1), + P(2) + }; + C c0(a, a + sizeof(a)/sizeof(a[0]), + 7, + test_hash >(8), + test_compare >(9), + min_allocator() + ); + C c = std::move(c0); + assert(c.bucket_count() == 7); + assert(c.size() == 4); + assert(c.count(1) == 1); + assert(c.count(2) == 1); + assert(c.count(3) == 1); + assert(c.count(4) == 1); + assert(c.hash_function() == test_hash >(8)); + assert(c.key_eq() == test_compare >(9)); + assert(c.get_allocator() == min_allocator()); + assert(!c.empty()); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); + assert(c.max_load_factor() == 1); + + assert(c0.empty()); + } +#endif #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES } diff --git a/libcxx/test/containers/unord/unord.set/unord.set.cnstr/move_alloc.pass.cpp b/libcxx/test/containers/unord/unord.set/unord.set.cnstr/move_alloc.pass.cpp index 0b1336a8255d..1e58dbd7a26e 100644 --- a/libcxx/test/containers/unord/unord.set/unord.set.cnstr/move_alloc.pass.cpp +++ b/libcxx/test/containers/unord/unord.set/unord.set.cnstr/move_alloc.pass.cpp @@ -22,6 +22,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -108,5 +109,48 @@ int main() assert(c0.empty()); } +#if __cplusplus >= 201103L + { + typedef int P; + typedef min_allocator A; + typedef std::unordered_set >, + test_compare >, + A + > C; + P a[] = + { + P(1), + P(2), + P(3), + P(4), + P(1), + P(2) + }; + C c0(a, a + sizeof(a)/sizeof(a[0]), + 7, + test_hash >(8), + test_compare >(9), + A() + ); + C c(std::move(c0), A()); + assert(c.bucket_count() >= 5); + assert(c.size() == 4); + assert(c.count(1) == 1); + assert(c.count(2) == 1); + assert(c.count(3) == 1); + assert(c.count(4) == 1); + assert(c.hash_function() == test_hash >(8)); + assert(c.key_eq() == test_compare >(9)); + assert(c.get_allocator() == A()); + assert(!c.empty()); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); + assert(c.max_load_factor() == 1); + + assert(c0.empty()); + } +#endif #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES } diff --git a/libcxx/test/containers/unord/unord.set/unord.set.cnstr/range.pass.cpp b/libcxx/test/containers/unord/unord.set/unord.set.cnstr/range.pass.cpp index 1515a0c2df7c..322fa3ff5a3a 100644 --- a/libcxx/test/containers/unord/unord.set/unord.set.cnstr/range.pass.cpp +++ b/libcxx/test/containers/unord/unord.set/unord.set.cnstr/range.pass.cpp @@ -24,6 +24,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -59,4 +60,38 @@ int main() assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); assert(c.max_load_factor() == 1); } +#if __cplusplus >= 201103L + { + typedef std::unordered_set >, + test_compare >, + min_allocator + > C; + typedef int P; + P a[] = + { + P(1), + P(2), + P(3), + P(4), + P(1), + P(2) + }; + C c(input_iterator(a), input_iterator(a + sizeof(a)/sizeof(a[0]))); + assert(c.bucket_count() >= 5); + assert(c.size() == 4); + assert(c.count(1) == 1); + assert(c.count(2) == 1); + assert(c.count(3) == 1); + assert(c.count(4) == 1); + assert(c.hash_function() == test_hash >()); + assert(c.key_eq() == test_compare >()); + assert(c.get_allocator() == min_allocator()); + assert(!c.empty()); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); + assert(c.max_load_factor() == 1); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.set/unord.set.cnstr/range_size.pass.cpp b/libcxx/test/containers/unord/unord.set/unord.set.cnstr/range_size.pass.cpp index 33d8f3a1149d..87e62a005d12 100644 --- a/libcxx/test/containers/unord/unord.set/unord.set.cnstr/range_size.pass.cpp +++ b/libcxx/test/containers/unord/unord.set/unord.set.cnstr/range_size.pass.cpp @@ -24,6 +24,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -61,4 +62,40 @@ int main() assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); assert(c.max_load_factor() == 1); } +#if __cplusplus >= 201103L + { + typedef std::unordered_set >, + test_compare >, + min_allocator + > C; + typedef int P; + P a[] = + { + P(1), + P(2), + P(3), + P(4), + P(1), + P(2) + }; + C c(input_iterator(a), input_iterator(a + sizeof(a)/sizeof(a[0])), + 7 + ); + assert(c.bucket_count() == 7); + assert(c.size() == 4); + assert(c.count(1) == 1); + assert(c.count(2) == 1); + assert(c.count(3) == 1); + assert(c.count(4) == 1); + assert(c.hash_function() == test_hash >()); + assert(c.key_eq() == test_compare >()); + assert(c.get_allocator() == min_allocator()); + assert(!c.empty()); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); + assert(c.max_load_factor() == 1); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.set/unord.set.cnstr/range_size_hash.pass.cpp b/libcxx/test/containers/unord/unord.set/unord.set.cnstr/range_size_hash.pass.cpp index deabebdbeaba..6f6f1782f98e 100644 --- a/libcxx/test/containers/unord/unord.set/unord.set.cnstr/range_size_hash.pass.cpp +++ b/libcxx/test/containers/unord/unord.set/unord.set.cnstr/range_size_hash.pass.cpp @@ -25,6 +25,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -63,4 +64,41 @@ int main() assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); assert(c.max_load_factor() == 1); } +#if __cplusplus >= 201103L + { + typedef std::unordered_set >, + test_compare >, + min_allocator + > C; + typedef int P; + P a[] = + { + P(1), + P(2), + P(3), + P(4), + P(1), + P(2) + }; + C c(input_iterator(a), input_iterator(a + sizeof(a)/sizeof(a[0])), + 7, + test_hash >(8) + ); + assert(c.bucket_count() == 7); + assert(c.size() == 4); + assert(c.count(1) == 1); + assert(c.count(2) == 1); + assert(c.count(3) == 1); + assert(c.count(4) == 1); + assert(c.hash_function() == test_hash >(8)); + assert(c.key_eq() == test_compare >()); + assert(c.get_allocator() == min_allocator()); + assert(!c.empty()); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); + assert(c.max_load_factor() == 1); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.set/unord.set.cnstr/range_size_hash_equal.pass.cpp b/libcxx/test/containers/unord/unord.set/unord.set.cnstr/range_size_hash_equal.pass.cpp index a0fafaddee31..ac2aafd73508 100644 --- a/libcxx/test/containers/unord/unord.set/unord.set.cnstr/range_size_hash_equal.pass.cpp +++ b/libcxx/test/containers/unord/unord.set/unord.set.cnstr/range_size_hash_equal.pass.cpp @@ -25,6 +25,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -64,4 +65,42 @@ int main() assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); assert(c.max_load_factor() == 1); } +#if __cplusplus >= 201103L + { + typedef std::unordered_set >, + test_compare >, + min_allocator + > C; + typedef int P; + P a[] = + { + P(1), + P(2), + P(3), + P(4), + P(1), + P(2) + }; + C c(input_iterator(a), input_iterator(a + sizeof(a)/sizeof(a[0])), + 7, + test_hash >(8), + test_compare >(9) + ); + assert(c.bucket_count() == 7); + assert(c.size() == 4); + assert(c.count(1) == 1); + assert(c.count(2) == 1); + assert(c.count(3) == 1); + assert(c.count(4) == 1); + assert(c.hash_function() == test_hash >(8)); + assert(c.key_eq() == test_compare >(9)); + assert(c.get_allocator() == min_allocator()); + assert(!c.empty()); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); + assert(c.max_load_factor() == 1); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.set/unord.set.cnstr/range_size_hash_equal_allocator.pass.cpp b/libcxx/test/containers/unord/unord.set/unord.set.cnstr/range_size_hash_equal_allocator.pass.cpp index c6153df62be0..5a051e827122 100644 --- a/libcxx/test/containers/unord/unord.set/unord.set.cnstr/range_size_hash_equal_allocator.pass.cpp +++ b/libcxx/test/containers/unord/unord.set/unord.set.cnstr/range_size_hash_equal_allocator.pass.cpp @@ -26,6 +26,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -66,4 +67,43 @@ int main() assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); assert(c.max_load_factor() == 1); } +#if __cplusplus >= 201103L + { + typedef std::unordered_set >, + test_compare >, + min_allocator + > C; + typedef int P; + P a[] = + { + P(1), + P(2), + P(3), + P(4), + P(1), + P(2) + }; + C c(input_iterator(a), input_iterator(a + sizeof(a)/sizeof(a[0])), + 7, + test_hash >(8), + test_compare >(9), + min_allocator() + ); + assert(c.bucket_count() == 7); + assert(c.size() == 4); + assert(c.count(1) == 1); + assert(c.count(2) == 1); + assert(c.count(3) == 1); + assert(c.count(4) == 1); + assert(c.hash_function() == test_hash >(8)); + assert(c.key_eq() == test_compare >(9)); + assert(c.get_allocator() == min_allocator()); + assert(!c.empty()); + assert(std::distance(c.begin(), c.end()) == c.size()); + assert(std::distance(c.cbegin(), c.cend()) == c.size()); + assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); + assert(c.max_load_factor() == 1); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.set/unord.set.cnstr/size.pass.cpp b/libcxx/test/containers/unord/unord.set/unord.set.cnstr/size.pass.cpp index b5d970d290f8..fe019669b2e2 100644 --- a/libcxx/test/containers/unord/unord.set/unord.set.cnstr/size.pass.cpp +++ b/libcxx/test/containers/unord/unord.set/unord.set.cnstr/size.pass.cpp @@ -22,6 +22,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -42,4 +43,23 @@ int main() assert(c.load_factor() == 0); assert(c.max_load_factor() == 1); } +#if __cplusplus >= 201103L + { + typedef std::unordered_set >, + test_compare >, + min_allocator + > C; + C c(7); + assert(c.bucket_count() == 7); + assert(c.hash_function() == test_hash >()); + assert(c.key_eq() == test_compare >()); + assert(c.get_allocator() == (min_allocator())); + assert(c.size() == 0); + assert(c.empty()); + assert(std::distance(c.begin(), c.end()) == 0); + assert(c.load_factor() == 0); + assert(c.max_load_factor() == 1); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.set/unord.set.cnstr/size_hash.pass.cpp b/libcxx/test/containers/unord/unord.set/unord.set.cnstr/size_hash.pass.cpp index 575236f0fdfe..2bda6cc2fd24 100644 --- a/libcxx/test/containers/unord/unord.set/unord.set.cnstr/size_hash.pass.cpp +++ b/libcxx/test/containers/unord/unord.set/unord.set.cnstr/size_hash.pass.cpp @@ -22,6 +22,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -44,4 +45,25 @@ int main() assert(c.load_factor() == 0); assert(c.max_load_factor() == 1); } +#if __cplusplus >= 201103L + { + typedef std::unordered_set >, + test_compare >, + min_allocator + > C; + C c(7, + test_hash >(8) + ); + assert(c.bucket_count() == 7); + assert(c.hash_function() == test_hash >(8)); + assert(c.key_eq() == test_compare >()); + assert(c.get_allocator() == (min_allocator())); + assert(c.size() == 0); + assert(c.empty()); + assert(std::distance(c.begin(), c.end()) == 0); + assert(c.load_factor() == 0); + assert(c.max_load_factor() == 1); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.set/unord.set.cnstr/size_hash_equal.pass.cpp b/libcxx/test/containers/unord/unord.set/unord.set.cnstr/size_hash_equal.pass.cpp index 380082cd7336..bd5e7545d363 100644 --- a/libcxx/test/containers/unord/unord.set/unord.set.cnstr/size_hash_equal.pass.cpp +++ b/libcxx/test/containers/unord/unord.set/unord.set.cnstr/size_hash_equal.pass.cpp @@ -22,6 +22,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -45,4 +46,26 @@ int main() assert(c.load_factor() == 0); assert(c.max_load_factor() == 1); } +#if __cplusplus >= 201103L + { + typedef std::unordered_set >, + test_compare >, + min_allocator + > C; + C c(7, + test_hash >(8), + test_compare >(9) + ); + assert(c.bucket_count() == 7); + assert(c.hash_function() == test_hash >(8)); + assert(c.key_eq() == test_compare >(9)); + assert(c.get_allocator() == (min_allocator())); + assert(c.size() == 0); + assert(c.empty()); + assert(std::distance(c.begin(), c.end()) == 0); + assert(c.load_factor() == 0); + assert(c.max_load_factor() == 1); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.set/unord.set.cnstr/size_hash_equal_allocator.pass.cpp b/libcxx/test/containers/unord/unord.set/unord.set.cnstr/size_hash_equal_allocator.pass.cpp index b5666878ecb5..e3378ce856b1 100644 --- a/libcxx/test/containers/unord/unord.set/unord.set.cnstr/size_hash_equal_allocator.pass.cpp +++ b/libcxx/test/containers/unord/unord.set/unord.set.cnstr/size_hash_equal_allocator.pass.cpp @@ -22,6 +22,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -34,7 +35,7 @@ int main() C c(7, test_hash >(8), test_compare >(9), - test_allocator >(10) + test_allocator(10) ); assert(c.bucket_count() == 7); assert(c.hash_function() == test_hash >(8)); @@ -46,4 +47,27 @@ int main() assert(c.load_factor() == 0); assert(c.max_load_factor() == 1); } +#if __cplusplus >= 201103L + { + typedef std::unordered_set >, + test_compare >, + min_allocator + > C; + C c(7, + test_hash >(8), + test_compare >(9), + min_allocator() + ); + assert(c.bucket_count() == 7); + assert(c.hash_function() == test_hash >(8)); + assert(c.key_eq() == test_compare >(9)); + assert(c.get_allocator() == (min_allocator())); + assert(c.size() == 0); + assert(c.empty()); + assert(std::distance(c.begin(), c.end()) == 0); + assert(c.load_factor() == 0); + assert(c.max_load_factor() == 1); + } +#endif } diff --git a/libcxx/test/containers/unord/unord.set/unord.set.swap/swap_non_member.pass.cpp b/libcxx/test/containers/unord/unord.set/unord.set.swap/swap_non_member.pass.cpp index ffe102d2b568..57899aeffbde 100644 --- a/libcxx/test/containers/unord/unord.set/unord.set.swap/swap_non_member.pass.cpp +++ b/libcxx/test/containers/unord/unord.set/unord.set.swap/swap_non_member.pass.cpp @@ -21,6 +21,7 @@ #include "../../../test_compare.h" #include "../../../test_hash.h" #include "../../../test_allocator.h" +#include "../../../min_allocator.h" int main() { @@ -385,4 +386,186 @@ int main() assert(std::distance(c2.cbegin(), c2.cend()) == c2.size()); assert(c2.max_load_factor() == 1); } +#if __cplusplus >= 201103L + { + typedef test_hash > Hash; + typedef test_compare > Compare; + typedef min_allocator Alloc; + typedef std::unordered_set C; + typedef int P; + C c1(0, Hash(1), Compare(1), Alloc()); + C c2(0, Hash(2), Compare(2), Alloc()); + c2.max_load_factor(2); + swap(c1, c2); + + assert(c1.bucket_count() == 0); + assert(c1.size() == 0); + assert(c1.hash_function() == Hash(2)); + assert(c1.key_eq() == Compare(2)); + assert(c1.get_allocator() == Alloc()); + assert(std::distance(c1.begin(), c1.end()) == c1.size()); + assert(std::distance(c1.cbegin(), c1.cend()) == c1.size()); + assert(c1.max_load_factor() == 2); + + assert(c2.bucket_count() == 0); + assert(c2.size() == 0); + assert(c2.hash_function() == Hash(1)); + assert(c2.key_eq() == Compare(1)); + assert(c2.get_allocator() == Alloc()); + assert(std::distance(c2.begin(), c2.end()) == c2.size()); + assert(std::distance(c2.cbegin(), c2.cend()) == c2.size()); + assert(c2.max_load_factor() == 1); + } + { + typedef test_hash > Hash; + typedef test_compare > Compare; + typedef min_allocator Alloc; + typedef std::unordered_set C; + typedef int P; + P a2[] = + { + P(10), + P(20), + P(30), + P(40), + P(50), + P(60), + P(70), + P(80) + }; + C c1(0, Hash(1), Compare(1), Alloc()); + C c2(std::begin(a2), std::end(a2), 0, Hash(2), Compare(2), Alloc()); + c2.max_load_factor(2); + swap(c1, c2); + + assert(c1.bucket_count() >= 11); + assert(c1.size() == 8); + assert(*c1.find(10) == 10); + assert(*c1.find(20) == 20); + assert(*c1.find(30) == 30); + assert(*c1.find(40) == 40); + assert(*c1.find(50) == 50); + assert(*c1.find(60) == 60); + assert(*c1.find(70) == 70); + assert(*c1.find(80) == 80); + assert(c1.hash_function() == Hash(2)); + assert(c1.key_eq() == Compare(2)); + assert(c1.get_allocator() == Alloc()); + assert(std::distance(c1.begin(), c1.end()) == c1.size()); + assert(std::distance(c1.cbegin(), c1.cend()) == c1.size()); + assert(c1.max_load_factor() == 2); + + assert(c2.bucket_count() == 0); + assert(c2.size() == 0); + assert(c2.hash_function() == Hash(1)); + assert(c2.key_eq() == Compare(1)); + assert(c2.get_allocator() == Alloc()); + assert(std::distance(c2.begin(), c2.end()) == c2.size()); + assert(std::distance(c2.cbegin(), c2.cend()) == c2.size()); + assert(c2.max_load_factor() == 1); + } + { + typedef test_hash > Hash; + typedef test_compare > Compare; + typedef min_allocator Alloc; + typedef std::unordered_set C; + typedef int P; + P a1[] = + { + P(1), + P(2), + P(3), + P(4), + P(1), + P(2) + }; + C c1(std::begin(a1), std::end(a1), 0, Hash(1), Compare(1), Alloc()); + C c2(0, Hash(2), Compare(2), Alloc()); + c2.max_load_factor(2); + swap(c1, c2); + + assert(c1.bucket_count() == 0); + assert(c1.size() == 0); + assert(c1.hash_function() == Hash(2)); + assert(c1.key_eq() == Compare(2)); + assert(c1.get_allocator() == Alloc()); + assert(std::distance(c1.begin(), c1.end()) == c1.size()); + assert(std::distance(c1.cbegin(), c1.cend()) == c1.size()); + assert(c1.max_load_factor() == 2); + + assert(c2.bucket_count() >= 5); + assert(c2.size() == 4); + assert(c2.count(1) == 1); + assert(c2.count(2) == 1); + assert(c2.count(3) == 1); + assert(c2.count(4) == 1); + assert(c2.hash_function() == Hash(1)); + assert(c2.key_eq() == Compare(1)); + assert(c2.get_allocator() == Alloc()); + assert(std::distance(c2.begin(), c2.end()) == c2.size()); + assert(std::distance(c2.cbegin(), c2.cend()) == c2.size()); + assert(c2.max_load_factor() == 1); + } + { + typedef test_hash > Hash; + typedef test_compare > Compare; + typedef min_allocator Alloc; + typedef std::unordered_set C; + typedef int P; + P a1[] = + { + P(1), + P(2), + P(3), + P(4), + P(1), + P(2) + }; + P a2[] = + { + P(10), + P(20), + P(30), + P(40), + P(50), + P(60), + P(70), + P(80) + }; + C c1(std::begin(a1), std::end(a1), 0, Hash(1), Compare(1), Alloc()); + C c2(std::begin(a2), std::end(a2), 0, Hash(2), Compare(2), Alloc()); + c2.max_load_factor(2); + swap(c1, c2); + + assert(c1.bucket_count() >= 11); + assert(c1.size() == 8); + assert(*c1.find(10) == 10); + assert(*c1.find(20) == 20); + assert(*c1.find(30) == 30); + assert(*c1.find(40) == 40); + assert(*c1.find(50) == 50); + assert(*c1.find(60) == 60); + assert(*c1.find(70) == 70); + assert(*c1.find(80) == 80); + assert(c1.hash_function() == Hash(2)); + assert(c1.key_eq() == Compare(2)); + assert(c1.get_allocator() == Alloc()); + assert(std::distance(c1.begin(), c1.end()) == c1.size()); + assert(std::distance(c1.cbegin(), c1.cend()) == c1.size()); + assert(c1.max_load_factor() == 2); + + assert(c2.bucket_count() >= 5); + assert(c2.size() == 4); + assert(c2.count(1) == 1); + assert(c2.count(2) == 1); + assert(c2.count(3) == 1); + assert(c2.count(4) == 1); + assert(c2.hash_function() == Hash(1)); + assert(c2.key_eq() == Compare(1)); + assert(c2.get_allocator() == Alloc()); + assert(std::distance(c2.begin(), c2.end()) == c2.size()); + assert(std::distance(c2.cbegin(), c2.cend()) == c2.size()); + assert(c2.max_load_factor() == 1); + } +#endif } diff --git a/libcxx/test/testit b/libcxx/test/testit index f137745d1fa2..a7423645d5af 100755 --- a/libcxx/test/testit +++ b/libcxx/test/testit @@ -38,7 +38,7 @@ fi if [ -z "$OPTIONS" ] then - OPTIONS="-std=c++0x -stdlib=libc++" + OPTIONS="-std=c++11 -stdlib=libc++" fi OPTIONS="$OPTIONS -I$LIBCXX_ROOT/test/support"