Add tree example
This commit is contained in:
parent
06767e17ea
commit
55a781eeb8
@ -3,10 +3,12 @@
|
|||||||
module GarnetRs.Wrapped (
|
module GarnetRs.Wrapped (
|
||||||
T (..),
|
T (..),
|
||||||
Shape (..),
|
Shape (..),
|
||||||
|
BTree (..),
|
||||||
hello,
|
hello,
|
||||||
helloStruct,
|
helloStruct,
|
||||||
helloShape,
|
helloShape,
|
||||||
add,
|
add,
|
||||||
|
sumTree,
|
||||||
) where
|
) where
|
||||||
|
|
||||||
import Data.ByteString
|
import Data.ByteString
|
||||||
@ -32,6 +34,25 @@ convertShape = \case
|
|||||||
Circle r -> Raw.Shape Raw.Circle $ Raw.set_shape_body_circle $ Raw.Circle_Body r
|
Circle r -> Raw.Shape Raw.Circle $ Raw.set_shape_body_circle $ Raw.Circle_Body r
|
||||||
Rectangle w h -> Raw.Shape Raw.Rectangle $ Raw.set_shape_body_rectangle $ Raw.Rectangle_Body w h
|
Rectangle w h -> Raw.Shape Raw.Rectangle $ Raw.set_shape_body_rectangle $ Raw.Rectangle_Body w h
|
||||||
|
|
||||||
|
data BTree a
|
||||||
|
= Leaf a
|
||||||
|
| Fork (BTree a) (BTree a)
|
||||||
|
withBTree :: BTree Int64 -> (Raw.BTree -> IO a) -> IO a
|
||||||
|
withBTree = flip \f -> \case
|
||||||
|
Leaf v ->
|
||||||
|
f $ Raw.BTree Raw.Leaf $ Raw.set_bTree_body_leaf $ Raw.Leaf_Body v
|
||||||
|
Fork l r ->
|
||||||
|
withBTree l \lRaw ->
|
||||||
|
withBTree r \rRaw ->
|
||||||
|
alloca \lPtr ->
|
||||||
|
alloca \rPtr -> do
|
||||||
|
poke lPtr lRaw
|
||||||
|
poke rPtr rRaw
|
||||||
|
f
|
||||||
|
. Raw.BTree Raw.Fork
|
||||||
|
. Raw.set_bTree_body_fork
|
||||||
|
$ Raw.Fork_Body (unsafeFromPtr lPtr) (unsafeFromPtr rPtr)
|
||||||
|
|
||||||
hello :: ByteString -> IO ()
|
hello :: ByteString -> IO ()
|
||||||
hello s = useAsCString s $ Raw.hello . unsafeFromPtr
|
hello s = useAsCString s $ Raw.hello . unsafeFromPtr
|
||||||
|
|
||||||
@ -43,3 +64,6 @@ helloShape = Raw.hello_shape . convertShape
|
|||||||
|
|
||||||
add :: Int64 -> Int64 -> Int64
|
add :: Int64 -> Int64 -> Int64
|
||||||
add = Raw.add
|
add = Raw.add
|
||||||
|
|
||||||
|
sumTree :: BTree Int64 -> IO Int64
|
||||||
|
sumTree = flip withBTree Raw.sum_tree
|
||||||
|
|||||||
@ -10,3 +10,4 @@ main = do
|
|||||||
helloShape $ Circle 3.14
|
helloShape $ Circle 3.14
|
||||||
helloShape $ Rectangle 10.0 5.0
|
helloShape $ Rectangle 10.0 5.0
|
||||||
putStrLn $ "3 + 4 = " <> show (add 3 4)
|
putStrLn $ "3 + 4 = " <> show (add 3 4)
|
||||||
|
putStrLn . ("Tree sum: " <>) . show =<< sumTree (Fork (Fork (Leaf 1) (Fork (Leaf 2) (Leaf 3))) (Leaf 4))
|
||||||
|
|||||||
@ -34,6 +34,7 @@ import qualified HsBindgen.Runtime.Internal.HasFFIType
|
|||||||
import qualified HsBindgen.Runtime.Internal.SizedByteArray
|
import qualified HsBindgen.Runtime.Internal.SizedByteArray
|
||||||
import qualified HsBindgen.Runtime.LibC
|
import qualified HsBindgen.Runtime.LibC
|
||||||
import qualified HsBindgen.Runtime.Marshal
|
import qualified HsBindgen.Runtime.Marshal
|
||||||
|
import qualified HsBindgen.Runtime.PtrConst
|
||||||
import qualified Text.Read
|
import qualified Text.Read
|
||||||
import HsBindgen.Runtime.Internal.TypeEquality (TyEq)
|
import HsBindgen.Runtime.Internal.TypeEquality (TyEq)
|
||||||
import Prelude ((<*>), (>>), Eq, Int, Ord, Read, Show, pure, showsPrec)
|
import Prelude ((<*>), (>>), Eq, Int, Ord, Read, Show, pure, showsPrec)
|
||||||
@ -524,3 +525,417 @@ instance ( TyEq ty ((HsBindgen.Runtime.HasCField.CFieldType Shape) "body")
|
|||||||
|
|
||||||
getField =
|
getField =
|
||||||
HsBindgen.Runtime.HasCField.fromPtr (Data.Proxy.Proxy @"body")
|
HsBindgen.Runtime.HasCField.fromPtr (Data.Proxy.Proxy @"body")
|
||||||
|
|
||||||
|
{-| __C declaration:__ @enum BTree_Tag@
|
||||||
|
|
||||||
|
__defined at:__ @garnet_rs.h 33:6@
|
||||||
|
|
||||||
|
__exported by:__ @garnet_rs.h@
|
||||||
|
-}
|
||||||
|
newtype BTree_Tag = BTree_Tag
|
||||||
|
{ unwrap :: FC.CUInt
|
||||||
|
}
|
||||||
|
deriving stock (GHC.Generics.Generic)
|
||||||
|
deriving stock (Eq, Ord)
|
||||||
|
deriving newtype (HsBindgen.Runtime.Internal.HasFFIType.HasFFIType)
|
||||||
|
|
||||||
|
instance HsBindgen.Runtime.Marshal.StaticSize BTree_Tag where
|
||||||
|
|
||||||
|
staticSizeOf = \_ -> (4 :: Int)
|
||||||
|
|
||||||
|
staticAlignment = \_ -> (4 :: Int)
|
||||||
|
|
||||||
|
instance HsBindgen.Runtime.Marshal.ReadRaw BTree_Tag where
|
||||||
|
|
||||||
|
readRaw =
|
||||||
|
\ptr0 ->
|
||||||
|
pure BTree_Tag
|
||||||
|
<*> HsBindgen.Runtime.Marshal.readRawByteOff ptr0 (0 :: Int)
|
||||||
|
|
||||||
|
instance HsBindgen.Runtime.Marshal.WriteRaw BTree_Tag where
|
||||||
|
|
||||||
|
writeRaw =
|
||||||
|
\ptr0 ->
|
||||||
|
\s1 ->
|
||||||
|
case s1 of
|
||||||
|
BTree_Tag unwrap2 ->
|
||||||
|
HsBindgen.Runtime.Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
|
||||||
|
|
||||||
|
deriving via HsBindgen.Runtime.Marshal.EquivStorable BTree_Tag instance F.Storable BTree_Tag
|
||||||
|
|
||||||
|
deriving via FC.CUInt instance Data.Primitive.Types.Prim BTree_Tag
|
||||||
|
|
||||||
|
instance HsBindgen.Runtime.CEnum.CEnum BTree_Tag where
|
||||||
|
|
||||||
|
type CEnumZ BTree_Tag = FC.CUInt
|
||||||
|
|
||||||
|
toCEnum = BTree_Tag
|
||||||
|
|
||||||
|
fromCEnum = GHC.Records.getField @"unwrap"
|
||||||
|
|
||||||
|
declaredValues =
|
||||||
|
\_ ->
|
||||||
|
HsBindgen.Runtime.CEnum.declaredValuesFromList [ (0, Data.List.NonEmpty.singleton "Leaf")
|
||||||
|
, (1, Data.List.NonEmpty.singleton "Fork")
|
||||||
|
]
|
||||||
|
|
||||||
|
showsUndeclared =
|
||||||
|
HsBindgen.Runtime.CEnum.showsWrappedUndeclared "BTree_Tag"
|
||||||
|
|
||||||
|
readPrecUndeclared =
|
||||||
|
HsBindgen.Runtime.CEnum.readPrecWrappedUndeclared "BTree_Tag"
|
||||||
|
|
||||||
|
isDeclared = HsBindgen.Runtime.CEnum.seqIsDeclared
|
||||||
|
|
||||||
|
mkDeclared = HsBindgen.Runtime.CEnum.seqMkDeclared
|
||||||
|
|
||||||
|
instance HsBindgen.Runtime.CEnum.SequentialCEnum BTree_Tag where
|
||||||
|
|
||||||
|
minDeclaredValue = Leaf
|
||||||
|
|
||||||
|
maxDeclaredValue = Fork
|
||||||
|
|
||||||
|
instance Show BTree_Tag where
|
||||||
|
|
||||||
|
showsPrec = HsBindgen.Runtime.CEnum.shows
|
||||||
|
|
||||||
|
instance Read BTree_Tag where
|
||||||
|
|
||||||
|
readPrec = HsBindgen.Runtime.CEnum.readPrec
|
||||||
|
|
||||||
|
readList = Text.Read.readListDefault
|
||||||
|
|
||||||
|
readListPrec = Text.Read.readListPrecDefault
|
||||||
|
|
||||||
|
instance ( TyEq ty ((HsBindgen.Runtime.HasCField.CFieldType BTree_Tag) "unwrap")
|
||||||
|
) => GHC.Records.HasField "unwrap" (Ptr.Ptr BTree_Tag) (Ptr.Ptr ty) where
|
||||||
|
|
||||||
|
getField =
|
||||||
|
HsBindgen.Runtime.HasCField.fromPtr (Data.Proxy.Proxy @"unwrap")
|
||||||
|
|
||||||
|
instance HsBindgen.Runtime.HasCField.HasCField BTree_Tag "unwrap" where
|
||||||
|
|
||||||
|
type CFieldType BTree_Tag "unwrap" = FC.CUInt
|
||||||
|
|
||||||
|
offset# = \_ -> \_ -> 0
|
||||||
|
|
||||||
|
{-| __C declaration:__ @Leaf@
|
||||||
|
|
||||||
|
__defined at:__ @garnet_rs.h 34:3@
|
||||||
|
|
||||||
|
__exported by:__ @garnet_rs.h@
|
||||||
|
-}
|
||||||
|
pattern Leaf :: BTree_Tag
|
||||||
|
pattern Leaf = BTree_Tag 0
|
||||||
|
|
||||||
|
{-| __C declaration:__ @Fork@
|
||||||
|
|
||||||
|
__defined at:__ @garnet_rs.h 35:3@
|
||||||
|
|
||||||
|
__exported by:__ @garnet_rs.h@
|
||||||
|
-}
|
||||||
|
pattern Fork :: BTree_Tag
|
||||||
|
pattern Fork = BTree_Tag 1
|
||||||
|
|
||||||
|
{-| __C declaration:__ @struct Leaf_Body@
|
||||||
|
|
||||||
|
__defined at:__ @garnet_rs.h 38:8@
|
||||||
|
|
||||||
|
__exported by:__ @garnet_rs.h@
|
||||||
|
-}
|
||||||
|
data Leaf_Body = Leaf_Body
|
||||||
|
{ value :: HsBindgen.Runtime.LibC.Int64
|
||||||
|
{- ^ __C declaration:__ @value@
|
||||||
|
|
||||||
|
__defined at:__ @garnet_rs.h 39:11@
|
||||||
|
|
||||||
|
__exported by:__ @garnet_rs.h@
|
||||||
|
-}
|
||||||
|
}
|
||||||
|
deriving stock (GHC.Generics.Generic)
|
||||||
|
deriving stock (Eq, Show)
|
||||||
|
|
||||||
|
instance HsBindgen.Runtime.Marshal.StaticSize Leaf_Body where
|
||||||
|
|
||||||
|
staticSizeOf = \_ -> (8 :: Int)
|
||||||
|
|
||||||
|
staticAlignment = \_ -> (8 :: Int)
|
||||||
|
|
||||||
|
instance HsBindgen.Runtime.Marshal.ReadRaw Leaf_Body where
|
||||||
|
|
||||||
|
readRaw =
|
||||||
|
\ptr0 ->
|
||||||
|
pure Leaf_Body
|
||||||
|
<*> HsBindgen.Runtime.HasCField.readRaw (Data.Proxy.Proxy @"value") ptr0
|
||||||
|
|
||||||
|
instance HsBindgen.Runtime.Marshal.WriteRaw Leaf_Body where
|
||||||
|
|
||||||
|
writeRaw =
|
||||||
|
\ptr0 ->
|
||||||
|
\s1 ->
|
||||||
|
case s1 of
|
||||||
|
Leaf_Body value2 ->
|
||||||
|
HsBindgen.Runtime.HasCField.writeRaw (Data.Proxy.Proxy @"value") ptr0 value2
|
||||||
|
|
||||||
|
deriving via HsBindgen.Runtime.Marshal.EquivStorable Leaf_Body instance F.Storable Leaf_Body
|
||||||
|
|
||||||
|
instance HsBindgen.Runtime.HasCField.HasCField Leaf_Body "value" where
|
||||||
|
|
||||||
|
type CFieldType Leaf_Body "value" =
|
||||||
|
HsBindgen.Runtime.LibC.Int64
|
||||||
|
|
||||||
|
offset# = \_ -> \_ -> 0
|
||||||
|
|
||||||
|
instance ( TyEq ty ((HsBindgen.Runtime.HasCField.CFieldType Leaf_Body) "value")
|
||||||
|
) => GHC.Records.HasField "value" (Ptr.Ptr Leaf_Body) (Ptr.Ptr ty) where
|
||||||
|
|
||||||
|
getField =
|
||||||
|
HsBindgen.Runtime.HasCField.fromPtr (Data.Proxy.Proxy @"value")
|
||||||
|
|
||||||
|
{-| __C declaration:__ @struct Fork_Body@
|
||||||
|
|
||||||
|
__defined at:__ @garnet_rs.h 42:8@
|
||||||
|
|
||||||
|
__exported by:__ @garnet_rs.h@
|
||||||
|
-}
|
||||||
|
data Fork_Body = Fork_Body
|
||||||
|
{ left :: HsBindgen.Runtime.PtrConst.PtrConst BTree
|
||||||
|
{- ^ __C declaration:__ @left@
|
||||||
|
|
||||||
|
__defined at:__ @garnet_rs.h 43:23@
|
||||||
|
|
||||||
|
__exported by:__ @garnet_rs.h@
|
||||||
|
-}
|
||||||
|
, right :: HsBindgen.Runtime.PtrConst.PtrConst BTree
|
||||||
|
{- ^ __C declaration:__ @right@
|
||||||
|
|
||||||
|
__defined at:__ @garnet_rs.h 44:23@
|
||||||
|
|
||||||
|
__exported by:__ @garnet_rs.h@
|
||||||
|
-}
|
||||||
|
}
|
||||||
|
deriving stock (GHC.Generics.Generic)
|
||||||
|
deriving stock (Eq, Show)
|
||||||
|
|
||||||
|
instance HsBindgen.Runtime.Marshal.StaticSize Fork_Body where
|
||||||
|
|
||||||
|
staticSizeOf = \_ -> (16 :: Int)
|
||||||
|
|
||||||
|
staticAlignment = \_ -> (8 :: Int)
|
||||||
|
|
||||||
|
instance HsBindgen.Runtime.Marshal.ReadRaw Fork_Body where
|
||||||
|
|
||||||
|
readRaw =
|
||||||
|
\ptr0 ->
|
||||||
|
pure Fork_Body
|
||||||
|
<*> HsBindgen.Runtime.HasCField.readRaw (Data.Proxy.Proxy @"left") ptr0
|
||||||
|
<*> HsBindgen.Runtime.HasCField.readRaw (Data.Proxy.Proxy @"right") ptr0
|
||||||
|
|
||||||
|
instance HsBindgen.Runtime.Marshal.WriteRaw Fork_Body where
|
||||||
|
|
||||||
|
writeRaw =
|
||||||
|
\ptr0 ->
|
||||||
|
\s1 ->
|
||||||
|
case s1 of
|
||||||
|
Fork_Body left2 right3 ->
|
||||||
|
HsBindgen.Runtime.HasCField.writeRaw (Data.Proxy.Proxy @"left") ptr0 left2
|
||||||
|
>> HsBindgen.Runtime.HasCField.writeRaw (Data.Proxy.Proxy @"right") ptr0 right3
|
||||||
|
|
||||||
|
deriving via HsBindgen.Runtime.Marshal.EquivStorable Fork_Body instance F.Storable Fork_Body
|
||||||
|
|
||||||
|
instance HsBindgen.Runtime.HasCField.HasCField Fork_Body "left" where
|
||||||
|
|
||||||
|
type CFieldType Fork_Body "left" =
|
||||||
|
HsBindgen.Runtime.PtrConst.PtrConst BTree
|
||||||
|
|
||||||
|
offset# = \_ -> \_ -> 0
|
||||||
|
|
||||||
|
instance ( TyEq ty ((HsBindgen.Runtime.HasCField.CFieldType Fork_Body) "left")
|
||||||
|
) => GHC.Records.HasField "left" (Ptr.Ptr Fork_Body) (Ptr.Ptr ty) where
|
||||||
|
|
||||||
|
getField =
|
||||||
|
HsBindgen.Runtime.HasCField.fromPtr (Data.Proxy.Proxy @"left")
|
||||||
|
|
||||||
|
instance HsBindgen.Runtime.HasCField.HasCField Fork_Body "right" where
|
||||||
|
|
||||||
|
type CFieldType Fork_Body "right" =
|
||||||
|
HsBindgen.Runtime.PtrConst.PtrConst BTree
|
||||||
|
|
||||||
|
offset# = \_ -> \_ -> 8
|
||||||
|
|
||||||
|
instance ( TyEq ty ((HsBindgen.Runtime.HasCField.CFieldType Fork_Body) "right")
|
||||||
|
) => GHC.Records.HasField "right" (Ptr.Ptr Fork_Body) (Ptr.Ptr ty) where
|
||||||
|
|
||||||
|
getField =
|
||||||
|
HsBindgen.Runtime.HasCField.fromPtr (Data.Proxy.Proxy @"right")
|
||||||
|
|
||||||
|
{-| __C declaration:__ @union \@BTree_body@
|
||||||
|
|
||||||
|
__defined at:__ @garnet_rs.h 49:3@
|
||||||
|
|
||||||
|
__exported by:__ @garnet_rs.h@
|
||||||
|
-}
|
||||||
|
newtype BTree_body = BTree_body
|
||||||
|
{ unwrap :: Data.Array.Byte.ByteArray
|
||||||
|
}
|
||||||
|
deriving stock (GHC.Generics.Generic)
|
||||||
|
|
||||||
|
deriving via (HsBindgen.Runtime.Internal.SizedByteArray.SizedByteArray 16) 8 instance HsBindgen.Runtime.Marshal.StaticSize BTree_body
|
||||||
|
|
||||||
|
deriving via (HsBindgen.Runtime.Internal.SizedByteArray.SizedByteArray 16) 8 instance HsBindgen.Runtime.Marshal.ReadRaw BTree_body
|
||||||
|
|
||||||
|
deriving via (HsBindgen.Runtime.Internal.SizedByteArray.SizedByteArray 16) 8 instance HsBindgen.Runtime.Marshal.WriteRaw BTree_body
|
||||||
|
|
||||||
|
deriving via HsBindgen.Runtime.Marshal.EquivStorable BTree_body instance F.Storable BTree_body
|
||||||
|
|
||||||
|
{-|
|
||||||
|
|
||||||
|
__See:__ 'set_bTree_body_leaf'
|
||||||
|
|
||||||
|
__C declaration:__ @leaf@
|
||||||
|
|
||||||
|
__defined at:__ @garnet_rs.h 50:22@
|
||||||
|
|
||||||
|
__exported by:__ @garnet_rs.h@
|
||||||
|
-}
|
||||||
|
get_bTree_body_leaf ::
|
||||||
|
BTree_body
|
||||||
|
-> Leaf_Body
|
||||||
|
get_bTree_body_leaf =
|
||||||
|
HsBindgen.Runtime.Internal.ByteArray.getUnionPayload
|
||||||
|
|
||||||
|
{-|
|
||||||
|
|
||||||
|
__See:__ 'get_bTree_body_leaf'
|
||||||
|
|
||||||
|
-}
|
||||||
|
set_bTree_body_leaf ::
|
||||||
|
Leaf_Body
|
||||||
|
-> BTree_body
|
||||||
|
set_bTree_body_leaf =
|
||||||
|
HsBindgen.Runtime.Internal.ByteArray.setUnionPayload
|
||||||
|
|
||||||
|
{-|
|
||||||
|
|
||||||
|
__See:__ 'set_bTree_body_fork'
|
||||||
|
|
||||||
|
__C declaration:__ @fork@
|
||||||
|
|
||||||
|
__defined at:__ @garnet_rs.h 51:22@
|
||||||
|
|
||||||
|
__exported by:__ @garnet_rs.h@
|
||||||
|
-}
|
||||||
|
get_bTree_body_fork ::
|
||||||
|
BTree_body
|
||||||
|
-> Fork_Body
|
||||||
|
get_bTree_body_fork =
|
||||||
|
HsBindgen.Runtime.Internal.ByteArray.getUnionPayload
|
||||||
|
|
||||||
|
{-|
|
||||||
|
|
||||||
|
__See:__ 'get_bTree_body_fork'
|
||||||
|
|
||||||
|
-}
|
||||||
|
set_bTree_body_fork ::
|
||||||
|
Fork_Body
|
||||||
|
-> BTree_body
|
||||||
|
set_bTree_body_fork =
|
||||||
|
HsBindgen.Runtime.Internal.ByteArray.setUnionPayload
|
||||||
|
|
||||||
|
instance HsBindgen.Runtime.HasCField.HasCField BTree_body "leaf" where
|
||||||
|
|
||||||
|
type CFieldType BTree_body "leaf" = Leaf_Body
|
||||||
|
|
||||||
|
offset# = \_ -> \_ -> 0
|
||||||
|
|
||||||
|
instance ( TyEq ty ((HsBindgen.Runtime.HasCField.CFieldType BTree_body) "leaf")
|
||||||
|
) => GHC.Records.HasField "leaf" (Ptr.Ptr BTree_body) (Ptr.Ptr ty) where
|
||||||
|
|
||||||
|
getField =
|
||||||
|
HsBindgen.Runtime.HasCField.fromPtr (Data.Proxy.Proxy @"leaf")
|
||||||
|
|
||||||
|
instance HsBindgen.Runtime.HasCField.HasCField BTree_body "fork" where
|
||||||
|
|
||||||
|
type CFieldType BTree_body "fork" = Fork_Body
|
||||||
|
|
||||||
|
offset# = \_ -> \_ -> 0
|
||||||
|
|
||||||
|
instance ( TyEq ty ((HsBindgen.Runtime.HasCField.CFieldType BTree_body) "fork")
|
||||||
|
) => GHC.Records.HasField "fork" (Ptr.Ptr BTree_body) (Ptr.Ptr ty) where
|
||||||
|
|
||||||
|
getField =
|
||||||
|
HsBindgen.Runtime.HasCField.fromPtr (Data.Proxy.Proxy @"fork")
|
||||||
|
|
||||||
|
{-| __C declaration:__ @struct BTree@
|
||||||
|
|
||||||
|
__defined at:__ @garnet_rs.h 47:8@
|
||||||
|
|
||||||
|
__exported by:__ @garnet_rs.h@
|
||||||
|
-}
|
||||||
|
data BTree = BTree
|
||||||
|
{ tag :: BTree_Tag
|
||||||
|
{- ^ __C declaration:__ @tag@
|
||||||
|
|
||||||
|
__defined at:__ @garnet_rs.h 48:18@
|
||||||
|
|
||||||
|
__exported by:__ @garnet_rs.h@
|
||||||
|
-}
|
||||||
|
, body :: BTree_body
|
||||||
|
{- ^ __C declaration:__ @body@
|
||||||
|
|
||||||
|
__defined at:__ @garnet_rs.h 52:5@
|
||||||
|
|
||||||
|
__exported by:__ @garnet_rs.h@
|
||||||
|
-}
|
||||||
|
}
|
||||||
|
deriving stock (GHC.Generics.Generic)
|
||||||
|
|
||||||
|
instance HsBindgen.Runtime.Marshal.StaticSize BTree where
|
||||||
|
|
||||||
|
staticSizeOf = \_ -> (24 :: Int)
|
||||||
|
|
||||||
|
staticAlignment = \_ -> (8 :: Int)
|
||||||
|
|
||||||
|
instance HsBindgen.Runtime.Marshal.ReadRaw BTree where
|
||||||
|
|
||||||
|
readRaw =
|
||||||
|
\ptr0 ->
|
||||||
|
pure BTree
|
||||||
|
<*> HsBindgen.Runtime.HasCField.readRaw (Data.Proxy.Proxy @"tag") ptr0
|
||||||
|
<*> HsBindgen.Runtime.HasCField.readRaw (Data.Proxy.Proxy @"body") ptr0
|
||||||
|
|
||||||
|
instance HsBindgen.Runtime.Marshal.WriteRaw BTree where
|
||||||
|
|
||||||
|
writeRaw =
|
||||||
|
\ptr0 ->
|
||||||
|
\s1 ->
|
||||||
|
case s1 of
|
||||||
|
BTree tag2 body3 ->
|
||||||
|
HsBindgen.Runtime.HasCField.writeRaw (Data.Proxy.Proxy @"tag") ptr0 tag2
|
||||||
|
>> HsBindgen.Runtime.HasCField.writeRaw (Data.Proxy.Proxy @"body") ptr0 body3
|
||||||
|
|
||||||
|
deriving via HsBindgen.Runtime.Marshal.EquivStorable BTree instance F.Storable BTree
|
||||||
|
|
||||||
|
instance HsBindgen.Runtime.HasCField.HasCField BTree "tag" where
|
||||||
|
|
||||||
|
type CFieldType BTree "tag" = BTree_Tag
|
||||||
|
|
||||||
|
offset# = \_ -> \_ -> 0
|
||||||
|
|
||||||
|
instance ( TyEq ty ((HsBindgen.Runtime.HasCField.CFieldType BTree) "tag")
|
||||||
|
) => GHC.Records.HasField "tag" (Ptr.Ptr BTree) (Ptr.Ptr ty) where
|
||||||
|
|
||||||
|
getField =
|
||||||
|
HsBindgen.Runtime.HasCField.fromPtr (Data.Proxy.Proxy @"tag")
|
||||||
|
|
||||||
|
instance HsBindgen.Runtime.HasCField.HasCField BTree "body" where
|
||||||
|
|
||||||
|
type CFieldType BTree "body" = BTree_body
|
||||||
|
|
||||||
|
offset# = \_ -> \_ -> 8
|
||||||
|
|
||||||
|
instance ( TyEq ty ((HsBindgen.Runtime.HasCField.CFieldType BTree) "body")
|
||||||
|
) => GHC.Records.HasField "body" (Ptr.Ptr BTree) (Ptr.Ptr ty) where
|
||||||
|
|
||||||
|
getField =
|
||||||
|
HsBindgen.Runtime.HasCField.fromPtr (Data.Proxy.Proxy @"body")
|
||||||
|
|||||||
@ -51,6 +51,14 @@ $(HsBindgen.Runtime.Internal.CAPI.addCSource (HsBindgen.Runtime.Internal.CAPI.un
|
|||||||
, "{"
|
, "{"
|
||||||
, " return &add;"
|
, " return &add;"
|
||||||
, "}"
|
, "}"
|
||||||
|
, "/* com_garnet_GarnetRs_get_sum_tree */"
|
||||||
|
, "__attribute__ ((const))"
|
||||||
|
, "int64_t (*hs_bindgen_473a3e791275b06d (void)) ("
|
||||||
|
, " struct BTree arg1"
|
||||||
|
, ")"
|
||||||
|
, "{"
|
||||||
|
, " return &sum_tree;"
|
||||||
|
, "}"
|
||||||
]))
|
]))
|
||||||
|
|
||||||
-- __unique:__ @com_garnet_GarnetRs_get_hello@
|
-- __unique:__ @com_garnet_GarnetRs_get_hello@
|
||||||
@ -65,7 +73,7 @@ hs_bindgen_faf62265b53521d3 =
|
|||||||
{-# NOINLINE hello #-}
|
{-# NOINLINE hello #-}
|
||||||
{-| __C declaration:__ @hello@
|
{-| __C declaration:__ @hello@
|
||||||
|
|
||||||
__defined at:__ @garnet_rs.h 33:6@
|
__defined at:__ @garnet_rs.h 55:6@
|
||||||
|
|
||||||
__exported by:__ @garnet_rs.h@
|
__exported by:__ @garnet_rs.h@
|
||||||
-}
|
-}
|
||||||
@ -85,7 +93,7 @@ hs_bindgen_0f8c37ef19b17a6d =
|
|||||||
{-# NOINLINE hello_struct #-}
|
{-# NOINLINE hello_struct #-}
|
||||||
{-| __C declaration:__ @hello_struct@
|
{-| __C declaration:__ @hello_struct@
|
||||||
|
|
||||||
__defined at:__ @garnet_rs.h 35:6@
|
__defined at:__ @garnet_rs.h 57:6@
|
||||||
|
|
||||||
__exported by:__ @garnet_rs.h@
|
__exported by:__ @garnet_rs.h@
|
||||||
-}
|
-}
|
||||||
@ -105,7 +113,7 @@ hs_bindgen_287ff3ac660f333b =
|
|||||||
{-# NOINLINE hello_shape #-}
|
{-# NOINLINE hello_shape #-}
|
||||||
{-| __C declaration:__ @hello_shape@
|
{-| __C declaration:__ @hello_shape@
|
||||||
|
|
||||||
__defined at:__ @garnet_rs.h 37:6@
|
__defined at:__ @garnet_rs.h 59:6@
|
||||||
|
|
||||||
__exported by:__ @garnet_rs.h@
|
__exported by:__ @garnet_rs.h@
|
||||||
-}
|
-}
|
||||||
@ -125,10 +133,30 @@ hs_bindgen_bbabdbe61cd1eeb2 =
|
|||||||
{-# NOINLINE add #-}
|
{-# NOINLINE add #-}
|
||||||
{-| __C declaration:__ @add@
|
{-| __C declaration:__ @add@
|
||||||
|
|
||||||
__defined at:__ @garnet_rs.h 39:32@
|
__defined at:__ @garnet_rs.h 61:32@
|
||||||
|
|
||||||
__exported by:__ @garnet_rs.h@
|
__exported by:__ @garnet_rs.h@
|
||||||
-}
|
-}
|
||||||
add :: Ptr.FunPtr (HsBindgen.Runtime.LibC.Int64 -> HsBindgen.Runtime.LibC.Int64 -> IO HsBindgen.Runtime.LibC.Int64)
|
add :: Ptr.FunPtr (HsBindgen.Runtime.LibC.Int64 -> HsBindgen.Runtime.LibC.Int64 -> IO HsBindgen.Runtime.LibC.Int64)
|
||||||
add =
|
add =
|
||||||
GHC.IO.Unsafe.unsafePerformIO hs_bindgen_bbabdbe61cd1eeb2
|
GHC.IO.Unsafe.unsafePerformIO hs_bindgen_bbabdbe61cd1eeb2
|
||||||
|
|
||||||
|
-- __unique:__ @com_garnet_GarnetRs_get_sum_tree@
|
||||||
|
foreign import ccall unsafe "hs_bindgen_473a3e791275b06d" hs_bindgen_473a3e791275b06d_base ::
|
||||||
|
IO (Ptr.FunPtr Void)
|
||||||
|
|
||||||
|
-- __unique:__ @com_garnet_GarnetRs_get_sum_tree@
|
||||||
|
hs_bindgen_473a3e791275b06d :: IO (Ptr.FunPtr (BTree -> IO HsBindgen.Runtime.LibC.Int64))
|
||||||
|
hs_bindgen_473a3e791275b06d =
|
||||||
|
HsBindgen.Runtime.Internal.HasFFIType.fromFFIType hs_bindgen_473a3e791275b06d_base
|
||||||
|
|
||||||
|
{-# NOINLINE sum_tree #-}
|
||||||
|
{-| __C declaration:__ @sum_tree@
|
||||||
|
|
||||||
|
__defined at:__ @garnet_rs.h 63:9@
|
||||||
|
|
||||||
|
__exported by:__ @garnet_rs.h@
|
||||||
|
-}
|
||||||
|
sum_tree :: Ptr.FunPtr (BTree -> IO HsBindgen.Runtime.LibC.Int64)
|
||||||
|
sum_tree =
|
||||||
|
GHC.IO.Unsafe.unsafePerformIO hs_bindgen_473a3e791275b06d
|
||||||
|
|||||||
@ -44,6 +44,12 @@ $(HsBindgen.Runtime.Internal.CAPI.addCSource (HsBindgen.Runtime.Internal.CAPI.un
|
|||||||
, "{"
|
, "{"
|
||||||
, " return add(arg1, arg2);"
|
, " return add(arg1, arg2);"
|
||||||
, "}"
|
, "}"
|
||||||
|
, "int64_t hs_bindgen_9602640c06f0c62f ("
|
||||||
|
, " struct BTree *arg1"
|
||||||
|
, ")"
|
||||||
|
, "{"
|
||||||
|
, " return sum_tree(*arg1);"
|
||||||
|
, "}"
|
||||||
]))
|
]))
|
||||||
|
|
||||||
-- __unique:__ @com_garnet_GarnetRs_Safe_hello@
|
-- __unique:__ @com_garnet_GarnetRs_Safe_hello@
|
||||||
@ -60,7 +66,7 @@ hs_bindgen_433ea2a26af4e593 =
|
|||||||
|
|
||||||
{-| __C declaration:__ @hello@
|
{-| __C declaration:__ @hello@
|
||||||
|
|
||||||
__defined at:__ @garnet_rs.h 33:6@
|
__defined at:__ @garnet_rs.h 55:6@
|
||||||
|
|
||||||
__exported by:__ @garnet_rs.h@
|
__exported by:__ @garnet_rs.h@
|
||||||
-}
|
-}
|
||||||
@ -84,7 +90,7 @@ hs_bindgen_51157946af5519c9 =
|
|||||||
|
|
||||||
{-| __C declaration:__ @hello_struct@
|
{-| __C declaration:__ @hello_struct@
|
||||||
|
|
||||||
__defined at:__ @garnet_rs.h 35:6@
|
__defined at:__ @garnet_rs.h 57:6@
|
||||||
|
|
||||||
__exported by:__ @garnet_rs.h@
|
__exported by:__ @garnet_rs.h@
|
||||||
-}
|
-}
|
||||||
@ -110,7 +116,7 @@ hs_bindgen_7de06f1fd827ca60 =
|
|||||||
|
|
||||||
{-| __C declaration:__ @hello_shape@
|
{-| __C declaration:__ @hello_shape@
|
||||||
|
|
||||||
__defined at:__ @garnet_rs.h 37:6@
|
__defined at:__ @garnet_rs.h 59:6@
|
||||||
|
|
||||||
__exported by:__ @garnet_rs.h@
|
__exported by:__ @garnet_rs.h@
|
||||||
-}
|
-}
|
||||||
@ -142,7 +148,7 @@ hs_bindgen_1c0c71fa74c428a9 =
|
|||||||
|
|
||||||
__C declaration:__ @add@
|
__C declaration:__ @add@
|
||||||
|
|
||||||
__defined at:__ @garnet_rs.h 39:32@
|
__defined at:__ @garnet_rs.h 61:32@
|
||||||
|
|
||||||
__exported by:__ @garnet_rs.h@
|
__exported by:__ @garnet_rs.h@
|
||||||
-}
|
-}
|
||||||
@ -153,3 +159,29 @@ add ::
|
|||||||
-- ^ __C declaration:__ @b@
|
-- ^ __C declaration:__ @b@
|
||||||
-> HsBindgen.Runtime.LibC.Int64
|
-> HsBindgen.Runtime.LibC.Int64
|
||||||
add = hs_bindgen_1c0c71fa74c428a9
|
add = hs_bindgen_1c0c71fa74c428a9
|
||||||
|
|
||||||
|
-- __unique:__ @com_garnet_GarnetRs_Safe_sum_tree@
|
||||||
|
foreign import ccall safe "hs_bindgen_9602640c06f0c62f" hs_bindgen_9602640c06f0c62f_base ::
|
||||||
|
Ptr.Ptr Void
|
||||||
|
-> IO GHC.Int.Int64
|
||||||
|
|
||||||
|
-- __unique:__ @com_garnet_GarnetRs_Safe_sum_tree@
|
||||||
|
hs_bindgen_9602640c06f0c62f ::
|
||||||
|
Ptr.Ptr BTree
|
||||||
|
-> IO HsBindgen.Runtime.LibC.Int64
|
||||||
|
hs_bindgen_9602640c06f0c62f =
|
||||||
|
HsBindgen.Runtime.Internal.HasFFIType.fromFFIType hs_bindgen_9602640c06f0c62f_base
|
||||||
|
|
||||||
|
{-| __C declaration:__ @sum_tree@
|
||||||
|
|
||||||
|
__defined at:__ @garnet_rs.h 63:9@
|
||||||
|
|
||||||
|
__exported by:__ @garnet_rs.h@
|
||||||
|
-}
|
||||||
|
sum_tree ::
|
||||||
|
BTree
|
||||||
|
-- ^ __C declaration:__ @t@
|
||||||
|
-> IO HsBindgen.Runtime.LibC.Int64
|
||||||
|
sum_tree =
|
||||||
|
\t0 ->
|
||||||
|
F.with t0 (\t1 -> hs_bindgen_9602640c06f0c62f t1)
|
||||||
|
|||||||
@ -44,6 +44,12 @@ $(HsBindgen.Runtime.Internal.CAPI.addCSource (HsBindgen.Runtime.Internal.CAPI.un
|
|||||||
, "{"
|
, "{"
|
||||||
, " return add(arg1, arg2);"
|
, " return add(arg1, arg2);"
|
||||||
, "}"
|
, "}"
|
||||||
|
, "int64_t hs_bindgen_c2ced4f3ba39c8ff ("
|
||||||
|
, " struct BTree *arg1"
|
||||||
|
, ")"
|
||||||
|
, "{"
|
||||||
|
, " return sum_tree(*arg1);"
|
||||||
|
, "}"
|
||||||
]))
|
]))
|
||||||
|
|
||||||
-- __unique:__ @com_garnet_GarnetRs_Unsafe_hello@
|
-- __unique:__ @com_garnet_GarnetRs_Unsafe_hello@
|
||||||
@ -60,7 +66,7 @@ hs_bindgen_2dfe97662a4d6377 =
|
|||||||
|
|
||||||
{-| __C declaration:__ @hello@
|
{-| __C declaration:__ @hello@
|
||||||
|
|
||||||
__defined at:__ @garnet_rs.h 33:6@
|
__defined at:__ @garnet_rs.h 55:6@
|
||||||
|
|
||||||
__exported by:__ @garnet_rs.h@
|
__exported by:__ @garnet_rs.h@
|
||||||
-}
|
-}
|
||||||
@ -84,7 +90,7 @@ hs_bindgen_29d823ada2bc7302 =
|
|||||||
|
|
||||||
{-| __C declaration:__ @hello_struct@
|
{-| __C declaration:__ @hello_struct@
|
||||||
|
|
||||||
__defined at:__ @garnet_rs.h 35:6@
|
__defined at:__ @garnet_rs.h 57:6@
|
||||||
|
|
||||||
__exported by:__ @garnet_rs.h@
|
__exported by:__ @garnet_rs.h@
|
||||||
-}
|
-}
|
||||||
@ -110,7 +116,7 @@ hs_bindgen_b3f40a03f07eaa85 =
|
|||||||
|
|
||||||
{-| __C declaration:__ @hello_shape@
|
{-| __C declaration:__ @hello_shape@
|
||||||
|
|
||||||
__defined at:__ @garnet_rs.h 37:6@
|
__defined at:__ @garnet_rs.h 59:6@
|
||||||
|
|
||||||
__exported by:__ @garnet_rs.h@
|
__exported by:__ @garnet_rs.h@
|
||||||
-}
|
-}
|
||||||
@ -142,7 +148,7 @@ hs_bindgen_20eb651f0a8faf48 =
|
|||||||
|
|
||||||
__C declaration:__ @add@
|
__C declaration:__ @add@
|
||||||
|
|
||||||
__defined at:__ @garnet_rs.h 39:32@
|
__defined at:__ @garnet_rs.h 61:32@
|
||||||
|
|
||||||
__exported by:__ @garnet_rs.h@
|
__exported by:__ @garnet_rs.h@
|
||||||
-}
|
-}
|
||||||
@ -153,3 +159,29 @@ add ::
|
|||||||
-- ^ __C declaration:__ @b@
|
-- ^ __C declaration:__ @b@
|
||||||
-> HsBindgen.Runtime.LibC.Int64
|
-> HsBindgen.Runtime.LibC.Int64
|
||||||
add = hs_bindgen_20eb651f0a8faf48
|
add = hs_bindgen_20eb651f0a8faf48
|
||||||
|
|
||||||
|
-- __unique:__ @com_garnet_GarnetRs_Unsafe_sum_tree@
|
||||||
|
foreign import ccall unsafe "hs_bindgen_c2ced4f3ba39c8ff" hs_bindgen_c2ced4f3ba39c8ff_base ::
|
||||||
|
Ptr.Ptr Void
|
||||||
|
-> IO GHC.Int.Int64
|
||||||
|
|
||||||
|
-- __unique:__ @com_garnet_GarnetRs_Unsafe_sum_tree@
|
||||||
|
hs_bindgen_c2ced4f3ba39c8ff ::
|
||||||
|
Ptr.Ptr BTree
|
||||||
|
-> IO HsBindgen.Runtime.LibC.Int64
|
||||||
|
hs_bindgen_c2ced4f3ba39c8ff =
|
||||||
|
HsBindgen.Runtime.Internal.HasFFIType.fromFFIType hs_bindgen_c2ced4f3ba39c8ff_base
|
||||||
|
|
||||||
|
{-| __C declaration:__ @sum_tree@
|
||||||
|
|
||||||
|
__defined at:__ @garnet_rs.h 63:9@
|
||||||
|
|
||||||
|
__exported by:__ @garnet_rs.h@
|
||||||
|
-}
|
||||||
|
sum_tree ::
|
||||||
|
BTree
|
||||||
|
-- ^ __C declaration:__ @t@
|
||||||
|
-> IO HsBindgen.Runtime.LibC.Int64
|
||||||
|
sum_tree =
|
||||||
|
\t0 ->
|
||||||
|
F.with t0 (\t1 -> hs_bindgen_c2ced4f3ba39c8ff t1)
|
||||||
|
|||||||
@ -30,6 +30,28 @@ struct Shape {
|
|||||||
} body;
|
} body;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum BTree_Tag {
|
||||||
|
Leaf,
|
||||||
|
Fork,
|
||||||
|
};
|
||||||
|
|
||||||
|
struct Leaf_Body {
|
||||||
|
int64_t value;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct Fork_Body {
|
||||||
|
const struct BTree *left;
|
||||||
|
const struct BTree *right;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct BTree {
|
||||||
|
enum BTree_Tag tag;
|
||||||
|
union {
|
||||||
|
struct Leaf_Body leaf;
|
||||||
|
struct Fork_Body fork;
|
||||||
|
} body;
|
||||||
|
};
|
||||||
|
|
||||||
void hello(const char *c);
|
void hello(const char *c);
|
||||||
|
|
||||||
void hello_struct(struct T t);
|
void hello_struct(struct T t);
|
||||||
@ -37,3 +59,5 @@ void hello_struct(struct T t);
|
|||||||
void hello_shape(struct Shape s);
|
void hello_shape(struct Shape s);
|
||||||
|
|
||||||
__attribute__((const)) int64_t add(int64_t a, int64_t b);
|
__attribute__((const)) int64_t add(int64_t a, int64_t b);
|
||||||
|
|
||||||
|
int64_t sum_tree(struct BTree t);
|
||||||
|
|||||||
20
rust/lib.rs
20
rust/lib.rs
@ -40,3 +40,23 @@ extern "C" fn hello_shape(s: Shape) -> () {
|
|||||||
extern "C" fn add(a: i64, b: i64) -> i64 {
|
extern "C" fn add(a: i64, b: i64) -> i64 {
|
||||||
a + b
|
a + b
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[repr(C)]
|
||||||
|
#[derive(Clone, Copy)]
|
||||||
|
enum BTree {
|
||||||
|
Leaf {
|
||||||
|
value: i64,
|
||||||
|
},
|
||||||
|
Fork {
|
||||||
|
left: *const BTree,
|
||||||
|
right: *const BTree,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
#[unsafe(no_mangle)]
|
||||||
|
extern "C" fn sum_tree(t: BTree) -> i64 {
|
||||||
|
match t {
|
||||||
|
BTree::Leaf { value } => value,
|
||||||
|
BTree::Fork { left, right } => unsafe { sum_tree(*left) + sum_tree(*right) },
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user