blob: 1a5b6fd9754b2a2b8c7a89355d1f7e59bca1b1cc (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
|
discard """
targets: "cpp"
cmd: "nim cpp $file"
output: '''
2
false
hello foo
hello boo
hello boo
FunctorSupport!
static
static
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 {.exportc.} = 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)
#static
proc staticProc(self: FooPtr) {.member: "static $1()".} =
echo "static"
proc importedStaticProc() {.importcpp:"Foo::staticProc()".}
foo.staticProc()
importedStaticProc()
|