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 <cassert>
|
||||||
|
#include <sstream>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
using namespace std::string_literals;
|
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) {
|
template <typename T, typename... Ts> auto sum(T first, Ts... rem) {
|
||||||
return first + sum<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) {
|
int main(void) {
|
||||||
bool dummy = sum<double, int, int, int>(1.5, 2, 3, 10) == 16.5;
|
bool dummy = sum<double, int, int, int>(1.5, 2, 3, 10) == 16.5;
|
||||||
assert(dummy);
|
assert(dummy);
|
||||||
|
@ -17,4 +49,9 @@ int main(void) {
|
||||||
dummy = sum<std::string>("asdf"s, "abcdefghijklmnop"s, "qrstuvwxyz"s) ==
|
dummy = sum<std::string>("asdf"s, "abcdefghijklmnop"s, "qrstuvwxyz"s) ==
|
||||||
"asdfabcdefghijklmnopqrstuvwxyz"s;
|
"asdfabcdefghijklmnopqrstuvwxyz"s;
|
||||||
assert(dummy);
|
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