|  | #ifndef _H_HashMap | 
|  | #define _H_HashMap | 
|  | /* | 
|  | * Copyright 2008 Google Inc. | 
|  | * | 
|  | * Licensed under the Apache License, Version 2.0 (the "License"); you may not | 
|  | * use this file except in compliance with the License. You may obtain a copy of | 
|  | * the License at | 
|  | * | 
|  | * http://www.apache.org/licenses/LICENSE-2.0 | 
|  | * | 
|  | * Unless required by applicable law or agreed to in writing, software | 
|  | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT | 
|  | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the | 
|  | * License for the specific language governing permissions and limitations under | 
|  | * the License. | 
|  | */ | 
|  |  | 
|  | // Portability wrapper for hash maps, since they aren't part of the standard C++ library | 
|  |  | 
|  | #ifdef __GNUC__ | 
|  | #ifdef CXX_TR1 | 
|  | // future support | 
|  | #include <unordered_map> | 
|  | #define hash_map std::tr1::unordered_map | 
|  |  | 
|  | namespace HashFunctions = std; | 
|  | #else | 
|  | #include <ext/hash_map> | 
|  | using __gnu_cxx::hash_map; | 
|  |  | 
|  | // TODO(jat): surely this exists somewhere already? | 
|  | // TODO(jat): portability issues | 
|  | namespace __gnu_cxx { | 
|  | using std::size_t; | 
|  |  | 
|  | template<> struct hash<std::string> { | 
|  | size_t operator()(const std::string& str) const { | 
|  | return hash<const char*>()(str.c_str()); | 
|  | } | 
|  | }; | 
|  | }; | 
|  | namespace HashFunctions = __gnu_cxx; | 
|  | #endif | 
|  | #elif sun | 
|  | // TODO(jat): find a hash_map implementation for Solaris | 
|  | #include <map> | 
|  | namespace HashFunctions = std; | 
|  | #define hash_map map | 
|  | using std::map; | 
|  | #else | 
|  | // Try something reasonably standard, which works in Windows | 
|  | #include <hash_map> | 
|  | using stdext::hash_map; | 
|  | namespace HashFunctions = stdext; | 
|  | #endif | 
|  |  | 
|  | #endif |