20 namespace seqan3::contrib
27 template <
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);
47 while (popBack(ptr, recycled))
60 template <
typename TValue>
72 template <
typename TValue,
typename TWorker>
76 typedef SerializerItem<TValue> TItem;
77 typedef TItem * TItemPtr;
78 typedef ResourcePool<TItem> TPool;
94 template <
typename TArg>
96 Serializer(TArg &arg, TSize maxItems = 1024) :
106 while (first != NULL)
108 TItemPtr item = first;
128 template <
typename TValue>
130 aquireValue(ResourcePool<TValue> & me)
133 if (!popBack(ptr, me.recycled))
146 template <
typename TValue>
148 releaseValue(ResourcePool<TValue> & me, TValue *ptr)
150 appendValue(me.recycled, ptr);
158 template <
typename TValue,
typename TWorker>
160 clear(Serializer<TValue, TWorker> & me)
163 while (me.first != NULL)
165 TValue *item = me.first;
166 me.first = me.first->next;
167 releaseValue(me.recycled, item);
179 template <
typename TValue,
typename TWorker>
181 aquireValue(Serializer<TValue, TWorker> & me)
183 typedef SerializerItem<TValue> TItem;
185 TItem *item = aquireValue(me.pool);
192 if (me.first == NULL)
195 me.last->next = item;
205 template <
typename TValue,
typename TWorker>
207 releaseValue(Serializer<TValue, TWorker> & me, TValue *ptr)
209 typedef SerializerItem<TValue> TItem;
211 TItem *item =
reinterpret_cast<TItem *
>(ptr);
212 assert(!item->ready);
221 if (item != me.first)
227 assert(me.first != NULL);
233 success = me.worker(item->val);
238 me.first = item->next;
241 releaseValue(me.pool, item);
245 if (item == NULL || !item->ready)