public void UInt64BytesISegmentTest() { var se = new UInt64BytesISegment(new byte[15]); se.Len.Is(15); se.UInt64Count.Is(2); se.LastValueByteCount.Is(7); }
public void UInt64BytesISegment_FunctionIsCorrectly(string val, ulong[] ulongKeys) { UInt64BytesISegment rawSegment = BssMapStringKeyResolver.Insance.GetMap2KeySegment(val); rawSegment.Length.Is(ulongKeys.Length); rawSegment.GetFirstElementReference(out bool isContiguousMemoryArea); isContiguousMemoryArea.IsTrue(); for (int i = 0; i < ulongKeys.Length; i++) { rawSegment[i].Is(ulongKeys[i]); } }
public void UInt64BytesISegment_Value_Is_Correctly() { UInt64BytesISegment se; se = new UInt64BytesISegment(UTF8Encoding.UTF8.GetBytes("a123456789")); se.Len.Is(10); se.UInt64Count.Is(2); se.LastValueByteCount.Is(2); se[0].Is((ulong)3978425819141910881); se[1].Is((ulong)14648); se = new UInt64BytesISegment(UTF8Encoding.UTF8.GetBytes("b123")); se.Len.Is(4); se.UInt64Count.Is(1); se.LastValueByteCount.Is(4); se[0].Is((ulong)858927458); se = new UInt64BytesISegment(UTF8Encoding.UTF8.GetBytes("a1234567")); se.Len.Is(8); se.UInt64Count.Is(1); se.LastValueByteCount.Is(8); se[0].Is((ulong)3978425819141910881); }
public static BssomFieldOffsetInfo IndexOf(IBssomBuffer buffer, IIndexOfInputSource indexOfInputSource) { if (buffer is null) { throw new ArgumentNullException(nameof(buffer)); } if (indexOfInputSource is null) { throw new ArgumentNullException(nameof(indexOfInputSource)); } BssomReader reader = new BssomReader(buffer); BssomFieldOffsetInfo info = new BssomFieldOffsetInfo(); indexOfInputSource.Reset(); if (!indexOfInputSource.MoveNext()) { throw BssomSerializationOperationException.InputDataSouceIsEmpty(); } Next: byte bssOjectType = reader.SkipBlankCharacterAndReadBssomType(); switch (bssOjectType) { case BssomType.Map1: { object key = indexOfInputSource.CurrentMapKey(); if (!BssMapKeyResolverProvider.TryGetBssMapKeyResolver(key.GetType(), out IBssMapKeyResolver resolver)) { throw BssomSerializationTypeFormatterException.BssomMapKeyUnsupportedType(key.GetType()); } reader.SkipVariableNumber(); //Skip Length int count = reader.ReadVariableNumber(); Raw64BytesISegment keyISegment = resolver.GetMap1KeySegment(key); for (int i = 0; i < count; i++) { int keyLength = reader.GetMap1KeyLength(); if (keyISegment.DataLen != keyLength) { reader.BssomBuffer.Seek(keyLength, BssomSeekOrgin.Current); //Advance Key reader.SkipObject(); //Skip Value continue; } //determine if the key is equal bool keyIsEqual = true; for (int z = 0; z < keyISegment.Length; z++) { if (keyISegment[z] != reader.ReadRaw64(ref keyLength)) { reader.BssomBuffer.Seek(keyLength, BssomSeekOrgin.Current); //Advance remaining keyLength reader.SkipObject(); //Skip Value keyIsEqual = false; break; } } if (keyIsEqual) { if (!indexOfInputSource.MoveNext()) { info.Offset = reader.Position; info.IsArray1Type = false; return(info); } else { goto Next; } } } if (indexOfInputSource.MoveNext()) { throw BssomSerializationOperationException.BssomMapIsNull(key); } info.Offset = -1; return(info); } case BssomType.Map2: { object key = indexOfInputSource.CurrentMapKey(); if (!BssMapKeyResolverProvider.TryGetBssMapKeyResolver(key.GetType(), out IBssMapKeyResolver resolver)) { throw BssomSerializationTypeFormatterException.BssomMapKeyUnsupportedType(key.GetType()); } UInt64BytesISegment keyISegment = resolver.GetMap2KeySegment(key); BssMapHeadPackInfo aprp = BssMapHeadPackInfo.Create(ref reader); if (aprp.MapHead.ElementCount > 0) { ref byte refb = ref reader.BssomBuffer.TryReadFixedRef(aprp.MapHead.RouteLength, out bool haveEnoughSizeAndCanBeFixed); if (haveEnoughSizeAndCanBeFixed) { if (BssMapObjMarshalReader.TrySeek(keyISegment, resolver.KeyType, resolver.KeyIsNativeType, ref aprp, ref reader, ref refb)) { if (!indexOfInputSource.MoveNext()) { info.Offset = reader.Position; info.IsArray1Type = false; return(info); } else { goto Next; } } } else { if (BssMapObjMarshalReader.TrySeekSlow(keyISegment, resolver.KeyType, resolver.KeyIsNativeType, ref aprp, ref reader)) { if (!indexOfInputSource.MoveNext()) { info.Offset = reader.Position; info.IsArray1Type = false; return(info); } else { goto Next; } } } } if (indexOfInputSource.MoveNext()) { throw BssomSerializationOperationException.BssomMapIsNull(key); } info.Offset = -1; return(info); }