| #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 |