Fork of Smoothie to port to mbed non-LPC targets.
Fork of Smoothie by
Diff: libs/Network/uip/fifo.h
- Revision:
- 2:1df0b61d3b5a
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libs/Network/uip/fifo.h Fri Feb 28 18:52:52 2014 -0800 @@ -0,0 +1,180 @@ +/************************************************************************* + * + * $Author: Jim Morris $ + * $Date: 1999/02/05 21:05:00 $ + * + * this code is Licensed LGPL + * + *************************************************************************/ +#ifndef _FIFO_H_ +#define _FIFO_H_ + +#include <stdlib.h> + +// Doubly Linked list class + +template<class T> class LList; + +template<class T> +class Tlink +{ +public: + Tlink<T> *pnext; + Tlink<T> *pprev; + +public: + Tlink() + { + pnext = pprev = 0; + } + Tlink(Tlink *p, Tlink *n) + { + pprev = p; + pnext = n; + } + Tlink(const T &d) : data(d) + { + pnext = pprev = 0; + } + T data; +}; + +template<class T> +class list_base +{ +private: + Tlink<T> *head; + Tlink<T> *tail; + int cnt; + +protected: + list_base() + { + head = tail = NULL; + cnt = 0; + } + + list_base(Tlink<T> *n) // link into head of list + { + cnt = 1; + n->pnext = NULL; + n->pprev = NULL; + head = n; + tail = n; + } + + Tlink<T> *gethead(void) const + { + return head; + } + Tlink<T> *gettail(void) const + { + return tail; + } + Tlink<T> *getnext(Tlink<T> *n) const + { + return n->pnext; + } + Tlink<T> *getprev(Tlink<T> *n) const + { + return n->pprev; + } + + void addtohead(Tlink<T> *n) // add at head of list + { + n->pnext = head; + n->pprev = NULL; + if (head) head->pprev = n; + head = n; + if (tail == NULL) // first one + tail = n; + cnt++; + } + + void addtohead(int c, Tlink<T> *a, Tlink<T> *b) // add list at head of list + { + b->pnext = head; + a->pprev = NULL; + if (head) head->pprev = b; + head = a; + if (tail == NULL) // first one + tail = b; + cnt += c; + } + + void addtotail(Tlink<T> *n) // add to tail of list + { + n->pnext = NULL; + n->pprev = tail; + if (tail) tail->pnext = n; + tail = n; + if (head == NULL) // first one + head = n; + cnt++; + } + + void remove(Tlink<T> *n) // remove it by relinking + { + cnt--; + if (n->pprev) n->pprev->pnext = n->pnext; + else head = n->pnext; // it must be the head + if (n->pnext) n->pnext->pprev = n->pprev; + else tail = n->pprev; + } + + void reset() + { + head = tail = NULL; + cnt = 0; + } + int count() const + { + return cnt; + } +}; + +// fifo +template<class T> +class Fifo : private list_base<T> +{ +public: + Fifo(){} + + void push(const T &a); + T pop(); + T peek(); + int size() const; +}; + +template <class T> +int Fifo<T>::size() const +{ + return list_base<T>::count(); +} + +// add to end of list (FIFO) +template <class T> +void Fifo<T>::push(const T &a) +{ + list_base<T>::addtotail(new Tlink<T>(a)); +} + +// return the first item in the list +template <class T> +T Fifo<T>::peek() +{ + Tlink<T> *p = list_base<T>::gethead(); + return p->data; +} + +// pop the first item off the fifo +template <class T> +T Fifo<T>::pop() +{ + Tlink<T> *p = list_base<T>::gethead(); + T data = p->data; + list_base<T>::remove(p); + delete p; + return data; +}; +#endif