1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 |
- /*
- Copyright 2018 Glen Joseph Fernandes
- (glenjofe@gmail.com)
- 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)
- */
- #include <boost/type_traits/enable_if.hpp>
- #include "test.hpp"
- template<bool B>
- struct Constant {
- enum {
- value = B
- };
- };
- template<class T>
- struct Check
- : Constant<false> { };
- template<>
- struct Check<long>
- : Constant<true> { };
- class Construct {
- public:
- template<class T>
- Construct(T, typename boost::enable_if_<Check<T>::value>::type* = 0)
- : value_(true) { }
- template<class T>
- Construct(T, typename boost::enable_if_<!Check<T>::value>::type* = 0)
- : value_(false) { }
- bool value() const {
- return value_;
- }
- private:
- bool value_;
- };
- template<class T, class E = void>
- struct Specialize;
- template<class T>
- struct Specialize<T, typename boost::enable_if_<Check<T>::value>::type>
- : Constant<true> { };
- template<class T>
- struct Specialize<T, typename boost::enable_if_<!Check<T>::value>::type>
- : Constant<false> { };
- template<class T>
- typename boost::enable_if_<Check<T>::value, bool>::type Returns(T)
- {
- return true;
- }
- template<class T>
- typename boost::enable_if_<!Check<T>::value, bool>::type Returns(T)
- {
- return false;
- }
- #if !defined(BOOST_NO_CXX11_TEMPLATE_ALIASES)
- template<class T>
- boost::enable_if_t<Check<T>::value, bool> Alias(T)
- {
- return true;
- }
- template<class T>
- boost::enable_if_t<!Check<T>::value, bool> Alias(T)
- {
- return false;
- }
- #endif
- TT_TEST_BEGIN(enable_if)
- BOOST_CHECK(!Construct(1).value());
- BOOST_CHECK(Construct(1L).value());
- BOOST_CHECK(!Specialize<int>::value);
- BOOST_CHECK(Specialize<long>::value);
- BOOST_CHECK(!Returns(1));
- BOOST_CHECK(Returns(1L));
- #if !defined(BOOST_NO_CXX11_TEMPLATE_ALIASES)
- BOOST_CHECK(!Alias(1));
- BOOST_CHECK(Alias(1L));
- #endif
- TT_TEST_END
|