From 6b0960cbdbb3b6517e4b4f2d65f6c3bd2f5d6545 Mon Sep 17 00:00:00 2001 From: Valentin Shergin Date: Sun, 18 Mar 2018 19:04:23 -0700 Subject: [PATCH] Introducing `ConcreteShadowNode` Summary: ConcreteShadowNode defines a template which connects typed Props and typed ShadowNode. Reviewed By: fkgozali Differential Revision: D7230667 fbshipit-source-id: be28314d6846d69960e921da852f01232951f965 --- .../core/shadownode/ConcreteShadowNode.h | 86 +++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 ReactCommon/fabric/core/shadownode/ConcreteShadowNode.h diff --git a/ReactCommon/fabric/core/shadownode/ConcreteShadowNode.h b/ReactCommon/fabric/core/shadownode/ConcreteShadowNode.h new file mode 100644 index 0000000000..c9f2741762 --- /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