#include <iostream>
#include <memory>

using namespace std;


class List {
    struct Node;
    using PNode = std::shared_ptr<Node>;
    using PWNode = std::weak_ptr<Node>;
    struct Node : public std::enable_shared_from_this<Node> {

        Node(int v) : value_(v) { cout << "C-tor " << value_ << endl; }

        PNode getptr() {
            return shared_from_this();
        }

        ~Node() { cout << "D-tor " << value_ << endl; }
        int value_;

        PNode next_; //element nastepny
        PWNode prev_; //element poprzedni
    };

public:
    List() {}
    ~List() { if (head_) head_->prev_.lock()->next_.reset(); }

    void push(int val) {
        PNode node = make_shared<Node>(val);

        if( head_ ) { //not empty
            node->prev_ = head_->prev_;
            node->next_ = head_;
            head_->prev_.lock()->next_ = node;
            head_->prev_ = node;
        }
        else { //empty
            head_ = node;
            head_->prev_ = head_;
            head_->next_ = head_;

        }
    }
private:
    PNode head_;
};


int main() {
    {
        List l1;
        l1.push(1);
        l1.push(1);
        l1.push(1);
        l1.push(1);
    }
    return 0;
}
