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

#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
