コード例 #1
0
ファイル: Rune.cs プロジェクト: BaisilG/Core
        /// <summary>
        /// Attempts to create a <see cref="Rune"/> from the provided input value.
        /// </summary>
        public static Boolean TryCreate(Char ch, out Rune result)
        {
            UInt32 extendedValue = ch;

            if (!Utf16.IsSurrogate(extendedValue))
            {
                result = new Rune(extendedValue);
                return(true);
            }
            else
            {
                result = default;
                return(false);
            }
        }
コード例 #2
0
ファイル: Rune.cs プロジェクト: BaisilG/Core
        private static Int32 ReadRuneFromString(String input, Int32 index)
        {
            if (input is null)
            {
                throw new ArgumentNullException(nameof(input));
            }

            if ((UInt32)index >= (UInt32)input !.Length)
            {
                throw new ArgumentOutOfRangeException(nameof(index));
            }

            // Optimistically assume input is within BMP.

            UInt32 returnValue = input[index];

            if (Utf16.IsSurrogate(returnValue))
            {
                if (!Utf16.IsHighSurrogate(returnValue))
                {
                    return(-1);
                }

                // Treat 'returnValue' as the high surrogate.
                //
                // If this becomes a hot code path, we can skip the below bounds check by reading
                // off the end of the string using unsafe code. Since strings are null-terminated,
                // we're guaranteed not to read a valid low surrogate, so we'll fail correctly if
                // the string terminates unexpectedly.

                index++;
                if ((UInt32)index >= (UInt32)input.Length)
                {
                    return(-1);                    // not an argument exception - just a "bad data" failure
                }

                UInt32 potentialLowSurrogate = input[index];
                if (!Utf16.IsLowSurrogate(potentialLowSurrogate))
                {
                    return(-1);
                }

                returnValue = Unsafe.Utf16Decode(returnValue, potentialLowSurrogate);
            }

            return((Int32)returnValue);
        }
コード例 #3
0
ファイル: Rune.cs プロジェクト: BaisilG/Core
        // returns a negative number on failure
        internal static int ReadFirstRuneFromUtf16Buffer(ReadOnlySpan <char> input)
        {
            if (input.IsEmpty)
            {
                return(-1);
            }

            // Optimistically assume input is within BMP.

            uint returnValue = input[0];

            if (Utf16.IsSurrogate(returnValue))
            {
                if (!Utf16.IsHighSurrogate(returnValue))
                {
                    return(-1);
                }

                // Treat 'returnValue' as the high surrogate.

                if (1 >= (uint)input.Length)
                {
                    return(-1);                    // not an argument exception - just a "bad data" failure
                }

                uint potentialLowSurrogate = input[1];
                if (!Utf16.IsLowSurrogate(potentialLowSurrogate))
                {
                    return(-1);
                }

                returnValue = Unsafe.Utf16Decode(returnValue, potentialLowSurrogate);
            }

            return((int)returnValue);
        }