MediaFramework\Framework\includes\StrongMediaEventsSerializer.hpp
#pragma once
#include <type_traits>
#include <tuple>
#include <algorithm>
#include "StrongMediaEvents.hpp"
#include "MediaEvents.hpp"
#include "Deserialize.hpp"
#include "Serialize.hpp"
#include "SerializeDeserializeSpecializations.hpp"
namespace com
{
namespace clarion
{
namespace media
{
namespace internal
{
template<typename>
struct strip;
template<typename ... T>
struct strip<std::tuple<T...>>
{
static std::tuple<T...> deserialize(const MediaEvent& event)
{
Deserializer deserializer(reinterpret_cast<const uint8_t*>(event.payload), event.payloadSize);
return deserializer.deserialize<T...>();
}
static std::tuple<T...> deserialize(Deserializer& deserializer)
{
return deserializer.deserialize<T...>();
}
};
template<typename Tuple, typename Func, std::size_t I = 0>
typename std::enable_if< I != std::tuple_size<Tuple>::value, void >::type
for_each(Tuple tuple, Func func)
{
func(std::get<I>(tuple));
for_each<Tuple, Func, I + 1>(tuple, func);
}
template<typename Tuple, typename Func, std::size_t I = 0>
typename std::enable_if< I == std::tuple_size<Tuple>::value, void >::type
for_each(Tuple, Func)
{
// do nothing
}
struct SerializerLambda
{
SerializerLambda(Serializer& s):
serializer(s)
{
}
template <typename T>
void operator() (T&& t)
{
serializer.serialize(t);
}
Serializer& serializer;
};
}
template <eMediaEvents E>
void serializeEvent(Event<E>& e, Serializer& serializer)
{
internal::for_each(e.toTuple(), internal::SerializerLambda(serializer));
}
template <eMediaEvents E> Event<E> getEvent(const MediaEvent& event)
{
using Event = Event<E>;
using TupleType = typename Event::type;
Event e;
e.toTuple() = internal::strip<TupleType>::deserialize(event);
return e;
}
template <eMediaEvents E> Event<E> getEvent(Deserializer& deserializer)
{
using Event = Event<E>;
using TupleType = typename Event::type;
Event e;
e.toTuple() = internal::strip<TupleType>::deserialize(deserializer);
return e;
}
template <eMediaEvents E>
void sendEvent(Event<E>& e)
{
Serializer serializer;
serializeEvent(e, serializer);
MainLoop::PushMediaEvent(serializer, E, e.priority);
}
}
}
}