Skip to content

Commit

Permalink
Added element-wise arithmetic operators to series<T>.
Browse files Browse the repository at this point in the history
  • Loading branch information
tedmiddleton committed Apr 28, 2023
1 parent 4a8e2b2 commit 19e45d3
Show file tree
Hide file tree
Showing 3 changed files with 786 additions and 0 deletions.
280 changes: 280 additions & 0 deletions mainframe/impl/series.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -491,6 +491,286 @@ series<T>::operator!=(const series<T>& other) const
return m_name != other.m_name || *m_sharedvec != *(other.m_sharedvec);
}

template<typename T>
template<typename U>
void
series<T>::operator+=(const U& value)
{
unref();
for (T& t : *m_sharedvec) {
t += value;
}
}

template<typename T>
template<typename U>
void
series<T>::operator-=(const U& value)
{
unref();
for (T& t : *m_sharedvec) {
t -= value;
}
}

template<typename T>
template<typename U>
void
series<T>::operator*=(const U& value)
{
unref();
for (T& t : *m_sharedvec) {
t *= value;
}
}

template<typename T>
template<typename U>
void
series<T>::operator/=(const U& value)
{
unref();
for (T& t : *m_sharedvec) {
t /= value;
}
}

template<typename T>
template<typename U>
void
series<T>::operator%=(const U& value)
{
unref();
for (T& t : *m_sharedvec) {
t %= value;
}
}

template<typename T>
template<typename U>
void
series<T>::operator+=(const series<U>& other)
{
unref();
auto it1 = m_sharedvec->begin();
auto it2 = other.m_sharedvec->begin();
while (it1 != m_sharedvec->end() && it2 != other.m_sharedvec->end()) {
*it1 += *it2;
++it1;
++it2;
}
}

template<typename T>
template<typename U>
void
series<T>::operator-=(const series<U>& other)
{
unref();
auto it1 = m_sharedvec->begin();
auto it2 = other.m_sharedvec->begin();
while (it1 != m_sharedvec->end() && it2 != other.m_sharedvec->end()) {
*it1 -= *it2;
++it1;
++it2;
}
}

template<typename T>
template<typename U>
void
series<T>::operator*=(const series<U>& other)
{
unref();
auto it1 = m_sharedvec->begin();
auto it2 = other.m_sharedvec->begin();
while (it1 != m_sharedvec->end() && it2 != other.m_sharedvec->end()) {
*it1 *= *it2;
++it1;
++it2;
}
}

template<typename T>
template<typename U>
void
series<T>::operator/=(const series<U>& other)
{
unref();
auto it1 = m_sharedvec->begin();
auto it2 = other.m_sharedvec->begin();
while (it1 != m_sharedvec->end() && it2 != other.m_sharedvec->end()) {
*it1 /= *it2;
++it1;
++it2;
}
}

template<typename T>
template<typename U>
void
series<T>::operator%=(const series<U>& other)
{
unref();
auto it1 = m_sharedvec->begin();
auto it2 = other.m_sharedvec->begin();
while (it1 != m_sharedvec->end() && it2 != other.m_sharedvec->end()) {
*it1 %= *it2;
++it1;
++it2;
}
}

template<typename T>
template<typename U>
series<decltype(std::declval<T>() + std::declval<U>())>
series<T>::operator+(const U& value) const
{
using V = decltype(std::declval<T>() + std::declval<U>());
series<V> result;
for (const T& t : *m_sharedvec) {
result.m_sharedvec->push_back(t + value);
}
return result;
}

template<typename T>
template<typename U>
series<decltype(std::declval<T>() - std::declval<U>())>
series<T>::operator-(const U& value) const
{
using V = decltype(std::declval<T>() - std::declval<U>());
series<V> result;
for (const T& t : *m_sharedvec) {
result.m_sharedvec->push_back(t - value);
}
return result;
}

template<typename T>
template<typename U>
series<decltype(std::declval<T>() * std::declval<U>())>
series<T>::operator*(const U& value) const
{
using V = decltype(std::declval<T>() * std::declval<U>());
series<V> result;
for (const T& t : *m_sharedvec) {
result.m_sharedvec->push_back(t * value);
}
return result;
}

template<typename T>
template<typename U>
series<decltype(std::declval<T>() / std::declval<U>())>
series<T>::operator/(const U& value) const
{
using V = decltype(std::declval<T>() / std::declval<U>());
series<V> result;
for (const T& t : *m_sharedvec) {
result.m_sharedvec->push_back(t / value);
}
return result;
}

template<typename T>
template<typename U>
series<decltype(std::declval<T>() % std::declval<U>())>
series<T>::operator%(const U& value) const
{
using V = decltype(std::declval<T>() % std::declval<U>());
series<V> result;
for (const T& t : *m_sharedvec) {
result.m_sharedvec->push_back(t % value);
}
return result;
}

