Merge branch 'fix/oopsies' into 'main'

Small fixes that went through last review


See merge request oss/rotgen!52
This commit is contained in:
Joel Falcou 2026-01-02 20:23:59 +01:00
commit c7b7709cc1
2 changed files with 61 additions and 173 deletions

View file

@ -143,7 +143,10 @@ namespace rotgen
value_type _norm() const { return parent::norm(); } value_type _norm() const { return parent::norm(); }
value_type _lpNorm() const { return parent::lpNorm(); } template<int P> value_type _lpNorm() const
{
return parent::template lpNorm<P>();
}
value_type _squaredNorm() const { return parent::squaredNorm(); } value_type _squaredNorm() const { return parent::squaredNorm(); }

View file

@ -23,10 +23,7 @@ namespace rotgen
{ {
if constexpr (requires { m.rows(); }) { return m.rows(); } if constexpr (requires { m.rows(); }) { return m.rows(); }
else if constexpr (requires { m._rows(); }) { return m._rows(); } else if constexpr (requires { m._rows(); }) { return m._rows(); }
else else { return detail::unsupported_parameters<decltype(m)>(); }
{
return detail::unsupported_parameters<decltype(m)>();
}
} }
/// Returns the column count of a matrix. /// Returns the column count of a matrix.
@ -35,30 +32,21 @@ namespace rotgen
if constexpr (requires { m.cols(); }) { return m.cols(); } if constexpr (requires { m.cols(); }) { return m.cols(); }
else if constexpr (requires { m._cols(); }) { return m._cols(); } else if constexpr (requires { m._cols(); }) { return m._cols(); }
else else { return detail::unsupported_parameters<decltype(m)>(); }
{
return detail::unsupported_parameters<decltype(m)>();
}
} }
Index startRow(auto const& m) Index startRow(auto const& m)
{ {
if constexpr (requires { m.startRow(); }) { return m.startRow(); } if constexpr (requires { m.startRow(); }) { return m.startRow(); }
else if constexpr (requires { m._startRow(); }) { return m._startRow(); } else if constexpr (requires { m._startRow(); }) { return m._startRow(); }
else else { return detail::unsupported_parameters<decltype(m)>(); }
{
return detail::unsupported_parameters<decltype(m)>();
}
} }
Index startCol(auto const& m) Index startCol(auto const& m)
{ {
if constexpr (requires { m.startCol(); }) { return m.startCol(); } if constexpr (requires { m.startCol(); }) { return m.startCol(); }
else if constexpr (requires { m._startCol(); }) { return m._startCol(); } else if constexpr (requires { m._startCol(); }) { return m._startCol(); }
else else { return detail::unsupported_parameters<decltype(m)>(); }
{
return detail::unsupported_parameters<decltype(m)>();
}
} }
/// Returns the size of a matrix. /// Returns the size of a matrix.
@ -92,10 +80,7 @@ namespace rotgen
{ {
a._conservativeResize(s); a._conservativeResize(s);
} }
else else { return detail::unsupported_parameters<decltype(a)>(); }
{
return detail::unsupported_parameters<decltype(a)>();
}
} }
void conservativeResize(auto& a, int r, int c) void conservativeResize(auto& a, int r, int c)
@ -108,10 +93,7 @@ namespace rotgen
{ {
a._conservativeResize(r, c); a._conservativeResize(r, c);
} }
else else { return detail::unsupported_parameters<decltype(a)>(); }
{
return detail::unsupported_parameters<decltype(a)>();
}
} }
Index innerStride(auto const& m) Index innerStride(auto const& m)
@ -121,10 +103,7 @@ namespace rotgen
{ {
return m._innerStride(); return m._innerStride();
} }
else else { return detail::unsupported_parameters<decltype(m)>(); }
{
return detail::unsupported_parameters<decltype(m)>();
}
} }
Index outerStride(auto const& m) Index outerStride(auto const& m)
@ -134,10 +113,7 @@ namespace rotgen
{ {
return m._outerStride(); return m._outerStride();
} }
else else { return detail::unsupported_parameters<decltype(m)>(); }
{
return detail::unsupported_parameters<decltype(m)>();
}
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
@ -151,20 +127,14 @@ namespace rotgen
{ {
return m._normalized(); return m._normalized();
} }
else else { return detail::unsupported_parameters<decltype(m)>(); }
{
return detail::unsupported_parameters<decltype(m)>();
}
} }
decltype(auto) transpose(auto const& m) decltype(auto) transpose(auto const& m)
{ {
if constexpr (requires { m.transpose(); }) { return m.transpose(); } if constexpr (requires { m.transpose(); }) { return m.transpose(); }
else if constexpr (requires { m._transpose(); }) { return m._transpose(); } else if constexpr (requires { m._transpose(); }) { return m._transpose(); }
else else { return detail::unsupported_parameters<decltype(m)>(); }
{
return detail::unsupported_parameters<decltype(m)>();
}
} }
decltype(auto) conjugate(auto const& m) decltype(auto) conjugate(auto const& m)
@ -177,49 +147,46 @@ namespace rotgen
{ {
if constexpr (requires { m.adjoint(); }) { return m.adjoint(); } if constexpr (requires { m.adjoint(); }) { return m.adjoint(); }
else if constexpr (requires { m._adjoint(); }) { return m._adjoint(); } else if constexpr (requires { m._adjoint(); }) { return m._adjoint(); }
else else { return detail::unsupported_parameters<decltype(m)>(); }
{
return detail::unsupported_parameters<decltype(m)>();
}
} }
void normalize(auto& a) template<typename C> void normalize(C&& a)
{ {
if constexpr (requires { a.normalize(); }) { a.normalize(); } if constexpr (requires { std::forward<C>(a).normalize(); })
else if constexpr (requires { a._normalize(); }) // PROCESSME
{ {
a._normalize(); std::forward<C>(a).normalize();
} }
else else if constexpr (requires { std::forward<C>(a)._normalize(); })
{ {
return detail::unsupported_parameters<decltype(a)>(); std::forward<C>(a)._normalize();
} }
else { return detail::unsupported_parameters<decltype(a)>(); }
} }
void transposeInPlace(auto& a) template<typename C> void transposeInPlace(C&& a)
{ {
if constexpr (requires { a.transposeInPlace(); }) { a.transposeInPlace(); } if constexpr (requires { std::forward<C>(a).transposeInPlace(); })
else if constexpr (requires { a._transposeInPlace(); }) // PROCESSME
{ {
a._transposeInPlace(); std::forward<C>(a).transposeInPlace();
} }
else else if constexpr (requires { std::forward<C>(a)._transposeInPlace(); })
{ {
return detail::unsupported_parameters<decltype(a)>(); std::forward<C>(a)._transposeInPlace();
} }
else { return detail::unsupported_parameters<decltype(a)>(); }
} }
void adjointInPlace(auto& a) template<typename C> void adjointInPlace(C&& a)
{ {
if constexpr (requires { a.adjointInPlace(); }) { a.adjointInPlace(); } if constexpr (requires { std::forward<C>(a).adjointInPlace(); })
else if constexpr (requires { a._adjointInPlace(); }) // PROCESSME
{ {
a._adjointInPlace(); std::forward<C>(a).adjointInPlace();
} }
else else if constexpr (requires { std::forward<C>(a)._adjointInPlace(); })
{ {
return detail::unsupported_parameters<decltype(a)>(); std::forward<C>(a)._adjointInPlace();
} }
else { return detail::unsupported_parameters<decltype(a)>(); }
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
@ -233,10 +200,7 @@ namespace rotgen
{ {
return arg._cwiseAbs(); return arg._cwiseAbs();
} }
else else { return detail::unsupported_parameters<decltype(arg)>(); }
{
return detail::unsupported_parameters<decltype(arg)>();
}
} }
auto abs2(auto const& arg) auto abs2(auto const& arg)
@ -246,10 +210,7 @@ namespace rotgen
{ {
return arg._cwiseAbs2(); return arg._cwiseAbs2();
} }
else else { return detail::unsupported_parameters<decltype(arg)>(); }
{
return detail::unsupported_parameters<decltype(arg)>();
}
} }
auto rec(auto const& arg) auto rec(auto const& arg)
@ -262,10 +223,7 @@ namespace rotgen
{ {
return arg._cwiseInverse(); return arg._cwiseInverse();
} }
else else { return detail::unsupported_parameters<decltype(arg)>(); }
{
return detail::unsupported_parameters<decltype(arg)>();
}
} }
auto sqrt(auto const& arg) auto sqrt(auto const& arg)
@ -284,10 +242,7 @@ namespace rotgen
{ {
return min(generalize_t<A const>(a), generalize_t<B const>(b)); return min(generalize_t<A const>(a), generalize_t<B const>(b));
} }
else else { return base_of(a).cwiseMin(base_of(b)); }
{
return base_of(a).cwiseMin(base_of(b));
}
} }
template<concepts::entity A> template<concepts::entity A>
@ -297,10 +252,7 @@ namespace rotgen
{ {
return min(generalize_t<A const>(a), b); return min(generalize_t<A const>(a), b);
} }
else else { return base_of(a).cwiseMin(b); }
{
return base_of(a).cwiseMin(b);
}
} }
template<concepts::entity B> template<concepts::entity B>
@ -310,10 +262,7 @@ namespace rotgen
{ {
return min(a, generalize_t<B const>(b)); return min(a, generalize_t<B const>(b));
} }
else else { return base_of(b).cwiseMin(a); }
{
return base_of(b).cwiseMin(a);
}
} }
template<concepts::entity A, concepts::entity B> template<concepts::entity A, concepts::entity B>
@ -323,10 +272,7 @@ namespace rotgen
{ {
return max(generalize_t<A const>(a), generalize_t<B const>(b)); return max(generalize_t<A const>(a), generalize_t<B const>(b));
} }
else else { return base_of(a).cwiseMax(base_of(b)); }
{
return base_of(a).cwiseMax(base_of(b));
}
} }
template<concepts::entity A> template<concepts::entity A>
@ -336,10 +282,7 @@ namespace rotgen
{ {
return max(generalize_t<A const>(a), b); return max(generalize_t<A const>(a), b);
} }
else else { return base_of(a).cwiseMax(b); }
{
return base_of(a).cwiseMax(b);
}
} }
template<concepts::entity B> template<concepts::entity B>
@ -349,10 +292,7 @@ namespace rotgen
{ {
return max(a, generalize_t<B const>(b)); return max(a, generalize_t<B const>(b));
} }
else else { return base_of(b).cwiseMax(a); }
{
return base_of(b).cwiseMax(a);
}
} }
template<concepts::entity A, concepts::entity B> template<concepts::entity A, concepts::entity B>
@ -362,10 +302,7 @@ namespace rotgen
{ {
return mul(generalize_t<A const>(a), generalize_t<B const>(b)); return mul(generalize_t<A const>(a), generalize_t<B const>(b));
} }
else else { return base_of(a).cwiseProduct(base_of(b)); }
{
return base_of(a).cwiseProduct(base_of(b));
}
} }
template<concepts::entity A> template<concepts::entity A>
@ -387,10 +324,7 @@ namespace rotgen
{ {
return div(generalize_t<A const>(a), generalize_t<B const>(b)); return div(generalize_t<A const>(a), generalize_t<B const>(b));
} }
else else { return base_of(a).array() / base_of(b).array(); }
{
return base_of(a).array() / base_of(b).array();
}
} }
template<concepts::entity A> template<concepts::entity A>
@ -412,10 +346,7 @@ namespace rotgen
{ {
if constexpr (requires { arg.trace(); }) { return arg.trace(); } if constexpr (requires { arg.trace(); }) { return arg.trace(); }
else if constexpr (requires { arg._trace(); }) { return arg._trace(); } else if constexpr (requires { arg._trace(); }) { return arg._trace(); }
else else { return detail::unsupported_parameters<decltype(arg)>(); }
{
return detail::unsupported_parameters<decltype(arg)>();
}
} }
auto squaredNorm(auto const& arg) auto squaredNorm(auto const& arg)
@ -425,50 +356,36 @@ namespace rotgen
{ {
return arg._squaredNorm(); return arg._squaredNorm();
} }
else else { return detail::unsupported_parameters<decltype(arg)>(); }
{
return detail::unsupported_parameters<decltype(arg)>();
}
} }
auto norm(auto const& arg) auto norm(auto const& arg)
{ {
if constexpr (requires { arg.norm(); }) { return arg.norm(); } if constexpr (requires { arg.norm(); }) { return arg.norm(); }
else if constexpr (requires { arg._norm(); }) { return arg._norm(); } else if constexpr (requires { arg._norm(); }) { return arg._norm(); }
else else { return detail::unsupported_parameters<decltype(arg)>(); }
{
return detail::unsupported_parameters<decltype(arg)>();
}
} }
auto sum(auto const& arg) auto sum(auto const& arg)
requires(requires { arg.sum(); } || requires { arg._sum(); })
{ {
if constexpr (requires { arg.sum(); }) { return arg.sum(); } if constexpr (requires { arg.sum(); }) { return arg.sum(); }
else if constexpr (requires { arg._sum(); }) { return arg._sum(); } else if constexpr (requires { arg._sum(); }) { return arg._sum(); }
else else { return detail::unsupported_parameters<decltype(arg)>(); }
{
return detail::unsupported_parameters<decltype(arg)>();
}
} }
auto prod(auto const& arg) auto prod(auto const& arg)
{ {
if constexpr (requires { arg.prod(); }) { return arg.prod(); } if constexpr (requires { arg.prod(); }) { return arg.prod(); }
else if constexpr (requires { arg._prod(); }) { return arg._prod(); } else if constexpr (requires { arg._prod(); }) { return arg._prod(); }
else else { return detail::unsupported_parameters<decltype(arg)>(); }
{
return detail::unsupported_parameters<decltype(arg)>();
}
} }
auto mean(auto const& arg) auto mean(auto const& arg)
{ {
if constexpr (requires { arg.mean(); }) { return arg.mean(); } if constexpr (requires { arg.mean(); }) { return arg.mean(); }
else if constexpr (requires { arg._mean(); }) { return arg._mean(); } else if constexpr (requires { arg._mean(); }) { return arg._mean(); }
else else { return detail::unsupported_parameters<decltype(arg)>(); }
{
return detail::unsupported_parameters<decltype(arg)>();
}
} }
template<concepts::entity A, concepts::entity B> template<concepts::entity A, concepts::entity B>
@ -480,10 +397,7 @@ namespace rotgen
{ {
return dot(generalize_t<A const>(a), generalize_t<B const>(b)); return dot(generalize_t<A const>(a), generalize_t<B const>(b));
} }
else else { return base_of(a).dot(base_of(b)); }
{
return base_of(a).dot(base_of(b));
}
} }
auto maxCoeff(auto const& arg) auto maxCoeff(auto const& arg)
@ -493,10 +407,7 @@ namespace rotgen
{ {
return arg._maxCoeff(); return arg._maxCoeff();
} }
else else { return detail::unsupported_parameters<decltype(arg)>(); }
{
return detail::unsupported_parameters<decltype(arg)>();
}
} }
auto minCoeff(auto const& arg) auto minCoeff(auto const& arg)
@ -506,10 +417,7 @@ namespace rotgen
{ {
return arg._minCoeff(); return arg._minCoeff();
} }
else else { return detail::unsupported_parameters<decltype(arg)>(); }
{
return detail::unsupported_parameters<decltype(arg)>();
}
} }
template<std::integral IndexType> template<std::integral IndexType>
@ -523,10 +431,7 @@ namespace rotgen
{ {
return arg._maxCoeff(row, col); return arg._maxCoeff(row, col);
} }
else else { return detail::unsupported_parameters<decltype(arg)>(); }
{
return detail::unsupported_parameters<decltype(arg)>();
}
} }
template<std::integral IndexType> template<std::integral IndexType>
@ -540,10 +445,7 @@ namespace rotgen
{ {
return arg._minCoeff(row, col); return arg._minCoeff(row, col);
} }
else else { return detail::unsupported_parameters<decltype(arg)>(); }
{
return detail::unsupported_parameters<decltype(arg)>();
}
} }
template<int P, typename T> auto lpNorm(T const& arg) template<int P, typename T> auto lpNorm(T const& arg)
@ -558,16 +460,12 @@ namespace rotgen
static_assert(P == 1 || P == 2 || P == Infinity); static_assert(P == 1 || P == 2 || P == Infinity);
return arg.template _lpNorm<P>(); return arg.template _lpNorm<P>();
} }
else else { return detail::unsupported_parameters<decltype(arg)>(); }
{
return detail::unsupported_parameters<decltype(arg)>();
}
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
// Expression handling // Expression handling
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
template<typename T> decltype(auto) noalias(T&& t) template<typename T> decltype(auto) noalias(T&& t)
{ {
if constexpr (requires { std::forward<T>(t).noalias(); }) if constexpr (requires { std::forward<T>(t).noalias(); })
@ -578,10 +476,7 @@ namespace rotgen
{ {
return std::forward<T>(t)._noalias(); return std::forward<T>(t)._noalias();
} }
else else { return detail::unsupported_parameters<decltype(t)>(); }
{
return detail::unsupported_parameters<decltype(t)>();
}
} }
template<typename T> auto evaluate(T&& t) template<typename T> auto evaluate(T&& t)
@ -598,10 +493,7 @@ namespace rotgen
{ {
return std::forward<T>(t).eval(); return std::forward<T>(t).eval();
} }
else else { return detail::unsupported_parameters<decltype(t)>(); }
{
return detail::unsupported_parameters<decltype(t)>();
}
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
@ -609,17 +501,13 @@ namespace rotgen
// TODO: Adapt other functions ot behave as inverse and limit code in // TODO: Adapt other functions ot behave as inverse and limit code in
// non-ref/non-map containers // non-ref/non-map containers
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
template<typename A> auto inverse(A const& a) template<typename A> auto inverse(A const& a)
{ {
if constexpr (!use_expression_templates) if constexpr (!use_expression_templates)
{ {
return inverse(generalize_t<A const>(a)); return inverse(generalize_t<A const>(a));
} }
else else { return base_of(a).inverse(); }
{
return base_of(a).inverse();
}
} }
template<concepts::vectorND<3> L, concepts::vectorND<3> R> template<concepts::vectorND<3> L, concepts::vectorND<3> R>
@ -635,9 +523,6 @@ namespace rotgen
{ {
return base_of(l)._cross(base_of(r)); return base_of(l)._cross(base_of(r));
} }
else else { return l._cross(r); }
{
return l._cross(r);
}
} }
} }