Files
react-native/ReactCommon/react/renderer/core/State.h
T
Samuel SuslaandFacebook GitHub Bot 5fa6c5a941 Enable modernize-pass-by-value clang tidy rule
Summary:
changelog: [internal]

You can read more about this rule on https://clang.llvm.org/extra/clang-tidy/checks/modernize-pass-by-value.html

# Isn't it wasteful to copy? Isn't reference more efficient?

This rule of thumb is no longer true since C++11 with move semantics. Let's look at some examples.

# Option one

```
class TextHolder
{
public:
   TextBox(std::string const &text) : text_(text) {}
private:
   std::string text_;
};
```

By using reference here, we prevent the caller from using rvalue to and avoiding copy. Regardless of what the caller passes in, copy always happens.

# Option two

```
class TextHolder
{
public:
   TextBox(std::string const &text) : text_(text) {}
   TextBox(std::string &&text) : text_(std::move(text)) {}
private:
   std::string text_;
};
```
Here, we provide two constructors, one for const reference and one for rvalue reference. This gives the caller option to avoid copy. But now we have two constructors, which is not ideal.

# Option three (what we do in this diff)

```
class TextHolder
{
public:
   TextBox(std::string text) : text_(std::move(text)) {}
private:
   std::string text_;
};
```
Here, the caller has option to avoid copy and we only have single constructor.

Reviewed By: fkgozali, JoshuaGross

Differential Revision: D33276841

fbshipit-source-id: 619d5123d2e28937b22874650366629f24f20a63
2021-12-23 07:53:48 -08:00

115 lines
3.0 KiB
C++
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
* 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
#ifdef ANDROID
#include <folly/dynamic.h>
#include <react/renderer/mapbuffer/MapBuffer.h>
#include <react/renderer/mapbuffer/MapBufferBuilder.h>
#endif
#include <react/renderer/core/ShadowNodeFamily.h>
namespace facebook {
namespace react {
/*
* An abstract interface of State.
* State is used to control and continuously advance a single vision of some
* state (arbitrary data) associated with a family of shadow nodes.
*/
class State {
public:
using Shared = std::shared_ptr<const State>;
static size_t constexpr initialRevisionValue = 1;
protected:
/*
* Constructors are protected to make calling them directly with
* type-erasured arguments impossible.
*/
explicit State(StateData::Shared data, State const &state);
explicit State(
StateData::Shared data,
ShadowNodeFamily::Shared const &family);
public:
virtual ~State() = default;
/*
  * Returns a momentary value of the most recently committed state
  * associated with a family of nodes which this state belongs to.
  * Sequential calls might return different values.
*/
State::Shared getMostRecentState() const;
/*
* Returns the most recent state (same as `getMostRecentState()` method)
* if this state is obsolete, otherwise returns `nullptr`.
*/
State::Shared getMostRecentStateIfObsolete() const;
/*
* Returns a revision number of the `State` object.
* The number is being automatically assigned during the creation of `State`
* objects.
* Revision `0` represents a case when we don't have any info about state
* object (actual State instances cannot have it).
* Revision `1` represents a newly created initial state object.
*/
size_t getRevision() const;
#ifdef ANDROID
virtual folly::dynamic getDynamic() const = 0;
virtual MapBuffer getMapBuffer() const = 0;
virtual void updateState(folly::dynamic data) const = 0;
#endif
protected:
friend class ShadowNodeFamily;
friend class UIManager;
/*
* Returns a shared pointer to data.
* To be used by `UIManager` only.
*/
StateData::Shared const &getDataPointer() const {
return data_;
}
/*
* A family of a node with this state is associated.
* Must be a weak pointer to avoid retain cycle among `State`, `ShadowNode`,
* and `ShadowNodeFamily` instances.
*/
ShadowNodeFamily::Weak family_;
/*
* Type-erasured pointer to arbitrary component-specific data held by the
* `State`.
*/
StateData::Shared data_;
/*
* Indicates that the state was committed once and then was replaced by a
* newer one.
* To be used by `StateCoordinator` only.
* Protected by mutex inside `StateCoordinator`.
*/
mutable bool isObsolete_{false};
/*
* Revision of the State object.
*/
size_t revision_;
};
} // namespace react
} // namespace facebook