// Copyright Epic Games, Inc. All Rights Reserved.
using System;
using System.Collections.Generic;
using EpicGames.Core;
namespace EpicGames.Serialization.Converters
{
///
/// Converter for list types
///
///
class CbListConverter : CbConverter>
{
///
public override List Read(CbField field)
{
if (field.IsNull())
{
return null!;
}
else
{
List list = [];
foreach (CbField elementField in field)
{
list.Add(CbSerializer.Deserialize(elementField));
}
return list;
}
}
///
public override void Write(CbWriter writer, List list)
{
if (list == null)
{
writer.WriteNullValue();
}
else
{
writer.BeginArray();
foreach (T element in list)
{
CbSerializer.Serialize(writer, element);
}
writer.EndArray();
}
}
///
public override void WriteNamed(CbWriter writer, CbFieldName name, List list)
{
if (list == null)
{
writer.WriteNull(name);
}
else
{
writer.BeginArray(name);
foreach (T element in list)
{
CbSerializer.Serialize(writer, element);
}
writer.EndArray();
}
}
}
///
/// Specialization that writes a list as a uniform array of objects - a more efficient representation if you know the elements are always of the same type
///
///
public class CbUniformObjectListConverter : CbConverter>
{
///
public override List Read(CbField field)
{
if (field.IsNull())
{
return null!;
}
else
{
List list = [];
foreach (CbField elementField in field)
{
list.Add(CbSerializer.Deserialize(elementField));
}
return list;
}
}
///
public override void Write(CbWriter writer, List list)
{
if (list == null)
{
writer.WriteNullValue();
}
else
{
writer.BeginUniformArray(CbFieldType.Object);
foreach (T element in list)
{
CbSerializer.Serialize(writer, element);
}
writer.EndUniformArray();
}
}
///
public override void WriteNamed(CbWriter writer, CbFieldName name, List list)
{
if (list == null)
{
writer.WriteNull(name);
}
else
{
writer.BeginUniformArray(name, CbFieldType.Object);
foreach (T element in list)
{
CbSerializer.Serialize(writer, element);
}
writer.EndUniformArray();
}
}
}
///
/// Specialization for serializing string lists
///
sealed class CbStringListConverter : CbConverter>
{
///
public override List Read(CbField field)
{
List list = [];
foreach (CbField elementField in field)
{
list.Add(elementField.AsUtf8String());
}
return list;
}
///
public override void Write(CbWriter writer, List list)
{
writer.BeginUniformArray(CbFieldType.String);
foreach (Utf8String str in list)
{
writer.WriteUtf8StringValue(str);
}
writer.EndUniformArray();
}
///
public override void WriteNamed(CbWriter writer, CbFieldName name, List list)
{
if (list.Count > 0)
{
writer.BeginUniformArray(name, CbFieldType.String);
foreach (Utf8String str in list)
{
writer.WriteUtf8StringValue(str);
}
writer.EndUniformArray();
}
}
}
///
/// Factory for CbListConverter
///
class CbListConverterFactory : CbConverterFactory
{
///
public override CbConverter? CreateConverter(Type type)
{
if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(List<>))
{
if (type.GenericTypeArguments[0] == typeof(Utf8String))
{
return new CbStringListConverter();
}
else
{
Type converterType = typeof(CbListConverter<>).MakeGenericType(type.GenericTypeArguments);
return (CbConverter)Activator.CreateInstance(converterType)!;
}
}
return null;
}
}
}