1ffeaf689SAlexander Kabaev // 'struct hash' from SGI -*- C++ -*- 2ffeaf689SAlexander Kabaev 3*f8a1b7d9SAlexander Kabaev // Copyright (C) 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. 4ffeaf689SAlexander Kabaev // 5ffeaf689SAlexander Kabaev // This file is part of the GNU ISO C++ Library. This library is free 6ffeaf689SAlexander Kabaev // software; you can redistribute it and/or modify it under the 7ffeaf689SAlexander Kabaev // terms of the GNU General Public License as published by the 8ffeaf689SAlexander Kabaev // Free Software Foundation; either version 2, or (at your option) 9ffeaf689SAlexander Kabaev // any later version. 10ffeaf689SAlexander Kabaev 11ffeaf689SAlexander Kabaev // This library is distributed in the hope that it will be useful, 12ffeaf689SAlexander Kabaev // but WITHOUT ANY WARRANTY; without even the implied warranty of 13ffeaf689SAlexander Kabaev // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14ffeaf689SAlexander Kabaev // GNU General Public License for more details. 15ffeaf689SAlexander Kabaev 16ffeaf689SAlexander Kabaev // You should have received a copy of the GNU General Public License along 17ffeaf689SAlexander Kabaev // with this library; see the file COPYING. If not, write to the Free 18*f8a1b7d9SAlexander Kabaev // Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 19ffeaf689SAlexander Kabaev // USA. 20ffeaf689SAlexander Kabaev 21ffeaf689SAlexander Kabaev // As a special exception, you may use this file as part of a free software 22ffeaf689SAlexander Kabaev // library without restriction. Specifically, if other files instantiate 23ffeaf689SAlexander Kabaev // templates or use macros or inline functions from this file, or you compile 24ffeaf689SAlexander Kabaev // this file and link it with other files to produce an executable, this 25ffeaf689SAlexander Kabaev // file does not by itself cause the resulting executable to be covered by 26ffeaf689SAlexander Kabaev // the GNU General Public License. This exception does not however 27ffeaf689SAlexander Kabaev // invalidate any other reasons why the executable file might be covered by 28ffeaf689SAlexander Kabaev // the GNU General Public License. 29ffeaf689SAlexander Kabaev 30ffeaf689SAlexander Kabaev /* 31ffeaf689SAlexander Kabaev * Copyright (c) 1996-1998 32ffeaf689SAlexander Kabaev * Silicon Graphics Computer Systems, Inc. 33ffeaf689SAlexander Kabaev * 34ffeaf689SAlexander Kabaev * Permission to use, copy, modify, distribute and sell this software 35ffeaf689SAlexander Kabaev * and its documentation for any purpose is hereby granted without fee, 36ffeaf689SAlexander Kabaev * provided that the above copyright notice appear in all copies and 37ffeaf689SAlexander Kabaev * that both that copyright notice and this permission notice appear 38ffeaf689SAlexander Kabaev * in supporting documentation. Silicon Graphics makes no 39ffeaf689SAlexander Kabaev * representations about the suitability of this software for any 40ffeaf689SAlexander Kabaev * purpose. It is provided "as is" without express or implied warranty. 41ffeaf689SAlexander Kabaev * 42ffeaf689SAlexander Kabaev * 43ffeaf689SAlexander Kabaev * Copyright (c) 1994 44ffeaf689SAlexander Kabaev * Hewlett-Packard Company 45ffeaf689SAlexander Kabaev * 46ffeaf689SAlexander Kabaev * Permission to use, copy, modify, distribute and sell this software 47ffeaf689SAlexander Kabaev * and its documentation for any purpose is hereby granted without fee, 48ffeaf689SAlexander Kabaev * provided that the above copyright notice appear in all copies and 49ffeaf689SAlexander Kabaev * that both that copyright notice and this permission notice appear 50ffeaf689SAlexander Kabaev * in supporting documentation. Hewlett-Packard Company makes no 51ffeaf689SAlexander Kabaev * representations about the suitability of this software for any 52ffeaf689SAlexander Kabaev * purpose. It is provided "as is" without express or implied warranty. 53ffeaf689SAlexander Kabaev * 54ffeaf689SAlexander Kabaev */ 55ffeaf689SAlexander Kabaev 56ffeaf689SAlexander Kabaev /** @file ext/hash_fun.h 57ffeaf689SAlexander Kabaev * This file is a GNU extension to the Standard C++ Library (possibly 58*f8a1b7d9SAlexander Kabaev * containing extensions from the HP/SGI STL subset). 59ffeaf689SAlexander Kabaev */ 60ffeaf689SAlexander Kabaev 61ffeaf689SAlexander Kabaev #ifndef _HASH_FUN_H 62ffeaf689SAlexander Kabaev #define _HASH_FUN_H 1 63ffeaf689SAlexander Kabaev 64ffeaf689SAlexander Kabaev #include <cstddef> 65ffeaf689SAlexander Kabaev 66*f8a1b7d9SAlexander Kabaev _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx) 67*f8a1b7d9SAlexander Kabaev 68ffeaf689SAlexander Kabaev using std::size_t; 69ffeaf689SAlexander Kabaev 70*f8a1b7d9SAlexander Kabaev template<class _Key> 71*f8a1b7d9SAlexander Kabaev struct hash { }; 72ffeaf689SAlexander Kabaev 73ffeaf689SAlexander Kabaev inline size_t __stl_hash_string(const char * __s)74ffeaf689SAlexander Kabaev __stl_hash_string(const char* __s) 75ffeaf689SAlexander Kabaev { 76ffeaf689SAlexander Kabaev unsigned long __h = 0; 77ffeaf689SAlexander Kabaev for ( ; *__s; ++__s) 78ffeaf689SAlexander Kabaev __h = 5 * __h + *__s; 79ffeaf689SAlexander Kabaev return size_t(__h); 80ffeaf689SAlexander Kabaev } 81ffeaf689SAlexander Kabaev 82*f8a1b7d9SAlexander Kabaev template<> 83*f8a1b7d9SAlexander Kabaev struct hash<char*> 84ffeaf689SAlexander Kabaev { 85*f8a1b7d9SAlexander Kabaev size_t 86*f8a1b7d9SAlexander Kabaev operator()(const char* __s) const 87ffeaf689SAlexander Kabaev { return __stl_hash_string(__s); } 88ffeaf689SAlexander Kabaev }; 89ffeaf689SAlexander Kabaev 90*f8a1b7d9SAlexander Kabaev template<> 91*f8a1b7d9SAlexander Kabaev struct hash<const char*> 92ffeaf689SAlexander Kabaev { 93*f8a1b7d9SAlexander Kabaev size_t 94*f8a1b7d9SAlexander Kabaev operator()(const char* __s) const 95ffeaf689SAlexander Kabaev { return __stl_hash_string(__s); } 96ffeaf689SAlexander Kabaev }; 97ffeaf689SAlexander Kabaev 98*f8a1b7d9SAlexander Kabaev template<> 99*f8a1b7d9SAlexander Kabaev struct hash<char> 100*f8a1b7d9SAlexander Kabaev { 101*f8a1b7d9SAlexander Kabaev size_t 102*f8a1b7d9SAlexander Kabaev operator()(char __x) const 103*f8a1b7d9SAlexander Kabaev { return __x; } 104*f8a1b7d9SAlexander Kabaev }; 105ffeaf689SAlexander Kabaev 106*f8a1b7d9SAlexander Kabaev template<> 107*f8a1b7d9SAlexander Kabaev struct hash<unsigned char> 108*f8a1b7d9SAlexander Kabaev { 109*f8a1b7d9SAlexander Kabaev size_t 110*f8a1b7d9SAlexander Kabaev operator()(unsigned char __x) const 111*f8a1b7d9SAlexander Kabaev { return __x; } 112*f8a1b7d9SAlexander Kabaev }; 113ffeaf689SAlexander Kabaev 114*f8a1b7d9SAlexander Kabaev template<> 115*f8a1b7d9SAlexander Kabaev struct hash<signed char> 116*f8a1b7d9SAlexander Kabaev { 117*f8a1b7d9SAlexander Kabaev size_t 118*f8a1b7d9SAlexander Kabaev operator()(unsigned char __x) const 119*f8a1b7d9SAlexander Kabaev { return __x; } 120*f8a1b7d9SAlexander Kabaev }; 121ffeaf689SAlexander Kabaev 122*f8a1b7d9SAlexander Kabaev template<> 123*f8a1b7d9SAlexander Kabaev struct hash<short> 124*f8a1b7d9SAlexander Kabaev { 125*f8a1b7d9SAlexander Kabaev size_t 126*f8a1b7d9SAlexander Kabaev operator()(short __x) const 127*f8a1b7d9SAlexander Kabaev { return __x; } 128*f8a1b7d9SAlexander Kabaev }; 129ffeaf689SAlexander Kabaev 130*f8a1b7d9SAlexander Kabaev template<> 131*f8a1b7d9SAlexander Kabaev struct hash<unsigned short> 132*f8a1b7d9SAlexander Kabaev { 133*f8a1b7d9SAlexander Kabaev size_t 134*f8a1b7d9SAlexander Kabaev operator()(unsigned short __x) const 135*f8a1b7d9SAlexander Kabaev { return __x; } 136*f8a1b7d9SAlexander Kabaev }; 137ffeaf689SAlexander Kabaev 138*f8a1b7d9SAlexander Kabaev template<> 139*f8a1b7d9SAlexander Kabaev struct hash<int> 140*f8a1b7d9SAlexander Kabaev { 141*f8a1b7d9SAlexander Kabaev size_t 142*f8a1b7d9SAlexander Kabaev operator()(int __x) const 143*f8a1b7d9SAlexander Kabaev { return __x; } 144*f8a1b7d9SAlexander Kabaev }; 145ffeaf689SAlexander Kabaev 146*f8a1b7d9SAlexander Kabaev template<> 147*f8a1b7d9SAlexander Kabaev struct hash<unsigned int> 148*f8a1b7d9SAlexander Kabaev { 149*f8a1b7d9SAlexander Kabaev size_t 150*f8a1b7d9SAlexander Kabaev operator()(unsigned int __x) const 151*f8a1b7d9SAlexander Kabaev { return __x; } 152*f8a1b7d9SAlexander Kabaev }; 153ffeaf689SAlexander Kabaev 154*f8a1b7d9SAlexander Kabaev template<> 155*f8a1b7d9SAlexander Kabaev struct hash<long> 156*f8a1b7d9SAlexander Kabaev { 157*f8a1b7d9SAlexander Kabaev size_t 158*f8a1b7d9SAlexander Kabaev operator()(long __x) const 159*f8a1b7d9SAlexander Kabaev { return __x; } 160*f8a1b7d9SAlexander Kabaev }; 161ffeaf689SAlexander Kabaev 162*f8a1b7d9SAlexander Kabaev template<> 163*f8a1b7d9SAlexander Kabaev struct hash<unsigned long> 164*f8a1b7d9SAlexander Kabaev { 165*f8a1b7d9SAlexander Kabaev size_t 166*f8a1b7d9SAlexander Kabaev operator()(unsigned long __x) const 167*f8a1b7d9SAlexander Kabaev { return __x; } 168*f8a1b7d9SAlexander Kabaev }; 169*f8a1b7d9SAlexander Kabaev 170*f8a1b7d9SAlexander Kabaev _GLIBCXX_END_NAMESPACE 171ffeaf689SAlexander Kabaev 172ffeaf689SAlexander Kabaev #endif 173