diff --git a/ReactCommon/fabric/core/shadownode/ConcreteShadowNode.h b/ReactCommon/fabric/core/shadownode/ConcreteShadowNode.h new file mode 100644 index 00000000000..c9f2741762c --- /dev/null +++ b/ReactCommon/fabric/core/shadownode/ConcreteShadowNode.h @@ -0,0 +1,86 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#pragma once + +#include +#include + +namespace facebook { +namespace react { + +/* + * Base templace class for all `ShadowNode`s which connects exact `ShadowNode` + * type with exact `Props` type. + * `ConcreteShadowNode` is a default implementation of `ShadowNode` interface + * with many handy features. + */ +template +class ConcreteShadowNode: public ShadowNode { + static_assert(std::is_base_of::value, "PropsT must be a descendant of Props"); + +public: + using ConcreteProps = PropsT; + using SharedConcreteProps = std::shared_ptr; + using SharedConcreteShadowNode = std::shared_ptr; + + static const SharedConcreteProps Props(const RawProps &rawProps, const SharedProps &baseProps = nullptr) { + if (!baseProps) { + auto props = std::make_shared(); + props->apply(rawProps); + return props; + } + + auto concreteBaseProps = std::dynamic_pointer_cast(baseProps); + auto props = std::make_shared(*concreteBaseProps); + props->apply(rawProps); + return props; + } + + static const SharedConcreteProps defaultSharedProps() { + static const SharedConcreteProps defaultSharedProps = std::make_shared(); + return defaultSharedProps; + } + + ConcreteShadowNode( + const Tag &tag, + const Tag &rootTag, + const InstanceHandle &instanceHandle, + const SharedConcreteProps &props = ConcreteShadowNode::defaultSharedProps(), + const SharedShadowNodeSharedList &children = ShadowNode::emptySharedShadowNodeSharedList() + ): + ShadowNode( + tag, + rootTag, + instanceHandle, + (SharedProps)props, + children + ) {}; + + ConcreteShadowNode( + const SharedConcreteShadowNode &shadowNode, + const SharedProps &props = nullptr, + const SharedShadowNodeSharedList &children = nullptr + ): + ShadowNode( + shadowNode, + (SharedProps)props, + children + ) {} + + virtual ComponentHandle getComponentHandle() const { + return typeid(*this).hash_code(); + } + + const SharedConcreteProps &getProps() const { + return std::static_pointer_cast(props_); + } + +}; + +} // namespace react +} // namespace facebook