{-# LANGUAGE DataKinds #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE FlexibleInstances #-}

module Torch.Internal.Unmanaged.Type.C10Tuple where


import qualified Language.C.Inline.Cpp as C
import qualified Language.C.Inline.Cpp.Unsafe as C
import qualified Language.C.Inline.Context as C
import qualified Language.C.Types as C
import qualified Data.Map as Map
import Foreign.C.String
import Foreign.C.Types
import Foreign
import Torch.Internal.Type


C.context $ C.cppCtx <> mempty { C.ctxTypesTable = typeTable }

C.include "<ATen/core/ivalue.h>"
C.include "<vector>"



newC10Tuple
  :: IO (Ptr (C10Ptr IVTuple))
newC10Tuple :: IO (Ptr (C10Ptr IVTuple))
newC10Tuple  =
  [C.throwBlock| c10::intrusive_ptr<at::ivalue::Tuple>* { return new c10::intrusive_ptr<at::ivalue::Tuple>(
    );
  }|]

newC10Tuple_tuple
  :: Ptr IValueList
  -> IO (Ptr (C10Ptr IVTuple))
newC10Tuple_tuple :: Ptr IValueList -> IO (Ptr (C10Ptr IVTuple))
newC10Tuple_tuple Ptr IValueList
_obj =
  [C.throwBlock| c10::intrusive_ptr<at::ivalue::Tuple>* { return new c10::intrusive_ptr<at::ivalue::Tuple>(
      at::ivalue::Tuple::create(*$(std::vector<at::IValue>* _obj))
    );
  }|]

c10Tuple_empty
  :: Ptr (C10Ptr IVTuple)
  -> IO (CBool)
c10Tuple_empty :: Ptr (C10Ptr IVTuple) -> IO CBool
c10Tuple_empty Ptr (C10Ptr IVTuple)
_obj =
  [C.throwBlock| bool { return (*$(c10::intrusive_ptr<at::ivalue::Tuple>* _obj))->elements().empty(
    );
  }|]

c10Tuple_size
  :: Ptr (C10Ptr IVTuple)
  -> IO (CSize)
c10Tuple_size :: Ptr (C10Ptr IVTuple) -> IO CSize
c10Tuple_size Ptr (C10Ptr IVTuple)
_obj =
  [C.throwBlock| size_t { return (*$(c10::intrusive_ptr<at::ivalue::Tuple>* _obj))->elements().size(
    );
  }|]

c10Tuple_at
  :: Ptr (C10Ptr IVTuple)
  -> CSize
  -> IO (Ptr IValue)
c10Tuple_at :: Ptr (C10Ptr IVTuple) -> CSize -> IO (Ptr IValue)
c10Tuple_at Ptr (C10Ptr IVTuple)
_obj CSize
_s =
  [C.throwBlock| at::IValue* { return new at::IValue((*$(c10::intrusive_ptr<at::ivalue::Tuple>* _obj))->elements()[$(size_t _s)]);
  }|]