summaryrefslogtreecommitdiff
path: root/shared/fixed_list.h
diff options
context:
space:
mode:
authorDaniel Wilhelm <daniel@wili.li>2014-04-18 17:15:16 +0200
committerDaniel Wilhelm <daniel@wili.li>2014-04-18 17:15:16 +0200
commitbd6336c629841c6db3a6ca53a936d629d34db53b (patch)
tree3721ef997864108df175ce677a8a7d4342a6f1d2 /shared/fixed_list.h
parent4.0 (diff)
downloadFreeFileSync-bd6336c629841c6db3a6ca53a936d629d34db53b.tar.gz
FreeFileSync-bd6336c629841c6db3a6ca53a936d629d34db53b.tar.bz2
FreeFileSync-bd6336c629841c6db3a6ca53a936d629d34db53b.zip
4.1
Diffstat (limited to 'shared/fixed_list.h')
-rw-r--r--shared/fixed_list.h142
1 files changed, 0 insertions, 142 deletions
diff --git a/shared/fixed_list.h b/shared/fixed_list.h
deleted file mode 100644
index 97976149..00000000
--- a/shared/fixed_list.h
+++ /dev/null
@@ -1,142 +0,0 @@
-// **************************************************************************
-// * This file is part of the FreeFileSync project. It is distributed under *
-// * GNU General Public License: http://www.gnu.org/licenses/gpl.html *
-// * Copyright (C) 2008-2011 ZenJu (zhnmju123 AT gmx.de) *
-// **************************************************************************
-
-#ifndef PTR_WRAP_012384670856841394535
-#define PTR_WRAP_012384670856841394535
-
-#include <iterator>
-
-namespace zen
-{
-//std::list(C++11) compatible class supporting inplace element construction for non-copyable/movable types
-//may be replaced by C++11 std::list when available
-template <class T>
-class FixedList
-{
- struct Node
- {
- Node() : next(NULL) {}
- template <class A> Node(A && a) : next(NULL), val(a) {}
- template <class A, class B> Node(A && a, B && b) : next(NULL), val(a, b) {}
- template <class A, class B, class C> Node(A && a, B && b, C && c) : next(NULL), val(a, b, c) {}
- template <class A, class B, class C, class D> Node(A && a, B && b, C && c, D && d) : next(NULL), val(a, b, c, d) {}
- template <class A, class B, class C, class D, class E> Node(A && a, B && b, C && c, D && d, E && e) : next(NULL), val(a, b, c, d, e) {}
- template <class A, class B, class C, class D, class E, class F> Node(A && a, B && b, C && c, D && d, E && e, F && f) : next(NULL), val(a, b, c, d, e, f) {}
-
- Node* next; //singly linked list is sufficient
- T val;
- };
-
-public:
- FixedList() :
- first(NULL),
- lastInsert(NULL),
- sz(0) {}
-
- ~FixedList() { clear(); }
-
- template <class NodeT, class U>
- class ListIterator : public std::iterator<std::forward_iterator_tag, U>
- {
- public:
- ListIterator(NodeT* it = NULL) : iter(it) {}
- ListIterator& operator++() { iter = iter->next; return *this; }
- inline friend bool operator==(const ListIterator& lhs, const ListIterator& rhs) { return lhs.iter == rhs.iter; }
- inline friend bool operator!=(const ListIterator& lhs, const ListIterator& rhs) { return !(lhs == rhs); }
- U& operator* () { return iter->val; }
- U* operator->() { return &iter->val; }
- private:
- NodeT* iter;
- };
-
- typedef T value_type;
- typedef ListIterator<Node, T> iterator;
- typedef ListIterator<const Node, const T> const_iterator;
- typedef T& reference;
- typedef const T& const_reference;
-
- iterator begin() { return first; }
- iterator end() { return iterator(); }
-
- const_iterator begin() const { return first; }
- const_iterator end () const { return const_iterator(); }
-
- reference front() { return first->val; }
- const_reference front() const { return first->val; }
-
- reference& back() { return lastInsert->val; }
- const_reference& back() const { return lastInsert->val; }
-
- void emplace_back() { pushNode(new Node); }
- template <class A> void emplace_back(A && a) { pushNode(new Node(std::forward<A>(a))); }
- template <class A, class B> void emplace_back(A && a, B && b) { pushNode(new Node(std::forward<A>(a), std::forward<B>(b))); }
- template <class A, class B, class C> void emplace_back(A && a, B && b, C && c) { pushNode(new Node(std::forward<A>(a), std::forward<B>(b), std::forward<C>(c))); }
- template <class A, class B, class C, class D> void emplace_back(A && a, B && b, C && c, D && d) { pushNode(new Node(std::forward<A>(a), std::forward<B>(b), std::forward<C>(c), std::forward<D>(d))); }
- template <class A, class B, class C, class D, class E> void emplace_back(A && a, B && b, C && c, D && d, E && e) { pushNode(new Node(std::forward<A>(a), std::forward<B>(b), std::forward<C>(c), std::forward<D>(d), std::forward<E>(e))); }
- template <class A, class B, class C, class D, class E, class F> void emplace_back(A && a, B && b, C && c, D && d, E && e, F && f) { pushNode(new Node(std::forward<A>(a), std::forward<B>(b), std::forward<C>(c), std::forward<D>(d), std::forward<E>(e), std::forward<F>(f))); }
-
- template <class Predicate>
- void remove_if(Predicate pred)
- {
- Node* prev = NULL;
- for (auto ptr = first; ptr;)
- if (pred(ptr->val))
- {
- Node* tmp = ptr->next;
- deleteNode(ptr);
- if (prev)
- prev->next = ptr = tmp;
- else
- first = ptr = tmp;
- if (tmp == NULL)
- lastInsert = prev;
- }
- else
- {
- prev = ptr;
- ptr = ptr->next;
- }
- }
-
- void clear() { remove_if([](T&) { return true; }); }
- bool empty() const { return first == NULL; }
- size_t size() const { return sz; }
-
-private:
- FixedList(const FixedList&);
- FixedList& operator=(const FixedList&);
-
- void pushNode(Node* newNode)
- {
- ++sz;
- if (lastInsert == NULL)
- {
- assert(first == NULL);
- first = lastInsert = newNode;
- }
- else
- {
- assert(lastInsert->next == NULL);
- lastInsert->next = newNode;
- lastInsert = newNode;
- }
- }
-
- void deleteNode(Node* oldNode)
- {
- assert(sz > 0);
- --sz;
- delete oldNode;
- }
-
- Node* first;
- Node* lastInsert; //point to last insertion; required by emplace_back()
- size_t sz;
-};
-}
-
-
-#endif //PTR_WRAP_012384670856841394535
bgstack15