#ifndef ARRAY_H
#define ARRAY_H

#include "utils/StringBuffer.h"
#include <initializer_list>

template<typename T, int N>
class Array final {
    T data[N];

public:
    Array() = default;

    Array(const T& t) {
        fill(t);
    }

    void fill(const T& t) {
        for(int i = 0; i < N; i++) {
            data[i] = t;
        }
    }

    T& operator[](int index) {
        return data[index];
    }

    const T& operator[](int index) const {
        return data[index];
    }

    T* begin() {
        return data;
    }

    T* end() {
        return data + N;
    }

    const T* begin() const {
        return data;
    }

    const T* end() const {
        return data + N;
    }

    constexpr int getLength() const {
        return N;
    }

    template<int L>
    void toString(StringBuffer<L>& s) const {
        s.append("[");
        for(int i = 0; i < N - 1; i++) {
            s.append(data[i]);
            s.append(", ");
        }
        if(N > 0) {
            s.append(data[N - 1]);
        }
        s.append("]");
    }
};

#endif