diff --git a/src/checkpoint/container/queue_serialize.h b/src/checkpoint/container/queue_serialize.h index a1e88db2..ddca1da2 100644 --- a/src/checkpoint/container/queue_serialize.h +++ b/src/checkpoint/container/queue_serialize.h @@ -51,8 +51,49 @@ namespace checkpoint { +template +void deserializeQueueElems(SerializerT& s, std::queue& q, typename std::queue::size_type size) { + using Reconstructor = + dispatch::Reconstructor::CleanT>; + + dispatch::Allocator allocated; + for (typename std::queue::size_type i = 0; i < size; ++i) { + auto* reconstructed = Reconstructor::construct(allocated.buf); + s | *reconstructed; + q.push(std::move(*reconstructed)); + } +} + +template +void serializeQueueElems(SerializerT& s, std::queue q) { + while(!q.empty()) { + s | q.front(); + q.pop(); + } +} + +template < + typename SerializerT, + typename T, + typename = std::enable_if_t< + not std::is_same< + SerializerT, + checkpoint::Footprinter + >::value + > +> +void serializeQueueLikeContainer(SerializerT& s, std::queue& q) { + typename std::queue::size_type size = serializeContainerSize(s, q); + + if (s.isUnpacking()) { + deserializeQueueElems(s, q, size); + } else { + serializeQueueElems(s, q); + } +} + template -void serialize(Serializer& s, const std::queue& q) { +void serialize(Serializer& s, std::queue& q) { serializeQueueLikeContainer(s, q); }