flext  0.6.0
flcontainers.h
Go to the documentation of this file.
1 /*
2 flext - C++ layer for Max and Pure Data externals
3 
4 Copyright (c) 2001-2015 Thomas Grill (gr@grrrr.org)
5 For information on usage and redistribution, and for a DISCLAIMER OF ALL
6 WARRANTIES, see the file, "license.txt," in this distribution.
7 */
8 
13 #ifndef __FLCONTAINERS_H
14 #define __FLCONTAINERS_H
15 
16 #include "flprefix.h"
17 
18 #include "lockfree/stack.hpp"
19 #include "lockfree/fifo.hpp"
20 
21 #include "flpushns.h"
22 
23 class LifoCell: public lockfree::stack_node {};
24 
25 class Lifo
26  : public lockfree::intrusive_stack<LifoCell>
27 {
28 public:
29  inline void Push(LifoCell *cell) { this->push(cell); }
30  inline LifoCell *Pop() { return this->pop(); }
31  inline bool Avail() const { return !this->empty(); }
32 };
33 
34 template <typename T>
35 class TypedLifo
36  : public Lifo
37 {
38 public:
39  inline void Push(T *c) { Lifo::Push(static_cast<T *>(c)); }
40  inline T *Pop() { return static_cast<T *>(Lifo::Pop()); }
41 };
42 
43 template <typename T>
45  : public LifoCell
46 {
47 public:
48  ValueLifoCell(T v): value(v) {}
49  T value;
50 };
51 
52 template <typename T>
53 class ValueLifo
54  : public TypedLifo<ValueLifoCell<T> >
55 {
56 public:
57  inline void Push(T v)
58  {
60  }
61 
62  inline T Pop()
63  {
65  T v = p->value;
66  delete p;
67  return v;
68  }
69 };
70 
71 template <typename T,int M = 2,int O = 1>
73  : public TypedLifo<T>
74 {
75 public:
76  PooledLifo(): sz(0),resz(0) {}
77 
78  void Push(T *c) { TypedLifo<T>::Push(c); ++sz; }
79  T *Pop() { T *r = TypedLifo<T>::Pop(); if(r) --sz; return r; }
80 
81  T *New()
82  {
83  T *n = reuse.Pop();
84  if(n) {
85  --resz;
86  return n;
87  }
88  else
89  return new T;
90  }
91 
92  inline void Free(T *p)
93  {
94  if(resz < sz*M+O) { reuse.Push(p); ++resz; }
95  else delete p;
96  }
97 private:
99  size_t sz,resz;
100 };
101 
102 
103 class FifoCell: public lockfree::fifo_node {};
104 
105 class Fifo
106  : public lockfree::intrusive_fifo<FifoCell>
107 {
108 public:
109  inline void Put(FifoCell *cl) { this->enqueue(cl); }
110  inline FifoCell *Get() { return this->dequeue(); }
111  inline bool Avail() const { return !this->empty(); }
112 };
113 
114 
115 template <typename T>
117  : public Fifo
118 {
119 public:
120  inline void Put(T *c) { Fifo::Put(static_cast<T *>(c)); }
121  inline T *Get() { return static_cast<T *>(Fifo::Get()); }
122 };
123 
124 
125 template <typename T>
127  : public FifoCell
128 {
129 public:
130  ValueFifoCell(T v): value(v) {}
131  T value;
132 };
133 
134 template <typename T>
136  : public TypedFifo<ValueFifoCell<T> >
137 {
138 public:
139  inline void Put(T v)
140  {
142  }
143 
144  inline T Get()
145  {
147  T v = p->value;
148  delete p;
149  return v;
150  }
151 };
152 
153 
154 template <typename T,int M = 2,int O = 1>
156  : public TypedFifo<T>
157 {
158 public:
159  ~PooledFifo() { T *n; while((n = reuse.Get()) != NULL) delete n; }
160 
161  inline T *New() { T *n = reuse.Get(); return n?n:new T; }
162  inline void Free(T *p) { if(resz < sz*M+O) reuse.Put(p); else delete p; }
163 private:
165  size_t sz,resz;
166 };
167 
168 #include "flpopns.h"
169 
170 #endif
171 
Lifo
Definition: flcontainers.h:25
Fifo::Put
void Put(FifoCell *cl)
Definition: flcontainers.h:109
PooledFifo::reuse
TypedFifo< T > reuse
Definition: flcontainers.h:164
PooledLifo::reuse
TypedLifo< T > reuse
Definition: flcontainers.h:98
PooledLifo::Pop
T * Pop()
Definition: flcontainers.h:79
Lifo::Pop
LifoCell * Pop()
Definition: flcontainers.h:30
TypedFifo
Definition: flcontainers.h:116
PooledLifo::Free
void Free(T *p)
Definition: flcontainers.h:92
PooledLifo::PooledLifo
PooledLifo()
Definition: flcontainers.h:76
TypedFifo::Put
void Put(T *c)
Definition: flcontainers.h:120
ValueFifoCell
Definition: flcontainers.h:126
ValueLifoCell
Definition: flcontainers.h:44
TypedFifo::Get
T * Get()
Definition: flcontainers.h:121
flpopns.h
TypedLifo::Pop
T * Pop()
Definition: flcontainers.h:40
ValueLifo
Definition: flcontainers.h:53
PooledFifo::Free
void Free(T *p)
Definition: flcontainers.h:162
ValueFifoCell::value
T value
Definition: flcontainers.h:131
ValueFifo
Definition: flcontainers.h:135
PooledFifo
Definition: flcontainers.h:155
Lifo::Push
void Push(LifoCell *cell)
Definition: flcontainers.h:29
PooledLifo::sz
size_t sz
Definition: flcontainers.h:99
Fifo::Get
FifoCell * Get()
Definition: flcontainers.h:110
LifoCell
Definition: flcontainers.h:23
Fifo::Avail
bool Avail() const
Definition: flcontainers.h:111
PooledFifo::~PooledFifo
~PooledFifo()
Definition: flcontainers.h:159
FifoCell
Definition: flcontainers.h:103
PooledFifo::sz
size_t sz
Definition: flcontainers.h:165
ValueLifoCell::value
T value
Definition: flcontainers.h:49
ValueLifo::Push
void Push(T v)
Definition: flcontainers.h:57
ValueFifo::Put
void Put(T v)
Definition: flcontainers.h:139
PooledLifo
Definition: flcontainers.h:72
PooledLifo::Push
void Push(T *c)
Definition: flcontainers.h:78
Fifo
Definition: flcontainers.h:105
flpushns.h
TypedLifo::Push
void Push(T *c)
Definition: flcontainers.h:39
ValueLifoCell::ValueLifoCell
ValueLifoCell(T v)
Definition: flcontainers.h:48
ValueFifo::Get
T Get()
Definition: flcontainers.h:144
TypedLifo
Definition: flcontainers.h:35
PooledFifo::New
T * New()
Definition: flcontainers.h:161
Lifo::Avail
bool Avail() const
Definition: flcontainers.h:31
PooledLifo::resz
size_t resz
Definition: flcontainers.h:99
ValueLifo::Pop
T Pop()
Definition: flcontainers.h:62
PooledFifo::resz
size_t resz
Definition: flcontainers.h:165
ValueFifoCell::ValueFifoCell
ValueFifoCell(T v)
Definition: flcontainers.h:130
PooledLifo::New
T * New()
Definition: flcontainers.h:81
flprefix.h
Try to find out the platform.