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

// fidl_experiment = output_index_json

#pragma once

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

#include "lib/fidl/cpp/internal/header.h"
namespace test {
namespace structdefaultvalueenumlibraryreference {

//
// Domain objects declarations
//

class Foo;

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

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

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

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

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

using FooPtr = ::std::unique_ptr<Foo>;

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

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

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

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

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

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