Merge [76111] to release. Fixes #2603.

[SVN r76163]
This commit is contained in:
Peter Dimov
2011-12-26 00:23:00 +00:00
parent 9147489b4c
commit b9970eda45
5 changed files with 139 additions and 4 deletions

View File

@ -0,0 +1,57 @@
#ifndef BOOST_SMART_PTR_OWNER_LESS_HPP_INCLUDED
#define BOOST_SMART_PTR_OWNER_LESS_HPP_INCLUDED
//
// owner_less.hpp
//
// Copyright (c) 2008 Frank Mori Hess
//
// Distributed under the Boost Software License, Version 1.0. (See
// accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
//
// See http://www.boost.org/libs/smart_ptr/smart_ptr.htm for documentation.
//
#include <functional>
namespace boost
{
template<typename T> class shared_ptr;
template<typename T> class weak_ptr;
namespace detail
{
template<typename T, typename U>
struct generic_owner_less : public std::binary_function<T, T, bool>
{
bool operator()(const T &lhs, const T &rhs) const
{
return lhs.owner_before(rhs);
}
bool operator()(const T &lhs, const U &rhs) const
{
return lhs.owner_before(rhs);
}
bool operator()(const U &lhs, const T &rhs) const
{
return lhs.owner_before(rhs);
}
};
} // namespace detail
template<typename T> struct owner_less;
template<typename T>
struct owner_less<shared_ptr<T> >:
public detail::generic_owner_less<shared_ptr<T>, weak_ptr<T> >
{};
template<typename T>
struct owner_less<weak_ptr<T> >:
public detail::generic_owner_less<weak_ptr<T>, shared_ptr<T> >
{};
} // namespace boost
#endif // #ifndef BOOST_SMART_PTR_OWNER_LESS_HPP_INCLUDED

View File

@ -449,7 +449,12 @@ public:
pn.swap(other.pn);
}
template<class Y> bool _internal_less(shared_ptr<Y> const & rhs) const
template<class Y> bool owner_before( shared_ptr<Y> const & rhs ) const
{
return pn < rhs.pn;
}
template<class Y> bool owner_before( weak_ptr<Y> const & rhs ) const
{
return pn < rhs.pn;
}
@ -505,7 +510,7 @@ template<class T> inline bool operator!=(shared_ptr<T> const & a, shared_ptr<T>
template<class T, class U> inline bool operator<(shared_ptr<T> const & a, shared_ptr<U> const & b)
{
return a._internal_less(b);
return a.owner_before( b );
}
template<class T> inline void swap(shared_ptr<T> & a, shared_ptr<T> & b)

View File

@ -205,7 +205,12 @@ public:
pn = pn2;
}
template<class Y> bool _internal_less(weak_ptr<Y> const & rhs) const
template<class Y> bool owner_before( weak_ptr<Y> const & rhs ) const
{
return pn < rhs.pn;
}
template<class Y> bool owner_before( shared_ptr<Y> const & rhs ) const
{
return pn < rhs.pn;
}
@ -229,7 +234,7 @@ private:
template<class T, class U> inline bool operator<(weak_ptr<T> const & a, weak_ptr<U> const & b)
{
return a._internal_less(b);
return a.owner_before( b );
}
template<class T> void swap(weak_ptr<T> & a, weak_ptr<T> & b)

View File

@ -67,5 +67,6 @@ import testing ;
[ run sp_hash_test.cpp ]
[ run get_deleter_array_test.cpp ]
[ run ip_hash_test.cpp ]
[ run owner_less_test.cpp ]
;
}

67
test/owner_less_test.cpp Normal file
View File

@ -0,0 +1,67 @@
//
// owner_less_test.cpp
//
// A regression test for owner_less
//
// Copyright (c) 2008 Frank Mori Hess
//
// Distributed under the Boost Software License, Version 1.0.
//
// See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
//
#include <boost/detail/lightweight_test.hpp>
#include <boost/smart_ptr/owner_less.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/weak_ptr.hpp>
int main()
{
boost::owner_less<boost::shared_ptr<int> > comp;
{
boost::shared_ptr<int> x;
boost::shared_ptr<int> y;
boost::weak_ptr<int> w;
BOOST_TEST(!(comp(x, w) || comp(w, x)));
}
{
boost::shared_ptr<int> z((int*)0);
boost::weak_ptr<int> w;
BOOST_TEST(comp(z, w) || comp(w, z));
{
boost::shared_ptr<int> zz(z);
w = boost::weak_ptr<int>(zz);
BOOST_TEST(!(comp(z, zz) || comp(z, zz)));
BOOST_TEST(!(comp(z, w) || comp(z, w)));
}
BOOST_TEST(!(comp(z, w) || comp(w, z)));
}
{
boost::shared_ptr<int> x;
boost::shared_ptr<int> z((int*)0);
BOOST_TEST(comp(x, z) || comp(z, x));
}
{
boost::shared_ptr<int> a((int*)0);
boost::shared_ptr<int> b((int*)0);
BOOST_TEST(comp(a, b) || comp(b, a));
boost::weak_ptr<int> w(a);
BOOST_TEST(!(comp(a, w) || comp(w, a)));
BOOST_TEST(comp(b, w) || comp(w, b));
}
boost::owner_less<boost::weak_ptr<int> > weak_comp;
{
boost::shared_ptr<int> a((int*)0);
boost::weak_ptr<int> wa(a);
boost::shared_ptr<int> b((int*)0);
boost::weak_ptr<int> wb(b);
BOOST_TEST(!(weak_comp(a, wa) || weak_comp(wa, a)));
BOOST_TEST(!(weak_comp(b, wb) || weak_comp(wb, b)));
BOOST_TEST(weak_comp(wa, wb) || weak_comp(wb, wa));
BOOST_TEST(weak_comp(wa, b) || weak_comp(b, wa));
}
return boost::report_errors();
}