google_hash 0.8.1 → 0.8.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (121) hide show
  1. data/ChangeLog.txt +2 -0
  2. data/VERSION +1 -1
  3. data/ext/clean.bat +0 -0
  4. data/ext/clean.sh +4 -0
  5. data/ext/extconf.rb +4 -5
  6. data/ext/go.bat +0 -0
  7. data/ext/sparsehash-2.0.2/AUTHORS +2 -0
  8. data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/COPYING +0 -0
  9. data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/ChangeLog +60 -0
  10. data/ext/sparsehash-2.0.2/INSTALL +365 -0
  11. data/ext/sparsehash-2.0.2/Makefile +1336 -0
  12. data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/Makefile.am +97 -40
  13. data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/Makefile.in +538 -256
  14. data/ext/sparsehash-2.0.2/NEWS +188 -0
  15. data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/README +4 -10
  16. data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/README_windows.txt +3 -3
  17. data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/TODO +0 -0
  18. data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/aclocal.m4 +266 -166
  19. data/ext/sparsehash-2.0.2/allocator.patch +31 -0
  20. data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/config.guess +235 -234
  21. data/ext/sparsehash-2.0.2/config.status +1238 -0
  22. data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/config.sub +198 -64
  23. data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/configure +1118 -1000
  24. data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/configure.ac +4 -5
  25. data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/depcomp +136 -36
  26. data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/doc/dense_hash_map.html +182 -67
  27. data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/doc/dense_hash_set.html +173 -74
  28. data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/doc/designstyle.css +0 -6
  29. data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/doc/implementation.html +0 -0
  30. data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/doc/index.html +4 -5
  31. data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/doc/performance.html +1 -1
  32. data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/doc/sparse_hash_map.html +190 -58
  33. data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/doc/sparse_hash_set.html +180 -65
  34. data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/doc/sparsetable.html +1 -1
  35. data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/experimental/Makefile +0 -0
  36. data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/experimental/README +0 -0
  37. data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/experimental/example.c +1 -0
  38. data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/experimental/libchash.c +1 -0
  39. data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/experimental/libchash.h +1 -0
  40. data/ext/sparsehash-2.0.2/install-sh +520 -0
  41. data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/m4/acx_pthread.m4 +34 -0
  42. data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/m4/google_namespace.m4 +0 -0
  43. data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/m4/namespaces.m4 +0 -0
  44. data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/m4/stl_hash.m4 +0 -0
  45. data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/m4/stl_hash_fun.m4 +0 -0
  46. data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/missing +60 -44
  47. data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/packages/deb.sh +0 -0
  48. data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/packages/deb/README +0 -0
  49. data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/packages/deb/changelog +42 -0
  50. data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/packages/deb/compat +0 -0
  51. data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/packages/deb/control +1 -1
  52. data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/packages/deb/copyright +5 -4
  53. data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/packages/deb/docs +0 -0
  54. data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/packages/deb/rules +0 -0
  55. data/ext/sparsehash-2.0.2/packages/deb/sparsehash.dirs +5 -0
  56. data/ext/sparsehash-2.0.2/packages/deb/sparsehash.install +6 -0
  57. data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/packages/rpm.sh +1 -1
  58. data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/packages/rpm/rpm.spec +5 -3
  59. data/ext/{sparsehash-1.8.1/google-sparsehash.sln → sparsehash-2.0.2/sparsehash.sln} +0 -0
  60. data/ext/sparsehash-2.0.2/src/config.h +132 -0
  61. data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/src/config.h.in +0 -3
  62. data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/src/config.h.include +0 -1
  63. data/ext/sparsehash-2.0.2/src/google/dense_hash_map +34 -0
  64. data/ext/sparsehash-2.0.2/src/google/dense_hash_set +34 -0
  65. data/ext/sparsehash-2.0.2/src/google/sparse_hash_map +34 -0
  66. data/ext/sparsehash-2.0.2/src/google/sparse_hash_set +34 -0
  67. data/ext/sparsehash-2.0.2/src/google/sparsehash/densehashtable.h +34 -0
  68. data/ext/sparsehash-2.0.2/src/google/sparsehash/hashtable-common.h +34 -0
  69. data/ext/sparsehash-2.0.2/src/google/sparsehash/libc_allocator_with_realloc.h +34 -0
  70. data/ext/sparsehash-2.0.2/src/google/sparsehash/sparsehashtable.h +34 -0
  71. data/ext/sparsehash-2.0.2/src/google/sparsetable +34 -0
  72. data/ext/sparsehash-2.0.2/src/google/template_util.h +34 -0
  73. data/ext/sparsehash-2.0.2/src/google/type_traits.h +34 -0
  74. data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/src/hash_test_interface.h +64 -37
  75. data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/src/hashtable_test.cc +415 -141
  76. data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/src/libc_allocator_with_realloc_test.cc +16 -23
  77. data/ext/sparsehash-2.0.2/src/simple_compat_test.cc +106 -0
  78. data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/src/simple_test.cc +8 -5
  79. data/ext/{sparsehash-1.8.1/src/google → sparsehash-2.0.2/src/sparsehash}/dense_hash_map +80 -37
  80. data/ext/{sparsehash-1.8.1/src/google → sparsehash-2.0.2/src/sparsehash}/dense_hash_set +64 -34
  81. data/ext/{sparsehash-1.8.1/src/google/sparsehash → sparsehash-2.0.2/src/sparsehash/internal}/densehashtable.h +247 -173
  82. data/ext/sparsehash-2.0.2/src/sparsehash/internal/hashtable-common.h +381 -0
  83. data/ext/{sparsehash-1.8.1/src/google/sparsehash → sparsehash-2.0.2/src/sparsehash/internal}/libc_allocator_with_realloc.h +5 -7
  84. data/ext/{sparsehash-1.8.1/src/google/sparsehash → sparsehash-2.0.2/src/sparsehash/internal}/sparsehashtable.h +154 -93
  85. data/ext/{sparsehash-1.8.1/src/google → sparsehash-2.0.2/src/sparsehash}/sparse_hash_map +96 -36
  86. data/ext/{sparsehash-1.8.1/src/google → sparsehash-2.0.2/src/sparsehash}/sparse_hash_set +85 -32
  87. data/ext/{sparsehash-1.8.1/src/google → sparsehash-2.0.2/src/sparsehash}/sparsetable +520 -258
  88. data/ext/sparsehash-2.0.2/src/sparsehash/template_util.h +134 -0
  89. data/ext/{sparsehash-1.8.1/src/google → sparsehash-2.0.2/src/sparsehash}/type_traits.h +153 -35
  90. data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/src/sparsetable_unittest.cc +108 -22
  91. data/ext/sparsehash-2.0.2/src/stamp-h1 +1 -0
  92. data/ext/sparsehash-2.0.2/src/template_util_unittest.cc +134 -0
  93. data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/src/testutil.h +16 -1
  94. data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/src/time_hash_map.cc +259 -94
  95. data/ext/sparsehash-2.0.2/src/type_traits_unittest.cc +636 -0
  96. data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/src/windows/config.h +4 -4
  97. data/ext/sparsehash-2.0.2/src/windows/google/sparsehash/sparseconfig.h +49 -0
  98. data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/src/windows/port.cc +1 -0
  99. data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/src/windows/port.h +4 -13
  100. data/ext/sparsehash-2.0.2/src/windows/sparsehash/internal/sparseconfig.h +49 -0
  101. data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/vsprojects/hashtable_test/hashtable_test.vcproj +11 -11
  102. data/ext/sparsehash-2.0.2/vsprojects/libc_allocator_with_realloc_test/libc_allocator_with_realloc_test.vcproj +161 -0
  103. data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/vsprojects/simple_test/simple_test.vcproj +10 -10
  104. data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/vsprojects/sparsetable_unittest/sparsetable_unittest.vcproj +4 -4
  105. data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/vsprojects/time_hash_map/time_hash_map.vcproj +10 -10
  106. data/ext/{sparsehash-1.8.1 → sparsehash-2.0.2}/vsprojects/type_traits_unittest/type_traits_unittest.vcproj +3 -3
  107. data/ext/spec.bat +0 -0
  108. data/ext/template/google_hash.cpp.erb +6 -5
  109. metadata +106 -86
  110. data/ext/sparsehash-1.8.1/AUTHORS +0 -2
  111. data/ext/sparsehash-1.8.1/INSTALL +0 -236
  112. data/ext/sparsehash-1.8.1/NEWS +0 -71
  113. data/ext/sparsehash-1.8.1/compile +0 -99
  114. data/ext/sparsehash-1.8.1/install-sh +0 -323
  115. data/ext/sparsehash-1.8.1/m4/stl_namespace.m4 +0 -25
  116. data/ext/sparsehash-1.8.1/mkinstalldirs +0 -158
  117. data/ext/sparsehash-1.8.1/packages/deb/sparsehash.dirs +0 -2
  118. data/ext/sparsehash-1.8.1/packages/deb/sparsehash.install +0 -2
  119. data/ext/sparsehash-1.8.1/src/google/sparsehash/hashtable-common.h +0 -178
  120. data/ext/sparsehash-1.8.1/src/type_traits_unittest.cc +0 -502
  121. data/ext/sparsehash-1.8.1/src/windows/google/sparsehash/sparseconfig.h +0 -32
