aboutsummaryrefslogtreecommitdiff
path: root/lib/recycler.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/recycler.cpp')
-rw-r--r--lib/recycler.cpp103
1 files changed, 103 insertions, 0 deletions
diff --git a/lib/recycler.cpp b/lib/recycler.cpp
new file mode 100644
index 000000000..515652fb0
--- /dev/null
+++ b/lib/recycler.cpp
@@ -0,0 +1,103 @@
+// Copyright (c) 2000-2001 Brad Hughes <bhughes@trolltech.com>
+//
+// Use, modification and distribution is allowed without limitation,
+// warranty, or liability of any kind.
+//
+
+#include "recycler.h"
+#include "constants.h"
+#include "buffer.h"
+
+
+Recycler::Recycler ( unsigned int sz )
+ : add_index ( 0 ), done_index ( 0 ), current_count ( 0 )
+{
+ buffer_count = ( sz / Buffer::size() );
+ if ( buffer_count < 1 )
+ {
+ buffer_count = 1;
+ }
+
+ buffers = new Buffer*[buffer_count];
+
+ for ( unsigned int i = 0; i < buffer_count; i ++ )
+ {
+ buffers[i] = new Buffer;
+ }
+}
+
+
+Recycler::~Recycler()
+{
+ for ( unsigned int i = 0; i < buffer_count; i++ )
+ {
+ delete buffers[i];
+ buffers[i] = 0;
+ }
+
+ delete [] buffers;
+}
+
+
+bool Recycler::full() const
+{
+ return current_count == buffer_count;
+}
+
+
+bool Recycler::empty() const
+{
+ return current_count == 0;
+}
+
+
+int Recycler::available() const
+{
+ return buffer_count - current_count;
+}
+
+
+int Recycler::used() const
+{
+ return current_count;
+}
+
+
+Buffer *Recycler::get()
+{
+ if ( full() )
+ return 0;
+ return buffers[add_index];
+}
+
+
+void Recycler::add()
+{
+ add_index = ++add_index % buffer_count;
+ current_count++;
+}
+
+
+Buffer *Recycler::next()
+{
+ return buffers[done_index];
+}
+
+
+void Recycler::done()
+{
+ done_index = ++done_index % buffer_count;
+ current_count--;
+}
+
+
+void Recycler::clear()
+{
+ add_index = done_index = current_count = 0;
+}
+
+
+unsigned int Recycler::size() const
+{
+ return buffer_count * Buffer::size();
+}