/
XmlDictionary.cs
113 lines (100 loc) · 3.4 KB
/
XmlDictionary.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System;
using System.IO;
using System.Xml;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Text;
using System.Runtime.Serialization;
using System.Diagnostics.CodeAnalysis;
namespace System.Xml
{
public class XmlDictionary : IXmlDictionary
{
private static IXmlDictionary? s_empty;
private readonly Dictionary<string, XmlDictionaryString> _lookup;
private XmlDictionaryString[]? _strings;
private int _nextId;
public static IXmlDictionary Empty => s_empty ??= new EmptyDictionary();
public XmlDictionary()
{
_lookup = new Dictionary<string, XmlDictionaryString>();
_strings = null;
_nextId = 0;
}
public XmlDictionary(int capacity)
{
_lookup = new Dictionary<string, XmlDictionaryString>(capacity);
_strings = new XmlDictionaryString[capacity];
_nextId = 0;
}
public virtual XmlDictionaryString Add(string value)
{
XmlDictionaryString? str;
if (!_lookup.TryGetValue(value, out str))
{
if (_strings == null)
{
_strings = new XmlDictionaryString[4];
}
else if (_nextId == _strings.Length)
{
int newSize = _nextId * 2;
if (newSize == 0)
newSize = 4;
Array.Resize(ref _strings, newSize);
}
str = new XmlDictionaryString(this, value, _nextId);
_strings[_nextId] = str;
_lookup.Add(value, str);
_nextId++;
}
return str;
}
public virtual bool TryLookup(string value, [NotNullWhen(true)] out XmlDictionaryString? result)
{
return _lookup.TryGetValue(value, out result);
}
public virtual bool TryLookup(int key, [NotNullWhen(true)] out XmlDictionaryString? result)
{
if (key < 0 || key >= _nextId)
{
result = null;
return false;
}
result = _strings![key];
return true;
}
public virtual bool TryLookup(XmlDictionaryString value, [NotNullWhen(true)] out XmlDictionaryString? result)
{
ArgumentNullException.ThrowIfNull(value);
if (value.Dictionary != this)
{
result = null;
return false;
}
result = value;
return true;
}
private sealed class EmptyDictionary : IXmlDictionary
{
public bool TryLookup(string value, [NotNullWhen(true)] out XmlDictionaryString? result)
{
result = null;
return false;
}
public bool TryLookup(int key, [NotNullWhen(true)] out XmlDictionaryString? result)
{
result = null;
return false;
}
public bool TryLookup(XmlDictionaryString value, [NotNullWhen(true)] out XmlDictionaryString? result)
{
result = null;
return false;
}
}
}
}