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

// fidl_experiment = output_index_json

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

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

//
// Domain objects definitions
//
namespace test {
namespace importedconstvalues {

extern "C" const fidl_type_t test_importedconstvalues_MyStructTable;
const fidl_type_t* MyStruct::FidlType = &test_importedconstvalues_MyStructTable;

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

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

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

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