Author: vitek Date: Thu Mar 20 15:53:27 2008 New Revision: 639495 URL: http://svn.apache.org/viewvc?rev=639495&view=rev Log: 2008-03-20 Travis Vitek <[EMAIL PROTECTED]>
* tests/regress/23.set.stdcxx-216.cpp: Add regression test for issue caused by fix to STDCXX-216. * include/rw/_tree.cc: (insert): Ensure tree is not empty before comparing keys to avoid umr. Added: stdcxx/trunk/tests/regress/23.set.stdcxx-216.cpp (with props) Modified: stdcxx/trunk/include/rw/_tree.cc Modified: stdcxx/trunk/include/rw/_tree.cc URL: http://svn.apache.org/viewvc/stdcxx/trunk/include/rw/_tree.cc?rev=639495&r1=639494&r2=639495&view=diff ============================================================================== --- stdcxx/trunk/include/rw/_tree.cc (original) +++ stdcxx/trunk/include/rw/_tree.cc Thu Mar 20 15:53:27 2008 @@ -350,11 +350,15 @@ const _C_link_t __hint = _ITER_NODE (__it); - // if __hint is the right most child and __key is greater, - // then insert on the right + // if __hint is the right most child, or tree is empty if (__hint == _C_end->_C_child [1]) { - if (_C_cmp (__hint->_C_key (), _KeyOf ()(__v))) + + // if tree is not empty and __key is greater + // then insert on the right + if (_C_size && _C_cmp (__hint->_C_key (), _KeyOf ()(__v))) return _C_insert (0, __hint, __v); + + // otherwise just insert return insert (__v, __dup).first; } @@ -366,10 +370,10 @@ return insert (__v, __dup).first; } - // if __hint is the leftmost child and __key is less + // if __hint is the left most child and __key is less // then insert on the left if (__hint == _C_end->_C_child [0]) { - if (size () && _C_cmp (_KeyOf ()(__v), __hint->_C_key ())) + if (_C_cmp (_KeyOf ()(__v), __hint->_C_key ())) return _C_insert (__hint, __hint, __v); return insert (__v, __dup).first; } Added: stdcxx/trunk/tests/regress/23.set.stdcxx-216.cpp URL: http://svn.apache.org/viewvc/stdcxx/trunk/tests/regress/23.set.stdcxx-216.cpp?rev=639495&view=auto ============================================================================== --- stdcxx/trunk/tests/regress/23.set.stdcxx-216.cpp (added) +++ stdcxx/trunk/tests/regress/23.set.stdcxx-216.cpp Thu Mar 20 15:53:27 2008 @@ -0,0 +1,135 @@ +/*************************************************************************** + * + * 23.set.stdcxx-216.cpp - regression test for STDCXX-216 + * + * $Id$ + * + *************************************************************************** + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing + * permissions and limitations under the License. + * + * Copyright 1994-2008 Rogue Wave Software. + * + **************************************************************************/ + +#include <set> +#include <cassert> + +struct Value +{ + static const unsigned magic = 0x12344321; + + Value (unsigned value = 0) + : value (value) + , valid (magic) + { + } + + Value (const Value& key) + : value (key.value) + , valid (key.magic) + { + } + + Value& operator= (const Value& rhs) + { + // assignment only valid from valid values + assert (rhs.is_valid ()); + + value = rhs.value; + valid = rhs.valid; + return *this; + } + + ~Value () + { + // destruction only allowed for valid values + assert (is_valid ()); + + valid = 0; + } + + bool is_valid () const + { + return valid == magic; + } + + friend + bool operator< (const Value& lhs, const Value& rhs) + { + // comparing against an invalid value is forbidden + assert (lhs.is_valid ()); + assert (rhs.is_valid ()); + + const int lhs_is_odd = lhs.value & 1; + const int rhs_is_odd = rhs.value & 1; + + // sort all even numbers in ascending order + // followed by odd numbers in ascending order + return lhs_is_odd != rhs_is_odd + ? lhs_is_odd < rhs_is_odd + : lhs.value < rhs.value; + } + + unsigned value; + unsigned valid; +}; + +//#include <iostream> +// +//void dump (const std::set<Value>& s) +//{ +// std::set<Value>::const_iterator b = s.begin (); +// std::set<Value>::const_iterator e = s.end (); +// +// for (/**/; b != e; ++b) +// std::cout << b->value << ' '; +// std::cout << std::endl; +//} + +int main () +{ + // insert at begin + { + std::set<Value> s; + + std::set<Value>::iterator i (s.begin ()); + for (unsigned n = 0; n < 10; ++n) + s.insert (i, n); + } + + // insert after last + { + std::set<Value> s; + + std::set<Value>::iterator i (s.end ()); + for (unsigned n = 0; n < 10; ++n) + i = s.insert (i, n); + } + + // insert at end + { + std::set<Value> s; + + std::set<Value>::iterator i (s.end ()); + for (unsigned n = 0; n < 10; ++n) + s.insert (i, n); + } + + return 0; +} + Propchange: stdcxx/trunk/tests/regress/23.set.stdcxx-216.cpp ------------------------------------------------------------------------------ svn:eol-style = native Propchange: stdcxx/trunk/tests/regress/23.set.stdcxx-216.cpp ------------------------------------------------------------------------------ svn:keywords = Id