/* * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or * its licensors. * * For complete copyright and license terms please see the LICENSE at the root of this * distribution (the "License"). All use of this software is governed by the License, * or, if provided, by the license below or the license accompanying this file. Do not * remove or modify any license notices. This file is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * */ #pragma once #include #include #include #include #include #include #include #include namespace AzNetworking { // Identifies AZStd containers struct AzContainerHelper { template struct IsIterableContainer { template static AZStd::false_type Evaluate(...); template static AZStd::true_type Evaluate(int, typename TYPE::value_type = typename TYPE::value_type(), typename TYPE::const_iterator = C().begin(), typename TYPE::const_iterator = C().end(), typename TYPE::size_type = C().size()); static constexpr bool Value = AZStd::is_same(0)), AZStd::true_type>::value; }; template struct HasReserveMethod { template static decltype(U().reserve()) Evaluate(int); template static AZStd::false_type Evaluate(...); static constexpr bool value = !AZStd::is_same(0))>::value; }; template static typename AZStd::Utils::enable_if_c::value>::type ReserveContainer(TYPE& value, typename TYPE::size_type size) { value.reserve(size); } template static typename AZStd::Utils::enable_if_c::value>::type ReserveContainer(TYPE&, typename TYPE::size_type) { ; } }; template struct SerializeType { static bool Serialize(ISerializer& serializer, OBJECT_TYPE& value) { return value.Serialize(serializer); } }; // Base template template struct SerializeObjectHelper { static bool SerializeObject(ISerializer& serializer, TYPE& value) { return value.Serialize(serializer); } }; // Non-containers template struct SerializeObjectHelper::value>> { static bool SerializeObject(ISerializer& serializer, TYPE& value) { return SerializeType::Serialize(serializer, value); } }; inline bool ISerializer::IsValid() const { return m_serializerValid; } inline void ISerializer::Invalidate() { m_serializerValid = false; } template inline bool ISerializer::Serialize(TYPE& value, const char* name) { enum { IsEnum = AZStd::is_enum::value }; enum { IsTypeSafeIntegral = AZStd::is_type_safe_integral::value }; return SerializeHelper::Serialize(*this, value, name); } // SerializeHelper for objects and structures template <> struct ISerializer::SerializeHelper { template static bool Serialize(ISerializer& serializer, TYPE& value, const char* name) { if (serializer.BeginObject(name, "Type name unknown")) { if (SerializeObjectHelper::SerializeObject(serializer, value)) { return serializer.EndObject(name, "Type name unknown"); } } return false; } }; template <> struct ISerializer::SerializeHelper { template static bool Serialize(ISerializer& serializer, TYPE& value, const char* name) { using SizeType = typename AZStd::underlying_type::type; SizeType& integralValue = reinterpret_cast(value); if (!serializer.Serialize(integralValue, name)) { return false; } //auto enumMembers = AzEnumTraits::Members; //if (AZStd::find(enumMembers.begin(), enumMembers.end(), static_cast(integralValue)) == enumMembers.end()) //{ // return false; //} return true; } }; template <> struct ISerializer::SerializeHelper { template static bool Serialize(ISerializer& serializer, TYPE& value, const char* name) { using RawType = typename AZStd::underlying_type::type; RawType& rawValue = reinterpret_cast(value); if (!serializer.Serialize(rawValue, name)) { return false; } return true; } }; template<> struct SerializeObjectHelper { static bool SerializeObject(ISerializer& serializer, AZ::Name& value) { AZ::Name::Hash nameHash = value.GetHash(); bool result = serializer.Serialize(nameHash, "NameHash"); if (result && serializer.GetSerializerMode() == SerializerMode::WriteToObject) { value = AZ::NameDictionary::Instance().FindName(nameHash); } return result; } }; } #include