< Summary

Line coverage
0%
Covered lines: 0
Uncovered lines: 31
Coverable lines: 31
Total lines: 105
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 16
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Cyclomatic complexity NPath complexity Sequence coverage
.ctor(...)0%220%
GetValues()0%440%
ContainsCore(...)100%110%
Contains(...)0%220%
IndexOfAny(...)0%440%
IndexOfAnyExcept(...)100%110%
LastIndexOfAny(...)0%440%
LastIndexOfAnyExcept(...)100%110%

File(s)

https://raw.githubusercontent.com/dotnet/runtime/811a7eabb75c42db53440e8ba3f60c07511cfd1f/src/libraries/System.Private.CoreLib/src/System/SearchValues/BitmapCharSearchValues.cs

#LineLine coverage
 1// Licensed to the .NET Foundation under one or more agreements.
 2// The .NET Foundation licenses this file to you under the MIT license.
 3
 4using System.Collections.Generic;
 5using System.Diagnostics;
 6using System.Runtime.CompilerServices;
 7
 8namespace System.Buffers
 9{
 10    internal sealed class BitmapCharSearchValues : SearchValues<char>
 11    {
 12        private readonly uint[] _bitmap;
 13
 014        public BitmapCharSearchValues(ReadOnlySpan<char> values, int maxInclusive)
 15        {
 016            Debug.Assert(maxInclusive <= char.MaxValue);
 17
 018            _bitmap = new uint[maxInclusive / 32 + 1];
 19
 020            foreach (char c in values)
 21            {
 022                _bitmap[c >> 5] |= 1u << c;
 23            }
 024        }
 25
 26        internal override char[] GetValues()
 27        {
 028            var chars = new List<char>();
 029            uint[] bitmap = _bitmap;
 30
 031            for (int i = 0; i < _bitmap.Length * 32; i++)
 32            {
 033                if (Contains(bitmap, i))
 34                {
 035                    chars.Add((char)i);
 36                }
 37            }
 38
 039            return chars.ToArray();
 40        }
 41
 42        [MethodImpl(MethodImplOptions.AggressiveInlining)]
 43        internal override bool ContainsCore(char value) =>
 044            Contains(_bitmap, value);
 45
 46        [MethodImpl(MethodImplOptions.AggressiveInlining)]
 47        private static bool Contains(uint[] bitmap, int value)
 48        {
 049            uint offset = (uint)(value >> 5);
 050            return offset < (uint)bitmap.Length && (bitmap[offset] & (1u << value)) != 0;
 51        }
 52
 53        [MethodImpl(MethodImplOptions.AggressiveInlining)]
 54        internal override int IndexOfAny(ReadOnlySpan<char> span) =>
 055            IndexOfAny<IndexOfAnyAsciiSearcher.DontNegate>(span);
 56
 57        [MethodImpl(MethodImplOptions.AggressiveInlining)]
 58        internal override int IndexOfAnyExcept(ReadOnlySpan<char> span) =>
 059            IndexOfAny<IndexOfAnyAsciiSearcher.Negate>(span);
 60
 61        [MethodImpl(MethodImplOptions.AggressiveInlining)]
 62        internal override int LastIndexOfAny(ReadOnlySpan<char> span) =>
 063            LastIndexOfAny<IndexOfAnyAsciiSearcher.DontNegate>(span);
 64
 65        [MethodImpl(MethodImplOptions.AggressiveInlining)]
 66        internal override int LastIndexOfAnyExcept(ReadOnlySpan<char> span) =>
 067            LastIndexOfAny<IndexOfAnyAsciiSearcher.Negate>(span);
 68
 69        private int IndexOfAny<TNegator>(ReadOnlySpan<char> span)
 70            where TNegator : struct, IndexOfAnyAsciiSearcher.INegator
 71        {
 072            uint[] bitmap = _bitmap;
 73
 074            for (int i = 0; i < span.Length; i++)
 75            {
 076                char c = span[i];
 077                if (TNegator.NegateIfNeeded(Contains(bitmap, c)))
 78                {
 079                    return i;
 80                }
 81            }
 82
 083            return -1;
 84        }
 85
 86        private int LastIndexOfAny<TNegator>(ReadOnlySpan<char> span)
 87            where TNegator : struct, IndexOfAnyAsciiSearcher.INegator
 88        {
 089            uint[] bitmap = _bitmap;
 090            int searchSpaceLength = span.Length;
 91
 092            while (--searchSpaceLength >= 0)
 93            {
 094                char c = span[searchSpaceLength];
 095                if (TNegator.NegateIfNeeded(Contains(bitmap, c)))
 96                {
 97                    break;
 98                }
 99            }
 100
 0101            return searchSpaceLength;
 102        }
 103    }
 104}
 105