Remove "usesMapBufferForStateData" template parameter from ConcreteShadowNode and ConcreteState

Summary:
These internals have leaked pretty far. As we are adding support for JNI reference state wrappers, lets hide this, and make functions for getting MapBuffer work automatically if state data exposes the requisite functions, instead of external users needing to worry about multiple possible `ConcreteState` types for a given state data type.

Changelog: [Internal]

Reviewed By: rshest

Differential Revision: D73158627

fbshipit-source-id: e3ac2a045368d46fab72e2017fc28d680db6a7c0
This commit is contained in:
Nick Gerleman
2025-04-17 14:25:22 -07:00
committed by Facebook GitHub Bot
parent f1f2788410
commit f144b53122
6 changed files with 23 additions and 26 deletions
@@ -29,8 +29,7 @@ class ParagraphShadowNode final : public ConcreteViewShadowNode<
ParagraphComponentName,
ParagraphProps,
ParagraphEventEmitter,
ParagraphState,
/* usesMapBufferForStateData */ true>,
ParagraphState>,
public BaseTextShadowNode {
public:
using ConcreteViewShadowNode::ConcreteViewShadowNode;
@@ -29,22 +29,19 @@ template <
const char* concreteComponentName,
typename ViewPropsT,
typename ViewEventEmitterT,
typename StateDataT,
bool usesMapBufferForStateData = false>
typename StateDataT>
class BaseTextInputShadowNode : public ConcreteViewShadowNode<
concreteComponentName,
ViewPropsT,
ViewEventEmitterT,
StateDataT,
usesMapBufferForStateData>,
StateDataT>,
public BaseTextShadowNode {
public:
using BaseShadowNode = ConcreteViewShadowNode<
concreteComponentName,
ViewPropsT,
ViewEventEmitterT,
StateDataT,
usesMapBufferForStateData>;
StateDataT>;
using BaseShadowNode::ConcreteViewShadowNode;
@@ -22,13 +22,11 @@ extern const char AndroidTextInputComponentName[];
/*
* `ShadowNode` for <AndroidTextInput> component.
*/
class AndroidTextInputShadowNode final
: public ConcreteViewShadowNode<
AndroidTextInputComponentName,
AndroidTextInputProps,
AndroidTextInputEventEmitter,
TextInputState,
/* usesMapBufferForStateData */ true> {
class AndroidTextInputShadowNode final : public ConcreteViewShadowNode<
AndroidTextInputComponentName,
AndroidTextInputProps,
AndroidTextInputEventEmitter,
TextInputState> {
public:
using ConcreteViewShadowNode::ConcreteViewShadowNode;
@@ -27,15 +27,13 @@ template <
const char* concreteComponentName,
typename ViewPropsT = ViewProps,
typename ViewEventEmitterT = ViewEventEmitter,
typename StateDataT = StateData,
bool usesMapBufferForStateData = false>
typename StateDataT = StateData>
class ConcreteViewShadowNode : public ConcreteShadowNode<
concreteComponentName,
YogaLayoutableShadowNode,
ViewPropsT,
ViewEventEmitterT,
StateDataT,
usesMapBufferForStateData> {
StateDataT> {
static_assert(
std::is_base_of<ViewProps, ViewPropsT>::value,
"ViewPropsT must be a descendant of ViewProps");
@@ -52,8 +50,7 @@ class ConcreteViewShadowNode : public ConcreteShadowNode<
YogaLayoutableShadowNode,
ViewPropsT,
ViewEventEmitterT,
StateDataT,
usesMapBufferForStateData>;
StateDataT>;
ConcreteViewShadowNode(
const ShadowNodeFragment& fragment,
@@ -29,8 +29,7 @@ template <
typename BaseShadowNodeT,
typename PropsT,
typename EventEmitterT = EventEmitter,
typename StateDataT = StateData,
bool usesMapBufferForStateData = false>
typename StateDataT = StateData>
class ConcreteShadowNode : public BaseShadowNodeT {
static_assert(
std::is_base_of<ShadowNode, BaseShadowNodeT>::value,
@@ -52,7 +51,7 @@ class ConcreteShadowNode : public BaseShadowNodeT {
using ConcreteEventEmitter = EventEmitterT;
using SharedConcreteEventEmitter = std::shared_ptr<const EventEmitterT>;
using SharedConcreteShadowNode = std::shared_ptr<const ConcreteShadowNode>;
using ConcreteState = ConcreteState<StateDataT, usesMapBufferForStateData>;
using ConcreteState = ConcreteState<StateDataT>;
using ConcreteStateData = StateDataT;
static ComponentName Name() {
@@ -20,13 +20,20 @@
namespace facebook::react {
#ifdef ANDROID
template <typename StateDataT>
concept StateDataWithMapBuffer = requires(StateDataT stateData) {
{ stateData.getMapBuffer() } -> std::same_as<MapBuffer>;
};
#endif
/*
* Concrete and only template implementation of State interface.
* State wraps an arbitrary data type and provides an interface to initiate a
* state update transaction. A data object does not need to be copyable but
* needs to be moveable.
*/
template <typename DataT, bool usesMapBufferForStateData = false>
template <typename DataT>
class ConcreteState : public State {
public:
using Shared = std::shared_ptr<const ConcreteState>;
@@ -106,7 +113,7 @@ class ConcreteState : public State {
}
MapBuffer getMapBuffer() const override {
if constexpr (usesMapBufferForStateData) {
if constexpr (StateDataWithMapBuffer<DataT>) {
return getData().getMapBuffer();
} else {
return MapBufferBuilder::EMPTY();