1// -*- C++ -*- 2 3// Copyright (C) 2005, 2006 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 2, 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// You should have received a copy of the GNU General Public License 17// along with this library; see the file COPYING. If not, write to 18// the Free Software Foundation, 59 Temple Place - Suite 330, Boston, 19// MA 02111-1307, USA. 20 21// As a special exception, you may use this file as part of a free 22// software library without restriction. Specifically, if other files 23// instantiate templates or use macros or inline functions from this 24// file, or you compile this file and link it with other files to 25// produce an executable, this file does not by itself cause the 26// resulting executable to be covered by the GNU General Public 27// License. This exception does not however invalidate any other 28// reasons why the executable file might be covered by the GNU General 29// Public License. 30 31// Copyright (C) 2004 Ami Tavory and Vladimir Dreizin, IBM-HRL. 32 33// Permission to use, copy, modify, sell, and distribute this software 34// is hereby granted without fee, provided that the above copyright 35// notice appears in all copies, and that both that copyright notice 36// and this permission notice appear in supporting documentation. None 37// of the above authors, nor IBM Haifa Research Laboratories, make any 38// representation about the suitability of this software for any 39// purpose. It is provided "as is" without express or implied 40// warranty. 41 42/** 43 * @file basic_tree_policy_base.hpp 44 * Contains a base class for tree_like policies. 45 */ 46 47#ifndef PB_DS_TREE_LIKE_POLICY_BASE_HPP 48#define PB_DS_TREE_LIKE_POLICY_BASE_HPP 49 50namespace pb_ds 51{ 52 namespace detail 53 { 54 55#define PB_DS_CLASS_C_DEC \ 56 basic_tree_policy_base< \ 57 Const_Node_Iterator, \ 58 Node_Iterator, \ 59 Allocator> 60 61 template<typename Const_Node_Iterator, 62 typename Node_Iterator, 63 typename Allocator> 64 struct basic_tree_policy_base 65 { 66 protected: 67 typedef typename Node_Iterator::value_type it_type; 68 69 typedef typename std::iterator_traits< it_type>::value_type value_type; 70 71 typedef typename value_type::first_type key_type; 72 73 typedef 74 typename Allocator::template rebind< 75 typename remove_const< 76 key_type>::type>::other::const_reference 77 const_key_reference; 78 79 typedef 80 typename Allocator::template rebind< 81 typename remove_const< 82 value_type>::type>::other::const_reference 83 const_reference; 84 85 typedef 86 typename Allocator::template rebind< 87 typename remove_const< 88 value_type>::type>::other::reference 89 reference; 90 91 typedef 92 typename Allocator::template rebind< 93 typename remove_const< 94 value_type>::type>::other::const_pointer 95 const_pointer; 96 97 static inline const_key_reference 98 extract_key(const_reference r_val) 99 { 100 return (r_val.first); 101 } 102 103 virtual it_type 104 end() = 0; 105 106 it_type 107 end_iterator() const 108 { 109 return (const_cast<PB_DS_CLASS_C_DEC* >(this)->end()); 110 } 111 112 virtual 113 ~basic_tree_policy_base() 114 { } 115 }; 116 117 template<typename Const_Node_Iterator, typename Allocator> 118 struct basic_tree_policy_base< 119 Const_Node_Iterator, 120 Const_Node_Iterator, 121 Allocator> 122 { 123 protected: 124 typedef typename Const_Node_Iterator::value_type it_type; 125 126 typedef typename std::iterator_traits< it_type>::value_type value_type; 127 128 typedef value_type key_type; 129 130 typedef 131 typename Allocator::template rebind< 132 typename remove_const< 133 key_type>::type>::other::const_reference 134 const_key_reference; 135 136 typedef 137 typename Allocator::template rebind< 138 typename remove_const< 139 value_type>::type>::other::const_reference 140 const_reference; 141 142 typedef 143 typename Allocator::template rebind< 144 typename remove_const< 145 value_type>::type>::other::reference 146 reference; 147 148 typedef 149 typename Allocator::template rebind< 150 typename remove_const< 151 value_type>::type>::other::const_pointer 152 const_pointer; 153 154 static inline const_key_reference 155 extract_key(const_reference r_val) 156 { 157 return (r_val); 158 } 159 160 virtual it_type 161 end() const = 0; 162 163 it_type 164 end_iterator() const 165 { 166 return (end()); 167 } 168 169 virtual 170 ~basic_tree_policy_base() 171 { } 172 }; 173 174#undef PB_DS_CLASS_C_DEC 175 176 } // namespace detail 177} // namespace pb_ds 178 179#endif // #ifndef PB_DS_TREE_LIKE_POLICY_BASE_HPP 180