From dbd85bf2bfd68d7a63128d01d8cc53114884963d Mon Sep 17 00:00:00 2001 From: Robert Bradshaw Date: Fri, 15 Jan 2010 11:56:19 -0800 Subject: [PATCH] cpp template tests --- Cython/Compiler/Parsing.py | 1 - tests/bugs.txt | 1 + tests/run/cpp_nested_templates.pyx | 31 ++++++++++++ tests/run/cpp_templates.pyx | 80 ++++++++++++++++++++++++++++++ tests/run/cpp_templates_helper.h | 21 ++++++++ 5 files changed, 133 insertions(+), 1 deletion(-) create mode 100644 tests/run/cpp_nested_templates.pyx create mode 100644 tests/run/cpp_templates.pyx create mode 100644 tests/run/cpp_templates_helper.h diff --git a/Cython/Compiler/Parsing.py b/Cython/Compiler/Parsing.py index 64102410..bf638e95 100644 --- a/Cython/Compiler/Parsing.py +++ b/Cython/Compiler/Parsing.py @@ -1900,7 +1900,6 @@ def p_buffer_or_template(s, base_type_node): ExprNodes.DictItemNode(pos=key.pos, key=key, value=value) for key, value in keyword_args ]) - result = Nodes.TemplatedTypeNode(pos, positional_args = positional_args, keyword_args = keyword_dict, diff --git a/tests/bugs.txt b/tests/bugs.txt index 06594963..0fbe4d22 100644 --- a/tests/bugs.txt +++ b/tests/bugs.txt @@ -9,3 +9,4 @@ missing_baseclass_in_predecl_T262 cfunc_call_tuple_args_T408 ifelseexpr_T267 compile.cpp_operators +cpp_nested_templates \ No newline at end of file diff --git a/tests/run/cpp_nested_templates.pyx b/tests/run/cpp_nested_templates.pyx new file mode 100644 index 00000000..21477920 --- /dev/null +++ b/tests/run/cpp_nested_templates.pyx @@ -0,0 +1,31 @@ +from cython import dereference as deref + +cdef extern from "cpp_templates_helper.h": + cdef cppclass Wrap[T]: + Wrap(T) + void set(T) + T get() + bint operator==(Wrap[T]) + + cdef cppclass Pair[T1,T2]: + Pair(T1,T2) + T1 first() + T2 second() + bint operator==(Pair[T1,T2]) + bint operator!=(Pair[T1,T2]) + +def test_wrap_pair(int i, double x): + """ + >>> test_wrap_pair(1, 1.5) + (1, 1.5, True, False) + >>> test_wrap_pair(2, 2.25) + (2, 2.25, True, False) + """ + cdef Pair[int, double] *pair + cdef Wrap[Pair[int, double]] *wrap + try: + pair = new Pair[int, double](i, x) + warp = new Wrap[Pair[int, double]](deref(pair)) + return wrap.get().first(), wrap.get().second(), deref(wrap) == deref(wrap) + finally: + del pair, wrap diff --git a/tests/run/cpp_templates.pyx b/tests/run/cpp_templates.pyx new file mode 100644 index 00000000..dbfdbc78 --- /dev/null +++ b/tests/run/cpp_templates.pyx @@ -0,0 +1,80 @@ +from cython import dereference as deref + +cdef extern from "cpp_templates_helper.h": + cdef cppclass Wrap[T]: + Wrap(T) + void set(T) + T get() + bint operator==(Wrap[T]) + + cdef cppclass Pair[T1,T2]: + Pair(T1,T2) + T1 first() + T2 second() + bint operator==(Pair[T1,T2]) + bint operator!=(Pair[T1,T2]) + +def test_int(int x, int y): + """ + >>> test_int(3, 4) + (3, 4, False) + >>> test_int(100, 100) + (100, 100, True) + """ + cdef Wrap[int] *a, *b + try: + a = new Wrap[int](x) + b = new Wrap[int](0) + b.set(y) + return a.get(), b.get(), a[0] == b[0] + finally: + del a, b + + +def test_double(double x, double y): + """ + >>> test_double(3, 3.5) + (3.0, 3.5, False) + >>> test_double(100, 100) + (100.0, 100.0, True) + """ + cdef Wrap[double] *a, *b + try: + a = new Wrap[double](x) + b = new Wrap[double](-1) + b.set(y) + return a.get(), b.get(), deref(a) == deref(b) + finally: + del a, b + +def test_pair(int i, double x): + """ + >>> test_pair(1, 1.5) + (1, 1.5, True, False) + >>> test_pair(2, 2.25) + (2, 2.25, True, False) + """ + cdef Pair[int, double] *pair + try: + pair = new Pair[int, double](i, x) + return pair.first(), pair.second(), deref(pair) == deref(pair), deref(pair) != deref(pair) + finally: + del pair + + + +def test_wrap_pair(int i, double x): + """ + >>> test_wrap_pair(1, 1.5) + (1, 1.5, True, False) + >>> test_wrap_pair(2, 2.25) + (2, 2.25, True, False) + """ + cdef Pair[int, double] *pair + cdef Wrap[Pair[int, double]] *wrap + try: + pair = new Pair[int, double](i, x) + warp = new Wrap[Pair[int, double]](deref(pair)) + return wrap.get().first(), wrap.get().second(), deref(wrap) == deref(wrap) + finally: + del pair, wrap diff --git a/tests/run/cpp_templates_helper.h b/tests/run/cpp_templates_helper.h new file mode 100644 index 00000000..13b262fe --- /dev/null +++ b/tests/run/cpp_templates_helper.h @@ -0,0 +1,21 @@ +template +class Wrap { + T value; +public: + Wrap(T v) { value = v; } + void set(T v) { value = v; } + T get(void) { return value; } + bool operator==(Wrap other) { return value == other.value; } +}; + +template +class Pair { + T1 _first; + T2 _second; +public: + Pair(T1 u, T2 v) { _first = u; _second = v; } + T1 first(void) { return _first; } + T2 second(void) { return _second; } + bool operator==(Pair other) { return _first == other._first && _second == other._second; } + bool operator!=(Pair other) { return _first != other._first || _second != other._second; } +}; -- 2.26.2