/* * Copyright (c) Facebook, Inc. and its affiliates. * * 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 #include #include #include #include #include #include #include namespace facebook { namespace react { /* * Specialized (to a particular type of Props) parser that provides the most * efficient access to `RawProps` content. */ class RawPropsParser final { public: /* * Default constructor. * To be used by `ConcreteComponentDescriptor` only. */ RawPropsParser() = default; /* * To be used by `ConcreteComponentDescriptor` only. */ template void prepare() noexcept { static_assert( std::is_base_of::value, "PropsT must be a descendant of Props"); RawProps emptyRawProps{}; // Create a stub parser context. // Since this prepares the parser by passing in // empty props, no prop parsers should actually reference the // ContextContainer or SurfaceId here. ContextContainer contextContainer{}; PropsParserContext parserContext{-1, contextContainer}; emptyRawProps.parse(*this, parserContext); PropsT(parserContext, {}, emptyRawProps); postPrepare(); } private: friend class ComponentDescriptor; template friend class ConcreteComponentDescriptor; friend class RawProps; /* * To be used by `RawProps` only. */ void preparse(RawProps const &rawProps) const noexcept; /* * Non-generic part of `prepare`. */ void postPrepare() noexcept; /* * To be used by `RawProps` only. */ RawValue const *at(RawProps const &rawProps, RawPropsKey const &key) const noexcept; mutable better::small_vector keys_{}; mutable RawPropsKeyMap nameToIndex_{}; mutable int size_{0}; mutable bool ready_{false}; }; } // namespace react } // namespace facebook