// printing/mojom/print.mojom-shared.h is auto generated by mojom_bindings_generator.py, do not edit

// Copyright 2016 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef PRINTING_MOJOM_PRINT_MOJOM_SHARED_H_
#define PRINTING_MOJOM_PRINT_MOJOM_SHARED_H_

#include <stdint.h>

#include <functional>
#include <iosfwd>
#include <type_traits>
#include <utility>
#include "mojo/public/cpp/bindings/array_data_view.h"
#include "mojo/public/cpp/bindings/map_data_view.h"
#include "mojo/public/cpp/bindings/string_data_view.h"
#include "mojo/public/cpp/system/message_pipe.h"

#include "third_party/perfetto/include/perfetto/tracing/traced_value_forward.h"

#include "printing/mojom/print.mojom-shared-internal.h"




#include "printing/mojom/print.mojom-data-view.h"  // IWYU pragma: export




namespace std {

template <>
struct hash<::printing::mojom::ColorModel>
    : public mojo::internal::EnumHashImpl<::printing::mojom::ColorModel> {};

template <>
struct hash<::printing::mojom::DuplexMode>
    : public mojo::internal::EnumHashImpl<::printing::mojom::DuplexMode> {};

template <>
struct hash<::printing::mojom::PageOrientation>
    : public mojo::internal::EnumHashImpl<::printing::mojom::PageOrientation> {};

template <>
struct hash<::printing::mojom::PrintScalingOption>
    : public mojo::internal::EnumHashImpl<::printing::mojom::PrintScalingOption> {};

template <>
struct hash<::printing::mojom::SkiaDocumentType>
    : public mojo::internal::EnumHashImpl<::printing::mojom::SkiaDocumentType> {};

template <>
struct hash<::printing::mojom::MetafileDataType>
    : public mojo::internal::EnumHashImpl<::printing::mojom::MetafileDataType> {};

template <>
struct hash<::printing::mojom::GenerateDocumentOutline>
    : public mojo::internal::EnumHashImpl<::printing::mojom::GenerateDocumentOutline> {};

template <>
struct hash<::printing::mojom::MarginType>
    : public mojo::internal::EnumHashImpl<::printing::mojom::MarginType> {};

template <>
struct hash<::printing::mojom::ResultCode>
    : public mojo::internal::EnumHashImpl<::printing::mojom::ResultCode> {};

template <>
struct hash<::printing::mojom::PrinterType>
    : public mojo::internal::EnumHashImpl<::printing::mojom::PrinterType> {};

}  // namespace std

namespace mojo {


namespace internal {

template <typename MaybeConstUserType>
struct Serializer<::printing::mojom::ColorModel, MaybeConstUserType> {
  using UserType = typename std::remove_const<MaybeConstUserType>::type;
  using Traits = EnumTraits<::printing::mojom::ColorModel, UserType>;

  static void Serialize(UserType input, int32_t* output) {
    *output = static_cast<int32_t>(Traits::ToMojom(input));
  }

  static bool Deserialize(int32_t input, UserType* output) {
    auto known_value = ::mojo::internal::ToKnownEnumValueHelper(
        static_cast<::printing::mojom::ColorModel>(input));
    if constexpr (requires {
                    {
                      Traits::FromMojom(known_value)
                    } -> std::same_as<UserType>;
                  }) {
      static_assert(std::same_as<::printing::mojom::ColorModel, UserType> ||
                        HasInfallibleConversion(::printing::mojom::ColorModel()),
                    "::printing::mojom::ColorModel does not have an infallible conversion, "
                    "use an optional return type.");
      *output = Traits::FromMojom(known_value);
      return true;
    } else {
      static_assert(
          requires {
            {
              Traits::FromMojom(known_value)
            } -> std::same_as<std::optional<UserType>>;
          }, "FromMojom must return by value or optional.");
      std::optional<UserType> from_mojom = Traits::FromMojom(known_value);
      if (from_mojom) {
        *output = *from_mojom;
      }
      return from_mojom.has_value();
    }
  }
};

}  // namespace internal


namespace internal {

template <typename MaybeConstUserType>
struct Serializer<::printing::mojom::DuplexMode, MaybeConstUserType> {
  using UserType = typename std::remove_const<MaybeConstUserType>::type;
  using Traits = EnumTraits<::printing::mojom::DuplexMode, UserType>;

  static void Serialize(UserType input, int32_t* output) {
    *output = static_cast<int32_t>(Traits::ToMojom(input));
  }