template<typename T>
template<typename U>
series<decltype(std::declval<T>() + std::declval<U>())>
series<T>::operator+(const series<U>& other) const
{
using V = decltype(std::declval<T>() + std::declval<U>());
series<V> result;
auto it1 = m_sharedvec->begin();
auto it2 = other.m_sharedvec->begin();
while (it1 != m_sharedvec->end() && it2 != other.m_sharedvec->end()) {
result.m_sharedvec->push_back(*it1 + *it2);
++it1;
++it2;
}
return result;
}

template<typename T>
template<typename U>
series<decltype(std::declval<T>() - std::declval<U>())>
series<T>::operator-(const series<U>& other) const
{
using V = decltype(std::declval<T>() - std::declval<U>());
series<V> result;
auto it1 = m_sharedvec->begin();
auto it2 = other.m_sharedvec->begin();
while (it1 != m_sharedvec->end() && it2 != other.m_sharedvec->end()) {
result.m_sharedvec->push_back(*it1 - *it2);
++it1;
++it2;
}
return result;
}

template<typename T>
template<typename U>
series<decltype(std::declval<T>() * std::declval<U>())>
series<T>::operator*(const series<U>& other) const
{
using V = decltype(std::declval<T>() * std::declval<U>());
series<V> result;
auto it1 = m_sharedvec->begin();
auto it2 = other.m_sharedvec->begin();
while (it1 != m_sharedvec->end() && it2 != other.m_sharedvec->end()) {
result.m_sharedvec->push_back(*it1 * *it2);
++it1;
++it2;
}
return result;
}

template<typename T>
template<typename U>
series<decltype(std::declval<T>() / std::declval<U>())>
series<T>::operator/(const series<U>& other) const
{
using V = decltype(std::declval<T>() / std::declval<U>());
series<V> result;
auto it1 = m_sharedvec->begin();
auto it2 = other.m_sharedvec->begin();
while (it1 != m_sharedvec->end() && it2 != other.m_sharedvec->end()) {
result.m_sharedvec->push_back(*it1 / *it2);
++it1;
++it2;
}
return result;
}

template<typename T>
template<typename U>
series<decltype(std::declval<T>() % std::declval<U>())>
series<T>::operator%(const series<U>& other) const
{
using V = decltype(std::declval<T>() % std::declval<U>());
series<V> result;
auto it1 = m_sharedvec->begin();
auto it2 = other.m_sharedvec->begin();
while (it1 != m_sharedvec->end() && it2 != other.m_sharedvec->end()) {
result.m_sharedvec->push_back(*it1 % *it2);
++it1;
++it2;
}
return result;
}

template<typename T>
void
series<T>::push_back(const T& value)
Expand Down
80 changes: 80 additions & 0 deletions mainframe/series.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -268,6 +268,86 @@ class series
bool
operator!=(const series<T>& other) const;

template<typename U>
void
operator+=(const U& value);

template<typename U>
void
operator-=(const U& value);

template<typename U>
void
operator*=(const U& value);

template<typename U>
void
operator/=(const U& value);

template<typename U>
void
operator%=(const U& value);

template<typename U>
void
operator+=(const series<U>& other);

template<typename U>
void
operator-=(const series<U>& other);

template<typename U>
void
operator*=(const series<U>& other);

template<typename U>
void
operator/=(const series<U>& other);

template<typename U>
void
operator%=(const series<U>& other);

template<typename U>
series<decltype(std::declval<T>() + std::declval<U>())>
operator+(const U& value) const;

template<typename U>
series<decltype(std::declval<T>() - std::declval<U>())>
operator-(const U& value) const;

template<typename U>
series<decltype(std::declval<T>() * std::declval<U>())>
operator*(const U& value) const;

template<typename U>
series<decltype(std::declval<T>() / std::declval<U>())>
operator/(const U& value) const;

template<typename U>
series<decltype(std::declval<T>() % std::declval<U>())>
operator%(const U& value) const;

template<typename U>
series<decltype(std::declval<T>() + std::declval<U>())>
operator+(const series<U>& other) const;

template<typename U>
series<decltype(std::declval<T>() - std::declval<U>())>
operator-(const series<U>& other) const;

template<typename U>
series<decltype(std::declval<T>() * std::declval<U>())>
operator*(const series<U>& other) const;

template<typename U>
series<decltype(std::declval<T>() / std::declval<U>())>
operator/(const series<U>& other) const;

template<typename U>
series<decltype(std::declval<T>() % std::declval<U>())>
operator%(const series<U>& other) const;

// push_back, emplace_back, pop_back
void
push_back(const T& value);
Expand Down
Loading

0 comments on commit 19e45d3

Please sign in to comment.