#ifndef SINGLYLINKEDLIST_H_ #define SINGLYLINKEDLIST_H_ #include #include template class LinkedElement { public: T *value; class Iterator { public: LinkedElement *value; Iterator() : value(NULL) { } Iterator(LinkedElement *element) : value(element) { } Iterator& operator++() { value = value->getNext(); return *this; } Iterator operator++(int) { Iterator tmp(*this); operator++(); return tmp; } bool operator==(Iterator other) { return value == other.value; } bool operator!=(Iterator other) { return !(*this == other); } T *operator->() { return value->value; } }; LinkedElement(T* setElement, LinkedElement* setNext = NULL) : value(setElement), next(setNext) { } virtual ~LinkedElement(){ } virtual LinkedElement* getNext() const { return next; } virtual void setNext(LinkedElement* next) { this->next = next; } LinkedElement* begin() { return this; } LinkedElement* end() { return NULL; } private: LinkedElement *next; }; template class SinglyLinkedList { public: SinglyLinkedList() : start(NULL) { } SinglyLinkedList(typename LinkedElement::Iterator start) : start(start.value) { } SinglyLinkedList(LinkedElement* startElement) : start(startElement) { } typename LinkedElement::Iterator begin() const { return LinkedElement::Iterator::Iterator(start); } typename LinkedElement::Iterator::Iterator end() const { return LinkedElement::Iterator::Iterator(); } uint32_t getSize() const { uint32_t size = 0; LinkedElement *element = start; while (element != NULL) { size++; element = element->getNext(); } return size; } void setStart(LinkedElement* setStart) { start = setStart; } protected: LinkedElement *start; }; #endif /* SINGLYLINKEDLIST_H_ */