@@ -0,0 +1,134 @@
1
+ // Copyright 2005 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
+ // Template metaprogramming utility functions.
33
+ //
34
+ // This code is compiled directly on many platforms, including client
35
+ // platforms like Windows, Mac, and embedded systems. Before making
36
+ // any changes here, make sure that you're not breaking any platforms.
37
+ //
38
+ //
39
+ // The names choosen here reflect those used in tr1 and the boost::mpl
40
+ // library, there are similar operations used in the Loki library as
41
+ // well. I prefer the boost names for 2 reasons:
42
+ // 1. I think that portions of the Boost libraries are more likely to
43
+ // be included in the c++ standard.
44
+ // 2. It is not impossible that some of the boost libraries will be
45
+ // included in our own build in the future.
46
+ // Both of these outcomes means that we may be able to directly replace
47
+ // some of these with boost equivalents.
48
+ //
49
+ #ifndef BASE_TEMPLATE_UTIL_H_
50
+ #define BASE_TEMPLATE_UTIL_H_
51
+
52
+ #include <sparsehash/internal/sparseconfig.h>
53
+ _START_GOOGLE_NAMESPACE_
54
+
55
+ // Types small_ and big_ are guaranteed such that sizeof(small_) <
56
+ // sizeof(big_)
57
+ typedef char small_;
58
+
59
+ struct big_ {
60
+ char dummy[2];
61
+ };
62
+
63
+ // Identity metafunction.
64
+ template <class T>
65
+ struct identity_ {
66
+ typedef T type;
67
+ };
68
+
69
+ // integral_constant, defined in tr1, is a wrapper for an integer
70
+ // value. We don't really need this generality; we could get away
71
+ // with hardcoding the integer type to bool. We use the fully
72
+ // general integer_constant for compatibility with tr1.
73
+
74
+ template<class T, T v>
75
+ struct integral_constant {
76
+ static const T value = v;
77
+ typedef T value_type;
78
+ typedef integral_constant<T, v> type;
79
+ };
80
+
81
+ template <class T, T v> const T integral_constant<T, v>::value;
82
+
83
+
84
+ // Abbreviations: true_type and false_type are structs that represent boolean
85
+ // true and false values. Also define the boost::mpl versions of those names,
86
+ // true_ and false_.
87
+ typedef integral_constant<bool, true> true_type;
88
+ typedef integral_constant<bool, false> false_type;
89
+ typedef true_type true_;
90
+ typedef false_type false_;
91
+
92
+ // if_ is a templatized conditional statement.
93
+ // if_<cond, A, B> is a compile time evaluation of cond.
94
+ // if_<>::type contains A if cond is true, B otherwise.
95
+ template<bool cond, typename A, typename B>
96
+ struct if_{
97
+ typedef A type;
98
+ };
99
+
100
+ template<typename A, typename B>
101
+ struct if_<false, A, B> {
102
+ typedef B type;
103
+ };
104
+
105
+
106
+ // type_equals_ is a template type comparator, similar to Loki IsSameType.
107
+ // type_equals_<A, B>::value is true iff "A" is the same type as "B".
108
+ //
109
+ // New code should prefer base::is_same, defined in base/type_traits.h.
110
+ // It is functionally identical, but is_same is the standard spelling.
111
+ template<typename A, typename B>
112
+ struct type_equals_ : public false_ {
113
+ };
114
+
115
+ template<typename A>
116
+ struct type_equals_<A, A> : public true_ {
117
+ };
118
+
119
+ // and_ is a template && operator.
120
+ // and_<A, B>::value evaluates "A::value && B::value".
121
+ template<typename A, typename B>
122
+ struct and_ : public integral_constant<bool, (A::value && B::value)> {
123
+ };
124
+
125
+ // or_ is a template || operator.
126
+ // or_<A, B>::value evaluates "A::value || B::value".
127
+ template<typename A, typename B>
128
+ struct or_ : public integral_constant<bool, (A::value || B::value)> {
129
+ };
130
+
131
+
132
+ _END_GOOGLE_NAMESPACE_
133
+
134
+ #endif // BASE_TEMPLATE_UTIL_H_
@@ -28,12 +28,16 @@
28
28
  // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
