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

// fidl_experiment = output_index_json

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

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

//
// Domain objects definitions
//
namespace test {
namespace structdefaultvalueenumlibraryreference {

extern "C" const fidl_type_t test_structdefaultvalueenumlibraryreference_FooTable;
const fidl_type_t* Foo::FidlType = &test_structdefaultvalueenumlibraryreference_FooTable;

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

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

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

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