  static bool Deserialize(int32_t input, UserType* output) {
    auto known_value = ::mojo::internal::ToKnownEnumValueHelper(
        static_cast<::printing::mojom::DuplexMode>(input));
    if constexpr (requires {
                    {
                      Traits::FromMojom(known_value)
                    } -> std::same_as<UserType>;
                  }) {
      static_assert(std::same_as<::printing::mojom::DuplexMode, UserType> ||
                        HasInfallibleConversion(::printing::mojom::DuplexMode()),
                    "::printing::mojom::DuplexMode does not have an infallible conversion, "
                    "use an optional return type.");
      *output = Traits::FromMojom(known_value);
      return true;
    } else {
      static_assert(
          requires {
            {
              Traits::FromMojom(known_value)
            } -> std::same_as<std::optional<UserType>>;
          }, "FromMojom must return by value or optional.");
      std::optional<UserType> from_mojom = Traits::FromMojom(known_value);
      if (from_mojom) {
        *output = *from_mojom;
      }
      return from_mojom.has_value();
    }
  }
};

}  // namespace internal


namespace internal {

template <typename MaybeConstUserType>
struct Serializer<::printing::mojom::PageOrientation, MaybeConstUserType> {
  using UserType = typename std::remove_const<MaybeConstUserType>::type;
  using Traits = EnumTraits<::printing::mojom::PageOrientation, UserType>;

  static void Serialize(UserType input, int32_t* output) {
    *output = static_cast<int32_t>(Traits::ToMojom(input));
  }

  static bool Deserialize(int32_t input, UserType* output) {
    auto known_value = ::mojo::internal::ToKnownEnumValueHelper(
        static_cast<::printing::mojom::PageOrientation>(input));
    if constexpr (requires {
                    {
                      Traits::FromMojom(known_value)
                    } -> std::same_as<UserType>;
                  }) {
      static_assert(std::same_as<::printing::mojom::PageOrientation, UserType> ||
                        HasInfallibleConversion(::printing::mojom::PageOrientation()),
                    "::printing::mojom::PageOrientation does not have an infallible conversion, "
                    "use an optional return type.");
      *output = Traits::FromMojom(known_value);
      return true;
    } else {
      static_assert(
          requires {
            {
              Traits::FromMojom(known_value)
            } -> std::same_as<std::optional<UserType>>;
          }, "FromMojom must return by value or optional.");
      std::optional<UserType> from_mojom = Traits::FromMojom(known_value);
      if (from_mojom) {
        *output = *from_mojom;
      }
      return from_mojom.has_value();
    }
  }
};

}  // namespace internal


namespace internal {

template <typename MaybeConstUserType>
struct Serializer<::printing::mojom::PrintScalingOption, MaybeConstUserType> {
  using UserType = typename std::remove_const<MaybeConstUserType>::type;
  using Traits = EnumTraits<::printing::mojom::PrintScalingOption, UserType>;

  static void Serialize(UserType input, int32_t* output) {
    *output = static_cast<int32_t>(Traits::ToMojom(input));
  }

  static bool Deserialize(int32_t input, UserType* output) {
    auto known_value = ::mojo::internal::ToKnownEnumValueHelper(
        static_cast<::printing::mojom::PrintScalingOption>(input));
    if constexpr (requires {
                    {
                      Traits::FromMojom(known_value)
                    } -> std::same_as<UserType>;
                  }) {
      static_assert(std::same_as<::printing::mojom::PrintScalingOption, UserType> ||
                        HasInfallibleConversion(::printing::mojom::PrintScalingOption()),
                    "::printing::mojom::PrintScalingOption does not have an infallible conversion, "
                    "use an optional return type.");
      *output = Traits::FromMojom(known_value);
      return true;
    } else {
      static_assert(
          requires {
            {
              Traits::FromMojom(known_value)
            } -> std::same_as<std::optional<UserType>>;
          }, "FromMojom must return by value or optional.");
      std::optional<UserType> from_mojom = Traits::FromMojom(known_value);
      if (from_mojom) {
        *output = *from_mojom;
      }
      return from_mojom.has_value();
    }
  }
};

}  // namespace internal


namespace internal {

template <typename MaybeConstUserType>
struct Serializer<::printing::mojom::SkiaDocumentType, MaybeConstUserType> {
  using UserType = typename std::remove_const<MaybeConstUserType>::type;
  using Traits = EnumTraits<::printing::mojom::SkiaDocumentType, UserType>;

  static void Serialize(UserType input, int32_t* output) {
    *output = static_cast<int32_t>(Traits::ToMojom(input));
  }

  static bool Deserialize(int32_t input, UserType* output) {
    auto known_value = ::mojo::internal::ToKnownEnumValueHelper(
        static_cast<::printing::mojom::SkiaDocumentType>(input));
    if constexpr (requires {
                    {
                      Traits::FromMojom(known_value)
                    } -> std::same_as<UserType>;
                  }) {
      static_assert(std::same_as<::printing::mojom::SkiaDocumentType, UserType> ||
                        HasInfallibleConversion(::printing::mojom::SkiaDocumentType()),
                    "::printing::mojom::SkiaDocumentType does not have an infallible conversion, "
                    "use an optional return type.");
      *output = Traits::FromMojom(known_value);
      return true;
    } else {
      static_assert(
          requires {
            {
              Traits::FromMojom(known_value)
            } -> std::same_as<std::optional<UserType>>;
          }, "FromMojom must return by value or optional.");
      std::optional<UserType> from_mojom = Traits::FromMojom(known_value);
      if (from_mojom) {
        *output = *from_mojom;
      }
      return from_mojom.has_value();
    }
  }
};

}  // namespace internal


namespace internal {

template <typename MaybeConstUserType>
struct Serializer<::printing::mojom::MetafileDataType, MaybeConstUserType> {
  using UserType = typename std::remove_const<MaybeConstUserType>::type;
  using Traits = EnumTraits<::printing::mojom::MetafileDataType, UserType>;

  static void Serialize(UserType input, int32_t* output) {
    *output = static_cast<int32_t>(Traits::ToMojom(input));
  }

  static bool Deserialize(int32_t input, UserType* output) {
    auto known_value = ::mojo::internal::ToKnownEnumValueHelper(
        static_cast<::printing::mojom::MetafileDataType>(input));
    if constexpr (requires {
                    {
                      Traits::FromMojom(known_value)
                    } -> std::same_as<UserType>;
                  }) {
      static_assert(std::same_as<::printing::mojom::MetafileDataType, UserType> ||
                        HasInfallibleConversion(::printing::mojom::MetafileDataType()),
                    "::printing::mojom::MetafileDataType does not have an infallible conversion, "
                    "use an optional return type.");
      *output = Traits::FromMojom(known_value);
      return true;
    } else {
      static_assert(
          requires {
            {
              Traits::FromMojom(known_value)
            } -> std::same_as<std::optional<UserType>>;
          }, "FromMojom must return by value or optional.");
      std::optional<UserType> from_mojom = Traits::FromMojom(known_value);
      if (from_mojom) {
        *output = *from_mojom;
      }
      return from_mojom.has_value();
    }
  }
};

}  // namespace internal


namespace internal {

template <typename MaybeConstUserType>
struct Serializer<::printing::mojom::GenerateDocumentOutline, MaybeConstUserType> {
  using UserType = typename std::remove_const<MaybeConstUserType>::type;
  using Traits = EnumTraits<::printing::mojom::GenerateDocumentOutline, UserType>;

  static void Serialize(UserType input, int32_t* output) {
    *output = static_cast<int32_t>(Traits::ToMojom(input));
  }

  static bool Deserialize(int32_t input, UserType* output) {
    auto known_value = ::mojo::internal::ToKnownEnumValueHelper(
        static_cast<::printing::mojom::GenerateDocumentOutline>(input));
    if constexpr (requires {
                    {
                      Traits::FromMojom(known_value)
                    } -> std::same_as<UserType>;
                  }) {
      static_assert(std::same_as<::printing::mojom::GenerateDocumentOutline, UserType> ||
                        HasInfallibleConversion(::printing::mojom::GenerateDocumentOutline()),
                    "::printing::mojom::GenerateDocumentOutline does not have an infallible conversion, "
                    "use an optional return type.");
      *output = Traits::FromMojom(known_value);
      return true;
    } else {
      static_assert(
          requires {
            {
              Traits::FromMojom(known_value)
            } -> std::same_as<std::optional<UserType>>;
          }, "FromMojom must return by value or optional.");
      std::optional<UserType> from_mojom = Traits::FromMojom(known_value);
      if (from_mojom) {
        *output = *from_mojom;
      }
      return from_mojom.has_value();
    }
  }
};

}  // namespace internal


namespace internal {

template <typename MaybeConstUserType>
struct Serializer<::printing::mojom::MarginType, MaybeConstUserType> {
  using UserType = typename std::remove_const<MaybeConstUserType>::type;
  using Traits = EnumTraits<::printing::mojom::MarginType, UserType>;

  static void Serialize(UserType input, int32_t* output) {
    *output = static_cast<int32_t>(Traits::ToMojom(input));
  }

  static bool Deserialize(int32_t input, UserType* output) {
    auto known_value = ::mojo::internal::ToKnownEnumValueHelper(
        static_cast<::printing::mojom::MarginType>(input));
    if constexpr (requires {
                    {
                      Traits::FromMojom(known_value)
                    } -> std::same_as<UserType>;
                  }) {
      static_assert(std::same_as<::printing::mojom::MarginType, UserType> ||
                        HasInfallibleConversion(::printing::mojom::MarginType()),
                    "::printing::mojom::MarginType does not have an infallible conversion, "
                    "use an optional return type.");
      *output = Traits::FromMojom(known_value);
      return true;
    } else {
      static_assert(
          requires {
            {
              Traits::FromMojom(known_value)
            } -> std::same_as<std::optional<UserType>>;
          }, "FromMojom must return by value or optional.");
      std::optional<UserType> from_mojom = Traits::FromMojom(known_value);
      if (from_mojom) {
        *output = *from_mojom;
      }
      return from_mojom.has_value();
    }
  }
};

}  // namespace internal


namespace internal {

template <typename MaybeConstUserType>
struct Serializer<::printing::mojom::ResultCode, MaybeConstUserType> {
  using UserType = typename std::remove_const<MaybeConstUserType>::type;
  using Traits = EnumTraits<::printing::mojom::ResultCode, UserType>;

  static void Serialize(UserType input, int32_t* output) {
    *output = static_cast<int32_t>(Traits::ToMojom(input));
  }

  static bool Deserialize(int32_t input, UserType* output) {
    auto known_value = ::mojo::internal::ToKnownEnumValueHelper(
        static_cast<::printing::mojom::ResultCode>(input));
    if constexpr (requires {
                    {
                      Traits::FromMojom(known_value)
                    } -> std::same_as<UserType>;
                  }) {
      static_assert(std::same_as<::printing::mojom::ResultCode, UserType> ||
                        HasInfallibleConversion(::printing::mojom::ResultCode()),
                    "::printing::mojom::ResultCode does not have an infallible conversion, "
                    "use an optional return type.");
      *output = Traits::FromMojom(known_value);
      return true;
    } else {
      static_assert(
          requires {
            {
              Traits::FromMojom(known_value)
            } -> std::same_as<std::optional<UserType>>;
          }, "FromMojom must return by value or optional.");
      std::optional<UserType> from_mojom = Traits::FromMojom(known_value);
      if (from_mojom) {
        *output = *from_mojom;
      }
      return from_mojom.has_value();
    }
  }
};

}  // namespace internal


namespace internal {

template <typename MaybeConstUserType>
struct Serializer<::printing::mojom::PrinterType, MaybeConstUserType> {
  using UserType = typename std::remove_const<MaybeConstUserType>::type;
  using Traits = EnumTraits<::printing::mojom::PrinterType, UserType>;

  static void Serialize(UserType input, int32_t* output) {
    *output = static_cast<int32_t>(Traits::ToMojom(input));
  }

  static bool Deserialize(int32_t input, UserType* output) {
    auto known_value = ::mojo::internal::ToKnownEnumValueHelper(
        static_cast<::printing::mojom::PrinterType>(input));
    if constexpr (requires {
                    {
                      Traits::FromMojom(known_value)
                    } -> std::same_as<UserType>;
                  }) {
      static_assert(std::same_as<::printing::mojom::PrinterType, UserType> ||
                        HasInfallibleConversion(::printing::mojom::PrinterType()),
                    "::printing::mojom::PrinterType does not have an infallible conversion, "
                    "use an optional return type.");
      *output = Traits::FromMojom(known_value);
      return true;
    } else {
      static_assert(
          requires {
            {
              Traits::FromMojom(known_value)
            } -> std::same_as<std::optional<UserType>>;
          }, "FromMojom must return by value or optional.");
      std::optional<UserType> from_mojom = Traits::FromMojom(known_value);
      if (from_mojom) {
        *output = *from_mojom;
      }
      return from_mojom.has_value();
    }
  }
};

}  // namespace internal


namespace internal {

template <typename MaybeConstUserType>
struct Serializer<::printing::mojom::PageSizeMarginsDataView, MaybeConstUserType> {
  using UserType = typename std::remove_const<MaybeConstUserType>::type;
  using Traits = StructTraits<::printing::mojom::PageSizeMarginsDataView, UserType>;

