1717 * under the License.
1818 */
1919
20- package org .apache .fory .resolver ;
20+ package org .apache .fory .context ;
2121
2222import java .util .Arrays ;
2323import java .util .Objects ;
24+ import org .apache .fory .annotation .Internal ;
2425import org .apache .fory .collection .LongLongByteMap ;
2526import org .apache .fory .collection .LongMap ;
2627import org .apache .fory .collection .ObjectMap ;
2930import org .apache .fory .meta .EncodedMetaString ;
3031import org .apache .fory .meta .Encoders ;
3132import org .apache .fory .meta .MetaStringDecoder ;
33+ import org .apache .fory .resolver .MetaStringRef ;
34+ import org .apache .fory .resolver .SharedRegistry ;
3235import org .apache .fory .util .MurmurHash3 ;
3336
3437/** Read-side state for meta-string references. */
38+ @ Internal
3539public final class MetaStringReader {
36- private static final int INITIAL_CAPACITY = 4 ;
40+ private static final int INITIAL_CAPACITY = 2 ;
3741 private static final float LOAD_FACTOR = 0.5f ;
3842 private static final int SMALL_STRING_THRESHOLD = 16 ;
3943
@@ -56,7 +60,7 @@ public MetaStringReader(SharedRegistry sharedRegistry) {
5660
5761 public String readMetaString (MemoryBuffer buffer ) {
5862 MetaStringRef metaStringRef = readMetaStringBytes (buffer );
59- EncodedMetaString encodedMetaString = metaStringRef .encoded ;
63+ EncodedMetaString encodedMetaString = metaStringRef .getEncoded () ;
6064 String str = metaString2StringMap .get (encodedMetaString );
6165 if (str == null ) {
6266 str = metaStringRef .decode (Encoders .GENERIC_DECODER );
@@ -106,7 +110,7 @@ public MetaStringRef readMetaStringBytes(MemoryBuffer buffer) {
106110 return dynamicReadStringIds [len - 1 ];
107111 }
108112
109- MetaStringRef readMetaStringBytes (MemoryBuffer buffer , MetaStringRef cache ) {
113+ public MetaStringRef readMetaStringBytes (MemoryBuffer buffer , MetaStringRef cache ) {
110114 int header = buffer .readVarUint32Small7 ();
111115 int len = header >>> 1 ;
112116 if ((header & 0b1) == 0 ) {
@@ -122,7 +126,7 @@ MetaStringRef readMetaStringBytes(MemoryBuffer buffer, MetaStringRef cache) {
122126
123127 private MetaStringRef readBigMetaStringBytes (MemoryBuffer buffer , MetaStringRef cache , int len ) {
124128 long hashCode = buffer .readInt64 ();
125- if (cache .encoded .hash == hashCode ) {
129+ if (cache .getEncoded () .hash == hashCode ) {
126130 buffer .increaseReaderIndex (len );
127131 return cache ;
128132 }
@@ -134,7 +138,7 @@ private MetaStringRef readBigMetaStringBytes(MemoryBuffer buffer, int len, long
134138 if (encodedMetaString == null ) {
135139 EncodedMetaString newMetaString = new EncodedMetaString (buffer .readBytes (len ), hashCode );
136140 MetaStringRef metaStringRef = sharedRegistry .getOrCreateMetaStringRef (newMetaString );
137- hash2MetaStringMap .put (hashCode , metaStringRef .encoded );
141+ hash2MetaStringMap .put (hashCode , metaStringRef .getEncoded () );
138142 return metaStringRef ;
139143 }
140144 buffer .increaseReaderIndex (len );
@@ -175,7 +179,7 @@ private MetaStringRef readSmallMetaStringBytes(
175179 v1 = buffer .readInt64 ();
176180 v2 = buffer .readBytesAsInt64 (len - 8 );
177181 }
178- EncodedMetaString cachedMetaString = cache .encoded ;
182+ EncodedMetaString cachedMetaString = cache .getEncoded () ;
179183 if (cachedMetaString .first8Bytes == v1 && cachedMetaString .second8Bytes == v2 ) {
180184 return cache ;
181185 }
@@ -195,23 +199,27 @@ private MetaStringRef createSmallMetaStringBytes(int len, byte encoding, long v1
195199 hashCode = (hashCode & 0xffffffffffffff00L ) | encoding ;
196200 EncodedMetaString encodedMetaString = new EncodedMetaString (Arrays .copyOf (data , len ), hashCode );
197201 MetaStringRef metaStringRef = sharedRegistry .getOrCreateMetaStringRef (encodedMetaString );
198- longLongMetaStringMap .put (v1 , v2 , encoding , metaStringRef .encoded );
202+ longLongMetaStringMap .put (v1 , v2 , encoding , metaStringRef .getEncoded () );
199203 return metaStringRef ;
200204 }
201205
202206 private void updateDynamicString (MetaStringRef metaStringRef ) {
203207 short currentDynamicReadId = dynamicReadStringId ++;
204208 MetaStringRef [] readStringIds = dynamicReadStringIds ;
205209 if (readStringIds .length <= currentDynamicReadId ) {
206- readStringIds = growRead (currentDynamicReadId );
210+ readStringIds = dynamicReadStringIds = growRead (readStringIds , currentDynamicReadId );
207211 }
208212 readStringIds [currentDynamicReadId ] = metaStringRef ;
209213 }
210214
211- private MetaStringRef [] growRead (int id ) {
212- MetaStringRef [] tmp = new MetaStringRef [id * 2 ];
213- System .arraycopy (dynamicReadStringIds , 0 , tmp , 0 , dynamicReadStringIds .length );
214- return dynamicReadStringIds = tmp ;
215+ private MetaStringRef [] growRead (MetaStringRef [] current , int id ) {
216+ int newLength = current .length ;
217+ while (newLength <= id ) {
218+ newLength <<= 1 ;
219+ }
220+ MetaStringRef [] expanded = new MetaStringRef [newLength ];
221+ System .arraycopy (current , 0 , expanded , 0 , current .length );
222+ return expanded ;
215223 }
216224
217225 public void reset () {
0 commit comments