From c61a4f691ed6ebee9f2dae7d001ac4f652a518c2 Mon Sep 17 00:00:00 2001 From: Peter Dimov Date: Sun, 27 Nov 2022 21:20:19 +0200 Subject: [PATCH] Add boost::container_hash::is_tuple_like. Refs #30. --- .../boost/container_hash/is_tuple_like.hpp | 41 +++++++++ test/Jamfile.v2 | 2 + test/is_tuple_like_test.cpp | 86 +++++++++++++++++++ 3 files changed, 129 insertions(+) create mode 100644 include/boost/container_hash/is_tuple_like.hpp create mode 100644 test/is_tuple_like_test.cpp diff --git a/include/boost/container_hash/is_tuple_like.hpp b/include/boost/container_hash/is_tuple_like.hpp new file mode 100644 index 0000000..5368283 --- /dev/null +++ b/include/boost/container_hash/is_tuple_like.hpp @@ -0,0 +1,41 @@ +#ifndef BOOST_HASH_IS_TUPLE_LIKE_HPP_INCLUDED +#define BOOST_HASH_IS_TUPLE_LIKE_HPP_INCLUDED + +// Copyright 2017, 2022 Peter Dimov. +// Distributed under the Boost Software License, Version 1.0. +// https://www.boost.org/LICENSE_1_0.txt + +#include +#include +#include + +namespace boost +{ +namespace hash_detail +{ + +template struct is_tuple_like_: false_type +{ +}; + +#if !defined(BOOST_NO_CXX11_HDR_TUPLE) + +template struct is_tuple_like_::value == std::tuple_size::value> >: true_type +{ +}; + +#endif + +} // namespace hash_detail + +namespace container_hash +{ + +template struct is_tuple_like: hash_detail::is_tuple_like_ +{ +}; + +} // namespace container_hash +} // namespace boost + +#endif // #ifndef BOOST_HASH_IS_TUPLE_LIKE_HPP_INCLUDED diff --git a/test/Jamfile.v2 b/test/Jamfile.v2 index 7b2eccc..bd6efa0 100644 --- a/test/Jamfile.v2 +++ b/test/Jamfile.v2 @@ -117,3 +117,5 @@ run hash_is_avalanching_test.cpp ; run hash_is_avalanching_test2.cpp ; run hash_nullptr_test.cpp ; + +run is_tuple_like_test.cpp ; diff --git a/test/is_tuple_like_test.cpp b/test/is_tuple_like_test.cpp new file mode 100644 index 0000000..553d6ca --- /dev/null +++ b/test/is_tuple_like_test.cpp @@ -0,0 +1,86 @@ +// Copyright 2017, 2022 Peter Dimov. +// Distributed under the Boost Software License, Version 1.0. +// https://www.boost.org/LICENSE_1_0.txt + +#include +#include +#include +#include + +struct X +{ +}; + +#if !defined(BOOST_NO_CXX11_HDR_TUPLE) + +#include + +namespace user +{ + +struct Y +{ + int a; + int b; +}; + +template int& get( Y& v ); +template int const& get( Y const& v ); + +template<> int& get<0>( Y& v ) +{ + return v.a; +} + +template<> int const& get<0>( Y const& v ) +{ + return v.a; +} + +template<> int& get<1>( Y& v ) +{ + return v.b; +} + +template<> int const& get<1>( Y const& v ) +{ + return v.b; +} + +} // namespace user + +namespace std +{ + +template<> struct tuple_size: std::integral_constant +{ +}; + +} // namespace std + +#endif // #if !defined(BOOST_NO_CXX11_HDR_TUPLE) + +int main() +{ + using boost::container_hash::is_tuple_like; + + BOOST_TEST_TRAIT_FALSE((is_tuple_like)); + BOOST_TEST_TRAIT_FALSE((is_tuple_like)); + BOOST_TEST_TRAIT_FALSE((is_tuple_like)); + BOOST_TEST_TRAIT_FALSE((is_tuple_like)); + +#if !defined(BOOST_NO_CXX11_HDR_TUPLE) + + BOOST_TEST_TRAIT_TRUE((is_tuple_like< std::pair >)); + + BOOST_TEST_TRAIT_TRUE((is_tuple_like< std::tuple<> >)); + BOOST_TEST_TRAIT_TRUE((is_tuple_like< std::tuple >)); + BOOST_TEST_TRAIT_TRUE((is_tuple_like< std::tuple >)); + BOOST_TEST_TRAIT_TRUE((is_tuple_like< std::tuple >)); + + BOOST_TEST_TRAIT_TRUE((is_tuple_like)); + +#endif + + return boost::report_errors(); +}