1 2 // Copyright 2012 Daniel James. 3 // Distributed under the Boost Software License, Version 1.0. (See accompanying 4 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 5 6 #include "./config.hpp" 7 8 #ifdef BOOST_HASH_TEST_EXTENSIONS 9 # ifdef BOOST_HASH_TEST_STD_INCLUDES 10 # include <functional> 11 # else 12 # include <boost/container_hash/hash.hpp> 13 # endif 14 #endif 15 16 #include <boost/config.hpp> 17 #include <boost/core/lightweight_test.hpp> 18 19 #if defined(BOOST_HASH_TEST_EXTENSIONS) && !defined(BOOST_NO_CXX11_HDR_TUPLE) 20 #define TEST_TUPLE 21 #include <tuple> 22 #include <vector> 23 #endif 24 25 #ifdef TEST_TUPLE 26 27 template <typename T> tuple_tests(T const & v)28void tuple_tests(T const& v) { 29 boost::hash<typename T::value_type> hf; 30 for(typename T::const_iterator i = v.begin(); i != v.end(); ++i) { 31 for(typename T::const_iterator j = v.begin(); j != v.end(); ++j) { 32 if (i != j) 33 BOOST_TEST(hf(*i) != hf(*j)); 34 else 35 BOOST_TEST(hf(*i) == hf(*j)); 36 } 37 } 38 } 39 empty_tuple_test()40void empty_tuple_test() { 41 boost::hash<std::tuple<> > empty_tuple_hash; 42 std::tuple<> empty_tuple; 43 BOOST_TEST(empty_tuple_hash(empty_tuple) == boost::hash_value(empty_tuple)); 44 } 45 int_tuple_test()46void int_tuple_test() { 47 std::vector<std::tuple<int> > int_tuples; 48 int_tuples.push_back(std::make_tuple(0)); 49 int_tuples.push_back(std::make_tuple(1)); 50 int_tuples.push_back(std::make_tuple(2)); 51 tuple_tests(int_tuples); 52 } 53 int_string_tuple_test()54void int_string_tuple_test() { 55 std::vector<std::tuple<int, std::string> > int_string_tuples; 56 int_string_tuples.push_back(std::make_tuple(0, std::string("zero"))); 57 int_string_tuples.push_back(std::make_tuple(1, std::string("one"))); 58 int_string_tuples.push_back(std::make_tuple(2, std::string("two"))); 59 int_string_tuples.push_back(std::make_tuple(0, std::string("one"))); 60 int_string_tuples.push_back(std::make_tuple(1, std::string("zero"))); 61 int_string_tuples.push_back(std::make_tuple(0, std::string(""))); 62 int_string_tuples.push_back(std::make_tuple(1, std::string(""))); 63 tuple_tests(int_string_tuples); 64 } 65 66 #endif // TEST_TUPLE 67 main()68int main() 69 { 70 #ifdef TEST_TUPLE 71 empty_tuple_test(); 72 int_tuple_test(); 73 int_string_tuple_test(); 74 #endif 75 76 return boost::report_errors(); 77 } 78