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

#ifndef MOJO_PUBLIC_INTERFACES_BINDINGS_TESTS_SAMPLE_IMPORT_MOJOM_H_
#define MOJO_PUBLIC_INTERFACES_BINDINGS_TESTS_SAMPLE_IMPORT_MOJOM_H_

#include <stdint.h>

#include <limits>
#include <type_traits>
#include <utility>

#include "base/callback.h"
#include "base/macros.h"
#include "base/optional.h"

#include "mojo/public/cpp/bindings/mojo_buildflags.h"
#if BUILDFLAG(MOJO_TRACE_ENABLED)
#include "base/trace_event/trace_event.h"
#endif
#include "mojo/public/cpp/bindings/clone_traits.h"
#include "mojo/public/cpp/bindings/equals_traits.h"
#include "mojo/public/cpp/bindings/lib/serialization.h"
#include "mojo/public/cpp/bindings/struct_ptr.h"
#include "mojo/public/cpp/bindings/struct_traits.h"
#include "mojo/public/cpp/bindings/union_traits.h"
#include "mojo/public/interfaces/bindings/tests/sample_import.mojom-shared.h"
#include "mojo/public/interfaces/bindings/tests/sample_import.mojom-forward.h"
#include <string>
#include <vector>

#include "mojo/public/cpp/bindings/associated_interface_ptr.h"
#include "mojo/public/cpp/bindings/associated_interface_ptr_info.h"
#include "mojo/public/cpp/bindings/associated_interface_request.h"
#include "mojo/public/cpp/bindings/interface_ptr.h"
#include "mojo/public/cpp/bindings/interface_request.h"
#include "mojo/public/cpp/bindings/lib/control_message_handler.h"
#include "mojo/public/cpp/bindings/raw_ptr_impl_ref_traits.h"
#include "mojo/public/cpp/bindings/thread_safe_interface_ptr.h"


#include "mojo/public/cpp/bindings/lib/native_enum_serialization.h"
#include "mojo/public/cpp/bindings/lib/native_struct_serialization.h"

#ifdef KYTHE_IS_RUNNING
#pragma kythe_inline_metadata "Metadata comment"
#endif


namespace imported {

class ImportedInterfaceProxy;

template <typename ImplRefTraits>
class ImportedInterfaceStub;

class ImportedInterfaceRequestValidator;


// @generated_from: imported.ImportedInterface
class  ImportedInterface
    : public ImportedInterfaceInterfaceBase {
 public:
  static const char Name_[];
  static constexpr uint32_t Version_ = 0;
  static constexpr bool PassesAssociatedKinds_ = false;
  static constexpr bool HasSyncMethods_ = false;

  using Base_ = ImportedInterfaceInterfaceBase;
  using Proxy_ = ImportedInterfaceProxy;

  template <typename ImplRefTraits>
  using Stub_ = ImportedInterfaceStub<ImplRefTraits>;

  using RequestValidator_ = ImportedInterfaceRequestValidator;
  using ResponseValidator_ = mojo::PassThroughFilter;
  enum MethodMinVersions : uint32_t {
    kDoSomethingMinVersion = 0,
  };
  virtual ~ImportedInterface() {}

  
// @generated_from: imported.ImportedInterface.DoSomething
  virtual void DoSomething() = 0;
};

class  ImportedInterfaceProxy
    : public ImportedInterface {
 public:
  using InterfaceType = ImportedInterface;

  explicit ImportedInterfaceProxy(mojo::MessageReceiverWithResponder* receiver);
  void DoSomething() final;

 private:
  mojo::MessageReceiverWithResponder* receiver_;
};
class  ImportedInterfaceStubDispatch {
 public:
  static bool Accept(ImportedInterface* impl, mojo::Message* message);
  static bool AcceptWithResponder(
      ImportedInterface* impl,
      mojo::Message* message,
      std::unique_ptr<mojo::MessageReceiverWithStatus> responder);
};

template <typename ImplRefTraits =
              mojo::RawPtrImplRefTraits<ImportedInterface>>
class ImportedInterfaceStub
    : public mojo::MessageReceiverWithResponderStatus {
 public:
  using ImplPointerType = typename ImplRefTraits::PointerType;

  ImportedInterfaceStub() {}
  ~ImportedInterfaceStub() override {}

  void set_sink(ImplPointerType sink) { sink_ = std::move(sink); }
  ImplPointerType& sink() { return sink_; }

  bool Accept(mojo::Message* message) override {
    if (ImplRefTraits::IsNull(sink_))
      return false;
    return ImportedInterfaceStubDispatch::Accept(
        ImplRefTraits::GetRawPointer(&sink_), message);
  }

  bool AcceptWithResponder(
      mojo::Message* message,
      std::unique_ptr<mojo::MessageReceiverWithStatus> responder) override {
    if (ImplRefTraits::IsNull(sink_))
      return false;
    return ImportedInterfaceStubDispatch::AcceptWithResponder(
        ImplRefTraits::GetRawPointer(&sink_), message, std::move(responder));
  }

 private:
  ImplPointerType sink_;
};
class  ImportedInterfaceRequestValidator : public mojo::MessageReceiver {
 public:
  bool Accept(mojo::Message* message) override;
};





// @generated_from: imported.Point
class  Point {
 public:
  template <typename T>
  using EnableIfSame = std::enable_if_t<std::is_same<Point, T>::value>;
  using DataView = PointDataView;
  using Data_ = internal::Point_Data;

