|
Boost-Commit : |
Subject: [Boost-commit] svn:boost r73827 - in trunk: boost/filesystem/v3 libs/filesystem/v3/test
From: dnljms_at_[hidden]
Date: 2011-08-16 18:15:56
Author: danieljames
Date: 2011-08-16 18:15:55 EDT (Tue, 16 Aug 2011)
New Revision: 73827
URL: http://svn.boost.org/trac/boost/changeset/73827
Log:
Filesystem: add hash_value.
Text files modified:
trunk/boost/filesystem/v3/path.hpp | 14 ++++++++++++++
trunk/libs/filesystem/v3/test/path_unit_test.cpp | 7 +++++++
2 files changed, 21 insertions(+), 0 deletions(-)
Modified: trunk/boost/filesystem/v3/path.hpp
==============================================================================
--- trunk/boost/filesystem/v3/path.hpp (original)
+++ trunk/boost/filesystem/v3/path.hpp 2011-08-16 18:15:55 EDT (Tue, 16 Aug 2011)
@@ -29,6 +29,7 @@
#include <boost/shared_ptr.hpp>
#include <boost/io/detail/quoted_manip.hpp>
#include <boost/static_assert.hpp>
+#include <boost/functional/hash_fwd.hpp>
#include <string>
#include <iterator>
#include <cstring>
@@ -565,12 +566,25 @@
inline bool operator==(const path& lhs, const path::string_type& rhs) { return lhs == rhs.c_str(); }
inline bool operator==(const path::string_type& lhs, const path& rhs) { return rhs == lhs.c_str(); }
inline bool operator==(const path::value_type* lhs, const path& rhs) { return rhs == lhs; }
+
+ inline std::size_t hash_value(const path& x)
+ {
+ std::size_t seed = 0;
+ for(const path::value_type* it = x.c_str(); *it; ++it)
+ hash_combine(seed, *it == '/' ? L'\\' : *it);
+ return seed;
+ }
# else // BOOST_POSIX_API
inline bool operator==(const path& lhs, const path& rhs) { return lhs.native() == rhs.native(); }
inline bool operator==(const path& lhs, const path::string_type& rhs) { return lhs.native() == rhs; }
inline bool operator==(const path& lhs, const path::value_type* rhs) { return lhs.native() == rhs; }
inline bool operator==(const path::string_type& lhs, const path& rhs) { return lhs == rhs.native(); }
inline bool operator==(const path::value_type* lhs, const path& rhs) { return lhs == rhs.native(); }
+
+ inline std::size_t hash_value(const path& x)
+ {
+ return hash_range(x.native().begin(), x.native().end());
+ }
# endif
inline bool operator!=(const path& lhs, const path& rhs) { return !(lhs == rhs); }
Modified: trunk/libs/filesystem/v3/test/path_unit_test.cpp
==============================================================================
--- trunk/libs/filesystem/v3/test/path_unit_test.cpp (original)
+++ trunk/libs/filesystem/v3/test/path_unit_test.cpp 2011-08-16 18:15:55 EDT (Tue, 16 Aug 2011)
@@ -43,6 +43,7 @@
#include <boost/detail/lightweight_test.hpp>
#include <boost/detail/lightweight_main.hpp>
#include <boost/smart_ptr.hpp> // used constructor tests
+#include <boost/functional/hash.hpp>
#include <iostream>
#include <iomanip>
@@ -399,9 +400,12 @@
{
std::cout << "testing relationals..." << std::endl;
+ boost::hash<path> hash;
+
# ifdef BOOST_WINDOWS_API
// this is a critical use case to meet user expectations
CHECK(path("c:\\abc") == path("c:/abc"));
+ CHECK(hash(path("c:\\abc")) == hash(path("c:/abc")));
# endif
const path p("bar");
@@ -431,6 +435,9 @@
CHECK(L"baz" == p2);
CHECK(wstring(L"baz") == p2);
+ CHECK(hash(p) == hash(p));
+ CHECK(hash(p) != hash(p2)); // Not strictly required, but desirable
+
CHECK(!(p != p));
CHECK(p != p2);
CHECK(p2 != p);
Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk