1c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant//===----------------------------------------------------------------------===// 2c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant// 3c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant// The LLVM Compiler Infrastructure 4c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant// 5b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// This file is dual licensed under the MIT and the University of Illinois Open 6b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// Source Licenses. See LICENSE.TXT for details. 7c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant// 8c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant//===----------------------------------------------------------------------===// 9c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 10c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant// <memory> 11c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 12c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant// template <class T> struct owner_less; 13c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant// 14c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant// template <class T> 15c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant// struct owner_less<shared_ptr<T> > 16c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant// : binary_function<shared_ptr<T>, shared_ptr<T>, bool> 17c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant// { 18c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant// typedef bool result_type; 19c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant// bool operator()(shared_ptr<T> const&, shared_ptr<T> const&) const; 20c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant// bool operator()(shared_ptr<T> const&, weak_ptr<T> const&) const; 21c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant// bool operator()(weak_ptr<T> const&, shared_ptr<T> const&) const; 22c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant// }; 23c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant// 24c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant// template <class T> 25c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant// struct owner_less<weak_ptr<T> > 26c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant// : binary_function<weak_ptr<T>, weak_ptr<T>, bool> 27c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant// { 28c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant// typedef bool result_type; 29c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant// bool operator()(weak_ptr<T> const&, weak_ptr<T> const&) const; 30c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant// bool operator()(shared_ptr<T> const&, weak_ptr<T> const&) const; 31c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant// bool operator()(weak_ptr<T> const&, shared_ptr<T> const&) const; 32c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant// }; 33c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 34c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant#include <memory> 35c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant#include <cassert> 36c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 37c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnantint main() 38c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant{ 39c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant const std::shared_ptr<int> p1(new int); 40c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant const std::shared_ptr<int> p2 = p1; 41c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant const std::shared_ptr<int> p3(new int); 42c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant const std::weak_ptr<int> w1(p1); 43c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant const std::weak_ptr<int> w2(p2); 44c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant const std::weak_ptr<int> w3(p3); 45c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 46c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant { 47c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant typedef std::owner_less<std::shared_ptr<int> > CS; 48c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant CS cs; 49c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 50c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant assert(!cs(p1, p2)); 51c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant assert(!cs(p2, p1)); 52c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant assert(cs(p1 ,p3) || cs(p3, p1)); 53c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant assert(cs(p3, p1) == cs(p3, p2)); 54c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 55c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant assert(!cs(p1, w2)); 56c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant assert(!cs(p2, w1)); 57c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant assert(cs(p1, w3) || cs(p3, w1)); 58c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant assert(cs(p3, w1) == cs(p3, w2)); 59c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant } 60c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant { 61c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant typedef std::owner_less<std::weak_ptr<int> > CS; 62c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant CS cs; 63c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 64c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant assert(!cs(w1, w2)); 65c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant assert(!cs(w2, w1)); 66c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant assert(cs(w1, w3) || cs(w3, w1)); 67c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant assert(cs(w3, w1) == cs(w3, w2)); 68c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 69c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant assert(!cs(w1, p2)); 70c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant assert(!cs(w2, p1)); 71c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant assert(cs(w1, p3) || cs(w3, p1)); 72c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant assert(cs(w3, p1) == cs(w3, p2)); 73c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant } 74c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant} 75