{- |
Copyright  : Will Thompson, Iñaki García Etxebarria and Jonas Platte
License    : LGPL-2.1
Maintainer : Iñaki García Etxebarria (inaki@blueleaf.cc)

Represents a similarity metric.
-}

#define ENABLE_OVERLOADING (MIN_VERSION_haskell_gi_overloading(1,0,0) \
       && !defined(__HADDOCK_VERSION__))

module GI.Ggit.Structs.DiffSimilarityMetric
    (

-- * Exported types
    DiffSimilarityMetric(..)                ,
    noDiffSimilarityMetric                  ,


 -- * Methods
-- ** copy #method:copy#

#if ENABLE_OVERLOADING
    DiffSimilarityMetricCopyMethodInfo      ,
#endif
    diffSimilarityMetricCopy                ,


-- ** free #method:free#

#if ENABLE_OVERLOADING
    DiffSimilarityMetricFreeMethodInfo      ,
#endif
    diffSimilarityMetricFree                ,


-- ** new #method:new#

    diffSimilarityMetricNew                 ,




    ) where

import Data.GI.Base.ShortPrelude
import qualified Data.GI.Base.ShortPrelude as SP
import qualified Data.GI.Base.Overloading as O
import qualified Prelude as P

import qualified Data.GI.Base.Attributes as GI.Attributes
import qualified Data.GI.Base.ManagedPtr as B.ManagedPtr
import qualified Data.GI.Base.GClosure as B.GClosure
import qualified Data.GI.Base.GError as B.GError
import qualified Data.GI.Base.GVariant as B.GVariant
import qualified Data.GI.Base.GValue as B.GValue
import qualified Data.GI.Base.GParamSpec as B.GParamSpec
import qualified Data.GI.Base.CallStack as B.CallStack
import qualified Data.GI.Base.Properties as B.Properties
import qualified Data.Text as T
import qualified Data.ByteString.Char8 as B
import qualified Data.Map as Map
import qualified Foreign.Ptr as FP
import qualified GHC.OverloadedLabels as OL

import qualified GI.Ggit.Callbacks as Ggit.Callbacks

-- | Memory-managed wrapper type.
newtype DiffSimilarityMetric = DiffSimilarityMetric (ManagedPtr DiffSimilarityMetric)
foreign import ccall "ggit_diff_similarity_metric_get_type" c_ggit_diff_similarity_metric_get_type ::
    IO GType

instance BoxedObject DiffSimilarityMetric where
    boxedType _ = c_ggit_diff_similarity_metric_get_type

-- | A convenience alias for `Nothing` :: `Maybe` `DiffSimilarityMetric`.
noDiffSimilarityMetric :: Maybe DiffSimilarityMetric
noDiffSimilarityMetric = Nothing


