#ifndef STACK_H
#define STACK_H

#include "utils/List.h"

template<typename T, int N>
class Stack final {
    List<T> data;

public:
    Stack& push(const T& t) {
        data.add(t);
        return *this;
    }

    Stack& push(T&& t) {
        data.add(std::move(t));
        return *this;
    }

    template<typename... Args>
    Stack& push(Args&&... args) {
        data.add(std::forward<Args>(args)...);
        return *this;
    }

    void clear() {
        data.clear();
    }

    bool pop() {
        if(data.getLength() <= 0) {
            return true;
        }
        data.remove(data.getLength() - 1);
        return false;
    }

    bool isEmpty() const {
        return data.getLength() == 0;
    }

    T& peek() {
        return data[data.getLength() - 1];
    }

    const T& peek() const {
        return data[data.getLength() - 1];
    }

    template<int L>
    void toString(StringBuffer<L>& s) const {
        s.append(data);
    }
};

#endif