diff --git a/include/emp/data/Datum.hpp b/include/emp/data/Datum.hpp index 67570666c2..32e8eabfff 100644 --- a/include/emp/data/Datum.hpp +++ b/include/emp/data/Datum.hpp @@ -19,6 +19,7 @@ #include "../base/assert.hpp" #include "../base/notify.hpp" +#include "../math/math.hpp" namespace emp { @@ -133,6 +134,22 @@ namespace emp { template bool operator> (T && rhs) const { return Compare(std::forward(rhs)) == 1; } template bool operator<=(T && rhs) const { return Compare(std::forward(rhs)) != 1; } + Datum operator+(const Datum & in) const { + if (IsDouble()) return NativeDouble() + in.AsDouble(); + return NativeString() + in.AsString(); + } + Datum operator*(const Datum & in) const { + if (IsDouble()) return NativeDouble() * in.AsDouble(); + std::string out_string; + size_t count = static_cast(in.AsDouble()); + out_string.reserve(NativeString().size() * count); + for (size_t i = 0; i < count; i++) out_string += NativeString(); + return out_string; + } + Datum operator-(const Datum & in) const { return AsDouble() - in.AsDouble(); } + Datum operator/(const Datum & in) const { return AsDouble() / in.AsDouble(); } + Datum operator%(const Datum & in) const { return emp::Mod(AsDouble(), in.AsDouble()); } + }; std::ostream & operator<<(std::ostream & out, const emp::Datum & d) {