#if ENABLE_OVERLOADING
instance O.HasAttributeList DiffSimilarityMetric
type instance O.AttributeList DiffSimilarityMetric = DiffSimilarityMetricAttributeList
type DiffSimilarityMetricAttributeList = ('[ ] :: [(Symbol, *)])
#endif

-- method DiffSimilarityMetric::new
-- method type : Constructor
-- Args : [Arg {argCName = "file_signature", argType = TInterface (Name {namespace = "Ggit", name = "DiffSimilarityMetricFileSignatureCallback"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GgitDiffSimilarityMetricFileSignature.", sinceVersion = Nothing}, argScope = ScopeTypeCall, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "buffer_signature", argType = TInterface (Name {namespace = "Ggit", name = "DiffSimilarityMetricBufferSignatureCallback"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GgitDiffSimilarityMetricBufferSignature.", sinceVersion = Nothing}, argScope = ScopeTypeCall, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "free_signature", argType = TInterface (Name {namespace = "Ggit", name = "DiffSimilarityMetricFreeSignatureCallback"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GgitDiffSimilarityMetricFreeSignature.", sinceVersion = Nothing}, argScope = ScopeTypeCall, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "similarity", argType = TInterface (Name {namespace = "Ggit", name = "DiffSimilarityMetricSimilarityCallback"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GgitDiffSimilarityMetricSimilarity.", sinceVersion = Nothing}, argScope = ScopeTypeCall, argClosure = 4, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "user_data", argType = TBasicType TPtr, direction = DirectionIn, mayBeNull = True, argDoc = Documentation {rawDocText = Just "passed as user_data to the previous parameters.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TInterface (Name {namespace = "Ggit", name = "DiffSimilarityMetric"}))
-- throws : False
-- Skip return : False

foreign import ccall "ggit_diff_similarity_metric_new" ggit_diff_similarity_metric_new ::
    FunPtr Ggit.Callbacks.C_DiffSimilarityMetricFileSignatureCallback -> -- file_signature : TInterface (Name {namespace = "Ggit", name = "DiffSimilarityMetricFileSignatureCallback"})
    FunPtr Ggit.Callbacks.C_DiffSimilarityMetricBufferSignatureCallback -> -- buffer_signature : TInterface (Name {namespace = "Ggit", name = "DiffSimilarityMetricBufferSignatureCallback"})
    FunPtr Ggit.Callbacks.C_DiffSimilarityMetricFreeSignatureCallback -> -- free_signature : TInterface (Name {namespace = "Ggit", name = "DiffSimilarityMetricFreeSignatureCallback"})
    FunPtr Ggit.Callbacks.C_DiffSimilarityMetricSimilarityCallback -> -- similarity : TInterface (Name {namespace = "Ggit", name = "DiffSimilarityMetricSimilarityCallback"})
    Ptr () ->                               -- user_data : TBasicType TPtr
    IO (Ptr DiffSimilarityMetric)

{- |
Creates a new 'GI.Ggit.Structs.DiffSimilarityMetric.DiffSimilarityMetric'.
-}
diffSimilarityMetricNew ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    Ggit.Callbacks.DiffSimilarityMetricFileSignatureCallback
    {- ^ /@fileSignature@/: a @/GgitDiffSimilarityMetricFileSignature/@. -}
    -> Ggit.Callbacks.DiffSimilarityMetricBufferSignatureCallback
    {- ^ /@bufferSignature@/: a @/GgitDiffSimilarityMetricBufferSignature/@. -}
    -> Ggit.Callbacks.DiffSimilarityMetricFreeSignatureCallback
    {- ^ /@freeSignature@/: a @/GgitDiffSimilarityMetricFreeSignature/@. -}
    -> Ggit.Callbacks.DiffSimilarityMetricSimilarityCallback
    {- ^ /@similarity@/: a @/GgitDiffSimilarityMetricSimilarity/@. -}
    -> m DiffSimilarityMetric
    {- ^ __Returns:__ a newly allocated 'GI.Ggit.Structs.DiffSimilarityMetric.DiffSimilarityMetric'. -}
diffSimilarityMetricNew fileSignature bufferSignature freeSignature similarity = liftIO $ do
    fileSignature' <- Ggit.Callbacks.mk_DiffSimilarityMetricFileSignatureCallback (Ggit.Callbacks.wrap_DiffSimilarityMetricFileSignatureCallback Nothing (Ggit.Callbacks.drop_closures_DiffSimilarityMetricFileSignatureCallback fileSignature))
    bufferSignature' <- Ggit.Callbacks.mk_DiffSimilarityMetricBufferSignatureCallback (Ggit.Callbacks.wrap_DiffSimilarityMetricBufferSignatureCallback Nothing (Ggit.Callbacks.drop_closures_DiffSimilarityMetricBufferSignatureCallback bufferSignature))
    freeSignature' <- Ggit.Callbacks.mk_DiffSimilarityMetricFreeSignatureCallback (Ggit.Callbacks.wrap_DiffSimilarityMetricFreeSignatureCallback Nothing (Ggit.Callbacks.drop_closures_DiffSimilarityMetricFreeSignatureCallback freeSignature))
    similarity' <- Ggit.Callbacks.mk_DiffSimilarityMetricSimilarityCallback (Ggit.Callbacks.wrap_DiffSimilarityMetricSimilarityCallback Nothing (Ggit.Callbacks.drop_closures_DiffSimilarityMetricSimilarityCallback similarity))
    let userData = nullPtr
    result <- ggit_diff_similarity_metric_new fileSignature' bufferSignature' freeSignature' similarity' userData
    checkUnexpectedReturnNULL "diffSimilarityMetricNew" result
    result' <- (wrapBoxed DiffSimilarityMetric) result
    safeFreeFunPtr $ castFunPtrToPtr fileSignature'
    safeFreeFunPtr $ castFunPtrToPtr bufferSignature'
    safeFreeFunPtr $ castFunPtrToPtr freeSignature'
    safeFreeFunPtr $ castFunPtrToPtr similarity'
    return result'

#if ENABLE_OVERLOADING
#endif

-- method DiffSimilarityMetric::copy
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "metric", argType = TInterface (Name {namespace = "Ggit", name = "DiffSimilarityMetric"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GgitDiffSimilarityMetric.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TInterface (Name {namespace = "Ggit", name = "DiffSimilarityMetric"}))
-- throws : False
-- Skip return : False

foreign import ccall "ggit_diff_similarity_metric_copy" ggit_diff_similarity_metric_copy ::
    Ptr DiffSimilarityMetric ->             -- metric : TInterface (Name {namespace = "Ggit", name = "DiffSimilarityMetric"})
    IO (Ptr DiffSimilarityMetric)

{- |
Copies /@metric@/ into a newly allocated 'GI.Ggit.Structs.DiffSimilarityMetric.DiffSimilarityMetric'.
-}
diffSimilarityMetricCopy ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    DiffSimilarityMetric
    {- ^ /@metric@/: a 'GI.Ggit.Structs.DiffSimilarityMetric.DiffSimilarityMetric'. -}
    -> m (Maybe DiffSimilarityMetric)
    {- ^ __Returns:__ a newly allocated 'GI.Ggit.Structs.DiffSimilarityMetric.DiffSimilarityMetric' or 'Nothing'. -}
diffSimilarityMetricCopy metric = liftIO $ do
    metric' <- unsafeManagedPtrGetPtr metric
    result <- ggit_diff_similarity_metric_copy metric'
    maybeResult <- convertIfNonNull result $ \result' -> do
        result'' <- (wrapBoxed DiffSimilarityMetric) result'
        return result''
    touchManagedPtr metric
    return maybeResult

#if ENABLE_OVERLOADING
data DiffSimilarityMetricCopyMethodInfo
instance (signature ~ (m (Maybe DiffSimilarityMetric)), MonadIO m) => O.MethodInfo DiffSimilarityMetricCopyMethodInfo DiffSimilarityMetric signature where
    overloadedMethod _ = diffSimilarityMetricCopy

#endif

-- method DiffSimilarityMetric::free
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "metric", argType = TInterface (Name {namespace = "Ggit", name = "DiffSimilarityMetric"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GgitDiffSimilarityMetric.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Nothing
-- throws : False
-- Skip return : False

foreign import ccall "ggit_diff_similarity_metric_free" ggit_diff_similarity_metric_free ::
    Ptr DiffSimilarityMetric ->             -- metric : TInterface (Name {namespace = "Ggit", name = "DiffSimilarityMetric"})
    IO ()

{- |
Frees /@metric@/.
-}
diffSimilarityMetricFree ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    DiffSimilarityMetric
    {- ^ /@metric@/: a 'GI.Ggit.Structs.DiffSimilarityMetric.DiffSimilarityMetric'. -}
    -> m ()
diffSimilarityMetricFree metric = liftIO $ do
    metric' <- unsafeManagedPtrGetPtr metric
    ggit_diff_similarity_metric_free metric'
    touchManagedPtr metric
    return ()

#if ENABLE_OVERLOADING
data DiffSimilarityMetricFreeMethodInfo
instance (signature ~ (m ()), MonadIO m) => O.MethodInfo DiffSimilarityMetricFreeMethodInfo DiffSimilarityMetric signature where
    overloadedMethod _ = diffSimilarityMetricFree

#endif

#if ENABLE_OVERLOADING
type family ResolveDiffSimilarityMetricMethod (t :: Symbol) (o :: *) :: * where
    ResolveDiffSimilarityMetricMethod "copy" o = DiffSimilarityMetricCopyMethodInfo
    ResolveDiffSimilarityMetricMethod "free" o = DiffSimilarityMetricFreeMethodInfo
    ResolveDiffSimilarityMetricMethod l o = O.MethodResolutionFailed l o

instance (info ~ ResolveDiffSimilarityMetricMethod t DiffSimilarityMetric, O.MethodInfo info DiffSimilarityMetric p) => OL.IsLabel t (DiffSimilarityMetric -> p) where
#if MIN_VERSION_base(4,10,0)
    fromLabel = O.overloadedMethod (O.MethodProxy :: O.MethodProxy info)
#else
    fromLabel _ = O.overloadedMethod (O.MethodProxy :: O.MethodProxy info)
#endif

#endif