Skip to content

Commit

Permalink
update mdspan tpl
Browse files Browse the repository at this point in the history
  • Loading branch information
nmm0 committed Mar 6, 2024
1 parent 9a7e795 commit 121964a
Show file tree
Hide file tree
Showing 15 changed files with 1,359 additions and 292 deletions.
166 changes: 83 additions & 83 deletions tpls/mdspan/include/experimental/__p0009_bits/compressed_pair.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,165 +27,165 @@ namespace detail {

// For no unique address emulation, this is the case taken when neither are empty.
// For real `[[no_unique_address]]`, this case is always taken.
template <class _T, class _U, class _Enable = void> struct __compressed_pair {
_MDSPAN_NO_UNIQUE_ADDRESS _T __t_val;
_MDSPAN_NO_UNIQUE_ADDRESS _U __u_val;
MDSPAN_FORCE_INLINE_FUNCTION _MDSPAN_CONSTEXPR_14 _T &__first() noexcept { return __t_val; }
MDSPAN_FORCE_INLINE_FUNCTION constexpr _T const &__first() const noexcept {
return __t_val;
template <class _T1, class _T2, class _Enable = void> struct __compressed_pair {
_MDSPAN_NO_UNIQUE_ADDRESS _T1 __t1_val{};
_MDSPAN_NO_UNIQUE_ADDRESS _T2 __t2_val{};
MDSPAN_FORCE_INLINE_FUNCTION _MDSPAN_CONSTEXPR_14 _T1 &__first() noexcept { return __t1_val; }
MDSPAN_FORCE_INLINE_FUNCTION constexpr _T1 const &__first() const noexcept {
return __t1_val;
}
MDSPAN_FORCE_INLINE_FUNCTION _MDSPAN_CONSTEXPR_14 _U &__second() noexcept { return __u_val; }
MDSPAN_FORCE_INLINE_FUNCTION constexpr _U const &__second() const noexcept {
return __u_val;
MDSPAN_FORCE_INLINE_FUNCTION _MDSPAN_CONSTEXPR_14 _T2 &__second() noexcept { return __t2_val; }
MDSPAN_FORCE_INLINE_FUNCTION constexpr _T2 const &__second() const noexcept {
return __t2_val;
}

MDSPAN_INLINE_FUNCTION_DEFAULTED
constexpr __compressed_pair() noexcept = default;
constexpr __compressed_pair() = default;
MDSPAN_INLINE_FUNCTION_DEFAULTED
constexpr __compressed_pair(__compressed_pair const &) noexcept = default;
constexpr __compressed_pair(__compressed_pair const &) = default;
MDSPAN_INLINE_FUNCTION_DEFAULTED
constexpr __compressed_pair(__compressed_pair &&) noexcept = default;
constexpr __compressed_pair(__compressed_pair &&) = default;
MDSPAN_INLINE_FUNCTION_DEFAULTED
_MDSPAN_CONSTEXPR_14_DEFAULTED __compressed_pair &
operator=(__compressed_pair const &) noexcept = default;
operator=(__compressed_pair const &) = default;
MDSPAN_INLINE_FUNCTION_DEFAULTED
_MDSPAN_CONSTEXPR_14_DEFAULTED __compressed_pair &
operator=(__compressed_pair &&) noexcept = default;
operator=(__compressed_pair &&) = default;
MDSPAN_INLINE_FUNCTION_DEFAULTED
~__compressed_pair() noexcept = default;
template <class _TLike, class _ULike>
MDSPAN_INLINE_FUNCTION constexpr __compressed_pair(_TLike &&__t, _ULike &&__u)
: __t_val((_TLike &&) __t), __u_val((_ULike &&) __u) {}
~__compressed_pair() = default;
template <class _T1Like, class _T2Like>
MDSPAN_INLINE_FUNCTION constexpr __compressed_pair(_T1Like &&__t1, _T2Like &&__t2)
: __t1_val((_T1Like &&) __t1), __t2_val((_T2Like &&) __t2) {}
};

#if !defined(_MDSPAN_USE_ATTRIBUTE_NO_UNIQUE_ADDRESS)

// First empty.
template <class _T, class _U>
template <class _T1, class _T2>
struct __compressed_pair<
_T, _U,
std::enable_if_t<_MDSPAN_TRAIT(std::is_empty, _T) && !_MDSPAN_TRAIT(std::is_empty, _U)>>
: private _T {
_U __u_val;
MDSPAN_FORCE_INLINE_FUNCTION _MDSPAN_CONSTEXPR_14 _T &__first() noexcept {
return *static_cast<_T *>(this);
_T1, _T2,
std::enable_if_t<_MDSPAN_TRAIT(std::is_empty, _T1) && !_MDSPAN_TRAIT(std::is_empty, _T2)>>
: private _T1 {
_T2 __t2_val{};
MDSPAN_FORCE_INLINE_FUNCTION _MDSPAN_CONSTEXPR_14 _T1 &__first() noexcept {
return *static_cast<_T1 *>(this);
}
MDSPAN_FORCE_INLINE_FUNCTION constexpr _T const &__first() const noexcept {
return *static_cast<_T const *>(this);
MDSPAN_FORCE_INLINE_FUNCTION constexpr _T1 const &__first() const noexcept {
return *static_cast<_T1 const *>(this);
}
MDSPAN_FORCE_INLINE_FUNCTION _MDSPAN_CONSTEXPR_14 _U &__second() noexcept { return __u_val; }
MDSPAN_FORCE_INLINE_FUNCTION constexpr _U const &__second() const noexcept {
return __u_val;
MDSPAN_FORCE_INLINE_FUNCTION _MDSPAN_CONSTEXPR_14 _T2 &__second() noexcept { return __t2_val; }
MDSPAN_FORCE_INLINE_FUNCTION constexpr _T2 const &__second() const noexcept {
return __t2_val;
}

MDSPAN_INLINE_FUNCTION_DEFAULTED
constexpr __compressed_pair() noexcept = default;
constexpr __compressed_pair() = default;
MDSPAN_INLINE_FUNCTION_DEFAULTED
constexpr __compressed_pair(__compressed_pair const &) noexcept = default;
constexpr __compressed_pair(__compressed_pair const &) = default;
MDSPAN_INLINE_FUNCTION_DEFAULTED
constexpr __compressed_pair(__compressed_pair &&) noexcept = default;
constexpr __compressed_pair(__compressed_pair &&) = default;
MDSPAN_INLINE_FUNCTION_DEFAULTED
_MDSPAN_CONSTEXPR_14_DEFAULTED __compressed_pair &
operator=(__compressed_pair const &) noexcept = default;
operator=(__compressed_pair const &) = default;
MDSPAN_INLINE_FUNCTION_DEFAULTED
_MDSPAN_CONSTEXPR_14_DEFAULTED __compressed_pair &
operator=(__compressed_pair &&) noexcept = default;
operator=(__compressed_pair &&) = default;
MDSPAN_INLINE_FUNCTION_DEFAULTED
~__compressed_pair() noexcept = default;
template <class _TLike, class _ULike>
MDSPAN_INLINE_FUNCTION constexpr __compressed_pair(_TLike &&__t, _ULike &&__u)
: _T((_TLike &&) __t), __u_val((_ULike &&) __u) {}
~__compressed_pair() = default;
template <class _T1Like, class _T2Like>
MDSPAN_INLINE_FUNCTION constexpr __compressed_pair(_T1Like &&__t1, _T2Like &&__t2)
: _T1((_T1Like &&) __t1), __t2_val((_T2Like &&) __t2) {}
};

// Second empty.
template <class _T, class _U>
template <class _T1, class _T2>
struct __compressed_pair<
_T, _U,
std::enable_if_t<!_MDSPAN_TRAIT(std::is_empty, _T) && _MDSPAN_TRAIT(std::is_empty, _U)>>
: private _U {
_T __t_val;
MDSPAN_FORCE_INLINE_FUNCTION _MDSPAN_CONSTEXPR_14 _T &__first() noexcept { return __t_val; }
MDSPAN_FORCE_INLINE_FUNCTION constexpr _T const &__first() const noexcept {
return __t_val;
_T1, _T2,
std::enable_if_t<!_MDSPAN_TRAIT(std::is_empty, _T1) && _MDSPAN_TRAIT(std::is_empty, _T2)>>
: private _T2 {
_T1 __t1_val{};
MDSPAN_FORCE_INLINE_FUNCTION _MDSPAN_CONSTEXPR_14 _T1 &__first() noexcept { return __t1_val; }
MDSPAN_FORCE_INLINE_FUNCTION constexpr _T1 const &__first() const noexcept {
return __t1_val;
}
MDSPAN_FORCE_INLINE_FUNCTION _MDSPAN_CONSTEXPR_14 _U &__second() noexcept {
return *static_cast<_U *>(this);
MDSPAN_FORCE_INLINE_FUNCTION _MDSPAN_CONSTEXPR_14 _T2 &__second() noexcept {
return *static_cast<_T2 *>(this);
}
MDSPAN_FORCE_INLINE_FUNCTION constexpr _U const &__second() const noexcept {
return *static_cast<_U const *>(this);
MDSPAN_FORCE_INLINE_FUNCTION constexpr _T2 const &__second() const noexcept {
return *static_cast<_T2 const *>(this);
}

MDSPAN_INLINE_FUNCTION_DEFAULTED
constexpr __compressed_pair() noexcept = default;
constexpr __compressed_pair() = default;
MDSPAN_INLINE_FUNCTION_DEFAULTED
constexpr __compressed_pair(__compressed_pair const &) noexcept = default;
constexpr __compressed_pair(__compressed_pair const &) = default;
MDSPAN_INLINE_FUNCTION_DEFAULTED
constexpr __compressed_pair(__compressed_pair &&) noexcept = default;
constexpr __compressed_pair(__compressed_pair &&) = default;
MDSPAN_INLINE_FUNCTION_DEFAULTED
_MDSPAN_CONSTEXPR_14_DEFAULTED __compressed_pair &
operator=(__compressed_pair const &) noexcept = default;
operator=(__compressed_pair const &) = default;
MDSPAN_INLINE_FUNCTION_DEFAULTED
_MDSPAN_CONSTEXPR_14_DEFAULTED __compressed_pair &
operator=(__compressed_pair &&) noexcept = default;
operator=(__compressed_pair &&) = default;
MDSPAN_INLINE_FUNCTION_DEFAULTED
~__compressed_pair() noexcept = default;
~__compressed_pair() = default;

template <class _TLike, class _ULike>
MDSPAN_INLINE_FUNCTION constexpr __compressed_pair(_TLike &&__t, _ULike &&__u)
: _U((_ULike &&) __u), __t_val((_TLike &&) __t) {}
template <class _T1Like, class _T2Like>
MDSPAN_INLINE_FUNCTION constexpr __compressed_pair(_T1Like &&__t1, _T2Like &&__t2)
: _T2((_T2Like &&) __t2), __t1_val((_T1Like &&) __t1) {}
};

// Both empty.
template <class _T, class _U>
template <class _T1, class _T2>
struct __compressed_pair<
_T, _U,
std::enable_if_t<_MDSPAN_TRAIT(std::is_empty, _T) && _MDSPAN_TRAIT(std::is_empty, _U)>>
_T1, _T2,
std::enable_if_t<_MDSPAN_TRAIT(std::is_empty, _T1) && _MDSPAN_TRAIT(std::is_empty, _T2)>>
// We need to use the __no_unique_address_emulation wrapper here to avoid
// base class ambiguities.
#ifdef _MDSPAN_COMPILER_MSVC
// MSVC doesn't allow you to access public static member functions of a type
// when you *happen* to privately inherit from that type.
: protected __no_unique_address_emulation<_T, 0>,
protected __no_unique_address_emulation<_U, 1>
: protected __no_unique_address_emulation<_T1, 0>,
protected __no_unique_address_emulation<_T2, 1>
#else
: private __no_unique_address_emulation<_T, 0>,
private __no_unique_address_emulation<_U, 1>
: private __no_unique_address_emulation<_T1, 0>,
private __no_unique_address_emulation<_T2, 1>
#endif
{
using __first_base_t = __no_unique_address_emulation<_T, 0>;
using __second_base_t = __no_unique_address_emulation<_U, 1>;
using __first_base_t = __no_unique_address_emulation<_T1, 0>;
using __second_base_t = __no_unique_address_emulation<_T2, 1>;

MDSPAN_FORCE_INLINE_FUNCTION _MDSPAN_CONSTEXPR_14 _T &__first() noexcept {
MDSPAN_FORCE_INLINE_FUNCTION _MDSPAN_CONSTEXPR_14 _T1 &__first() noexcept {
return this->__first_base_t::__ref();
}
MDSPAN_FORCE_INLINE_FUNCTION constexpr _T const &__first() const noexcept {
MDSPAN_FORCE_INLINE_FUNCTION constexpr _T1 const &__first() const noexcept {
return this->__first_base_t::__ref();
}
MDSPAN_FORCE_INLINE_FUNCTION _MDSPAN_CONSTEXPR_14 _U &__second() noexcept {
MDSPAN_FORCE_INLINE_FUNCTION _MDSPAN_CONSTEXPR_14 _T2 &__second() noexcept {
return this->__second_base_t::__ref();
}
MDSPAN_FORCE_INLINE_FUNCTION constexpr _U const &__second() const noexcept {
MDSPAN_FORCE_INLINE_FUNCTION constexpr _T2 const &__second() const noexcept {
return this->__second_base_t::__ref();
}

MDSPAN_INLINE_FUNCTION_DEFAULTED
constexpr __compressed_pair() noexcept = default;
constexpr __compressed_pair() = default;
MDSPAN_INLINE_FUNCTION_DEFAULTED
constexpr __compressed_pair(__compressed_pair const &) noexcept = default;
constexpr __compressed_pair(__compressed_pair const &) = default;
MDSPAN_INLINE_FUNCTION_DEFAULTED
constexpr __compressed_pair(__compressed_pair &&) noexcept = default;
constexpr __compressed_pair(__compressed_pair &&) = default;
MDSPAN_INLINE_FUNCTION_DEFAULTED
_MDSPAN_CONSTEXPR_14_DEFAULTED __compressed_pair &
operator=(__compressed_pair const &) noexcept = default;
operator=(__compressed_pair const &) = default;
MDSPAN_INLINE_FUNCTION_DEFAULTED
_MDSPAN_CONSTEXPR_14_DEFAULTED __compressed_pair &
operator=(__compressed_pair &&) noexcept = default;
operator=(__compressed_pair &&) = default;
MDSPAN_INLINE_FUNCTION_DEFAULTED
~__compressed_pair() noexcept = default;
template <class _TLike, class _ULike>
MDSPAN_INLINE_FUNCTION constexpr __compressed_pair(_TLike &&__t, _ULike &&__u) noexcept
: __first_base_t(_T((_TLike &&) __t)),
__second_base_t(_U((_ULike &&) __u))
~__compressed_pair() = default;
template <class _T1Like, class _T2Like>
MDSPAN_INLINE_FUNCTION constexpr __compressed_pair(_T1Like &&__t1, _T2Like &&__t2) noexcept
: __first_base_t(_T1((_T1Like &&) __t1)),
__second_base_t(_T2((_T2Like &&) __t2))
{ }
};

Expand Down
9 changes: 8 additions & 1 deletion tpls/mdspan/include/experimental/__p0009_bits/config.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -35,10 +35,17 @@
#define MDSPAN_CXX_STD_14 201402L
#define MDSPAN_CXX_STD_17 201703L
#define MDSPAN_CXX_STD_20 202002L
// Note GCC has not updated this in version 13
#ifdef __clang__
#define MDSPAN_CXX_STD_23 202302L
#else
#define MDSPAN_CXX_STD_23 202100L
#endif

#define MDSPAN_HAS_CXX_14 (_MDSPAN_CPLUSPLUS >= MDSPAN_CXX_STD_14)
#define MDSPAN_HAS_CXX_17 (_MDSPAN_CPLUSPLUS >= MDSPAN_CXX_STD_17)
#define MDSPAN_HAS_CXX_20 (_MDSPAN_CPLUSPLUS >= MDSPAN_CXX_STD_20)
#define MDSPAN_HAS_CXX_23 (_MDSPAN_CPLUSPLUS >= MDSPAN_CXX_STD_23)

static_assert(_MDSPAN_CPLUSPLUS >= MDSPAN_CXX_STD_14, "mdspan requires C++14 or later.");

Expand Down Expand Up @@ -224,7 +231,7 @@ static_assert(_MDSPAN_CPLUSPLUS >= MDSPAN_CXX_STD_14, "mdspan requires C++14 or
#endif

#ifndef MDSPAN_CONDITIONAL_EXPLICIT
# if MDSPAN_HAS_CXX_20 && !defined(_MDSPAN_COMPILER_MSVC)
# if MDSPAN_HAS_CXX_20
# define MDSPAN_CONDITIONAL_EXPLICIT(COND) explicit(COND)
# else
# define MDSPAN_CONDITIONAL_EXPLICIT(COND)
Expand Down

0 comments on commit 121964a

Please sign in to comment.