summary refs log tree commit diff stats
path: root/tests/cpp/tempty_generic_obj.nim
blob: 6125190b4f0e35556e7990a7ea3235fe8008bebb (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
discard """
  targets: "cpp"
  output: '''
int
float'''
disabled: "windows" # pending bug #18011
"""

import typetraits

# bug #4625
type
  Vector[T] {.importcpp: "std::vector<'0 >", header: "vector".} = object

proc initVector[T](): Vector[T] {.importcpp: "'0(@)", header: "vector", constructor.}

proc doSomething[T](v: var Vector[T]) =
  echo T.name

var v = initVector[int]()
v.doSomething()

var vf = initVector[float]()
vf.doSomething() # Nim uses doSomething[int] here in C++

# Alternative definition:
# https://github.com/nim-lang/Nim/issues/7653

type VectorAlt*[T] {.importcpp: "std::vector", header: "<vector>", nodecl.} = object
proc mkVector*[T]: VectorAlt[T] {.importcpp: "std::vector<'*0>()", header: "<vector>", constructor, nodecl.}

proc foo(): VectorAlt[cint] =
  mkVector[cint]()

proc bar(): VectorAlt[cstring] =
  mkVector[cstring]()

var x = foo()
var y = bar()

proc init[T; Self: Vector[T]](_: typedesc[Self], n: csize_t): Vector[T]
  {.importcpp: "std::vector<'*0>(@)", header: "<vector>", constructor, nodecl.}
proc size[T](x: Vector[T]): csize_t
  {.importcpp: "#.size()", header: "<vector>", nodecl.}

var z = Vector[int16].init(32)
assert z.size == 32