@@ -358,8 +358,9 @@ enum State
358
358
StructList < ulong > _objKeys = new ( ) ;
359
359
MemWriter _topData ;
360
360
uint _items = 0 ;
361
- readonly LruCache < string , ulong > _strCache = new ( 512 ) ;
362
- readonly LruCache < ( bool IsClass , StructList < ulong > ObjKeys ) , ulong > _objKeysCache = new ( 64 ) ;
361
+ LruCache < string , ulong > ? _strCache = null ;
362
+ SpanByteLruCache < ulong > ? _u8Cache = null ;
363
+ LruCache < ( bool IsClass , StructList < ulong > ObjKeys ) , ulong > ? _objKeysCache = null ;
363
364
HashSet < string > ? _objKeysSet ;
364
365
365
366
public BonBuilder ( in MemWriter memWriter )
@@ -640,16 +641,16 @@ public void FinishObject()
640
641
rootData = ref _stack [ 0 ] . Item2 ;
641
642
}
642
643
643
- if ( ! _objKeysCache . TryGetValue ( ( false , objKeys ) , out var posKeys ) )
644
+ _objKeysCache ??= new ( ) ;
645
+ ref var posKeys = ref _objKeysCache . GetOrAddValueRef ( ( false , objKeys ) , out var added ) ;
646
+ if ( added )
644
647
{
645
648
posKeys = ( ulong ) rootData . GetCurrentPosition ( ) ;
646
649
rootData . WriteVUInt32 ( items ) ;
647
650
foreach ( var keyOfs in objKeys )
648
651
{
649
652
rootData . WriteVUInt64 ( keyOfs ) ;
650
653
}
651
-
652
- _objKeysCache [ ( false , objKeys ) ] = posKeys ;
653
654
}
654
655
655
656
var pos = rootData . GetCurrentPosition ( ) ;
@@ -695,16 +696,16 @@ public void FinishClass()
695
696
rootData = ref _stack [ 0 ] . Item2 ;
696
697
}
697
698
698
- if ( ! _objKeysCache . TryGetValue ( ( true , objKeys ) , out var posKeys ) )
699
+ _objKeysCache ??= new ( ) ;
700
+ ref var posKeys = ref _objKeysCache . GetOrAddValueRef ( ( true , objKeys ) , out var added ) ;
701
+ if ( added )
699
702
{
700
703
posKeys = ( ulong ) rootData . GetCurrentPosition ( ) ;
701
704
rootData . WriteVUInt32 ( items ) ;
702
705
foreach ( var keyOfs in objKeys )
703
706
{
704
707
rootData . WriteVUInt64 ( keyOfs ) ;
705
708
}
706
-
707
- _objKeysCache [ ( true , objKeys ) ] = posKeys ;
708
709
}
709
710
710
711
var pos = rootData . GetCurrentPosition ( ) ;
@@ -846,7 +847,9 @@ void ThrowWrongState()
846
847
847
848
ulong WriteDedupString ( string value )
848
849
{
849
- if ( _strCache . TryGetValue ( value , out var pos ) )
850
+ _strCache ??= new ( 512 ) ;
851
+ ref var pos = ref _strCache . GetOrAddValueRef ( value , out var added ) ;
852
+ if ( ! added )
850
853
{
851
854
return pos ;
852
855
}
@@ -859,21 +862,28 @@ ulong WriteDedupString(string value)
859
862
860
863
pos = ( ulong ) writer . GetCurrentPosition ( ) ;
861
864
writer . WriteStringInUtf8 ( value ) ;
862
- _strCache [ value ] = pos ;
863
865
return pos ;
864
866
}
865
867
866
868
ulong WriteDedupString ( ReadOnlySpan < byte > value )
867
869
{
870
+ _u8Cache ??= new ( 512 ) ;
871
+ ref var pos = ref _u8Cache . GetOrAddValueRef ( value , out var added ) ;
872
+ if ( ! added )
873
+ {
874
+ return pos ;
875
+ }
876
+
868
877
ref var writer = ref _topData ;
869
878
if ( _stack . Count > 0 )
870
879
{
871
880
writer = ref _stack [ 0 ] . Data ;
872
881
}
873
882
874
- var pos = ( ulong ) writer . GetCurrentPosition ( ) ;
883
+ pos = ( ulong ) writer . GetCurrentPosition ( ) ;
875
884
writer . WriteVUInt32 ( ( uint ) value . Length ) ;
876
885
writer . WriteBlock ( value ) ;
886
+ _u8Cache [ value ] = pos ;
877
887
return pos ;
878
888
}
879
889
0 commit comments