#ifndef LIST_H #define LIST_H #include "Object.h" namespace Kylin { template class List : public Object { public: static constexpr size_t npos = static_cast(-1); virtual void append(const T &value) = 0; const T &at(size_t index) const { return const_cast(this)->operator[](index); } virtual inline void push_back(const T &value) { append(value); } /** * @brief Inserts value at index position i in the list. * If i >= size(), the value is appended to the list. */ virtual void insert(size_t index, const T &value) = 0; virtual void removeAt(size_t index) = 0; virtual void clear() = 0; virtual size_t size() const noexcept = 0; size_t length() const noexcept { return size(); } bool empty() const noexcept { return size() == 0; } virtual size_t indexOf(const T &value, size_t from = 0) const = 0; virtual T &last() = 0; const T &last() const { return const_cast(this)->last(); } virtual T &operator[](size_t index) = 0; const T &operator[](size_t index) const { return const_cast(this)->operator[](index); } }; } // namespace Kylin #endif // LIST_H