std_variant.hpp 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. // Boost.Geometry
  2. // Copyright (c) 2021, Oracle and/or its affiliates.
  3. // Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
  4. // Licensed under the Boost Software License version 1.0.
  5. // http://www.boost.org/users/license.html
  6. #ifndef BOOST_GEOMETRY_GEOMETRIES_ADAPTED_STD_VARIANT_HPP
  7. #define BOOST_GEOMETRY_GEOMETRIES_ADAPTED_STD_VARIANT_HPP
  8. #include <boost/config.hpp>
  9. #ifndef BOOST_NO_CXX17_HDR_VARIANT
  10. #include <utility>
  11. #include <variant>
  12. #include <boost/geometry/core/geometry_types.hpp>
  13. #include <boost/geometry/core/tag.hpp>
  14. #include <boost/geometry/core/tags.hpp>
  15. #include <boost/geometry/core/visit.hpp>
  16. #include <boost/geometry/util/sequence.hpp>
  17. namespace boost { namespace geometry
  18. {
  19. namespace traits
  20. {
  21. template <typename ...Ts>
  22. struct tag<std::variant<Ts...>>
  23. {
  24. using type = dynamic_geometry_tag;
  25. };
  26. template <typename ...Ts>
  27. struct visit<std::variant<Ts...>>
  28. {
  29. template <typename Function, typename Variant>
  30. static void apply(Function && function, Variant && variant)
  31. {
  32. std::visit(std::forward<Function>(function),
  33. std::forward<Variant>(variant));
  34. }
  35. };
  36. template <typename ...Ts, typename ...Us>
  37. struct visit<std::variant<Ts...>, std::variant<Us...>>
  38. {
  39. template <typename Function, typename Variant1, typename Variant2>
  40. static void apply(Function && function, Variant1 && variant1, Variant2 && variant2)
  41. {
  42. std::visit(std::forward<Function>(function),
  43. std::forward<Variant1>(variant1),
  44. std::forward<Variant2>(variant2));
  45. }
  46. };
  47. template <typename ...Ts>
  48. struct geometry_types<std::variant<Ts...>>
  49. {
  50. using type = util::type_sequence<Ts...>;
  51. };
  52. } // namespace traits
  53. }} // namespace boost::geometry
  54. #endif // BOOST_NO_CXX17_HDR_VARIANT
  55. #endif // BOOST_GEOMETRY_GEOMETRIES_ADAPTED_STD_VARIANT_HPP