/*===- TableGen'erated file -------------------------------------*- C++ -*-===*\
|*                                                                            *|
|* Interface Declarations                                                     *|
|*                                                                            *|
|* Automatically generated file, do not edit!                                 *|
|*                                                                            *|
\*===----------------------------------------------------------------------===*/

namespace detail {
struct TflRuntimeVerifyOpInterfaceInterfaceTraits {
  class Concept {
  public:
    virtual ~Concept() = default;
    virtual LogicalResult VerifyTflRuntimeConstraints(Operation* op) const = 0;
  };
  template<typename ConcreteOp>
  class Model : public Concept {
  public:
    LogicalResult VerifyTflRuntimeConstraints(Operation* op) const final {
      return ConcreteOp::VerifyTflRuntimeConstraints(op);
    }
  };
};
} // end namespace detail
class TflRuntimeVerifyOpInterface : public ::mlir::OpInterface<TflRuntimeVerifyOpInterface, detail::TflRuntimeVerifyOpInterfaceInterfaceTraits> {
public:
  using ::mlir::OpInterface<TflRuntimeVerifyOpInterface, detail::TflRuntimeVerifyOpInterfaceInterfaceTraits>::OpInterface;
  template <typename ConcreteOp>
  struct TflRuntimeVerifyOpInterfaceTrait : public ::mlir::OpInterface<TflRuntimeVerifyOpInterface, detail::TflRuntimeVerifyOpInterfaceInterfaceTraits>::Trait<ConcreteOp> {
  };
  template <typename ConcreteOp>
  struct Trait : public TflRuntimeVerifyOpInterfaceTrait<ConcreteOp> {};
  LogicalResult VerifyTflRuntimeConstraints(Operation* op);
};
namespace detail {
struct SparseOpInterfaceInterfaceTraits {
  class Concept {
  public:
    virtual ~Concept() = default;
    virtual std::vector<int> GetSparseOperands(::mlir::Operation *tablegen_opaque_val) const = 0;
    virtual std::vector<std::vector<int>> GetFloatBlockSize(::mlir::Operation *tablegen_opaque_val) const = 0;
    virtual std::vector<std::vector<int>> GetQuantizedBlockSize(::mlir::Operation *tablegen_opaque_val) const = 0;
  };
  template<typename ConcreteOp>
  class Model : public Concept {
  public:
    std::vector<int> GetSparseOperands(::mlir::Operation *tablegen_opaque_val) const final {
      return (llvm::cast<ConcreteOp>(tablegen_opaque_val)).GetSparseOperands();
    }
    std::vector<std::vector<int>> GetFloatBlockSize(::mlir::Operation *tablegen_opaque_val) const final {
      return (llvm::cast<ConcreteOp>(tablegen_opaque_val)).GetFloatBlockSize();
    }
    std::vector<std::vector<int>> GetQuantizedBlockSize(::mlir::Operation *tablegen_opaque_val) const final {
      return (llvm::cast<ConcreteOp>(tablegen_opaque_val)).GetQuantizedBlockSize();
    }
  };
};
} // end namespace detail
class SparseOpInterface : public ::mlir::OpInterface<SparseOpInterface, detail::SparseOpInterfaceInterfaceTraits> {
public:
  using ::mlir::OpInterface<SparseOpInterface, detail::SparseOpInterfaceInterfaceTraits>::OpInterface;
  template <typename ConcreteOp>
  struct SparseOpInterfaceTrait : public ::mlir::OpInterface<SparseOpInterface, detail::SparseOpInterfaceInterfaceTraits>::Trait<ConcreteOp> {
  };
  template <typename ConcreteOp>
  struct Trait : public SparseOpInterfaceTrait<ConcreteOp> {};
  std::vector<int> GetSparseOperands();
  std::vector<std::vector<int>> GetFloatBlockSize();
  std::vector<std::vector<int>> GetQuantizedBlockSize();
};
namespace detail {
struct StatefulOpInterfaceInterfaceTraits {
  class Concept {
  public:
    virtual ~Concept() = default;
    virtual std::vector<int> GetStatefulOperands(::mlir::Operation *tablegen_opaque_val) const = 0;
  };
  template<typename ConcreteOp>
  class Model : public Concept {
  public:
    std::vector<int> GetStatefulOperands(::mlir::Operation *tablegen_opaque_val) const final {
      return (llvm::cast<ConcreteOp>(tablegen_opaque_val)).GetStatefulOperands();
    }
  };
};
} // end namespace detail
class StatefulOpInterface : public ::mlir::OpInterface<StatefulOpInterface, detail::StatefulOpInterfaceInterfaceTraits> {
public:
  using ::mlir::OpInterface<StatefulOpInterface, detail::StatefulOpInterfaceInterfaceTraits>::OpInterface;
  template <typename ConcreteOp>
  struct StatefulOpInterfaceTrait : public ::mlir::OpInterface<StatefulOpInterface, detail::StatefulOpInterfaceInterfaceTraits>::Trait<ConcreteOp> {
  };
  template <typename ConcreteOp>
  struct Trait : public StatefulOpInterfaceTrait<ConcreteOp> {};
  std::vector<int> GetStatefulOperands();
};
