// 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 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::detail::visit([](auto g) { BOOST_CHECK(bg::util::is_point::value); BOOST_STATIC_ASSERT(! std::is_const::value); }, dg); bg::detail::visit([](auto const g) { BOOST_CHECK(bg::util::is_point::value); BOOST_STATIC_ASSERT(std::is_const::value); }, dg); bg::detail::visit([](auto & g) { BOOST_CHECK(bg::util::is_point::value); BOOST_STATIC_ASSERT(! std::is_const>::value); }, dg); bg::detail::visit([](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::detail::visit([](auto g) { BOOST_CHECK(bg::util::is_point::value); BOOST_STATIC_ASSERT(! std::is_const::value); }, cdg); bg::detail::visit([](auto const g) { BOOST_CHECK(bg::util::is_point::value); BOOST_STATIC_ASSERT(std::is_const::value); }, cdg); bg::detail::visit([](auto & g) { BOOST_CHECK(bg::util::is_point::value); BOOST_STATIC_ASSERT(std::is_const>::value); }, cdg); bg::detail::visit([](auto const& g) { BOOST_CHECK(bg::util::is_point::value); BOOST_STATIC_ASSERT(std::is_const>::value); }, cdg); bg::detail::visit([](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::detail::visit([](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::detail::visit([](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::detail::visit([](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::detail::visit([](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::detail::visit([](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::detail::visit([](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::detail::visit([](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::detail::visit([](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)); bg::model::geometry_collection gc = { DynamicGeometry{ point_t(1, 2) } }; bg::model::geometry_collection const cgc = { DynamicGeometry{ point_t(1, 2) } }; bg::detail::visit_breadth_first([](auto && g) { BOOST_CHECK(bg::util::is_point::value); BOOST_STATIC_ASSERT(! std::is_const>::value); BOOST_STATIC_ASSERT(! std::is_rvalue_reference::value); return true; }, gc); bg::detail::visit_breadth_first([](auto && g) { BOOST_CHECK(bg::util::is_point::value); BOOST_STATIC_ASSERT(std::is_const>::value); BOOST_STATIC_ASSERT(! std::is_rvalue_reference::value); return true; }, cgc); bg::detail::visit_breadth_first([](auto && g) { BOOST_CHECK(bg::util::is_point::value); BOOST_STATIC_ASSERT(! std::is_const>::value); BOOST_STATIC_ASSERT(std::is_rvalue_reference::value); return true; }, std::move(gc)); bg::detail::visit_breadth_first([](auto && g) { BOOST_CHECK(bg::util::is_point::value); BOOST_STATIC_ASSERT(std::is_const>::value); BOOST_STATIC_ASSERT(std::is_rvalue_reference::value); return true; }, std::move(cgc)); } 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; }