1 // -*- C++ -*- 2 3 // Copyright (C) 2005, 2006, 2009 Free Software Foundation, Inc. 4 // 5 // This file is part of the GNU ISO C++ Library. This library is free 6 // software; you can redistribute it and/or modify it under the terms 7 // of the GNU General Public License as published by the Free Software 8 // Foundation; either version 3, or (at your option) any later 9 // version. 10 11 // This library is distributed in the hope that it will be useful, but 12 // WITHOUT ANY WARRANTY; without even the implied warranty of 13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 // General Public License for more details. 15 16 // Under Section 7 of GPL version 3, you are granted additional 17 // permissions described in the GCC Runtime Library Exception, version 18 // 3.1, as published by the Free Software Foundation. 19 20 // You should have received a copy of the GNU General Public License and 21 // a copy of the GCC Runtime Library Exception along with this program; 22 // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 23 // <http://www.gnu.org/licenses/>. 24 25 // Copyright (C) 2004 Ami Tavory and Vladimir Dreizin, IBM-HRL. 26 27 // Permission to use, copy, modify, sell, and distribute this software 28 // is hereby granted without fee, provided that the above copyright 29 // notice appears in all copies, and that both that copyright notice 30 // and this permission notice appear in supporting documentation. None 31 // of the above authors, nor IBM Haifa Research Laboratories, make any 32 // representation about the suitability of this software for any 33 // purpose. It is provided "as is" without express or implied 34 // warranty. 35 36 /** 37 * @file basic_tree_policy_base.hpp 38 * Contains a base class for tree_like policies. 39 */ 40 41 #ifndef PB_DS_TREE_LIKE_POLICY_BASE_HPP 42 #define PB_DS_TREE_LIKE_POLICY_BASE_HPP 43 44 namespace __gnu_pbds 45 { 46 namespace detail 47 { 48 49 #define PB_DS_CLASS_C_DEC \ 50 basic_tree_policy_base< \ 51 Const_Node_Iterator, \ 52 Node_Iterator, \ 53 Allocator> 54 55 template<typename Const_Node_Iterator, 56 typename Node_Iterator, 57 typename Allocator> 58 struct basic_tree_policy_base 59 { 60 protected: 61 typedef typename Node_Iterator::value_type it_type; 62 63 typedef typename std::iterator_traits< it_type>::value_type value_type; 64 65 typedef typename value_type::first_type key_type; 66 67 typedef 68 typename Allocator::template rebind< 69 typename remove_const< 70 key_type>::type>::other::const_reference 71 const_key_reference; 72 73 typedef 74 typename Allocator::template rebind< 75 typename remove_const< 76 value_type>::type>::other::const_reference 77 const_reference; 78 79 typedef 80 typename Allocator::template rebind< 81 typename remove_const< 82 value_type>::type>::other::reference 83 reference; 84 85 typedef 86 typename Allocator::template rebind< 87 typename remove_const< 88 value_type>::type>::other::const_pointer 89 const_pointer; 90 91 static inline const_key_reference 92 extract_key(const_reference r_val) 93 { 94 return (r_val.first); 95 } 96 97 virtual it_type 98 end() = 0; 99 100 it_type 101 end_iterator() const 102 { 103 return (const_cast<PB_DS_CLASS_C_DEC* >(this)->end()); 104 } 105 106 virtual 107 ~basic_tree_policy_base() 108 { } 109 }; 110 111 template<typename Const_Node_Iterator, typename Allocator> 112 struct basic_tree_policy_base< 113 Const_Node_Iterator, 114 Const_Node_Iterator, 115 Allocator> 116 { 117 protected: 118 typedef typename Const_Node_Iterator::value_type it_type; 119 120 typedef typename std::iterator_traits< it_type>::value_type value_type; 121 122 typedef value_type key_type; 123 124 typedef 125 typename Allocator::template rebind< 126 typename remove_const< 127 key_type>::type>::other::const_reference 128 const_key_reference; 129 130 typedef 131 typename Allocator::template rebind< 132 typename remove_const< 133 value_type>::type>::other::const_reference 134 const_reference; 135 136 typedef 137 typename Allocator::template rebind< 138 typename remove_const< 139 value_type>::type>::other::reference 140 reference; 141 142 typedef 143 typename Allocator::template rebind< 144 typename remove_const< 145 value_type>::type>::other::const_pointer 146 const_pointer; 147 148 static inline const_key_reference 149 extract_key(const_reference r_val) 150 { 151 return (r_val); 152 } 153 154 virtual it_type 155 end() const = 0; 156 157 it_type 158 end_iterator() const 159 { 160 return (end()); 161 } 162 163 virtual 164 ~basic_tree_policy_base() 165 { } 166 }; 167 168 #undef PB_DS_CLASS_C_DEC 169 170 } // namespace detail 171 } // namespace __gnu_pbds 172 173 #endif // #ifndef PB_DS_TREE_LIKE_POLICY_BASE_HPP 174