// Copyright (C) 2020 Jérôme Leclercq // This file is part of the "Nazara Engine - Shader generator" // For conditions of distribution and use, see copyright notice in Config.hpp #include #include namespace Nz::ShaderAst { template void AstSerializerBase::Container(T& container) { bool isWriting = IsWriting(); UInt32 size; if (isWriting) size = UInt32(container.size()); Value(size); if (!isWriting) container.resize(size); } template void AstSerializerBase::Enum(T& enumVal) { bool isWriting = IsWriting(); UInt32 value; if (isWriting) value = static_cast(enumVal); Value(value); if (!isWriting) enumVal = static_cast(value); } template void AstSerializerBase::OptEnum(std::optional& optVal) { bool isWriting = IsWriting(); bool hasValue; if (isWriting) hasValue = optVal.has_value(); Value(hasValue); if (!isWriting && hasValue) optVal.emplace(); if (optVal.has_value()) Enum(optVal.value()); } template void AstSerializerBase::OptVal(std::optional& optVal) { bool isWriting = IsWriting(); bool hasValue; if (isWriting) hasValue = optVal.has_value(); Value(hasValue); if (!isWriting && hasValue) optVal.emplace(); if (optVal.has_value()) { if constexpr (std::is_same_v) SizeT(optVal.value()); else Value(optVal.value()); } } inline void AstSerializerBase::SizeT(std::size_t& val) { bool isWriting = IsWriting(); UInt32 fixedVal; if (isWriting) fixedVal = static_cast(val); Value(fixedVal); if (!isWriting) val = static_cast(fixedVal); } inline ShaderAstSerializer::ShaderAstSerializer(ByteStream& stream) : m_stream(stream) { } inline ShaderAstUnserializer::ShaderAstUnserializer(ByteStream& stream) : m_stream(stream) { } inline StatementPtr UnserializeShader(const void* data, std::size_t size) { ByteStream byteStream(data, size); return UnserializeShader(byteStream); } } #include