Commit 8bd22a3c by Benjamin Kosnik

[multiple changes]


2004-03-25  Gawain Bolton  <gp.bolton@computer.org>

	* include/bits/stl_tree.h (_Rb_tree_impl): Add _Node_allocator
	default argument in constructors.
	(_Rb_tree::_M_empty_initialize): Remove.

2004-03-25  Benjamin Kosnik  <bkoz@redhat.com>

	* testsuite/23_containers/map/operators/1_neg.cc: Adjust line numbers.
	* testsuite/23_containers/set/operators/1_neg.cc: Same.

2004-03-25  Dhruv Matani  <dhruvbird@gmx.net>

	* include/bits/cpp_type_traits.h: Changed __is_pod
	completely. Now, it does not use any of the previous type_traits
	to detect the pod types, and it also detects function pointers as
	POD types.

	* include/bits/stl_tree.h: Introduced a new class _Rb_tree_impl,
	which encapsulates the internal implementation of an rb_tree. Made
	the allocator a base class of this class instead of the rb_tree,
	which was not conforming. This _Rb_tree_impl class is also
	specialized on whether the _Compare parameter is a POD type or
	not. If so, then it maintains the comparison function as a data
	member, otherwise it makes the _Compare parameter a base class of
	itself. Also, _M_key_compare is now a function instead of a data
	member, so that the above trick can work properly. Delegated the
	initialization of the other data members to this newly created
	class. Also, now other member functions of rb_tree must refer to
	_M_key_compare as _M_impl._M_key_compare(). The other data members
	(*) can be referenced to as _M_impl.(*), where
	(*) includes _M_header, and _M_node_count.

