diff options
author | JP Cimalando <jpcima@users.noreply.github.com> | 2018-11-10 16:59:35 +0100 |
---|---|---|
committer | JP Cimalando <jpcima@users.noreply.github.com> | 2018-11-10 19:04:45 +0100 |
commit | 298160f0154a05030681a208a247e2ed309f89db (patch) | |
tree | 653ca82dc19f300fa492727f9c4ea444debe762e /src/structures/pl_list.hpp | |
parent | c519585c1d167c2d0237c83068c4338193c0f463 (diff) | |
download | libADLMIDI-298160f0154a05030681a208a247e2ed309f89db.tar.gz libADLMIDI-298160f0154a05030681a208a247e2ed309f89db.tar.bz2 libADLMIDI-298160f0154a05030681a208a247e2ed309f89db.zip |
linked list structure + users
Diffstat (limited to 'src/structures/pl_list.hpp')
-rw-r--r-- | src/structures/pl_list.hpp | 128 |
1 files changed, 128 insertions, 0 deletions
diff --git a/src/structures/pl_list.hpp b/src/structures/pl_list.hpp new file mode 100644 index 0000000..327e259 --- /dev/null +++ b/src/structures/pl_list.hpp @@ -0,0 +1,128 @@ +// Copyright Jean Pierre Cimalando 2018. +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +#ifndef PL_LIST_HPP +#define PL_LIST_HPP + +#include <iterator> +#include <cstddef> + +/* + pl_cell: the linked list cell + */ +template <class T> +struct pl_cell; + +template <class T> +struct pl_basic_cell +{ + pl_cell<T> *prev, *next; +}; + +template <class T> +struct pl_cell : pl_basic_cell<T> +{ + T value; +}; + +/* + pl_iterator: the linked list iterator + */ +template <class Cell> +class pl_iterator +{ +public: + typedef std::bidirectional_iterator_tag iterator_category; + typedef Cell value_type; + typedef Cell &reference; + typedef Cell *pointer; + typedef std::ptrdiff_t difference_type; + + pl_iterator(Cell *cell = NULL); + bool is_end() const; + Cell &operator*() const; + Cell *operator->() const; + bool operator==(const pl_iterator &i) const; + bool operator!=(const pl_iterator &i) const; + pl_iterator &operator++(); + pl_iterator operator++(int); + pl_iterator &operator--(); + pl_iterator operator--(int); + +private: + Cell *cell_; +}; + +/* + pl_list: the preallocated linked list + */ +template <class T> +class pl_list +{ +public: + typedef pl_cell<T> value_type; + typedef value_type *pointer; + typedef value_type &reference; + typedef const value_type *const_pointer; + typedef const value_type &const_reference; + typedef pl_iterator< pl_cell<T> > iterator; + typedef pl_iterator< const pl_cell<T> > const_iterator; + + pl_list(std::size_t capacity = 0); + ~pl_list(); + + pl_list(const pl_list &other); + pl_list &operator=(const pl_list &other); + + std::size_t size() const; + std::size_t capacity() const; + bool empty() const; + + iterator begin(); + iterator end(); + const_iterator begin() const; + const_iterator end() const; + + void clear(); + + pl_cell<T> &front(); + const pl_cell<T> &front() const; + pl_cell<T> &back(); + const pl_cell<T> &back() const; + + iterator insert(iterator pos, const T &x); + iterator erase(iterator pos); + void push_front(const T &x); + void push_back(const T &x); + void pop_front(); + void pop_back(); + + iterator find(const T &x); + const_iterator find(const T &x) const; + template <class Pred> iterator find_if(const Pred &p); + template <class Pred> const_iterator find_if(const Pred &p) const; + +private: + // number of cells in the list + std::size_t size_; + // number of cells allocated + std::size_t capacity_; + // array of cells allocated + pl_cell<T> *cells_; + // pointer to the head cell + pl_cell<T> *first_; + // pointer to the next free cell + pl_cell<T> *free_; + // value-less cell which terminates the linked list + pl_basic_cell<T> endcell_; + + void initialize(std::size_t capacity); + pl_cell<T> *allocate(pl_cell<T> *pos); + void deallocate(pl_cell<T> *cell); +}; + +#include "pl_list.tcc" + +#endif // PL_LIST_HPP |