17namespace seqan3::contrib
24template <
typename TValue>
27 typedef ConcurrentQueue<TValue *, Suspendable<>> TStack;
28 typedef typename TStack::TSize TSize;
32 ResourcePool(TSize maxSize)
34 setWriterCount(recycled, 1);
35 for (; maxSize != 0; --maxSize)
36 appendValue(recycled, (TValue *)NULL);
41 unlockWriting(recycled);
43 while (popBack(ptr, recycled))
54template <
typename TValue>
58 SerializerItem *
next;
66template <
typename TValue,
typename TWorker>
70 typedef SerializerItem<TValue> TItem;
71 typedef TItem * TItemPtr;
72 typedef ResourcePool<TItem> TPool;
82 Serializer() : first(NULL), last(NULL), stop(false)
85 template <
typename TArg>
86 explicit Serializer(TArg & arg, TSize maxItems = 1024) :
98 TItemPtr item = first;
118template <
typename TValue>
119inline TValue * aquireValue(ResourcePool<TValue> & me)
122 if (!popBack(ptr, me.recycled))
135template <
typename TValue>
136inline void releaseValue(ResourcePool<TValue> & me, TValue * ptr)
138 appendValue(me.recycled, ptr);
145template <
typename TValue,
typename TWorker>
146inline void clear(Serializer<TValue, TWorker> & me)
149 while (me.first != NULL)
151 TValue * item = me.first;
152 me.first = me.first->next;
153 releaseValue(me.recycled, item);
165template <
typename TValue,
typename TWorker>
166inline TValue * aquireValue(Serializer<TValue, TWorker> & me)
168 typedef SerializerItem<TValue> TItem;
170 TItem * item = aquireValue(me.pool);
177 if (me.first == NULL)
180 me.last->next = item;
190template <
typename TValue,
typename TWorker>
191inline bool releaseValue(Serializer<TValue, TWorker> & me, TValue * ptr)
193 typedef SerializerItem<TValue> TItem;
195 TItem * item =
reinterpret_cast<TItem *
>(ptr);
196 assert(!item->ready);
205 if (item != me.first)
211 assert(me.first != NULL);
217 success = me.worker(item->val);
222 me.first = item->next;
225 releaseValue(me.pool, item);
229 if (item == NULL || !item->ready)
Provides seqan suspendable queue.