Buffer for general purpose use. Templated for most datatypes

Dependents:   BufferedSoftSerial 09_PT1000 10_PT1000 11_PT1000 ... more

Example

 #include "mbed.h"
 #include "Buffer.h"

 Buffer <char> buf;

 int main()
 {
     buf = 'a';
     buf.put('b');
     char *head = buf.head();
     puts(head);

     char whats_in_there[2] = {0};
     int pos = 0;

     while(buf.available())
     {   
         whats_in_there[pos++] = buf;
     }
     printf("%c %c\n", whats_in_there[0], whats_in_there[1]);
     buf.clear();
     error("done\n\n\n");
 }

Files at this revision

API Documentation at this revision

Comitter:
sam_grove
Date:
Wed Jun 26 15:24:27 2013 +0000
Parent:
2:d13a72146516
Parent:
3:c2de0ddfe65b
Child:
5:7b754354b99c
Commit message:
merged

Changed in this revision

Buffer.cpp Show annotated file Show diff for this revision Revisions of this file
Buffer.h Show annotated file Show diff for this revision Revisions of this file
--- a/Buffer.cpp	Thu May 23 23:48:36 2013 +0000
+++ b/Buffer.cpp	Wed Jun 26 15:24:27 2013 +0000
@@ -24,10 +24,10 @@
 #include "Buffer.h"
 
 template <class T>
-Buffer<T>::Buffer(BUFFER_SIZE size)
+Buffer<T>::Buffer(uint32_t size)
 {
     _buf = new T [size];
-    _sizemask = size-1;
+    _size = size;
     clear();
     
     return;
@@ -42,55 +42,21 @@
 }
 
 template <class T>
-void Buffer<T>::put(T data)
-{
-    _buf[_wloc++] = data;
-    _wloc &= _sizemask;
-    
-    return;
-}
-
-template <class T>
-T Buffer<T>::get(void)
-{
-    T data_pos = _buf[_rloc++];
-    _rloc &= _sizemask;
-    
-    return data_pos;
-}
-
-template <class T>
-T *Buffer<T>::head(void)
-{
-    T *data_pos = &_buf[0];
-    
-    return data_pos;
-}
-
-template <class T>
 void Buffer<T>::clear(void)
 {
     _wloc = 0;
     _rloc = 0;
-    memset(_buf, 0, _sizemask+1);
+    memset(_buf, 0, _size);
     
     return;
 }
 
 template <class T>
-uint32_t Buffer<T>::available(void)
-{
-    return (_wloc == _rloc) ? 0 : 1;
-}
-
-template <class T>
 uint32_t Buffer<T>::peek(char c)
 {
     return 1;
 }
 
-
-
 // make the linker aware of some possible types
 template class Buffer<uint8_t>;
 template class Buffer<int8_t>;
--- a/Buffer.h	Thu May 23 23:48:36 2013 +0000
+++ b/Buffer.h	Wed Jun 26 15:24:27 2013 +0000
@@ -64,15 +64,13 @@
     T   *_buf;
     volatile uint32_t   _wloc;
     volatile uint32_t   _rloc;
-    uint32_t            _sizemask;
-    
-    enum BUFFER_SIZE{SMALL = 0x100, MEDIUM = 0x400, LARGE = 0x1000};
+    uint32_t            _size;
 
 public:
     /** Create a Buffer and allocate memory for it
-     *  @param size An enum from BUFFER_SIZE.
+     *  @param size The size of the buffer
      */
-    Buffer(BUFFER_SIZE size = Buffer::SMALL);
+    Buffer(uint32_t size = 0x100);
     
     /** Destry a Buffer and release it's allocated memory
      */
@@ -124,5 +122,37 @@
     
 };
 
+template <class T>
+inline void Buffer<T>::put(T data)
+{
+    _buf[_wloc++] = data;
+    _wloc %= (_size-1);
+    
+    return;
+}
+
+template <class T>
+inline T Buffer<T>::get(void)
+{
+    T data_pos = _buf[_rloc++];
+    _rloc %= (_size-1);
+    
+    return data_pos;
+}
+
+template <class T>
+inline T *Buffer<T>::head(void)
+{
+    T *data_pos = &_buf[0];
+    
+    return data_pos;
+}
+
+template <class T>
+inline uint32_t Buffer<T>::available(void)
+{
+    return (_wloc == _rloc) ? 0 : 1;
+}
+
 #endif