Skip to content

Commit

Permalink
Fix pod utility for rvalue references
Browse files Browse the repository at this point in the history
  • Loading branch information
Malacath-92 committed Jan 14, 2025
1 parent e208e04 commit c56151b
Show file tree
Hide file tree
Showing 2 changed files with 65 additions and 19 deletions.
26 changes: 15 additions & 11 deletions include/dla/detail/vector_elements.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,9 +37,10 @@ namespace dla::detail {
constexpr explicit vec_elements(const vec_elements<U, 1>& val);
template<class U, typename = std::enable_if_t<std::is_assignable_v<std::add_lvalue_reference_t<T>, U>>>
constexpr vec_elements& operator=(const vec_elements<U, 1>& val);

constexpr auto pod();
constexpr auto pod() const;

constexpr auto pod() &;
constexpr auto pod() const &;
constexpr auto pod() &&;

union { value_type x, r, s; };
};
Expand All @@ -65,8 +66,9 @@ namespace dla::detail {
template<class U, typename = std::enable_if_t<std::is_assignable_v<std::add_lvalue_reference_t<T>, U>>>
constexpr vec_elements& operator=(const vec_elements<U, 2>& val);

constexpr auto pod();
constexpr auto pod() const;
constexpr auto pod() &;
constexpr auto pod() const &;
constexpr auto pod() &&;

union { value_type x, r, s; };
union { value_type y, g, t; };
Expand Down Expand Up @@ -95,9 +97,10 @@ namespace dla::detail {
constexpr explicit vec_elements(const vec_elements<U, 3>& val);
template<class U, typename = std::enable_if_t<std::is_assignable_v<std::add_lvalue_reference_t<T>, U>>>
constexpr vec_elements& operator=(const vec_elements<U, 3>& val);

constexpr auto pod();
constexpr auto pod() const;

constexpr auto pod() &;
constexpr auto pod() const &;
constexpr auto pod() &&;

union { value_type x, r, s; };
union { value_type y, g, t; };
Expand Down Expand Up @@ -131,9 +134,10 @@ namespace dla::detail {
constexpr explicit vec_elements(const vec_elements<U, 4>& val);
template<class U, typename = std::enable_if_t<std::is_assignable_v<std::add_lvalue_reference_t<T>, U>>>
constexpr vec_elements& operator=(const vec_elements<U, 4>& val);

constexpr auto pod();
constexpr auto pod() const;

constexpr auto pod() &;
constexpr auto pod() const &;
constexpr auto pod() &&;

union { value_type x, r, s; };
union { value_type y, g, t; };
Expand Down
58 changes: 50 additions & 8 deletions include/dla/detail/vector_elements.inl
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ namespace dla::detail {
}

template<class T>
constexpr auto vec_elements<T, 1>::pod() {
constexpr auto vec_elements<T, 1>::pod() & {
struct vec_pod
{
value_type& x;
Expand All @@ -34,14 +34,23 @@ namespace dla::detail {
}

template<class T>
constexpr auto vec_elements<T, 1>::pod() const {
constexpr auto vec_elements<T, 1>::pod() const & {
struct vec_pod
{
const value_type& x;
};
return vec_pod{ x };
}

template<class T>
constexpr auto vec_elements<T, 1>::pod() && {
struct vec_pod
{
value_type x;
};
return vec_pod{ std::move(x) };
}



template<class T>
Expand Down Expand Up @@ -71,7 +80,7 @@ namespace dla::detail {
}

template<class T>
constexpr auto vec_elements<T, 2>::pod() {
constexpr auto vec_elements<T, 2>::pod() & {
struct vec_pod
{
value_type& x;
Expand All @@ -81,7 +90,7 @@ namespace dla::detail {
}

template<class T>
constexpr auto vec_elements<T, 2>::pod() const {
constexpr auto vec_elements<T, 2>::pod() const & {
struct vec_pod
{
const value_type& x;
Expand All @@ -90,6 +99,16 @@ namespace dla::detail {
return vec_pod{ x, y };
}

template<class T>
constexpr auto vec_elements<T, 2>::pod() && {
struct vec_pod
{
value_type x;
value_type y;
};
return vec_pod{ std::move(x), std::move(y) };
}



template<class T>
Expand Down Expand Up @@ -130,7 +149,7 @@ namespace dla::detail {
}

template<class T>
constexpr auto vec_elements<T, 3>::pod() {
constexpr auto vec_elements<T, 3>::pod() & {
struct vec_pod
{
value_type& x;
Expand All @@ -141,7 +160,7 @@ namespace dla::detail {
}

template<class T>
constexpr auto vec_elements<T, 3>::pod() const {
constexpr auto vec_elements<T, 3>::pod() const & {
struct vec_pod
{
const value_type& x;
Expand All @@ -150,6 +169,17 @@ namespace dla::detail {
};
return vec_pod{ x, y, z };
}

template<class T>
constexpr auto vec_elements<T, 3>::pod() && {
struct vec_pod
{
value_type x;
value_type y;
value_type z;
};
return vec_pod{ std::move(x), std::move(y), std::move(z) };
}



Expand Down Expand Up @@ -208,7 +238,7 @@ namespace dla::detail {
}

template<class T>
constexpr auto vec_elements<T, 4>::pod() {
constexpr auto vec_elements<T, 4>::pod() & {
struct vec_pod
{
value_type& x;
Expand All @@ -220,7 +250,7 @@ namespace dla::detail {
}

template<class T>
constexpr auto vec_elements<T, 4>::pod() const {
constexpr auto vec_elements<T, 4>::pod() const & {
struct vec_pod
{
const value_type& x;
Expand All @@ -230,4 +260,16 @@ namespace dla::detail {
};
return vec_pod{ x, y, z, w };
}

template<class T>
constexpr auto vec_elements<T, 4>::pod() && {
struct vec_pod
{
value_type x;
value_type y;
value_type z;
value_type w;
};
return vec_pod{ std::move(x), std::move(y), std::move(z), std::move(w) };
}
}

0 comments on commit c56151b

Please sign in to comment.