  static void Serialize(
      MaybeConstUserType& input,
      mojo::internal::MessageFragment<::printing::mojom::internal::PageSizeMargins_Data>& fragment) {
    if (CallIsNullIfExists<Traits>(input))
      return;
    fragment.Allocate();

    fragment->content_width = Traits::content_width(input);

    fragment->content_height = Traits::content_height(input);

    fragment->margin_top = Traits::margin_top(input);

    fragment->margin_right = Traits::margin_right(input);

    fragment->margin_bottom = Traits::margin_bottom(input);

    fragment->margin_left = Traits::margin_left(input);
  }

  static bool Deserialize(::printing::mojom::internal::PageSizeMargins_Data* input,
                          UserType* output,
                          Message* message) {
    if (!input)
      return CallSetToNullIfExists<Traits>(output);

    ::printing::mojom::PageSizeMarginsDataView data_view(input, message);
    return CallTraitsRead<Traits>(data_view, output);
  }
};

}  // namespace internal


namespace internal {

template <typename MaybeConstUserType>
struct Serializer<::printing::mojom::PageRangeDataView, MaybeConstUserType> {
  using UserType = typename std::remove_const<MaybeConstUserType>::type;
  using Traits = StructTraits<::printing::mojom::PageRangeDataView, UserType>;

  static void Serialize(
      MaybeConstUserType& input,
      mojo::internal::MessageFragment<::printing::mojom::internal::PageRange_Data>& fragment) {
    if (CallIsNullIfExists<Traits>(input))
      return;
    fragment.Allocate();

    fragment->from = Traits::from(input);

    fragment->to = Traits::to(input);
  }

  static bool Deserialize(::printing::mojom::internal::PageRange_Data* input,
                          UserType* output,
                          Message* message) {
    if (!input)
      return CallSetToNullIfExists<Traits>(output);

    ::printing::mojom::PageRangeDataView data_view(input, message);
    return CallTraitsRead<Traits>(data_view, output);
  }
};

}  // namespace internal

}  // namespace mojo


namespace printing::mojom {






}  // printing::mojom

// Declare TraceFormatTraits for enums, which should be defined in ::perfetto
// namespace.

namespace perfetto {

template <>
struct  TraceFormatTraits<::printing::mojom::ColorModel> {
 static void WriteIntoTrace(perfetto::TracedValue context, ::printing::mojom::ColorModel value);
};

} // namespace perfetto

namespace perfetto {

template <>
struct  TraceFormatTraits<::printing::mojom::DuplexMode> {
 static void WriteIntoTrace(perfetto::TracedValue context, ::printing::mojom::DuplexMode value);
};

} // namespace perfetto

namespace perfetto {

template <>
struct  TraceFormatTraits<::printing::mojom::PageOrientation> {
 static void WriteIntoTrace(perfetto::TracedValue context, ::printing::mojom::PageOrientation value);
};

} // namespace perfetto

namespace perfetto {

template <>
struct  TraceFormatTraits<::printing::mojom::PrintScalingOption> {
 static void WriteIntoTrace(perfetto::TracedValue context, ::printing::mojom::PrintScalingOption value);
};

} // namespace perfetto

namespace perfetto {

template <>
struct  TraceFormatTraits<::printing::mojom::SkiaDocumentType> {
 static void WriteIntoTrace(perfetto::TracedValue context, ::printing::mojom::SkiaDocumentType value);
};

} // namespace perfetto

namespace perfetto {

template <>
struct  TraceFormatTraits<::printing::mojom::MetafileDataType> {
 static void WriteIntoTrace(perfetto::TracedValue context, ::printing::mojom::MetafileDataType value);
};

} // namespace perfetto

namespace perfetto {

template <>
struct  TraceFormatTraits<::printing::mojom::GenerateDocumentOutline> {
 static void WriteIntoTrace(perfetto::TracedValue context, ::printing::mojom::GenerateDocumentOutline value);
};

} // namespace perfetto

namespace perfetto {

template <>
struct  TraceFormatTraits<::printing::mojom::MarginType> {
 static void WriteIntoTrace(perfetto::TracedValue context, ::printing::mojom::MarginType value);
};

} // namespace perfetto

namespace perfetto {

template <>
struct  TraceFormatTraits<::printing::mojom::ResultCode> {
 static void WriteIntoTrace(perfetto::TracedValue context, ::printing::mojom::ResultCode value);
};

} // namespace perfetto

namespace perfetto {

template <>
struct  TraceFormatTraits<::printing::mojom::PrinterType> {
 static void WriteIntoTrace(perfetto::TracedValue context, ::printing::mojom::PrinterType value);
};

} // namespace perfetto

#endif  // PRINTING_MOJOM_PRINT_MOJOM_SHARED_H_