diff --git a/include/vectorwrapper/vectorwrapper.hpp b/include/vectorwrapper/vectorwrapper.hpp index 1654b9e..3f42e1c 100644 --- a/include/vectorwrapper/vectorwrapper.hpp +++ b/include/vectorwrapper/vectorwrapper.hpp @@ -165,12 +165,18 @@ namespace vwr { template VecBase& operator-= ( const VecBase& parOther ); template VecBase& operator*= ( const VecBase& parOther ); template VecBase& operator/= ( const VecBase& parOther ); + VecBase& operator+= ( const scalar_type& parOther ); + VecBase& operator-= ( const scalar_type& parOther ); + VecBase& operator*= ( const scalar_type& parOther ); + VecBase& operator/= ( const scalar_type& parOther ); private: template void assign_values (const bt::number_seq&, Args... parArgs); template void assign_values_op (Op parOp, const bt::number_seq& parSeq, const VecBase& parOther); + template + void assign_values_op_scalar (Op parOp, const bt::number_seq& parSeq, const scalar_type& parOther); vector_type m_wrapped; }; diff --git a/include/vectorwrapper/vectorwrapper.inl b/include/vectorwrapper/vectorwrapper.inl index 7fe12e2..2ca67b5 100644 --- a/include/vectorwrapper/vectorwrapper.inl +++ b/include/vectorwrapper/vectorwrapper.inl @@ -61,6 +61,12 @@ namespace vwr { this->assign_values(parSeq, parOp((*this)[I], parOther[I])...); } + template + template + void VecBase::assign_values_op_scalar (Op parOp, const bt::number_seq& parSeq, const scalar_type& parOther) { + this->assign_values(parSeq, parOp((*this)[I], parOther)...); + } + template auto VecBase::operator[] (size_type parIndex) -> scalar_type& { return VecGetter::get_at(m_wrapped, parIndex); @@ -126,6 +132,27 @@ namespace vwr { return *this; } + template + VecBase& VecBase::operator+= (const scalar_type& parOther) { + this->assign_values_op_scalar(std::plus(), bt::number_range::dimensions>(), parOther); + return *this; + } + template + VecBase& VecBase::operator-= (const scalar_type& parOther) { + this->assign_values_op_scalar(std::minus(), bt::number_range::dimensions>(), parOther); + return *this; + } + template + VecBase& VecBase::operator*= (const scalar_type& parOther) { + this->assign_values_op_scalar(std::multiplies(), bt::number_range::dimensions>(), parOther); + return *this; + } + template + VecBase& VecBase::operator/= (const scalar_type& parOther) { + this->assign_values_op_scalar(std::divides(), bt::number_range::dimensions>(), parOther); + return *this; + } + template typename VectorWrapperInfo::scalar_type& VecGetter::get_at (T& parVec, size_type parIndex) { assert(parIndex < VectorWrapperInfo::dimensions); diff --git a/test/unit/test_operators.cpp b/test/unit/test_operators.cpp index 3e839ea..de9007f 100644 --- a/test/unit/test_operators.cpp +++ b/test/unit/test_operators.cpp @@ -166,3 +166,32 @@ TEST(vwr, bin_assign_op) { EXPECT_EQ(res, a); } } + +TEST(vwr, bin_assign_op_scalar) { + using namespace vwr; + + { + ivec3 a(2, 4, 8); + ivec3 res(2 + 20, 4 + 20, 8 + 20); + a += 20; + EXPECT_EQ(res, a); + } + { + ivec3 a(2, 4, 8); + ivec3 res(2 - 20, 4 - 20, 8 - 20); + a -= 20; + EXPECT_EQ(res, a); + } + { + ivec3 a(2, 4, 8); + ivec3 res(2 * 20, 4 * 20, 8 * 20); + a *= 20; + EXPECT_EQ(res, a); + } + { + ivec3 a(2, 4, 8); + ivec3 res(2 / 2, 4 / 2, 8 / 2); + a /= 2; + EXPECT_EQ(res, a); + } +}