OSDN Git Service

2009-11-21 Paolo Carlini <paolo.carlini@oracle.com>
[pf3gnuchains/gcc-fork.git] / libstdc++-v3 / src / compatibility-c++0x.cc
1 // Compatibility symbols for previous versions, C++0x bits -*- C++ -*-
2
3 // Copyright (C) 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
7 // terms of the GNU General Public License as published by the
8 // Free Software Foundation; either version 3, or (at your option)
9 // any later version.
10
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 // GNU 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 #include <cstddef>
26 #include <string>
27 #include <cmath>
28 #include <system_error>
29
30 #ifndef __GXX_EXPERIMENTAL_CXX0X__
31 # error "compatibility-c++0x.cc must be compiled with -std=gnu++0x"
32 #endif
33
34 namespace std
35 {
36   // We need these due to the symbols exported since GLIBCXX_3.4.10.
37   // See libstdc++/41662 for details.
38
39   template<typename _Tp>
40     struct hash : public std::unary_function<_Tp, size_t>
41     {
42       size_t
43       operator()(_Tp __val) const;
44     };
45
46   /// Dummy generic implementation (for sizeof(size_t) != 4, 8).
47   template<size_t = sizeof(size_t)>
48     struct _Fnv_hash
49     {
50       static size_t
51       hash(const char* __first, size_t __length)
52       {
53         size_t __result = 0;
54         for (; __length > 0; --__length)
55           __result = (__result * 131) + *__first++;
56         return __result;
57       }
58     };
59
60   template<>
61     struct _Fnv_hash<4>
62     {
63       static size_t
64       hash(const char* __first, size_t __length)
65       {
66         size_t __result = static_cast<size_t>(2166136261UL);
67         for (; __length > 0; --__length)
68           {
69             __result ^= static_cast<size_t>(*__first++);
70             __result *= static_cast<size_t>(16777619UL);
71           }
72         return __result;
73       }
74     };
75   
76   template<>
77     struct _Fnv_hash<8>
78     {
79       static size_t
80       hash(const char* __first, size_t __length)
81       {
82         size_t __result =
83           static_cast<size_t>(14695981039346656037ULL);
84         for (; __length > 0; --__length)
85           {
86             __result ^= static_cast<size_t>(*__first++);
87             __result *= static_cast<size_t>(1099511628211ULL);
88           }
89         return __result;
90       }
91     };
92
93 #include "hash.cc"
94
95   template<>
96     size_t
97     hash<error_code>::operator()(error_code __e) const
98     { 
99       const char* __p = reinterpret_cast<const char*>(&__e);
100       return _Fnv_hash<>::hash(__p, sizeof(__e));
101     }
102 }