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

// fidl_experiment = output_index_json

#include <test/escaping/cpp/fidl.h>

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

//
// Domain objects definitions
//
namespace test {
namespace escaping {

extern "C" const fidl_type_t test_escaping_DocCommentWithQuotesTable;
const fidl_type_t* DocCommentWithQuotes::FidlType = &test_escaping_DocCommentWithQuotesTable;

void DocCommentWithQuotes::Encode(::fidl::Encoder* _encoder, size_t _offset,
                                  cpp17::optional<::fidl::HandleInformation> maybe_handle_info) {
  if (::fidl::IsMemcpyCompatible<DocCommentWithQuotes>::value) {
    memcpy(_encoder->template GetPtr<DocCommentWithQuotes>(_offset), this, sizeof(DocCommentWithQuotes));
  } else {
    ::fidl::Encode(_encoder, &__reserved, _offset + 0);
  }
}

void DocCommentWithQuotes::Decode(::fidl::Decoder* _decoder, DocCommentWithQuotes* _value, size_t _offset) {
  if (::fidl::IsMemcpyCompatible<DocCommentWithQuotes>::value) {
    memcpy(_value, _decoder->template GetPtr<DocCommentWithQuotes>(_offset), sizeof(DocCommentWithQuotes));
  } else {
    ::fidl::Decode(_decoder, &_value->__reserved, _offset + 0);
  }
}

zx_status_t DocCommentWithQuotes::Clone(DocCommentWithQuotes* _result) const {
  zx_status_t _status = ::fidl::Clone(__reserved, &_result->__reserved);
  if (_status != ZX_OK)
    return _status;
  return ZX_OK;
}

const char* BASIC = "'\"\\\n\r\t";

const char* NULL_ = "\x00";

const char* MAX = "\U0010ffff";

const char* SMILE_LITERAL = "😀";

const char* SMILE_LOWER = "😀";

const char* SMILE_UPPER = "😀";

const char* SMILE_LEADING_ZERO = "😀";

const char* DOLLAR = "$";

const char* DOLLAR_BRACE = "${";

//
// Proxies and stubs definitions
//
}  // namespace escaping
}  // namespace test
