// 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 importedconstvalues {

//
// Domain objects declarations
//

class MyStruct;

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

  uint8_t __reserved = 0u;

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

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

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

using MyStructPtr = ::std::unique_ptr<MyStruct>;

constexpr ::test::dependent::MyBits BITS_MEMBER = ::test::dependent::MyBits::MEMBER;

constexpr ::test::dependent::MyEnum ENUM_MEMBER = ::test::dependent::MyEnum::MEMBER;

}  // namespace importedconstvalues
}  // namespace test
namespace fidl {

template <>
struct CodingTraits<::test::importedconstvalues::MyStruct>
    : public EncodableCodingTraits<::test::importedconstvalues::MyStruct, 1> {};

template <>
struct IsMemcpyCompatible<::test::importedconstvalues::MyStruct> : public internal::BoolConstant<
                                                                       !HasPadding<::test::importedconstvalues::MyStruct>::value && IsMemcpyCompatible<uint8_t>::value> {};

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

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

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