#include <ATen/Tensor.h>
#include <ATen/core/Dict.h>
#include <ATen/core/List.h>
#include <ATen/core/ivalue.h>
#include <ATen/core/Dimname.h>
#include <ATen/Storage.h>
#include <ATen/TensorIndexing.h>
#include <torch/csrc/jit/api/module.h>
#include <torch/optim.h>

#include <array>
#include <string>
#include <tuple>
#include <vector>

extern "C" {
  void delete_tensor(at::Tensor* tensor);

  void delete_tensorlist(std::vector<at::Tensor>* tensors);

  void delete_tensorindex(at::indexing::TensorIndex* idx);

  void delete_tensorindexlist(std::vector<at::indexing::TensorIndex>* idxs);

  void delete_c10dict(c10::Dict<at::IValue,at::IValue>* object);

  void delete_c10listivalue(c10::List<at::IValue>* object);

  void delete_c10listtensor(c10::List<at::Tensor>* object);

  void delete_c10listoptionaltensor(c10::List<c10::optional<at::Tensor>>* object);

  void delete_c10listdouble(c10::List<double>* object);

  void delete_c10listint(c10::List<int64_t>* object);

  void delete_c10listbool(c10::List<bool>* object);

  void delete_stdvectordouble(std::vector<double>* object);

  void delete_stdvectorint(std::vector<int64_t>* object);

  void delete_stdvectorbool(std::vector<bool>* object);

  void delete_c10tuple(c10::intrusive_ptr<at::ivalue::Tuple>* object);

  void delete_context(at::Context* object);

  void delete_dimname(at::Dimname* object);

  void delete_dimnamelist(std::vector<at::Dimname>* object);

  void delete_generator(at::Generator* object);

  void delete_ivalue(at::IValue* object);

  void delete_ivaluelist(std::vector<at::IValue>* object);

  void delete_intarray(std::vector<int64_t>* object);

  void delete_module(torch::jit::script::Module* object);

  void delete_jitgraph(std::shared_ptr<torch::jit::Graph>* object);

  void delete_jitnode(torch::jit::Node* object);

  void delete_jitvalue(torch::jit::Value* object);

  void delete_scalar(at::Scalar* object);

  void delete_stdarraybool2(std::array<bool,2>* object);

  void delete_stdarraybool3(std::array<bool,3>* object);

  void delete_stdarraybool4(std::array<bool,4>* object);

  void delete_stdstring(std::string* object);

  void delete_storage(at::Storage* object);

  void delete_symbol(at::Symbol* object);

  void delete_tensoroptions(at::TensorOptions* object);

  void delete_tensortensor(std::tuple<at::Tensor,at::Tensor>* ptr);

  void delete_tensortensortensortensortensor(std::tuple<at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor>* ptr);

  void delete_tensortensortensortensortensortensor(std::tuple<at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor>* ptr);

  void delete_tensortensortensortensortensortensortensor(std::tuple<at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor>* ptr);

  void delete_tensortensortensortensorint64int64int64int64tensor(std::tuple<at::Tensor,at::Tensor,at::Tensor,at::Tensor,int64_t,int64_t,int64_t,int64_t,at::Tensor,at::Tensor>* ptr);

  void delete_tensortensortensortensorlist(std::tuple<at::Tensor,at::Tensor,at::Tensor,std::vector<at::Tensor>>* ptr);

  void delete_tensortensortensortensorint64(std::tuple<at::Tensor,at::Tensor,at::Tensor,at::Tensor,int64_t>* ptr);

  void delete_tensortensortensor(std::tuple<at::Tensor,at::Tensor,at::Tensor>* ptr);

  void delete_tensortensortensortensor(std::tuple<at::Tensor,at::Tensor,at::Tensor,at::Tensor>* ptr);

  void delete_tensortensorcdoubleint64(std::tuple<at::Tensor,at::Tensor,double,int64_t>* ptr);

  void delete_tensortensorint64int64tensor(std::tuple<at::Tensor,at::Tensor,int64_t,int64_t,at::Tensor>* ptr);

  void delete_tensortensorint64int64tensortensor(std::tuple<at::Tensor,at::Tensor,int64_t,int64_t,at::Tensor,at::Tensor>* ptr);

  void delete_tensorlisttensor(std::tuple<std::vector<at::Tensor>,at::Tensor>* ptr);

  void delete_tensortensorlist(std::tuple<at::Tensor,std::vector<at::Tensor>>* ptr);

  void delete_tensortensorlisttensorlist(std::tuple<at::Tensor,std::vector<at::Tensor>,std::vector<at::Tensor>>* ptr);

  void delete_tensorlisttensorlisttensorlisttensorlisttensorlist(std::tuple<std::vector<at::Tensor>,std::vector<at::Tensor>,std::vector<at::Tensor>,std::vector<at::Tensor>,std::vector<at::Tensor>>* ptr);

  void delete_cdoubleint64(std::tuple<double,int64_t>* ptr);

  void delete_cdoublecdouble(std::tuple<double,double>* ptr);

  void delete_tensorgenerator(std::tuple<at::Tensor,at::Generator>* ptr);

  void delete_optimizer(torch::optim::Optimizer* ptr);

  void delete_stream(c10::Stream* ptr);

  void delete_arrayrefscalar(at::ArrayRef<at::Scalar>* ptr);

  void delete_vectorscalar(std::vector<at::Scalar>* ptr);

#include "hasktorch_dump.h"
};