Adapt ReadableMapBuffer to MapBuffer interface

Summary:
Updates `ReadableMapBuffer` to conform to `MapBuffer` interface, to allow interchangeable use of `Readable/WritableMapBuffer` in the code.

Notable changes:
- MapBuffer.Entry getters are now represented as Kotlin properties and appended `Value` suffix (e.g. `entry.getInt()` becomes `entry.getIntValue()` in Java, or `entry.intValue` in Kotlin)
- `ByteBuffer` is imported in constructor instead of on demand. This method doesn't copy the data as the bytes are read directly from native heap, and benchmarking a 500-byte `MapBuffer` shows no difference in import speed.
- Internal logic of `ReadableMapBuffer` uses `UShort` kotlin type for key retrieval, for more correct representation of values.
- Explicit exception throws are replaced with `require` and `check` methods for `IllegalArgumentException` and `IllegalStateException` (default FB conversion).

The change also updates `ReadableMapBuffer` usages to `MapBuffer` interface where possible (virtually everywhere except JNI methods).

Changelog: [Android][Changed] - Adopt `MapBuffer` interface for `ReadableMapBuffer`

Reviewed By: mdvacca

Differential Revision: D35218633

fbshipit-source-id: 515dd974c27b2978ade325b2e1750ab8f068a20a
This commit is contained in:
Andrei Shikov authored and Facebook GitHub Bot committed 2022-03-30 20:27:23 -07:00
1 parent cf6f3b680b
commit 81e4249315
14 files changed
+460 -589

No files matched your search

@@ -15,7 +15,7 @@ import com.facebook.react.bridge.BaseJavaModule;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReadableArray;
import com.facebook.react.bridge.ReadableMap;
import com.facebook.react.common.mapbuffer.ReadableMapBuffer;
import com.facebook.react.common.mapbuffer.MapBuffer;
import com.facebook.react.touch.JSResponderHandler;
import com.facebook.react.touch.ReactInterceptingViewGroup;
import com.facebook.react.uimanager.annotations.ReactProp;
@@ -333,9 +333,9 @@ public abstract class ViewManager<T extends View, C extends ReactShadowNode>
* ViewManager
*
* @param context {@link com.facebook.react.bridge.ReactContext} used for the view.
* @param localData {@link ReadableMapBuffer} containing "local data" defined in C++
* @param props {@link ReadableMapBuffer} containing JS props
* @param state {@link ReadableMapBuffer} containing state defined in C++
* @param localData {@link MapBuffer} containing "local data" defined in C++
* @param props {@link MapBuffer} containing JS props
* @param state {@link MapBuffer} containing state defined in C++
* @param width width of the view (usually zero)
* @param widthMode widthMode used during calculation of layout
* @param height height of the view (usually zero)
@@ -353,10 +353,10 @@ public abstract class ViewManager<T extends View, C extends ReactShadowNode>
*/
public long measure(
Context context,
ReadableMapBuffer localData,
ReadableMapBuffer props,
MapBuffer localData,
MapBuffer props,
// TODO(T114731225): review whether state parameter is needed
@Nullable ReadableMapBuffer state,
@Nullable MapBuffer state,
float width,
YogaMeasureMode widthMode,
float height,