added a test for a custom datatype backed by stringstream for sum

This commit is contained in:
Pagwin 2024-12-11 14:09:18 -05:00
parent 428c4b1f3d
commit 9a8b559ce4
No known key found for this signature in database
GPG key ID: 81137023740CA260

37
sum.cpp
View file

@ -1,4 +1,5 @@
#include <cassert>
#include <sstream>
#include <string>
using namespace std::string_literals;
@ -7,6 +8,37 @@ template <typename T> auto sum(T final) { return final; }
template <typename T, typename... Ts> auto sum(T first, Ts... rem) {
return first + sum<Ts...>(rem...);
}
class ss_sum {
std::stringstream ss;
public:
template <typename T> ss_sum(T obj) : ss{} { ss << obj; }
ss_sum(ss_sum const &rhs) : ss{} {
std::string tmp;
const_cast<ss_sum &>(rhs).ss >> tmp;
const_cast<ss_sum &>(rhs).ss << tmp;
ss << tmp;
}
friend ss_sum operator+(ss_sum const &lhs, ss_sum const &rhs) {
ss_sum ret = lhs;
ss_sum tmp = rhs;
std::string a;
tmp.ss >> a;
ret.ss << a;
return ret;
}
friend bool operator==(ss_sum const &lhs, ss_sum const &rhs) {
ss_sum inner_l = lhs;
ss_sum inner_r = rhs;
std::string l;
std::string r;
inner_l.ss >> l;
inner_r.ss >> r;
return l == r;
}
};
int main(void) {
bool dummy = sum<double, int, int, int>(1.5, 2, 3, 10) == 16.5;
assert(dummy);
@ -17,4 +49,9 @@ int main(void) {
dummy = sum<std::string>("asdf"s, "abcdefghijklmnop"s, "qrstuvwxyz"s) ==
"asdfabcdefghijklmnopqrstuvwxyz"s;
assert(dummy);
// ss_sum is only associative when everything is ss_sum
auto tmp = sum<ss_sum, ss_sum, ss_sum>(1, 2, 3);
dummy = tmp == ss_sum{"123"};
assert(dummy);
}