#pragma once

#include <string.h>

namespace std {
    template <class T> class vector {
    public:
        T *mElements;
        int mSize;
        int mCapacity;

        ~vector() {
            if (mElements != NULL) {
                decrease_size(mSize);
                delete mElements;
            }
        }

        void push_back(T &value) {
            get_new_capacity(1);
            append_back(1, &value);
        }

        T *erase(T *first, T *last) {
            if (first != last) {
                int bytesToMove = (int) mElements + mSize * sizeof(T) - (int) last;
                memmove(first, last, bytesToMove);
                mSize -= (int) last - (int) first;
            }
            return first;
        }

    private:
        void decrease_size(int amount);

        int get_new_capacity(int growth);

        void append_back(int length, T *items);
    };
} // namespace std
