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

// fidl_experiment = output_index_json

#pragma once

#include <lib/fidl/cpp/wire/array.h>
#include <lib/fidl/cpp/wire/envelope.h>
#include <lib/fidl/cpp/wire/internal/framework_err.h>
#include <lib/fidl/cpp/wire/message.h>
#include <lib/fidl/cpp/wire/message_storage.h>
#include <lib/fidl/cpp/wire/object_view.h>
#include <lib/fidl/cpp/wire/string_view.h>
#include <lib/fidl/cpp/wire/traits.h>
#include <lib/fidl/cpp/wire/wire_types.h>
#include <lib/stdcompat/optional.h>

#include <cinttypes>
#ifdef __Fuchsia__

#endif  // __Fuchsia__

#include <fidl/test.bitsconstants/cpp/common_types.h>
#include <fidl/test.bitsconstants/cpp/markers.h>

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wshadow"

namespace test_bitsconstants {

namespace wire {
using BitsType = ::test_bitsconstants::BitsType;

constexpr ::test_bitsconstants::wire::BitsType kConst0 = static_cast<::test_bitsconstants::wire::BitsType>(0u);

constexpr ::test_bitsconstants::wire::BitsType kConst1 = ::test_bitsconstants::wire::BitsType::kA;

constexpr ::test_bitsconstants::wire::BitsType kConst2 = static_cast<::test_bitsconstants::wire::BitsType>(129);

constexpr ::test_bitsconstants::wire::BitsType kConst3 = static_cast<::test_bitsconstants::wire::BitsType>(131);

}  // namespace wire
}  // namespace test_bitsconstants
namespace fidl {

template <bool IsRecursive>
struct internal::WireCodingTraits<::test_bitsconstants::wire::BitsType, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive> {
  static constexpr size_t kInlineSize = sizeof(uint32_t);
  static constexpr bool kIsMemcpyCompatible = false;

  static void Encode(internal::WireEncoder* encoder, ::test_bitsconstants::wire::BitsType* value, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    if (unlikely(static_cast<uint32_t>(*value) & ~131ull)) {
      encoder->SetError(::fidl::internal::kCodingErrorUnknownBitSetInBitsValue);
    }
    *position.As<::test_bitsconstants::wire::BitsType>() = *value;
  }
  static void Decode(internal::WireDecoder* decoder, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    ::test_bitsconstants::wire::BitsType value = *position.As<::test_bitsconstants::wire::BitsType>();
    if (unlikely(static_cast<uint32_t>(value) & ~131ull)) {
      decoder->SetError(::fidl::internal::kCodingErrorUnknownBitSetInBitsValue);
    }
  }
};

#pragma clang diagnostic pop

}  // namespace fidl
