Files
Nim/tests/cpp/tmember.nim
Juan M Gómez 8625e71250 adds support for functor in member (#22433)
* adds support for functor in member

* improves functor test
2023-08-10 14:15:23 +02:00

65 lines
1.2 KiB
Nim

discard """
targets: "cpp"
cmd: "nim cpp $file"
output: '''
2
false
hello foo
hello boo
hello boo
FunctorSupport!
destructing
destructing
'''
"""
proc print(s: cstring) {.importcpp:"printf(@)", header:"<stdio.h>".}
type
Doo {.exportc.} = object
test: int
proc memberProc(f: Doo) {.exportc, member.} =
echo $f.test
proc destructor(f: Doo) {.member: "~'1()", used.} =
print "destructing\n"
proc `==`(self, other: Doo): bool {.member:"operator==('2 const & #2) const -> '0"} =
self.test == other.test
let doo = Doo(test: 2)
doo.memberProc()
echo doo == Doo(test: 1)
#virtual
proc newCpp*[T](): ptr T {.importcpp:"new '*0()".}
type
Foo = object of RootObj
FooPtr = ptr Foo
Boo = object of Foo
BooPtr = ptr Boo
proc salute(self: FooPtr) {.member: "virtual $1()".} =
echo "hello foo"
proc salute(self: BooPtr) {.member: "virtual $1()".} =
echo "hello boo"
let foo = newCpp[Foo]()
let boo = newCpp[Boo]()
let booAsFoo = cast[FooPtr](newCpp[Boo]())
foo.salute()
boo.salute()
booAsFoo.salute()
type
NimFunctor = object
discard
proc invoke(f: NimFunctor, n:int) {.member:"operator ()('2 #2)" .} =
echo "FunctorSupport!"
{.experimental: "callOperator".}
proc `()`(f: NimFunctor, n:int) {.importcpp:"#(@)" .}
NimFunctor()(1)