google_hash 0.8.1 → 0.8.2
Sign up to get free protection for your applications and to get access to all the features.
- data/ChangeLog.txt +2 -0
- data/VERSION +1 -1
- data/ext/clean.bat +0 -0
- data/ext/clean.sh +4 -0
- data/ext/extconf.rb +4 -5
- data/ext/go.bat +0 -0
- data/ext/sparsehash-2.0.2/AUTHORS +2 -0
- data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/COPYING +0 -0
- data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/ChangeLog +60 -0
- data/ext/sparsehash-2.0.2/INSTALL +365 -0
- data/ext/sparsehash-2.0.2/Makefile +1336 -0
- data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/Makefile.am +97 -40
- data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/Makefile.in +538 -256
- data/ext/sparsehash-2.0.2/NEWS +188 -0
- data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/README +4 -10
- data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/README_windows.txt +3 -3
- data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/TODO +0 -0
- data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/aclocal.m4 +266 -166
- data/ext/sparsehash-2.0.2/allocator.patch +31 -0
- data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/config.guess +235 -234
- data/ext/sparsehash-2.0.2/config.status +1238 -0
- data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/config.sub +198 -64
- data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/configure +1118 -1000
- data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/configure.ac +4 -5
- data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/depcomp +136 -36
- data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/doc/dense_hash_map.html +182 -67
- data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/doc/dense_hash_set.html +173 -74
- data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/doc/designstyle.css +0 -6
- data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/doc/implementation.html +0 -0
- data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/doc/index.html +4 -5
- data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/doc/performance.html +1 -1
- data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/doc/sparse_hash_map.html +190 -58
- data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/doc/sparse_hash_set.html +180 -65
- data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/doc/sparsetable.html +1 -1
- data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/experimental/Makefile +0 -0
- data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/experimental/README +0 -0
- data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/experimental/example.c +1 -0
- data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/experimental/libchash.c +1 -0
- data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/experimental/libchash.h +1 -0
- data/ext/sparsehash-2.0.2/install-sh +520 -0
- data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/m4/acx_pthread.m4 +34 -0
- data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/m4/google_namespace.m4 +0 -0
- data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/m4/namespaces.m4 +0 -0
- data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/m4/stl_hash.m4 +0 -0
- data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/m4/stl_hash_fun.m4 +0 -0
- data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/missing +60 -44
- data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/packages/deb.sh +0 -0
- data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/packages/deb/README +0 -0
- data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/packages/deb/changelog +42 -0
- data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/packages/deb/compat +0 -0
- data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/packages/deb/control +1 -1
- data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/packages/deb/copyright +5 -4
- data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/packages/deb/docs +0 -0
- data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/packages/deb/rules +0 -0
- data/ext/sparsehash-2.0.2/packages/deb/sparsehash.dirs +5 -0
- data/ext/sparsehash-2.0.2/packages/deb/sparsehash.install +6 -0
- data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/packages/rpm.sh +1 -1
- data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/packages/rpm/rpm.spec +5 -3
- data/ext/{sparsehash-1.8.1/google-sparsehash.sln → sparsehash-2.0.2/sparsehash.sln} +0 -0
- data/ext/sparsehash-2.0.2/src/config.h +132 -0
- data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/src/config.h.in +0 -3
- data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/src/config.h.include +0 -1
- data/ext/sparsehash-2.0.2/src/google/dense_hash_map +34 -0
- data/ext/sparsehash-2.0.2/src/google/dense_hash_set +34 -0
- data/ext/sparsehash-2.0.2/src/google/sparse_hash_map +34 -0
- data/ext/sparsehash-2.0.2/src/google/sparse_hash_set +34 -0
- data/ext/sparsehash-2.0.2/src/google/sparsehash/densehashtable.h +34 -0
- data/ext/sparsehash-2.0.2/src/google/sparsehash/hashtable-common.h +34 -0
- data/ext/sparsehash-2.0.2/src/google/sparsehash/libc_allocator_with_realloc.h +34 -0
- data/ext/sparsehash-2.0.2/src/google/sparsehash/sparsehashtable.h +34 -0
- data/ext/sparsehash-2.0.2/src/google/sparsetable +34 -0
- data/ext/sparsehash-2.0.2/src/google/template_util.h +34 -0
- data/ext/sparsehash-2.0.2/src/google/type_traits.h +34 -0
- data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/src/hash_test_interface.h +64 -37
- data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/src/hashtable_test.cc +415 -141
- data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/src/libc_allocator_with_realloc_test.cc +16 -23
- data/ext/sparsehash-2.0.2/src/simple_compat_test.cc +106 -0
- data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/src/simple_test.cc +8 -5
- data/ext/{sparsehash-1.8.1/src/google → sparsehash-2.0.2/src/sparsehash}/dense_hash_map +80 -37
- data/ext/{sparsehash-1.8.1/src/google → sparsehash-2.0.2/src/sparsehash}/dense_hash_set +64 -34
- data/ext/{sparsehash-1.8.1/src/google/sparsehash → sparsehash-2.0.2/src/sparsehash/internal}/densehashtable.h +247 -173
- data/ext/sparsehash-2.0.2/src/sparsehash/internal/hashtable-common.h +381 -0
- data/ext/{sparsehash-1.8.1/src/google/sparsehash → sparsehash-2.0.2/src/sparsehash/internal}/libc_allocator_with_realloc.h +5 -7
- data/ext/{sparsehash-1.8.1/src/google/sparsehash → sparsehash-2.0.2/src/sparsehash/internal}/sparsehashtable.h +154 -93
- data/ext/{sparsehash-1.8.1/src/google → sparsehash-2.0.2/src/sparsehash}/sparse_hash_map +96 -36
- data/ext/{sparsehash-1.8.1/src/google → sparsehash-2.0.2/src/sparsehash}/sparse_hash_set +85 -32
- data/ext/{sparsehash-1.8.1/src/google → sparsehash-2.0.2/src/sparsehash}/sparsetable +520 -258
- data/ext/sparsehash-2.0.2/src/sparsehash/template_util.h +134 -0
- data/ext/{sparsehash-1.8.1/src/google → sparsehash-2.0.2/src/sparsehash}/type_traits.h +153 -35
- data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/src/sparsetable_unittest.cc +108 -22
- data/ext/sparsehash-2.0.2/src/stamp-h1 +1 -0
- data/ext/sparsehash-2.0.2/src/template_util_unittest.cc +134 -0
- data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/src/testutil.h +16 -1
- data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/src/time_hash_map.cc +259 -94
- data/ext/sparsehash-2.0.2/src/type_traits_unittest.cc +636 -0
- data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/src/windows/config.h +4 -4
- data/ext/sparsehash-2.0.2/src/windows/google/sparsehash/sparseconfig.h +49 -0
- data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/src/windows/port.cc +1 -0
- data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/src/windows/port.h +4 -13
- data/ext/sparsehash-2.0.2/src/windows/sparsehash/internal/sparseconfig.h +49 -0
- data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/vsprojects/hashtable_test/hashtable_test.vcproj +11 -11
- data/ext/sparsehash-2.0.2/vsprojects/libc_allocator_with_realloc_test/libc_allocator_with_realloc_test.vcproj +161 -0
- data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/vsprojects/simple_test/simple_test.vcproj +10 -10
- data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/vsprojects/sparsetable_unittest/sparsetable_unittest.vcproj +4 -4
- data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/vsprojects/time_hash_map/time_hash_map.vcproj +10 -10
- data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/vsprojects/type_traits_unittest/type_traits_unittest.vcproj +3 -3
- data/ext/spec.bat +0 -0
- data/ext/template/google_hash.cpp.erb +6 -5
- metadata +106 -86
- data/ext/sparsehash-1.8.1/AUTHORS +0 -2
- data/ext/sparsehash-1.8.1/INSTALL +0 -236
- data/ext/sparsehash-1.8.1/NEWS +0 -71
- data/ext/sparsehash-1.8.1/compile +0 -99
- data/ext/sparsehash-1.8.1/install-sh +0 -323
- data/ext/sparsehash-1.8.1/m4/stl_namespace.m4 +0 -25
- data/ext/sparsehash-1.8.1/mkinstalldirs +0 -158
- data/ext/sparsehash-1.8.1/packages/deb/sparsehash.dirs +0 -2
- data/ext/sparsehash-1.8.1/packages/deb/sparsehash.install +0 -2
- data/ext/sparsehash-1.8.1/src/google/sparsehash/hashtable-common.h +0 -178
- data/ext/sparsehash-1.8.1/src/type_traits_unittest.cc +0 -502
- data/ext/sparsehash-1.8.1/src/windows/google/sparsehash/sparseconfig.h +0 -32
@@ -1,10 +1,10 @@
|
|
1
1
|
// Copyright (c) 2010, Google Inc.
|
2
2
|
// All rights reserved.
|
3
|
-
//
|
3
|
+
//
|
4
4
|
// Redistribution and use in source and binary forms, with or without
|
5
5
|
// modification, are permitted provided that the following conditions are
|
6
6
|
// met:
|
7
|
-
//
|
7
|
+
//
|
8
8
|
// * Redistributions of source code must retain the above copyright
|
9
9
|
// notice, this list of conditions and the following disclaimer.
|
10
10
|
// * Redistributions in binary form must reproduce the above
|
@@ -14,7 +14,7 @@
|
|
14
14
|
// * Neither the name of Google Inc. nor the names of its
|
15
15
|
// contributors may be used to endorse or promote products derived from
|
16
16
|
// this software without specific prior written permission.
|
17
|
-
//
|
17
|
+
//
|
18
18
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
19
19
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
20
20
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
@@ -28,16 +28,18 @@
|
|
28
28
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
29
29
|
|
30
30
|
// ---
|
31
|
-
// Author: Guilin Chen
|
32
31
|
|
33
|
-
#include
|
34
|
-
#include <
|
32
|
+
#include <sparsehash/internal/sparseconfig.h>
|
33
|
+
#include <config.h>
|
34
|
+
#include <sparsehash/internal/libc_allocator_with_realloc.h>
|
35
35
|
#include <stdlib.h>
|
36
|
-
#include <iostream>
|
37
36
|
#include <string>
|
38
37
|
#include <vector>
|
38
|
+
#include <iostream>
|
39
|
+
#include "testutil.h"
|
39
40
|
|
40
41
|
using std::cerr;
|
42
|
+
using std::cout;
|
41
43
|
using std::string;
|
42
44
|
using std::basic_string;
|
43
45
|
using std::char_traits;
|
@@ -46,14 +48,6 @@ using GOOGLE_NAMESPACE::libc_allocator_with_realloc;
|
|
46
48
|
|
47
49
|
#define arraysize(a) ( sizeof(a) / sizeof(*(a)) )
|
48
50
|
|
49
|
-
#define EXPECT_EQ(a, b) do { \
|
50
|
-
if ((a) != (b)) { \
|
51
|
-
cerr << "Check failed: EXPECTED: " << #a << " == " << #b << ", " \
|
52
|
-
<< "ACTUAL: " << a << " != " << b << "\n"; \
|
53
|
-
exit(1); \
|
54
|
-
} \
|
55
|
-
} while (0)
|
56
|
-
|
57
51
|
namespace {
|
58
52
|
|
59
53
|
typedef libc_allocator_with_realloc<int> int_alloc;
|
@@ -64,8 +58,7 @@ typedef basic_string<char, char_traits<char>,
|
|
64
58
|
libc_allocator_with_realloc<char> > cstring;
|
65
59
|
typedef vector<cstring, libc_allocator_with_realloc<cstring> > cstring_vector;
|
66
60
|
|
67
|
-
|
68
|
-
void TestAllocate() {
|
61
|
+
TEST(LibcAllocatorWithReallocTest, Allocate) {
|
69
62
|
int_alloc alloc;
|
70
63
|
intp_alloc palloc;
|
71
64
|
|
@@ -92,7 +85,7 @@ void TestAllocate() {
|
|
92
85
|
alloc.deallocate(p, 1024);
|
93
86
|
}
|
94
87
|
|
95
|
-
|
88
|
+
TEST(LibcAllocatorWithReallocTest, TestSTL) {
|
96
89
|
// Test strings copied from base/arena_unittest.cc
|
97
90
|
static const char* test_strings[] = {
|
98
91
|
"aback", "abaft", "abandon", "abandoned", "abandoning",
|
@@ -120,10 +113,10 @@ void TestSTL() {
|
|
120
113
|
|
121
114
|
} // namespace
|
122
115
|
|
123
|
-
int main() {
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
cerr << "PASS\n";
|
116
|
+
int main(int, char **) {
|
117
|
+
// All the work is done in the static constructors. If they don't
|
118
|
+
// die, the tests have all passed.
|
119
|
+
cout << "PASS\n";
|
128
120
|
return 0;
|
129
121
|
}
|
122
|
+
|
@@ -0,0 +1,106 @@
|
|
1
|
+
// Copyright (c) 2007, Google Inc.
|
2
|
+
// All rights reserved.
|
3
|
+
//
|
4
|
+
// Redistribution and use in source and binary forms, with or without
|
5
|
+
// modification, are permitted provided that the following conditions are
|
6
|
+
// met:
|
7
|
+
//
|
8
|
+
// * Redistributions of source code must retain the above copyright
|
9
|
+
// notice, this list of conditions and the following disclaimer.
|
10
|
+
// * Redistributions in binary form must reproduce the above
|
11
|
+
// copyright notice, this list of conditions and the following disclaimer
|
12
|
+
// in the documentation and/or other materials provided with the
|
13
|
+
// distribution.
|
14
|
+
// * Neither the name of Google Inc. nor the names of its
|
15
|
+
// contributors may be used to endorse or promote products derived from
|
16
|
+
// this software without specific prior written permission.
|
17
|
+
//
|
18
|
+
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
19
|
+
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
20
|
+
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
21
|
+
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
22
|
+
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
23
|
+
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
24
|
+
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
25
|
+
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
26
|
+
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
27
|
+
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
28
|
+
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
29
|
+
|
30
|
+
// ---
|
31
|
+
//
|
32
|
+
// This tests mostly that we can #include the files correctly
|
33
|
+
// and have them work. It is like simple_test.cc but uses the
|
34
|
+
// compatibility #include directory (google/) rather than the
|
35
|
+
// canonical one (sparsehash/). This unittest purposefully does
|
36
|
+
// not #include <config.h>; it's meant to emulate what a 'regular
|
37
|
+
// install' of sparsehash would be able to see.
|
38
|
+
|
39
|
+
#include <stdio.h>
|
40
|
+
#include <google/sparse_hash_set>
|
41
|
+
#include <google/sparse_hash_map>
|
42
|
+
#include <google/dense_hash_set>
|
43
|
+
#include <google/dense_hash_map>
|
44
|
+
#include <google/template_util.h>
|
45
|
+
#include <google/type_traits.h>
|
46
|
+
|
47
|
+
#define CHECK_IFF(cond, when) do { \
|
48
|
+
if (when) { \
|
49
|
+
if (!(cond)) { \
|
50
|
+
puts("ERROR: " #cond " failed when " #when " is true\n"); \
|
51
|
+
exit(1); \
|
52
|
+
} \
|
53
|
+
} else { \
|
54
|
+
if (cond) { \
|
55
|
+
puts("ERROR: " #cond " succeeded when " #when " is false\n"); \
|
56
|
+
exit(1); \
|
57
|
+
} \
|
58
|
+
} \
|
59
|
+
} while (0)
|
60
|
+
|
61
|
+
int main(int argc, char**) {
|
62
|
+
// Run with an argument to get verbose output
|
63
|
+
const bool verbose = argc > 1;
|
64
|
+
|
65
|
+
google::sparse_hash_set<int> sset;
|
66
|
+
google::sparse_hash_map<int, int> smap;
|
67
|
+
google::dense_hash_set<int> dset;
|
68
|
+
google::dense_hash_map<int, int> dmap;
|
69
|
+
dset.set_empty_key(-1);
|
70
|
+
dmap.set_empty_key(-1);
|
71
|
+
|
72
|
+
for (int i = 0; i < 100; i += 10) { // go by tens
|
73
|
+
sset.insert(i);
|
74
|
+
smap[i] = i+1;
|
75
|
+
dset.insert(i + 5);
|
76
|
+
dmap[i+5] = i+6;
|
77
|
+
}
|
78
|
+
|
79
|
+
if (verbose) {
|
80
|
+
for (google::sparse_hash_set<int>::const_iterator it = sset.begin();
|
81
|
+
it != sset.end(); ++it)
|
82
|
+
printf("sset: %d\n", *it);
|
83
|
+
for (google::sparse_hash_map<int,int>::const_iterator it = smap.begin();
|
84
|
+
it != smap.end(); ++it)
|
85
|
+
printf("smap: %d -> %d\n", it->first, it->second);
|
86
|
+
for (google::dense_hash_set<int>::const_iterator it = dset.begin();
|
87
|
+
it != dset.end(); ++it)
|
88
|
+
printf("dset: %d\n", *it);
|
89
|
+
for (google::dense_hash_map<int,int>::const_iterator it = dmap.begin();
|
90
|
+
it != dmap.end(); ++it)
|
91
|
+
printf("dmap: %d -> %d\n", it->first, it->second);
|
92
|
+
}
|
93
|
+
|
94
|
+
for (int i = 0; i < 100; i++) {
|
95
|
+
CHECK_IFF(sset.find(i) != sset.end(), (i % 10) == 0);
|
96
|
+
CHECK_IFF(smap.find(i) != smap.end(), (i % 10) == 0);
|
97
|
+
CHECK_IFF(smap.find(i) != smap.end() && smap.find(i)->second == i+1,
|
98
|
+
(i % 10) == 0);
|
99
|
+
CHECK_IFF(dset.find(i) != dset.end(), (i % 10) == 5);
|
100
|
+
CHECK_IFF(dmap.find(i) != dmap.end(), (i % 10) == 5);
|
101
|
+
CHECK_IFF(dmap.find(i) != dmap.end() && dmap.find(i)->second == i+1,
|
102
|
+
(i % 10) == 5);
|
103
|
+
}
|
104
|
+
printf("PASS\n");
|
105
|
+
return 0;
|
106
|
+
}
|
@@ -28,18 +28,21 @@
|
|
28
28
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
29
29
|
|
30
30
|
// ---
|
31
|
-
// Author: Craig Silverstein
|
32
31
|
//
|
33
32
|
// This tests mostly that we can #include the files correctly
|
34
33
|
// and have them work. This unittest purposefully does not
|
35
34
|
// #include <config.h>; it's meant to emulate what a 'regular
|
36
35
|
// install' of sparsehash would be able to see.
|
37
36
|
|
37
|
+
#include <sparsehash/internal/sparseconfig.h>
|
38
|
+
#include <config.h>
|
38
39
|
#include <stdio.h>
|
39
|
-
#include <
|
40
|
-
#include <
|
41
|
-
#include <
|
42
|
-
#include <
|
40
|
+
#include <sparsehash/sparse_hash_set>
|
41
|
+
#include <sparsehash/sparse_hash_map>
|
42
|
+
#include <sparsehash/dense_hash_set>
|
43
|
+
#include <sparsehash/dense_hash_map>
|
44
|
+
#include <sparsehash/template_util.h>
|
45
|
+
#include <sparsehash/type_traits.h>
|
43
46
|
|
44
47
|
#define CHECK_IFF(cond, when) do { \
|
45
48
|
if (when) { \
|
@@ -1,10 +1,10 @@
|
|
1
1
|
// Copyright (c) 2005, Google Inc.
|
2
2
|
// All rights reserved.
|
3
|
-
//
|
3
|
+
//
|
4
4
|
// Redistribution and use in source and binary forms, with or without
|
5
5
|
// modification, are permitted provided that the following conditions are
|
6
6
|
// met:
|
7
|
-
//
|
7
|
+
//
|
8
8
|
// * Redistributions of source code must retain the above copyright
|
9
9
|
// notice, this list of conditions and the following disclaimer.
|
10
10
|
// * Redistributions in binary form must reproduce the above
|
@@ -14,7 +14,7 @@
|
|
14
14
|
// * Neither the name of Google Inc. nor the names of its
|
15
15
|
// contributors may be used to endorse or promote products derived from
|
16
16
|
// this software without specific prior written permission.
|
17
|
-
//
|
17
|
+
//
|
18
18
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
19
19
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
20
20
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
@@ -28,7 +28,6 @@
|
|
28
28
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
29
29
|
|
30
30
|
// ----
|
31
|
-
// Author: Craig Silverstein
|
32
31
|
//
|
33
32
|
// This is just a very thin wrapper over densehashtable.h, just
|
34
33
|
// like sgi stl's stl_hash_map is a very thin wrapper over
|
@@ -97,35 +96,31 @@
|
|
97
96
|
#ifndef _DENSE_HASH_MAP_H_
|
98
97
|
#define _DENSE_HASH_MAP_H_
|
99
98
|
|
100
|
-
#include <
|
101
|
-
#include <
|
102
|
-
#include <
|
103
|
-
#include <
|
104
|
-
#include <
|
105
|
-
#include <
|
106
|
-
#include
|
107
|
-
#include
|
108
|
-
#include <google/sparsehash/densehashtable.h>
|
109
|
-
|
110
|
-
|
99
|
+
#include <sparsehash/internal/sparseconfig.h>
|
100
|
+
#include <algorithm> // needed by stl_alloc
|
101
|
+
#include <functional> // for equal_to<>, select1st<>, etc
|
102
|
+
#include <memory> // for alloc
|
103
|
+
#include <utility> // for pair<>
|
104
|
+
#include <sparsehash/internal/densehashtable.h> // IWYU pragma: export
|
105
|
+
#include <sparsehash/internal/libc_allocator_with_realloc.h>
|
106
|
+
#include HASH_FUN_H // for hash<>
|
111
107
|
_START_GOOGLE_NAMESPACE_
|
112
108
|
|
113
|
-
using STL_NAMESPACE::pair;
|
114
|
-
|
115
109
|
template <class Key, class T,
|
116
110
|
class HashFcn = SPARSEHASH_HASH<Key>, // defined in sparseconfig.h
|
117
|
-
class EqualKey =
|
118
|
-
class Alloc = libc_allocator_with_realloc<pair<const Key, T> > >
|
111
|
+
class EqualKey = std::equal_to<Key>,
|
112
|
+
class Alloc = libc_allocator_with_realloc<std::pair<const Key, T> > >
|
119
113
|
class dense_hash_map {
|
120
114
|
private:
|
121
115
|
// Apparently select1st is not stl-standard, so we define our own
|
122
116
|
struct SelectKey {
|
123
|
-
const Key&
|
117
|
+
typedef const Key& result_type;
|
118
|
+
const Key& operator()(const std::pair<const Key, T>& p) const {
|
124
119
|
return p.first;
|
125
120
|
}
|
126
121
|
};
|
127
122
|
struct SetKey {
|
128
|
-
void operator()(pair<const Key, T>* value, const Key& new_key) const {
|
123
|
+
void operator()(std::pair<const Key, T>* value, const Key& new_key) const {
|
129
124
|
*const_cast<Key*>(&value->first) = new_key;
|
130
125
|
// It would be nice to clear the rest of value here as well, in
|
131
126
|
// case it's taking up a lot of memory. We do this by clearing
|
@@ -133,9 +128,15 @@ class dense_hash_map {
|
|
133
128
|
value->second = T();
|
134
129
|
}
|
135
130
|
};
|
131
|
+
// For operator[].
|
132
|
+
struct DefaultValue {
|
133
|
+
std::pair<const Key, T> operator()(const Key& key) {
|
134
|
+
return std::make_pair(key, T());
|
135
|
+
}
|
136
|
+
};
|
136
137
|
|
137
138
|
// The actual data
|
138
|
-
typedef dense_hashtable<pair<const Key, T>, Key, HashFcn, SelectKey,
|
139
|
+
typedef dense_hashtable<std::pair<const Key, T>, Key, HashFcn, SelectKey,
|
139
140
|
SetKey, EqualKey, Alloc> ht;
|
140
141
|
ht rep;
|
141
142
|
|
@@ -260,26 +261,34 @@ class dense_hash_map {
|
|
260
261
|
// If key is in the hashtable, returns find(key)->second,
|
261
262
|
// otherwise returns insert(value_type(key, T()).first->second.
|
262
263
|
// Note it does not create an empty T unless the find fails.
|
263
|
-
return rep.template find_or_insert<
|
264
|
+
return rep.template find_or_insert<DefaultValue>(key).second;
|
264
265
|
}
|
265
266
|
|
266
267
|
size_type count(const key_type& key) const { return rep.count(key); }
|
267
268
|
|
268
|
-
pair<iterator, iterator> equal_range(const key_type& key) {
|
269
|
+
std::pair<iterator, iterator> equal_range(const key_type& key) {
|
269
270
|
return rep.equal_range(key);
|
270
271
|
}
|
271
|
-
pair<const_iterator, const_iterator> equal_range(const key_type& key)
|
272
|
+
std::pair<const_iterator, const_iterator> equal_range(const key_type& key)
|
273
|
+
const {
|
272
274
|
return rep.equal_range(key);
|
273
275
|
}
|
274
276
|
|
275
|
-
// Insertion routines
|
276
|
-
pair<iterator, bool> insert(const value_type& obj) { return rep.insert(obj); }
|
277
|
-
template <class InputIterator>
|
278
|
-
void insert(InputIterator f, InputIterator l) { rep.insert(f, l); }
|
279
|
-
void insert(const_iterator f, const_iterator l) { rep.insert(f, l); }
|
280
|
-
// required for std::insert_iterator; the passed-in iterator is ignored
|
281
|
-
iterator insert(iterator, const value_type& obj) { return insert(obj).first; }
|
282
277
|
|
278
|
+
// Insertion routines
|
279
|
+
std::pair<iterator, bool> insert(const value_type& obj) {
|
280
|
+
return rep.insert(obj);
|
281
|
+
}
|
282
|
+
template <class InputIterator> void insert(InputIterator f, InputIterator l) {
|
283
|
+
rep.insert(f, l);
|
284
|
+
}
|
285
|
+
void insert(const_iterator f, const_iterator l) {
|
286
|
+
rep.insert(f, l);
|
287
|
+
}
|
288
|
+
// Required for std::insert_iterator; the passed-in iterator is ignored.
|
289
|
+
iterator insert(iterator, const value_type& obj) {
|
290
|
+
return insert(obj).first;
|
291
|
+
}
|
283
292
|
|
284
293
|
// Deletion and empty routines
|
285
294
|
// THESE ARE NON-STANDARD! I make you specify an "impossible" key
|
@@ -307,11 +316,45 @@ class dense_hash_map {
|
|
307
316
|
bool operator!=(const dense_hash_map& hs) const { return rep != hs.rep; }
|
308
317
|
|
309
318
|
|
310
|
-
// I/O -- this is an add-on for writing
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
319
|
+
// I/O -- this is an add-on for writing hash map to disk
|
320
|
+
//
|
321
|
+
// For maximum flexibility, this does not assume a particular
|
322
|
+
// file type (though it will probably be a FILE *). We just pass
|
323
|
+
// the fp through to rep.
|
324
|
+
|
325
|
+
// If your keys and values are simple enough, you can pass this
|
326
|
+
// serializer to serialize()/unserialize(). "Simple enough" means
|
327
|
+
// value_type is a POD type that contains no pointers. Note,
|
328
|
+
// however, we don't try to normalize endianness.
|
329
|
+
typedef typename ht::NopointerSerializer NopointerSerializer;
|
330
|
+
|
331
|
+
// serializer: a class providing operator()(OUTPUT*, const value_type&)
|
332
|
+
// (writing value_type to OUTPUT). You can specify a
|
333
|
+
// NopointerSerializer object if appropriate (see above).
|
334
|
+
// fp: either a FILE*, OR an ostream*/subclass_of_ostream*, OR a
|
335
|
+
// pointer to a class providing size_t Write(const void*, size_t),
|
336
|
+
// which writes a buffer into a stream (which fp presumably
|
337
|
+
// owns) and returns the number of bytes successfully written.
|
338
|
+
// Note basic_ostream<not_char> is not currently supported.
|
339
|
+
template <typename ValueSerializer, typename OUTPUT>
|
340
|
+
bool serialize(ValueSerializer serializer, OUTPUT* fp) {
|
341
|
+
return rep.serialize(serializer, fp);
|
342
|
+
}
|
343
|
+
|
344
|
+
// serializer: a functor providing operator()(INPUT*, value_type*)
|
345
|
+
// (reading from INPUT and into value_type). You can specify a
|
346
|
+
// NopointerSerializer object if appropriate (see above).
|
347
|
+
// fp: either a FILE*, OR an istream*/subclass_of_istream*, OR a
|
348
|
+
// pointer to a class providing size_t Read(void*, size_t),
|
349
|
+
// which reads into a buffer from a stream (which fp presumably
|
350
|
+
// owns) and returns the number of bytes successfully read.
|
351
|
+
// Note basic_istream<not_char> is not currently supported.
|
352
|
+
// NOTE: Since value_type is std::pair<const Key, T>, ValueSerializer
|
353
|
+
// may need to do a const cast in order to fill in the key.
|
354
|
+
template <typename ValueSerializer, typename INPUT>
|
355
|
+
bool unserialize(ValueSerializer serializer, INPUT* fp) {
|
356
|
+
return rep.unserialize(serializer, fp);
|
357
|
+
}
|
315
358
|
};
|
316
359
|
|
317
360
|
// We need a global swap as well
|
@@ -1,10 +1,10 @@
|
|
1
1
|
// Copyright (c) 2005, Google Inc.
|
2
2
|
// All rights reserved.
|
3
|
-
//
|
3
|
+
//
|
4
4
|
// Redistribution and use in source and binary forms, with or without
|
5
5
|
// modification, are permitted provided that the following conditions are
|
6
6
|
// met:
|
7
|
-
//
|
7
|
+
//
|
8
8
|
// * Redistributions of source code must retain the above copyright
|
9
9
|
// notice, this list of conditions and the following disclaimer.
|
10
10
|
// * Redistributions in binary form must reproduce the above
|
@@ -14,7 +14,7 @@
|
|
14
14
|
// * Neither the name of Google Inc. nor the names of its
|
15
15
|
// contributors may be used to endorse or promote products derived from
|
16
16
|
// this software without specific prior written permission.
|
17
|
-
//
|
17
|
+
//
|
18
18
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
19
19
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
20
20
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
@@ -28,7 +28,6 @@
|
|
28
28
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
29
29
|
|
30
30
|
// ---
|
31
|
-
// Author: Craig Silverstein
|
32
31
|
//
|
33
32
|
// This is just a very thin wrapper over densehashtable.h, just
|
34
33
|
// like sgi stl's stl_hash_set is a very thin wrapper over
|
@@ -101,30 +100,25 @@
|
|
101
100
|
#ifndef _DENSE_HASH_SET_H_
|
102
101
|
#define _DENSE_HASH_SET_H_
|
103
102
|
|
104
|
-
#include <
|
105
|
-
#include <
|
106
|
-
#include <
|
107
|
-
#include <
|
108
|
-
#include <
|
109
|
-
#include <
|
110
|
-
#include
|
111
|
-
#include
|
112
|
-
#include <google/sparsehash/densehashtable.h>
|
113
|
-
|
114
|
-
|
103
|
+
#include <sparsehash/internal/sparseconfig.h>
|
104
|
+
#include <algorithm> // needed by stl_alloc
|
105
|
+
#include <functional> // for equal_to<>, select1st<>, etc
|
106
|
+
#include <memory> // for alloc
|
107
|
+
#include <utility> // for pair<>
|
108
|
+
#include <sparsehash/internal/densehashtable.h> // IWYU pragma: export
|
109
|
+
#include <sparsehash/internal/libc_allocator_with_realloc.h>
|
110
|
+
#include HASH_FUN_H // for hash<>
|
115
111
|
_START_GOOGLE_NAMESPACE_
|
116
112
|
|
117
|
-
using STL_NAMESPACE::pair;
|
118
|
-
|
119
113
|
template <class Value,
|
120
|
-
class HashFcn = SPARSEHASH_HASH<Value>,
|
121
|
-
class EqualKey =
|
114
|
+
class HashFcn = SPARSEHASH_HASH<Value>, // defined in sparseconfig.h
|
115
|
+
class EqualKey = std::equal_to<Value>,
|
122
116
|
class Alloc = libc_allocator_with_realloc<Value> >
|
123
117
|
class dense_hash_set {
|
124
118
|
private:
|
125
119
|
// Apparently identity is not stl-standard, so we define our own
|
126
120
|
struct Identity {
|
127
|
-
|
121
|
+
typedef const Value& result_type;
|
128
122
|
const Value& operator()(const Value& v) const { return v; }
|
129
123
|
};
|
130
124
|
struct SetKey {
|
@@ -251,22 +245,26 @@ class dense_hash_set {
|
|
251
245
|
|
252
246
|
size_type count(const key_type& key) const { return rep.count(key); }
|
253
247
|
|
254
|
-
pair<iterator, iterator> equal_range(const key_type& key) const {
|
248
|
+
std::pair<iterator, iterator> equal_range(const key_type& key) const {
|
255
249
|
return rep.equal_range(key);
|
256
250
|
}
|
257
251
|
|
258
252
|
|
259
253
|
// Insertion routines
|
260
|
-
pair<iterator, bool> insert(const value_type& obj) {
|
261
|
-
pair<typename ht::iterator, bool> p = rep.insert(obj);
|
262
|
-
return pair<iterator, bool>(p.first, p.second); // const to non-const
|
254
|
+
std::pair<iterator, bool> insert(const value_type& obj) {
|
255
|
+
std::pair<typename ht::iterator, bool> p = rep.insert(obj);
|
256
|
+
return std::pair<iterator, bool>(p.first, p.second); // const to non-const
|
257
|
+
}
|
258
|
+
template <class InputIterator> void insert(InputIterator f, InputIterator l) {
|
259
|
+
rep.insert(f, l);
|
260
|
+
}
|
261
|
+
void insert(const_iterator f, const_iterator l) {
|
262
|
+
rep.insert(f, l);
|
263
|
+
}
|
264
|
+
// Required for std::insert_iterator; the passed-in iterator is ignored.
|
265
|
+
iterator insert(iterator, const value_type& obj) {
|
266
|
+
return insert(obj).first;
|
263
267
|
}
|
264
|
-
template <class InputIterator>
|
265
|
-
void insert(InputIterator f, InputIterator l) { rep.insert(f, l); }
|
266
|
-
void insert(const_iterator f, const_iterator l) { rep.insert(f, l); }
|
267
|
-
// required for std::insert_iterator; the passed-in iterator is ignored
|
268
|
-
iterator insert(iterator, const value_type& obj) { return insert(obj).first; }
|
269
|
-
|
270
268
|
|
271
269
|
// Deletion and empty routines
|
272
270
|
// THESE ARE NON-STANDARD! I make you specify an "impossible" key
|
@@ -291,10 +289,42 @@ class dense_hash_set {
|
|
291
289
|
|
292
290
|
|
293
291
|
// I/O -- this is an add-on for writing metainformation to disk
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
292
|
+
//
|
293
|
+
// For maximum flexibility, this does not assume a particular
|
294
|
+
// file type (though it will probably be a FILE *). We just pass
|
295
|
+
// the fp through to rep.
|
296
|
+
|
297
|
+
// If your keys and values are simple enough, you can pass this
|
298
|
+
// serializer to serialize()/unserialize(). "Simple enough" means
|
299
|
+
// value_type is a POD type that contains no pointers. Note,
|
300
|
+
// however, we don't try to normalize endianness.
|
301
|
+
typedef typename ht::NopointerSerializer NopointerSerializer;
|
302
|
+
|
303
|
+
// serializer: a class providing operator()(OUTPUT*, const value_type&)
|
304
|
+
// (writing value_type to OUTPUT). You can specify a
|
305
|
+
// NopointerSerializer object if appropriate (see above).
|
306
|
+
// fp: either a FILE*, OR an ostream*/subclass_of_ostream*, OR a
|
307
|
+
// pointer to a class providing size_t Write(const void*, size_t),
|
308
|
+
// which writes a buffer into a stream (which fp presumably
|
309
|
+
// owns) and returns the number of bytes successfully written.
|
310
|
+
// Note basic_ostream<not_char> is not currently supported.
|
311
|
+
template <typename ValueSerializer, typename OUTPUT>
|
312
|
+
bool serialize(ValueSerializer serializer, OUTPUT* fp) {
|
313
|
+
return rep.serialize(serializer, fp);
|
314
|
+
}
|
315
|
+
|
316
|
+
// serializer: a functor providing operator()(INPUT*, value_type*)
|
317
|
+
// (reading from INPUT and into value_type). You can specify a
|
318
|
+
// NopointerSerializer object if appropriate (see above).
|
319
|
+
// fp: either a FILE*, OR an istream*/subclass_of_istream*, OR a
|
320
|
+
// pointer to a class providing size_t Read(void*, size_t),
|
321
|
+
// which reads into a buffer from a stream (which fp presumably
|
322
|
+
// owns) and returns the number of bytes successfully read.
|
323
|
+
// Note basic_istream<not_char> is not currently supported.
|
324
|
+
template <typename ValueSerializer, typename INPUT>
|
325
|
+
bool unserialize(ValueSerializer serializer, INPUT* fp) {
|
326
|
+
return rep.unserialize(serializer, fp);
|
327
|
+
}
|
298
328
|
};
|
299
329
|
|
300
330
|
template <class Val, class HashFcn, class EqualKey, class Alloc>
|