
Skytraq S1315F-RAW-EVK Logger
Diff: libT/portable/tringbuffer.h
- Revision:
- 0:e0ec137da369
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libT/portable/tringbuffer.h Sat Dec 18 11:17:21 2010 +0000 @@ -0,0 +1,64 @@ + +#ifndef __TRINGBUFFER_H +#define __TRINGBUFFER_H + +#include "tversion.h" + +namespace libT { + +template <class T> +class tRingBuffer : public tVersion +{ +public: + + tRingBuffer(void) : tVersion(0x20100721/* 2010-07-21 */,0x00000001UL),wp(0),rp(0) {} + + inline void reset(void){wp = rp = 0;} + + inline int writable(void) const + { + return (inc(wp) != rp) ? 1 : 0; + } + + inline int write(T _c) + { + int retval = -1; /* Ringbuffer FULL */ + if(writable()){ + array[wp] = _c; + wp = inc(wp); + retval = 0; /* OK */ + } + return retval; + } + + inline int readable(void) const + { + return (rp != wp) ? 1 : 0; + } + + inline int read(T *_c) + { + int retval = -1; /* Ringbuffer empty or _c is invalid*/ + if((readable()) && (_c != 0)){ + *_c = array[rp]; + rp = inc(rp); + retval = 0; /* OK */ + } + return retval; + } + +private: + enum {TRINGBUFFER_SIZE=0x200}; + inline unsigned short inc(unsigned short _p) const + { + return static_cast<unsigned short>(static_cast<unsigned short>(_p + 1) & (sizeof(array)-1)); + } + volatile unsigned short wp; + volatile unsigned short rp; + volatile T array[TRINGBUFFER_SIZE]; +}; + +}; + +#endif /* __TRINGBUFFER_H */ +