From-SVN: r79977
parent c18ab9a4
2004-03-25 Gawain Bolton <gp.bolton@computer.org>
* include/bits/stl_tree.h (_Rb_tree_impl): Add _Node_allocator
default argument in constructors.
(_Rb_tree::_M_empty_initialize): Remove.
2004-03-25 Benjamin Kosnik <bkoz@redhat.com>
* testsuite/23_containers/map/operators/1_neg.cc: Adjust line numbers.
* testsuite/23_containers/set/operators/1_neg.cc: Same.
2004-03-25 Dhruv Matani <dhruvbird@gmx.net>
* include/bits/cpp_type_traits.h: Changed __is_pod
completely. Now, it does not use any of the previous type_traits
to detect the pod types, and it also detects function pointers as
POD types.
* include/bits/stl_tree.h: Introduced a new class _Rb_tree_impl,
which encapsulates the internal implementation of an rb_tree. Made
the allocator a base class of this class instead of the rb_tree,
which was not conforming. This _Rb_tree_impl class is also
specialized on whether the _Compare parameter is a POD type or
not. If so, then it maintains the comparison function as a data
member, otherwise it makes the _Compare parameter a base class of
itself. Also, _M_key_compare is now a function instead of a data
member, so that the above trick can work properly. Delegated the
initialization of the other data members to this newly created
class. Also, now other member functions of rb_tree must refer to
_M_key_compare as _M_impl._M_key_compare(). The other data members
(*) can be referenced to as _M_impl.(*), where
(*) includes _M_header, and _M_node_count.
2004-03-25 Paolo Carlini <pcarlini@suse.de> 2004-03-25 Paolo Carlini <pcarlini@suse.de>
* include/ext/mt_allocator.h (__mt_alloc<>::tune): * include/ext/mt_allocator.h (__mt_alloc<>::tune):
......
...@@ -317,12 +317,27 @@ namespace std ...@@ -317,12 +317,27 @@ namespace std
// //
// For the immediate use, the following is a good approximation // For the immediate use, the following is a good approximation
// //
// NB: g++ can not compile these if declared within the class
// __is_pod itself.
namespace __gnu_internal
{
typedef char __one;
typedef char __two[2];
template <typename _Tp>
__one __test_type (int _Tp::*);
template <typename _Tp>
__two& __test_type (...);
}
template<typename _Tp> template<typename _Tp>
struct __is_pod struct __is_pod
{ {
enum enum
{ {
_M_type = __is_fundamental<_Tp>::_M_type _M_type = (sizeof(__gnu_internal::__test_type<_Tp>(0)) != sizeof(__gnu_internal::__one))
}; };
}; };
......
...@@ -63,33 +63,30 @@ ...@@ -63,33 +63,30 @@
#ifndef _TREE_H #ifndef _TREE_H
#define _TREE_H 1 #define _TREE_H 1
/*
Red-black tree class, designed for use in implementing STL
associative containers (set, multiset, map, and multimap). The
insertion and deletion algorithms are based on those in Cormen,
Leiserson, and Rivest, Introduction to Algorithms (MIT Press, 1990),
except that
(1) the header cell is maintained with links not only to the root
but also to the leftmost node of the tree, to enable constant time
begin(), and to the rightmost node of the tree, to enable linear time
performance when used with the generic set algorithms (set_union,
etc.);
(2) when a node being deleted has two children its successor node is
relinked into its place, rather than copied, so that the only
iterators invalidated are those referring to the deleted node.
*/
#include <bits/stl_algobase.h> #include <bits/stl_algobase.h>
#include <bits/allocator.h> #include <bits/allocator.h>
#include <bits/stl_construct.h> #include <bits/stl_construct.h>
#include <bits/stl_function.h> #include <bits/stl_function.h>
#include <bits/cpp_type_traits.h>
namespace std namespace std
{ {
// Red-black tree class, designed for use in implementing STL
// associative containers (set, multiset, map, and multimap). The
// insertion and deletion algorithms are based on those in Cormen,
// Leiserson, and Rivest, Introduction to Algorithms (MIT Press,
// 1990), except that
//
// (1) the header cell is maintained with links not only to the root
// but also to the leftmost node of the tree, to enable constant
// time begin(), and to the rightmost node of the tree, to enable
// linear time performance when used with the generic set algorithms
// (set_union, etc.)
//
// (2) when a node being deleted has two children its successor node
// is relinked into its place, rather than copied, so that the only
// iterators invalidated are those referring to the deleted node.
enum _Rb_tree_color { _S_red = false, _S_black = true }; enum _Rb_tree_color { _S_red = false, _S_black = true };
struct _Rb_tree_node_base struct _Rb_tree_node_base
...@@ -164,10 +161,10 @@ namespace std ...@@ -164,10 +161,10 @@ namespace std
typedef _Rb_tree_node_base::_Base_ptr _Base_ptr; typedef _Rb_tree_node_base::_Base_ptr _Base_ptr;
typedef _Rb_tree_node<_Tp>* _Link_type; typedef _Rb_tree_node<_Tp>* _Link_type;
_Rb_tree_iterator() {} _Rb_tree_iterator() { }
_Rb_tree_iterator(_Link_type __x) _Rb_tree_iterator(_Link_type __x)
: _M_node(__x) {} : _M_node(__x) { }
reference reference
operator*() const operator*() const
...@@ -234,13 +231,13 @@ namespace std ...@@ -234,13 +231,13 @@ namespace std
typedef _Rb_tree_node_base::_Const_Base_ptr _Base_ptr; typedef _Rb_tree_node_base::_Const_Base_ptr _Base_ptr;
typedef const _Rb_tree_node<_Tp>* _Link_type; typedef const _Rb_tree_node<_Tp>* _Link_type;
_Rb_tree_const_iterator() {} _Rb_tree_const_iterator() { }
_Rb_tree_const_iterator(_Link_type __x) _Rb_tree_const_iterator(_Link_type __x)
: _M_node(__x) {} : _M_node(__x) { }
_Rb_tree_const_iterator(const iterator& __it) _Rb_tree_const_iterator(const iterator& __it)
: _M_node(__it._M_node) {} : _M_node(__it._M_node) { }
reference reference
operator*() const operator*() const
...@@ -312,20 +309,19 @@ namespace std ...@@ -312,20 +309,19 @@ namespace std
_Rb_tree_node_base*& __root); _Rb_tree_node_base*& __root);
void void
_Rb_tree_insert_and_rebalance(const bool __insert_left, _Rb_tree_insert_and_rebalance(const bool __insert_left,
_Rb_tree_node_base* __x, _Rb_tree_node_base* __x,
_Rb_tree_node_base* __p, _Rb_tree_node_base* __p,
_Rb_tree_node_base& __header); _Rb_tree_node_base& __header);
_Rb_tree_node_base* _Rb_tree_node_base*
_Rb_tree_rebalance_for_erase(_Rb_tree_node_base* const __z, _Rb_tree_rebalance_for_erase(_Rb_tree_node_base* const __z,
_Rb_tree_node_base& __header); _Rb_tree_node_base& __header);
template<typename _Key, typename _Val, typename _KeyOfValue, template<typename _Key, typename _Val, typename _KeyOfValue,
typename _Compare, typename _Alloc = allocator<_Val> > typename _Compare, typename _Alloc = allocator<_Val> >
class _Rb_tree class _Rb_tree
: protected _Alloc::template rebind<_Rb_tree_node<_Val> >::other
{ {
typedef typename _Alloc::template rebind<_Rb_tree_node<_Val> >::other typedef typename _Alloc::template rebind<_Rb_tree_node<_Val> >::other
_Node_allocator; _Node_allocator;
...@@ -346,19 +342,20 @@ namespace std ...@@ -346,19 +342,20 @@ namespace std
typedef const _Rb_tree_node* _Const_Link_type; typedef const _Rb_tree_node* _Const_Link_type;
typedef size_t size_type; typedef size_t size_type;
typedef ptrdiff_t difference_type; typedef ptrdiff_t difference_type;
typedef _Alloc allocator_type; typedef _Alloc allocator_type;
allocator_type get_allocator() const
{ return *static_cast<const _Node_allocator*>(this); } allocator_type
get_allocator() const
{ return *static_cast<const _Node_allocator*>(&this->_M_impl); }
protected: protected:
_Rb_tree_node* _Rb_tree_node*
_M_get_node() _M_get_node()
{ return _Node_allocator::allocate(1); } { return _M_impl._Node_allocator::allocate(1); }
void void
_M_put_node(_Rb_tree_node* __p) _M_put_node(_Rb_tree_node* __p)
{ _Node_allocator::deallocate(__p, 1); } { _M_impl._Node_allocator::deallocate(__p, 1); }
_Link_type _Link_type
_M_create_node(const value_type& __x) _M_create_node(const value_type& __x)
...@@ -392,50 +389,87 @@ namespace std ...@@ -392,50 +389,87 @@ namespace std
} }
protected: protected:
_Rb_tree_node_base _M_header; template<typename _Key_compare,
size_type _M_node_count; // keeps track of size of tree bool _Is_pod_comparator = std::__is_pod<_Key_compare>::_M_type>
_Compare _M_key_compare; struct _Rb_tree_impl : public _Node_allocator
{
_Key_compare _M_key_compare;
_Rb_tree_node_base _M_header;
size_type _M_node_count; // Keeps track of size of tree.
_Rb_tree_impl(const _Node_allocator& __a = _Node_allocator(),
const _Key_compare& __comp = _Key_compare())
: _Node_allocator(__a), _M_node_count(0), _M_key_compare(__comp)
{
this->_M_header._M_color = _S_red;
this->_M_header._M_parent = 0;
this->_M_header._M_left = &this->_M_header;
this->_M_header._M_right = &this->_M_header;
}
};
// Specialization for _Comparison types that are not capable of
// being base classes / super classes.
template<typename _Key_compare>
struct _Rb_tree_impl<_Key_compare, true> : public _Node_allocator
{
_Key_compare _M_key_compare;
_Rb_tree_node_base _M_header;
size_type _M_node_count; // Keeps track of size of tree.
_Rb_tree_impl(const _Node_allocator& __a = _Node_allocator(),
const _Key_compare& __comp = _Key_compare())
: _Node_allocator(__a), _M_key_compare(__comp), _M_node_count(0)
{
this->_M_header._M_color = _S_red;
this->_M_header._M_parent = 0;
this->_M_header._M_left = &this->_M_header;
this->_M_header._M_right = &this->_M_header;
}
};
_Rb_tree_impl<_Compare> _M_impl;
protected: protected:
_Base_ptr& _Base_ptr&
_M_root() _M_root()
{ return this->_M_header._M_parent; } { return this->_M_impl._M_header._M_parent; }
_Const_Base_ptr _Const_Base_ptr
_M_root() const _M_root() const
{ return this->_M_header._M_parent; } { return this->_M_impl._M_header._M_parent; }
_Base_ptr& _Base_ptr&
_M_leftmost() _M_leftmost()
{ return this->_M_header._M_left; } { return this->_M_impl._M_header._M_left; }
_Const_Base_ptr _Const_Base_ptr
_M_leftmost() const _M_leftmost() const
{ return this->_M_header._M_left; } { return this->_M_impl._M_header._M_left; }
_Base_ptr& _Base_ptr&
_M_rightmost() _M_rightmost()
{ return this->_M_header._M_right; } { return this->_M_impl._M_header._M_right; }
_Const_Base_ptr _Const_Base_ptr
_M_rightmost() const _M_rightmost() const
{ return this->_M_header._M_right; } { return this->_M_impl._M_header._M_right; }
_Link_type _Link_type
_M_begin() _M_begin()
{ return static_cast<_Link_type>(this->_M_header._M_parent); } { return static_cast<_Link_type>(this->_M_impl._M_header._M_parent); }
_Const_Link_type _Const_Link_type
_M_begin() const _M_begin() const
{ return static_cast<_Const_Link_type>(this->_M_header._M_parent); } { return static_cast<_Const_Link_type>(this->_M_impl._M_header._M_parent); }
_Link_type _Link_type
_M_end() _M_end()
{ return static_cast<_Link_type>(&this->_M_header); } { return static_cast<_Link_type>(&this->_M_impl._M_header); }
_Const_Link_type _Const_Link_type
_M_end() const _M_end() const
{ return static_cast<_Const_Link_type>(&this->_M_header); } { return static_cast<_Const_Link_type>(&this->_M_impl._M_header); }
static const_reference static const_reference
_S_value(_Const_Link_type __x) _S_value(_Const_Link_type __x)
...@@ -505,38 +539,26 @@ namespace std ...@@ -505,38 +539,26 @@ namespace std
public: public:
// allocation/deallocation // allocation/deallocation
_Rb_tree() _Rb_tree()
: _Node_allocator(allocator_type()), { }
_M_node_count(0),
_M_key_compare()
{ _M_empty_initialize(); }
_Rb_tree(const _Compare& __comp) _Rb_tree(const _Compare& __comp)
: _Node_allocator(allocator_type()), : _M_impl(allocator_type(), __comp)
_M_node_count(0), { }
_M_key_compare(__comp)
{ _M_empty_initialize(); }
_Rb_tree(const _Compare& __comp, const allocator_type& __a) _Rb_tree(const _Compare& __comp, const allocator_type& __a)
: _Node_allocator(__a), : _M_impl(__a, __comp)
_M_node_count(0), { }
_M_key_compare(__comp)
{ _M_empty_initialize(); }
_Rb_tree(const _Rb_tree<_Key,_Val,_KeyOfValue,_Compare,_Alloc>& __x) _Rb_tree(const _Rb_tree<_Key,_Val,_KeyOfValue,_Compare,_Alloc>& __x)
: _Node_allocator(__x.get_allocator()), : _M_impl(__x.get_allocator(), __x._M_impl._M_key_compare)
_M_node_count(0),
_M_key_compare(__x._M_key_compare)
{ {
if (__x._M_root() == 0) if (__x._M_root() != 0)
_M_empty_initialize();
else
{ {
this->_M_header._M_color = _S_red;
_M_root() = _M_copy(__x._M_begin(), _M_end()); _M_root() = _M_copy(__x._M_begin(), _M_end());
_M_leftmost() = _S_minimum(_M_root()); _M_leftmost() = _S_minimum(_M_root());
_M_rightmost() = _S_maximum(_M_root()); _M_rightmost() = _S_maximum(_M_root());
_M_impl._M_node_count = __x._M_impl._M_node_count;
} }
_M_node_count = __x._M_node_count;
} }
~_Rb_tree() ~_Rb_tree()
...@@ -545,37 +567,26 @@ namespace std ...@@ -545,37 +567,26 @@ namespace std
_Rb_tree<_Key,_Val,_KeyOfValue,_Compare,_Alloc>& _Rb_tree<_Key,_Val,_KeyOfValue,_Compare,_Alloc>&
operator=(const _Rb_tree<_Key,_Val,_KeyOfValue,_Compare,_Alloc>& __x); operator=(const _Rb_tree<_Key,_Val,_KeyOfValue,_Compare,_Alloc>& __x);
private:
void _M_empty_initialize()
{
// Used to distinguish header from __root, in iterator.operator++.
this->_M_header._M_color = _S_red;
_M_root() = 0;
_M_leftmost() = _M_end();
_M_rightmost() = _M_end();
}
public:
// Accessors. // Accessors.
_Compare _Compare
key_comp() const key_comp() const
{ return _M_key_compare; } { return _M_impl._M_key_compare; }
iterator iterator
begin() begin()
{ return static_cast<_Link_type>(this->_M_header._M_left); } { return static_cast<_Link_type>(this->_M_impl._M_header._M_left); }
const_iterator const_iterator
begin() const begin() const
{ return static_cast<_Const_Link_type>(this->_M_header._M_left); } { return static_cast<_Const_Link_type>(this->_M_impl._M_header._M_left); }
iterator iterator
end() end()
{ return static_cast<_Link_type>(&this->_M_header); } { return static_cast<_Link_type>(&this->_M_impl._M_header); }
const_iterator const_iterator
end() const end() const
{ return static_cast<_Const_Link_type>(&this->_M_header); } { return static_cast<_Const_Link_type>(&this->_M_impl._M_header); }
reverse_iterator reverse_iterator
rbegin() rbegin()
...@@ -595,11 +606,11 @@ namespace std ...@@ -595,11 +606,11 @@ namespace std
bool bool
empty() const empty() const
{ return _M_node_count == 0; } { return _M_impl._M_node_count == 0; }
size_type size_type
size() const size() const
{ return _M_node_count; } { return _M_impl._M_node_count; }
size_type size_type
max_size() const max_size() const
...@@ -648,7 +659,7 @@ namespace std ...@@ -648,7 +659,7 @@ namespace std
_M_leftmost() = _M_end(); _M_leftmost() = _M_end();
_M_root() = 0; _M_root() = 0;
_M_rightmost() = _M_end(); _M_rightmost() = _M_end();
_M_node_count = 0; _M_impl._M_node_count = 0;
} }
// Set operations. // Set operations.
...@@ -700,7 +711,7 @@ namespace std ...@@ -700,7 +711,7 @@ namespace std
operator<(const _Rb_tree<_Key,_Val,_KeyOfValue,_Compare,_Alloc>& __x, operator<(const _Rb_tree<_Key,_Val,_KeyOfValue,_Compare,_Alloc>& __x,
const _Rb_tree<_Key,_Val,_KeyOfValue,_Compare,_Alloc>& __y) const _Rb_tree<_Key,_Val,_KeyOfValue,_Compare,_Alloc>& __y)
{ {
return lexicographical_compare(__x.begin(), __x.end(), return lexicographical_compare(__x.begin(), __x.end(),
__y.begin(), __y.end()); __y.begin(), __y.end());
} }
...@@ -749,13 +760,13 @@ namespace std ...@@ -749,13 +760,13 @@ namespace std
{ {
// Note that _Key may be a constant type. // Note that _Key may be a constant type.
clear(); clear();
_M_key_compare = __x._M_key_compare; _M_impl._M_key_compare = __x._M_impl._M_key_compare;
if (__x._M_root() != 0) if (__x._M_root() != 0)
{ {
_M_root() = _M_copy(__x._M_begin(), _M_end()); _M_root() = _M_copy(__x._M_begin(), _M_end());
_M_leftmost() = _S_minimum(_M_root()); _M_leftmost() = _S_minimum(_M_root());
_M_rightmost() = _S_maximum(_M_root()); _M_rightmost() = _S_maximum(_M_root());
_M_node_count = __x._M_node_count; _M_impl._M_node_count = __x._M_impl._M_node_count;
} }
} }
return *this; return *this;
...@@ -771,10 +782,12 @@ namespace std ...@@ -771,10 +782,12 @@ namespace std
bool __insert_left; bool __insert_left;
__insert_left = __x != 0 || __p == _M_end() __insert_left = __x != 0 || __p == _M_end()
|| _M_key_compare(_KeyOfValue()(__v), _S_key(__p)); || _M_impl._M_key_compare(_KeyOfValue()(__v),
_S_key(__p));
_Rb_tree_insert_and_rebalance(__insert_left, __z, __p, this->_M_header); _Rb_tree_insert_and_rebalance(__insert_left, __z, __p,
++_M_node_count; this->_M_impl._M_header);
++_M_impl._M_node_count;
return iterator(__z); return iterator(__z);
} }
...@@ -789,7 +802,7 @@ namespace std ...@@ -789,7 +802,7 @@ namespace std
while (__x != 0) while (__x != 0)
{ {
__y = __x; __y = __x;
__x = _M_key_compare(_KeyOfValue()(__v), _S_key(__x)) ? __x = _M_impl._M_key_compare(_KeyOfValue()(__v), _S_key(__x)) ?
_S_left(__x) : _S_right(__x); _S_left(__x) : _S_right(__x);
} }
return _M_insert(__x, __y, __v); return _M_insert(__x, __y, __v);
...@@ -836,8 +849,8 @@ namespace std ...@@ -836,8 +849,8 @@ namespace std
__t._M_root()->_M_parent = __t._M_end(); __t._M_root()->_M_parent = __t._M_end();
} }
// No need to swap header's color as it does not change. // No need to swap header's color as it does not change.
std::swap(this->_M_node_count, __t._M_node_count); std::swap(this->_M_impl._M_node_count, __t._M_impl._M_node_count);
std::swap(this->_M_key_compare, __t._M_key_compare); std::swap(this->_M_impl._M_key_compare, __t._M_impl._M_key_compare);
} }
template<typename _Key, typename _Val, typename _KeyOfValue, template<typename _Key, typename _Val, typename _KeyOfValue,
...@@ -853,7 +866,7 @@ namespace std ...@@ -853,7 +866,7 @@ namespace std
while (__x != 0) while (__x != 0)
{ {
__y = __x; __y = __x;
__comp = _M_key_compare(_KeyOfValue()(__v), _S_key(__x)); __comp = _M_impl._M_key_compare(_KeyOfValue()(__v), _S_key(__x));
__x = __comp ? _S_left(__x) : _S_right(__x); __x = __comp ? _S_left(__x) : _S_right(__x);
} }
iterator __j = iterator(__y); iterator __j = iterator(__y);
...@@ -862,7 +875,7 @@ namespace std ...@@ -862,7 +875,7 @@ namespace std
return pair<iterator,bool>(_M_insert(__x, __y, __v), true); return pair<iterator,bool>(_M_insert(__x, __y, __v), true);
else else
--__j; --__j;
if (_M_key_compare(_S_key(__j._M_node), _KeyOfValue()(__v))) if (_M_impl._M_key_compare(_S_key(__j._M_node), _KeyOfValue()(__v)))
return pair<iterator,bool>(_M_insert(__x, __y, __v), true); return pair<iterator,bool>(_M_insert(__x, __y, __v), true);
return pair<iterator,bool>(__j, false); return pair<iterator,bool>(__j, false);
} }
...@@ -877,16 +890,18 @@ namespace std ...@@ -877,16 +890,18 @@ namespace std
{ {
// begin() // begin()
if (size() > 0 if (size() > 0
&& _M_key_compare(_KeyOfValue()(__v), _S_key(__position._M_node))) && _M_impl._M_key_compare(_KeyOfValue()(__v),
_S_key(__position._M_node)))
return _M_insert(__position._M_node, __position._M_node, __v); return _M_insert(__position._M_node, __position._M_node, __v);
// first argument just needs to be non-null // First argument just needs to be non-null.
else else
return insert_unique(__v).first; return insert_unique(__v).first;
} }
else if (__position._M_node == _M_end()) else if (__position._M_node == _M_end())
{ {
// end() // end()
if (_M_key_compare(_S_key(_M_rightmost()), _KeyOfValue()(__v))) if (_M_impl._M_key_compare(_S_key(_M_rightmost()),
_KeyOfValue()(__v)))
return _M_insert(0, _M_rightmost(), __v); return _M_insert(0, _M_rightmost(), __v);
else else
return insert_unique(__v).first; return insert_unique(__v).first;
...@@ -895,14 +910,16 @@ namespace std ...@@ -895,14 +910,16 @@ namespace std
{ {
iterator __before = __position; iterator __before = __position;
--__before; --__before;
if (_M_key_compare(_S_key(__before._M_node), _KeyOfValue()(__v)) if (_M_impl._M_key_compare(_S_key(__before._M_node),
&& _M_key_compare(_KeyOfValue()(__v),_S_key(__position._M_node))) _KeyOfValue()(__v))
&& _M_impl._M_key_compare(_KeyOfValue()(__v),
_S_key(__position._M_node)))
{ {
if (_S_right(__before._M_node) == 0) if (_S_right(__before._M_node) == 0)
return _M_insert(0, __before._M_node, __v); return _M_insert(0, __before._M_node, __v);
else else
return _M_insert(__position._M_node, __position._M_node, __v); return _M_insert(__position._M_node, __position._M_node, __v);
// first argument just needs to be non-null // First argument just needs to be non-null.
} }
else else
return insert_unique(__v).first; return insert_unique(__v).first;
...@@ -919,8 +936,8 @@ namespace std ...@@ -919,8 +936,8 @@ namespace std
{ {
// begin() // begin()
if (size() > 0 if (size() > 0
&& !_M_key_compare(_S_key(__position._M_node), && !_M_impl._M_key_compare(_S_key(__position._M_node),
_KeyOfValue()(__v))) _KeyOfValue()(__v)))
return _M_insert(__position._M_node, __position._M_node, __v); return _M_insert(__position._M_node, __position._M_node, __v);
// first argument just needs to be non-null // first argument just needs to be non-null
else else
...@@ -929,7 +946,8 @@ namespace std ...@@ -929,7 +946,8 @@ namespace std
else if (__position._M_node == _M_end()) else if (__position._M_node == _M_end())
{ {
// end() // end()
if (!_M_key_compare(_KeyOfValue()(__v), _S_key(_M_rightmost()))) if (!_M_impl._M_key_compare(_KeyOfValue()(__v),
_S_key(_M_rightmost())))
return _M_insert(0, _M_rightmost(), __v); return _M_insert(0, _M_rightmost(), __v);
else else
return insert_equal(__v); return insert_equal(__v);
...@@ -938,15 +956,16 @@ namespace std ...@@ -938,15 +956,16 @@ namespace std
{ {
iterator __before = __position; iterator __before = __position;
--__before; --__before;
if (!_M_key_compare(_KeyOfValue()(__v), _S_key(__before._M_node)) if (!_M_impl._M_key_compare(_KeyOfValue()(__v),
&& !_M_key_compare(_S_key(__position._M_node), _S_key(__before._M_node))
_KeyOfValue()(__v))) && !_M_impl._M_key_compare(_S_key(__position._M_node),
_KeyOfValue()(__v)))
{ {
if (_S_right(__before._M_node) == 0) if (_S_right(__before._M_node) == 0)
return _M_insert(0, __before._M_node, __v); return _M_insert(0, __before._M_node, __v);
else else
return _M_insert(__position._M_node, __position._M_node, __v); return _M_insert(__position._M_node, __position._M_node, __v);
// first argument just needs to be non-null // First argument just needs to be non-null.
} }
else else
return insert_equal(__v); return insert_equal(__v);
...@@ -982,9 +1001,9 @@ namespace std ...@@ -982,9 +1001,9 @@ namespace std
{ {
_Link_type __y = _Link_type __y =
static_cast<_Link_type>(_Rb_tree_rebalance_for_erase(__position._M_node, static_cast<_Link_type>(_Rb_tree_rebalance_for_erase(__position._M_node,
this->_M_header)); this->_M_impl._M_header));
destroy_node(__y); destroy_node(__y);
--_M_node_count; --_M_impl._M_node_count;
} }
template<typename _Key, typename _Val, typename _KeyOfValue, template<typename _Key, typename _Val, typename _KeyOfValue,
...@@ -1080,14 +1099,14 @@ namespace std ...@@ -1080,14 +1099,14 @@ namespace std
_Link_type __y = _M_end(); // Last node which is not less than __k. _Link_type __y = _M_end(); // Last node which is not less than __k.
while (__x != 0) while (__x != 0)
if (!_M_key_compare(_S_key(__x), __k)) if (!_M_impl._M_key_compare(_S_key(__x), __k))
__y = __x, __x = _S_left(__x); __y = __x, __x = _S_left(__x);
else else
__x = _S_right(__x); __x = _S_right(__x);
iterator __j = iterator(__y); iterator __j = iterator(__y);
return (__j == end() || _M_key_compare(__k, _S_key(__j._M_node))) ? return (__j == end()
end() : __j; || _M_impl._M_key_compare(__k, _S_key(__j._M_node))) ? end() : __j;
} }
template<typename _Key, typename _Val, typename _KeyOfValue, template<typename _Key, typename _Val, typename _KeyOfValue,
...@@ -1101,14 +1120,14 @@ namespace std ...@@ -1101,14 +1120,14 @@ namespace std
while (__x != 0) while (__x != 0)
{ {
if (!_M_key_compare(_S_key(__x), __k)) if (!_M_impl._M_key_compare(_S_key(__x), __k))
__y = __x, __x = _S_left(__x); __y = __x, __x = _S_left(__x);
else else
__x = _S_right(__x); __x = _S_right(__x);
} }
const_iterator __j = const_iterator(__y); const_iterator __j = const_iterator(__y);
return (__j == end() || _M_key_compare(__k, _S_key(__j._M_node))) ? return (__j == end()
end() : __j; || _M_impl._M_key_compare(__k, _S_key(__j._M_node))) ? end() : __j;
} }
template<typename _Key, typename _Val, typename _KeyOfValue, template<typename _Key, typename _Val, typename _KeyOfValue,
...@@ -1132,7 +1151,7 @@ namespace std ...@@ -1132,7 +1151,7 @@ namespace std
_Link_type __y = _M_end(); // Last node which is not less than __k. _Link_type __y = _M_end(); // Last node which is not less than __k.
while (__x != 0) while (__x != 0)
if (!_M_key_compare(_S_key(__x), __k)) if (!_M_impl._M_key_compare(_S_key(__x), __k))
__y = __x, __x = _S_left(__x); __y = __x, __x = _S_left(__x);
else else
__x = _S_right(__x); __x = _S_right(__x);
...@@ -1150,7 +1169,7 @@ namespace std ...@@ -1150,7 +1169,7 @@ namespace std
_Const_Link_type __y = _M_end(); // Last node which is not less than __k. _Const_Link_type __y = _M_end(); // Last node which is not less than __k.
while (__x != 0) while (__x != 0)
if (!_M_key_compare(_S_key(__x), __k)) if (!_M_impl._M_key_compare(_S_key(__x), __k))
__y = __x, __x = _S_left(__x); __y = __x, __x = _S_left(__x);
else else
__x = _S_right(__x); __x = _S_right(__x);
...@@ -1168,7 +1187,7 @@ namespace std ...@@ -1168,7 +1187,7 @@ namespace std
_Link_type __y = _M_end(); // Last node which is greater than __k. _Link_type __y = _M_end(); // Last node which is greater than __k.
while (__x != 0) while (__x != 0)
if (_M_key_compare(__k, _S_key(__x))) if (_M_impl._M_key_compare(__k, _S_key(__x)))
__y = __x, __x = _S_left(__x); __y = __x, __x = _S_left(__x);
else else
__x = _S_right(__x); __x = _S_right(__x);
...@@ -1186,7 +1205,7 @@ namespace std ...@@ -1186,7 +1205,7 @@ namespace std
_Const_Link_type __y = _M_end(); // Last node which is greater than __k. _Const_Link_type __y = _M_end(); // Last node which is greater than __k.
while (__x != 0) while (__x != 0)
if (_M_key_compare(__k, _S_key(__x))) if (_M_impl._M_key_compare(__k, _S_key(__x)))
__y = __x, __x = _S_left(__x); __y = __x, __x = _S_left(__x);
else else
__x = _S_right(__x); __x = _S_right(__x);
...@@ -1224,10 +1243,10 @@ namespace std ...@@ -1224,10 +1243,10 @@ namespace std
bool bool
_Rb_tree<_Key,_Val,_KeyOfValue,_Compare,_Alloc>::__rb_verify() const _Rb_tree<_Key,_Val,_KeyOfValue,_Compare,_Alloc>::__rb_verify() const
{ {
if (_M_node_count == 0 || begin() == end()) if (_M_impl._M_node_count == 0 || begin() == end())
return _M_node_count == 0 && begin() == end() return _M_impl._M_node_count == 0 && begin() == end()
&& this->_M_header._M_left == _M_end() && this->_M_impl._M_header._M_left == _M_end()
&& this->_M_header._M_right == _M_end(); && this->_M_impl._M_header._M_right == _M_end();
unsigned int __len = _Rb_tree_black_count(_M_leftmost(), _M_root()); unsigned int __len = _Rb_tree_black_count(_M_leftmost(), _M_root());
for (const_iterator __it = begin(); __it != end(); ++__it) for (const_iterator __it = begin(); __it != end(); ++__it)
...@@ -1241,9 +1260,9 @@ namespace std ...@@ -1241,9 +1260,9 @@ namespace std
|| (__R && __R->_M_color == _S_red)) || (__R && __R->_M_color == _S_red))
return false; return false;
if (__L && _M_key_compare(_S_key(__x), _S_key(__L))) if (__L && _M_impl._M_key_compare(_S_key(__x), _S_key(__L)))
return false; return false;
if (__R && _M_key_compare(_S_key(__R), _S_key(__x))) if (__R && _M_impl._M_key_compare(_S_key(__R), _S_key(__x)))
return false; return false;
if (!__L && !__R && _Rb_tree_black_count(__x, _M_root()) != __len) if (!__L && !__R && _Rb_tree_black_count(__x, _M_root()) != __len)
...@@ -1259,3 +1278,4 @@ namespace std ...@@ -1259,3 +1278,4 @@ namespace std
} // namespace std } // namespace std
#endif #endif
...@@ -41,5 +41,5 @@ void test01() ...@@ -41,5 +41,5 @@ void test01()
test &= itr == mapByName.end(); // { dg-error "no" } test &= itr == mapByName.end(); // { dg-error "no" }
} }
// { dg-error "candidates are" "" { target *-*-* } 212 } // { dg-error "candidates are" "" { target *-*-* } 209 }
// { dg-error "candidates are" "" { target *-*-* } 216 } // { dg-error "candidates are" "" { target *-*-* } 213 }
...@@ -39,5 +39,6 @@ void test01() ...@@ -39,5 +39,6 @@ void test01()
test &= itr == setByName.end(); // { dg-error "no" } test &= itr == setByName.end(); // { dg-error "no" }
} }
// { dg-error "candidates are" "" { target *-*-* } 285 } // { dg-error "candidates are" "" { target *-*-* } 282 }
// { dg-error "candidates are" "" { target *-*-* } 289 } // { dg-error "candidates are" "" { target *-*-* } 286 }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment