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

#pragma once

#include <lib/fidl/llcpp/array.h>
#include <lib/fidl/llcpp/coding.h>
#include <lib/fidl/llcpp/envelope.h>
#include <lib/fidl/llcpp/message.h>
#include <lib/fidl/llcpp/message_storage.h>
#include <lib/fidl/llcpp/object_view.h>
#include <lib/fidl/llcpp/string_view.h>
#include <lib/fidl/llcpp/traits.h>
#include <lib/fidl/llcpp/wire_types.h>
#include <lib/stdcompat/optional.h>

#include <cinttypes>
#ifdef __Fuchsia__
#include <lib/zx/channel.h>

#endif  // __Fuchsia__

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

namespace test_doccomments {
namespace wire {
using MyStrictBits = ::test_doccomments::MyStrictBits;
using MyFlexibleBits = ::test_doccomments::MyFlexibleBits;

using MyStrictEnum = ::test_doccomments::MyStrictEnum;
using MyFlexibleEnum = ::test_doccomments::MyFlexibleEnum;

struct Struct;

class Table;

class StrictUnion;

class FlexibleUnion;

extern "C" const fidl_type_t test_doccomments_StructTable;

/// struct comment #1
///
/// struct comment #3
struct Struct {
  /// struct member comment #1
  ///
  /// struct member comment #3
  int32_t field = {};
};

}  // namespace wire
}  // namespace test_doccomments
template <>
class ::fidl::WireTableBuilder<::test_doccomments::wire::Table>;
template <>
class ::fidl::WireTableExternalBuilder<::test_doccomments::wire::Table>;

template <>
struct ::fidl::WireTableFrame<::test_doccomments::wire::Table> final {
 public:
  WireTableFrame() = default;
  // In its intended usage, WireTableFrame will be referenced by an ObjectView.
  // If the ObjectView is assigned before a move or copy, then it will reference
  // the old invalid object. Because this is unsafe, copies are disallowed and
  // moves are only allowed by friend classes that operate safely.
  WireTableFrame(const WireTableFrame&) = delete;
  WireTableFrame& operator=(const WireTableFrame&) = delete;

 private:
  WireTableFrame(WireTableFrame&&) noexcept = default;
  WireTableFrame& operator=(WireTableFrame&&) noexcept = default;

  bool HasUnknownData() const;
  ::fidl::Envelope<int32_t> field_;

  friend class ::test_doccomments::wire::Table;
  friend ::fidl::internal::WireTableBaseBuilder<
      ::test_doccomments::wire::Table,
      ::fidl::WireTableBuilder<::test_doccomments::wire::Table>>;
  friend ::fidl::internal::WireTableBaseBuilder<
      ::test_doccomments::wire::Table,
      ::fidl::WireTableExternalBuilder<::test_doccomments::wire::Table>>;
};

namespace test_doccomments {
namespace wire {
extern "C" const fidl_type_t test_doccomments_TableTable;

/// table comment #1
///
/// table comment #3
class Table {
 public:
  Table() = default;
  Table(const Table& other) noexcept = default;
  Table& operator=(const Table& other) noexcept = default;
  Table(Table&& other) noexcept = default;
  Table& operator=(Table&& other) noexcept = default;

  ~Table() = default;

  // Returns whether no field is set.
  bool IsEmpty() const { return max_ordinal_ == 0; }

  // Returns whether the table references unknown fields.
  bool HasUnknownData() const;

  // Return a builder that by defaults allocates of an arena.
  static ::fidl::WireTableBuilder<::test_doccomments::wire::Table> Builder(
      ::fidl::AnyArena& arena);

  // Return a builder that relies on explicitly allocating |fidl::ObjectView|s.
  static ::fidl::WireTableExternalBuilder<::test_doccomments::wire::Table>
  ExternalBuilder(::fidl::ObjectView<
                  ::fidl::WireTableFrame<::test_doccomments::wire::Table>>
                      frame);

  /// table field comment #1
  ///
  /// table field comment #3
  const int32_t& field() const {
    ZX_ASSERT(has_Field());
    return frame_ptr_->field_.get_data();
  }
  int32_t& field() {
    ZX_ASSERT(has_Field());
    return frame_ptr_->field_.get_data();
  }
  bool has_Field() const {
    return max_ordinal_ >= 1 && frame_ptr_->field_.has_data();
  }
#if defined(FIDL_WIRE_ALLOW_DEPRECATED_MUTABLE_TABLES) || false
 public:
#else   // !defined(FIDL_WIRE_ALLOW_DEPRECATED_MUTABLE_TABLES)
 private:
#endif  // FIDL_WIRE_ALLOW_DEPRECATED_MUTABLE_TABLES

