// Boost.Geometry // Unit Test // Copyright (c) 2021 Oracle and/or its affiliates. // Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle // Use, modification and distribution is subject to 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 #include #include #include #include #include #include #include #include #include #include using point_t = bg::model::point; using linestring_t = bg::model::linestring; using polygon_t = bg::model::polygon; namespace boost { namespace geometry { namespace traits { template <> struct geometry_types { typedef util::type_sequence type; }; #ifndef BOOST_NO_CXX17_HDR_ANY template <> struct geometry_types { typedef util::type_sequence type; }; #endif // BOOST_NO_CXX17_HDR_ANY }}} template void test_all() { DynamicGeometry dg = point_t(1, 2); bg::traits::visit::apply([](auto g) { BOOST_CHECK(bg::util::is_point::value); BOOST_STATIC_ASSERT(! std::is_const::value); }, dg); bg::traits::visit::apply([](auto const g) { BOOST_CHECK(bg::util::is_point::value); BOOST_STATIC_ASSERT(std::is_const::value); }, dg); bg::traits::visit::apply([](auto & g) { BOOST_CHECK(bg::util::is_point::value); BOOST_STATIC_ASSERT(! std::is_const>::value); }, dg); bg::traits::visit::apply([](auto const& g) { BOOST_CHECK(bg::util::is_point::value); BOOST_STATIC_ASSERT(std::is_const>::value); }, dg); DynamicGeometry const cdg = point_t(3, 4); bg::traits::visit::apply([](auto g) { BOOST_CHECK(bg::util::is_point::value); BOOST_STATIC_ASSERT(! std::is_const::value); }, cdg); bg::traits::visit::apply([](auto const g) { BOOST_CHECK(bg::util::is_point::value); BOOST_STATIC_ASSERT(std::is_const::value); }, cdg); bg::traits::visit::apply([](auto & g) { BOOST_CHECK(bg::util::is_point::value); BOOST_STATIC_ASSERT(std::is_const>::value); }, cdg); bg::traits::visit::apply([](auto const& g) { BOOST_CHECK(bg::util::is_point::value); BOOST_STATIC_ASSERT(std::is_const>::value); }, cdg); bg::traits::visit::apply([](auto && g) { BOOST_CHECK(bg::util::is_point::value); BOOST_STATIC_ASSERT(! std::is_const>::value); BOOST_STATIC_ASSERT(! std::is_rvalue_reference::value); }, dg); bg::traits::visit::apply([](auto && g) { BOOST_CHECK(bg::util::is_point::value); BOOST_STATIC_ASSERT(std::is_const>::value); BOOST_STATIC_ASSERT(! std::is_rvalue_reference::value); }, cdg); bg::traits::visit::apply([](auto && g) { BOOST_CHECK(bg::util::is_point::value); BOOST_STATIC_ASSERT(! std::is_const>::value); BOOST_STATIC_ASSERT(std::is_rvalue_reference::value); }, std::move(dg)); bg::traits::visit::apply([](auto && g) { BOOST_CHECK(bg::util::is_point::value); BOOST_STATIC_ASSERT(std::is_const>::value); BOOST_STATIC_ASSERT(std::is_rvalue_reference::value); }, std::move(cdg)); bg::traits::visit::apply([](auto && g) { BOOST_CHECK(bg::util::is_point::value); BOOST_STATIC_ASSERT(! std::is_const>::value); BOOST_STATIC_ASSERT(std::is_rvalue_reference::value); }, DynamicGeometry{ point_t(1, 2) }); bg::traits::visit::apply([](auto && g1, auto && g2) { BOOST_CHECK(bg::util::is_point::value); BOOST_CHECK(bg::util::is_point::value); BOOST_STATIC_ASSERT(! std::is_const>::value); BOOST_STATIC_ASSERT(std::is_const>::value); BOOST_STATIC_ASSERT(! std::is_rvalue_reference::value); BOOST_STATIC_ASSERT(! std::is_rvalue_reference::value); }, dg, cdg); bg::traits::visit::apply([](auto && g1, auto && g2) { BOOST_CHECK(bg::util::is_point::value); BOOST_CHECK(bg::util::is_point::value); BOOST_STATIC_ASSERT(! std::is_const>::value); BOOST_STATIC_ASSERT(std::is_const>::value); BOOST_STATIC_ASSERT(std::is_rvalue_reference::value); BOOST_STATIC_ASSERT(std::is_rvalue_reference::value); }, std::move(dg), std::move(cdg)); bg::traits::visit::apply([](auto && g1, auto && g2) { BOOST_CHECK(bg::util::is_point::value); BOOST_CHECK(bg::util::is_point::value); BOOST_STATIC_ASSERT(!std::is_const>::value); BOOST_STATIC_ASSERT(std::is_const>::value); BOOST_STATIC_ASSERT(!std::is_rvalue_reference::value); BOOST_STATIC_ASSERT(!std::is_rvalue_reference::value); }, cdg, dg); bg::traits::visit::apply([](auto && g1, auto && g2) { BOOST_CHECK(bg::util::is_point::value); BOOST_CHECK(bg::util::is_point::value); BOOST_STATIC_ASSERT(!std::is_const>::value); BOOST_STATIC_ASSERT(std::is_const>::value); BOOST_STATIC_ASSERT(std::is_rvalue_reference::value); BOOST_STATIC_ASSERT(std::is_rvalue_reference::value); }, std::move(cdg), std::move(dg)); std::vector v = { DynamicGeometry{ point_t(1, 2) } }; std::vector const cv = { DynamicGeometry{ point_t(1, 2) } }; bg::traits::iter_visit>::apply([](auto && g) { BOOST_CHECK(bg::util::is_point::value); BOOST_STATIC_ASSERT(! std::is_const>::value); BOOST_STATIC_ASSERT(! std::is_rvalue_reference::value); }, v.begin()); bg::traits::iter_visit>::apply([](auto && g) { BOOST_CHECK(bg::util::is_point::value); BOOST_STATIC_ASSERT(std::is_const>::value); BOOST_STATIC_ASSERT(! std::is_rvalue_reference::value); }, cv.begin()); bg::traits::iter_visit>::apply([](auto && g) { BOOST_CHECK(bg::util::is_point::value); BOOST_STATIC_ASSERT(! std::is_const>::value); BOOST_STATIC_ASSERT(std::is_rvalue_reference::value); }, std::make_move_iterator(v.begin())); bg::traits::iter_visit>::apply([](auto && g) { BOOST_CHECK(bg::util::is_point::value); BOOST_STATIC_ASSERT(std::is_const>::value); BOOST_STATIC_ASSERT(std::is_rvalue_reference::value); }, std::make_move_iterator(cv.begin())); } int test_main(int, char* []) { test_all(); test_all>(); test_all>(); #ifndef BOOST_NO_CXX17_HDR_ANY test_all(); #endif #ifndef BOOST_NO_CXX17_HDR_VARIANT test_all>(); #endif return 0; }