29
 
30
30
  // ----
31
- // Author: Matt Austern
31
+ //
32
+ // This code is compiled directly on many platforms, including client
33
+ // platforms like Windows, Mac, and embedded systems. Before making
34
+ // any changes here, make sure that you're not breaking any platforms.
32
35
  //
33
36
  // Define a small subset of tr1 type traits. The traits we define are:
34
37
  // is_integral
35
38
  // is_floating_point
36
39
  // is_pointer
40
+ // is_enum
37
41
  // is_reference
38
42
  // is_pod
39
43
  // has_trivial_constructor
@@ -44,6 +48,7 @@
44
48
  // remove_volatile
45
49
  // remove_cv
46
50
  // remove_reference
51
+ // add_reference
47
52
  // remove_pointer
48
53
  // is_same
49
54
  // is_convertible
@@ -52,39 +57,40 @@
52
57
  #ifndef BASE_TYPE_TRAITS_H_
53
58
  #define BASE_TYPE_TRAITS_H_
54
59
 
55
- #include <google/sparsehash/sparseconfig.h>
60
+ #include <sparsehash/internal/sparseconfig.h>
56
61
  #include <utility> // For pair
57
62
 
58
- _START_GOOGLE_NAMESPACE_
59
-
60
- // integral_constant, defined in tr1, is a wrapper for an integer
61
- // value. We don't really need this generality; we could get away
62
- // with hardcoding the integer type to bool. We use the fully
63
- // general integer_constant for compatibility with tr1.
64
-
65
- template<class T, T v>
66
- struct integral_constant {
67
- static const T value = v;
68
- typedef T value_type;
69
- typedef integral_constant<T, v> type;
70
- };
71
-
72
- template <class T, T v> const T integral_constant<T, v>::value;
73
-
74
- // Abbreviations: true_type and false_type are structs that represent
75
- // boolean true and false values.
76
- typedef integral_constant<bool, true> true_type;
77
- typedef integral_constant<bool, false> false_type;
63
+ #include <sparsehash/template_util.h> // For true_type and false_type
78
64
 