  template <typename... Args>
  static PointPtr New(Args&&... args) {
    return PointPtr(
        base::in_place, std::forward<Args>(args)...);
  }

  template <typename U>
  static PointPtr From(const U& u) {
    return mojo::TypeConverter<PointPtr, U>::Convert(u);
  }

  template <typename U>
  U To() const {
    return mojo::TypeConverter<U, Point>::Convert(*this);
  }


  Point();

  Point(
      int32_t x,
      int32_t y);

  ~Point();

  // Clone() is a template so it is only instantiated if it is used. Thus, the
  // bindings generator does not need to know whether Clone() or copy
  // constructor/assignment are available for members.
  template <typename StructPtrType = PointPtr>
  PointPtr Clone() const;

  // Equals() is a template so it is only instantiated if it is used. Thus, the
  // bindings generator does not need to know whether Equals() or == operator
  // are available for members.
  template <typename T, Point::EnableIfSame<T>* = nullptr>
  bool Equals(const T& other) const;
  size_t Hash(size_t seed) const;

  template <typename UserType>
  static std::vector<uint8_t> Serialize(UserType* input) {
    return mojo::internal::SerializeImpl<
        Point::DataView, std::vector<uint8_t>>(input);
  }

  template <typename UserType>
  static mojo::Message SerializeAsMessage(UserType* input) {
    return mojo::internal::SerializeAsMessageImpl<
        Point::DataView>(input);
  }

  // The returned Message is serialized only if the message is moved
  // cross-process or cross-language. Otherwise if the message is Deserialized
  // as the same UserType |input| will just be moved to |output| in
  // DeserializeFromMessage.
  template <typename UserType>
  static mojo::Message WrapAsMessage(UserType input) {
    return mojo::Message(std::make_unique<
        internal::Point_UnserializedMessageContext<
            UserType, Point::DataView>>(0, 0, std::move(input)));
  }

  template <typename UserType>
  static bool Deserialize(const void* data,
                          size_t data_num_bytes,
                          UserType* output) {
    return mojo::internal::DeserializeImpl<Point::DataView>(
        data, data_num_bytes, std::vector<mojo::ScopedHandle>(), output, Validate);
  }

  template <typename UserType>
  static bool Deserialize(const std::vector<uint8_t>& input,
                          UserType* output) {
    return Point::Deserialize(
        input.size() == 0 ? nullptr : &input.front(), input.size(), output);
  }

