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 leaf.hpp 44 * Contains a pat_trie_leaf for a patricia tree. 45 */ 46 47#ifndef PB_DS_PAT_TRIE_LEAF_HPP 48#define PB_DS_PAT_TRIE_LEAF_HPP 49 50#include <debug/debug.h> 51 52namespace pb_ds 53{ 54 namespace detail 55 { 56 57#define PB_DS_CLASS_T_DEC \ 58 template< \ 59 class Type_Traits, \ 60 class E_Access_Traits, \ 61 class Metadata, \ 62 class Allocator> 63 64#define PB_DS_CLASS_C_DEC \ 65 pat_trie_leaf< \ 66 Type_Traits, \ 67 E_Access_Traits, \ 68 Metadata, \ 69 Allocator> 70 71#define PB_DS_BASE_C_DEC \ 72 pat_trie_node_base< \ 73 Type_Traits, \ 74 E_Access_Traits, \ 75 Metadata, \ 76 Allocator> 77 78#define PB_DS_PAT_TRIE_SUBTREE_DEBUG_INFO_C_DEC \ 79 pat_trie_subtree_debug_info< \ 80 Type_Traits, \ 81 E_Access_Traits, \ 82 Allocator> 83 84 template<typename Type_Traits, 85 class E_Access_Traits, 86 class Metadata, 87 class Allocator> 88 struct pat_trie_leaf : public PB_DS_BASE_C_DEC 89 { 90 private: 91 typedef typename Type_Traits::value_type value_type; 92 93 typedef typename Type_Traits::const_reference const_reference; 94 95 typedef typename Type_Traits::reference reference; 96 97 typedef 98 typename Allocator::template rebind< 99 E_Access_Traits>::other::const_pointer 100 const_e_access_traits_pointer; 101 102#ifdef _GLIBCXX_DEBUG 103 typedef 104 typename PB_DS_BASE_C_DEC::subtree_debug_info 105 subtree_debug_info; 106#endif 107 108 typedef PB_DS_BASE_C_DEC base_type; 109 110 public: 111 pat_trie_leaf(const_reference r_val); 112 113 inline reference 114 value(); 115 116 inline const_reference 117 value() const; 118 119#ifdef _GLIBCXX_DEBUG 120 virtual subtree_debug_info 121 assert_valid_imp(const_e_access_traits_pointer p_traits) const; 122 123 virtual 124 ~pat_trie_leaf(); 125#endif 126 127 private: 128 pat_trie_leaf(const PB_DS_CLASS_C_DEC& other); 129 130 value_type m_value; 131 }; 132 133 PB_DS_CLASS_T_DEC 134 PB_DS_CLASS_C_DEC:: 135 pat_trie_leaf(const_reference r_val) : 136 PB_DS_BASE_C_DEC(pat_trie_leaf_node_type), m_value(r_val) 137 { } 138 139 PB_DS_CLASS_T_DEC 140 inline typename PB_DS_CLASS_C_DEC::reference 141 PB_DS_CLASS_C_DEC:: 142 value() 143 { return m_value; } 144 145 PB_DS_CLASS_T_DEC 146 inline typename PB_DS_CLASS_C_DEC::const_reference 147 PB_DS_CLASS_C_DEC:: 148 value() const 149 { return m_value; } 150 151#ifdef _GLIBCXX_DEBUG 152 PB_DS_CLASS_T_DEC 153 typename PB_DS_CLASS_C_DEC::subtree_debug_info 154 PB_DS_CLASS_C_DEC:: 155 assert_valid_imp(const_e_access_traits_pointer p_traits) const 156 { 157 _GLIBCXX_DEBUG_ASSERT(base_type::m_type == pat_trie_leaf_node_type); 158 subtree_debug_info ret; 159 const_reference r_val = value(); 160 return std::make_pair(p_traits->begin(p_traits->extract_key(r_val)), 161 p_traits->end(p_traits->extract_key(r_val))); 162 } 163 164 PB_DS_CLASS_T_DEC 165 PB_DS_CLASS_C_DEC:: 166 ~pat_trie_leaf() { } 167#endif 168 169#undef PB_DS_CLASS_T_DEC 170#undef PB_DS_CLASS_C_DEC 171#undef PB_DS_BASE_C_DEC 172#undef PB_DS_PAT_TRIE_SUBTREE_DEBUG_INFO_C_DEC 173 174 } // namespace detail 175} // namespace pb_ds 176 177#endif 178