diff options
Diffstat (limited to 'tests/cpp/tempty_generic_obj.nim')
-rw-r--r-- | tests/cpp/tempty_generic_obj.nim | 47 |
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 |