// Copyright Louis Dionne 2013-2017 // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt) #ifndef TEST_SUPPORT_TRACKED_MOVE_ONLY_HPP #define TEST_SUPPORT_TRACKED_MOVE_ONLY_HPP #include #include #include #include #include // A move-only type that's Tracked. It is also Comparable and Hashable so it // can be used in associative containers. template struct TrackedMoveOnly : Tracked { TrackedMoveOnly() : Tracked(i) { } TrackedMoveOnly(TrackedMoveOnly const&) = delete; TrackedMoveOnly& operator=(TrackedMoveOnly const&) = delete; TrackedMoveOnly(TrackedMoveOnly&& x) : Tracked(std::move(x)) { } }; template constexpr auto operator==(TrackedMoveOnly const&, TrackedMoveOnly const&) { return boost::hana::bool_c; } template constexpr auto operator!=(TrackedMoveOnly const&, TrackedMoveOnly const&) { return boost::hana::bool_c; } namespace boost { namespace hana { template struct hash_impl> { static constexpr auto apply(TrackedMoveOnly const&) { return hana::type_c>; }; }; }} #endif // !TEST_SUPPORT_TRACKED_MOVE_ONLY_HPP