summary refs log tree commit diff stats
path: root/tests/cpp/tempty_generic_obj.nim
diff options
context:
space:
mode:
Diffstat (limited to 'tests/cpp/tempty_generic_obj.nim')
-rw-r--r--tests/cpp/tempty_generic_obj.nim47
1 files changed, 47 insertions, 0 deletions
diff --git a/tests/cpp/tempty_generic_obj.nim b/tests/cpp/tempty_generic_obj.nim
new file mode 100644
index 000000000..6125190b4
--- /dev/null
+++ b/tests/cpp/tempty_generic_obj.nim
@@ -0,0 +1,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