text: /*
   * 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 <functional>
  #include <limits>
  
  #include <better/optional.h>
  #include <folly/Hash.h>
  #include <react/renderer/attributedstring/primitives.h>
  #include <react/renderer/core/LayoutPrimitives.h>
  #include <react/renderer/core/ReactPrimitives.h>
  #include <react/renderer/debug/DebugStringConvertible.h>
  #include <react/renderer/graphics/Color.h>
  #include <react/renderer/graphics/Geometry.h>
  
  namespace facebook {
  namespace react {
  
  class TextAttributes;
  
  using SharedTextAttributes = std::shared_ptr<const TextAttributes>;
  
  class TextAttributes : public DebugStringConvertible {
   public:
    /*
     * Returns TextAttribute object which has actual default attribute values
     * (e.g. `foregroundColor = black`), in oppose to TextAttribute's default
     * constructor which creates an object with nulled attributes.
     */
    static TextAttributes defaultTextAttributes();
  
  #pragma mark - Fields
  
    // Color
    SharedColor foregroundColor{};
    SharedColor backgroundColor{};
    Float opacity{std::numeric_limits<Float>::quiet_NaN()};
  
    // Font
    std::string fontFamily{""};
    Float fontSize{std::numeric_limits<Float>::quiet_NaN()};
    Float fontSizeMultiplier{std::numeric_limits<Float>::quiet_NaN()};
    better::optional<FontWeight> fontWeight{};
    better::optional<FontStyle> fontStyle{};
    better::optional<FontVariant> fontVariant{};
    better::optional<bool> allowFontScaling{};
    Float letterSpacing{std::numeric_limits<Float>::quiet_NaN()};
    better::optional<TextTransform> textTransform{};
  
    // Paragraph Styles
    Float lineHeight{std::numeric_limits<Float>::quiet_NaN()};
    better::optional<TextAlignment> alignment{};
    better::optional<WritingDirection> baseWritingDirection{};
  
    // Decoration
    SharedColor textDecorationColor{};
    better::optional<TextDecorationLineType> textDecorationLineType{};
    better::optional<TextDecorationLineStyle> textDecorationLineStyle{};
    better::optional<TextDecorationLinePattern> textDecorationLinePattern{};
  
    // Shadow
    // TODO: Use `Point` type instead of `Size` for `textShadowOffset` attribute.
    better::optional<Size> textShadowOffset{};
    Float textShadowRadius{std::numeric_limits<Float>::quiet_NaN()};
    SharedColor textShadowColor{};
  
    // Special
    better::optional<bool> isHighlighted{};
  
    // TODO T59221129: document where this value comes from and how it is set.
    // It's not clear if this is being used properly, or if it's being set at all.
    // Currently, it is intentionally *not* being set as part of BaseTextProps
    // construction.
    better::optional<LayoutDirection> layoutDirection{};
    better::optional<AccessibilityRole> accessibilityRole{};
  
  #pragma mark - Operations
  
    void apply(TextAttributes textAttributes);
  
  #pragma mark - Operators
  
    bool operator==(const TextAttributes &rhs) const;
    bool operator!=(const TextAttributes &rhs) const;
  
  #pragma mark - DebugStringConvertible
  
  #if RN_DEBUG_STRING_CONVERTIBLE
    SharedDebugStringConvertibleList getDebugProps() const override;
  #endif
  };
  
  } // namespace react
  } // namespace facebook
  
  namespace std {
  
  template <>
  struct hash<facebook::react::TextAttributes> {
    size_t operator()(
        const facebook::react::TextAttributes &textAttributes) const {
      return folly::hash::hash_combine(
          0,
          textAttributes.foregroundColor,
          textAttributes.backgroundColor,
          textAttributes.opacity,
          textAttributes.fontFamily,
          textAttributes.fontSize,
          textAttributes.fontSizeMultiplier,
          textAttributes.fontWeight,
          textAttributes.fontStyle,
          textAttributes.fontVariant,
          textAttributes.allowFontScaling,
          textAttributes.letterSpacing,
          textAttributes.textTransform,
          textAttributes.lineHeight,
          textAttributes.alignment,
          textAttributes.baseWritingDirection,
          textAttributes.textDecorationColor,
          textAttributes.textDecorationLineType,
          textAttributes.textDecorationLineStyle,
          textAttributes.textDecorationLinePattern,
          textAttributes.textShadowOffset,
          textAttributes.textShadowRadius,
          textAttributes.textShadowColor,
          textAttributes.isHighlighted,
          textAttributes.layoutDirection,
          textAttributes.accessibilityRole);
    }
  };
  } // namespace std
  