#ifndef STACK_H
#define STACK_H

#include "utils/List.h"

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

public:

    bool push(const T& t) {
        return data.add(t);
    }

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

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

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

    bool pop() {
        return data.remove(data.getLength() - 1);
    }

    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