Skip to content

Commit

Permalink
#335: Add std::queue serializer
Browse files Browse the repository at this point in the history
  • Loading branch information
thearusable committed May 27, 2024
1 parent c347157 commit f853742
Showing 1 changed file with 42 additions and 1 deletion.
43 changes: 42 additions & 1 deletion src/checkpoint/container/queue_serialize.h
Original file line number Diff line number Diff line change
Expand Up @@ -51,8 +51,49 @@

namespace checkpoint {

template<typename SerializerT, typename T>
void deserializeQueueElems(SerializerT& s, std::queue<T>& q, typename std::queue<T>::size_type size) {
using Reconstructor =
dispatch::Reconstructor<typename dispatch::CleanType<T>::CleanT>;

dispatch::Allocator<T> allocated;
for (typename std::queue<T>::size_type i = 0; i < size; ++i) {
auto* reconstructed = Reconstructor::construct(allocated.buf);
s | *reconstructed;
q.push(std::move(*reconstructed));
}
}

template<typename SerializerT, typename T>
void serializeQueueElems(SerializerT& s, std::queue<T> 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<T>& q) {
typename std::queue<T>::size_type size = serializeContainerSize(s, q);

if (s.isUnpacking()) {
deserializeQueueElems(s, q, size);
} else {
serializeQueueElems(s, q);
}
}

template <typename Serializer, typename T>
void serialize(Serializer& s, const std::queue<T>& q) {
void serialize(Serializer& s, std::queue<T>& q) {
serializeQueueLikeContainer(s, q);
}

Expand Down

0 comments on commit f853742

Please sign in to comment.