src/SSC/GeneratedProjectionRuntime.cs
実行済みCoberturaのhit数が1以上の行です。
未実行カバレッジ対象ですがhit数が0の行です。
対象外Coberturaに実行対象として記録されていない行です。
| 行 | 行状態 | Hits | Source |
|---|---|---|---|
| 1 | 対象外 | — | namespace SSC; |
| 2 | 対象外 | — | |
| 3 | 対象外 | — | public readonly struct ParallelGeneratedMeta |
| 4 | 対象外 | — | { |
| 5 | 対象外 | — | private readonly IParallelNode _node; |
| 6 | 対象外 | — | |
| 7 | 対象外 | — | public ParallelGeneratedMeta(IParallelNode node) |
| 8 | 対象外 | — | { |
| 9 | 実行済み | 13 | _node = node; |
| 10 | 実行済み | 13 | } |
| 11 | 対象外 | — | |
| 12 | 実行済み | 9 | public int Count => _node.Count; |
| 13 | 対象外 | — | |
| 14 | 実行済み | 4 | public string? KeyText => _node.KeyText; |
| 15 | 対象外 | — | |
| 16 | 未実行 | 0 | public ValueState GetState(int modelIndex) => _node.GetState(modelIndex); |
| 17 | 対象外 | — | } |
| 18 | 対象外 | — | |
| 19 | 対象外 | — | public sealed class ParallelGeneratedDictionary<TKey, TElement, TView> : IEnumerable<TView> |
| 20 | 対象外 | — | where TKey : notnull |
| 21 | 対象外 | — | { |
| 22 | 対象外 | — | private readonly IReadOnlyList<ParallelNode<TElement>> _nodes; |
| 23 | 対象外 | — | private readonly int _modelCount; |
| 24 | 対象外 | — | private readonly Func<ParallelNode<TElement>, TView> _viewFactory; |
| 25 | 対象外 | — | private Dictionary<string, int>? _keyIndexCache; |
| 26 | 対象外 | — | private Dictionary<object, int>? _keyValueIndexCache; |
| 27 | 対象外 | — | |
| 28 | 実行済み | 40 | public ParallelGeneratedDictionary( |
| 29 | 実行済み | 40 | IReadOnlyList<ParallelNode<TElement>> nodes, |
| 30 | 実行済み | 40 | int modelCount, |
| 31 | 実行済み | 40 | Func<ParallelNode<TElement>, TView> viewFactory) |
| 32 | 対象外 | — | { |
| 33 | 実行済み | 40 | ArgumentNullException.ThrowIfNull(nodes); |
| 34 | 実行済み | 40 | ArgumentOutOfRangeException.ThrowIfNegative(modelCount); |
| 35 | 実行済み | 40 | ArgumentNullException.ThrowIfNull(viewFactory); |
| 36 | 実行済み | 40 | _nodes = nodes; |
| 37 | 実行済み | 40 | _modelCount = modelCount; |
| 38 | 実行済み | 40 | _viewFactory = viewFactory; |
| 39 | 実行済み | 40 | } |
| 40 | 対象外 | — | |
| 41 | 未実行 | 0 | public int Count => _nodes.Count; |
| 42 | 対象外 | — | |
| 43 | 対象外 | — | public TView this[TKey key] |
| 44 | 対象外 | — | { |
| 45 | 対象外 | — | get |
| 46 | 対象外 | — | { |
| 47 | 実行済み | 32 | ArgumentNullException.ThrowIfNull(key); |
| 48 | 実行済み | 32 | return ResolveByKeyValue(NormalizeKey(key)); |
| 49 | 対象外 | — | } |
| 50 | 対象外 | — | } |
| 51 | 対象外 | — | |
| 52 | 対象外 | — | public TView AtIndex(int index) |
| 53 | 対象外 | — | { |
| 54 | 実行済み | 2 | ValidateIndex(index); |
| 55 | 実行済み | 2 | return _viewFactory(_nodes[index]); |
| 56 | 対象外 | — | } |
| 57 | 対象外 | — | |
| 58 | 対象外 | — | public TView ByPathKey(string discriminator) |
| 59 | 対象外 | — | { |
| 60 | 実行済み | 6 | ArgumentNullException.ThrowIfNull(discriminator); |
| 61 | 実行済み | 6 | if (!ParallelGeneratedKeyText.TryUnescapeXPathLikeDiscriminator(discriminator, out var keyText)) |
| 62 | 対象外 | — | { |
| 63 | 未実行 | 0 | keyText = discriminator; |
| 64 | 対象外 | — | } |
| 65 | 対象外 | — | |
| 66 | 実行済み | 6 | return ResolveByKeyText(keyText, "generated dictionary"); |
| 67 | 対象外 | — | } |
| 68 | 対象外 | — | |
| 69 | 対象外 | — | public ParallelGeneratedModelList<TElement, TView> SelectModel(int modelIndex) |
| 70 | 対象外 | — | { |
| 71 | 未実行 | 0 | ValidateModelIndex(modelIndex); |
| 72 | 未実行 | 0 | return new ParallelGeneratedModelList<TElement, TView>(_nodes, _viewFactory, modelIndex); |
| 73 | 対象外 | — | } |
| 74 | 対象外 | — | |
| 75 | 対象外 | — | public IEnumerator<TView> GetEnumerator() |
| 76 | 対象外 | — | { |
| 77 | 未実行 | 0 | for (var index = 0; index < _nodes.Count; index++) |
| 78 | 対象外 | — | { |
| 79 | 未実行 | 0 | yield return _viewFactory(_nodes[index]); |
| 80 | 対象外 | — | } |
| 81 | 未実行 | 0 | } |
| 82 | 対象外 | — | |
| 83 | 未実行 | 0 | System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() => GetEnumerator(); |
| 84 | 対象外 | — | |
| 85 | 対象外 | — | private TView ResolveByKeyText(string keyText, string containerName) |
| 86 | 対象外 | — | { |
| 87 | 実行済み | 6 | if (GetKeyIndexCache().TryGetValue(keyText, out var index)) |
| 88 | 対象外 | — | { |
| 89 | 実行済み | 6 | return _viewFactory(_nodes[index]); |
| 90 | 対象外 | — | } |
| 91 | 対象外 | — | |
| 92 | 未実行 | 0 | throw new CompareExecutionException( |
| 93 | 未実行 | 0 | CompareIssueCode.KeyNotFound, |
| 94 | 未実行 | 0 | $"key '{keyText}' was not found in {containerName}."); |
| 95 | 対象外 | — | } |
| 96 | 対象外 | — | |
| 97 | 対象外 | — | private TView ResolveByKeyValue(object key) |
| 98 | 対象外 | — | { |
| 99 | 実行済み | 32 | if (GetKeyValueIndexCache().TryGetValue(key, out var index)) |
| 100 | 対象外 | — | { |
| 101 | 実行済み | 31 | return _viewFactory(_nodes[index]); |
| 102 | 対象外 | — | } |
| 103 | 対象外 | — | |
| 104 | 実行済み | 1 | throw new CompareExecutionException( |
| 105 | 実行済み | 1 | CompareIssueCode.KeyNotFound, |
| 106 | 実行済み | 1 | $"key '{key}' was not found in generated dictionary."); |
| 107 | 対象外 | — | } |
| 108 | 対象外 | — | |
| 109 | 対象外 | — | private void ValidateIndex(int index) |
| 110 | 対象外 | — | { |
| 111 | 実行済み | 2 | if (index >= 0 && index < _nodes.Count) |
| 112 | 対象外 | — | { |
| 113 | 実行済み | 2 | return; |
| 114 | 対象外 | — | } |
| 115 | 対象外 | — | |
| 116 | 未実行 | 0 | throw new CompareExecutionException( |
| 117 | 未実行 | 0 | CompareIssueCode.ModelIndexOutOfRange, |
| 118 | 未実行 | 0 | $"dictionary index '{index}' is out of range for count '{_nodes.Count}'."); |
| 119 | 対象外 | — | } |
| 120 | 対象外 | — | |
| 121 | 対象外 | — | private void ValidateModelIndex(int modelIndex) |
| 122 | 対象外 | — | { |
| 123 | 未実行 | 0 | if (modelIndex >= 0 && modelIndex < _modelCount) |
| 124 | 対象外 | — | { |
| 125 | 未実行 | 0 | return; |
| 126 | 対象外 | — | } |
| 127 | 対象外 | — | |
| 128 | 未実行 | 0 | throw new CompareExecutionException( |
| 129 | 未実行 | 0 | CompareIssueCode.ModelIndexOutOfRange, |
| 130 | 未実行 | 0 | $"model index '{modelIndex}' is out of range for count '{_modelCount}'."); |
| 131 | 対象外 | — | } |
| 132 | 対象外 | — | |
| 133 | 対象外 | — | private Dictionary<string, int> GetKeyIndexCache() |
| 134 | 対象外 | — | { |
| 135 | 実行済み | 6 | if (_keyIndexCache is not null) |
| 136 | 対象外 | — | { |
| 137 | 未実行 | 0 | return _keyIndexCache; |
| 138 | 対象外 | — | } |
| 139 | 対象外 | — | |
| 140 | 実行済み | 6 | _keyIndexCache = ParallelGeneratedKeyText.CreateKeyIndexCache(_nodes); |
| 141 | 実行済み | 6 | return _keyIndexCache; |
| 142 | 対象外 | — | } |
| 143 | 対象外 | — | |
| 144 | 対象外 | — | private Dictionary<object, int> GetKeyValueIndexCache() |
| 145 | 対象外 | — | { |
| 146 | 実行済み | 32 | if (_keyValueIndexCache is not null) |
| 147 | 対象外 | — | { |
| 148 | 未実行 | 0 | return _keyValueIndexCache; |
| 149 | 対象外 | — | } |
| 150 | 対象外 | — | |
| 151 | 実行済み | 64 | var comparer = _nodes.FirstOrDefault(static node => node.KeyComparer is not null)?.KeyComparer |
| 152 | 実行済み | 32 | ?? EqualityComparer<object>.Default; |
| 153 | 実行済み | 32 | var keyValueIndexCache = new Dictionary<object, int>(comparer); |
| 154 | 実行済み | 168 | for (var index = 0; index < _nodes.Count; index++) |
| 155 | 対象外 | — | { |
| 156 | 実行済み | 52 | var keyValue = _nodes[index].KeyValue; |
| 157 | 実行済み | 52 | if (keyValue is not null) |
| 158 | 対象外 | — | { |
| 159 | 実行済み | 52 | keyValueIndexCache.TryAdd(keyValue, index); |
| 160 | 対象外 | — | } |
| 161 | 対象外 | — | } |
| 162 | 対象外 | — | |
| 163 | 実行済み | 32 | _keyValueIndexCache = keyValueIndexCache; |
| 164 | 実行済み | 32 | return _keyValueIndexCache; |
| 165 | 対象外 | — | } |
| 166 | 対象外 | — | |
| 167 | 対象外 | — | private static object NormalizeKey(object key) => |
| 168 | 実行済み | 32 | key is DateTime dateTime ? dateTime.ToUniversalTime() : key; |
| 169 | 対象外 | — | } |
| 170 | 対象外 | — | |
| 171 | 対象外 | — | public sealed class ParallelGeneratedList<TElement, TView> : IReadOnlyList<TView> |
| 172 | 対象外 | — | { |
| 173 | 対象外 | — | private readonly IReadOnlyList<ParallelNode<TElement>> _nodes; |
| 174 | 対象外 | — | private readonly int _modelCount; |
| 175 | 対象外 | — | private readonly Func<ParallelNode<TElement>, TView> _viewFactory; |
| 176 | 対象外 | — | private Dictionary<string, int>? _keyIndexCache; |
| 177 | 対象外 | — | |
| 178 | 対象外 | — | public ParallelGeneratedList(IReadOnlyList<ParallelNode<TElement>> nodes, Func<ParallelNode<TElement>, TView> viewFactory) |
| 179 | 未実行 | 0 | : this(nodes, nodes.Count > 0 ? nodes[0].Count : 0, viewFactory) |
| 180 | 対象外 | — | { |
| 181 | 未実行 | 0 | } |
| 182 | 対象外 | — | |
| 183 | 実行済み | 51 | public ParallelGeneratedList( |
| 184 | 実行済み | 51 | IReadOnlyList<ParallelNode<TElement>> nodes, |
| 185 | 実行済み | 51 | int modelCount, |
| 186 | 実行済み | 51 | Func<ParallelNode<TElement>, TView> viewFactory) |
| 187 | 対象外 | — | { |
| 188 | 実行済み | 51 | ArgumentNullException.ThrowIfNull(nodes); |
| 189 | 実行済み | 51 | ArgumentOutOfRangeException.ThrowIfNegative(modelCount); |
| 190 | 実行済み | 51 | ArgumentNullException.ThrowIfNull(viewFactory); |
| 191 | 実行済み | 51 | _nodes = nodes; |
| 192 | 実行済み | 51 | _modelCount = modelCount; |
| 193 | 実行済み | 51 | _viewFactory = viewFactory; |
| 194 | 実行済み | 51 | } |
| 195 | 対象外 | — | |
| 196 | 未実行 | 0 | public int Count => _nodes.Count; |
| 197 | 対象外 | — | |
| 198 | 対象外 | — | public TView this[int index] |
| 199 | 対象外 | — | { |
| 200 | 対象外 | — | get |
| 201 | 対象外 | — | { |
| 202 | 実行済み | 30 | ValidateIndex(index); |
| 203 | 実行済み | 29 | return _viewFactory(_nodes[index]); |
| 204 | 対象外 | — | } |
| 205 | 対象外 | — | } |
| 206 | 対象外 | — | |
| 207 | 対象外 | — | public TView this[string keyText] |
| 208 | 対象外 | — | { |
| 209 | 対象外 | — | get |
| 210 | 対象外 | — | { |
| 211 | 実行済み | 4 | ArgumentNullException.ThrowIfNull(keyText); |
| 212 | 対象外 | — | |
| 213 | 実行済み | 4 | var keyIndexCache = GetKeyIndexCache(); |
| 214 | 実行済み | 4 | if (ParallelGeneratedKeyText.TryUnescapeXPathLikeDiscriminator(keyText, out var unescapedKeyText) |
| 215 | 実行済み | 4 | && keyIndexCache.TryGetValue(unescapedKeyText, out var index)) |
| 216 | 対象外 | — | { |
| 217 | 未実行 | 0 | return _viewFactory(_nodes[index]); |
| 218 | 対象外 | — | } |
| 219 | 対象外 | — | |
| 220 | 実行済み | 4 | if (keyIndexCache.TryGetValue(keyText, out index)) |
| 221 | 対象外 | — | { |
| 222 | 実行済み | 3 | return _viewFactory(_nodes[index]); |
| 223 | 対象外 | — | } |
| 224 | 対象外 | — | |
| 225 | 実行済み | 1 | throw new CompareExecutionException( |
| 226 | 実行済み | 1 | CompareIssueCode.KeyNotFound, |
| 227 | 実行済み | 1 | $"key '{keyText}' was not found in generated list."); |
| 228 | 対象外 | — | } |
| 229 | 対象外 | — | } |
| 230 | 対象外 | — | |
| 231 | 対象外 | — | public ParallelGeneratedModelList<TElement, TView> SelectModel(int modelIndex) |
| 232 | 対象外 | — | { |
| 233 | 実行済み | 7 | ValidateModelIndex(modelIndex); |
| 234 | 実行済み | 6 | return new ParallelGeneratedModelList<TElement, TView>(_nodes, _viewFactory, modelIndex); |
| 235 | 対象外 | — | } |
| 236 | 対象外 | — | |
| 237 | 対象外 | — | private void ValidateIndex(int index) |
| 238 | 対象外 | — | { |
| 239 | 実行済み | 30 | if (index >= 0 && index < _nodes.Count) |
| 240 | 対象外 | — | { |
| 241 | 実行済み | 29 | return; |
| 242 | 対象外 | — | } |
| 243 | 対象外 | — | |
| 244 | 実行済み | 1 | throw new CompareExecutionException( |
| 245 | 実行済み | 1 | CompareIssueCode.ModelIndexOutOfRange, |
| 246 | 実行済み | 1 | $"list index '{index}' is out of range for count '{_nodes.Count}'."); |
| 247 | 対象外 | — | } |
| 248 | 対象外 | — | |
| 249 | 対象外 | — | private void ValidateModelIndex(int modelIndex) |
| 250 | 対象外 | — | { |
| 251 | 実行済み | 7 | if (modelIndex >= 0 && modelIndex < _modelCount) |
| 252 | 対象外 | — | { |
| 253 | 実行済み | 6 | return; |
| 254 | 対象外 | — | } |
| 255 | 対象外 | — | |
| 256 | 実行済み | 1 | throw new CompareExecutionException( |
| 257 | 実行済み | 1 | CompareIssueCode.ModelIndexOutOfRange, |
| 258 | 実行済み | 1 | $"model index '{modelIndex}' is out of range for count '{_modelCount}'."); |
| 259 | 対象外 | — | } |
| 260 | 対象外 | — | |
| 261 | 対象外 | — | private Dictionary<string, int> GetKeyIndexCache() |
| 262 | 対象外 | — | { |
| 263 | 実行済み | 4 | if (_keyIndexCache is not null) |
| 264 | 対象外 | — | { |
| 265 | 未実行 | 0 | return _keyIndexCache; |
| 266 | 対象外 | — | } |
| 267 | 対象外 | — | |
| 268 | 実行済み | 4 | _keyIndexCache = ParallelGeneratedKeyText.CreateKeyIndexCache(_nodes); |
| 269 | 実行済み | 4 | return _keyIndexCache; |
| 270 | 対象外 | — | } |
| 271 | 対象外 | — | |
| 272 | 未実行 | 0 | public TView AtIndex(int index) => this[index]; |
| 273 | 対象外 | — | |
| 274 | 未実行 | 0 | public TView ByPathKey(string discriminator) => this[discriminator]; |
| 275 | 対象外 | — | |
| 276 | 対象外 | — | public IEnumerator<TView> GetEnumerator() |
| 277 | 対象外 | — | { |
| 278 | 実行済み | 102 | for (var index = 0; index < _nodes.Count; index++) |
| 279 | 対象外 | — | { |
| 280 | 実行済み | 35 | yield return _viewFactory(_nodes[index]); |
| 281 | 対象外 | — | } |
| 282 | 実行済み | 16 | } |
| 283 | 対象外 | — | |
| 284 | 未実行 | 0 | System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() => GetEnumerator(); |
| 285 | 対象外 | — | } |
| 286 | 対象外 | — | |
| 287 | 対象外 | — | internal static class ParallelGeneratedKeyText |
| 288 | 対象外 | — | { |
| 289 | 対象外 | — | public static Dictionary<string, int> CreateKeyIndexCache<TElement>(IReadOnlyList<ParallelNode<TElement>> nodes) |
| 290 | 対象外 | — | { |
| 291 | 実行済み | 10 | var keyIndexCache = new Dictionary<string, int>(StringComparer.Ordinal); |
| 292 | 実行済み | 68 | for (var index = 0; index < nodes.Count; index++) |
| 293 | 対象外 | — | { |
| 294 | 実行済み | 24 | var keyText = nodes[index].KeyText; |
| 295 | 実行済み | 24 | if (keyText is not null) |
| 296 | 対象外 | — | { |
| 297 | 実行済み | 24 | keyIndexCache.TryAdd(keyText, index); |
| 298 | 対象外 | — | } |
| 299 | 対象外 | — | } |
| 300 | 対象外 | — | |
| 301 | 実行済み | 10 | return keyIndexCache; |
| 302 | 対象外 | — | } |
| 303 | 対象外 | — | |
| 304 | 対象外 | — | public static bool TryUnescapeXPathLikeDiscriminator(string keyText, out string unescapedKeyText) |
| 305 | 対象外 | — | { |
| 306 | 実行済み | 10 | var builder = new System.Text.StringBuilder(keyText.Length); |
| 307 | 実行済み | 10 | var changed = false; |
| 308 | 実行済み | 80 | for (var index = 0; index < keyText.Length; index++) |
| 309 | 対象外 | — | { |
| 310 | 実行済み | 30 | var current = keyText[index]; |
| 311 | 実行済み | 30 | if (current != '\\') |
| 312 | 対象外 | — | { |
| 313 | 実行済み | 22 | builder.Append(current); |
| 314 | 実行済み | 22 | continue; |
| 315 | 対象外 | — | } |
| 316 | 対象外 | — | |
| 317 | 実行済み | 8 | if (index + 1 >= keyText.Length) |
| 318 | 対象外 | — | { |
| 319 | 未実行 | 0 | unescapedKeyText = string.Empty; |
| 320 | 未実行 | 0 | return false; |
| 321 | 対象外 | — | } |
| 322 | 対象外 | — | |
| 323 | 実行済み | 8 | var escaped = keyText[++index]; |
| 324 | 実行済み | 8 | if (escaped is not (']' or '\\' or '#')) |
| 325 | 対象外 | — | { |
| 326 | 未実行 | 0 | unescapedKeyText = string.Empty; |
| 327 | 未実行 | 0 | return false; |
| 328 | 対象外 | — | } |
| 329 | 対象外 | — | |
| 330 | 実行済み | 8 | builder.Append(escaped); |
| 331 | 実行済み | 8 | changed = true; |
| 332 | 対象外 | — | } |
| 333 | 対象外 | — | |
| 334 | 実行済み | 10 | unescapedKeyText = changed ? builder.ToString() : keyText; |
| 335 | 実行済み | 10 | return changed; |
| 336 | 対象外 | — | } |
| 337 | 対象外 | — | } |
| 338 | 対象外 | — | |
| 339 | 対象外 | — | public sealed class ParallelGeneratedModelList<TElement, TView> : IReadOnlyList<TView> |
| 340 | 対象外 | — | { |
| 341 | 対象外 | — | private readonly IReadOnlyList<ParallelNode<TElement>> _nodes; |
| 342 | 対象外 | — | private readonly Func<ParallelNode<TElement>, TView> _viewFactory; |
| 343 | 対象外 | — | private readonly int[] _selectedNodeIndexes; |
| 344 | 対象外 | — | |
| 345 | 実行済み | 6 | internal ParallelGeneratedModelList( |
| 346 | 実行済み | 6 | IReadOnlyList<ParallelNode<TElement>> nodes, |
| 347 | 実行済み | 6 | Func<ParallelNode<TElement>, TView> viewFactory, |
| 348 | 実行済み | 6 | int modelIndex) |
| 349 | 対象外 | — | { |
| 350 | 実行済み | 6 | ArgumentNullException.ThrowIfNull(nodes); |
| 351 | 実行済み | 6 | ArgumentNullException.ThrowIfNull(viewFactory); |
| 352 | 実行済み | 6 | _nodes = nodes; |
| 353 | 実行済み | 6 | _viewFactory = viewFactory; |
| 354 | 対象外 | — | |
| 355 | 実行済み | 6 | var selectedNodeIndexes = new List<int>(_nodes.Count); |
| 356 | 実行済み | 36 | for (var index = 0; index < _nodes.Count; index++) |
| 357 | 対象外 | — | { |
| 358 | 実行済み | 12 | if (_nodes[index].GetPresenceState(modelIndex) != NodePresenceState.Missing) |
| 359 | 対象外 | — | { |
| 360 | 実行済み | 8 | selectedNodeIndexes.Add(index); |
| 361 | 対象外 | — | } |
| 362 | 対象外 | — | } |
| 363 | 対象外 | — | |
| 364 | 実行済み | 6 | _selectedNodeIndexes = [.. selectedNodeIndexes]; |
| 365 | 実行済み | 6 | } |
| 366 | 対象外 | — | |
| 367 | 未実行 | 0 | public int Count => _selectedNodeIndexes.Length; |
| 368 | 対象外 | — | |
| 369 | 対象外 | — | public TView this[int index] |
| 370 | 対象外 | — | { |
| 371 | 対象外 | — | get |
| 372 | 対象外 | — | { |
| 373 | 実行済み | 3 | ValidateIndex(index); |
| 374 | 実行済み | 2 | return _viewFactory(_nodes[_selectedNodeIndexes[index]]); |
| 375 | 対象外 | — | } |
| 376 | 対象外 | — | } |
| 377 | 対象外 | — | |
| 378 | 対象外 | — | public IEnumerator<TView> GetEnumerator() |
| 379 | 対象外 | — | { |
| 380 | 実行済み | 40 | for (var index = 0; index < _selectedNodeIndexes.Length; index++) |
| 381 | 対象外 | — | { |
| 382 | 実行済み | 12 | yield return _viewFactory(_nodes[_selectedNodeIndexes[index]]); |
| 383 | 対象外 | — | } |
| 384 | 実行済み | 8 | } |
| 385 | 対象外 | — | |
| 386 | 未実行 | 0 | System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() => GetEnumerator(); |
| 387 | 対象外 | — | |
| 388 | 対象外 | — | private void ValidateIndex(int index) |
| 389 | 対象外 | — | { |
| 390 | 実行済み | 3 | if (index >= 0 && index < _selectedNodeIndexes.Length) |
| 391 | 対象外 | — | { |
| 392 | 実行済み | 2 | return; |
| 393 | 対象外 | — | } |
| 394 | 対象外 | — | |
| 395 | 実行済み | 1 | throw new CompareExecutionException( |
| 396 | 実行済み | 1 | CompareIssueCode.ModelIndexOutOfRange, |
| 397 | 実行済み | 1 | $"list index '{index}' is out of range for count '{_selectedNodeIndexes.Length}'."); |
| 398 | 対象外 | — | } |
| 399 | 対象外 | — | } |
| 400 | 対象外 | — | |
| 401 | 対象外 | — | public sealed class ParallelGeneratedValue<TModel, TValue> |
| 402 | 対象外 | — | { |
| 403 | 対象外 | — | private readonly ParallelNode<TModel> _node; |
| 404 | 対象外 | — | private readonly IParallelNode? _valueNode; |
| 405 | 対象外 | — | private readonly Func<TModel, TValue> _getter; |
| 406 | 対象外 | — | |
| 407 | 実行済み | 99 | public ParallelGeneratedValue(ParallelNode<TModel> node, Func<TModel, TValue> getter) |
| 408 | 対象外 | — | { |
| 409 | 実行済み | 99 | ArgumentNullException.ThrowIfNull(node); |
| 410 | 実行済み | 99 | ArgumentNullException.ThrowIfNull(getter); |
| 411 | 実行済み | 99 | _node = node; |
| 412 | 実行済み | 99 | _getter = getter; |
| 413 | 実行済み | 99 | } |
| 414 | 対象外 | — | |
| 415 | 対象外 | — | public ParallelGeneratedValue( |
| 416 | 対象外 | — | ParallelNode<TModel> node, |
| 417 | 対象外 | — | IParallelNode valueNode, |
| 418 | 対象外 | — | Func<TModel, TValue> getter) |
| 419 | 実行済み | 95 | : this(node, getter) |
| 420 | 対象外 | — | { |
| 421 | 実行済み | 95 | ArgumentNullException.ThrowIfNull(valueNode); |
| 422 | 実行済み | 95 | _valueNode = valueNode; |
| 423 | 実行済み | 95 | } |
| 424 | 対象外 | — | |
| 425 | 実行済み | 80 | public TValue this[int modelIndex] => ResolveValue(modelIndex, out _); |
| 426 | 対象外 | — | |
| 427 | 対象外 | — | public ValueState GetState(int modelIndex) |
| 428 | 対象外 | — | { |
| 429 | 実行済み | 17 | if (_valueNode is not null) |
| 430 | 対象外 | — | { |
| 431 | 実行済み | 13 | return _valueNode.GetState(modelIndex); |
| 432 | 対象外 | — | } |
| 433 | 対象外 | — | |
| 434 | 実行済み | 4 | var selectedValue = ResolveValue(modelIndex, out var selectedPresence); |
| 435 | 実行済み | 4 | return GetState( |
| 436 | 実行済み | 4 | modelIndex, |
| 437 | 実行済み | 4 | selectedValue, |
| 438 | 実行済み | 4 | selectedPresence, |
| 439 | 実行済み | 4 | index => |
| 440 | 実行済み | 4 | { |
| 441 | 実行済み | 3 | var value = ResolveValue(index, out var presence); |
| 442 | 実行済み | 3 | return new ResolvedGeneratedValue(value, presence); |
| 443 | 実行済み | 4 | }); |
| 444 | 対象外 | — | } |
| 445 | 対象外 | — | |
| 446 | 対象外 | — | private ValueState GetState( |
| 447 | 対象外 | — | int modelIndex, |
| 448 | 対象外 | — | TValue selectedValue, |
| 449 | 対象外 | — | NodePresenceState selectedPresence, |
| 450 | 対象外 | — | Func<int, ResolvedGeneratedValue> getResolvedValue) |
| 451 | 対象外 | — | { |
| 452 | 実行済み | 4 | if (selectedPresence == NodePresenceState.Missing) |
| 453 | 対象外 | — | { |
| 454 | 実行済み | 1 | return ValueState.Missing; |
| 455 | 対象外 | — | } |
| 456 | 対象外 | — | |
| 457 | 実行済み | 3 | if (_node.Count <= 1) |
| 458 | 対象外 | — | { |
| 459 | 未実行 | 0 | return ValueState.Missing; |
| 460 | 対象外 | — | } |
| 461 | 対象外 | — | |
| 462 | 実行済み | 3 | var matched = true; |
| 463 | 実行済み | 16 | for (var index = 0; index < _node.Count; index++) |
| 464 | 対象外 | — | { |
| 465 | 実行済み | 6 | if (index == modelIndex) |
| 466 | 対象外 | — | { |
| 467 | 対象外 | — | continue; |
| 468 | 対象外 | — | } |
| 469 | 対象外 | — | |
| 470 | 実行済み | 3 | var other = getResolvedValue(index); |
| 471 | 実行済み | 3 | if (other.Presence == NodePresenceState.Missing) |
| 472 | 対象外 | — | { |
| 473 | 未実行 | 0 | matched = false; |
| 474 | 未実行 | 0 | break; |
| 475 | 対象外 | — | } |
| 476 | 対象外 | — | |
| 477 | 実行済み | 3 | if (other.Presence != selectedPresence) |
| 478 | 対象外 | — | { |
| 479 | 実行済み | 1 | matched = false; |
| 480 | 実行済み | 1 | break; |
| 481 | 対象外 | — | } |
| 482 | 対象外 | — | |
| 483 | 実行済み | 2 | if (selectedPresence == NodePresenceState.PresentValue |
| 484 | 実行済み | 2 | && !EqualityComparer<TValue>.Default.Equals(selectedValue, other.Value)) |
| 485 | 対象外 | — | { |
| 486 | 未実行 | 0 | matched = false; |
| 487 | 未実行 | 0 | break; |
| 488 | 対象外 | — | } |
| 489 | 対象外 | — | } |
| 490 | 対象外 | — | |
| 491 | 実行済み | 3 | return ValueStateExtensions.ToComparisonState(hasComparisonTarget: true, matched); |
| 492 | 対象外 | — | } |
| 493 | 対象外 | — | |
| 494 | 対象外 | — | public ParallelGeneratedValue<TModel, TNext> Select<TNext>(Func<TValue, TNext> selector) |
| 495 | 対象外 | — | { |
| 496 | 実行済み | 1 | ArgumentNullException.ThrowIfNull(selector); |
| 497 | 対象外 | — | |
| 498 | 実行済み | 1 | return new ParallelGeneratedValue<TModel, TNext>( |
| 499 | 実行済み | 1 | _node, |
| 500 | 実行済み | 1 | model => |
| 501 | 実行済み | 1 | { |
| 502 | 実行済み | 6 | var value = _getter(model); |
| 503 | 実行済み | 6 | if (value is null) |
| 504 | 実行済み | 1 | { |
| 505 | 未実行 | 0 | return default!; |
| 506 | 実行済み | 1 | } |
| 507 | 実行済み | 1 | |
| 508 | 実行済み | 6 | return selector(value); |
| 509 | 実行済み | 1 | }); |
| 510 | 対象外 | — | } |
| 511 | 対象外 | — | |
| 512 | 対象外 | — | public override string ToString() |
| 513 | 対象外 | — | { |
| 514 | 実行済み | 3 | return _valueNode?.ToString() ?? CreateDerivedLeaf().ToString(); |
| 515 | 対象外 | — | } |
| 516 | 対象外 | — | |
| 517 | 対象外 | — | private ParallelNode<TValue> CreateDerivedLeaf() |
| 518 | 対象外 | — | { |
| 519 | 実行済み | 1 | var values = new TValue?[_node.Count]; |
| 520 | 実行済み | 1 | var states = new ValueState[_node.Count]; |
| 521 | 実行済み | 6 | for (var modelIndex = 0; modelIndex < _node.Count; modelIndex++) |
| 522 | 対象外 | — | { |
| 523 | 実行済み | 2 | values[modelIndex] = ResolveValue(modelIndex, out _); |
| 524 | 実行済み | 2 | states[modelIndex] = GetState(modelIndex); |
| 525 | 対象外 | — | } |
| 526 | 対象外 | — | |
| 527 | 実行済み | 1 | return ParallelNode<TValue>.CreateLeaf(values, states); |
| 528 | 対象外 | — | } |
| 529 | 対象外 | — | |
| 530 | 対象外 | — | private readonly struct ResolvedGeneratedValue |
| 531 | 対象外 | — | { |
| 532 | 対象外 | — | public ResolvedGeneratedValue(TValue value, NodePresenceState presence) |
| 533 | 対象外 | — | { |
| 534 | 実行済み | 3 | Value = value; |
| 535 | 実行済み | 3 | Presence = presence; |
| 536 | 実行済み | 3 | } |
| 537 | 対象外 | — | |
| 538 | 実行済み | 2 | public TValue Value { get; } |
| 539 | 対象外 | — | |
| 540 | 実行済み | 6 | public NodePresenceState Presence { get; } |
| 541 | 対象外 | — | } |
| 542 | 対象外 | — | |
| 543 | 対象外 | — | private TValue ResolveValue(int modelIndex, out NodePresenceState state) |
| 544 | 対象外 | — | { |
| 545 | 実行済み | 89 | state = _node.GetPresenceState(modelIndex); |
| 546 | 実行済み | 89 | if (state == NodePresenceState.Missing) |
| 547 | 対象外 | — | { |
| 548 | 実行済み | 7 | return default!; |
| 549 | 対象外 | — | } |
| 550 | 対象外 | — | |
| 551 | 実行済み | 82 | var model = _node[modelIndex]; |
| 552 | 実行済み | 82 | if (model is null) |
| 553 | 対象外 | — | { |
| 554 | 未実行 | 0 | state = NodePresenceState.PresentNull; |
| 555 | 未実行 | 0 | return default!; |
| 556 | 対象外 | — | } |
| 557 | 対象外 | — | |
| 558 | 実行済み | 82 | var value = _getter(model); |
| 559 | 実行済み | 82 | if (value is null) |
| 560 | 対象外 | — | { |
| 561 | 実行済み | 1 | state = NodePresenceState.PresentNull; |
| 562 | 実行済み | 1 | return default!; |
| 563 | 対象外 | — | } |
| 564 | 対象外 | — | |
| 565 | 実行済み | 81 | state = NodePresenceState.PresentValue; |
| 566 | 実行済み | 81 | return value; |
| 567 | 対象外 | — | } |
| 568 | 対象外 | — | } |
| 569 | 対象外 | — | |
| 570 | 対象外 | — | public static class ParallelGeneratedRuntime |
| 571 | 対象外 | — | { |
| 572 | 対象外 | — | public static ParallelNode<T> RequireNode<T>(Parallel<T> node, string apiName) |
| 573 | 対象外 | — | { |
| 574 | 実行済み | 17 | ArgumentNullException.ThrowIfNull(node); |
| 575 | 実行済み | 17 | if (node is ParallelNode<T> parallelNode) |
| 576 | 対象外 | — | { |
| 577 | 実行済み | 16 | return parallelNode; |
| 578 | 対象外 | — | } |
| 579 | 対象外 | — | |
| 580 | 実行済み | 1 | throw new ArgumentException( |
| 581 | 実行済み | 1 | $"{apiName} can be used only with compare result nodes.", |
| 582 | 実行済み | 1 | nameof(node)); |
| 583 | 対象外 | — | } |
| 584 | 対象外 | — | |
| 585 | 対象外 | — | public static ParallelNode<TMember> RequireMemberNode<TParent, TMember>( |
| 586 | 対象外 | — | ParallelNode<TParent> node, |
| 587 | 対象外 | — | string memberName, |
| 588 | 対象外 | — | string apiName) |
| 589 | 対象外 | — | { |
| 590 | 実行済み | 41 | ArgumentNullException.ThrowIfNull(node); |
| 591 | 実行済み | 41 | ArgumentException.ThrowIfNullOrEmpty(memberName); |
| 592 | 実行済み | 41 | ArgumentException.ThrowIfNullOrEmpty(apiName); |
| 593 | 対象外 | — | |
| 594 | 実行済み | 41 | var internalNode = (IParallelNodeInternal)node; |
| 595 | 実行済み | 41 | if (!internalNode.TryGetMemberNode(memberName, out var rawMemberNode)) |
| 596 | 対象外 | — | { |
| 597 | 未実行 | 0 | throw new ArgumentException( |
| 598 | 未実行 | 0 | $"{apiName} cannot find generated member node '{memberName}'.", |
| 599 | 未実行 | 0 | nameof(memberName)); |
| 600 | 対象外 | — | } |
| 601 | 対象外 | — | |
| 602 | 実行済み | 41 | if (rawMemberNode is ParallelNode<TMember> memberNode) |
| 603 | 対象外 | — | { |
| 604 | 実行済み | 41 | return memberNode; |
| 605 | 対象外 | — | } |
| 606 | 対象外 | — | |
| 607 | 未実行 | 0 | throw new ArgumentException( |
| 608 | 未実行 | 0 | $"{apiName} can be used only with generated member node '{memberName}'.", |
| 609 | 未実行 | 0 | nameof(memberName)); |
| 610 | 対象外 | — | } |
| 611 | 対象外 | — | |
| 612 | 対象外 | — | public static IParallelNode RequireMemberNode<TParent>( |
| 613 | 対象外 | — | ParallelNode<TParent> node, |
| 614 | 対象外 | — | string memberName, |
| 615 | 対象外 | — | string apiName) |
| 616 | 対象外 | — | { |
| 617 | 実行済み | 95 | ArgumentNullException.ThrowIfNull(node); |
| 618 | 実行済み | 95 | ArgumentException.ThrowIfNullOrEmpty(memberName); |
| 619 | 実行済み | 95 | ArgumentException.ThrowIfNullOrEmpty(apiName); |
| 620 | 対象外 | — | |
| 621 | 実行済み | 95 | var internalNode = (IParallelNodeInternal)node; |
| 622 | 実行済み | 95 | if (internalNode.TryGetMemberNode(memberName, out var rawMemberNode)) |
| 623 | 対象外 | — | { |
| 624 | 実行済み | 95 | return rawMemberNode; |
| 625 | 対象外 | — | } |
| 626 | 対象外 | — | |
| 627 | 未実行 | 0 | throw new ArgumentException( |
| 628 | 未実行 | 0 | $"{apiName} cannot find generated member node '{memberName}'.", |
| 629 | 未実行 | 0 | nameof(memberName)); |
| 630 | 対象外 | — | } |
| 631 | 対象外 | — | } |