79
- // Types small_ and big_ are guaranteed such that sizeof(small_) <
80
- // sizeof(big_)
81
- typedef char small_;
65
+ _START_GOOGLE_NAMESPACE_
82
66
 
83
- struct big_ {
84
- char dummy[2];
85
- };
67
+ template <class T> struct is_integral;
68
+ template <class T> struct is_floating_point;
69
+ template <class T> struct is_pointer;
70
+ // MSVC can't compile this correctly, and neither can gcc 3.3.5 (at least)
71
+ #if !defined(_MSC_VER) && !(defined(__GNUC__) && __GNUC__ <= 3)
72
+ // is_enum uses is_convertible, which is not available on MSVC.
73
+ template <class T> struct is_enum;
74
+ #endif
75
+ template <class T> struct is_reference;
76
+ template <class T> struct is_pod;
77
+ template <class T> struct has_trivial_constructor;
78
+ template <class T> struct has_trivial_copy;
79
+ template <class T> struct has_trivial_assign;
80
+ template <class T> struct has_trivial_destructor;
81
+ template <class T> struct remove_const;
82
+ template <class T> struct remove_volatile;
83
+ template <class T> struct remove_cv;
84
+ template <class T> struct remove_reference;
85
+ template <class T> struct add_reference;
86
+ template <class T> struct remove_pointer;
87
+ template <class T, class U> struct is_same;
88
+ #if !defined(_MSC_VER) && !(defined(__GNUC__) && __GNUC__ <= 3)
89
+ template <class From, class To> struct is_convertible;
90
+ #endif
86
91
 
87
- // is_integral is false except for the built-in integer types.
92
+ // is_integral is false except for the built-in integer types. A
93
+ // cv-qualified type is integral if and only if the underlying type is.
88
94
  template <class T> struct is_integral : false_type { };
89
95
  template<> struct is_integral<bool> : true_type { };
90
96
  template<> struct is_integral<char> : true_type { };
@@ -108,19 +114,80 @@ template<> struct is_integral<unsigned long> : true_type { };
108
114
  template<> struct is_integral<long long> : true_type { };
109
115
  template<> struct is_integral<unsigned long long> : true_type { };
110
116
  #endif
111
-
117
+ template <class T> struct is_integral<const T> : is_integral<T> { };
118
+ template <class T> struct is_integral<volatile T> : is_integral<T> { };
119
+ template <class T> struct is_integral<const volatile T> : is_integral<T> { };
112
120
 
113
121
  // is_floating_point is false except for the built-in floating-point types.
