cpp template tests
authorRobert Bradshaw <robertwb@math.washington.edu>
Fri, 15 Jan 2010 19:56:19 +0000 (11:56 -0800)
committerRobert Bradshaw <robertwb@math.washington.edu>
Fri, 15 Jan 2010 19:56:19 +0000 (11:56 -0800)
Cython/Compiler/Parsing.py
tests/bugs.txt
tests/run/cpp_nested_templates.pyx [new file with mode: 0644]
tests/run/cpp_templates.pyx [new file with mode: 0644]
tests/run/cpp_templates_helper.h [new file with mode: 0644]

index 64102410d4f7931e3df76439d5e5c74fdeea87c4..bf638e95bd554e7561a5dd92a5a17b16a3d6bc2b 100644 (file)
@@ -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,
index 0659496392d23d7146519c9951468f55ff1b80ba..0fbe4d22fa7c61fd91fd59088b0ebe50a56e1062 100644 (file)
@@ -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 (file)
index 0000000..2147792
--- /dev/null
@@ -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 (file)
index 0000000..dbfdbc7
--- /dev/null
@@ -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 (file)
index 0000000..13b262f
--- /dev/null
@@ -0,0 +1,21 @@
+template <class T>
+class Wrap {
+    T value;
+public:
+    Wrap(T v) { value = v; }
+    void set(T v) { value = v; }
+    T get(void) { return value; }
+    bool operator==(Wrap<T> other) { return value == other.value; }
+};
+
+template <class T1, class T2>
+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<T1,T2> other) { return _first == other._first && _second == other._second; }
+    bool operator!=(Pair<T1,T2> other) { return _first != other._first || _second != other._second; }
+};