// WARNING: This file is machine generated by fidlgen.

// fidl_experiment = output_index_json

#pragma once

#include "lib/fidl/cpp/internal/header.h"

namespace test {
namespace escaping {

//
// Domain objects declarations
//

class DocCommentWithQuotes;

/// "pleaseescapethisdocommentproperly"
class DocCommentWithQuotes final {
 public:
  static const fidl_type_t* FidlType;

  uint8_t __reserved = 0u;

  static inline ::std::unique_ptr<DocCommentWithQuotes> New() { return ::std::make_unique<DocCommentWithQuotes>(); }

  void Encode(::fidl::Encoder* _encoder, size_t _offset,
              cpp17::optional<::fidl::HandleInformation> maybe_handle_info = cpp17::nullopt);
  static void Decode(::fidl::Decoder* _decoder, DocCommentWithQuotes* value, size_t _offset);
  zx_status_t Clone(DocCommentWithQuotes* result) const;
};

inline zx_status_t Clone(const ::test::escaping::DocCommentWithQuotes& _value,
                         ::test::escaping::DocCommentWithQuotes* _result) {
  return _value.Clone(_result);
}

using DocCommentWithQuotesPtr = ::std::unique_ptr<DocCommentWithQuotes>;

extern const char* BASIC;

extern const char* NULL_;

extern const char* MAX;

extern const char* SMILE_LITERAL;

extern const char* SMILE_LOWER;

extern const char* SMILE_UPPER;

extern const char* SMILE_LEADING_ZERO;

extern const char* DOLLAR;

extern const char* DOLLAR_BRACE;

}  // namespace escaping
}  // namespace test
namespace fidl {

template <>
struct CodingTraits<::test::escaping::DocCommentWithQuotes>
    : public EncodableCodingTraits<::test::escaping::DocCommentWithQuotes, 1> {};

template <>
struct IsMemcpyCompatible<::test::escaping::DocCommentWithQuotes> : public internal::BoolConstant<
                                                                        !HasPadding<::test::escaping::DocCommentWithQuotes>::value && IsMemcpyCompatible<uint8_t>::value> {};

inline zx_status_t Clone(const ::test::escaping::DocCommentWithQuotes& value,
                         ::test::escaping::DocCommentWithQuotes* result) {
  return ::test::escaping::Clone(value, result);
}

template <>
struct Equality<::test::escaping::DocCommentWithQuotes> {
  bool operator()(const ::test::escaping::DocCommentWithQuotes& _lhs, const ::test::escaping::DocCommentWithQuotes& _rhs) const {
    if (!::fidl::Equals(_lhs.__reserved, _rhs.__reserved)) {
      return false;
    }
    return true;
  }
};

//
// Proxies and stubs declarations
//
}  // namespace fidl
