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

#pragma once

#include <middle/cpp/fidl.h>

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

//
// Domain objects declarations (i.e. "natural types" in unified bindings).
//
namespace fidl {
namespace test {
namespace transitivedependencies {
class Baz;

class Baz final {
 public:
  static const fidl_type_t* FidlType;

  ::middle::Bar g{};

  static inline ::std::unique_ptr<Baz> New() {
    return ::std::make_unique<Baz>();
  }

  void Encode(::fidl::Encoder* _encoder, size_t _offset,
              cpp17::optional<::fidl::HandleInformation> maybe_handle_info =
                  cpp17::nullopt);
  static void Decode(::fidl::Decoder* _decoder, Baz* value, size_t _offset);
  zx_status_t Clone(Baz* result) const;
};

inline zx_status_t Clone(
    const ::fidl::test::transitivedependencies::Baz& _value,
    ::fidl::test::transitivedependencies::Baz* _result) {
  return _value.Clone(_result);
}

using BazPtr = ::std::unique_ptr<Baz>;

}  // namespace transitivedependencies
}  // namespace test
template <>
struct CodingTraits<::fidl::test::transitivedependencies::Baz>
    : public EncodableCodingTraits<::fidl::test::transitivedependencies::Baz,
                                   4> {};

template <>
struct IsMemcpyCompatible<::fidl::test::transitivedependencies::Baz>
    : public internal::BoolConstant<
          !HasPadding<::fidl::test::transitivedependencies::Baz>::value &&
          IsMemcpyCompatible<::middle::Bar>::value> {};

inline zx_status_t Clone(const ::fidl::test::transitivedependencies::Baz& value,
                         ::fidl::test::transitivedependencies::Baz* result) {
  return ::fidl::test::transitivedependencies::Clone(value, result);
}

template <>
struct Equality<::fidl::test::transitivedependencies::Baz> {
  bool operator()(const ::fidl::test::transitivedependencies::Baz& _lhs,
                  const ::fidl::test::transitivedependencies::Baz& _rhs) const {
    if (!::fidl::Equals(_lhs.g, _rhs.g)) {
      return false;
    }
    return true;
  }
};

//
// Proxies and stubs declarations
//
}  // namespace fidl