122
+ // A cv-qualified type is integral if and only if the underlying type is.
114
123
  template <class T> struct is_floating_point : false_type { };
115
124
  template<> struct is_floating_point<float> : true_type { };
116
125
  template<> struct is_floating_point<double> : true_type { };
117
126
  template<> struct is_floating_point<long double> : true_type { };
127
+ template <class T> struct is_floating_point<const T>
128
+ : is_floating_point<T> { };
129
+ template <class T> struct is_floating_point<volatile T>
130
+ : is_floating_point<T> { };
131
+ template <class T> struct is_floating_point<const volatile T>
132
+ : is_floating_point<T> { };
118
133
 
119
-
120
- // is_pointer is false except for pointer types.
134
+ // is_pointer is false except for pointer types. A cv-qualified type (e.g.
135
+ // "int* const", as opposed to "int const*") is cv-qualified if and only if
136
+ // the underlying type is.
121
137
  template <class T> struct is_pointer : false_type { };
122
138
  template <class T> struct is_pointer<T*> : true_type { };
139
+ template <class T> struct is_pointer<const T> : is_pointer<T> { };
140
+ template <class T> struct is_pointer<volatile T> : is_pointer<T> { };
141
+ template <class T> struct is_pointer<const volatile T> : is_pointer<T> { };
142
+
143
+ #if !defined(_MSC_VER) && !(defined(__GNUC__) && __GNUC__ <= 3)
144
+
145
+ namespace internal {
146
+
147
+ template <class T> struct is_class_or_union {
148
+ template <class U> static small_ tester(void (U::*)());
149
+ template <class U> static big_ tester(...);
150
+ static const bool value = sizeof(tester<T>(0)) == sizeof(small_);
151
+ };
152
+
153
+ // is_convertible chokes if the first argument is an array. That's why
154
+ // we use add_reference here.
155
+ template <bool NotUnum, class T> struct is_enum_impl
156
+ : is_convertible<typename add_reference<T>::type, int> { };
157
+
158
+ template <class T> struct is_enum_impl<true, T> : false_type { };
123
159
 
160
+ } // namespace internal
161
+
162
+ // Specified by TR1 [4.5.1] primary type categories.
163
+
164
+ // Implementation note:
165
+ //
166
+ // Each type is either void, integral, floating point, array, pointer,
167
+ // reference, member object pointer, member function pointer, enum,
168
+ // union or class. Out of these, only integral, floating point, reference,
169
+ // class and enum types are potentially convertible to int. Therefore,
170
+ // if a type is not a reference, integral, floating point or class and
171
+ // is convertible to int, it's a enum. Adding cv-qualification to a type
172
+ // does not change whether it's an enum.
173
+ //
174
+ // Is-convertible-to-int check is done only if all other checks pass,
175
+ // because it can't be used with some types (e.g. void or classes with
176
+ // inaccessible conversion operators).
177
+ template <class T> struct is_enum
178
+ : internal::is_enum_impl<
179
+ is_same<T, void>::value ||
180
+ is_integral<T>::value ||
181
+ is_floating_point<T>::value ||
182
+ is_reference<T>::value ||
183
+ internal::is_class_or_union<T>::value,
184
+ T> { };
185
+
186
+ template <class T> struct is_enum<const T> : is_enum<T> { };
187
+ template <class T> struct is_enum<volatile T> : is_enum<T> { };
188
+ template <class T> struct is_enum<const volatile T> : is_enum<T> { };
189
+
190
+ #endif
124
191
 
125
192
  // is_reference is false except for reference types.
126
193
  template<typename T> struct is_reference : false_type {};
@@ -128,13 +195,20 @@ template<typename T> struct is_reference<T&> : true_type {};
128
195
 
129
196
 
130
197
  // We can't get is_pod right without compiler help, so fail conservatively.
131
- // We will assume it's false except for arithmetic types and pointers,
132
- // and const versions thereof. Note that std::pair is not a POD.
198
+ // We will assume it's false except for arithmetic types, enumerations,
199
+ // pointers and cv-qualified versions thereof. Note that std::pair<T,U>
200
+ // is not a POD even if T and U are PODs.
133
201
  template <class T> struct is_pod
134
202
  : integral_constant<bool, (is_integral<T>::value ||
135
203
  is_floating_point<T>::value ||
204
+ #if !defined(_MSC_VER) && !(defined(__GNUC__) && __GNUC__ <= 3)
205
+ // is_enum is not available on MSVC.
206
+ is_enum<T>::value ||
207
+ #endif
136
208
  is_pointer<T>::value)> { };