  template <typename UserType>
  static bool DeserializeFromMessage(mojo::Message input,
                                     UserType* output) {
    auto context = input.TakeUnserializedContext<
        internal::Point_UnserializedMessageContext<
            UserType, Point::DataView>>();
    if (context) {
      *output = std::move(context->TakeData());
      return true;
    }
    input.SerializeIfNecessary();
    return mojo::internal::DeserializeImpl<Point::DataView>(
        input.payload(), input.payload_num_bytes(),
        std::move(*input.mutable_handles()), output, Validate);
  }

  
// @generated_from: imported.Point.x
  int32_t x;
  
// @generated_from: imported.Point.y
  int32_t y;

 private:
  static bool Validate(const void* data,
                       mojo::internal::ValidationContext* validation_context);
};

// The comparison operators are templates, so they are only instantiated if they
// are used. Thus, the bindings generator does not need to know whether
// comparison operators are available for members.
template <typename T, Point::EnableIfSame<T>* = nullptr>
bool operator<(const T& lhs, const T& rhs);

template <typename T, Point::EnableIfSame<T>* = nullptr>
bool operator<=(const T& lhs, const T& rhs) {
  return !(rhs < lhs);
}

template <typename T, Point::EnableIfSame<T>* = nullptr>
bool operator>(const T& lhs, const T& rhs) {
  return rhs < lhs;
}

template <typename T, Point::EnableIfSame<T>* = nullptr>
bool operator>=(const T& lhs, const T& rhs) {
  return !(lhs < rhs);
}





// @generated_from: imported.PointOrShape
class  PointOrShape {
 public:
  using DataView = PointOrShapeDataView;
  using Data_ = internal::PointOrShape_Data;
  using Tag = Data_::PointOrShape_Tag;

  static PointOrShapePtr New() {
    return PointOrShapePtr(base::in_place);
  }
  // Construct an instance holding |point|.
  static PointOrShapePtr
  NewPoint(
      PointPtr point) {
    auto result = PointOrShapePtr(base::in_place);
    result->set_point(std::move(point));
    return result;
  }
  // Construct an instance holding |shape|.
  static PointOrShapePtr
  NewShape(
      Shape shape) {
    auto result = PointOrShapePtr(base::in_place);
    result->set_shape(std::move(shape));
    return result;
  }

  template <typename U>
  static PointOrShapePtr From(const U& u) {
    return mojo::TypeConverter<PointOrShapePtr, U>::Convert(u);
  }

  template <typename U>
  U To() const {
    return mojo::TypeConverter<U, PointOrShape>::Convert(*this);
  }

  PointOrShape();
  ~PointOrShape();

  // Clone() is a template so it is only instantiated if it is used. Thus, the
  // bindings generator does not need to know whether Clone() or copy
  // constructor/assignment are available for members.
  template <typename UnionPtrType = PointOrShapePtr>
  PointOrShapePtr Clone() const;

  // Equals() is a template so it is only instantiated if it is used. Thus, the
  // bindings generator does not need to know whether Equals() or == operator
  // are available for members.
  template <typename T,
            typename std::enable_if<std::is_same<
                T, PointOrShape>::value>::type* = nullptr>
  bool Equals(const T& other) const;
  size_t Hash(size_t seed) const;

  Tag which() const {
    return tag_;
  }


  
// @generated_from: imported.PointOrShape.point
  bool is_point() const { return tag_ == Tag::POINT; }

  
// @generated_from: imported.PointOrShape.point
  PointPtr& get_point() const {
    DCHECK(tag_ == Tag::POINT);
    return *(data_.point);
  }

  
// @generated_from: imported.PointOrShape.point
  void set_point(
      PointPtr point);
  
// @generated_from: imported.PointOrShape.shape
  bool is_shape() const { return tag_ == Tag::SHAPE; }

  
// @generated_from: imported.PointOrShape.shape
  Shape get_shape() const {
    DCHECK(tag_ == Tag::SHAPE);
    return data_.shape;
  }

  
// @generated_from: imported.PointOrShape.shape
  void set_shape(
      Shape shape);

  template <typename UserType>
  static mojo::Message SerializeAsMessage(UserType* input) {
    return mojo::internal::SerializeAsMessageImpl<
        PointOrShape::DataView>(input);
  }