  Table& set_field(int32_t elem) {
    ZX_DEBUG_ASSERT(frame_ptr_ != nullptr);
    frame_ptr_->field_.set_data(std::move(elem));
    max_ordinal_ = std::max(max_ordinal_, static_cast<uint64_t>(1));
    return *this;
  }

  Table& clear_field() {
    ZX_DEBUG_ASSERT(frame_ptr_ != nullptr);
    frame_ptr_->field_.clear_data();
    return *this;
  }

  explicit Table(::fidl::AnyArena& allocator)
      : frame_ptr_(::fidl::ObjectView<
                   ::fidl::WireTableFrame<::test_doccomments::wire::Table>>(
            allocator)) {}
  // This constructor allows a user controlled allocation (not using a Arena).
  // It should only be used when performance is key.
  // As soon as the frame is given to the table, it must not be used directly or
  // for another table.
  explicit Table(
      ::fidl::ObjectView<
          ::fidl::WireTableFrame<::test_doccomments::wire::Table>>&& frame)
      : frame_ptr_(std::move(frame)) {}

  void Allocate(::fidl::AnyArena& allocator) {
    max_ordinal_ = 0;
    frame_ptr_ = ::fidl::ObjectView<
        ::fidl::WireTableFrame<::test_doccomments::wire::Table>>(allocator);
  }
  void
  Init(::fidl::ObjectView<
       ::fidl::WireTableFrame<::test_doccomments::wire::Table>>&& frame_ptr) {
    max_ordinal_ = 0;
    frame_ptr_ = std::move(frame_ptr);
  }

 private:
  friend ::fidl::internal::WireTableBaseBuilder<
      ::test_doccomments::wire::Table,
      ::fidl::WireTableBuilder<::test_doccomments::wire::Table>>;
  friend ::fidl::internal::WireTableBaseBuilder<
      ::test_doccomments::wire::Table,
      ::fidl::WireTableExternalBuilder<::test_doccomments::wire::Table>>;

  uint64_t max_ordinal_ = 0;
  ::fidl::ObjectView<::fidl::WireTableFrame<::test_doccomments::wire::Table>>
      frame_ptr_;
};
}  // namespace wire
}  // namespace test_doccomments
template <typename BuilderImpl>
class ::fidl::internal::WireTableBaseBuilder<::test_doccomments::wire::Table,
                                             BuilderImpl> {
 public:
  // Build and return the table. The builder should not be used after this.
  ::test_doccomments::wire::Table Build() {
    ZX_DEBUG_ASSERT(table_.frame_ptr_ != nullptr);
    ::test_doccomments::wire::Table t = std::move(table_);
    // Poison this builder to prevent accidental reuse.
    table_.frame_ptr_ = nullptr;
    return t;
  }

  /// table field comment #1
  ///
  /// table field comment #3
  BuilderImpl& field(int32_t elem) {
    ZX_DEBUG_ASSERT(table_.frame_ptr_ != nullptr);
    table_.frame_ptr_->field_.set_data(std::move(elem));
    table_.max_ordinal_ =
        std::max(table_.max_ordinal_, static_cast<uint64_t>(1));
    return *static_cast<BuilderImpl*>(this);
  }

 protected:
  WireTableBaseBuilder(
      ::fidl::ObjectView<
          ::fidl::WireTableFrame<::test_doccomments::wire::Table>>&& frame)
      : table_(std::move(frame)) {}

 private:
  ::test_doccomments::wire::Table table_;
};

template <>
class ::fidl::WireTableBuilder<::test_doccomments::wire::Table> final
    : public ::fidl::internal::WireTableBaseBuilder<
          ::test_doccomments::wire::Table,
          ::fidl::WireTableBuilder<::test_doccomments::wire::Table>> {
  using Base = ::fidl::internal::WireTableBaseBuilder<
      ::test_doccomments::wire::Table,
      ::fidl::WireTableBuilder<::test_doccomments::wire::Table>>;

 public:
 private:
  friend class ::test_doccomments::wire::Table;
  WireTableBuilder(::fidl::AnyArena& arena)
      : Base(::fidl::ObjectView<
             ::fidl::WireTableFrame<::test_doccomments::wire::Table>>(arena)),
        arena_(arena) {}

  [[maybe_unused]] std::reference_wrapper<::fidl::AnyArena> arena_;
};

template <>
class ::fidl::WireTableExternalBuilder<::test_doccomments::wire::Table> final
    : public ::fidl::internal::WireTableBaseBuilder<
          ::test_doccomments::wire::Table,
          ::fidl::WireTableExternalBuilder<::test_doccomments::wire::Table>> {
  using Base = ::fidl::internal::WireTableBaseBuilder<
      ::test_doccomments::wire::Table,
      ::fidl::WireTableExternalBuilder<::test_doccomments::wire::Table>>;

 private:
  friend class ::test_doccomments::wire::Table;
  using Base::Base;
  WireTableExternalBuilder(
      ::fidl::WireTableFrame<::test_doccomments::wire::Table>* frame)
      : Base(::fidl::ObjectView<::fidl::WireTableFrame<
                 ::test_doccomments::wire::Table>>::FromExternal(frame)) {}
};
namespace test_doccomments {
namespace wire {
inline ::fidl::WireTableBuilder<::test_doccomments::wire::Table> Table::Builder(
    ::fidl::AnyArena& arena) {
  return ::fidl::WireTableBuilder<::test_doccomments::wire::Table>(arena);
}
inline ::fidl::WireTableExternalBuilder<::test_doccomments::wire::Table>
Table::ExternalBuilder(
    ::fidl::ObjectView<::fidl::WireTableFrame<::test_doccomments::wire::Table>>
        frame) {
  return ::fidl::WireTableExternalBuilder<::test_doccomments::wire::Table>(
      std::move(frame));
}

extern "C" const fidl_type_t test_doccomments_StrictUnionTable;

/// strict union comment #1
///
/// strict union comment #3
class StrictUnion {
 public:
  StrictUnion()
      : ordinal_(::test_doccomments::wire::StrictUnion::Ordinal::Invalid),
        envelope_{} {}

  StrictUnion(const StrictUnion&) = default;
  StrictUnion& operator=(const StrictUnion&) = default;
  StrictUnion(StrictUnion&&) = default;
  StrictUnion& operator=(StrictUnion&&) = default;

  enum class Tag : fidl_xunion_tag_t {
    kField = 1,  // 0x1
  };

  bool has_invalid_tag() const {
    return ordinal_ == ::test_doccomments::wire::StrictUnion::Ordinal::Invalid;
  }

  bool is_field() const {
    return ordinal_ == ::test_doccomments::wire::StrictUnion::Ordinal::kField;
  }

  /// union member comment #1
  ///
  /// union member comment #3
  static StrictUnion WithField(int32_t val) {
    StrictUnion result;
    result.ordinal_ = ::test_doccomments::wire::StrictUnion::Ordinal::kField;
    result.envelope_.As<int32_t>().set_data(std::move(val));
    return result;
  }

  /// union member comment #1
  ///
  /// union member comment #3
  int32_t& field() {
    ZX_ASSERT(ordinal_ ==
              ::test_doccomments::wire::StrictUnion::Ordinal::kField);
    return envelope_.As<int32_t>().get_data();
  }
  /// union member comment #1
  ///
  /// union member comment #3
  const int32_t& field() const {
    ZX_ASSERT(ordinal_ ==
              ::test_doccomments::wire::StrictUnion::Ordinal::kField);
    return envelope_.As<int32_t>().get_data();
  }
  ::test_doccomments::wire::StrictUnion::Tag Which() const {
    ZX_ASSERT(!has_invalid_tag());
    return static_cast<::test_doccomments::wire::StrictUnion::Tag>(ordinal_);
  }

 private:
  enum class Ordinal : fidl_xunion_tag_t {
    Invalid = 0,
    kField = 1,  // 0x1
  };

  static void SizeAndOffsetAssertionHelper();
  ::test_doccomments::wire::StrictUnion::Ordinal ordinal_;
  FIDL_ALIGNDECL
  ::fidl::UntypedEnvelope envelope_;
};

extern "C" const fidl_type_t test_doccomments_FlexibleUnionTable;

/// flexible union comment #1
///
/// flexible union comment #3
class FlexibleUnion {
 public:
  FlexibleUnion()
      : ordinal_(::test_doccomments::wire::FlexibleUnion::Ordinal::Invalid),
        envelope_{} {}

  FlexibleUnion(const FlexibleUnion&) = default;
  FlexibleUnion& operator=(const FlexibleUnion&) = default;
  FlexibleUnion(FlexibleUnion&&) = default;
  FlexibleUnion& operator=(FlexibleUnion&&) = default;

  enum class Tag : fidl_xunion_tag_t {
    kField = 1,  // 0x1
    kUnknown = ::std::numeric_limits<::fidl_union_tag_t>::max(),
  };

  bool has_invalid_tag() const {
    return ordinal_ ==
           ::test_doccomments::wire::FlexibleUnion::Ordinal::Invalid;
  }

