X-Git-Url: https://gerrit.opnfv.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fceph%2Fsrc%2Finclude%2Fxlist.h;fp=src%2Fceph%2Fsrc%2Finclude%2Fxlist.h;h=3b3cd9fcaac7f8c2a0d336b5fa2dcfe576794907;hb=812ff6ca9fcd3e629e49d4328905f33eee8ca3f5;hp=0000000000000000000000000000000000000000;hpb=15280273faafb77777eab341909a3f495cf248d9;p=stor4nfv.git diff --git a/src/ceph/src/include/xlist.h b/src/ceph/src/include/xlist.h new file mode 100644 index 0000000..3b3cd9f --- /dev/null +++ b/src/ceph/src/include/xlist.h @@ -0,0 +1,202 @@ +// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- +// vim: ts=8 sw=2 smarttab +/* + * Ceph - scalable distributed file system + * + * Copyright (C) 2004-2006 Sage Weil + * + * This is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software + * Foundation. See file COPYING. + * + */ + +#ifndef CEPH_XLIST_H +#define CEPH_XLIST_H + +#include "include/assert.h" +#include +#include + +template +class xlist { +public: + struct item { + T _item; + item *_prev, *_next; + xlist *_list; + + item(T i) : _item(i), _prev(0), _next(0), _list(0) {} + ~item() { + assert(!is_on_list()); + //remove_myself(); + } + + // no copying! + item(const item& other); + const item& operator= (const item& right); + + + xlist* get_list() { return _list; } + bool is_on_list() const { return _list ? true:false; } + bool remove_myself() { + if (_list) { + _list->remove(this); + assert(_list == 0); + return true; + } else + return false; + } + void move_to_front() { + assert(_list); + _list->push_front(this); + } + void move_to_back() { + assert(_list); + _list->push_back(this); + } + }; + + typedef item* value_type; + typedef item* const_reference; + +private: + item *_front, *_back; + size_t _size; + +public: + xlist(const xlist& other) { + _front = other._front; + _back = other._back; + _size = other._size; + } + + xlist() : _front(0), _back(0), _size(0) {} + ~xlist() { + assert(_size == 0); + assert(_front == 0); + assert(_back == 0); + } + + size_t size() const { + assert((bool)_front == (bool)_size); + return _size; + } + bool empty() const { + assert((bool)_front == (bool)_size); + return _front == 0; + } + + void clear() { + while (_front) + remove(_front); + assert((bool)_front == (bool)_size); + } + + void push_front(item *i) { + if (i->_list) + i->_list->remove(i); + + i->_list = this; + i->_next = _front; + i->_prev = 0; + if (_front) + _front->_prev = i; + else + _back = i; + _front = i; + _size++; + } + void push_back(item *i) { + if (i->_list) + i->_list->remove(i); + + i->_list = this; + i->_next = 0; + i->_prev = _back; + if (_back) + _back->_next = i; + else + _front = i; + _back = i; + _size++; + } + void remove(item *i) { + assert(i->_list == this); + + if (i->_prev) + i->_prev->_next = i->_next; + else + _front = i->_next; + if (i->_next) + i->_next->_prev = i->_prev; + else + _back = i->_prev; + _size--; + + i->_list = 0; + i->_next = i->_prev = 0; + assert((bool)_front == (bool)_size); + } + + T front() { return static_cast(_front->_item); } + const T front() const { return static_cast(_front->_item); } + + T back() { return static_cast(_back->_item); } + const T back() const { return static_cast(_back->_item); } + + void pop_front() { + assert(!empty()); + remove(_front); + } + void pop_back() { + assert(!empty()); + remove(_back); + } + + class iterator: std::iterator { + private: + item *cur; + public: + iterator(item *i = 0) : cur(i) {} + T operator*() { return static_cast(cur->_item); } + iterator& operator++() { + assert(cur); + assert(cur->_list); + cur = cur->_next; + return *this; + } + bool end() const { return cur == 0; } + bool operator==(const iterator& rhs) const { + return cur == rhs.cur; + } + bool operator!=(const iterator& rhs) const { + return cur != rhs.cur; + } + }; + + iterator begin() { return iterator(_front); } + iterator end() { return iterator(NULL); } + + class const_iterator: std::iterator { + private: + item *cur; + public: + const_iterator(item *i = 0) : cur(i) {} + const T operator*() { return static_cast(cur->_item); } + const_iterator& operator++() { + assert(cur); + assert(cur->_list); + cur = cur->_next; + return *this; + } + bool end() const { return cur == 0; } + }; + + const_iterator begin() const { return const_iterator(_front); } + const_iterator end() const { return const_iterator(NULL); } +}; + + +#endif