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

#pragma once

#include <dependent/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 structdefaultvalueenumlibraryreference {

class Foo;

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

  ::dependent::MyEnum field = ::dependent::MyEnum::A;

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

  void Encode(::fidl::Encoder* _encoder, size_t _offset);
  static void Decode(::fidl::Decoder* _decoder, Foo* value, size_t _offset);
  zx_status_t Clone(Foo* result) const;
};

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

using FooPtr = ::std::unique_ptr<Foo>;
}  // namespace structdefaultvalueenumlibraryreference
}  // namespace test
}  // namespace fidl
namespace fidl {

template <>
struct CodingTraits<::fidl::test::structdefaultvalueenumlibraryreference::Foo>
    : public EncodableCodingTraits<
          ::fidl::test::structdefaultvalueenumlibraryreference::Foo, 4> {};

template <>
struct IsMemcpyCompatible<
    ::fidl::test::structdefaultvalueenumlibraryreference::Foo>
    : public internal::BoolConstant<
          !HasPadding<::fidl::test::structdefaultvalueenumlibraryreference::
                          Foo>::value &&
          IsMemcpyCompatible<::dependent::MyEnum>::value> {};

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

template <>
struct Equality<::fidl::test::structdefaultvalueenumlibraryreference::Foo> {
  bool operator()(
      const ::fidl::test::structdefaultvalueenumlibraryreference::Foo& _lhs,
      const ::fidl::test::structdefaultvalueenumlibraryreference::Foo& _rhs)
      const {
    if (!::fidl::Equals(_lhs.field, _rhs.field)) {
      return false;
    }
    return true;
  }
};
}  // namespace fidl

//
// Proxies and stubs declarations
//
namespace fidl {
namespace test {
namespace structdefaultvalueenumlibraryreference {

}  // namespace structdefaultvalueenumlibraryreference
}  // namespace test
}  // namespace fidl
