diff options
Diffstat (limited to 'libcxx/test/std/utilities/memory/unique.ptr/deleter.h')
-rw-r--r-- | libcxx/test/std/utilities/memory/unique.ptr/deleter.h | 231 |
1 files changed, 194 insertions, 37 deletions
diff --git a/libcxx/test/std/utilities/memory/unique.ptr/deleter.h b/libcxx/test/std/utilities/memory/unique.ptr/deleter.h index fb26044d98f..ab13c65105d 100644 --- a/libcxx/test/std/utilities/memory/unique.ptr/deleter.h +++ b/libcxx/test/std/utilities/memory/unique.ptr/deleter.h @@ -20,21 +20,19 @@ #include <utility> #include <cassert> +#include "test_macros.h" + +#if TEST_STD_VER >= 11 + template <class T> class Deleter { int state_; -#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES Deleter(const Deleter&); Deleter& operator=(const Deleter&); -#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES - Deleter(Deleter&); - Deleter& operator=(Deleter&); -#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES public: -#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES Deleter(Deleter&& r) : state_(r.state_) {r.state_ = 0;} Deleter& operator=(Deleter&& r) { @@ -42,22 +40,12 @@ public: r.state_ = 0; return *this; } -#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES - operator std::__rv<Deleter>() {return std::__rv<Deleter>(*this);} - Deleter(std::__rv<Deleter> r) : state_(r->state_) {r->state_ = 0;} - Deleter& operator=(std::__rv<Deleter> r) - { - state_ = r->state_; - r->state_ = 0; - return *this; - } -#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + Deleter() : state_(0) {} explicit Deleter(int s) : state_(s) {} ~Deleter() {assert(state_ >= 0); state_ = -1;} -#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES template <class U> Deleter(Deleter<U>&& d, typename std::enable_if<!std::is_same<U, T>::value>::type* = 0) @@ -67,12 +55,6 @@ private: template <class U> Deleter(const Deleter<U>& d, typename std::enable_if<!std::is_same<U, T>::value>::type* = 0); -#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES - template <class U> - Deleter(Deleter<U> d, - typename std::enable_if<!std::is_same<U, T>::value>::type* = 0) - : state_(d.state()) {} -#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES public: int state() const {return state_;} void set_state(int i) {state_ = i;} @@ -85,16 +67,11 @@ class Deleter<T[]> { int state_; -#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES Deleter(const Deleter&); Deleter& operator=(const Deleter&); -#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES - Deleter(Deleter&); - Deleter& operator=(Deleter&); -#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES public: -#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + Deleter(Deleter&& r) : state_(r.state_) {r.state_ = 0;} Deleter& operator=(Deleter&& r) { @@ -102,16 +79,67 @@ public: r.state_ = 0; return *this; } -#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES - operator std::__rv<Deleter>() {return std::__rv<Deleter>(*this);} - Deleter(std::__rv<Deleter> r) : state_(r->state_) {r->state_ = 0;} - Deleter& operator=(std::__rv<Deleter> r) - { - state_ = r->state_; - r->state_ = 0; + + Deleter() : state_(0) {} + explicit Deleter(int s) : state_(s) {} + ~Deleter() {assert(state_ >= 0); state_ = -1;} + + int state() const {return state_;} + void set_state(int i) {state_ = i;} + + void operator()(T* p) {delete [] p;} +}; + +#else // TEST_STD_VER < 11 + +template <class T> +class Deleter +{ + mutable int state_; + +public: + Deleter() : state_(0) {} + explicit Deleter(int s) : state_(s) {} + + Deleter(Deleter const & other) : state_(other.state_) { + other.state_ = 0; + } + Deleter& operator=(Deleter const& other) { + state_ = other.state_; + other.state_ = 0; + return *this; + } + + ~Deleter() {assert(state_ >= 0); state_ = -1;} + +private: + template <class U> + Deleter(Deleter<U> d, + typename std::enable_if<!std::is_same<U, T>::value>::type* = 0) + : state_(d.state()) {} + +public: + int state() const {return state_;} + void set_state(int i) {state_ = i;} + + void operator()(T* p) {delete p;} +}; + +template <class T> +class Deleter<T[]> +{ + mutable int state_; + +public: + + Deleter(Deleter const& other) : state_(other.state_) { + other.state_ = 0; + } + Deleter& operator=(Deleter const& other) { + state_ = other.state_; + other.state_ = 0; return *this; } -#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES Deleter() : state_(0) {} explicit Deleter(int s) : state_(s) {} @@ -123,6 +151,8 @@ public: void operator()(T* p) {delete [] p;} }; +#endif + template <class T> void swap(Deleter<T>& x, Deleter<T>& y) @@ -132,6 +162,7 @@ swap(Deleter<T>& x, Deleter<T>& y) y = std::move(t); } + template <class T> class CDeleter { @@ -179,4 +210,130 @@ swap(CDeleter<T>& x, CDeleter<T>& y) y = std::move(t); } +// Non-copyable deleter +template <class T> +class NCDeleter +{ + int state_; + NCDeleter(NCDeleter const&); + NCDeleter& operator=(NCDeleter const&); +public: + + NCDeleter() : state_(0) {} + explicit NCDeleter(int s) : state_(s) {} + ~NCDeleter() {assert(state_ >= 0); state_ = -1;} + + int state() const {return state_;} + void set_state(int i) {state_ = i;} + + void operator()(T* p) {delete p;} +}; + + +template <class T> +class NCDeleter<T[]> +{ + int state_; + NCDeleter(NCDeleter const&); + NCDeleter& operator=(NCDeleter const&); +public: + + NCDeleter() : state_(0) {} + explicit NCDeleter(int s) : state_(s) {} + ~NCDeleter() {assert(state_ >= 0); state_ = -1;} + + int state() const {return state_;} + void set_state(int i) {state_ = i;} + + void operator()(T* p) {delete [] p;} +}; + + +// Non-copyable deleter +template <class T> +class NCConstDeleter +{ + int state_; + NCConstDeleter(NCConstDeleter const&); + NCConstDeleter& operator=(NCConstDeleter const&); +public: + + NCConstDeleter() : state_(0) {} + explicit NCConstDeleter(int s) : state_(s) {} + ~NCConstDeleter() {assert(state_ >= 0); state_ = -1;} + + int state() const {return state_;} + void set_state(int i) {state_ = i;} + + void operator()(T* p) const {delete p;} +}; + + +template <class T> +class NCConstDeleter<T[]> +{ + int state_; + NCConstDeleter(NCConstDeleter const&); + NCConstDeleter& operator=(NCConstDeleter const&); +public: + + NCConstDeleter() : state_(0) {} + explicit NCConstDeleter(int s) : state_(s) {} + ~NCConstDeleter() {assert(state_ >= 0); state_ = -1;} + + int state() const {return state_;} + void set_state(int i) {state_ = i;} + + void operator()(T* p) const {delete [] p;} +}; + + +// Non-copyable deleter +template <class T> +class CopyDeleter +{ + int state_; +public: + + CopyDeleter() : state_(0) {} + explicit CopyDeleter(int s) : state_(s) {} + ~CopyDeleter() {assert(state_ >= 0); state_ = -1;} + + CopyDeleter(CopyDeleter const& other) : state_(other.state_) {} + CopyDeleter& operator=(CopyDeleter const& other) { + state_ = other.state_; + return *this; + } + + int state() const {return state_;} + void set_state(int i) {state_ = i;} + + void operator()(T* p) {delete p;} +}; + + +template <class T> +class CopyDeleter<T[]> +{ + int state_; + +public: + + CopyDeleter() : state_(0) {} + explicit CopyDeleter(int s) : state_(s) {} + ~CopyDeleter() {assert(state_ >= 0); state_ = -1;} + + CopyDeleter(CopyDeleter const& other) : state_(other.state_) {} + CopyDeleter& operator=(CopyDeleter const& other) { + state_ = other.state_; + return *this; + } + + int state() const {return state_;} + void set_state(int i) {state_ = i;} + + void operator()(T* p) {delete [] p;} +}; + + #endif // DELETER_H |