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 container_base_dispatch.hpp 38 * Contains an associative container dispatching base. 39 */ 40 41 #ifndef PB_DS_ASSOC_CNTNR_BASE_DS_DISPATCHER_HPP 42 #define PB_DS_ASSOC_CNTNR_BASE_DS_DISPATCHER_HPP 43 44 #include <ext/typelist.h> 45 46 #define PB_DS_DATA_TRUE_INDICATOR 47 #include <ext/pb_ds/detail/list_update_map_/lu_map_.hpp> 48 #undef PB_DS_DATA_TRUE_INDICATOR 49 50 #define PB_DS_DATA_FALSE_INDICATOR 51 #include <ext/pb_ds/detail/list_update_map_/lu_map_.hpp> 52 #undef PB_DS_DATA_FALSE_INDICATOR 53 54 #define PB_DS_DATA_TRUE_INDICATOR 55 #include <ext/pb_ds/detail/rb_tree_map_/rb_tree_.hpp> 56 #undef PB_DS_DATA_TRUE_INDICATOR 57 58 #define PB_DS_DATA_FALSE_INDICATOR 59 #include <ext/pb_ds/detail/rb_tree_map_/rb_tree_.hpp> 60 #undef PB_DS_DATA_FALSE_INDICATOR 61 62 #define PB_DS_DATA_TRUE_INDICATOR 63 #include <ext/pb_ds/detail/splay_tree_/splay_tree_.hpp> 64 #undef PB_DS_DATA_TRUE_INDICATOR 65 66 #define PB_DS_DATA_FALSE_INDICATOR 67 #include <ext/pb_ds/detail/splay_tree_/splay_tree_.hpp> 68 #undef PB_DS_DATA_FALSE_INDICATOR 69 70 #define PB_DS_DATA_TRUE_INDICATOR 71 #include <ext/pb_ds/detail/ov_tree_map_/ov_tree_map_.hpp> 72 #undef PB_DS_DATA_TRUE_INDICATOR 73 74 #define PB_DS_DATA_FALSE_INDICATOR 75 #include <ext/pb_ds/detail/ov_tree_map_/ov_tree_map_.hpp> 76 #undef PB_DS_DATA_FALSE_INDICATOR 77 78 #define PB_DS_DATA_TRUE_INDICATOR 79 #include <ext/pb_ds/detail/cc_hash_table_map_/cc_ht_map_.hpp> 80 #undef PB_DS_DATA_TRUE_INDICATOR 81 82 #define PB_DS_DATA_FALSE_INDICATOR 83 #include <ext/pb_ds/detail/cc_hash_table_map_/cc_ht_map_.hpp> 84 #undef PB_DS_DATA_FALSE_INDICATOR 85 86 #define PB_DS_DATA_TRUE_INDICATOR 87 #include <ext/pb_ds/detail/gp_hash_table_map_/gp_ht_map_.hpp> 88 #undef PB_DS_DATA_TRUE_INDICATOR 89 90 #define PB_DS_DATA_FALSE_INDICATOR 91 #include <ext/pb_ds/detail/gp_hash_table_map_/gp_ht_map_.hpp> 92 #undef PB_DS_DATA_FALSE_INDICATOR 93 94 #define PB_DS_DATA_TRUE_INDICATOR 95 #include <ext/pb_ds/detail/pat_trie_/pat_trie_.hpp> 96 #undef PB_DS_DATA_TRUE_INDICATOR 97 98 #define PB_DS_DATA_FALSE_INDICATOR 99 #include <ext/pb_ds/detail/pat_trie_/pat_trie_.hpp> 100 #undef PB_DS_DATA_FALSE_INDICATOR 101 102 namespace __gnu_pbds 103 { 104 namespace detail 105 { 106 // Primary template. 107 template<typename Key, typename Mapped, typename Data_Structure_Taq, 108 typename Policy_Tl, typename Alloc> 109 struct container_base_dispatch; 110 111 template<typename Key, typename Mapped, typename Policy_Tl, typename Alloc> 112 struct container_base_dispatch<Key, Mapped, list_update_tag, 113 Policy_Tl, Alloc> 114 { 115 private: 116 typedef __gnu_cxx::typelist::at_index<Policy_Tl, 0> at0; 117 typedef typename at0::type at0t; 118 typedef __gnu_cxx::typelist::at_index<Policy_Tl, 1> at1; 119 typedef typename at1::type at1t; 120 121 public: 122 typedef lu_map_data_<Key, Mapped, at0t, Alloc, at1t> type; 123 }; 124 125 template<typename Key, typename Policy_Tl, typename Alloc> 126 struct container_base_dispatch<Key, null_mapped_type, list_update_tag, 127 Policy_Tl, Alloc> 128 { 129 private: 130 typedef __gnu_cxx::typelist::at_index<Policy_Tl, 0> at0; 131 typedef typename at0::type at0t; 132 typedef __gnu_cxx::typelist::at_index<Policy_Tl, 1> at1; 133 typedef typename at1::type at1t; 134 135 public: 136 typedef lu_map_no_data_<Key, null_mapped_type, at0t, Alloc, at1t> type; 137 }; 138 139 template<typename Key, typename Mapped, typename Policy_Tl, typename Alloc> 140 struct container_base_dispatch<Key, Mapped, pat_trie_tag, Policy_Tl, Alloc> 141 { 142 private: 143 typedef __gnu_cxx::typelist::at_index<Policy_Tl, 1> at1; 144 typedef typename at1::type at1t; 145 146 public: 147 typedef pat_trie_data_<Key, Mapped, at1t, Alloc> type; 148 }; 149 150 template<typename Key, typename Policy_Tl, typename Alloc> 151 struct container_base_dispatch<Key, null_mapped_type, pat_trie_tag, 152 Policy_Tl, Alloc> 153 { 154 private: 155 typedef __gnu_cxx::typelist::at_index<Policy_Tl, 1> at1; 156 typedef typename at1::type at1t; 157 158 public: 159 typedef pat_trie_no_data_<Key, null_mapped_type, at1t, Alloc> type; 160 }; 161 162 template<typename Key, typename Mapped, typename Policy_Tl, typename Alloc> 163 struct container_base_dispatch<Key, Mapped, rb_tree_tag, Policy_Tl, Alloc> 164 { 165 private: 166 typedef __gnu_cxx::typelist::at_index<Policy_Tl, 0> at0; 167 typedef typename at0::type at0t; 168 typedef __gnu_cxx::typelist::at_index<Policy_Tl, 1> at1; 169 typedef typename at1::type at1t; 170 171 public: 172 typedef rb_tree_data_<Key, Mapped, at0t, at1t, Alloc> type; 173 }; 174 175 template<typename Key, typename Policy_Tl, typename Alloc> 176 struct container_base_dispatch<Key, null_mapped_type, rb_tree_tag, 177 Policy_Tl, Alloc> 178 { 179 private: 180 typedef __gnu_cxx::typelist::at_index<Policy_Tl, 0> at0; 181 typedef typename at0::type at0t; 182 typedef __gnu_cxx::typelist::at_index<Policy_Tl, 1> at1; 183 typedef typename at1::type at1t; 184 185 public: 186 typedef rb_tree_no_data_<Key, null_mapped_type, at0t, at1t, Alloc> type; 187 }; 188 189 template<typename Key, typename Mapped, typename Policy_Tl, typename Alloc> 190 struct container_base_dispatch<Key, Mapped, splay_tree_tag, 191 Policy_Tl, Alloc> 192 { 193 private: 194 typedef __gnu_cxx::typelist::at_index<Policy_Tl, 0> at0; 195 typedef typename at0::type at0t; 196 typedef __gnu_cxx::typelist::at_index<Policy_Tl, 1> at1; 197 typedef typename at1::type at1t; 198 199 public: 200 typedef splay_tree_data_<Key, Mapped, at0t, at1t, Alloc> type; 201 }; 202 203 template<typename Key, typename Policy_Tl, typename Alloc> 204 struct container_base_dispatch<Key, null_mapped_type, splay_tree_tag, 205 Policy_Tl, Alloc> 206 { 207 private: 208 typedef __gnu_cxx::typelist::at_index<Policy_Tl, 0> at0; 209 typedef typename at0::type at0t; 210 typedef __gnu_cxx::typelist::at_index<Policy_Tl, 1> at1; 211 typedef typename at1::type at1t; 212 213 public: 214 typedef splay_tree_no_data_<Key, null_mapped_type, at0t, at1t, Alloc> type; 215 }; 216 217 template<typename Key, typename Mapped, typename Policy_Tl, typename Alloc> 218 struct container_base_dispatch<Key, Mapped, ov_tree_tag, Policy_Tl, Alloc> 219 { 220 private: 221 typedef __gnu_cxx::typelist::at_index<Policy_Tl, 0> at0; 222 typedef typename at0::type at0t; 223 typedef __gnu_cxx::typelist::at_index<Policy_Tl, 1> at1; 224 typedef typename at1::type at1t; 225 226 public: 227 typedef ov_tree_data_<Key, Mapped, at0t, at1t, Alloc> type; 228 }; 229 230 template<typename Key, typename Policy_Tl, typename Alloc> 231 struct container_base_dispatch<Key, null_mapped_type, ov_tree_tag, 232 Policy_Tl, Alloc> 233 { 234 private: 235 typedef __gnu_cxx::typelist::at_index<Policy_Tl, 0> at0; 236 typedef typename at0::type at0t; 237 typedef __gnu_cxx::typelist::at_index<Policy_Tl, 1> at1; 238 typedef typename at1::type at1t; 239 240 public: 241 typedef ov_tree_no_data_<Key, null_mapped_type, at0t, at1t, Alloc> type; 242 }; 243 244 template<typename Key, typename Mapped, typename Policy_Tl, typename Alloc> 245 struct container_base_dispatch<Key, Mapped, cc_hash_tag, Policy_Tl, Alloc> 246 { 247 private: 248 typedef __gnu_cxx::typelist::at_index<Policy_Tl, 0> at0; 249 typedef typename at0::type at0t; 250 typedef __gnu_cxx::typelist::at_index<Policy_Tl, 1> at1; 251 typedef typename at1::type at1t; 252 typedef __gnu_cxx::typelist::at_index<Policy_Tl, 2> at2; 253 typedef typename at2::type at2t; 254 typedef __gnu_cxx::typelist::at_index<Policy_Tl, 3> at3; 255 typedef typename at3::type at3t; 256 typedef __gnu_cxx::typelist::at_index<Policy_Tl, 4> at4; 257 typedef typename at4::type at4t; 258 259 public: 260 typedef cc_ht_map_data_<Key, Mapped, at0t, at1t, Alloc, at3t::value, 261 at4t, at2t> type; 262 }; 263 264 template<typename Key, typename Policy_Tl, typename Alloc> 265 struct container_base_dispatch<Key, null_mapped_type, cc_hash_tag, 266 Policy_Tl, Alloc> 267 { 268 private: 269 typedef __gnu_cxx::typelist::at_index<Policy_Tl, 0> at0; 270 typedef typename at0::type at0t; 271 typedef __gnu_cxx::typelist::at_index<Policy_Tl, 1> at1; 272 typedef typename at1::type at1t; 273 typedef __gnu_cxx::typelist::at_index<Policy_Tl, 2> at2; 274 typedef typename at2::type at2t; 275 typedef __gnu_cxx::typelist::at_index<Policy_Tl, 3> at3; 276 typedef typename at3::type at3t; 277 typedef __gnu_cxx::typelist::at_index<Policy_Tl, 4> at4; 278 typedef typename at4::type at4t; 279 280 public: 281 typedef cc_ht_map_no_data_<Key, null_mapped_type, at0t, at1t, Alloc, 282 at3t::value, at4t, at2t> type; 283 }; 284 285 template<typename Key, typename Mapped, typename Policy_Tl, typename Alloc> 286 struct container_base_dispatch<Key, Mapped, gp_hash_tag, Policy_Tl, Alloc> 287 { 288 private: 289 typedef __gnu_cxx::typelist::at_index<Policy_Tl, 0> at0; 290 typedef typename at0::type at0t; 291 typedef __gnu_cxx::typelist::at_index<Policy_Tl, 1> at1; 292 typedef typename at1::type at1t; 293 typedef __gnu_cxx::typelist::at_index<Policy_Tl, 2> at2; 294 typedef typename at2::type at2t; 295 typedef __gnu_cxx::typelist::at_index<Policy_Tl, 3> at3; 296 typedef typename at3::type at3t; 297 typedef __gnu_cxx::typelist::at_index<Policy_Tl, 4> at4; 298 typedef typename at4::type at4t; 299 typedef __gnu_cxx::typelist::at_index<Policy_Tl, 5> at5; 300 typedef typename at5::type at5t; 301 302 public: 303 typedef gp_ht_map_data_<Key, Mapped, at0t, at1t, Alloc, at3t::value, 304 at4t, at5t, at2t> type; 305 }; 306 307 template<typename Key, typename Policy_Tl, typename Alloc> 308 struct container_base_dispatch<Key, null_mapped_type, gp_hash_tag, 309 Policy_Tl, Alloc> 310 { 311 private: 312 typedef __gnu_cxx::typelist::at_index<Policy_Tl, 0> at0; 313 typedef typename at0::type at0t; 314 typedef __gnu_cxx::typelist::at_index<Policy_Tl, 1> at1; 315 typedef typename at1::type at1t; 316 typedef __gnu_cxx::typelist::at_index<Policy_Tl, 2> at2; 317 typedef typename at2::type at2t; 318 typedef __gnu_cxx::typelist::at_index<Policy_Tl, 3> at3; 319 typedef typename at3::type at3t; 320 typedef __gnu_cxx::typelist::at_index<Policy_Tl, 4> at4; 321 typedef typename at4::type at4t; 322 typedef __gnu_cxx::typelist::at_index<Policy_Tl, 5> at5; 323 typedef typename at5::type at5t; 324 325 public: 326 typedef gp_ht_map_no_data_<Key, null_mapped_type, at0t, at1t, Alloc, 327 at3t::value, at4t, at5t, at2t> type; 328 }; 329 } // namespace detail 330 } // namespace __gnu_pbds 331 332 #endif 333