<#@ template debug="false" hostspecific="false" language="C#" #> <#@ assembly name="System.Core" #> <#@ import namespace="System.Linq" #> <#@ output extension=".cs" #> /* SPDX-License-Identifier: Apache-2.0 * * The OpenSearch Contributors require contributions made to * this file be licensed under the Apache-2.0 license or a * compatible open source license. * * Modifications Copyright OpenSearch Contributors. See * GitHub history for details. * * Licensed to Elasticsearch B.V. under one or more contributor * license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright * ownership. Elasticsearch B.V. licenses this file to you under * the Apache License, Version 2.0 (the "License"); you may * not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ #region Utf8Json License https://github.com/neuecc/Utf8Json/blob/master/LICENSE // MIT License // // Copyright (c) 2017 Yoshifumi Kawai // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #endregion using System; using OpenSearch.Net.Utf8Json.Internal; namespace OpenSearch.Net.Utf8Json.Formatters { // reduce static constructor generate size on generics(especially IL2CPP on Unity) internal static class TupleFormatterHelper { <# for(var i = 1; i <= 8; i++) { #> internal static readonly byte[][] nameCache<#= i #>; internal static readonly AutomataDictionary dictionary<#= i #>; <# } #> static TupleFormatterHelper() { <# for(var i = 1; i <= 8; i++) { Func toItem = x => ((x == 8) ? "Rest" : "Item" + x); #> nameCache<#= i #> = new [] { <# for (var j = 1; j <= i; j++) { if (j == 1) { #> JsonWriter.GetEncodedPropertyNameWithBeginObject("<#= toItem(j) #>"), <# } else if (j == i) { #> JsonWriter.GetEncodedPropertyNameWithPrefixValueSeparator("<#= toItem(j) #>"), <# } else { #> JsonWriter.GetEncodedPropertyNameWithPrefixValueSeparator("<#= toItem(j) #>"), <# } } #> }; dictionary<#= i #> = new AutomataDictionary { <# for (var j = 1; j <= i; j++) { #> {JsonWriter.GetEncodedPropertyNameWithoutQuotation("<#= toItem(j) #>"), <#= j - 1 #> }, <# } #> }; <# } #> } } } namespace OpenSearch.Net.Utf8Json.Formatters { <# for(var i = 1; i <= 8; i++) { Func toT = x => "T" + ((x == 8) ? "Rest" : x.ToString()); Func toItem = x => ((x == 8) ? "Rest" : "Item" + x); var ts = string.Join(", ", Enumerable.Range(1, i).Select(x => toT(x))); var t = "Tuple<" + ts + ">"; #> internal sealed class TupleFormatter<<#= ts #>> : IJsonFormatter<<#= t #>> { // ReSharper disable once StaticMemberInGenericType private static readonly byte[][] Cache = TupleFormatterHelper.nameCache<#= i #>; // ReSharper disable once StaticMemberInGenericType private static readonly AutomataDictionary Dictionary = TupleFormatterHelper.dictionary<#= i #>; public void Serialize(ref JsonWriter writer, <#= t #> value, IJsonFormatterResolver formatterResolver) { if (value == null) { writer.WriteNull(); return; } <# for(var j = 1; j <= i; j++) { #> writer.WriteRaw(Cache[<#= j - 1 #>]); formatterResolver.GetFormatterWithVerify<<#= toT(j) #>>().Serialize(ref writer, value.<#= toItem(j) #>, formatterResolver); <# } #> writer.WriteEndObject(); } public <#= t #> Deserialize(ref JsonReader reader, IJsonFormatterResolver formatterResolver) { if (reader.ReadIsNull()) return null; <# for(var j = 1; j <= i; j++) { #> <#= toT(j) #> item<#= j #> = default; <# } #> var count = 0; reader.ReadIsBeginObjectWithVerify(); while (!reader.ReadIsEndObjectWithSkipValueSeparator(ref count)) { var keyString = reader.ReadPropertyNameSegmentRaw(); Dictionary.TryGetValue(keyString, out var key); switch (key) { <# for(var j = 1; j <= i; j++) { #> case <#= j - 1 #>: item<#= j #> = formatterResolver.GetFormatterWithVerify<<#= toT(j) #>>().Deserialize(ref reader, formatterResolver); break; <# } #> default: reader.ReadNextBlock(); break; } } return new Tuple<<#= ts #>>(<#= string.Join(", ", Enumerable.Range(1, i).Select(x => "item" + x)) #>); } } <# } #> }