ArrayBackedRequestHeaders
using System.ClientModel.Internal;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
namespace System.ClientModel.Primitives
{
    [System.Runtime.CompilerServices.NullableContext(1)]
    [System.Runtime.CompilerServices.Nullable(0)]
    internal class ArrayBackedRequestHeaders : PipelineRequestHeaders
    {
        [System.Runtime.CompilerServices.Nullable(0)]
        private readonly struct IgnoreCaseString : IEquatable<IgnoreCaseString>
        {
            private readonly string _value;
            public IgnoreCaseString(string value)
            {
                _value = value;
            }
            [MethodImpl(MethodImplOptions.AggressiveInlining)]
            public bool Equals(IgnoreCaseString other)
            {
                return string.Equals(_value, other._value, StringComparison.OrdinalIgnoreCase);
            }
            [System.Runtime.CompilerServices.NullableContext(2)]
            public override bool Equals(object obj)
            {
                if (obj is IgnoreCaseString) {
                    IgnoreCaseString other = (IgnoreCaseString)obj;
                    return Equals(other);
                }
                return false;
            }
            public override int GetHashCode()
            {
                return _value.GetHashCode();
            }
            public static bool operator ==(IgnoreCaseString left, IgnoreCaseString right)
            {
                return left.Equals(right);
            }
            public static bool operator !=(IgnoreCaseString left, IgnoreCaseString right)
            {
                return !left.Equals(right);
            }
            public static implicit operator string(IgnoreCaseString ics)
            {
                return ics._value;
            }
        }
        [System.Runtime.CompilerServices.Nullable(new byte[] {
            0,
            1
        })]
        private ArrayBackedPropertyBag<IgnoreCaseString, object> _headers;
        public override bool Remove(string name)
        {
            return _headers.TryRemove(new IgnoreCaseString(name));
        }
        public override void Set(string name, string value)
        {
            _headers.Set(new IgnoreCaseString(name), value);
        }
        public override void Add(string name, string value)
        {
            Argument.AssertNotNullOrEmpty(name, "name");
            Argument.AssertNotNullOrEmpty(value, "value");
            if (!_headers.TryAdd(new IgnoreCaseString(name), value, out object existingValue)) {
                string text = existingValue as string;
                if (text == null)
                    (existingValue as List<string>)?.Add(value);
                else
                    _headers.Set(new IgnoreCaseString(name), new List<string> {
                        text,
                        value
                    });
            }
        }
        public override bool TryGetValue(string name, [System.Runtime.CompilerServices.Nullable(2)] out string value)
        {
            Argument.AssertNotNullOrEmpty(name, "name");
            if (_headers.TryGetValue(new IgnoreCaseString(name), out object value2)) {
                value = GetHeaderValueString(name, value2);
                return true;
            }
            value = null;
            return false;
        }
        public override bool TryGetValues(string name, [System.Runtime.CompilerServices.Nullable(new byte[] {
            2,
            1
        })] out IEnumerable<string> values)
        {
            Argument.AssertNotNullOrEmpty(name, "name");
            if (_headers.TryGetValue(new IgnoreCaseString(name), out object value)) {
                values = GetHeaderValueEnumerable(name, value);
                return true;
            }
            values = null;
            return false;
        }
        [return: System.Runtime.CompilerServices.Nullable(new byte[] {
            1,
            0,
            1,
            1
        })]
        public override IEnumerator<KeyValuePair<string, string>> GetEnumerator()
        {
            return GetHeadersStringValues().GetEnumerator();
        }
        internal bool GetNextValue(int index, out string name, [System.Runtime.CompilerServices.Nullable(2)] out object value)
        {
            if (index >= _headers.Count) {
                name = null;
                value = null;
                return false;
            }
            _headers.GetAt(index, out IgnoreCaseString key, out object value2);
            name = key;
            value = value2;
            return true;
        }
        [return: System.Runtime.CompilerServices.Nullable(new byte[] {
            1,
            0,
            1,
            1
        })]
        private IEnumerable<KeyValuePair<string, string>> GetHeadersStringValues()
        {
            for (int i = 0; i < _headers.Count; i++) {
                _headers.GetAt(i, out IgnoreCaseString key, out object value);
                string headerValueString = GetHeaderValueString(key, value);
                yield return new KeyValuePair<string, string>(key, headerValueString);
            }
        }
        private static string GetHeaderValueString(string name, object value)
        {
            string text = value as string;
            if (text != null)
                return text;
            List<string> list = value as List<string>;
            if (list == null)
                throw new InvalidOperationException($"""{name}""{value?.GetType()}");
            return string.Join(",", list);
        }
        private static IEnumerable<string> GetHeaderValueEnumerable(string name, object value)
        {
            string text = value as string;
            if (text != null)
                return new string[1] {
                    text
                };
            List<string> list = value as List<string>;
            if (list == null)
                throw new InvalidOperationException($"""{name}""{value.GetType()}");
            return list;
        }
    }
}