added a test for a custom datatype backed by stringstream for sum
This commit is contained in:
parent
428c4b1f3d
commit
9a8b559ce4
1 changed files with 37 additions and 0 deletions
37
sum.cpp
37
sum.cpp
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue