Пример #1
0
 /// <summary>
 /// Releases the specified instance.
 /// </summary>
 /// <param name="instance">The instance.</param>
 /// <exception cref="ArgumentNullException">if instance is null</exception>
 public void Release(T instance)
 {
     if (instance is null)
     {
         ThrowHelper.ArgumentNullException(nameof(instance));
     }
     Reset(instance);
     lock (builders)
     {
         builders.Push(instance);
     }
 }
Пример #2
0
        /// <summary>
        /// Initializes a new instance of the <see cref="CharacterMap{T}"/> class.
        /// </summary>
        /// <param name="maps">The states.</param>
        /// <exception cref="ArgumentNullException"></exception>
        public CharacterMap(IEnumerable <KeyValuePair <char, T> > maps)
        {
            if (maps == null)
            {
                ThrowHelper.ArgumentNullException(nameof(maps));
            }
            var charSet = new HashSet <char>();
            int maxChar = 0;

            foreach (var map in maps)
            {
                var openingChar = map.Key;
                charSet.Add(openingChar);

                if (openingChar < 128)
                {
                    maxChar = Math.Max(maxChar, openingChar);
                }
                else
                {
                    nonAsciiMap ??= new Dictionary <uint, T>();
                }
            }

            OpeningCharacters = charSet.ToArray();
            Array.Sort(OpeningCharacters);

            asciiMap = new T[maxChar + 1];

            foreach (var state in maps)
            {
                char openingChar = state.Key;
                if (openingChar < 128)
                {
                    asciiMap[openingChar] ??= state.Value;
                    isOpeningCharacter.Set(openingChar);
                }
                else if (!nonAsciiMap.ContainsKey(openingChar))
                {
                    nonAsciiMap[openingChar] = state.Value;
                }
            }
        }
Пример #3
0
        public static bool TryParseHtmlTag(ref StringSlice text, StringBuilder builder)
        {
            if (builder is null)
            {
                ThrowHelper.ArgumentNullException(nameof(builder));
            }
            var c = text.CurrentChar;

            if (c != '<')
            {
                return(false);
            }
            c = text.NextChar();

            builder.Append('<');

            switch (c)
            {
            case '/':
                return(TryParseHtmlCloseTag(ref text, builder));

            case '?':
                return(TryParseHtmlTagProcessingInstruction(ref text, builder));

            case '!':
                builder.Append(c);
                c = text.NextChar();
                if (c == '-')
                {
                    return(TryParseHtmlTagHtmlComment(ref text, builder));
                }

                if (c == '[')
                {
                    return(TryParseHtmlTagCData(ref text, builder));
                }

                return(TryParseHtmlTagDeclaration(ref text, builder));
            }

            return(TryParseHtmlTagOpenTag(ref text, builder));
        }
Пример #4
0
        /// <summary>
        /// Initializes a new instance of the <see cref="CharacterMap{T}"/> class.
        /// </summary>
        /// <param name="maps">The states.</param>
        /// <exception cref="ArgumentNullException"></exception>
        public CharacterMap(IEnumerable <KeyValuePair <char, T> > maps)
        {
            if (maps is null)
            {
                ThrowHelper.ArgumentNullException(nameof(maps));
            }
            var charSet = new HashSet <char>();
            int maxChar = 0;

            foreach (var map in maps)
            {
                var openingChar = map.Key;
                charSet.Add(openingChar);

                if (openingChar < 128)
                {
                    maxChar = Math.Max(maxChar, openingChar);

                    if (openingChar == 0)
                    {
                        ThrowHelper.ArgumentOutOfRangeException("Null is not a valid opening character.", nameof(maps));
                    }
                }
                else
                {
                    nonAsciiMap ??= new Dictionary <uint, T>();
                }
            }

            OpeningCharacters = charSet.ToArray();
            Array.Sort(OpeningCharacters);

            asciiMap = new T[maxChar + 1];

            foreach (var state in maps)
            {
                char openingChar = state.Key;
                if (openingChar < 128)
                {
                    asciiMap[openingChar] ??= state.Value;
                    isOpeningCharacter.Set(openingChar);
                }
                else if (!nonAsciiMap !.ContainsKey(openingChar))
                {
                    nonAsciiMap[openingChar] = state.Value;
                }
            }

#if NETCOREAPP3_1_OR_GREATER
            if (nonAsciiMap is null)
            {
                long bitmap_0_3 = 0;
                long bitmap_4_7 = 0;

                foreach (char openingChar in OpeningCharacters)
                {
                    int position = (openingChar >> 4) | ((openingChar & 0x0F) << 3);
                    if (position < 64)
                    {
                        bitmap_0_3 |= 1L << position;
                    }
                    else
                    {
                        bitmap_4_7 |= 1L << (position - 64);
                    }
                }

                _asciiBitmap = Vector128.Create(bitmap_0_3, bitmap_4_7).AsByte();
            }
#endif
        }