  bool is_field() const {
    return ordinal_ == ::test_doccomments::wire::FlexibleUnion::Ordinal::kField;
  }

  /// union member comment #1
  ///
  /// union member comment #3
  static FlexibleUnion WithField(int32_t val) {
    FlexibleUnion result;
    result.ordinal_ = ::test_doccomments::wire::FlexibleUnion::Ordinal::kField;
    result.envelope_.As<int32_t>().set_data(std::move(val));
    return result;
  }

  /// union member comment #1
  ///
  /// union member comment #3
  int32_t& field() {
    ZX_ASSERT(ordinal_ ==
              ::test_doccomments::wire::FlexibleUnion::Ordinal::kField);
    return envelope_.As<int32_t>().get_data();
  }
  /// union member comment #1
  ///
  /// union member comment #3
  const int32_t& field() const {
    ZX_ASSERT(ordinal_ ==
              ::test_doccomments::wire::FlexibleUnion::Ordinal::kField);
    return envelope_.As<int32_t>().get_data();
  }
  ::test_doccomments::wire::FlexibleUnion::Tag Which() const;

 private:
  enum class Ordinal : fidl_xunion_tag_t {
    Invalid = 0,
    kField = 1,  // 0x1
  };

  static void SizeAndOffsetAssertionHelper();
  ::test_doccomments::wire::FlexibleUnion::Ordinal ordinal_;
  FIDL_ALIGNDECL
  ::fidl::UntypedEnvelope envelope_;
};

/// const comment #1
///
/// const comment #3
constexpr int32_t kC = 4u;

}  // namespace wire
}  // namespace test_doccomments
namespace fidl {

template <>
struct TypeTraits<::test_doccomments::wire::Struct> {
  static constexpr const fidl_type_t* kType =
      &::test_doccomments::wire::test_doccomments_StructTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 4;
  static constexpr uint32_t kPrimarySizeV1 = 4;
  [[maybe_unused]] static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 0;
  static constexpr bool kHasPointer = false;
};

template <>
struct IsFidlType<::test_doccomments::wire::Struct> : public std::true_type {};
template <>
struct IsStruct<::test_doccomments::wire::Struct> : public std::true_type {};
static_assert(std::is_standard_layout_v<::test_doccomments::wire::Struct>);
static_assert(offsetof(::test_doccomments::wire::Struct, field) == 0);
static_assert(sizeof(::test_doccomments::wire::Struct) ==
              TypeTraits<::test_doccomments::wire::Struct>::kPrimarySize);

template <>
struct TypeTraits<::test_doccomments::wire::Table> {
  static constexpr const fidl_type_t* kType =
      &::test_doccomments::wire::test_doccomments_TableTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 16;
  static constexpr uint32_t kPrimarySizeV1 = 16;
  [[maybe_unused]] static constexpr uint32_t kMaxOutOfLine = 8;
  static constexpr uint32_t kMaxOutOfLineV1 = 24;
  static constexpr bool kHasPointer = true;
};

template <>
struct IsFidlType<::test_doccomments::wire::Table> : public std::true_type {};
template <>
struct IsTable<::test_doccomments::wire::Table> : public std::true_type {};
static_assert(std::is_standard_layout_v<::test_doccomments::wire::Table>);

template <>
struct TypeTraits<::test_doccomments::wire::StrictUnion> {
  static constexpr const fidl_type_t* kType =
      &::test_doccomments::wire::test_doccomments_StrictUnionTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 16;
  static constexpr uint32_t kPrimarySizeV1 = 24;
  [[maybe_unused]] static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 8;
  static constexpr bool kHasPointer = true;
};

template <>
struct IsFidlType<::test_doccomments::wire::StrictUnion>
    : public std::true_type {};
template <>
struct IsUnion<::test_doccomments::wire::StrictUnion> : public std::true_type {
};
static_assert(std::is_standard_layout_v<::test_doccomments::wire::StrictUnion>);

template <>
struct TypeTraits<::test_doccomments::wire::FlexibleUnion> {
  static constexpr const fidl_type_t* kType =
      &::test_doccomments::wire::test_doccomments_FlexibleUnionTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 16;
  static constexpr uint32_t kPrimarySizeV1 = 24;
  [[maybe_unused]] static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 8;
  static constexpr bool kHasPointer = true;
};

template <>
struct IsFidlType<::test_doccomments::wire::FlexibleUnion>
    : public std::true_type {};
template <>
struct IsUnion<::test_doccomments::wire::FlexibleUnion>
    : public std::true_type {};
static_assert(
    std::is_standard_layout_v<::test_doccomments::wire::FlexibleUnion>);

}  // namespace fidl
