{-# LANGUAGE TypeApplications #-}


-- | Copyright  : Will Thompson, Iñaki García Etxebarria and Jonas Platte
-- License    : LGPL-2.1
-- Maintainer : Iñaki García Etxebarria
-- 
-- Represents a similarity metric.

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

module GI.Ggit.Structs.DiffSimilarityMetric
    (

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


 -- * Methods
-- ** Overloaded methods #method:Overloaded methods#

#if defined(ENABLE_OVERLOADING)
    ResolveDiffSimilarityMetricMethod       ,
#endif


-- ** copy #method:copy#

#if defined(ENABLE_OVERLOADING)
    DiffSimilarityMetricCopyMethodInfo      ,
#endif
    diffSimilarityMetricCopy                ,


-- ** free #method:free#

#if defined(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.GI.Base.Signals as B.Signals
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)
    deriving (Eq)
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

-- | Convert 'DiffSimilarityMetric' to and from 'Data.GI.Base.GValue.GValue' with 'Data.GI.Base.GValue.toGValue' and 'Data.GI.Base.GValue.fromGValue'.
instance B.GValue.IsGValue DiffSimilarityMetric where
    toGValue o = do
        gtype <- c_ggit_diff_similarity_metric_get_type
        B.ManagedPtr.withManagedPtr o (B.GValue.buildGValue gtype B.GValue.set_boxed)

    fromGValue gv = do
        ptr <- B.GValue.get_boxed gv :: IO (Ptr DiffSimilarityMetric)
        B.ManagedPtr.newBoxed DiffSimilarityMetric ptr



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


#if defined(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 t'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 t'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 defined(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 t'GI.Ggit.Structs.DiffSimilarityMetric.DiffSimilarityMetric'.
diffSimilarityMetricCopy ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    DiffSimilarityMetric
    -- ^ /@metric@/: a t'GI.Ggit.Structs.DiffSimilarityMetric.DiffSimilarityMetric'.
    -> m (Maybe DiffSimilarityMetric)
    -- ^ __Returns:__ a newly allocated t'GI.Ggit.Structs.DiffSimilarityMetric.DiffSimilarityMetric' or 'P.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 defined(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 t'GI.Ggit.Structs.DiffSimilarityMetric.DiffSimilarityMetric'.
    -> m ()
diffSimilarityMetricFree metric = liftIO $ do
    metric' <- unsafeManagedPtrGetPtr metric
    ggit_diff_similarity_metric_free metric'
    touchManagedPtr metric
    return ()

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

#endif

#if defined(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 @info
#else
    fromLabel _ = O.overloadedMethod @info
#endif

#endif