  template <typename UserType>
  static bool DeserializeFromMessage(mojo::Message input,
                                     UserType* output) {
    return mojo::internal::DeserializeImpl<PointOrShape::DataView>(
        input.payload(), input.payload_num_bytes(),
        std::move(*input.mutable_handles()), output, Validate);
  }

 private:
  union Union_ {
    Union_() {}
    ~Union_() {}
    PointPtr* point;
    Shape shape;
  };

  static bool Validate(const void* data,
                       mojo::internal::ValidationContext* validation_context);

  void DestroyActive();
  Tag tag_;
  Union_ data_;
};


template <typename UnionPtrType>
PointOrShapePtr PointOrShape::Clone() const {
  // Use UnionPtrType to prevent the compiler from trying to compile this
  // without being asked.
  UnionPtrType rv(New());
  switch (tag_) {
    case Tag::POINT:
      rv->set_point(mojo::Clone(*data_.point));
      break;
    case Tag::SHAPE:
      rv->set_shape(mojo::Clone(data_.shape));
      break;
  }
  return rv;
}

template <typename T,
          typename std::enable_if<std::is_same<
              T, PointOrShape>::value>::type*>
bool PointOrShape::Equals(const T& other) const {
  if (tag_ != other.which())
    return false;

  switch (tag_) {
    case Tag::POINT:
      return mojo::Equals(*(data_.point), *(other.data_.point));
    case Tag::SHAPE:
      return mojo::Equals(data_.shape, other.data_.shape);
  }

  return false;
}
template <typename StructPtrType>
PointPtr Point::Clone() const {
  return New(
      mojo::Clone(x),
      mojo::Clone(y)
  );
}

template <typename T, Point::EnableIfSame<T>*>
bool Point::Equals(const T& other_struct) const {
  if (!mojo::Equals(this->x, other_struct.x))
    return false;
  if (!mojo::Equals(this->y, other_struct.y))
    return false;
  return true;
}

template <typename T, Point::EnableIfSame<T>*>
bool operator<(const T& lhs, const T& rhs) {
  if (lhs.x < rhs.x)
    return true;
  if (rhs.x < lhs.x)
    return false;
  if (lhs.y < rhs.y)
    return true;
  if (rhs.y < lhs.y)
    return false;
  return false;
}


}  // namespace imported

namespace mojo {


template <>
struct  StructTraits<::imported::Point::DataView,
                                         ::imported::PointPtr> {
  static bool IsNull(const ::imported::PointPtr& input) { return !input; }
  static void SetToNull(::imported::PointPtr* output) { output->reset(); }

  static decltype(::imported::Point::x) x(
      const ::imported::PointPtr& input) {
    return input->x;
  }

  static decltype(::imported::Point::y) y(
      const ::imported::PointPtr& input) {
    return input->y;
  }

  static bool Read(::imported::Point::DataView input, ::imported::PointPtr* output);
};


template <>
struct  UnionTraits<::imported::PointOrShape::DataView,
                                        ::imported::PointOrShapePtr> {
  static bool IsNull(const ::imported::PointOrShapePtr& input) { return !input; }
  static void SetToNull(::imported::PointOrShapePtr* output) { output->reset(); }

  static ::imported::PointOrShape::Tag GetTag(const ::imported::PointOrShapePtr& input) {
    return input->which();
  }

  static const ::imported::PointPtr& point(const ::imported::PointOrShapePtr& input) {
    return input->get_point();
  }

  static  ::imported::Shape shape(const ::imported::PointOrShapePtr& input) {
    return input->get_shape();
  }

  static bool Read(::imported::PointOrShape::DataView input, ::imported::PointOrShapePtr* output);
};

}  // namespace mojo