137
209
  template <class T> struct is_pod<const T> : is_pod<T> { };
210
+ template <class T> struct is_pod<volatile T> : is_pod<T> { };
211
+ template <class T> struct is_pod<const volatile T> : is_pod<T> { };
138
212
 
139
213
 
140
214
  // We can't get has_trivial_constructor right without compiler help, so
@@ -203,10 +277,13 @@ template<typename T> struct remove_cv {
203
277
  };
204
278
 
205
279
 
206
- // Specified by TR1 [4.7.2]
280
+ // Specified by TR1 [4.7.2] Reference modifications.
207
281
  template<typename T> struct remove_reference { typedef T type; };
208
282
  template<typename T> struct remove_reference<T&> { typedef T type; };
209
283
 
284
+ template <typename T> struct add_reference { typedef T& type; };
285
+ template <typename T> struct add_reference<T&> { typedef T& type; };
286
+
210
287
  // Specified by TR1 [4.7.4] Pointer modifications.
211
288
  template<typename T> struct remove_pointer { typedef T type; };
212
289
  template<typename T> struct remove_pointer<T*> { typedef T type; };
@@ -219,6 +296,47 @@ template<typename T> struct remove_pointer<T* const volatile> {
219
296
  template<typename T, typename U> struct is_same : public false_type { };
220
297
  template<typename T> struct is_same<T, T> : public true_type { };
221
298
 
299
+ // Specified by TR1 [4.6] Relationships between types
300
+ #if !defined(_MSC_VER) && !(defined(__GNUC__) && __GNUC__ <= 3)
301
+ namespace internal {
302
+
303
+ // This class is an implementation detail for is_convertible, and you
304
+ // don't need to know how it works to use is_convertible. For those
305
+ // who care: we declare two different functions, one whose argument is
306
+ // of type To and one with a variadic argument list. We give them
307
+ // return types of different size, so we can use sizeof to trick the
308
+ // compiler into telling us which function it would have chosen if we
309
+ // had called it with an argument of type From. See Alexandrescu's
310
+ // _Modern C++ Design_ for more details on this sort of trick.
311
+
312
+ template <typename From, typename To>
313
+ struct ConvertHelper {
314
+ static small_ Test(To);
315
+ static big_ Test(...);
316
+ static From Create();
317
+ };
318
+ } // namespace internal
319
+
320
+ // Inherits from true_type if From is convertible to To, false_type otherwise.
321
+ template <typename From, typename To>
322
+ struct is_convertible
323
+ : integral_constant<bool,
324
+ sizeof(internal::ConvertHelper<From, To>::Test(
325
+ internal::ConvertHelper<From, To>::Create()))
326
+ == sizeof(small_)> {
327
+ };
328
+ #endif
329
+
222
330
  _END_GOOGLE_NAMESPACE_
223
331
 
332
+ // Right now these macros are no-ops, and mostly just document the fact
333
+ // these types are PODs, for human use. They may be made more contentful
334
+ // later. The typedef is just to make it legal to put a semicolon after
335
+ // these macros.
336
+ #define DECLARE_POD(TypeName) typedef int Dummy_Type_For_DECLARE_POD
337
+ #define DECLARE_NESTED_POD(TypeName) DECLARE_POD(TypeName)
338
+ #define PROPAGATE_POD_FROM_TEMPLATE_ARGUMENT(TemplateName) \
339
+ typedef int Dummy_Type_For_PROPAGATE_POD_FROM_TEMPLATE_ARGUMENT
340
+ #define ENFORCE_POD(TypeName) typedef int Dummy_Type_For_ENFORCE_POD
341
+
224
342
  #endif // BASE_TYPE_TRAITS_H_
@@ -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,32 +28,31 @@
28
28
  // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
29
 
30
30
  // ---
31
- // Author: Craig Silverstein
32
- //
33
- // This tests <google/sparsetable>
34
31
  //
35
32
  // Since sparsetable is templatized, it's important that we test every
36
33
  // function in every class in this file -- not just to see if it
37
34
  // works, but even if it compiles.
38
35
 
39
- #include "config.h"
40
- #include <string>
36
+ #include <sparsehash/internal/sparseconfig.h>
37
+ #include <config.h>
41
38
  #include <stdio.h>
42
- #include <string.h> // for memcmp()
39
+ #include <string.h>
40
+ #include <sys/types.h> // for size_t
43
41
  #include <stdlib.h> // defines unlink() on some windows platforms(?)
44
42
  #ifdef HAVE_UNISTD_H
45
- #include <unistd.h> // for unlink()
46
- #include <sys/types.h> // for size_t
47
- #include <string>
43
+ # include <unistd.h>
44
+ #endif // for unlink()
48
45
  #include <memory> // for allocator
49
- #endif
50
- #include <google/sparsetable>
51
-
52
- using STL_NAMESPACE::string;
53
- using STL_NAMESPACE::allocator;
46
+ #include <string>
47
+ #include <sparsehash/sparsetable>
48
+ using std::string;
49
+ using std::allocator;
54
50
  using GOOGLE_NAMESPACE::sparsetable;
55
51
  using GOOGLE_NAMESPACE::DEFAULT_SPARSEGROUP_SIZE;
56
52
 
53
+ typedef u_int16_t uint16;
54
+ string FLAGS_test_tmpdir = "/tmp/";
55
+
57
56
  // Many sparsetable operations return a size_t. Rather than have to
58
57
  // use PRIuS everywhere, we'll just cast to a "big enough" value.
59
58
  #define UL(x) ( static_cast<unsigned long>(x) )
@@ -273,6 +272,28 @@ void TestInt() {
273
272
  TEST(x.begin() == x.begin() + 1 - 1);
274
273
  TEST(z.begin() != z.end());
275
274
 
275
+ // ----------------------------------------------------------------------
276
+ // Test the non-empty iterators get_pos function
277
+
278
+ sparsetable<unsigned int> gp(100);
279
+ for (int i = 0; i < 100; i += 9) {
280
+ gp.set(i,i);
281
+ }
282
+
283
+ for (sparsetable<unsigned int>::const_nonempty_iterator
284
+ it = gp.nonempty_begin(); it != gp.nonempty_end(); ++it) {
285
+ out += snprintf(out, LEFT,
286
+ "get_pos() for const nonempty_iterator: %u == %lu\n",
287
+ *it, UL(gp.get_pos(it)));
288
+ }
289
+
290
+ for (sparsetable<unsigned int>::nonempty_iterator
291
+ it = gp.nonempty_begin(); it != gp.nonempty_end(); ++it) {
292
+ out += snprintf(out, LEFT,
293
+ "get_pos() for nonempty_iterator: %u == %lu\n",
294
+ *it, UL(gp.get_pos(it)));
295
+ }
296
+
276
297
  // ----------------------------------------------------------------------
277
298
  // Test sparsetable functions
278
299
  out += snprintf(out, LEFT, "x has %lu/%lu buckets, "
@@ -280,7 +301,7 @@ void TestInt() {
280
301
  UL(x.num_nonempty()), UL(x.size()),
281
302
  UL(y.num_nonempty()), UL(y.size()),
282
303
  UL(z.num_nonempty()), UL(z.size()));
283
-
304
+
284
305
  y.resize(48); // should get rid of 48 and 49
285
306
  y.resize(70); // 48 and 49 should still be gone
286
307
  out += snprintf(out, LEFT, "y shrank and grew: it's now %lu/%lu\n",
@@ -322,8 +343,8 @@ void TestInt() {
322
343
  out += snprintf(out, LEFT, "y[??] = %d\n", *--it);
323
344
 
324
345
  // ----------------------------------------------------------------------
325
- // Test I/O
326
- string filestr = "/tmp/.sparsetable.test";
346
+ // Test I/O using deprecated read/write_metadata
347
+ string filestr = FLAGS_test_tmpdir + "/.sparsetable.test";
327
348
  const char *file = filestr.c_str();
328
349
  FILE *fp = fopen(file, "wb");
329
350
  if ( fp == NULL ) {
@@ -354,6 +375,31 @@ void TestInt() {
354
375
  out += snprintf(out, LEFT, "That's %lu set buckets\n", UL(y2.num_nonempty()));
355
376
  }
356
377
  unlink(file);
378
+
379
+ // ----------------------------------------------------------------------
380
+ // Also test I/O using serialize()/unserialize()
381
+ fp = fopen(file, "wb");
382
+ if ( fp == NULL ) {
383
+ out += snprintf(out, LEFT, "Can't open %s, skipping disk write...\n", file);
384
+ } else {
385
+ y.serialize(sparsetable<int>::NopointerSerializer(), fp);
386
+ fclose(fp);
387
+ }
388
+ fp = fopen(file, "rb");
389
+ if ( fp == NULL ) {
390
+ out += snprintf(out, LEFT, "Can't open %s, skipping disk read...\n", file);
391
+ } else {
392
+ sparsetable<int> y2;
393
+ y2.unserialize(sparsetable<int>::NopointerSerializer(), fp);
394
+ fclose(fp);
395
+
396
+ for ( sparsetable<int>::const_iterator it = y2.begin(); it != y2.end(); ++it ) {
397
+ if ( y2.test(it) )
398
+ out += snprintf(out, LEFT, "y2[%lu] is %d\n", UL(it - y2.begin()), *it);
399
+ }
400
+ out += snprintf(out, LEFT, "That's %lu set buckets\n", UL(y2.num_nonempty()));
401
+ }
402
+ unlink(file);
357
403
  }
358
404
 
359
405
  // Test sparsetable with a non-POD type, std::string
@@ -462,7 +508,7 @@ void ResetAllocatorCounters() {
462
508
  template <class T> class instrumented_allocator {
463
509
  public:
464
510
  typedef T value_type;
465
- typedef u_int16_t size_type;
511
+ typedef uint16 size_type;
466
512
  typedef ptrdiff_t difference_type;
467
513
 
468
514
  typedef T* pointer;
@@ -758,6 +804,30 @@ static const char g_expected[] = (
758
804
  "first non-empty x: 10\n"
759
805
  "x.begin() == x.begin() + 1 - 1? yes\n"
760
806
  "z.begin() != z.end()? no\n"
807
+ "get_pos() for const nonempty_iterator: 0 == 0\n"
808
+ "get_pos() for const nonempty_iterator: 9 == 9\n"
809
+ "get_pos() for const nonempty_iterator: 18 == 18\n"
810
+ "get_pos() for const nonempty_iterator: 27 == 27\n"
811
+ "get_pos() for const nonempty_iterator: 36 == 36\n"
812
+ "get_pos() for const nonempty_iterator: 45 == 45\n"
813
+ "get_pos() for const nonempty_iterator: 54 == 54\n"
814
+ "get_pos() for const nonempty_iterator: 63 == 63\n"
815
+ "get_pos() for const nonempty_iterator: 72 == 72\n"
816
+ "get_pos() for const nonempty_iterator: 81 == 81\n"
817
+ "get_pos() for const nonempty_iterator: 90 == 90\n"
818
+ "get_pos() for const nonempty_iterator: 99 == 99\n"
819
+ "get_pos() for nonempty_iterator: 0 == 0\n"
820
+ "get_pos() for nonempty_iterator: 9 == 9\n"
821
+ "get_pos() for nonempty_iterator: 18 == 18\n"
822
+ "get_pos() for nonempty_iterator: 27 == 27\n"
823
+ "get_pos() for nonempty_iterator: 36 == 36\n"
824
+ "get_pos() for nonempty_iterator: 45 == 45\n"
825
+ "get_pos() for nonempty_iterator: 54 == 54\n"
826
+ "get_pos() for nonempty_iterator: 63 == 63\n"
827
+ "get_pos() for nonempty_iterator: 72 == 72\n"
828
+ "get_pos() for nonempty_iterator: 81 == 81\n"
829
+ "get_pos() for nonempty_iterator: 90 == 90\n"
830
+ "get_pos() for nonempty_iterator: 99 == 99\n"
761
831
  "x has 3/7 buckets, y 4/70, z 0/0\n"
762
832
  "y shrank and grew: it's now 2/70\n"
763
833
  "y[12] = -12, y.get(12) = -12\n"
@@ -803,6 +873,19 @@ static const char g_expected[] = (
803
873
  "y2[37] is -37\n"
804
874
  "y2[9898] is -9898\n"
805
875
  "That's 12 set buckets\n"
876
+ "y2[10] is -10\n"
877
+ "y2[11] is -11\n"
878
+ "y2[13] is -13\n"
879
+ "y2[14] is -14\n"
880
+ "y2[30] is -30\n"
881
+ "y2[31] is -31\n"
882
+ "y2[32] is -32\n"
883
+ "y2[33] is -33\n"
884
+ "y2[35] is -35\n"
885
+ "y2[36] is -36\n"
886
+ "y2[37] is -37\n"
887
+ "y2[9898] is -9898\n"
888
+ "That's 12 set buckets\n"
806
889
  "string test\n"
807
890
  "x[0]: \n"
808
891
  "x[1]: \n"
@@ -873,7 +956,10 @@ static const char g_expected[] = (
873
956
  );
874
957
 
875
958
  // defined at bottom of file for ease of maintainence
876
- int main(int /*argc*/, char ** /*argv*/) {
959
+ int main(int argc, char **argv) { // though we ignore the args
960
+ (void)argc;
961
+ (void)argv;
962
+
877
963
  TestInt();
878
964
  TestString();
879
965
  TestAllocator();