add export visibility control to libpbd (works thus far on linux/gcc)
[ardour.git] / libs / pbd / pbd / ringbuffer.h
index d98601461e684eea5e5bf2d478877e8cd33ee3c1..bb2b8244f9889f4f9200eaf320ccfd16028bd1a3 100644 (file)
 #ifndef ringbuffer_h
 #define ringbuffer_h
 
+#include <cstring>
 #include <glib.h>
 
+#include "pbd/libpbd_visibility.h"
+
 template<class T>
-class RingBuffer 
+class LIBPBD_API RingBuffer 
 {
   public:
        RingBuffer (guint sz) {
 //     size = ffs(sz); /* find first [bit] set is a single inlined assembly instruction. But it looks like the API rounds up so... */
        guint power_of_two;
-       for (power_of_two = 1; 1U<<power_of_two < sz; power_of_two++);
-               size = 1<<power_of_two;
-               size_mask = size;
-               size_mask -= 1;
-               buf = new T[size];
-               reset ();
-
-       };
+       for (power_of_two = 1; 1U<<power_of_two < sz; power_of_two++) {}
+       size = 1<<power_of_two;
+       size_mask = size;
+       size_mask -= 1;
+       buf = new T[size];
+       reset ();
+       }
        
        virtual ~RingBuffer() {
                delete [] buf;
@@ -55,7 +57,7 @@ class RingBuffer
        }
        
        guint read  (T *dest, guint cnt);
-       guint  write (T *src, guint cnt);
+       guint write (T const * src,  guint cnt);
 
        struct rw_vector {
            T *buf[2];
@@ -118,7 +120,7 @@ class RingBuffer
        guint size_mask;
 };
 
-template<class T> guint 
+template<class T> LIBPBD_API guint 
 RingBuffer<T>::read (T *dest, guint cnt)
 {
         guint free_cnt;
@@ -157,8 +159,8 @@ RingBuffer<T>::read (T *dest, guint cnt)
         return to_read;
 }
 
-template<class T> guint
-RingBuffer<T>::write (T *src, guint cnt)
+template<class T> LIBPBD_API guint
+RingBuffer<T>::write (T const *src, guint cnt)
 
 {
         guint free_cnt;
@@ -197,7 +199,7 @@ RingBuffer<T>::write (T *src, guint cnt)
         return to_write;
 }
 
-template<class T> void
+template<class T> LIBPBD_API void
 RingBuffer<T>::get_read_vector (RingBuffer<T>::rw_vector *vec)
 
 {
@@ -233,11 +235,12 @@ RingBuffer<T>::get_read_vector (RingBuffer<T>::rw_vector *vec)
                
                vec->buf[0] = &buf[r];
                vec->len[0] = free_cnt;
+               vec->buf[1] = 0;
                vec->len[1] = 0;
        }
 }
 
-template<class T> void
+template<class T> LIBPBD_API void
 RingBuffer<T>::get_write_vector (RingBuffer<T>::rw_vector *vec)
 
 {