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