summary refs log tree commit diff stats
path: root/tests/cpp/tmember.nim
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()