Co-authored-by: Jules Pénuchot <jules@penuchot.com> Co-authored-by: Joel FALCOU <jfalcou@codereckons.com> See merge request oss/rotgen!41
63 lines
2.4 KiB
C++
63 lines
2.4 KiB
C++
//==================================================================================================
|
|
/*
|
|
ROTGEN - Runtime Overlay for Eigen
|
|
Copyright : CODE RECKONS
|
|
SPDX-License-Identifier: BSL-1.0
|
|
*/
|
|
//==================================================================================================
|
|
#pragma once
|
|
|
|
namespace rotgen::detail
|
|
{
|
|
template<typename EigenType,
|
|
template<typename, int, int, int, int, int> typename Wrapper>
|
|
struct as_concrete
|
|
{
|
|
using type = Wrapper<typename EigenType::value_type,
|
|
EigenType::RowsAtCompileTime,
|
|
EigenType::ColsAtCompileTime,
|
|
EigenType::Flags & 1,
|
|
EigenType::MaxRowsAtCompileTime,
|
|
EigenType::MaxColsAtCompileTime>;
|
|
};
|
|
|
|
template<typename EigenType,
|
|
template<typename, int, int, int, int, int> typename Wrapper>
|
|
using as_concrete_t =
|
|
typename as_concrete<std::remove_cvref_t<EigenType>, Wrapper>::type;
|
|
|
|
template<typename M, typename N>
|
|
inline constexpr bool has_same_vector_size = []() {
|
|
// No vector = noo size
|
|
if (!(M::IsVectorAtCompileTime && N::IsVectorAtCompileTime)) return false;
|
|
// Row vectors -> same Cols
|
|
if (M::RowsAtCompileTime == 1 && N::RowsAtCompileTime == 1)
|
|
return M::ColsAtCompileTime == N::ColsAtCompileTime;
|
|
// Col vectors -> same Rows
|
|
if (M::ColsAtCompileTime == 1 && N::ColsAtCompileTime == 1)
|
|
return M::RowsAtCompileTime == N::RowsAtCompileTime;
|
|
// Mixing 1xN with Mx1
|
|
return false;
|
|
}();
|
|
|
|
template<typename T>
|
|
using propagate_const =
|
|
std::conditional_t<T::is_immutable || std::is_const_v<T>,
|
|
std::add_const_t<T>,
|
|
T>;
|
|
|
|
template<auto M, auto N>
|
|
inline constexpr auto select_static =
|
|
(M == rotgen::Dynamic || N == rotgen::Dynamic) ? rotgen::Dynamic : M;
|
|
|
|
template<typename M1,
|
|
typename M2,
|
|
template<typename, int, int, int, int, int> typename Wrapper>
|
|
using composite_type =
|
|
Wrapper<typename M1::value_type,
|
|
select_static<M1::RowsAtCompileTime, M2::RowsAtCompileTime>,
|
|
select_static<M1::ColsAtCompileTime, M2::ColsAtCompileTime>,
|
|
M1::storage_order,
|
|
select_static<M1::MaxRowsAtCompileTime, M2::MaxRowsAtCompileTime>,
|
|
select_static<M1::MaxColsAtCompileTime, M2::MaxColsAtCompileTime>>;
|
|
}
|