#endif  // MOJO_PUBLIC_INTERFACES_BINDINGS_TESTS_SAMPLE_IMPORT_MOJOM_H_
/* Metadata comment
eyJtZXRhIjogW3siZW5kIjogMjA2MSwgImJlZ2luIjogMjA0NCwgImVkZ2UiOiAiJS9reXRoZS9l
ZGdlL2dlbmVyYXRlcyIsICJ0eXBlIjogImFuY2hvcl9kZWZpbmVzIiwgInZuYW1lIjogeyJjb3Jw
dXMiOiAiY2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbS9jaHJvbWl1bS9zcmMiLCAibGFuZ3VhZ2Ui
OiAibW9qb20iLCAic2lnbmF0dXJlIjogImltcG9ydGVkLkltcG9ydGVkSW50ZXJmYWNlIn19LCB7
ImVuZCI6IDI3OTAsICJiZWdpbiI6IDI3NzksICJlZGdlIjogIiUva3l0aGUvZWRnZS9nZW5lcmF0
ZXMiLCAidHlwZSI6ICJhbmNob3JfZGVmaW5lcyIsICJ2bmFtZSI6IHsiY29ycHVzIjogImNocm9t
aXVtLmdvb2dsZXNvdXJjZS5jb20vY2hyb21pdW0vc3JjIiwgImxhbmd1YWdlIjogIm1vam9tIiwg
InNpZ25hdHVyZSI6ICJpbXBvcnRlZC5JbXBvcnRlZEludGVyZmFjZS5Eb1NvbWV0aGluZyJ9fSwg
eyJlbmQiOiA0NTkwLCAiYmVnaW4iOiA0NTg1LCAiZWRnZSI6ICIlL2t5dGhlL2VkZ2UvZ2VuZXJh
dGVzIiwgInR5cGUiOiAiYW5jaG9yX2RlZmluZXMiLCAidm5hbWUiOiB7ImNvcnB1cyI6ICJjaHJv
bWl1bS5nb29nbGVzb3VyY2UuY29tL2Nocm9taXVtL3NyYyIsICJsYW5ndWFnZSI6ICJtb2pvbSIs
ICJzaWduYXR1cmUiOiAiaW1wb3J0ZWQuUG9pbnQifX0sIHsiZW5kIjogNzkwOSwgImJlZ2luIjog
NzkwOCwgImVkZ2UiOiAiJS9reXRoZS9lZGdlL2dlbmVyYXRlcyIsICJ0eXBlIjogImFuY2hvcl9k
ZWZpbmVzIiwgInZuYW1lIjogeyJjb3JwdXMiOiAiY2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbS9j
aHJvbWl1bS9zcmMiLCAibGFuZ3VhZ2UiOiAibW9qb20iLCAic2lnbmF0dXJlIjogImltcG9ydGVk
LlBvaW50LngifX0sIHsiZW5kIjogNzk2MiwgImJlZ2luIjogNzk2MSwgImVkZ2UiOiAiJS9reXRo
ZS9lZGdlL2dlbmVyYXRlcyIsICJ0eXBlIjogImFuY2hvcl9kZWZpbmVzIiwgInZuYW1lIjogeyJj
b3JwdXMiOiAiY2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbS9jaHJvbWl1bS9zcmMiLCAibGFuZ3Vh
Z2UiOiAibW9qb20iLCAic2lnbmF0dXJlIjogImltcG9ydGVkLlBvaW50LnkifX0sIHsiZW5kIjog
ODg1MywgImJlZ2luIjogODg0MSwgImVkZ2UiOiAiJS9reXRoZS9lZGdlL2dlbmVyYXRlcyIsICJ0
eXBlIjogImFuY2hvcl9kZWZpbmVzIiwgInZuYW1lIjogeyJjb3JwdXMiOiAiY2hyb21pdW0uZ29v
Z2xlc291cmNlLmNvbS9jaHJvbWl1bS9zcmMiLCAibGFuZ3VhZ2UiOiAibW9qb20iLCAic2lnbmF0
dXJlIjogImltcG9ydGVkLlBvaW50T3JTaGFwZSJ9fSwgeyJlbmQiOiAxMDU5MywgImJlZ2luIjog
MTA1ODUsICJlZGdlIjogIiUva3l0aGUvZWRnZS9nZW5lcmF0ZXMiLCAidHlwZSI6ICJhbmNob3Jf
ZGVmaW5lcyIsICJ2bmFtZSI6IHsiY29ycHVzIjogImNocm9taXVtLmdvb2dsZXNvdXJjZS5jb20v
Y2hyb21pdW0vc3JjIiwgImxhbmd1YWdlIjogIm1vam9tIiwgInNpZ25hdHVyZSI6ICJpbXBvcnRl
ZC5Qb2ludE9yU2hhcGUucG9pbnQifX0sIHsiZW5kIjogMTA2OTUsICJiZWdpbiI6IDEwNjg3LCAi
ZWRnZSI6ICIlL2t5dGhlL2VkZ2UvZ2VuZXJhdGVzIiwgInR5cGUiOiAiYW5jaG9yX2RlZmluZXMi
LCAidm5hbWUiOiB7ImNvcnB1cyI6ICJjaHJvbWl1bS5nb29nbGVzb3VyY2UuY29tL2Nocm9taXVt
L3NyYyIsICJsYW5ndWFnZSI6ICJtb2pvbSIsICJzaWduYXR1cmUiOiAiaW1wb3J0ZWQuUG9pbnRP
clNoYXBlLnBvaW50In19LCB7ImVuZCI6IDEwODQ4LCAiYmVnaW4iOiAxMDgzOSwgImVkZ2UiOiAi
JS9reXRoZS9lZGdlL2dlbmVyYXRlcyIsICJ0eXBlIjogImFuY2hvcl9kZWZpbmVzIiwgInZuYW1l
IjogeyJjb3JwdXMiOiAiY2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbS9jaHJvbWl1bS9zcmMiLCAi
bGFuZ3VhZ2UiOiAibW9qb20iLCAic2lnbmF0dXJlIjogImltcG9ydGVkLlBvaW50T3JTaGFwZS5w
b2ludCJ9fSwgeyJlbmQiOiAxMDkzOSwgImJlZ2luIjogMTA5MzEsICJlZGdlIjogIiUva3l0aGUv
ZWRnZS9nZW5lcmF0ZXMiLCAidHlwZSI6ICJhbmNob3JfZGVmaW5lcyIsICJ2bmFtZSI6IHsiY29y
cHVzIjogImNocm9taXVtLmdvb2dsZXNvdXJjZS5jb20vY2hyb21pdW0vc3JjIiwgImxhbmd1YWdl
IjogIm1vam9tIiwgInNpZ25hdHVyZSI6ICJpbXBvcnRlZC5Qb2ludE9yU2hhcGUuc2hhcGUifX0s
IHsiZW5kIjogMTEwMzgsICJiZWdpbiI6IDExMDMzLCAiZWRnZSI6ICIlL2t5dGhlL2VkZ2UvZ2Vu
ZXJhdGVzIiwgInR5cGUiOiAiYW5jaG9yX2RlZmluZXMiLCAidm5hbWUiOiB7ImNvcnB1cyI6ICJj
aHJvbWl1bS5nb29nbGVzb3VyY2UuY29tL2Nocm9taXVtL3NyYyIsICJsYW5ndWFnZSI6ICJtb2pv
bSIsICJzaWduYXR1cmUiOiAiaW1wb3J0ZWQuUG9pbnRPclNoYXBlLnNoYXBlIn19LCB7ImVuZCI6
IDExMTg3LCAiYmVnaW4iOiAxMTE3OCwgImVkZ2UiOiAiJS9reXRoZS9lZGdlL2dlbmVyYXRlcyIs
ICJ0eXBlIjogImFuY2hvcl9kZWZpbmVzIiwgInZuYW1lIjogeyJjb3JwdXMiOiAiY2hyb21pdW0u
Z29vZ2xlc291cmNlLmNvbS9jaHJvbWl1bS9zcmMiLCAibGFuZ3VhZ2UiOiAibW9qb20iLCAic2ln
bmF0dXJlIjogImltcG9ydGVkLlBvaW50T3JTaGFwZS5zaGFwZSJ9fV0sICJ0eXBlIjogImt5dGhl
MCJ9
*/