summaryrefslogtreecommitdiffstats
path: root/debian/uncrustify-trinity/uncrustify-trinity-0.72.0/src/ListManager.h
diff options
context:
space:
mode:
Diffstat (limited to 'debian/uncrustify-trinity/uncrustify-trinity-0.72.0/src/ListManager.h')
-rw-r--r--debian/uncrustify-trinity/uncrustify-trinity-0.72.0/src/ListManager.h267
1 files changed, 267 insertions, 0 deletions
diff --git a/debian/uncrustify-trinity/uncrustify-trinity-0.72.0/src/ListManager.h b/debian/uncrustify-trinity/uncrustify-trinity-0.72.0/src/ListManager.h
new file mode 100644
index 00000000..2342fd93
--- /dev/null
+++ b/debian/uncrustify-trinity/uncrustify-trinity-0.72.0/src/ListManager.h
@@ -0,0 +1,267 @@
+/**
+ * @file ListManager.h
+ * Template class that manages items in a double-linked list.
+ * If C++ could do it, this would just be a class that worked on an interface.
+ *
+ * @author Ben Gardner
+ * @license GPL v2+
+ */
+
+#ifndef LIST_MANAGER_H_INCLUDED
+#define LIST_MANAGER_H_INCLUDED
+
+/*
+ * TODO: why do we provide this template class? can't we use
+ * a double linked list std::deque from the standard library ?
+ */
+/**
+ * A simple list manager for a double-linked list.
+ * Class T must define 'next' and 'prev', which must be pointers to type T.
+ */
+template<class T>
+class ListManager
+{
+protected:
+ T *first; //! pointer to the head of list
+ T *last; //! pointer to tail of list
+
+private:
+ // Hide copy constructor
+ ListManager(const ListManager &ref)
+ {
+ first = NULL;
+ last = NULL;
+ }
+
+public:
+ ListManager()
+ {
+ first = NULL;
+ last = NULL;
+ }
+
+
+ /**
+ * @brief return the first element of the linked list
+ *
+ * @return pointer to first element or nullptr if list is empty
+ */
+ T *GetHead()
+ {
+ return(first);
+ }
+
+
+ /**
+ * @brief return the last element of the linked list
+ *
+ * @return pointer to last element or nullptr if list is empty
+ */
+ T *GetTail()
+ {
+ return(last);
+ }
+
+
+ /**
+ * @brief return the next element of the linked list
+ *
+ * @param[in] ref pointer to current list element
+ *
+ * @return pointer to next element or nullptr if no next element exists
+ */
+ T *GetNext(T *ref)
+ {
+ return((ref != NULL) ? ref->next : NULL);
+ }
+
+
+ /**
+ * @brief return the previous element of the linked list
+ *
+ * @param[in] ref pointer to current list element
+ *
+ * @return pointer to previous element or nullptr if no previous element exists
+ */
+ T *GetPrev(T *ref)
+ {
+ return((ref != NULL) ? ref->prev : NULL);
+ }
+
+
+ void InitEntry(T *obj) const
+ {
+ if (obj != NULL)
+ {
+ obj->next = NULL;
+ obj->prev = NULL;
+ }
+ }
+
+
+ /**
+ * @brief remove an element from a linked list
+ *
+ * @param[in] obj list element to remove
+ */
+ void Pop(T *obj)
+ {
+ if (obj != NULL)
+ {
+ if (first == obj)
+ {
+ first = obj->next;
+ }
+
+ if (last == obj)
+ {
+ last = obj->prev;
+ }
+
+ if (obj->next != NULL)
+ {
+ obj->next->prev = obj->prev;
+ }
+
+ if (obj->prev != NULL)
+ {
+ obj->prev->next = obj->next;
+ }
+ obj->next = NULL;
+ obj->prev = NULL;
+ }
+ }
+
+
+ //! swap two elements of a list
+ void Swap(T *obj1, T *obj2)
+ {
+ if (obj1 != NULL && obj2 != NULL)
+ {
+ if (obj1->prev == obj2)
+ {
+ Pop(obj1);
+ AddBefore(obj1, obj2);
+ }
+ else if (obj2->prev == obj1)
+ {
+ Pop(obj2);
+ AddBefore(obj2, obj1);
+ }
+ else
+ {
+ T *prev1 = obj1->prev;
+ Pop(obj1);
+
+ T *prev2 = obj2->prev;
+ Pop(obj2);
+
+ AddAfter(obj1, prev2);
+ AddAfter(obj2, prev1);
+ }
+ }
+ }
+
+
+ /**
+ * @brief add a new element after a reference position in a list
+ *
+ * @param obj new element to add to list
+ * @param ref chunk after which to insert new object
+ */
+ void AddAfter(T *obj, T *ref)
+ {
+ if (obj != NULL && ref != NULL)
+ {
+ Pop(obj); // TODO: is this necessary?
+ obj->next = ref->next;
+ obj->prev = ref;
+
+ if (ref->next != NULL)
+ {
+ ref->next->prev = obj;
+ }
+ else
+ {
+ last = obj;
+ }
+ ref->next = obj;
+ }
+ }
+
+
+ /**
+ * @brief add a new element before a reference position in a list
+ *
+ * @param obj new element to add to list
+ * @param ref chunk before to insert new object
+ */
+ void AddBefore(T *obj, T *ref)
+ {
+ if (obj != NULL && ref != NULL)
+ {
+ Pop(obj);
+ obj->next = ref;
+ obj->prev = ref->prev;
+
+ if (ref->prev != NULL)
+ {
+ ref->prev->next = obj;
+ }
+ else
+ {
+ first = obj;
+ }
+ ref->prev = obj;
+ }
+ }
+
+
+ /**
+ * @brief add a new element to the tail of a lis
+ *
+ * @param obj new element to add to the list
+ */
+ void AddTail(T *obj)
+ {
+ obj->next = NULL;
+ obj->prev = last;
+
+ if (last == NULL)
+ {
+ last = obj;
+ first = obj;
+ }
+ else
+ {
+ last->next = obj;
+ }
+ last = obj;
+ }
+
+
+ /**
+ * @brief add a new element to the head of a list
+ *
+ * @param obj new element to add to the list
+ */
+ void AddHead(T *obj)
+ {
+ obj->next = first;
+ obj->prev = NULL;
+
+ if (first == NULL)
+ {
+ last = obj;
+ first = obj;
+ }
+ else
+ {
+ first->prev = obj;
+ }
+ first = obj;
+ }
+};
+
+
+#endif /* LIST_MANAGER_H_INCLUDED */