1 // 2 // Boost.Pointer Container 3 // 4 // Copyright Thorsten Ottosen 2003-2005. Use, modification and 5 // distribution is subject to the Boost Software License, Version 6 // 1.0. (See accompanying file LICENSE_1_0.txt or copy at 7 // http://www.boost.org/LICENSE_1_0.txt) 8 // 9 // For more information, see http://www.boost.org/libs/ptr_container/ 10 // 11 12 #ifndef BOOST_PTR_CONTAINER_PTR_SET_HPP 13 #define BOOST_PTR_CONTAINER_PTR_SET_HPP 14 15 #if defined(_MSC_VER) && (_MSC_VER >= 1200) 16 # pragma once 17 #endif 18 19 #include <boost/ptr_container/indirect_fun.hpp> 20 #include <boost/ptr_container/ptr_set_adapter.hpp> 21 #include <boost/ptr_container/detail/ptr_container_disable_deprecated.hpp> 22 #include <set> 23 24 #if defined(BOOST_PTR_CONTAINER_DISABLE_DEPRECATED) 25 #pragma GCC diagnostic push 26 #pragma GCC diagnostic ignored "-Wdeprecated-declarations" 27 #endif 28 29 namespace boost 30 { 31 32 template 33 < 34 class Key, 35 class Compare = std::less<Key>, 36 class CloneAllocator = heap_clone_allocator, 37 class Allocator = std::allocator<typename ptr_container_detail::void_ptr<Key>::type> 38 > 39 class ptr_set : 40 public ptr_set_adapter< Key, std::set< 41 typename ptr_container_detail::void_ptr<Key>::type, 42 void_ptr_indirect_fun<Compare,Key>,Allocator>, 43 CloneAllocator, true > 44 { 45 typedef ptr_set_adapter< Key, std::set< 46 typename ptr_container_detail::void_ptr<Key>::type, 47 void_ptr_indirect_fun<Compare,Key>,Allocator>, 48 CloneAllocator, true > 49 base_type; 50 51 typedef ptr_set<Key,Compare,CloneAllocator,Allocator> this_type; 52 53 public: ptr_set()54 ptr_set() 55 { } 56 ptr_set(const Compare & comp,const Allocator & a=Allocator ())57 explicit ptr_set( const Compare& comp, 58 const Allocator& a = Allocator() ) 59 : base_type( comp, a ) 60 { } 61 62 template< typename InputIterator > ptr_set(InputIterator first,InputIterator last)63 ptr_set( InputIterator first, InputIterator last ) 64 : base_type( first, last ) 65 { } 66 67 template< typename InputIterator > ptr_set(InputIterator first,InputIterator last,const Compare & comp,const Allocator & a=Allocator ())68 ptr_set( InputIterator first, InputIterator last, 69 const Compare& comp, 70 const Allocator& a = Allocator() ) 71 : base_type( first, last, comp, a ) 72 { } 73 74 BOOST_PTR_CONTAINER_DEFINE_RELEASE_AND_CLONE( ptr_set, 75 base_type, 76 this_type ) 77 78 BOOST_PTR_CONTAINER_DEFINE_COPY_CONSTRUCTORS( ptr_set, base_type ) 79 80 }; 81 82 83 84 template 85 < 86 class Key, 87 class Compare = std::less<Key>, 88 class CloneAllocator = heap_clone_allocator, 89 class Allocator = std::allocator<void*> 90 > 91 class ptr_multiset : 92 public ptr_multiset_adapter< Key, 93 std::multiset<void*,void_ptr_indirect_fun<Compare,Key>,Allocator>, 94 CloneAllocator, true > 95 { 96 typedef ptr_multiset_adapter< Key, 97 std::multiset<void*,void_ptr_indirect_fun<Compare,Key>,Allocator>, 98 CloneAllocator, true > 99 base_type; 100 typedef ptr_multiset<Key,Compare,CloneAllocator,Allocator> this_type; 101 102 public: ptr_multiset()103 ptr_multiset() 104 { } 105 ptr_multiset(const Compare & comp,const Allocator & a=Allocator ())106 explicit ptr_multiset( const Compare& comp, 107 const Allocator& a = Allocator() ) 108 : base_type( comp, a ) 109 { } 110 111 template< typename InputIterator > ptr_multiset(InputIterator first,InputIterator last)112 ptr_multiset( InputIterator first, InputIterator last ) 113 : base_type( first, last ) 114 { } 115 116 template< typename InputIterator > ptr_multiset(InputIterator first,InputIterator last,const Compare & comp,const Allocator & a=Allocator ())117 ptr_multiset( InputIterator first, InputIterator last, 118 const Compare& comp, 119 const Allocator& a = Allocator() ) 120 : base_type( first, last, comp, a ) 121 { } 122 123 BOOST_PTR_CONTAINER_DEFINE_RELEASE_AND_CLONE( ptr_multiset, 124 base_type, 125 this_type ) 126 127 BOOST_PTR_CONTAINER_DEFINE_COPY_CONSTRUCTORS( ptr_multiset, 128 base_type ) 129 130 }; 131 132 ///////////////////////////////////////////////////////////////////////// 133 // clonability 134 135 template< typename K, typename C, typename CA, typename A > new_clone(const ptr_set<K,C,CA,A> & r)136 inline ptr_set<K,C,CA,A>* new_clone( const ptr_set<K,C,CA,A>& r ) 137 { 138 return r.clone().release(); 139 } 140 141 template< typename K, typename C, typename CA, typename A > new_clone(const ptr_multiset<K,C,CA,A> & r)142 inline ptr_multiset<K,C,CA,A>* new_clone( const ptr_multiset<K,C,CA,A>& r ) 143 { 144 return r.clone().release(); 145 } 146 147 ///////////////////////////////////////////////////////////////////////// 148 // swap 149 150 template< typename K, typename C, typename CA, typename A > swap(ptr_set<K,C,CA,A> & l,ptr_set<K,C,CA,A> & r)151 inline void swap( ptr_set<K,C,CA,A>& l, ptr_set<K,C,CA,A>& r ) 152 { 153 l.swap(r); 154 } 155 156 template< typename K, typename C, typename CA, typename A > swap(ptr_multiset<K,C,CA,A> & l,ptr_multiset<K,C,CA,A> & r)157 inline void swap( ptr_multiset<K,C,CA,A>& l, ptr_multiset<K,C,CA,A>& r ) 158 { 159 l.swap(r); 160 } 161 162 } 163 164 #if defined(BOOST_PTR_CONTAINER_DISABLE_DEPRECATED) 165 #pragma GCC diagnostic pop 166 #endif 167 168 #endif 169