Пример #1
0
            /// <inheritdoc />
            public override bool TryGetObjectProperty(
                IJsonNavigatorNode objectNode,
                string propertyName,
                out ObjectProperty objectProperty)
            {
                _ = JsonBinaryNavigator.GetNodeOfType(
                    JsonNodeType.Object,
                    objectNode);

                Utf8Span utf8StringPropertyName = Utf8Span.TranscodeUtf16(propertyName);

                foreach (ObjectProperty objectPropertyNode in this.GetObjectProperties(objectNode))
                {
                    if (this.TryGetBufferedStringValue(objectPropertyNode.NameNode, out Utf8Memory bufferedUtf8StringValue))
                    {
                        // First try and see if we can avoid materializing the UTF16 string.
                        if (utf8StringPropertyName.Equals(bufferedUtf8StringValue.Span))
                        {
                            objectProperty = objectPropertyNode;
                            return(true);
                        }
                    }
                    else
                    {
                        if (this.GetStringValue(objectPropertyNode.NameNode) == propertyName)
                        {
                            objectProperty = objectPropertyNode;
                            return(true);
                        }
                    }
                }

                objectProperty = default;
                return(false);
            }
Пример #2
0
        public static void Equals_NonOrdinal(string str1, string str2, StringComparison comparison, string culture, bool shouldCompareAsEqual)
        {
            Func <string, string, string, string, string, int> action = (str1, str2, comparison, culture, shouldCompareAsEqual) =>
            {
                using (new ThreadCultureChange(culture))
                {
                    using BoundedUtf8Span boundedSpan1 = new BoundedUtf8Span(str1);
                    using BoundedUtf8Span boundedSpan2 = new BoundedUtf8Span(str2);

                    Utf8Span span1 = boundedSpan1.Span;
                    Utf8Span span2 = boundedSpan2.Span;

                    StringComparison comparisonType = Enum.Parse <StringComparison>(comparison);
                    bool             expected       = bool.Parse(shouldCompareAsEqual);

                    Assert.Equal(expected, span1.Equals(span2, comparisonType));
                    Assert.Equal(expected, span2.Equals(span1, comparisonType));
                    Assert.Equal(expected, Utf8Span.Equals(span1, span2, comparisonType));
                    Assert.Equal(expected, Utf8Span.Equals(span2, span1, comparisonType));
                }

                return(RemoteExecutor.SuccessExitCode);
            };

            if (culture != null && PlatformDetection.IsUap) // need to apply a culture to the current thread
            {
                RemoteExecutor.Invoke(action, str1, str2, comparison.ToString(), culture, shouldCompareAsEqual.ToString()).Dispose();
            }
            else
            {
                action(str1, str2, comparison.ToString(), culture, shouldCompareAsEqual.ToString());
            }
        }
Пример #3
0
        private static void AssertEqualOrdinal(Utf8Span span1, Utf8Span span2)
        {
            Assert.True(span1.Equals(span2));
            Assert.True(span2.Equals(span1));

            Assert.True(span1.Equals(span2, StringComparison.Ordinal));
            Assert.True(span2.Equals(span1, StringComparison.Ordinal));

            Assert.True(Utf8Span.Equals(span1, span2));
            Assert.True(Utf8Span.Equals(span2, span1));

            Assert.True(Utf8Span.Equals(span1, span2, StringComparison.Ordinal));
            Assert.True(Utf8Span.Equals(span2, span1, StringComparison.Ordinal));

            Assert.True(span1 == span2);
            Assert.True(span2 == span1);

            Assert.False(span1 != span2);
            Assert.False(span2 != span1);
        }
