Implements unary resize and conservativeResize

See merge request oss/rotgen!25
This commit is contained in:
Joel Falcou 2025-09-18 20:05:33 +02:00
parent c6316f9bc9
commit a864e2cf96
5 changed files with 47 additions and 9 deletions

View file

@ -94,12 +94,16 @@ namespace rotgen
inline constexpr bool storage_status =
[]()
{
// Actual static size
if(Rows > 0 && Cols > 0) return (Rows*Cols) <= max_static_size;
// Actual static size - vector 1xN
if(Rows == 1 && Cols == -1) return true;
// Actual static size - vector Nx1
else if(Rows == -1 && Cols == 1) return true;
// Actual static size - matrix
else if(Rows > 0 && Cols > 0) return (Rows*Cols) <= max_static_size;
// Dynamic size but static Max Size
else if(MaxRows > 0 && MaxCols > 0) return (MaxRows*MaxCols) <= max_static_size;
else if(MaxRows > 0 && MaxCols > 0) return (MaxRows*MaxCols) <= max_static_size;
// Everything dynamic already
else return false;
else return false;
}();
}
#endif

View file

@ -107,11 +107,23 @@ namespace rotgen
parent::resize(new_rows, new_cols);
}
void resize(int new_size) requires(IsVectorAtCompileTime && (Rows == -1 || Cols == -1))
{
if constexpr(Rows == -1) parent::resize(new_size,1);
else parent::resize(1,new_size);
}
void conservativeResize(int new_rows, int new_cols) requires(Rows == -1 && Cols == -1)
{
parent::conservativeResize(new_rows, new_cols);
}
void conservativeResize(int new_size) requires(IsVectorAtCompileTime && (Rows == -1 || Cols == -1))
{
if constexpr(Rows == -1) parent::conservativeResize(new_size,1);
else parent::conservativeResize(1,new_size);
}
matrix normalized() const requires(IsVectorAtCompileTime)
{
return matrix(base().normalized());

View file

@ -55,7 +55,7 @@ namespace rotgen
matrix() requires(has_static_storage) {}
matrix() requires(!has_static_storage) : parent(Rows > 0 ? Rows : 0, Cols > 0 ? Cols : 0){}
matrix(Index r, Index c) requires(!has_static_storage) : parent(r, c) {}
matrix(Index r, Index c) : parent(r, c) {}
matrix(const matrix& other) = default;
matrix(matrix&& other) = default;
@ -66,7 +66,7 @@ namespace rotgen
{}
matrix(Index n) requires(IsVectorAtCompileTime && (Rows != 1 || Cols != 1))
: matrix(Rows != -1 ? 1 : n, Cols != -1 ? 1 : n)
: parent(n)
{}
matrix(Scalar v) requires(Rows == 1 && Cols == 1) : parent
@ -210,11 +210,21 @@ namespace rotgen
else return base().cwiseSqrt();
}
void resize(int new_size) requires(IsVectorAtCompileTime && (Rows == -1 || Cols == -1))
{
parent::resize(new_size);
}
void resize(int new_rows, int new_cols) requires(Rows == -1 && Cols == -1)
{
parent::resize(new_rows, new_cols);
}
void conservativeResize(int new_size) requires(IsVectorAtCompileTime && (Rows == -1 || Cols == -1))
{
parent::conservativeResize(new_size);
}
void conservativeResize(int new_rows, int new_cols) requires(Rows == -1 && Cols == -1)
{
parent::conservativeResize(new_rows, new_cols);

View file

@ -13,6 +13,12 @@ namespace rotgen
std::size_t cols(concepts::entity auto const& arg) { return arg.cols(); }
std::size_t size(concepts::entity auto const& arg) { return arg.size(); }
template<concepts::entity E>
void resize(E& arg, int sz) requires requires{arg.resize(sz);}
{
arg.resize(sz);
}
template<concepts::entity E>
void resize(E& arg, int new_rows, int new_cols)
requires(E::RowsAtCompileTime == -1 && E::ColsAtCompileTime == -1)
@ -20,6 +26,12 @@ namespace rotgen
arg.resize(new_rows, new_cols);
}
template<concepts::entity E>
void conservativeResize(E& arg, int sz) requires requires{arg.conservativeResize(sz);}
{
arg.conservativeResize(sz);
}
template<concepts::entity E>
void conservativeResize(E& arg, int new_rows, int new_cols)
requires(E::RowsAtCompileTime == -1 && E::ColsAtCompileTime == -1)