// Boost.Bimap // // Copyright (c) 2024 Joaquin M Lopez Munoz // // 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) #ifndef LIBS_BIMAP_TEST_STRONG_TYPE_HPP #define LIBS_BIMAP_TEST_STRONG_TYPE_HPP #if defined(_MSC_VER) #pragma once #endif #include // std #include #include template< class T > struct strong { template< class Q > strong(const Q& x_):x(x_){} T x; }; template< class T > bool operator<(const strong& x,const strong& y) { return x.x bool operator==(const strong& x,const strong& y) { return x.x==y.x; } template< class T > std::size_t hash_value(const strong& x) { return boost::hash()(x.x); } template< class T > struct semistrong: strong { using strong::strong; // semistrong is formally convertible to T but throws when // conversion actually called operator const T&() const { throw std::runtime_error("semistrong -> T conversion called"); } }; #endif // LIBS_BIMAP_TEST_STRONG_TYPE_HPP