#ifndef LIST_H #define LIST_H #include #include "utils/StringBuffer.h" template class List final { char data[sizeof (T) * N]; int index = 0; void copy(const List& other) { for(int i = 0; i < other.index; i++) { add(other[i]); } } void move(List&& other) { for(int i = 0; i < other.index; i++) { add(std::move(other[i])); } } public: List() = default; List& clear() { for(int i = 0; i < index; i++) { (*this)[i].~T(); } index = 0; return *this; } ~List() { clear(); } List(const List& other) : index(0) { copy(other); } List& operator=(const List& other) { if(&other != this) { clear(); copy(other); } return *this; } List(List&& other) : index(0) { move(std::move(other)); other.clear(); } List& operator=(List&& other) { if(&other != this) { clear(); move(std::move(other)); other.clear(); } return *this; } T* begin() { return reinterpret_cast (data); } T* end() { return reinterpret_cast (data) + index; } const T* begin() const { return reinterpret_cast (data); } const T* end() const { return reinterpret_cast (data) + index; } List& add(const T& t) { if(index >= N) { return *this; } new (end()) T(t); index++; return *this; } List& add(T&& t) { if(index >= N) { return *this; } new (end()) T(std::move(t)); index++; return *this; } template List& add(Args&&... args) { if(index >= N) { return *this; } new (end()) T(args...); index++; return *this; } T& operator[](int index) { return begin()[index]; } const T& operator[](int index) const { return begin()[index]; } int getLength() const { return index; } template void toString(StringBuffer& s) const { s.append("["); for(int i = 0; i < index - 1; i++) { s.append((*this)[i]); s.append(", "); } if(index > 0) { s.append((*this)[index - 1]); } s.append("]"); } }; #endif