[libcxx][nfc] Remove <variant>'s dependence on <array>.
authorzoecarver <z.zoelec2@gmail.com>
Wed, 7 Jul 2021 22:25:53 +0000 (15:25 -0700)
committerzoecarver <z.zoelec2@gmail.com>
Fri, 9 Jul 2021 17:13:57 +0000 (10:13 -0700)
This will allow us to use variant in common_iterator. We do this by introducing a new `__light_array` type that variant uses instead of `std::array`.

Differential Revision: https://reviews.llvm.org/D105597

libcxx/docs/ReleaseNotes.rst
libcxx/include/variant

index bda3c64..7687414 100644 (file)
@@ -69,3 +69,5 @@ API Changes
 - The `LIBCXXABI_ENABLE_PIC` CMake option was removed. If you are building your
   own libc++abi from source and were using `LIBCXXABI_ENABLE_PIC`, please use
   `CMAKE_POSITION_INDEPENDENT_CODE=ON` instead.
+
+- When the header <variant> is included, it will no longer include <array> transitively.
index 08b6461..7e8b683 100644 (file)
@@ -204,7 +204,6 @@ namespace std {
 #include <__utility/forward.h>
 #include <__variant/monostate.h>
 #include <__tuple>
-#include <array>
 #include <compare>
 #include <exception>
 #include <functional>
@@ -239,6 +238,19 @@ _LIBCPP_BEGIN_NAMESPACE_STD
 //       Remove this once we drop support for GCC 5.
 #if _LIBCPP_STD_VER > 14 && !(defined(_LIBCPP_COMPILER_GCC) && _GNUC_VER_NEW < 6000)
 
+// Light N-dimensional array of function pointers. Used in place of std::array to avoid
+// adding a dependency.
+template<class _Tp, size_t _Size>
+struct __farray {
+  static_assert(_Size > 0, "N-dimensional array should never be empty in std::visit");
+  _Tp __buf_[_Size] = {};
+
+  _LIBCPP_INLINE_VISIBILITY constexpr
+  const _Tp &operator[](size_t __n) const noexcept {
+      return __buf_[__n];
+  }
+};
+
 _LIBCPP_NORETURN
 inline _LIBCPP_INLINE_VISIBILITY
 _LIBCPP_AVAILABILITY_THROW_BAD_VARIANT_ACCESS
@@ -499,7 +511,7 @@ private:
 
   template <class _Tp, size_t _Np, typename... _Indices>
   inline _LIBCPP_INLINE_VISIBILITY
-  static constexpr auto&& __at(const array<_Tp, _Np>& __elems,
+  static constexpr auto&& __at(const __farray<_Tp, _Np>& __elems,
                                size_t __index, _Indices... __indices) {
     return __at(__elems[__index], __indices...);
   }
@@ -515,7 +527,7 @@ private:
   inline _LIBCPP_INLINE_VISIBILITY
   static constexpr auto __make_farray(_Fs&&... __fs) {
     __std_visit_visitor_return_type_check<__uncvref_t<_Fs>...>();
-    using __result = array<common_type_t<__uncvref_t<_Fs>...>, sizeof...(_Fs)>;
+    using __result = __farray<common_type_t<__uncvref_t<_Fs>...>, sizeof...(_Fs)>;
     return __result{{_VSTD::forward<_Fs>(__fs)...}};
   }