testCMExtMemory.cxx 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. #include <iostream>
  2. #include <memory>
  3. #include <cmext/memory>
  4. namespace {
  5. class Base
  6. {
  7. public:
  8. virtual ~Base() = default;
  9. };
  10. class Derived : public Base
  11. {
  12. public:
  13. ~Derived() override = default;
  14. void method() {}
  15. };
  16. template <typename T>
  17. class Wrapper
  18. {
  19. public:
  20. Wrapper(T* v)
  21. : value(v)
  22. {
  23. }
  24. ~Wrapper() { delete this->value; }
  25. T* get() const { return this->value; }
  26. private:
  27. T* value;
  28. };
  29. bool testReferenceCast()
  30. {
  31. std::cout << "testReferenceCast()" << std::endl;
  32. std::unique_ptr<Base> u(new Derived);
  33. cm::static_reference_cast<Derived>(u).method();
  34. cm::dynamic_reference_cast<Derived>(u).method();
  35. std::shared_ptr<Base> s(new Derived);
  36. cm::static_reference_cast<Derived>(s).method();
  37. cm::dynamic_reference_cast<Derived>(s).method();
  38. // can also be used with custom wrappers
  39. Wrapper<Base> w(new Derived);
  40. cm::static_reference_cast<Derived>(w).method();
  41. cm::dynamic_reference_cast<Derived>(w).method();
  42. return true;
  43. }
  44. }
  45. int testCMExtMemory(int /*unused*/, char* /*unused*/[])
  46. {
  47. if (!testReferenceCast()) {
  48. return 1;
  49. }
  50. return 0;
  51. }