20namespace seqan3::contrib
27template <
typename TValue>
30 typedef ConcurrentQueue<TValue *, Suspendable<>> TStack;
31 typedef typename TStack::TSize TSize;
35 ResourcePool(TSize maxSize)
37 setWriterCount(recycled, 1);
38 for (; maxSize != 0; --maxSize)
39 appendValue(recycled, (TValue *)NULL);
44 unlockWriting(recycled);
46 while (popBack(ptr, recycled))
57template <
typename TValue>
61 SerializerItem *
next;
69template <
typename TValue,
typename TWorker>
73 typedef SerializerItem<TValue> TItem;
74 typedef TItem * TItemPtr;
75 typedef ResourcePool<TItem> TPool;
85 Serializer() : first(NULL), last(NULL), stop(false)
88 template <
typename TArg>
89 explicit Serializer(TArg & arg, TSize maxItems = 1024) :
101 TItemPtr item = first;
121template <
typename TValue>
122inline TValue * aquireValue(ResourcePool<TValue> & me)
125 if (!popBack(ptr, me.recycled))
138template <
typename TValue>
139inline void releaseValue(ResourcePool<TValue> & me, TValue * ptr)
141 appendValue(me.recycled, ptr);
148template <
typename TValue,
typename TWorker>
149inline void clear(Serializer<TValue, TWorker> & me)
152 while (me.first != NULL)
154 TValue * item = me.first;
155 me.first = me.first->next;
156 releaseValue(me.recycled, item);
168template <
typename TValue,
typename TWorker>
169inline TValue * aquireValue(Serializer<TValue, TWorker> & me)
171 typedef SerializerItem<TValue> TItem;
173 TItem * item = aquireValue(me.pool);
180 if (me.first == NULL)
183 me.last->next = item;
193template <
typename TValue,
typename TWorker>
194inline bool releaseValue(Serializer<TValue, TWorker> & me, TValue * ptr)
196 typedef SerializerItem<TValue> TItem;
198 TItem * item =
reinterpret_cast<TItem *
>(ptr);
199 assert(!item->ready);
208 if (item != me.first)
214 assert(me.first != NULL);
220 success = me.worker(item->val);
225 me.first = item->next;
228 releaseValue(me.pool, item);
232 if (item == NULL || !item->ready)
Provides seqan suspendable queue.