semiregular_test.cc 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. #include "catch.hpp"
  2. #include "semiregular.hh"
  3. #include <memory>
  4. // Mockup for an transform-iterator containing a transformation function (e.g.
  5. // a lambda).
  6. template <typename Op> struct Iter {
  7. Iter() = default;
  8. Iter(Op op_) : op(std::move(op_)) {}
  9. semiregular_t<Op> op; // wrap 'Op' in semiregular_t<T>
  10. };
  11. TEST_CASE("semiregular")
  12. {
  13. // This doesn't CHECK() anything, it only tests that the code compiles.
  14. SECTION("semiregular_t<lambda>") {
  15. int g = 42;
  16. // create dummy lambda, captures 'g' by-reference.
  17. auto lambda = [&](int i) { return i + g; };
  18. auto l2 = lambda; (void)l2; // lambda is copy-constructible
  19. // l2 = lambda; // ok, doesn't compile: lambda is not copy-assignable
  20. // decltype(lambda) l3; // ok, doesn't compile: not default-constructible
  21. // create iterator containing this lambda
  22. auto iter1 = Iter(std::move(lambda));
  23. auto iter2 = iter1; // ok, copy-constructible
  24. iter2 = iter1; // ok, copy-assignable
  25. decltype(iter1) iter3; // ok, default-constructible
  26. (void)iter2; (void)iter3;
  27. }
  28. SECTION("semiregular_t<unique_ptr<int>>") {
  29. // unique_ptr
  30. using T = std::unique_ptr<int>;
  31. T t1 = std::make_unique<int>(43);
  32. // T t2 = t1; // ok, doesn't compile: move-only
  33. // wrapped in semiregular_t<T>
  34. using ST = semiregular_t<T>;
  35. ST st1 = std::move(t1);
  36. // ST st2 = st1; ok, doesn't compile because move-only
  37. ST st2 = std::move(st1);
  38. st1 = std::move(st2);
  39. }
  40. }