Пример #4
0
        internal HttpVersion ReadHttpVersion()
        {
            ReadOnlySpan <byte> oldBuffer = Buffer;
            Utf8Span            version   = ReadHttpVersionAsUtf8Span();

            if (version.Equals(s_Http1_1))
            {
                return(HttpVersion.V1_1);
            }
            else if (version.Equals(s_Http2_0))
            {
                return(HttpVersion.V2_0);
            }
            else if (version.Equals(s_Http1_0))
            {
                return(HttpVersion.V1_0);
            }
            else
            {
                Buffer = oldBuffer;
                return(HttpVersion.Unknown);
            }
        }
Пример #5
0
        public static void Equals_NonOrdinal(string str1, string str2, StringComparison comparison, string culture, bool shouldCompareAsEqual)
        {
            using (new ThreadCultureChange(culture))
            {
                using BoundedUtf8Span boundedSpan1 = new BoundedUtf8Span(str1);
                using BoundedUtf8Span boundedSpan2 = new BoundedUtf8Span(str2);

                Utf8Span span1 = boundedSpan1.Span;
                Utf8Span span2 = boundedSpan2.Span;

                Assert.Equal(shouldCompareAsEqual, span1.Equals(span2, comparison));
                Assert.Equal(shouldCompareAsEqual, span2.Equals(span1, comparison));
                Assert.Equal(shouldCompareAsEqual, Utf8Span.Equals(span1, span2, comparison));
                Assert.Equal(shouldCompareAsEqual, Utf8Span.Equals(span2, span1, comparison));
            }
        }
Пример #6
0
 public override bool Equals(Utf8Span x, Utf8Span y) => Utf8Span.Equals(x, y);
Пример #7
0
        private static SymbolTable CreateSymbolTable(string localeId, Stream resourceStream)
        {
            const int maxIdLength = 15;
            const int recordSize  = 20;

            var b1          = resourceStream.ReadByte();
            var b2          = resourceStream.ReadByte();
            var numberOfIDs = b1 * 256 + b2;

            var indexSize = numberOfIDs * 20;
            var index     = new byte[indexSize];

            resourceStream.Read(index, 0, indexSize);

            byte[] idBytes = new byte[maxIdLength];
            var    status  = Encodings.Utf16.ToUtf8(MemoryMarshal.AsBytes(localeId.AsSpan()), idBytes, out int consumed, out int idByteCount);

            if (status != System.Buffers.OperationStatus.Done)
            {
                throw new Exception("bad locale id");
            }

            var id = new Utf8Span(idBytes.AsSpan().Slice(0, idByteCount));

            int recordStart = -1;

            for (int record = 0; record < numberOfIDs; record++)
            {
                var indexId = index.AsSpan().Slice(record * recordSize, idByteCount);
                if (id.Equals(new Utf8Span(indexId))) // found record
                {
                    var indexData = index.AsSpan().Slice(record * recordSize + maxIdLength);
                    recordStart  = 0;
                    recordStart += indexData[3] * 256 * 256 * 256;
                    recordStart += indexData[2] * 256 * 256;
                    recordStart += indexData[1] * 256;
                    recordStart += indexData[0];
                    break;
                }
            }

            if (recordStart == -1)
            {
                throw new Exception("local not found");
            }

            resourceStream.Position = recordStart;

            const int bufferSize = 512;
            var       data       = new byte[bufferSize];
            var       bytesRead  = resourceStream.Read(data, 0, bufferSize);
            // TODO: maybe we should store length in the index

            var numberOfStrings = ReadUInt16At(data, 0);

            Debug.Assert(numberOfStrings == 17);

            var utf16digitsAndSymbols = new byte[numberOfStrings][];

            for (int stringIndex = 0; stringIndex < numberOfStrings; stringIndex++)
            {
                var stringStart  = ReadUInt16At(data, stringIndex * 2 + 1);
                var stringLength = ReadUInt16At(data, stringIndex * 2 + 2);
                utf16digitsAndSymbols[stringIndex] = new byte[stringLength];
                Array.Copy(data, stringStart, utf16digitsAndSymbols[stringIndex], 0, stringLength);
            }

            return(new CultureUtf16SymbolTable(utf16digitsAndSymbols));
        }