#ifndef _GLIBCXX_DEBUG_UNORDERED_SET
#define _GLIBCXX_DEBUG_UNORDERED_SET 1
-#ifdef __GXX_EXPERIMENTAL_CXX0X__
-# include <unordered_set>
-#else
+#ifndef __GXX_EXPERIMENTAL_CXX0X__
# include <bits/c++0x_warning.h>
-#endif
+#else
+# include <unordered_set>
#include <debug/safe_sequence.h>
#include <debug/safe_iterator.h>
-#include <initializer_list>
namespace std
{
typedef _GLIBCXX_STD_D::unordered_set<_Value, _Hash,
_Pred, _Alloc> _Base;
typedef __gnu_debug::_Safe_sequence<unordered_set> _Safe_base;
+ typedef typename _Base::const_iterator _Base_const_iterator;
+ typedef typename _Base::iterator _Base_iterator;
+ typedef __gnu_debug::_Equal_to<_Base_const_iterator> _Equal;
public:
typedef typename _Base::size_type size_type;
typedef typename _Base::key_type key_type;
typedef typename _Base::value_type value_type;
- typedef __gnu_debug::_Safe_iterator<typename _Base::iterator,
+ typedef __gnu_debug::_Safe_iterator<_Base_iterator,
unordered_set> iterator;
- typedef __gnu_debug::_Safe_iterator<typename _Base::const_iterator,
+ typedef __gnu_debug::_Safe_iterator<_Base_const_iterator,
unordered_set> const_iterator;
explicit
: _Base(__n, __hf, __eql, __a) { }
template<typename _InputIterator>
- unordered_set(_InputIterator __f, _InputIterator __l,
- size_type __n = 10,
+ unordered_set(_InputIterator __first, _InputIterator __last,
+ size_type __n = 0,
const hasher& __hf = hasher(),
const key_equal& __eql = key_equal(),
const allocator_type& __a = allocator_type())
- : _Base(__gnu_debug::__check_valid_range(__f, __l), __l, __n,
+ : _Base(__gnu_debug::__base(__gnu_debug::__check_valid_range(__first,
+ __last)),
+ __gnu_debug::__base(__last), __n,
__hf, __eql, __a), _Safe_base() { }
unordered_set(const unordered_set& __x)
: _Base(__x), _Safe_base() { }
unordered_set(unordered_set&& __x)
- : _Base(std::forward<unordered_set>(__x)), _Safe_base() { }
+ : _Base(std::move(__x)), _Safe_base() { }
unordered_set(initializer_list<value_type> __l,
- size_type __n = 10,
+ size_type __n = 0,
const hasher& __hf = hasher(),
const key_equal& __eql = key_equal(),
const allocator_type& __a = allocator_type())
std::pair<iterator, bool>
insert(const value_type& __obj)
{
- typedef std::pair<typename _Base::iterator, bool> __pair_type;
+ typedef std::pair<_Base_iterator, bool> __pair_type;
__pair_type __res = _Base::insert(__obj);
return std::make_pair(iterator(__res.first, this), __res.second);
}
iterator
- insert(const_iterator, const value_type& __obj)
+ insert(const_iterator __hint, const value_type& __obj)
+ {
+ __glibcxx_check_insert(__hint);
+ return iterator(_Base::insert(__hint.base(), __obj), this);
+ }
+
+ std::pair<iterator, bool>
+ insert(value_type&& __obj)
{
typedef std::pair<typename _Base::iterator, bool> __pair_type;
- __pair_type __res = _Base::insert(__obj);
- return iterator(__res.first, this);
+ __pair_type __res = _Base::insert(std::move(__obj));
+ return std::make_pair(iterator(__res.first, this), __res.second);
+ }
+
+ iterator
+ insert(const_iterator __hint, value_type&& __obj)
+ {
+ __glibcxx_check_insert(__hint);
+ return iterator(_Base::insert(__hint.base(), std::move(__obj)), this);
}
void
insert(_InputIterator __first, _InputIterator __last)
{
__glibcxx_check_valid_range(__first, __last);
- _Base::insert(__first, __last);
+ _Base::insert(__gnu_debug::__base(__first),
+ __gnu_debug::__base(__last));
}
iterator
std::pair<iterator, iterator>
equal_range(const key_type& __key)
{
- typedef typename _Base::iterator _Base_iterator;
typedef std::pair<_Base_iterator, _Base_iterator> __pair_type;
__pair_type __res = _Base::equal_range(__key);
return std::make_pair(iterator(__res.first, this),
std::pair<const_iterator, const_iterator>
equal_range(const key_type& __key) const
{
- typedef typename _Base::const_iterator _Base_iterator;
- typedef std::pair<_Base_iterator, _Base_iterator> __pair_type;
- __pair_type __res = _Base::equal_range(__key);
+ std::pair<_Base_const_iterator, _Base_const_iterator>
+ __res = _Base::equal_range(__key);
return std::make_pair(const_iterator(__res.first, this),
const_iterator(__res.second, this));
}
erase(const key_type& __key)
{
size_type __ret(0);
- iterator __victim(_Base::find(__key), this);
- if (__victim != end())
+ _Base_iterator __victim(_Base::find(__key));
+ if (__victim != _Base::end())
{
- this->erase(__victim);
+ this->_M_invalidate_if(_Equal(__victim));
+ _Base::erase(__victim);
__ret = 1;
}
return __ret;
erase(const_iterator __it)
{
__glibcxx_check_erase(__it);
- __it._M_invalidate();
+ this->_M_invalidate_if(_Equal(__it.base()));
return iterator(_Base::erase(__it.base()), this);
}
erase(const_iterator __first, const_iterator __last)
{
__glibcxx_check_erase_range(__first, __last);
- for (const_iterator __tmp = __first; __tmp != __last;)
- {
- const_iterator __victim = __tmp++;
- __victim._M_invalidate();
- }
+ for (_Base_const_iterator __tmp = __first.base();
+ __tmp != __last.base(); ++__tmp)
+ {
+ _GLIBCXX_DEBUG_VERIFY(__tmp != _Base::end(),
+ _M_message(__gnu_debug::__msg_valid_range)
+ ._M_iterator(__first, "first")
+ ._M_iterator(__last, "last"));
+ this->_M_invalidate_if(_Equal(__tmp));
+ }
return iterator(_Base::erase(__first.base(),
__last.base()), this);
}
void
_M_invalidate_all()
{
- typedef typename _Base::const_iterator _Base_const_iterator;
typedef __gnu_debug::_Not_equal_to<_Base_const_iterator> _Not_equal;
- this->_M_invalidate_if(_Not_equal(_M_base().end()));
+ this->_M_invalidate_if(_Not_equal(_Base::end()));
}
};
unordered_set<_Value, _Hash, _Pred, _Alloc>& __y)
{ __x.swap(__y); }
+ template<typename _Value, typename _Hash, typename _Pred, typename _Alloc>
+ inline bool
+ operator==(const unordered_set<_Value, _Hash, _Pred, _Alloc>& __x,
+ const unordered_set<_Value, _Hash, _Pred, _Alloc>& __y)
+ { return __x._M_equal(__y); }
+
+ template<typename _Value, typename _Hash, typename _Pred, typename _Alloc>
+ inline bool
+ operator!=(const unordered_set<_Value, _Hash, _Pred, _Alloc>& __x,
+ const unordered_set<_Value, _Hash, _Pred, _Alloc>& __y)
+ { return !(__x == __y); }
+
/// Class std::unordered_multiset with safety/checking/debug instrumentation.
template<typename _Value,
typedef _GLIBCXX_STD_D::unordered_multiset<_Value, _Hash,
_Pred, _Alloc> _Base;
typedef __gnu_debug::_Safe_sequence<unordered_multiset> _Safe_base;
+ typedef typename _Base::const_iterator _Base_const_iterator;
+ typedef typename _Base::iterator _Base_iterator;
+ typedef __gnu_debug::_Equal_to<_Base_const_iterator> _Equal;
public:
typedef typename _Base::size_type size_type;
typedef typename _Base::key_type key_type;
typedef typename _Base::value_type value_type;
- typedef __gnu_debug::_Safe_iterator<typename _Base::iterator,
+ typedef __gnu_debug::_Safe_iterator<_Base_iterator,
unordered_multiset> iterator;
- typedef __gnu_debug::_Safe_iterator<typename _Base::const_iterator,
+ typedef __gnu_debug::_Safe_iterator<_Base_const_iterator,
unordered_multiset> const_iterator;
explicit
: _Base(__n, __hf, __eql, __a) { }
template<typename _InputIterator>
- unordered_multiset(_InputIterator __f, _InputIterator __l,
- size_type __n = 10,
+ unordered_multiset(_InputIterator __first, _InputIterator __last,
+ size_type __n = 0,
const hasher& __hf = hasher(),
const key_equal& __eql = key_equal(),
const allocator_type& __a = allocator_type())
- : _Base(__gnu_debug::__check_valid_range(__f, __l), __l, __n,
+ : _Base(__gnu_debug::__base(__gnu_debug::__check_valid_range(__first,
+ __last)),
+ __gnu_debug::__base(__last), __n,
__hf, __eql, __a), _Safe_base() { }
unordered_multiset(const unordered_multiset& __x)
: _Base(__x), _Safe_base() { }
unordered_multiset(unordered_multiset&& __x)
- : _Base(std::forward<unordered_multiset>(__x)), _Safe_base() { }
+ : _Base(std::move(__x)), _Safe_base() { }
unordered_multiset(initializer_list<value_type> __l,
- size_type __n = 10,
+ size_type __n = 0,
const hasher& __hf = hasher(),
const key_equal& __eql = key_equal(),
const allocator_type& __a = allocator_type())
{ return iterator(_Base::insert(__obj), this); }
iterator
- insert(const_iterator, const value_type& __obj)
- { return iterator(_Base::insert(__obj), this); }
+ insert(const_iterator __hint, const value_type& __obj)
+ {
+ __glibcxx_check_insert(__hint);
+ return iterator(_Base::insert(__hint.base(), __obj), this);
+ }
+
+ iterator
+ insert(value_type&& __obj)
+ { return iterator(_Base::insert(std::move(__obj)), this); }
+
+ iterator
+ insert(const_iterator __hint, value_type&& __obj)
+ {
+ __glibcxx_check_insert(__hint);
+ return iterator(_Base::insert(__hint.base(), std::move(__obj)), this);
+ }
void
insert(std::initializer_list<value_type> __l)
insert(_InputIterator __first, _InputIterator __last)
{
__glibcxx_check_valid_range(__first, __last);
- _Base::insert(__first, __last);
+ _Base::insert(__gnu_debug::__base(__first),
+ __gnu_debug::__base(__last));
}
iterator
std::pair<iterator, iterator>
equal_range(const key_type& __key)
{
- typedef typename _Base::iterator _Base_iterator;
typedef std::pair<_Base_iterator, _Base_iterator> __pair_type;
__pair_type __res = _Base::equal_range(__key);
return std::make_pair(iterator(__res.first, this),
std::pair<const_iterator, const_iterator>
equal_range(const key_type& __key) const
{
- typedef typename _Base::const_iterator _Base_iterator;
- typedef std::pair<_Base_iterator, _Base_iterator> __pair_type;
- __pair_type __res = _Base::equal_range(__key);
+ std::pair<_Base_const_iterator, _Base_const_iterator>
+ __res = _Base::equal_range(__key);
return std::make_pair(const_iterator(__res.first, this),
const_iterator(__res.second, this));
}
erase(const key_type& __key)
{
size_type __ret(0);
- iterator __victim(_Base::find(__key), this);
- if (__victim != end())
+ std::pair<_Base_iterator, _Base_iterator> __pair =
+ _Base::equal_range(__key);
+ for (_Base_iterator __victim = __pair.first; __victim != __pair.second;)
{
- this->erase(__victim);
- __ret = 1;
+ this->_M_invalidate_if(_Equal(__victim));
+ _Base::erase(__victim++);
+ ++__ret;
}
return __ret;
}
erase(const_iterator __it)
{
__glibcxx_check_erase(__it);
- __it._M_invalidate();
+ this->_M_invalidate_if(_Equal(__it.base()));
return iterator(_Base::erase(__it.base()), this);
}
erase(const_iterator __first, const_iterator __last)
{
__glibcxx_check_erase_range(__first, __last);
- for (const_iterator __tmp = __first; __tmp != __last;)
- {
- const_iterator __victim = __tmp++;
- __victim._M_invalidate();
- }
+ for (_Base_const_iterator __tmp = __first.base();
+ __tmp != __last.base(); ++__tmp)
+ {
+ _GLIBCXX_DEBUG_VERIFY(__tmp != _Base::end(),
+ _M_message(__gnu_debug::__msg_valid_range)
+ ._M_iterator(__first, "first")
+ ._M_iterator(__last, "last"));
+ this->_M_invalidate_if(_Equal(__tmp));
+ }
return iterator(_Base::erase(__first.base(),
__last.base()), this);
}
void
_M_invalidate_all()
{
- typedef typename _Base::const_iterator _Base_const_iterator;
typedef __gnu_debug::_Not_equal_to<_Base_const_iterator> _Not_equal;
- this->_M_invalidate_if(_Not_equal(_M_base().end()));
+ this->_M_invalidate_if(_Not_equal(_Base::end()));
}
};
unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __y)
{ __x.swap(__y); }
+ template<typename _Value, typename _Hash, typename _Pred, typename _Alloc>
+ inline bool
+ operator==(const unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __x,
+ const unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __y)
+ { return __x._M_equal(__y); }
+
+ template<typename _Value, typename _Hash, typename _Pred, typename _Alloc>
+ inline bool
+ operator!=(const unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __x,
+ const unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __y)
+ { return !(__x == __y); }
+
} // namespace __debug
} // namespace std
+#endif // __GXX_EXPERIMENTAL_CXX0X__
+
#endif