/* @copyright Louis Dionne 2014 Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt) */ #include #include #include #include #include #include #include using namespace boost::hana; struct Typeclass : typeclass { }; struct NotInstance; struct Instance; template <> struct Typeclass::instance { }; struct an_instance { using hana_datatype = Instance; }; struct not_instance { using hana_datatype = NotInstance; }; int main() { BOOST_HANA_STATIC_ASSERT(is_a(an_instance{})); BOOST_HANA_STATIC_ASSERT(is_an(an_instance{})); BOOST_HANA_STATIC_ASSERT(!is_a(not_instance{})); BOOST_HANA_STATIC_ASSERT(!is_an(not_instance{})); BOOST_HANA_STATIC_ASSERT(!is_a(1)); BOOST_HANA_STATIC_ASSERT(!is_an(1)); BOOST_HANA_STATIC_ASSERT(!is_a('2')); BOOST_HANA_STATIC_ASSERT(!is_an('2')); // Check with a couple of "real" instances BOOST_HANA_STATIC_ASSERT(is_an(list(1, '2', 3))); BOOST_HANA_STATIC_ASSERT(is_a(list(1, '2', 3))); BOOST_HANA_STATIC_ASSERT(is_a(list(1, '2', 3))); BOOST_HANA_STATIC_ASSERT(!is_an(just(1))); BOOST_HANA_STATIC_ASSERT(!is_an(nothing)); BOOST_HANA_STATIC_ASSERT(!is_a(just('1'))); BOOST_HANA_STATIC_ASSERT(!is_a(nothing)); BOOST_HANA_STATIC_ASSERT(is_a(just("abcd"))); BOOST_HANA_STATIC_ASSERT(is_a(nothing)); }