//===----------------------------------------------------------------------===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

// <memory>

// unique_ptr

// Example move-only deleter

#ifndef SUPPORT_DELETER_TYPES_H
#define SUPPORT_DELETER_TYPES_H

#include <type_traits>
#include <utility>
#include <cassert>

#include "test_macros.h"
#include "min_allocator.h"

#if TEST_STD_VER >= 11

template <class T>
class Deleter
{
    int state_;

    Deleter(const Deleter&);
    Deleter& operator=(const Deleter&);

public:
    Deleter(Deleter&& r) : state_(r.state_) {r.state_ = 0;}
    Deleter& operator=(Deleter&& r)
    {
        state_ = r.state_;
        r.state_ = 0;
        return *this;
    }


    Deleter() : state_(0) {}
    explicit Deleter(int s) : state_(s) {}
    ~Deleter() {assert(state_ >= 0); state_ = -1;}

    template <class U>
        Deleter(Deleter<U>&& d,
            typename std::enable_if<!std::is_same<U, T>::value>::type* = 0)
            : state_(d.state()) {d.set_state(0);}

private:
    template <class U>
        Deleter(const Deleter<U>& d,
            typename std::enable_if<!std::is_same<U, T>::value>::type* = 0);
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[]>
{
    int state_;

    Deleter(const Deleter&);
    Deleter& operator=(const Deleter&);

public:

    Deleter(Deleter&& r) : state_(r.state_) {r.state_ = 0;}
    Deleter& operator=(Deleter&& r)
    {
        state_ = r.state_;
        r.state_ = 0;
        return *this;
    }

    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;}

    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;
    }

    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;}
};

#endif

template <class T>
void
swap(Deleter<T>& x, Deleter<T>& y)
{
    Deleter<T> t(std::move(x));
    x = std::move(y);
    y = std::move(t);
}


template <class T>
class CDeleter
{
    int state_;

public:

    CDeleter() : state_(0) {}
    explicit CDeleter(int s) : state_(s) {}
    ~CDeleter() {assert(state_ >= 0); state_ = -1;}

    template <class U>
        CDeleter(const CDeleter<U>& d)
            : state_(d.state()) {}

    int state() const {return state_;}
    void set_state(int i) {state_ = i;}

    void operator()(T* p) {delete p;}
};

template <class T>
class CDeleter<T[]>
{
    int state_;

public:

    CDeleter() : state_(0) {}
    explicit CDeleter(int s) : state_(s) {}
    ~CDeleter() {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>
void
swap(CDeleter<T>& x, CDeleter<T>& y)
{
    CDeleter<T> t(std::move(x));
    x = std::move(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;}
};


struct test_deleter_base
{
    static int count;
    static int dealloc_count;
};

int test_deleter_base::count = 0;
int test_deleter_base::dealloc_count = 0;

template <class T>
class test_deleter
    : public test_deleter_base
{
    int state_;

public:

    test_deleter() : state_(0) {++count;}
    explicit test_deleter(int s) : state_(s) {++count;}
    test_deleter(const test_deleter& d)
        : state_(d.state_) {++count;}
    ~test_deleter() {assert(state_ >= 0); --count; state_ = -1;}

    int state() const {return state_;}
    void set_state(int i) {state_ = i;}

    void operator()(T* p) {assert(state_ >= 0); ++dealloc_count; delete p;}
#if TEST_STD_VER >= 11
    test_deleter* operator&() const = delete;
#else
private:
  test_deleter* operator&() const;
#endif
};

template <class T>
void
swap(test_deleter<T>& x, test_deleter<T>& y)
{
    test_deleter<T> t(std::move(x));
    x = std::move(y);
    y = std::move(t);
}

#if TEST_STD_VER >= 11

template <class T, size_t ID = 0>
class PointerDeleter
{
    PointerDeleter(const PointerDeleter&);
    PointerDeleter& operator=(const PointerDeleter&);

public:
    typedef min_pointer<T, std::integral_constant<size_t, ID>> pointer;

    PointerDeleter() = default;
    PointerDeleter(PointerDeleter&&) = default;
    PointerDeleter& operator=(PointerDeleter&&) = default;
    explicit PointerDeleter(int) {}

    template <class U>
        PointerDeleter(PointerDeleter<U, ID>&&,
            typename std::enable_if<!std::is_same<U, T>::value>::type* = 0)
    {}

    void operator()(pointer p) { if (p) { delete std::addressof(*p); }}

private:
    template <class U>
        PointerDeleter(const PointerDeleter<U, ID>&,
            typename std::enable_if<!std::is_same<U, T>::value>::type* = 0);
};


template <class T, size_t ID>
class PointerDeleter<T[], ID>
{
    PointerDeleter(const PointerDeleter&);
    PointerDeleter& operator=(const PointerDeleter&);

public:
    typedef min_pointer<T, std::integral_constant<size_t, ID> > pointer;

    PointerDeleter() = default;
    PointerDeleter(PointerDeleter&&) = default;
    PointerDeleter& operator=(PointerDeleter&&) = default;
    explicit PointerDeleter(int) {}

    template <class U>
        PointerDeleter(PointerDeleter<U, ID>&&,
            typename std::enable_if<!std::is_same<U, T>::value>::type* = 0)
    {}

    void operator()(pointer p) { if (p) { delete [] std::addressof(*p); }}

private:
    template <class U>
        PointerDeleter(const PointerDeleter<U, ID>&,
            typename std::enable_if<!std::is_same<U, T>::value>::type* = 0);
};

#endif // TEST_STD_VER >= 11

#endif  // SUPPORT_DELETER_TYPES_H
