//================================================================================================== /* ROTGEN - Runtime Overlay for Eigen Copyright : CODE RECKONS SPDX-License-Identifier: BSL-1.0 */ //================================================================================================== //================================================================================================== /* This file is a X-File to generate various block_impl_* definitions variant */ //================================================================================================== //================================================================================================== // Internal payload //================================================================================================== struct CLASSNAME::payload { using base_type = Eigen::Matrix; using data_type = Eigen::Block; data_type data; payload (data_type const& o) : data(o) {} payload (base_type& r, std::size_t i0, std::size_t j0, std::size_t ni, std::size_t nj) : data(r,i0,j0,ni,nj) {} }; //================================================================================================== // Constructors & Special Members //================================================================================================== CLASSNAME::CLASSNAME(SOURCENAME& r, std::size_t i0, std::size_t j0, std::size_t ni, std::size_t nj) : storage_(std::make_unique(r.storage()->data,i0,j0,ni,nj)) {} CLASSNAME::CLASSNAME(CLASSNAME const& o) : storage_(std::make_unique(o.storage_->data)) {} CLASSNAME& CLASSNAME::operator=(CLASSNAME const& o) { if (this != &o) storage_->data = o.storage_->data; return *this; } CLASSNAME::CLASSNAME(CLASSNAME&&) noexcept = default; CLASSNAME& CLASSNAME::operator=(CLASSNAME&&) noexcept = default; CLASSNAME::~CLASSNAME() = default; void CLASSNAME::assign(SOURCENAME const& m) { storage_->data = m.storage()->data; } //================================================================================================== // Matrix API //================================================================================================== rotgen::Index CLASSNAME::rows() const { return storage_->data.rows(); } rotgen::Index CLASSNAME::cols() const { return storage_->data.cols(); } rotgen::Index CLASSNAME::size() const { return storage_->data.size(); } rotgen::Index CLASSNAME::innerStride() const { return storage_->data.innerStride(); } rotgen::Index CLASSNAME::outerStride() const { return storage_->data.outerStride(); } TYPE& CLASSNAME::operator()(std::size_t i, std::size_t j) { return storage_->data(i,j); } TYPE const& CLASSNAME::operator()(std::size_t i, std::size_t j) const { return storage_->data(i,j); } TYPE& CLASSNAME::operator()(std::size_t index) { return storage_->data.data()[index]; } TYPE const& CLASSNAME::operator()(std::size_t index) const { return storage_->data.data()[index]; } TYPE* CLASSNAME::data() { return storage_->data.data(); } const TYPE* CLASSNAME::data() const { return storage_->data.data(); } SOURCENAME CLASSNAME::transpose() const { SOURCENAME result; result.storage()->assign(storage_->data.transpose().eval()); return result; } SOURCENAME CLASSNAME::conjugate() const { SOURCENAME result; result.storage()->assign(storage_->data.conjugate().eval()); return result; } SOURCENAME CLASSNAME::adjoint() const { SOURCENAME result; result.storage()->assign(storage_->data.adjoint().eval()); return result; } void CLASSNAME::transposeInPlace() { storage_->data.transposeInPlace(); } void CLASSNAME::adjointInPlace() { storage_->data.adjointInPlace(); } TYPE CLASSNAME::sum() const { return storage_->data.sum(); } TYPE CLASSNAME::prod() const { return storage_->data.prod(); } TYPE CLASSNAME::mean() const { return storage_->data.mean(); } TYPE CLASSNAME::trace() const { return storage_->data.trace(); } TYPE CLASSNAME::minCoeff() const { return storage_->data.minCoeff(); } TYPE CLASSNAME::maxCoeff() const { return storage_->data.maxCoeff(); } TYPE CLASSNAME::minCoeff(std::ptrdiff_t* row, std::ptrdiff_t* col) const { return storage_->data.minCoeff(row, col); } TYPE CLASSNAME::maxCoeff(std::ptrdiff_t* row, std::ptrdiff_t* col) const { return storage_->data.maxCoeff(row, col); } TYPE CLASSNAME::squaredNorm() const { return storage_->data.squaredNorm(); } TYPE CLASSNAME::norm() const { return storage_->data.norm(); } TYPE CLASSNAME::lpNorm(int p) const { if (p == 1) return storage_->data.lpNorm<1>(); else if (p == 2) return storage_->data.lpNorm<2>(); else return storage_->data.lpNorm(); } //================================================================================================== // Operators //================================================================================================== ROTGEN_EXPORT std::ostream& operator<<(std::ostream& os,CLASSNAME const& m) { return os << m.storage_->data; } ROTGEN_EXPORT bool operator==(CLASSNAME const& lhs, CLASSNAME const& rhs) { return lhs.storage_->data == rhs.storage_->data; } ROTGEN_EXPORT bool operator!=(CLASSNAME const& lhs, CLASSNAME const& rhs) { return lhs.storage_->data != rhs.storage_->data; } CLASSNAME& CLASSNAME::operator+=(CLASSNAME const& rhs) { storage_->data += rhs.storage_->data; return *this; } CLASSNAME& CLASSNAME::operator-=(CLASSNAME const& rhs) { storage_->data -= rhs.storage_->data; return *this; } SOURCENAME CLASSNAME::operator-() const { SOURCENAME result; result.storage()->assign(storage_->data); return -result; } CLASSNAME& CLASSNAME::operator*=(CLASSNAME const& rhs) { storage_->data *= rhs.storage_->data; return *this; } CLASSNAME& CLASSNAME::operator*=(TYPE s) { storage_->data *= s; return *this; } CLASSNAME& CLASSNAME::operator/=(TYPE s) { storage_->data /= s; return *this; } SOURCENAME CLASSNAME::add(CLASSNAME const& rhs) const { SOURCENAME result; result.storage()->assign(storage_->data + rhs.storage_->data); return result; } SOURCENAME CLASSNAME::sub(CLASSNAME const& rhs) const { SOURCENAME result; result.storage()->assign(storage_->data - rhs.storage_->data); return result; } SOURCENAME CLASSNAME::mul(CLASSNAME const& rhs) const { SOURCENAME result; result.storage()->assign(storage_->data * rhs.storage_->data); return result; } SOURCENAME CLASSNAME::mul(TYPE s) const { SOURCENAME result; result.storage()->assign(storage_->data * s); return result; } SOURCENAME CLASSNAME::div(TYPE s) const { SOURCENAME result; result.storage()->assign(storage_->data / s); return result; }