/// or a memory leak will occurr.
char * copy_string(const char * s);
- /// Simple C++ fifo buffer class with zero copy (most of the time).
+ /// Simple C++ FIFO buffer class with zero copy (most of the time).
/// Not thread-safe on its own, you must have a mutex for access to it.
+ /// Doesn't grow, size is specified at instantiation.
/// Written to avoid STL templates, Boost, etc. in order to keep down the
/// size of the embedded version of this program.
class FIFO {
private:
- char * buffer;
- char * buffer_end;
- std::size_t buffer_length;
+ char * const buffer;
+ const char * const buffer_end;
char * in;
const char * out;
#include "drivers.h"
+#include <stdexcept>
+#include <cstring>
namespace FreeDV {
+ FIFO::FIFO(std::size_t size)
+ : buffer(new char[size]), buffer_end(buffer + size)
+ {
+
+ }
+
char *
FIFO::reorder(std::size_t size)
{
- return 0;
+ const std::size_t bytes = in - out;
+
+ if ( bytes > 0 ) {
+
+ // memmove() is specified to handle overlap properly.
+ memmove(buffer, out, bytes);
+#ifdef DEBUG
+ std::cerr << "FIFO reorder with copy." << std::endl;
+#endif
+ }
+ out = buffer;
+ in = buffer + bytes;
+
+ if ( size > buffer_end - in )
+ throw std::runtime_error("FIFO incoming data overrun.");
+
+ return in;
}
void
FIFO::out_overrun(std::size_t size) const
{
+ throw std::runtime_error("FIFO outgoing data overrun.");
}
}