to_array.hpp 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. #ifndef BOOST_COMPAT_TO_ARRAY_HPP_INCLUDED
  2. #define BOOST_COMPAT_TO_ARRAY_HPP_INCLUDED
  3. // Copyright 2024 Ruben Perez Hidalgo
  4. // Distributed under the Boost Software License, Version 1.0.
  5. // https://www.boost.org/LICENSE_1_0.txt
  6. #include <boost/compat/integer_sequence.hpp>
  7. #include <boost/compat/type_traits.hpp>
  8. #include <array>
  9. #include <cstddef>
  10. #include <type_traits>
  11. #include <utility>
  12. namespace boost {
  13. namespace compat {
  14. namespace detail {
  15. template <class T, std::size_t N, std::size_t... I>
  16. constexpr std::array<remove_cv_t<T>, N> to_array_lvalue(T (&a)[N], index_sequence<I...>)
  17. {
  18. return {{a[I]...}};
  19. }
  20. template <class T, std::size_t N, std::size_t... I>
  21. constexpr std::array<remove_cv_t<T>, N> to_array_rvalue(T (&&a)[N], index_sequence<I...>)
  22. {
  23. return {{std::move(a[I])...}};
  24. }
  25. } // namespace detail
  26. template <class T, std::size_t N>
  27. constexpr std::array<remove_cv_t<T>, N> to_array(T (&a)[N])
  28. {
  29. static_assert(
  30. std::is_constructible<remove_cv_t<T>, T&>::value,
  31. "This overload requires the resulting element type to be constructible from T&"
  32. );
  33. static_assert(!std::is_array<T>::value, "to_array does not work for multi-dimensional C arrays");
  34. return detail::to_array_lvalue(a, make_index_sequence<N>{});
  35. }
  36. template <class T, std::size_t N>
  37. constexpr std::array<remove_cv_t<T>, N> to_array(T (&&a)[N])
  38. {
  39. static_assert(
  40. std::is_constructible<remove_cv_t<T>, T&&>::value,
  41. "This overload requires the resulting element type to be constructible from T&&"
  42. );
  43. static_assert(!std::is_array<T>::value, "to_array does not work for multi-dimensional C arrays");
  44. return detail::to_array_rvalue(static_cast<T(&&)[N]>(a), make_index_sequence<N>{});
  45. }
  46. } // namespace compat
  47. } // namespace boost
  48. #endif // BOOST_COMPAT_TO_ARRAY_HPP_INCLUDED