summaryrefslogtreecommitdiffstats
path: root/src/boost/libs/unordered/examples
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 18:45:59 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 18:45:59 +0000
commit19fcec84d8d7d21e796c7624e521b60d28ee21ed (patch)
tree42d26aa27d1e3f7c0b8bd3fd14e7d7082f5008dc /src/boost/libs/unordered/examples
parentInitial commit. (diff)
downloadceph-upstream/16.2.11+ds.tar.xz
ceph-upstream/16.2.11+ds.zip
Adding upstream version 16.2.11+ds.upstream/16.2.11+dsupstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/boost/libs/unordered/examples')
-rw-r--r--src/boost/libs/unordered/examples/case_insensitive.hpp58
-rw-r--r--src/boost/libs/unordered/examples/case_insensitive_test.cpp82
-rw-r--r--src/boost/libs/unordered/examples/fnv1.hpp69
3 files changed, 209 insertions, 0 deletions
diff --git a/src/boost/libs/unordered/examples/case_insensitive.hpp b/src/boost/libs/unordered/examples/case_insensitive.hpp
new file mode 100644
index 000000000..83a388d87
--- /dev/null
+++ b/src/boost/libs/unordered/examples/case_insensitive.hpp
@@ -0,0 +1,58 @@
+
+// Copyright 2006-2009 Daniel James.
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+// This file implements a locale aware case insenstive equality predicate and
+// hash function. Unfortunately it still falls short of full
+// internationalization as it only deals with a single character at a time
+// (some languages have tricky cases where the characters in an upper case
+// string don't have a one-to-one correspondence with the lower case version of
+// the text, eg. )
+
+#if !defined(BOOST_HASH_EXAMPLES_CASE_INSENSITIVE_HEADER)
+#define BOOST_HASH_EXAMPLES_CASE_INSENSITIVE_HEADER
+
+#include <boost/algorithm/string/predicate.hpp>
+#include <boost/functional/hash.hpp>
+
+namespace hash_examples
+{
+ struct iequal_to
+ {
+ iequal_to() {}
+ explicit iequal_to(std::locale const& l) : locale_(l) {}
+
+ template <typename String1, typename String2>
+ bool operator()(String1 const& x1, String2 const& x2) const
+ {
+ return boost::algorithm::iequals(x1, x2, locale_);
+ }
+ private:
+ std::locale locale_;
+ };
+
+ struct ihash
+ {
+ ihash() {}
+ explicit ihash(std::locale const& l) : locale_(l) {}
+
+ template <typename String>
+ std::size_t operator()(String const& x) const
+ {
+ std::size_t seed = 0;
+
+ for(typename String::const_iterator it = x.begin();
+ it != x.end(); ++it)
+ {
+ boost::hash_combine(seed, std::toupper(*it, locale_));
+ }
+
+ return seed;
+ }
+ private:
+ std::locale locale_;
+ };
+}
+
+#endif
diff --git a/src/boost/libs/unordered/examples/case_insensitive_test.cpp b/src/boost/libs/unordered/examples/case_insensitive_test.cpp
new file mode 100644
index 000000000..b717c1306
--- /dev/null
+++ b/src/boost/libs/unordered/examples/case_insensitive_test.cpp
@@ -0,0 +1,82 @@
+
+// Copyright 2006-2009 Daniel James.
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#include "./case_insensitive.hpp"
+#include <boost/core/lightweight_test.hpp>
+#include <boost/unordered_map.hpp>
+
+struct word_info {
+ int tag;
+ explicit word_info(int t = 0) : tag(t) {}
+};
+
+void test1() {
+ boost::unordered_map<std::string, word_info,
+ hash_examples::ihash, hash_examples::iequal_to> idictionary;
+
+ BOOST_TEST(idictionary.empty());
+
+ idictionary["one"] = word_info(1);
+ BOOST_TEST(idictionary.size() == 1);
+ BOOST_TEST(idictionary.find("ONE") != idictionary.end() &&
+ idictionary.find("ONE") == idictionary.find("one"));
+
+ idictionary.insert(std::make_pair("ONE", word_info(2)));
+ BOOST_TEST(idictionary.size() == 1);
+ BOOST_TEST(idictionary.find("ONE") != idictionary.end() &&
+ idictionary.find("ONE")->first == "one" &&
+ idictionary.find("ONE")->second.tag == 1);
+
+ idictionary["One"] = word_info(3);
+ BOOST_TEST(idictionary.size() == 1);
+ BOOST_TEST(idictionary.find("ONE") != idictionary.end() &&
+ idictionary.find("ONE")->first == "one" &&
+ idictionary.find("ONE")->second.tag == 3);
+
+ idictionary["two"] = word_info(4);
+ BOOST_TEST(idictionary.size() == 2);
+ BOOST_TEST(idictionary.find("two") != idictionary.end() &&
+ idictionary.find("TWO")->first == "two" &&
+ idictionary.find("Two")->second.tag == 4);
+
+
+}
+
+void test2() {
+ boost::unordered_map<std::wstring, word_info,
+ hash_examples::ihash, hash_examples::iequal_to> idictionary;
+
+ BOOST_TEST(idictionary.empty());
+
+ idictionary[L"one"] = word_info(1);
+ BOOST_TEST(idictionary.size() == 1);
+ BOOST_TEST(idictionary.find(L"ONE") != idictionary.end() &&
+ idictionary.find(L"ONE") == idictionary.find(L"one"));
+
+ idictionary.insert(std::make_pair(L"ONE", word_info(2)));
+ BOOST_TEST(idictionary.size() == 1);
+ BOOST_TEST(idictionary.find(L"ONE") != idictionary.end() &&
+ idictionary.find(L"ONE")->first == L"one" &&
+ idictionary.find(L"ONE")->second.tag == 1);
+
+ idictionary[L"One"] = word_info(3);
+ BOOST_TEST(idictionary.size() == 1);
+ BOOST_TEST(idictionary.find(L"ONE") != idictionary.end() &&
+ idictionary.find(L"ONE")->first == L"one" &&
+ idictionary.find(L"ONE")->second.tag == 3);
+
+ idictionary[L"two"] = word_info(4);
+ BOOST_TEST(idictionary.size() == 2);
+ BOOST_TEST(idictionary.find(L"two") != idictionary.end() &&
+ idictionary.find(L"TWO")->first == L"two" &&
+ idictionary.find(L"Two")->second.tag == 4);
+}
+
+int main() {
+ test1();
+ test2();
+
+ return boost::report_errors();
+}
diff --git a/src/boost/libs/unordered/examples/fnv1.hpp b/src/boost/libs/unordered/examples/fnv1.hpp
new file mode 100644
index 000000000..3337d1365
--- /dev/null
+++ b/src/boost/libs/unordered/examples/fnv1.hpp
@@ -0,0 +1,69 @@
+
+// Copyright 2008-2009 Daniel James.
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+// This code is also released into the public domain.
+
+// Algorithm from: http://www.isthe.com/chongo/tech/comp/fnv/
+
+#include <string>
+
+namespace hash
+{
+ template <std::size_t FnvPrime, std::size_t OffsetBasis>
+ struct basic_fnv_1
+ {
+ std::size_t operator()(std::string const& text) const
+ {
+ std::size_t hash = OffsetBasis;
+ for(std::string::const_iterator it = text.begin(), end = text.end();
+ it != end; ++it)
+ {
+ hash *= FnvPrime;
+ hash ^= *it;
+ }
+
+ return hash;
+ }
+ };
+
+ template <std::size_t FnvPrime, std::size_t OffsetBasis>
+ struct basic_fnv_1a
+ {
+ std::size_t operator()(std::string const& text) const
+ {
+ std::size_t hash = OffsetBasis;
+ for(std::string::const_iterator it = text.begin(), end = text.end();
+ it != end; ++it)
+ {
+ hash ^= *it;
+ hash *= FnvPrime;
+ }
+
+ return hash;
+ }
+ };
+
+ // For 32 bit machines:
+ const std::size_t fnv_prime = 16777619u;
+ const std::size_t fnv_offset_basis = 2166136261u;
+
+ // For 64 bit machines:
+ // const std::size_t fnv_prime = 1099511628211u;
+ // const std::size_t fnv_offset_basis = 14695981039346656037u;
+
+ // For 128 bit machines:
+ // const std::size_t fnv_prime = 309485009821345068724781401u;
+ // const std::size_t fnv_offset_basis =
+ // 275519064689413815358837431229664493455u;
+
+ // For 256 bit machines:
+ // const std::size_t fnv_prime =
+ // 374144419156711147060143317175368453031918731002211u;
+ // const std::size_t fnv_offset_basis =
+ // 100029257958052580907070968620625704837092796014241193945225284501741471925557u;
+
+ typedef basic_fnv_1<fnv_prime, fnv_offset_basis> fnv_1;
+ typedef basic_fnv_1a<fnv_prime, fnv_offset_basis> fnv_1a;
+}