diff options
Diffstat (limited to 'test')
-rw-r--r-- | test/ring.cc | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/test/ring.cc b/test/ring.cc new file mode 100644 index 0000000..a42efaa --- /dev/null +++ b/test/ring.cc @@ -0,0 +1,93 @@ +#include <ring.h> + +#include <cstdio> + +#define LOG \ + if (false) { \ + } else \ + puts(__PRETTY_FUNCTION__) + +/// A helper sruct to count instances, copy- and move constructions. +struct m { + m() { + LOG; + ++cnt; + } + ~m() { + LOG; + --cnt; + } + m(const m&) { + LOG; + ++cnt; + ++cpy; + } + m(m&&) noexcept { + LOG; + ++cnt; + ++mov; + } + m& operator=(const m&) = delete; + m& operator=(m&&) = delete; + + static std::size_t cnt; + static std::size_t mov; + static std::size_t cpy; +}; + +std::size_t m::cnt = 0; +std::size_t m::mov = 0; +std::size_t m::cpy = 0; + +int main() { + { + ring<m, 8> r; + + assert(r.size() == 0); + assert(r.is_empty()); + assert(!r.is_full()); + + for (int i = 0; i < 10; ++i) { + bool ok = r.emplace(); + i < 8 ? assert(ok) : assert(!ok); + } + + assert(r.size() == 8); + assert(!r.is_empty()); + assert(r.is_full()); + +#if __cplusplus >= 201703L + auto v = r.take(); + assert(v.has_value()); + + assert(r.size() == 7); + assert(!r.is_empty()); + assert(!r.is_full()); +#endif + + assert(m::cnt == 8); + } + + assert(m::cnt == 0); + + m::mov = 0; + m::cpy = 0; + { + ring<m, 8> r; + + // Move construct m from an m rvalue reference. + assert(m::mov == 0); + r.push(m{}); + assert(m::mov == 1); + + // Copy construct m from an m lvalue reference. + m m; + assert(m::cpy == 0); + r.push(m); + assert(m::cpy == 1); + + assert(m::cnt == 3); + } + + assert(m::cnt == 0); +} |