flext 0.6.2
flcontainers.h
Go to the documentation of this file.
1/*
2flext - C++ layer for Max and Pure Data externals
3
4Copyright (c) 2001-2015 Thomas Grill (gr@grrrr.org)
5For information on usage and redistribution, and for a DISCLAIMER OF ALL
6WARRANTIES, 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
23class LifoCell: public lockfree::stack_node {};
24
25class Lifo
26 : public lockfree::intrusive_stack<LifoCell>
27{
28public:
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
34template <typename T>
36 : public Lifo
37{
38public:
39 inline void Push(T *c) { Lifo::Push(static_cast<T *>(c)); }
40 inline T *Pop() { return static_cast<T *>(Lifo::Pop()); }
41};
42
43template <typename T>
45 : public LifoCell
46{
47public:
48 ValueLifoCell(T v): value(v) {}
50};
51
52template <typename T>
54 : public TypedLifo<ValueLifoCell<T> >
55{
56public:
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
71template <typename T,int M = 2,int O = 1>
73 : public TypedLifo<T>
74{
75public:
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 }
97private:
99 size_t sz,resz;
100};
101
102
103class FifoCell: public lockfree::fifo_node {};
104
105class Fifo
106 : public lockfree::intrusive_fifo<FifoCell>
107{
108public:
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
115template <typename T>
117 : public Fifo
118{
119public:
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
125template <typename T>
127 : public FifoCell
128{
129public:
132};
133
134template <typename T>
136 : public TypedFifo<ValueFifoCell<T> >
137{
138public:
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
154template <typename T,int M = 2,int O = 1>
156 : public TypedFifo<T>
157{
158public:
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; }
163private:
165 size_t sz,resz;
166};
167
168#include "flpopns.h"
169
170#endif
171
Definition: flcontainers.h:103
Definition: flcontainers.h:107
void Put(FifoCell *cl)
Definition: flcontainers.h:109
bool Avail() const
Definition: flcontainers.h:111
FifoCell * Get()
Definition: flcontainers.h:110
Definition: flcontainers.h:23
Definition: flcontainers.h:27
bool Avail() const
Definition: flcontainers.h:31
LifoCell * Pop()
Definition: flcontainers.h:30
void Push(LifoCell *cell)
Definition: flcontainers.h:29
Definition: flcontainers.h:157
~PooledFifo()
Definition: flcontainers.h:159
T * New()
Definition: flcontainers.h:161
void Free(T *p)
Definition: flcontainers.h:162
size_t resz
Definition: flcontainers.h:165
TypedFifo< T > reuse
Definition: flcontainers.h:164
size_t sz
Definition: flcontainers.h:165
Definition: flcontainers.h:74
size_t sz
Definition: flcontainers.h:99
void Free(T *p)
Definition: flcontainers.h:92
T * Pop()
Definition: flcontainers.h:79
size_t resz
Definition: flcontainers.h:99
PooledLifo()
Definition: flcontainers.h:76
TypedLifo< T > reuse
Definition: flcontainers.h:98
void Push(T *c)
Definition: flcontainers.h:78
T * New()
Definition: flcontainers.h:81
Definition: flcontainers.h:118
void Put(T *c)
Definition: flcontainers.h:120
T * Get()
Definition: flcontainers.h:121
Definition: flcontainers.h:37
void Push(T *c)
Definition: flcontainers.h:39
T * Pop()
Definition: flcontainers.h:40
Definition: flcontainers.h:128
ValueFifoCell(T v)
Definition: flcontainers.h:130
T value
Definition: flcontainers.h:131
Definition: flcontainers.h:137
void Put(T v)
Definition: flcontainers.h:139
T Get()
Definition: flcontainers.h:144
Definition: flcontainers.h:46
ValueLifoCell(T v)
Definition: flcontainers.h:48
T value
Definition: flcontainers.h:49
Definition: flcontainers.h:55
T Pop()
Definition: flcontainers.h:62
void Push(T v)
Definition: flcontainers.h:57
Try to find out the platform.