diff --git a/dune/common/test/shared_ptrtest.cc b/dune/common/test/shared_ptrtest.cc index 9871296f446e1d5f559c2e83acf835c174a67e1d..709f8173a85beb97fda536473fb5cbb8a5d0b3e8 100644 --- a/dune/common/test/shared_ptrtest.cc +++ b/dune/common/test/shared_ptrtest.cc @@ -12,6 +12,24 @@ #include <vector> #include <cstdlib> +template<class T> +class Deleter +{ +public: + Deleter(bool& deleted) : + deleted_(deleted) + {} + + void operator() (T* p) const + { + delete p; + deleted_ = true; + } + +private: + mutable bool& deleted_; +}; + int main(){ using namespace Dune; int ret=0; @@ -25,6 +43,58 @@ int main(){ ret=1; } + // test custom deleter + bool deleted = false; + { + shared_ptr<int> foo(new int(1), Deleter<int>(deleted)); + + //test if deleter is called + deleted = false; + foo.reset(new int(2)); // this should call the deleter in the constructor + if (not (deleted)) + { + std::cout << "Custom deleter not called!" << std::endl; + ret=1; + } + + //test if old deleter is not called + deleted = false; + foo.reset(); // this should call no deleter + if (deleted) + { + std::cout << "Old deleter was called!" << std::endl; + ret=1; + } + + //test if old deleter is not called + deleted = false; + foo.reset(new int(3), Deleter<int>(deleted)); // this should call no deleter + if (deleted) + { + std::cout << "Old deleter was called!" << std::endl; + ret=1; + } + // going out of scope should call the deleter + } + if (not (deleted)) + { + std::cout << "Custom deleter not called!" << std::endl; + ret=1; + } + { + shared_ptr<int> foo(new int(1), Deleter<int>(deleted)); + + foo.reset(new int(4)); // this should call the deleter... + + deleted = false; + // ... but going out of scope should call no deleter + } + if (deleted) + { + std::cout << "1Old deleter was called!" << std::endl; + ret=1; + } + // test constructor from a given pointer shared_ptr<double> bar(new double(43.0)); assert(bar); @@ -33,14 +103,18 @@ int main(){ bar.reset(); assert(!bar); + // test get() for empty shared_ptr + assert(!bar.get()); + // test reset(T*) - bar.reset(new double(44.0)); + double* p = new double(44.0); + bar.reset(p); assert(bar); assert(bar.use_count()==1); // test get() double* barPtr = bar.get(); - assert(barPtr); + assert(barPtr==p); // test constructor from a given pointer shared_ptr<double> b(new double(42.0));