// @topic T060920 Stack of integers v4
// @brief Stack class declaration with move constructor and initializer list constructor

#ifndef STACK_H_INCLUDED_
#define STACK_H_INCLUDED_

#include <iostream>
#include <algorithm>
#include <iterator>

class Stack {
    static const int DEFAULT_CAPACITY = 1024;
    int* stack_memory;
    int capacity;
    int top_pos;
public:
    // constructors/destructor
    Stack();
    Stack(int initial_capacity);
    Stack(Stack const& other); // copy constructor
    Stack(Stack&& other);      // move constructor
    Stack( std::initializer_list<int> list); // initializer list constructor
    ~Stack(); // destructor

    // overloaded operators
//private: // do this to disable the = operator
    Stack& operator=(Stack const& other);

    // other operators can be overloaded,
    // we will discuss this in the future:
    bool operator==(Stack const& other);

public:
    // stack operations
    void push(int value);
    void pop();
    int top() const;
    int& top();
    int size() const;
};// class Stack

#endif //STACK_H_INCLUDED_