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

// fidl_experiment = output_index_json

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

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

//
// Domain objects definitions
//
namespace test {
namespace transitivedependencies {

extern "C" const fidl_type_t test_transitivedependencies_BazTable;
const fidl_type_t* Baz::FidlType = &test_transitivedependencies_BazTable;

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

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

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

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