1/* Generated by Cython 0.17.4 on Sun Feb 24 19:48:34 2013 */
2
3#define PY_SSIZE_T_CLEAN
4#include "Python.h"
5#ifndef Py_PYTHON_H
6    #error Python headers needed to compile C extensions, please install development version of Python.
7#elif PY_VERSION_HEX < 0x02040000
8    #error Cython requires Python 2.4+.
9#else
10#include <stddef.h> /* For offsetof */
11#ifndef offsetof
12#define offsetof(type, member) ( (size_t) & ((type*)0) -> member )
13#endif
14#if !defined(WIN32) && !defined(MS_WINDOWS)
15  #ifndef __stdcall
16    #define __stdcall
17  #endif
18  #ifndef __cdecl
19    #define __cdecl
20  #endif
21  #ifndef __fastcall
22    #define __fastcall
23  #endif
24#endif
25#ifndef DL_IMPORT
26  #define DL_IMPORT(t) t
27#endif
28#ifndef DL_EXPORT
29  #define DL_EXPORT(t) t
30#endif
31#ifndef PY_LONG_LONG
32  #define PY_LONG_LONG LONG_LONG
33#endif
34#ifndef Py_HUGE_VAL
35  #define Py_HUGE_VAL HUGE_VAL
36#endif
37#ifdef PYPY_VERSION
38#define CYTHON_COMPILING_IN_PYPY 1
39#define CYTHON_COMPILING_IN_CPYTHON 0
40#else
41#define CYTHON_COMPILING_IN_PYPY 0
42#define CYTHON_COMPILING_IN_CPYTHON 1
43#endif
44#if PY_VERSION_HEX < 0x02050000
45  typedef int Py_ssize_t;
46  #define PY_SSIZE_T_MAX INT_MAX
47  #define PY_SSIZE_T_MIN INT_MIN
48  #define PY_FORMAT_SIZE_T ""
49  #define CYTHON_FORMAT_SSIZE_T ""
50  #define PyInt_FromSsize_t(z) PyInt_FromLong(z)
51  #define PyInt_AsSsize_t(o)   __Pyx_PyInt_AsInt(o)
52  #define PyNumber_Index(o)    ((PyNumber_Check(o) && !PyFloat_Check(o)) ? PyNumber_Int(o) : \
53                                (PyErr_Format(PyExc_TypeError, \
54                                              "expected index value, got %.200s", Py_TYPE(o)->tp_name), \
55                                 (PyObject*)0))
56  #define __Pyx_PyIndex_Check(o) (PyNumber_Check(o) && !PyFloat_Check(o) && \
57                                  !PyComplex_Check(o))
58  #define PyIndex_Check __Pyx_PyIndex_Check
59  #define PyErr_WarnEx(category, message, stacklevel) PyErr_Warn(category, message)
60  #define __PYX_BUILD_PY_SSIZE_T "i"
61#else
62  #define __PYX_BUILD_PY_SSIZE_T "n"
63  #define CYTHON_FORMAT_SSIZE_T "z"
64  #define __Pyx_PyIndex_Check PyIndex_Check
65#endif
66#if PY_VERSION_HEX < 0x02060000
67  #define Py_REFCNT(ob) (((PyObject*)(ob))->ob_refcnt)
68  #define Py_TYPE(ob)   (((PyObject*)(ob))->ob_type)
69  #define Py_SIZE(ob)   (((PyVarObject*)(ob))->ob_size)
70  #define PyVarObject_HEAD_INIT(type, size) \
71          PyObject_HEAD_INIT(type) size,
72  #define PyType_Modified(t)
73  typedef struct {
74     void *buf;
75     PyObject *obj;
76     Py_ssize_t len;
77     Py_ssize_t itemsize;
78     int readonly;
79     int ndim;
80     char *format;
81     Py_ssize_t *shape;
82     Py_ssize_t *strides;
83     Py_ssize_t *suboffsets;
84     void *internal;
85  } Py_buffer;
86  #define PyBUF_SIMPLE 0
87  #define PyBUF_WRITABLE 0x0001
88  #define PyBUF_FORMAT 0x0004
89  #define PyBUF_ND 0x0008
90  #define PyBUF_STRIDES (0x0010 | PyBUF_ND)
91  #define PyBUF_C_CONTIGUOUS (0x0020 | PyBUF_STRIDES)
92  #define PyBUF_F_CONTIGUOUS (0x0040 | PyBUF_STRIDES)
93  #define PyBUF_ANY_CONTIGUOUS (0x0080 | PyBUF_STRIDES)
94  #define PyBUF_INDIRECT (0x0100 | PyBUF_STRIDES)
95  #define PyBUF_RECORDS (PyBUF_STRIDES | PyBUF_FORMAT | PyBUF_WRITABLE)
96  #define PyBUF_FULL (PyBUF_INDIRECT | PyBUF_FORMAT | PyBUF_WRITABLE)
97  typedef int (*getbufferproc)(PyObject *, Py_buffer *, int);
98  typedef void (*releasebufferproc)(PyObject *, Py_buffer *);
99#endif
100#if PY_MAJOR_VERSION < 3
101  #define __Pyx_BUILTIN_MODULE_NAME "__builtin__"
102  #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) \
103          PyCode_New(a, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)
104#else
105  #define __Pyx_BUILTIN_MODULE_NAME "builtins"
106  #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) \
107          PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)
108#endif
109#if PY_MAJOR_VERSION < 3 && PY_MINOR_VERSION < 6
110  #define PyUnicode_FromString(s) PyUnicode_Decode(s, strlen(s), "UTF-8", "strict")
111#endif
112#if PY_MAJOR_VERSION >= 3
113  #define Py_TPFLAGS_CHECKTYPES 0
114  #define Py_TPFLAGS_HAVE_INDEX 0
115#endif
116#if (PY_VERSION_HEX < 0x02060000) || (PY_MAJOR_VERSION >= 3)
117  #define Py_TPFLAGS_HAVE_NEWBUFFER 0
118#endif
119#if PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND)
120  #define CYTHON_PEP393_ENABLED 1
121  #define __Pyx_PyUnicode_READY(op)       (likely(PyUnicode_IS_READY(op)) ? \
122                                              0 : _PyUnicode_Ready((PyObject *)(op)))
123  #define __Pyx_PyUnicode_GET_LENGTH(u)   PyUnicode_GET_LENGTH(u)
124  #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_READ_CHAR(u, i)
125  #define __Pyx_PyUnicode_READ(k, d, i)   PyUnicode_READ(k, d, i)
126#else
127  #define CYTHON_PEP393_ENABLED 0
128  #define __Pyx_PyUnicode_READY(op)       (0)
129  #define __Pyx_PyUnicode_GET_LENGTH(u)   PyUnicode_GET_SIZE(u)
130  #define __Pyx_PyUnicode_READ_CHAR(u, i) ((Py_UCS4)(PyUnicode_AS_UNICODE(u)[i]))
131  #define __Pyx_PyUnicode_READ(k, d, i)   ((k=k), (Py_UCS4)(((Py_UNICODE*)d)[i]))
132#endif
133#if PY_MAJOR_VERSION >= 3
134  #define PyBaseString_Type            PyUnicode_Type
135  #define PyStringObject               PyUnicodeObject
136  #define PyString_Type                PyUnicode_Type
137  #define PyString_Check               PyUnicode_Check
138  #define PyString_CheckExact          PyUnicode_CheckExact
139#endif
140#if PY_VERSION_HEX < 0x02060000
141  #define PyBytesObject                PyStringObject
142  #define PyBytes_Type                 PyString_Type
143  #define PyBytes_Check                PyString_Check
144  #define PyBytes_CheckExact           PyString_CheckExact
145  #define PyBytes_FromString           PyString_FromString
146  #define PyBytes_FromStringAndSize    PyString_FromStringAndSize
147  #define PyBytes_FromFormat           PyString_FromFormat
148  #define PyBytes_DecodeEscape         PyString_DecodeEscape
149  #define PyBytes_AsString             PyString_AsString
150  #define PyBytes_AsStringAndSize      PyString_AsStringAndSize
151  #define PyBytes_Size                 PyString_Size
152  #define PyBytes_AS_STRING            PyString_AS_STRING
153  #define PyBytes_GET_SIZE             PyString_GET_SIZE
154  #define PyBytes_Repr                 PyString_Repr
155  #define PyBytes_Concat               PyString_Concat
156  #define PyBytes_ConcatAndDel         PyString_ConcatAndDel
157#endif
158#if PY_VERSION_HEX < 0x02060000
159  #define PySet_Check(obj)             PyObject_TypeCheck(obj, &PySet_Type)
160  #define PyFrozenSet_Check(obj)       PyObject_TypeCheck(obj, &PyFrozenSet_Type)
161#endif
162#ifndef PySet_CheckExact
163  #define PySet_CheckExact(obj)        (Py_TYPE(obj) == &PySet_Type)
164#endif
165#define __Pyx_TypeCheck(obj, type) PyObject_TypeCheck(obj, (PyTypeObject *)type)
166#if PY_MAJOR_VERSION >= 3
167  #define PyIntObject                  PyLongObject
168  #define PyInt_Type                   PyLong_Type
169  #define PyInt_Check(op)              PyLong_Check(op)
170  #define PyInt_CheckExact(op)         PyLong_CheckExact(op)
171  #define PyInt_FromString             PyLong_FromString
172  #define PyInt_FromUnicode            PyLong_FromUnicode
173  #define PyInt_FromLong               PyLong_FromLong
174  #define PyInt_FromSize_t             PyLong_FromSize_t
175  #define PyInt_FromSsize_t            PyLong_FromSsize_t
176  #define PyInt_AsLong                 PyLong_AsLong
177  #define PyInt_AS_LONG                PyLong_AS_LONG
178  #define PyInt_AsSsize_t              PyLong_AsSsize_t
179  #define PyInt_AsUnsignedLongMask     PyLong_AsUnsignedLongMask
180  #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask
181#endif
182#if PY_MAJOR_VERSION >= 3
183  #define PyBoolObject                 PyLongObject
184#endif
185#if PY_VERSION_HEX < 0x03020000
186  typedef long Py_hash_t;
187  #define __Pyx_PyInt_FromHash_t PyInt_FromLong
188  #define __Pyx_PyInt_AsHash_t   PyInt_AsLong
189#else
190  #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t
191  #define __Pyx_PyInt_AsHash_t   PyInt_AsSsize_t
192#endif
193#if (PY_MAJOR_VERSION < 3) || (PY_VERSION_HEX >= 0x03010300)
194  #define __Pyx_PySequence_GetSlice(obj, a, b) PySequence_GetSlice(obj, a, b)
195  #define __Pyx_PySequence_SetSlice(obj, a, b, value) PySequence_SetSlice(obj, a, b, value)
196  #define __Pyx_PySequence_DelSlice(obj, a, b) PySequence_DelSlice(obj, a, b)
197#else
198  #define __Pyx_PySequence_GetSlice(obj, a, b) (unlikely(!(obj)) ? \
199        (PyErr_SetString(PyExc_SystemError, "null argument to internal routine"), (PyObject*)0) : \
200        (likely((obj)->ob_type->tp_as_mapping) ? (PySequence_GetSlice(obj, a, b)) : \
201            (PyErr_Format(PyExc_TypeError, "'%.200s' object is unsliceable", (obj)->ob_type->tp_name), (PyObject*)0)))
202  #define __Pyx_PySequence_SetSlice(obj, a, b, value) (unlikely(!(obj)) ? \
203        (PyErr_SetString(PyExc_SystemError, "null argument to internal routine"), -1) : \
204        (likely((obj)->ob_type->tp_as_mapping) ? (PySequence_SetSlice(obj, a, b, value)) : \
205            (PyErr_Format(PyExc_TypeError, "'%.200s' object doesn't support slice assignment", (obj)->ob_type->tp_name), -1)))
206  #define __Pyx_PySequence_DelSlice(obj, a, b) (unlikely(!(obj)) ? \
207        (PyErr_SetString(PyExc_SystemError, "null argument to internal routine"), -1) : \
208        (likely((obj)->ob_type->tp_as_mapping) ? (PySequence_DelSlice(obj, a, b)) : \
209            (PyErr_Format(PyExc_TypeError, "'%.200s' object doesn't support slice deletion", (obj)->ob_type->tp_name), -1)))
210#endif
211#if PY_MAJOR_VERSION >= 3
212  #define PyMethod_New(func, self, klass) ((self) ? PyMethod_New(func, self) : PyInstanceMethod_New(func))
213#endif
214#if PY_VERSION_HEX < 0x02050000
215  #define __Pyx_GetAttrString(o,n)   PyObject_GetAttrString((o),((char *)(n)))
216  #define __Pyx_SetAttrString(o,n,a) PyObject_SetAttrString((o),((char *)(n)),(a))
217  #define __Pyx_DelAttrString(o,n)   PyObject_DelAttrString((o),((char *)(n)))
218#else
219  #define __Pyx_GetAttrString(o,n)   PyObject_GetAttrString((o),(n))
220  #define __Pyx_SetAttrString(o,n,a) PyObject_SetAttrString((o),(n),(a))
221  #define __Pyx_DelAttrString(o,n)   PyObject_DelAttrString((o),(n))
222#endif
223#if PY_VERSION_HEX < 0x02050000
224  #define __Pyx_NAMESTR(n) ((char *)(n))
225  #define __Pyx_DOCSTR(n)  ((char *)(n))
226#else
227  #define __Pyx_NAMESTR(n) (n)
228  #define __Pyx_DOCSTR(n)  (n)
229#endif
230
231
232#if PY_MAJOR_VERSION >= 3
233  #define __Pyx_PyNumber_Divide(x,y)         PyNumber_TrueDivide(x,y)
234  #define __Pyx_PyNumber_InPlaceDivide(x,y)  PyNumber_InPlaceTrueDivide(x,y)
235#else
236  #define __Pyx_PyNumber_Divide(x,y)         PyNumber_Divide(x,y)
237  #define __Pyx_PyNumber_InPlaceDivide(x,y)  PyNumber_InPlaceDivide(x,y)
238#endif
239
240#ifndef __PYX_EXTERN_C
241  #ifdef __cplusplus
242    #define __PYX_EXTERN_C extern "C"
243  #else
244    #define __PYX_EXTERN_C extern
245  #endif
246#endif
247
248#if defined(WIN32) || defined(MS_WINDOWS)
249#define _USE_MATH_DEFINES
250#endif
251#include <math.h>
252#define __PYX_HAVE__bintrees__cwalker
253#define __PYX_HAVE_API__bintrees__cwalker
254#include "ctrees.h"
255#include "stack.h"
256#ifdef _OPENMP
257#include <omp.h>
258#endif /* _OPENMP */
259
260#ifdef PYREX_WITHOUT_ASSERTIONS
261#define CYTHON_WITHOUT_ASSERTIONS
262#endif
263
264
265/* inline attribute */
266#ifndef CYTHON_INLINE
267  #if defined(__GNUC__)
268    #define CYTHON_INLINE __inline__
269  #elif defined(_MSC_VER)
270    #define CYTHON_INLINE __inline
271  #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
272    #define CYTHON_INLINE inline
273  #else
274    #define CYTHON_INLINE
275  #endif
276#endif
277
278/* unused attribute */
279#ifndef CYTHON_UNUSED
280# if defined(__GNUC__)
281#   if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4))
282#     define CYTHON_UNUSED __attribute__ ((__unused__))
283#   else
284#     define CYTHON_UNUSED
285#   endif
286# elif defined(__ICC) || (defined(__INTEL_COMPILER) && !defined(_MSC_VER))
287#   define CYTHON_UNUSED __attribute__ ((__unused__))
288# else
289#   define CYTHON_UNUSED
290# endif
291#endif
292
293typedef struct {PyObject **p; char *s; const long n; const char* encoding; const char is_unicode; const char is_str; const char intern; } __Pyx_StringTabEntry; /*proto*/
294
295
296/* Type Conversion Predeclarations */
297
298#define __Pyx_PyBytes_FromUString(s) PyBytes_FromString((char*)s)
299#define __Pyx_PyBytes_AsUString(s)   ((unsigned char*) PyBytes_AsString(s))
300
301#define __Pyx_Owned_Py_None(b) (Py_INCREF(Py_None), Py_None)
302#define __Pyx_PyBool_FromLong(b) ((b) ? (Py_INCREF(Py_True), Py_True) : (Py_INCREF(Py_False), Py_False))
303static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*);
304static CYTHON_INLINE PyObject* __Pyx_PyNumber_Int(PyObject* x);
305
306static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*);
307static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t);
308static CYTHON_INLINE size_t __Pyx_PyInt_AsSize_t(PyObject*);
309
310#if CYTHON_COMPILING_IN_CPYTHON
311#define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x))
312#else
313#define __pyx_PyFloat_AsDouble(x) PyFloat_AsDouble(x)
314#endif
315#define __pyx_PyFloat_AsFloat(x) ((float) __pyx_PyFloat_AsDouble(x))
316
317#ifdef __GNUC__
318  /* Test for GCC > 2.95 */
319  #if __GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95))
320    #define likely(x)   __builtin_expect(!!(x), 1)
321    #define unlikely(x) __builtin_expect(!!(x), 0)
322  #else /* __GNUC__ > 2 ... */
323    #define likely(x)   (x)
324    #define unlikely(x) (x)
325  #endif /* __GNUC__ > 2 ... */
326#else /* __GNUC__ */
327  #define likely(x)   (x)
328  #define unlikely(x) (x)
329#endif /* __GNUC__ */
330
331static PyObject *__pyx_m;
332static PyObject *__pyx_b;
333static PyObject *__pyx_empty_tuple;
334static PyObject *__pyx_empty_bytes;
335static int __pyx_lineno;
336static int __pyx_clineno = 0;
337static const char * __pyx_cfilenm= __FILE__;
338static const char *__pyx_filename;
339
340
341static const char *__pyx_f[] = {
342  "cwalker.pyx",
343};
344
345/*--- Type declarations ---*/
346struct __pyx_obj_8bintrees_7cwalker_cWalker;
347
348/* "bintrees\cwalker.pxd":11
349 * from stack cimport node_stack_t
350 *
351 * cdef class cWalker:             # <<<<<<<<<<<<<<
352 *     cdef node_t *node
353 *     cdef node_t *root
354 */
355struct __pyx_obj_8bintrees_7cwalker_cWalker {
356  PyObject_HEAD
357  struct __pyx_vtabstruct_8bintrees_7cwalker_cWalker *__pyx_vtab;
358  node_t *node;
359  node_t *root;
360  node_stack_t *stack;
361};
362
363
364
365/* "bintrees\cwalker.pyx":14
366 * from ctrees cimport *
367 *
368 * cdef class cWalker:             # <<<<<<<<<<<<<<
369 *     def __cinit__(self):
370 *         self.root = NULL
371 */
372
373struct __pyx_vtabstruct_8bintrees_7cwalker_cWalker {
374  void (*set_tree)(struct __pyx_obj_8bintrees_7cwalker_cWalker *, node_t *);
375  PyObject *(*reset)(struct __pyx_obj_8bintrees_7cwalker_cWalker *, int __pyx_skip_dispatch);
376  PyObject *(*push)(struct __pyx_obj_8bintrees_7cwalker_cWalker *, int __pyx_skip_dispatch);
377  PyObject *(*pop)(struct __pyx_obj_8bintrees_7cwalker_cWalker *, int __pyx_skip_dispatch);
378};
379static struct __pyx_vtabstruct_8bintrees_7cwalker_cWalker *__pyx_vtabptr_8bintrees_7cwalker_cWalker;
380#ifndef CYTHON_REFNANNY
381  #define CYTHON_REFNANNY 0
382#endif
383#if CYTHON_REFNANNY
384  typedef struct {
385    void (*INCREF)(void*, PyObject*, int);
386    void (*DECREF)(void*, PyObject*, int);
387    void (*GOTREF)(void*, PyObject*, int);
388    void (*GIVEREF)(void*, PyObject*, int);
389    void* (*SetupContext)(const char*, int, const char*);
390    void (*FinishContext)(void**);
391  } __Pyx_RefNannyAPIStruct;
392  static __Pyx_RefNannyAPIStruct *__Pyx_RefNanny = NULL;
393  static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname); /*proto*/
394  #define __Pyx_RefNannyDeclarations void *__pyx_refnanny = NULL;
395#ifdef WITH_THREAD
396  #define __Pyx_RefNannySetupContext(name, acquire_gil) \
397          if (acquire_gil) { \
398              PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure(); \
399              __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__); \
400              PyGILState_Release(__pyx_gilstate_save); \
401          } else { \
402              __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__); \
403          }
404#else
405  #define __Pyx_RefNannySetupContext(name, acquire_gil) \
406          __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__)
407#endif
408  #define __Pyx_RefNannyFinishContext() \
409          __Pyx_RefNanny->FinishContext(&__pyx_refnanny)
410  #define __Pyx_INCREF(r)  __Pyx_RefNanny->INCREF(__pyx_refnanny, (PyObject *)(r), __LINE__)
411  #define __Pyx_DECREF(r)  __Pyx_RefNanny->DECREF(__pyx_refnanny, (PyObject *)(r), __LINE__)
412  #define __Pyx_GOTREF(r)  __Pyx_RefNanny->GOTREF(__pyx_refnanny, (PyObject *)(r), __LINE__)
413  #define __Pyx_GIVEREF(r) __Pyx_RefNanny->GIVEREF(__pyx_refnanny, (PyObject *)(r), __LINE__)
414  #define __Pyx_XINCREF(r)  do { if((r) != NULL) {__Pyx_INCREF(r); }} while(0)
415  #define __Pyx_XDECREF(r)  do { if((r) != NULL) {__Pyx_DECREF(r); }} while(0)
416  #define __Pyx_XGOTREF(r)  do { if((r) != NULL) {__Pyx_GOTREF(r); }} while(0)
417  #define __Pyx_XGIVEREF(r) do { if((r) != NULL) {__Pyx_GIVEREF(r);}} while(0)
418#else
419  #define __Pyx_RefNannyDeclarations
420  #define __Pyx_RefNannySetupContext(name, acquire_gil)
421  #define __Pyx_RefNannyFinishContext()
422  #define __Pyx_INCREF(r) Py_INCREF(r)
423  #define __Pyx_DECREF(r) Py_DECREF(r)
424  #define __Pyx_GOTREF(r)
425  #define __Pyx_GIVEREF(r)
426  #define __Pyx_XINCREF(r) Py_XINCREF(r)
427  #define __Pyx_XDECREF(r) Py_XDECREF(r)
428  #define __Pyx_XGOTREF(r)
429  #define __Pyx_XGIVEREF(r)
430#endif /* CYTHON_REFNANNY */
431#define __Pyx_CLEAR(r)    do { PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);} while(0)
432#define __Pyx_XCLEAR(r)   do { if((r) != NULL) {PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);}} while(0)
433
434static PyObject *__Pyx_GetName(PyObject *dict, PyObject *name); /*proto*/
435
436static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact,
437    Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found); /*proto*/
438
439static CYTHON_INLINE int __Pyx_CheckKeywordStrings(PyObject *kwdict, const char* function_name, int kw_allowed); /*proto*/
440
441static CYTHON_INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *tb); /*proto*/
442static CYTHON_INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyObject **tb); /*proto*/
443
444static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause); /*proto*/
445
446static CYTHON_INLINE unsigned char __Pyx_PyInt_AsUnsignedChar(PyObject *);
447
448static CYTHON_INLINE unsigned short __Pyx_PyInt_AsUnsignedShort(PyObject *);
449
450static CYTHON_INLINE unsigned int __Pyx_PyInt_AsUnsignedInt(PyObject *);
451
452static CYTHON_INLINE char __Pyx_PyInt_AsChar(PyObject *);
453
454static CYTHON_INLINE short __Pyx_PyInt_AsShort(PyObject *);
455
456static CYTHON_INLINE int __Pyx_PyInt_AsInt(PyObject *);
457
458static CYTHON_INLINE signed char __Pyx_PyInt_AsSignedChar(PyObject *);
459
460static CYTHON_INLINE signed short __Pyx_PyInt_AsSignedShort(PyObject *);
461
462static CYTHON_INLINE signed int __Pyx_PyInt_AsSignedInt(PyObject *);
463
464static CYTHON_INLINE int __Pyx_PyInt_AsLongDouble(PyObject *);
465
466static CYTHON_INLINE unsigned long __Pyx_PyInt_AsUnsignedLong(PyObject *);
467
468static CYTHON_INLINE unsigned PY_LONG_LONG __Pyx_PyInt_AsUnsignedLongLong(PyObject *);
469
470static CYTHON_INLINE long __Pyx_PyInt_AsLong(PyObject *);
471
472static CYTHON_INLINE PY_LONG_LONG __Pyx_PyInt_AsLongLong(PyObject *);
473
474static CYTHON_INLINE signed long __Pyx_PyInt_AsSignedLong(PyObject *);
475
476static CYTHON_INLINE signed PY_LONG_LONG __Pyx_PyInt_AsSignedLongLong(PyObject *);
477
478static void __Pyx_WriteUnraisable(const char *name, int clineno,
479                                  int lineno, const char *filename); /*proto*/
480
481static int __Pyx_check_binary_version(void);
482
483static int __Pyx_SetVtable(PyObject *dict, void *vtable); /*proto*/
484
485typedef struct {
486    int code_line;
487    PyCodeObject* code_object;
488} __Pyx_CodeObjectCacheEntry;
489struct __Pyx_CodeObjectCache {
490    int count;
491    int max_count;
492    __Pyx_CodeObjectCacheEntry* entries;
493};
494static struct __Pyx_CodeObjectCache __pyx_code_cache = {0,0,NULL};
495static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line);
496static PyCodeObject *__pyx_find_code_object(int code_line);
497static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object);
498
499static void __Pyx_AddTraceback(const char *funcname, int c_line,
500                               int py_line, const char *filename); /*proto*/
501
502static int __Pyx_InitStrings(__Pyx_StringTabEntry *t); /*proto*/
503
504
505/* Module declarations from 'bintrees.ctrees' */
506
507/* Module declarations from 'bintrees.stack' */
508
509/* Module declarations from 'bintrees.cwalker' */
510static PyTypeObject *__pyx_ptype_8bintrees_7cwalker_cWalker = 0;
511#define __Pyx_MODULE_NAME "bintrees.cwalker"
512int __pyx_module_is_main_bintrees__cwalker = 0;
513
514/* Implementation of 'bintrees.cwalker' */
515static PyObject *__pyx_builtin_property;
516static PyObject *__pyx_builtin_IndexError;
517static PyObject *__pyx_builtin_KeyError;
518static int __pyx_pf_8bintrees_7cwalker_7cWalker___cinit__(struct __pyx_obj_8bintrees_7cwalker_cWalker *__pyx_v_self); /* proto */
519static void __pyx_pf_8bintrees_7cwalker_7cWalker_2__dealloc__(struct __pyx_obj_8bintrees_7cwalker_cWalker *__pyx_v_self); /* proto */
520static PyObject *__pyx_pf_8bintrees_7cwalker_7cWalker_4reset(struct __pyx_obj_8bintrees_7cwalker_cWalker *__pyx_v_self); /* proto */
521static PyObject *__pyx_pf_8bintrees_7cwalker_7cWalker_6key(struct __pyx_obj_8bintrees_7cwalker_cWalker *__pyx_v_self); /* proto */
522static PyObject *__pyx_pf_8bintrees_7cwalker_7cWalker_8value(struct __pyx_obj_8bintrees_7cwalker_cWalker *__pyx_v_self); /* proto */
523static PyObject *__pyx_pf_8bintrees_7cwalker_7cWalker_10item(struct __pyx_obj_8bintrees_7cwalker_cWalker *__pyx_v_self); /* proto */
524static PyObject *__pyx_pf_8bintrees_7cwalker_7cWalker_12is_valid(struct __pyx_obj_8bintrees_7cwalker_cWalker *__pyx_v_self); /* proto */
525static PyObject *__pyx_pf_8bintrees_7cwalker_7cWalker_14goto(struct __pyx_obj_8bintrees_7cwalker_cWalker *__pyx_v_self, PyObject *__pyx_v_key); /* proto */
526static PyObject *__pyx_pf_8bintrees_7cwalker_7cWalker_16push(struct __pyx_obj_8bintrees_7cwalker_cWalker *__pyx_v_self); /* proto */
527static PyObject *__pyx_pf_8bintrees_7cwalker_7cWalker_18pop(struct __pyx_obj_8bintrees_7cwalker_cWalker *__pyx_v_self); /* proto */
528static PyObject *__pyx_pf_8bintrees_7cwalker_7cWalker_20stack_is_empty(struct __pyx_obj_8bintrees_7cwalker_cWalker *__pyx_v_self); /* proto */
529static PyObject *__pyx_pf_8bintrees_7cwalker_7cWalker_22goto_leaf(struct __pyx_obj_8bintrees_7cwalker_cWalker *__pyx_v_self); /* proto */
530static PyObject *__pyx_pf_8bintrees_7cwalker_7cWalker_24has_child(struct __pyx_obj_8bintrees_7cwalker_cWalker *__pyx_v_self, int __pyx_v_direction); /* proto */
531static PyObject *__pyx_pf_8bintrees_7cwalker_7cWalker_26down(struct __pyx_obj_8bintrees_7cwalker_cWalker *__pyx_v_self, int __pyx_v_direction); /* proto */
532static PyObject *__pyx_pf_8bintrees_7cwalker_7cWalker_28go_left(struct __pyx_obj_8bintrees_7cwalker_cWalker *__pyx_v_self); /* proto */
533static PyObject *__pyx_pf_8bintrees_7cwalker_7cWalker_30go_right(struct __pyx_obj_8bintrees_7cwalker_cWalker *__pyx_v_self); /* proto */
534static PyObject *__pyx_pf_8bintrees_7cwalker_7cWalker_32has_left(struct __pyx_obj_8bintrees_7cwalker_cWalker *__pyx_v_self); /* proto */
535static PyObject *__pyx_pf_8bintrees_7cwalker_7cWalker_34has_right(struct __pyx_obj_8bintrees_7cwalker_cWalker *__pyx_v_self); /* proto */
536static PyObject *__pyx_pf_8bintrees_7cwalker_7cWalker_36succ_item(struct __pyx_obj_8bintrees_7cwalker_cWalker *__pyx_v_self, PyObject *__pyx_v_key); /* proto */
537static PyObject *__pyx_pf_8bintrees_7cwalker_7cWalker_38prev_item(struct __pyx_obj_8bintrees_7cwalker_cWalker *__pyx_v_self, PyObject *__pyx_v_key); /* proto */
538static PyObject *__pyx_pf_8bintrees_7cwalker_7cWalker_40floor_item(struct __pyx_obj_8bintrees_7cwalker_cWalker *__pyx_v_self, PyObject *__pyx_v_key); /* proto */
539static PyObject *__pyx_pf_8bintrees_7cwalker_7cWalker_42ceiling_item(struct __pyx_obj_8bintrees_7cwalker_cWalker *__pyx_v_self, PyObject *__pyx_v_key); /* proto */
540static char __pyx_k_1[] = "pop(): stack is empty";
541static char __pyx_k__key[] = "key";
542static char __pyx_k__pop[] = "pop";
543static char __pyx_k__item[] = "item";
544static char __pyx_k__push[] = "push";
545static char __pyx_k__reset[] = "reset";
546static char __pyx_k__value[] = "value";
547static char __pyx_k__KeyError[] = "KeyError";
548static char __pyx_k____main__[] = "__main__";
549static char __pyx_k____test__[] = "__test__";
550static char __pyx_k__is_valid[] = "is_valid";
551static char __pyx_k__property[] = "property";
552static char __pyx_k__IndexError[] = "IndexError";
553static PyObject *__pyx_kp_s_1;
554static PyObject *__pyx_n_s__IndexError;
555static PyObject *__pyx_n_s__KeyError;
556static PyObject *__pyx_n_s____main__;
557static PyObject *__pyx_n_s____test__;
558static PyObject *__pyx_n_s__is_valid;
559static PyObject *__pyx_n_s__item;
560static PyObject *__pyx_n_s__key;
561static PyObject *__pyx_n_s__pop;
562static PyObject *__pyx_n_s__property;
563static PyObject *__pyx_n_s__push;
564static PyObject *__pyx_n_s__reset;
565static PyObject *__pyx_n_s__value;
566static PyObject *__pyx_k_tuple_2;
567
568/* Python wrapper */
569static int __pyx_pw_8bintrees_7cwalker_7cWalker_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
570static int __pyx_pw_8bintrees_7cwalker_7cWalker_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
571  int __pyx_r;
572  __Pyx_RefNannyDeclarations
573  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
574  if (unlikely(PyTuple_GET_SIZE(__pyx_args) > 0)) {
575    __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 0, 0, PyTuple_GET_SIZE(__pyx_args)); return -1;}
576  if (unlikely(__pyx_kwds) && unlikely(PyDict_Size(__pyx_kwds) > 0) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__cinit__", 0))) return -1;
577  __pyx_r = __pyx_pf_8bintrees_7cwalker_7cWalker___cinit__(((struct __pyx_obj_8bintrees_7cwalker_cWalker *)__pyx_v_self));
578  __Pyx_RefNannyFinishContext();
579  return __pyx_r;
580}
581
582/* "bintrees\cwalker.pyx":15
583 *
584 * cdef class cWalker:
585 *     def __cinit__(self):             # <<<<<<<<<<<<<<
586 *         self.root = NULL
587 *         self.node = NULL
588 */
589
590static int __pyx_pf_8bintrees_7cwalker_7cWalker___cinit__(struct __pyx_obj_8bintrees_7cwalker_cWalker *__pyx_v_self) {
591  int __pyx_r;
592  __Pyx_RefNannyDeclarations
593  __Pyx_RefNannySetupContext("__cinit__", 0);
594
595  /* "bintrees\cwalker.pyx":16
596 * cdef class cWalker:
597 *     def __cinit__(self):
598 *         self.root = NULL             # <<<<<<<<<<<<<<
599 *         self.node = NULL
600 *         self.stack = stack_init(MAXSTACK)
601 */
602  __pyx_v_self->root = NULL;
603
604  /* "bintrees\cwalker.pyx":17
605 *     def __cinit__(self):
606 *         self.root = NULL
607 *         self.node = NULL             # <<<<<<<<<<<<<<
608 *         self.stack = stack_init(MAXSTACK)
609 *
610 */
611  __pyx_v_self->node = NULL;
612
613  /* "bintrees\cwalker.pyx":18
614 *         self.root = NULL
615 *         self.node = NULL
616 *         self.stack = stack_init(MAXSTACK)             # <<<<<<<<<<<<<<
617 *
618 *     def __dealloc__(self):
619 */
620  __pyx_v_self->stack = stack_init(32);
621
622  __pyx_r = 0;
623  __Pyx_RefNannyFinishContext();
624  return __pyx_r;
625}
626
627/* Python wrapper */
628static void __pyx_pw_8bintrees_7cwalker_7cWalker_3__dealloc__(PyObject *__pyx_v_self); /*proto*/
629static void __pyx_pw_8bintrees_7cwalker_7cWalker_3__dealloc__(PyObject *__pyx_v_self) {
630  __Pyx_RefNannyDeclarations
631  __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0);
632  __pyx_pf_8bintrees_7cwalker_7cWalker_2__dealloc__(((struct __pyx_obj_8bintrees_7cwalker_cWalker *)__pyx_v_self));
633  __Pyx_RefNannyFinishContext();
634}
635
636/* "bintrees\cwalker.pyx":20
637 *         self.stack = stack_init(MAXSTACK)
638 *
639 *     def __dealloc__(self):             # <<<<<<<<<<<<<<
640 *         stack_delete(self.stack)
641 *
642 */
643
644static void __pyx_pf_8bintrees_7cwalker_7cWalker_2__dealloc__(struct __pyx_obj_8bintrees_7cwalker_cWalker *__pyx_v_self) {
645  __Pyx_RefNannyDeclarations
646  __Pyx_RefNannySetupContext("__dealloc__", 0);
647
648  /* "bintrees\cwalker.pyx":21
649 *
650 *     def __dealloc__(self):
651 *         stack_delete(self.stack)             # <<<<<<<<<<<<<<
652 *
653 *     cdef void set_tree(self, node_t *root):
654 */
655  stack_delete(__pyx_v_self->stack);
656
657  __Pyx_RefNannyFinishContext();
658}
659
660/* "bintrees\cwalker.pyx":23
661 *         stack_delete(self.stack)
662 *
663 *     cdef void set_tree(self, node_t *root):             # <<<<<<<<<<<<<<
664 *         self.root = root
665 *         self.reset()
666 */
667
668static void __pyx_f_8bintrees_7cwalker_7cWalker_set_tree(struct __pyx_obj_8bintrees_7cwalker_cWalker *__pyx_v_self, node_t *__pyx_v_root) {
669  __Pyx_RefNannyDeclarations
670  PyObject *__pyx_t_1 = NULL;
671  int __pyx_lineno = 0;
672  const char *__pyx_filename = NULL;
673  int __pyx_clineno = 0;
674  __Pyx_RefNannySetupContext("set_tree", 0);
675
676  /* "bintrees\cwalker.pyx":24
677 *
678 *     cdef void set_tree(self, node_t *root):
679 *         self.root = root             # <<<<<<<<<<<<<<
680 *         self.reset()
681 *
682 */
683  __pyx_v_self->root = __pyx_v_root;
684
685  /* "bintrees\cwalker.pyx":25
686 *     cdef void set_tree(self, node_t *root):
687 *         self.root = root
688 *         self.reset()             # <<<<<<<<<<<<<<
689 *
690 *     cpdef reset(self):
691 */
692  __pyx_t_1 = ((struct __pyx_vtabstruct_8bintrees_7cwalker_cWalker *)__pyx_v_self->__pyx_vtab)->reset(__pyx_v_self, 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 25; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
693  __Pyx_GOTREF(__pyx_t_1);
694  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
695
696  goto __pyx_L0;
697  __pyx_L1_error:;
698  __Pyx_XDECREF(__pyx_t_1);
699  __Pyx_WriteUnraisable("bintrees.cwalker.cWalker.set_tree", __pyx_clineno, __pyx_lineno, __pyx_filename);
700  __pyx_L0:;
701  __Pyx_RefNannyFinishContext();
702}
703
704/* "bintrees\cwalker.pyx":27
705 *         self.reset()
706 *
707 *     cpdef reset(self):             # <<<<<<<<<<<<<<
708 *         stack_reset(self.stack)
709 *         self.node = self.root
710 */
711
712static PyObject *__pyx_pw_8bintrees_7cwalker_7cWalker_5reset(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
713static PyObject *__pyx_f_8bintrees_7cwalker_7cWalker_reset(struct __pyx_obj_8bintrees_7cwalker_cWalker *__pyx_v_self, int __pyx_skip_dispatch) {
714  PyObject *__pyx_r = NULL;
715  __Pyx_RefNannyDeclarations
716  PyObject *__pyx_t_1 = NULL;
717  PyObject *__pyx_t_2 = NULL;
718  node_t *__pyx_t_3;
719  int __pyx_lineno = 0;
720  const char *__pyx_filename = NULL;
721  int __pyx_clineno = 0;
722  __Pyx_RefNannySetupContext("reset", 0);
723  /* Check if called by wrapper */
724  if (unlikely(__pyx_skip_dispatch)) ;
725  /* Check if overriden in Python */
726  else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
727    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__reset); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 27; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
728    __Pyx_GOTREF(__pyx_t_1);
729    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_8bintrees_7cwalker_7cWalker_5reset)) {
730      __Pyx_XDECREF(__pyx_r);
731      __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 27; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
732      __Pyx_GOTREF(__pyx_t_2);
733      __pyx_r = __pyx_t_2;
734      __pyx_t_2 = 0;
735      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
736      goto __pyx_L0;
737    }
738    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
739  }
740
741  /* "bintrees\cwalker.pyx":28
742 *
743 *     cpdef reset(self):
744 *         stack_reset(self.stack)             # <<<<<<<<<<<<<<
745 *         self.node = self.root
746 *
747 */
748  stack_reset(__pyx_v_self->stack);
749
750  /* "bintrees\cwalker.pyx":29
751 *     cpdef reset(self):
752 *         stack_reset(self.stack)
753 *         self.node = self.root             # <<<<<<<<<<<<<<
754 *
755 *     @property
756 */
757  __pyx_t_3 = __pyx_v_self->root;
758  __pyx_v_self->node = __pyx_t_3;
759
760  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
761  goto __pyx_L0;
762  __pyx_L1_error:;
763  __Pyx_XDECREF(__pyx_t_1);
764  __Pyx_XDECREF(__pyx_t_2);
765  __Pyx_AddTraceback("bintrees.cwalker.cWalker.reset", __pyx_clineno, __pyx_lineno, __pyx_filename);
766  __pyx_r = 0;
767  __pyx_L0:;
768  __Pyx_XGIVEREF(__pyx_r);
769  __Pyx_RefNannyFinishContext();
770  return __pyx_r;
771}
772
773/* Python wrapper */
774static PyObject *__pyx_pw_8bintrees_7cwalker_7cWalker_5reset(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
775static PyObject *__pyx_pw_8bintrees_7cwalker_7cWalker_5reset(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
776  PyObject *__pyx_r = 0;
777  __Pyx_RefNannyDeclarations
778  __Pyx_RefNannySetupContext("reset (wrapper)", 0);
779  __pyx_r = __pyx_pf_8bintrees_7cwalker_7cWalker_4reset(((struct __pyx_obj_8bintrees_7cwalker_cWalker *)__pyx_v_self));
780  __Pyx_RefNannyFinishContext();
781  return __pyx_r;
782}
783
784/* "bintrees\cwalker.pyx":27
785 *         self.reset()
786 *
787 *     cpdef reset(self):             # <<<<<<<<<<<<<<
788 *         stack_reset(self.stack)
789 *         self.node = self.root
790 */
791
792static PyObject *__pyx_pf_8bintrees_7cwalker_7cWalker_4reset(struct __pyx_obj_8bintrees_7cwalker_cWalker *__pyx_v_self) {
793  PyObject *__pyx_r = NULL;
794  __Pyx_RefNannyDeclarations
795  PyObject *__pyx_t_1 = NULL;
796  int __pyx_lineno = 0;
797  const char *__pyx_filename = NULL;
798  int __pyx_clineno = 0;
799  __Pyx_RefNannySetupContext("reset", 0);
800  __Pyx_XDECREF(__pyx_r);
801  __pyx_t_1 = ((struct __pyx_vtabstruct_8bintrees_7cwalker_cWalker *)__pyx_v_self->__pyx_vtab)->reset(__pyx_v_self, 1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 27; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
802  __Pyx_GOTREF(__pyx_t_1);
803  __pyx_r = __pyx_t_1;
804  __pyx_t_1 = 0;
805  goto __pyx_L0;
806
807  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
808  goto __pyx_L0;
809  __pyx_L1_error:;
810  __Pyx_XDECREF(__pyx_t_1);
811  __Pyx_AddTraceback("bintrees.cwalker.cWalker.reset", __pyx_clineno, __pyx_lineno, __pyx_filename);
812  __pyx_r = NULL;
813  __pyx_L0:;
814  __Pyx_XGIVEREF(__pyx_r);
815  __Pyx_RefNannyFinishContext();
816  return __pyx_r;
817}
818
819/* Python wrapper */
820static PyObject *__pyx_pw_8bintrees_7cwalker_7cWalker_7key(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
821static PyObject *__pyx_pw_8bintrees_7cwalker_7cWalker_7key(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
822  PyObject *__pyx_r = 0;
823  __Pyx_RefNannyDeclarations
824  __Pyx_RefNannySetupContext("key (wrapper)", 0);
825  __pyx_r = __pyx_pf_8bintrees_7cwalker_7cWalker_6key(((struct __pyx_obj_8bintrees_7cwalker_cWalker *)__pyx_v_self));
826  __Pyx_RefNannyFinishContext();
827  return __pyx_r;
828}
829
830/* "bintrees\cwalker.pyx":32
831 *
832 *     @property
833 *     def key(self):             # <<<<<<<<<<<<<<
834 *         return <object> self.node.key
835 *
836 */
837
838static PyObject *__pyx_pf_8bintrees_7cwalker_7cWalker_6key(struct __pyx_obj_8bintrees_7cwalker_cWalker *__pyx_v_self) {
839  PyObject *__pyx_r = NULL;
840  __Pyx_RefNannyDeclarations
841  __Pyx_RefNannySetupContext("key", 0);
842
843  /* "bintrees\cwalker.pyx":33
844 *     @property
845 *     def key(self):
846 *         return <object> self.node.key             # <<<<<<<<<<<<<<
847 *
848 *     @property
849 */
850  __Pyx_XDECREF(__pyx_r);
851  __Pyx_INCREF(((PyObject *)__pyx_v_self->node->key));
852  __pyx_r = ((PyObject *)__pyx_v_self->node->key);
853  goto __pyx_L0;
854
855  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
856  __pyx_L0:;
857  __Pyx_XGIVEREF(__pyx_r);
858  __Pyx_RefNannyFinishContext();
859  return __pyx_r;
860}
861
862/* Python wrapper */
863static PyObject *__pyx_pw_8bintrees_7cwalker_7cWalker_9value(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
864static PyObject *__pyx_pw_8bintrees_7cwalker_7cWalker_9value(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
865  PyObject *__pyx_r = 0;
866  __Pyx_RefNannyDeclarations
867  __Pyx_RefNannySetupContext("value (wrapper)", 0);
868  __pyx_r = __pyx_pf_8bintrees_7cwalker_7cWalker_8value(((struct __pyx_obj_8bintrees_7cwalker_cWalker *)__pyx_v_self));
869  __Pyx_RefNannyFinishContext();
870  return __pyx_r;
871}
872
873/* "bintrees\cwalker.pyx":36
874 *
875 *     @property
876 *     def value(self):             # <<<<<<<<<<<<<<
877 *         return <object> self.node.value
878 *
879 */
880
881static PyObject *__pyx_pf_8bintrees_7cwalker_7cWalker_8value(struct __pyx_obj_8bintrees_7cwalker_cWalker *__pyx_v_self) {
882  PyObject *__pyx_r = NULL;
883  __Pyx_RefNannyDeclarations
884  __Pyx_RefNannySetupContext("value", 0);
885
886  /* "bintrees\cwalker.pyx":37
887 *     @property
888 *     def value(self):
889 *         return <object> self.node.value             # <<<<<<<<<<<<<<
890 *
891 *     @property
892 */
893  __Pyx_XDECREF(__pyx_r);
894  __Pyx_INCREF(((PyObject *)__pyx_v_self->node->value));
895  __pyx_r = ((PyObject *)__pyx_v_self->node->value);
896  goto __pyx_L0;
897
898  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
899  __pyx_L0:;
900  __Pyx_XGIVEREF(__pyx_r);
901  __Pyx_RefNannyFinishContext();
902  return __pyx_r;
903}
904
905/* Python wrapper */
906static PyObject *__pyx_pw_8bintrees_7cwalker_7cWalker_11item(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
907static PyObject *__pyx_pw_8bintrees_7cwalker_7cWalker_11item(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
908  PyObject *__pyx_r = 0;
909  __Pyx_RefNannyDeclarations
910  __Pyx_RefNannySetupContext("item (wrapper)", 0);
911  __pyx_r = __pyx_pf_8bintrees_7cwalker_7cWalker_10item(((struct __pyx_obj_8bintrees_7cwalker_cWalker *)__pyx_v_self));
912  __Pyx_RefNannyFinishContext();
913  return __pyx_r;
914}
915
916/* "bintrees\cwalker.pyx":40
917 *
918 *     @property
919 *     def item(self):             # <<<<<<<<<<<<<<
920 *         return (<object>self.node.key, <object>self.node.value)
921 *
922 */
923
924static PyObject *__pyx_pf_8bintrees_7cwalker_7cWalker_10item(struct __pyx_obj_8bintrees_7cwalker_cWalker *__pyx_v_self) {
925  PyObject *__pyx_r = NULL;
926  __Pyx_RefNannyDeclarations
927  PyObject *__pyx_t_1 = NULL;
928  int __pyx_lineno = 0;
929  const char *__pyx_filename = NULL;
930  int __pyx_clineno = 0;
931  __Pyx_RefNannySetupContext("item", 0);
932
933  /* "bintrees\cwalker.pyx":41
934 *     @property
935 *     def item(self):
936 *         return (<object>self.node.key, <object>self.node.value)             # <<<<<<<<<<<<<<
937 *
938 *     @property
939 */
940  __Pyx_XDECREF(__pyx_r);
941  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 41; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
942  __Pyx_GOTREF(__pyx_t_1);
943  __Pyx_INCREF(((PyObject *)__pyx_v_self->node->key));
944  PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_self->node->key));
945  __Pyx_GIVEREF(((PyObject *)__pyx_v_self->node->key));
946  __Pyx_INCREF(((PyObject *)__pyx_v_self->node->value));
947  PyTuple_SET_ITEM(__pyx_t_1, 1, ((PyObject *)__pyx_v_self->node->value));
948  __Pyx_GIVEREF(((PyObject *)__pyx_v_self->node->value));
949  __pyx_r = ((PyObject *)__pyx_t_1);
950  __pyx_t_1 = 0;
951  goto __pyx_L0;
952
953  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
954  goto __pyx_L0;
955  __pyx_L1_error:;
956  __Pyx_XDECREF(__pyx_t_1);
957  __Pyx_AddTraceback("bintrees.cwalker.cWalker.item", __pyx_clineno, __pyx_lineno, __pyx_filename);
958  __pyx_r = NULL;
959  __pyx_L0:;
960  __Pyx_XGIVEREF(__pyx_r);
961  __Pyx_RefNannyFinishContext();
962  return __pyx_r;
963}
964
965/* Python wrapper */
966static PyObject *__pyx_pw_8bintrees_7cwalker_7cWalker_13is_valid(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
967static PyObject *__pyx_pw_8bintrees_7cwalker_7cWalker_13is_valid(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
968  PyObject *__pyx_r = 0;
969  __Pyx_RefNannyDeclarations
970  __Pyx_RefNannySetupContext("is_valid (wrapper)", 0);
971  __pyx_r = __pyx_pf_8bintrees_7cwalker_7cWalker_12is_valid(((struct __pyx_obj_8bintrees_7cwalker_cWalker *)__pyx_v_self));
972  __Pyx_RefNannyFinishContext();
973  return __pyx_r;
974}
975
976/* "bintrees\cwalker.pyx":44
977 *
978 *     @property
979 *     def is_valid(self):             # <<<<<<<<<<<<<<
980 *         return self.node != NULL
981 *
982 */
983
984static PyObject *__pyx_pf_8bintrees_7cwalker_7cWalker_12is_valid(struct __pyx_obj_8bintrees_7cwalker_cWalker *__pyx_v_self) {
985  PyObject *__pyx_r = NULL;
986  __Pyx_RefNannyDeclarations
987  PyObject *__pyx_t_1 = NULL;
988  int __pyx_lineno = 0;
989  const char *__pyx_filename = NULL;
990  int __pyx_clineno = 0;
991  __Pyx_RefNannySetupContext("is_valid", 0);
992
993  /* "bintrees\cwalker.pyx":45
994 *     @property
995 *     def is_valid(self):
996 *         return self.node != NULL             # <<<<<<<<<<<<<<
997 *
998 *     def goto(self, key):
999 */
1000  __Pyx_XDECREF(__pyx_r);
1001  __pyx_t_1 = __Pyx_PyBool_FromLong((__pyx_v_self->node != NULL)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1002  __Pyx_GOTREF(__pyx_t_1);
1003  __pyx_r = __pyx_t_1;
1004  __pyx_t_1 = 0;
1005  goto __pyx_L0;
1006
1007  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
1008  goto __pyx_L0;
1009  __pyx_L1_error:;
1010  __Pyx_XDECREF(__pyx_t_1);
1011  __Pyx_AddTraceback("bintrees.cwalker.cWalker.is_valid", __pyx_clineno, __pyx_lineno, __pyx_filename);
1012  __pyx_r = NULL;
1013  __pyx_L0:;
1014  __Pyx_XGIVEREF(__pyx_r);
1015  __Pyx_RefNannyFinishContext();
1016  return __pyx_r;
1017}
1018
1019/* Python wrapper */
1020static PyObject *__pyx_pw_8bintrees_7cwalker_7cWalker_15goto(PyObject *__pyx_v_self, PyObject *__pyx_v_key); /*proto*/
1021static PyObject *__pyx_pw_8bintrees_7cwalker_7cWalker_15goto(PyObject *__pyx_v_self, PyObject *__pyx_v_key) {
1022  PyObject *__pyx_r = 0;
1023  __Pyx_RefNannyDeclarations
1024  __Pyx_RefNannySetupContext("goto (wrapper)", 0);
1025  __pyx_r = __pyx_pf_8bintrees_7cwalker_7cWalker_14goto(((struct __pyx_obj_8bintrees_7cwalker_cWalker *)__pyx_v_self), ((PyObject *)__pyx_v_key));
1026  __Pyx_RefNannyFinishContext();
1027  return __pyx_r;
1028}
1029
1030/* "bintrees\cwalker.pyx":47
1031 *         return self.node != NULL
1032 *
1033 *     def goto(self, key):             # <<<<<<<<<<<<<<
1034 *         cdef int cval
1035 *         self.node = self.root
1036 */
1037
1038static PyObject *__pyx_pf_8bintrees_7cwalker_7cWalker_14goto(struct __pyx_obj_8bintrees_7cwalker_cWalker *__pyx_v_self, PyObject *__pyx_v_key) {
1039  int __pyx_v_cval;
1040  PyObject *__pyx_r = NULL;
1041  __Pyx_RefNannyDeclarations
1042  node_t *__pyx_t_1;
1043  int __pyx_t_2;
1044  PyObject *__pyx_t_3 = NULL;
1045  int __pyx_lineno = 0;
1046  const char *__pyx_filename = NULL;
1047  int __pyx_clineno = 0;
1048  __Pyx_RefNannySetupContext("goto", 0);
1049
1050  /* "bintrees\cwalker.pyx":49
1051 *     def goto(self, key):
1052 *         cdef int cval
1053 *         self.node = self.root             # <<<<<<<<<<<<<<
1054 *         while self.node != NULL:
1055 *             cval = ct_compare(key, <object> self.node.key)
1056 */
1057  __pyx_t_1 = __pyx_v_self->root;
1058  __pyx_v_self->node = __pyx_t_1;
1059
1060  /* "bintrees\cwalker.pyx":50
1061 *         cdef int cval
1062 *         self.node = self.root
1063 *         while self.node != NULL:             # <<<<<<<<<<<<<<
1064 *             cval = ct_compare(key, <object> self.node.key)
1065 *             if cval == 0:
1066 */
1067  while (1) {
1068    __pyx_t_2 = (__pyx_v_self->node != NULL);
1069    if (!__pyx_t_2) break;
1070
1071    /* "bintrees\cwalker.pyx":51
1072 *         self.node = self.root
1073 *         while self.node != NULL:
1074 *             cval = ct_compare(key, <object> self.node.key)             # <<<<<<<<<<<<<<
1075 *             if cval == 0:
1076 *                 return True
1077 */
1078    __pyx_t_3 = ((PyObject *)__pyx_v_self->node->key);
1079    __Pyx_INCREF(__pyx_t_3);
1080    __pyx_v_cval = ct_compare(__pyx_v_key, __pyx_t_3);
1081    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
1082
1083    /* "bintrees\cwalker.pyx":52
1084 *         while self.node != NULL:
1085 *             cval = ct_compare(key, <object> self.node.key)
1086 *             if cval == 0:             # <<<<<<<<<<<<<<
1087 *                 return True
1088 *             elif cval < 0:
1089 */
1090    __pyx_t_2 = (__pyx_v_cval == 0);
1091    if (__pyx_t_2) {
1092
1093      /* "bintrees\cwalker.pyx":53
1094 *             cval = ct_compare(key, <object> self.node.key)
1095 *             if cval == 0:
1096 *                 return True             # <<<<<<<<<<<<<<
1097 *             elif cval < 0:
1098 *                 self.node = self.node.link[0]
1099 */
1100      __Pyx_XDECREF(__pyx_r);
1101      __pyx_t_3 = __Pyx_PyBool_FromLong(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 53; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1102      __Pyx_GOTREF(__pyx_t_3);
1103      __pyx_r = __pyx_t_3;
1104      __pyx_t_3 = 0;
1105      goto __pyx_L0;
1106      goto __pyx_L5;
1107    }
1108
1109    /* "bintrees\cwalker.pyx":54
1110 *             if cval == 0:
1111 *                 return True
1112 *             elif cval < 0:             # <<<<<<<<<<<<<<
1113 *                 self.node = self.node.link[0]
1114 *             else:
1115 */
1116    __pyx_t_2 = (__pyx_v_cval < 0);
1117    if (__pyx_t_2) {
1118
1119      /* "bintrees\cwalker.pyx":55
1120 *                 return True
1121 *             elif cval < 0:
1122 *                 self.node = self.node.link[0]             # <<<<<<<<<<<<<<
1123 *             else:
1124 *                 self.node = self.node.link[1]
1125 */
1126      __pyx_v_self->node = (__pyx_v_self->node->link[0]);
1127      goto __pyx_L5;
1128    }
1129    /*else*/ {
1130
1131      /* "bintrees\cwalker.pyx":57
1132 *                 self.node = self.node.link[0]
1133 *             else:
1134 *                 self.node = self.node.link[1]             # <<<<<<<<<<<<<<
1135 *         return False
1136 *
1137 */
1138      __pyx_v_self->node = (__pyx_v_self->node->link[1]);
1139    }
1140    __pyx_L5:;
1141  }
1142
1143  /* "bintrees\cwalker.pyx":58
1144 *             else:
1145 *                 self.node = self.node.link[1]
1146 *         return False             # <<<<<<<<<<<<<<
1147 *
1148 *     cpdef push(self):
1149 */
1150  __Pyx_XDECREF(__pyx_r);
1151  __pyx_t_3 = __Pyx_PyBool_FromLong(0); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1152  __Pyx_GOTREF(__pyx_t_3);
1153  __pyx_r = __pyx_t_3;
1154  __pyx_t_3 = 0;
1155  goto __pyx_L0;
1156
1157  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
1158  goto __pyx_L0;
1159  __pyx_L1_error:;
1160  __Pyx_XDECREF(__pyx_t_3);
1161  __Pyx_AddTraceback("bintrees.cwalker.cWalker.goto", __pyx_clineno, __pyx_lineno, __pyx_filename);
1162  __pyx_r = NULL;
1163  __pyx_L0:;
1164  __Pyx_XGIVEREF(__pyx_r);
1165  __Pyx_RefNannyFinishContext();
1166  return __pyx_r;
1167}
1168
1169/* "bintrees\cwalker.pyx":60
1170 *         return False
1171 *
1172 *     cpdef push(self):             # <<<<<<<<<<<<<<
1173 *         stack_push(self.stack, self.node)
1174 *
1175 */
1176
1177static PyObject *__pyx_pw_8bintrees_7cwalker_7cWalker_17push(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
1178static PyObject *__pyx_f_8bintrees_7cwalker_7cWalker_push(struct __pyx_obj_8bintrees_7cwalker_cWalker *__pyx_v_self, int __pyx_skip_dispatch) {
1179  PyObject *__pyx_r = NULL;
1180  __Pyx_RefNannyDeclarations
1181  PyObject *__pyx_t_1 = NULL;
1182  PyObject *__pyx_t_2 = NULL;
1183  int __pyx_lineno = 0;
1184  const char *__pyx_filename = NULL;
1185  int __pyx_clineno = 0;
1186  __Pyx_RefNannySetupContext("push", 0);
1187  /* Check if called by wrapper */
1188  if (unlikely(__pyx_skip_dispatch)) ;
1189  /* Check if overriden in Python */
1190  else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
1191    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__push); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1192    __Pyx_GOTREF(__pyx_t_1);
1193    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_8bintrees_7cwalker_7cWalker_17push)) {
1194      __Pyx_XDECREF(__pyx_r);
1195      __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1196      __Pyx_GOTREF(__pyx_t_2);
1197      __pyx_r = __pyx_t_2;
1198      __pyx_t_2 = 0;
1199      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
1200      goto __pyx_L0;
1201    }
1202    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
1203  }
1204
1205  /* "bintrees\cwalker.pyx":61
1206 *
1207 *     cpdef push(self):
1208 *         stack_push(self.stack, self.node)             # <<<<<<<<<<<<<<
1209 *
1210 *     cpdef pop(self):
1211 */
1212  stack_push(__pyx_v_self->stack, __pyx_v_self->node);
1213
1214  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
1215  goto __pyx_L0;
1216  __pyx_L1_error:;
1217  __Pyx_XDECREF(__pyx_t_1);
1218  __Pyx_XDECREF(__pyx_t_2);
1219  __Pyx_AddTraceback("bintrees.cwalker.cWalker.push", __pyx_clineno, __pyx_lineno, __pyx_filename);
1220  __pyx_r = 0;
1221  __pyx_L0:;
1222  __Pyx_XGIVEREF(__pyx_r);
1223  __Pyx_RefNannyFinishContext();
1224  return __pyx_r;
1225}
1226
1227/* Python wrapper */
1228static PyObject *__pyx_pw_8bintrees_7cwalker_7cWalker_17push(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
1229static PyObject *__pyx_pw_8bintrees_7cwalker_7cWalker_17push(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
1230  PyObject *__pyx_r = 0;
1231  __Pyx_RefNannyDeclarations
1232  __Pyx_RefNannySetupContext("push (wrapper)", 0);
1233  __pyx_r = __pyx_pf_8bintrees_7cwalker_7cWalker_16push(((struct __pyx_obj_8bintrees_7cwalker_cWalker *)__pyx_v_self));
1234  __Pyx_RefNannyFinishContext();
1235  return __pyx_r;
1236}
1237
1238/* "bintrees\cwalker.pyx":60
1239 *         return False
1240 *
1241 *     cpdef push(self):             # <<<<<<<<<<<<<<
1242 *         stack_push(self.stack, self.node)
1243 *
1244 */
1245
1246static PyObject *__pyx_pf_8bintrees_7cwalker_7cWalker_16push(struct __pyx_obj_8bintrees_7cwalker_cWalker *__pyx_v_self) {
1247  PyObject *__pyx_r = NULL;
1248  __Pyx_RefNannyDeclarations
1249  PyObject *__pyx_t_1 = NULL;
1250  int __pyx_lineno = 0;
1251  const char *__pyx_filename = NULL;
1252  int __pyx_clineno = 0;
1253  __Pyx_RefNannySetupContext("push", 0);
1254  __Pyx_XDECREF(__pyx_r);
1255  __pyx_t_1 = ((struct __pyx_vtabstruct_8bintrees_7cwalker_cWalker *)__pyx_v_self->__pyx_vtab)->push(__pyx_v_self, 1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1256  __Pyx_GOTREF(__pyx_t_1);
1257  __pyx_r = __pyx_t_1;
1258  __pyx_t_1 = 0;
1259  goto __pyx_L0;
1260
1261  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
1262  goto __pyx_L0;
1263  __pyx_L1_error:;
1264  __Pyx_XDECREF(__pyx_t_1);
1265  __Pyx_AddTraceback("bintrees.cwalker.cWalker.push", __pyx_clineno, __pyx_lineno, __pyx_filename);
1266  __pyx_r = NULL;
1267  __pyx_L0:;
1268  __Pyx_XGIVEREF(__pyx_r);
1269  __Pyx_RefNannyFinishContext();
1270  return __pyx_r;
1271}
1272
1273/* "bintrees\cwalker.pyx":63
1274 *         stack_push(self.stack, self.node)
1275 *
1276 *     cpdef pop(self):             # <<<<<<<<<<<<<<
1277 *         if stack_is_empty(self.stack) != 0:
1278 *             raise IndexError('pop(): stack is empty')
1279 */
1280
1281static PyObject *__pyx_pw_8bintrees_7cwalker_7cWalker_19pop(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
1282static PyObject *__pyx_f_8bintrees_7cwalker_7cWalker_pop(struct __pyx_obj_8bintrees_7cwalker_cWalker *__pyx_v_self, int __pyx_skip_dispatch) {
1283  PyObject *__pyx_r = NULL;
1284  __Pyx_RefNannyDeclarations
1285  PyObject *__pyx_t_1 = NULL;
1286  PyObject *__pyx_t_2 = NULL;
1287  int __pyx_t_3;
1288  int __pyx_lineno = 0;
1289  const char *__pyx_filename = NULL;
1290  int __pyx_clineno = 0;
1291  __Pyx_RefNannySetupContext("pop", 0);
1292  /* Check if called by wrapper */
1293  if (unlikely(__pyx_skip_dispatch)) ;
1294  /* Check if overriden in Python */
1295  else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
1296    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__pop); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1297    __Pyx_GOTREF(__pyx_t_1);
1298    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_8bintrees_7cwalker_7cWalker_19pop)) {
1299      __Pyx_XDECREF(__pyx_r);
1300      __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1301      __Pyx_GOTREF(__pyx_t_2);
1302      __pyx_r = __pyx_t_2;
1303      __pyx_t_2 = 0;
1304      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
1305      goto __pyx_L0;
1306    }
1307    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
1308  }
1309
1310  /* "bintrees\cwalker.pyx":64
1311 *
1312 *     cpdef pop(self):
1313 *         if stack_is_empty(self.stack) != 0:             # <<<<<<<<<<<<<<
1314 *             raise IndexError('pop(): stack is empty')
1315 *         self.node = stack_pop(self.stack)
1316 */
1317  __pyx_t_3 = (stack_is_empty(__pyx_v_self->stack) != 0);
1318  if (__pyx_t_3) {
1319
1320    /* "bintrees\cwalker.pyx":65
1321 *     cpdef pop(self):
1322 *         if stack_is_empty(self.stack) != 0:
1323 *             raise IndexError('pop(): stack is empty')             # <<<<<<<<<<<<<<
1324 *         self.node = stack_pop(self.stack)
1325 *
1326 */
1327    __pyx_t_1 = PyObject_Call(__pyx_builtin_IndexError, ((PyObject *)__pyx_k_tuple_2), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1328    __Pyx_GOTREF(__pyx_t_1);
1329    __Pyx_Raise(__pyx_t_1, 0, 0, 0);
1330    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
1331    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1332    goto __pyx_L3;
1333  }
1334  __pyx_L3:;
1335
1336  /* "bintrees\cwalker.pyx":66
1337 *         if stack_is_empty(self.stack) != 0:
1338 *             raise IndexError('pop(): stack is empty')
1339 *         self.node = stack_pop(self.stack)             # <<<<<<<<<<<<<<
1340 *
1341 *     def stack_is_empty(self):
1342 */
1343  __pyx_v_self->node = stack_pop(__pyx_v_self->stack);
1344
1345  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
1346  goto __pyx_L0;
1347  __pyx_L1_error:;
1348  __Pyx_XDECREF(__pyx_t_1);
1349  __Pyx_XDECREF(__pyx_t_2);
1350  __Pyx_AddTraceback("bintrees.cwalker.cWalker.pop", __pyx_clineno, __pyx_lineno, __pyx_filename);
1351  __pyx_r = 0;
1352  __pyx_L0:;
1353  __Pyx_XGIVEREF(__pyx_r);
1354  __Pyx_RefNannyFinishContext();
1355  return __pyx_r;
1356}
1357
1358/* Python wrapper */
1359static PyObject *__pyx_pw_8bintrees_7cwalker_7cWalker_19pop(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
1360static PyObject *__pyx_pw_8bintrees_7cwalker_7cWalker_19pop(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
1361  PyObject *__pyx_r = 0;
1362  __Pyx_RefNannyDeclarations
1363  __Pyx_RefNannySetupContext("pop (wrapper)", 0);
1364  __pyx_r = __pyx_pf_8bintrees_7cwalker_7cWalker_18pop(((struct __pyx_obj_8bintrees_7cwalker_cWalker *)__pyx_v_self));
1365  __Pyx_RefNannyFinishContext();
1366  return __pyx_r;
1367}
1368
1369/* "bintrees\cwalker.pyx":63
1370 *         stack_push(self.stack, self.node)
1371 *
1372 *     cpdef pop(self):             # <<<<<<<<<<<<<<
1373 *         if stack_is_empty(self.stack) != 0:
1374 *             raise IndexError('pop(): stack is empty')
1375 */
1376
1377static PyObject *__pyx_pf_8bintrees_7cwalker_7cWalker_18pop(struct __pyx_obj_8bintrees_7cwalker_cWalker *__pyx_v_self) {
1378  PyObject *__pyx_r = NULL;
1379  __Pyx_RefNannyDeclarations
1380  PyObject *__pyx_t_1 = NULL;
1381  int __pyx_lineno = 0;
1382  const char *__pyx_filename = NULL;
1383  int __pyx_clineno = 0;
1384  __Pyx_RefNannySetupContext("pop", 0);
1385  __Pyx_XDECREF(__pyx_r);
1386  __pyx_t_1 = ((struct __pyx_vtabstruct_8bintrees_7cwalker_cWalker *)__pyx_v_self->__pyx_vtab)->pop(__pyx_v_self, 1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1387  __Pyx_GOTREF(__pyx_t_1);
1388  __pyx_r = __pyx_t_1;
1389  __pyx_t_1 = 0;
1390  goto __pyx_L0;
1391
1392  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
1393  goto __pyx_L0;
1394  __pyx_L1_error:;
1395  __Pyx_XDECREF(__pyx_t_1);
1396  __Pyx_AddTraceback("bintrees.cwalker.cWalker.pop", __pyx_clineno, __pyx_lineno, __pyx_filename);
1397  __pyx_r = NULL;
1398  __pyx_L0:;
1399  __Pyx_XGIVEREF(__pyx_r);
1400  __Pyx_RefNannyFinishContext();
1401  return __pyx_r;
1402}
1403
1404/* Python wrapper */
1405static PyObject *__pyx_pw_8bintrees_7cwalker_7cWalker_21stack_is_empty(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
1406static PyObject *__pyx_pw_8bintrees_7cwalker_7cWalker_21stack_is_empty(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
1407  PyObject *__pyx_r = 0;
1408  __Pyx_RefNannyDeclarations
1409  __Pyx_RefNannySetupContext("stack_is_empty (wrapper)", 0);
1410  __pyx_r = __pyx_pf_8bintrees_7cwalker_7cWalker_20stack_is_empty(((struct __pyx_obj_8bintrees_7cwalker_cWalker *)__pyx_v_self));
1411  __Pyx_RefNannyFinishContext();
1412  return __pyx_r;
1413}
1414
1415/* "bintrees\cwalker.pyx":68
1416 *         self.node = stack_pop(self.stack)
1417 *
1418 *     def stack_is_empty(self):             # <<<<<<<<<<<<<<
1419 *         return <bint> stack_is_empty(self.stack)
1420 *
1421 */
1422
1423static PyObject *__pyx_pf_8bintrees_7cwalker_7cWalker_20stack_is_empty(struct __pyx_obj_8bintrees_7cwalker_cWalker *__pyx_v_self) {
1424  PyObject *__pyx_r = NULL;
1425  __Pyx_RefNannyDeclarations
1426  PyObject *__pyx_t_1 = NULL;
1427  int __pyx_lineno = 0;
1428  const char *__pyx_filename = NULL;
1429  int __pyx_clineno = 0;
1430  __Pyx_RefNannySetupContext("stack_is_empty", 0);
1431
1432  /* "bintrees\cwalker.pyx":69
1433 *
1434 *     def stack_is_empty(self):
1435 *         return <bint> stack_is_empty(self.stack)             # <<<<<<<<<<<<<<
1436 *
1437 *     def goto_leaf(self):
1438 */
1439  __Pyx_XDECREF(__pyx_r);
1440  __pyx_t_1 = __Pyx_PyBool_FromLong(((int)stack_is_empty(__pyx_v_self->stack))); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1441  __Pyx_GOTREF(__pyx_t_1);
1442  __pyx_r = __pyx_t_1;
1443  __pyx_t_1 = 0;
1444  goto __pyx_L0;
1445
1446  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
1447  goto __pyx_L0;
1448  __pyx_L1_error:;
1449  __Pyx_XDECREF(__pyx_t_1);
1450  __Pyx_AddTraceback("bintrees.cwalker.cWalker.stack_is_empty", __pyx_clineno, __pyx_lineno, __pyx_filename);
1451  __pyx_r = NULL;
1452  __pyx_L0:;
1453  __Pyx_XGIVEREF(__pyx_r);
1454  __Pyx_RefNannyFinishContext();
1455  return __pyx_r;
1456}
1457
1458/* Python wrapper */
1459static PyObject *__pyx_pw_8bintrees_7cwalker_7cWalker_23goto_leaf(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
1460static char __pyx_doc_8bintrees_7cwalker_7cWalker_22goto_leaf[] = " get a leaf node ";
1461static PyObject *__pyx_pw_8bintrees_7cwalker_7cWalker_23goto_leaf(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
1462  PyObject *__pyx_r = 0;
1463  __Pyx_RefNannyDeclarations
1464  __Pyx_RefNannySetupContext("goto_leaf (wrapper)", 0);
1465  __pyx_r = __pyx_pf_8bintrees_7cwalker_7cWalker_22goto_leaf(((struct __pyx_obj_8bintrees_7cwalker_cWalker *)__pyx_v_self));
1466  __Pyx_RefNannyFinishContext();
1467  return __pyx_r;
1468}
1469
1470/* "bintrees\cwalker.pyx":71
1471 *         return <bint> stack_is_empty(self.stack)
1472 *
1473 *     def goto_leaf(self):             # <<<<<<<<<<<<<<
1474 *         """ get a leaf node """
1475 *         while self.node != NULL:
1476 */
1477
1478static PyObject *__pyx_pf_8bintrees_7cwalker_7cWalker_22goto_leaf(struct __pyx_obj_8bintrees_7cwalker_cWalker *__pyx_v_self) {
1479  PyObject *__pyx_r = NULL;
1480  __Pyx_RefNannyDeclarations
1481  int __pyx_t_1;
1482  __Pyx_RefNannySetupContext("goto_leaf", 0);
1483
1484  /* "bintrees\cwalker.pyx":73
1485 *     def goto_leaf(self):
1486 *         """ get a leaf node """
1487 *         while self.node != NULL:             # <<<<<<<<<<<<<<
1488 *             if self.node.link[0] != NULL:
1489 *                 self.node = self.node.link[0]
1490 */
1491  while (1) {
1492    __pyx_t_1 = (__pyx_v_self->node != NULL);
1493    if (!__pyx_t_1) break;
1494
1495    /* "bintrees\cwalker.pyx":74
1496 *         """ get a leaf node """
1497 *         while self.node != NULL:
1498 *             if self.node.link[0] != NULL:             # <<<<<<<<<<<<<<
1499 *                 self.node = self.node.link[0]
1500 *             elif self.node.link[1] != NULL:
1501 */
1502    __pyx_t_1 = ((__pyx_v_self->node->link[0]) != NULL);
1503    if (__pyx_t_1) {
1504
1505      /* "bintrees\cwalker.pyx":75
1506 *         while self.node != NULL:
1507 *             if self.node.link[0] != NULL:
1508 *                 self.node = self.node.link[0]             # <<<<<<<<<<<<<<
1509 *             elif self.node.link[1] != NULL:
1510 *                 self.node = self.node.link[1]
1511 */
1512      __pyx_v_self->node = (__pyx_v_self->node->link[0]);
1513      goto __pyx_L5;
1514    }
1515
1516    /* "bintrees\cwalker.pyx":76
1517 *             if self.node.link[0] != NULL:
1518 *                 self.node = self.node.link[0]
1519 *             elif self.node.link[1] != NULL:             # <<<<<<<<<<<<<<
1520 *                 self.node = self.node.link[1]
1521 *             else:
1522 */
1523    __pyx_t_1 = ((__pyx_v_self->node->link[1]) != NULL);
1524    if (__pyx_t_1) {
1525
1526      /* "bintrees\cwalker.pyx":77
1527 *                 self.node = self.node.link[0]
1528 *             elif self.node.link[1] != NULL:
1529 *                 self.node = self.node.link[1]             # <<<<<<<<<<<<<<
1530 *             else:
1531 *                 return
1532 */
1533      __pyx_v_self->node = (__pyx_v_self->node->link[1]);
1534      goto __pyx_L5;
1535    }
1536    /*else*/ {
1537
1538      /* "bintrees\cwalker.pyx":79
1539 *                 self.node = self.node.link[1]
1540 *             else:
1541 *                 return             # <<<<<<<<<<<<<<
1542 *
1543 *     def has_child(self, int direction):
1544 */
1545      __Pyx_XDECREF(__pyx_r);
1546      __pyx_r = Py_None; __Pyx_INCREF(Py_None);
1547      goto __pyx_L0;
1548    }
1549    __pyx_L5:;
1550  }
1551
1552  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
1553  __pyx_L0:;
1554  __Pyx_XGIVEREF(__pyx_r);
1555  __Pyx_RefNannyFinishContext();
1556  return __pyx_r;
1557}
1558
1559/* Python wrapper */
1560static PyObject *__pyx_pw_8bintrees_7cwalker_7cWalker_25has_child(PyObject *__pyx_v_self, PyObject *__pyx_arg_direction); /*proto*/
1561static PyObject *__pyx_pw_8bintrees_7cwalker_7cWalker_25has_child(PyObject *__pyx_v_self, PyObject *__pyx_arg_direction) {
1562  int __pyx_v_direction;
1563  PyObject *__pyx_r = 0;
1564  __Pyx_RefNannyDeclarations
1565  __Pyx_RefNannySetupContext("has_child (wrapper)", 0);
1566  assert(__pyx_arg_direction); {
1567    __pyx_v_direction = __Pyx_PyInt_AsInt(__pyx_arg_direction); if (unlikely((__pyx_v_direction == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
1568  }
1569  goto __pyx_L4_argument_unpacking_done;
1570  __pyx_L3_error:;
1571  __Pyx_AddTraceback("bintrees.cwalker.cWalker.has_child", __pyx_clineno, __pyx_lineno, __pyx_filename);
1572  __Pyx_RefNannyFinishContext();
1573  return NULL;
1574  __pyx_L4_argument_unpacking_done:;
1575  __pyx_r = __pyx_pf_8bintrees_7cwalker_7cWalker_24has_child(((struct __pyx_obj_8bintrees_7cwalker_cWalker *)__pyx_v_self), ((int)__pyx_v_direction));
1576  __Pyx_RefNannyFinishContext();
1577  return __pyx_r;
1578}
1579
1580/* "bintrees\cwalker.pyx":81
1581 *                 return
1582 *
1583 *     def has_child(self, int direction):             # <<<<<<<<<<<<<<
1584 *         return self.node.link[direction] != NULL
1585 *
1586 */
1587
1588static PyObject *__pyx_pf_8bintrees_7cwalker_7cWalker_24has_child(struct __pyx_obj_8bintrees_7cwalker_cWalker *__pyx_v_self, int __pyx_v_direction) {
1589  PyObject *__pyx_r = NULL;
1590  __Pyx_RefNannyDeclarations
1591  PyObject *__pyx_t_1 = NULL;
1592  int __pyx_lineno = 0;
1593  const char *__pyx_filename = NULL;
1594  int __pyx_clineno = 0;
1595  __Pyx_RefNannySetupContext("has_child", 0);
1596
1597  /* "bintrees\cwalker.pyx":82
1598 *
1599 *     def has_child(self, int direction):
1600 *         return self.node.link[direction] != NULL             # <<<<<<<<<<<<<<
1601 *
1602 *     def down(self, int direction):
1603 */
1604  __Pyx_XDECREF(__pyx_r);
1605  __pyx_t_1 = __Pyx_PyBool_FromLong(((__pyx_v_self->node->link[__pyx_v_direction]) != NULL)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 82; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1606  __Pyx_GOTREF(__pyx_t_1);
1607  __pyx_r = __pyx_t_1;
1608  __pyx_t_1 = 0;
1609  goto __pyx_L0;
1610
1611  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
1612  goto __pyx_L0;
1613  __pyx_L1_error:;
1614  __Pyx_XDECREF(__pyx_t_1);
1615  __Pyx_AddTraceback("bintrees.cwalker.cWalker.has_child", __pyx_clineno, __pyx_lineno, __pyx_filename);
1616  __pyx_r = NULL;
1617  __pyx_L0:;
1618  __Pyx_XGIVEREF(__pyx_r);
1619  __Pyx_RefNannyFinishContext();
1620  return __pyx_r;
1621}
1622
1623/* Python wrapper */
1624static PyObject *__pyx_pw_8bintrees_7cwalker_7cWalker_27down(PyObject *__pyx_v_self, PyObject *__pyx_arg_direction); /*proto*/
1625static PyObject *__pyx_pw_8bintrees_7cwalker_7cWalker_27down(PyObject *__pyx_v_self, PyObject *__pyx_arg_direction) {
1626  int __pyx_v_direction;
1627  PyObject *__pyx_r = 0;
1628  __Pyx_RefNannyDeclarations
1629  __Pyx_RefNannySetupContext("down (wrapper)", 0);
1630  assert(__pyx_arg_direction); {
1631    __pyx_v_direction = __Pyx_PyInt_AsInt(__pyx_arg_direction); if (unlikely((__pyx_v_direction == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 84; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
1632  }
1633  goto __pyx_L4_argument_unpacking_done;
1634  __pyx_L3_error:;
1635  __Pyx_AddTraceback("bintrees.cwalker.cWalker.down", __pyx_clineno, __pyx_lineno, __pyx_filename);
1636  __Pyx_RefNannyFinishContext();
1637  return NULL;
1638  __pyx_L4_argument_unpacking_done:;
1639  __pyx_r = __pyx_pf_8bintrees_7cwalker_7cWalker_26down(((struct __pyx_obj_8bintrees_7cwalker_cWalker *)__pyx_v_self), ((int)__pyx_v_direction));
1640  __Pyx_RefNannyFinishContext();
1641  return __pyx_r;
1642}
1643
1644/* "bintrees\cwalker.pyx":84
1645 *         return self.node.link[direction] != NULL
1646 *
1647 *     def down(self, int direction):             # <<<<<<<<<<<<<<
1648 *         self.node = self.node.link[direction]
1649 *
1650 */
1651
1652static PyObject *__pyx_pf_8bintrees_7cwalker_7cWalker_26down(struct __pyx_obj_8bintrees_7cwalker_cWalker *__pyx_v_self, int __pyx_v_direction) {
1653  PyObject *__pyx_r = NULL;
1654  __Pyx_RefNannyDeclarations
1655  __Pyx_RefNannySetupContext("down", 0);
1656
1657  /* "bintrees\cwalker.pyx":85
1658 *
1659 *     def down(self, int direction):
1660 *         self.node = self.node.link[direction]             # <<<<<<<<<<<<<<
1661 *
1662 *     def go_left(self):
1663 */
1664  __pyx_v_self->node = (__pyx_v_self->node->link[__pyx_v_direction]);
1665
1666  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
1667  __Pyx_XGIVEREF(__pyx_r);
1668  __Pyx_RefNannyFinishContext();
1669  return __pyx_r;
1670}
1671
1672/* Python wrapper */
1673static PyObject *__pyx_pw_8bintrees_7cwalker_7cWalker_29go_left(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
1674static PyObject *__pyx_pw_8bintrees_7cwalker_7cWalker_29go_left(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
1675  PyObject *__pyx_r = 0;
1676  __Pyx_RefNannyDeclarations
1677  __Pyx_RefNannySetupContext("go_left (wrapper)", 0);
1678  __pyx_r = __pyx_pf_8bintrees_7cwalker_7cWalker_28go_left(((struct __pyx_obj_8bintrees_7cwalker_cWalker *)__pyx_v_self));
1679  __Pyx_RefNannyFinishContext();
1680  return __pyx_r;
1681}
1682
1683/* "bintrees\cwalker.pyx":87
1684 *         self.node = self.node.link[direction]
1685 *
1686 *     def go_left(self):             # <<<<<<<<<<<<<<
1687 *         self.node = self.node.link[0]
1688 *
1689 */
1690
1691static PyObject *__pyx_pf_8bintrees_7cwalker_7cWalker_28go_left(struct __pyx_obj_8bintrees_7cwalker_cWalker *__pyx_v_self) {
1692  PyObject *__pyx_r = NULL;
1693  __Pyx_RefNannyDeclarations
1694  __Pyx_RefNannySetupContext("go_left", 0);
1695
1696  /* "bintrees\cwalker.pyx":88
1697 *
1698 *     def go_left(self):
1699 *         self.node = self.node.link[0]             # <<<<<<<<<<<<<<
1700 *
1701 *     def go_right(self):
1702 */
1703  __pyx_v_self->node = (__pyx_v_self->node->link[0]);
1704
1705  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
1706  __Pyx_XGIVEREF(__pyx_r);
1707  __Pyx_RefNannyFinishContext();
1708  return __pyx_r;
1709}
1710
1711/* Python wrapper */
1712static PyObject *__pyx_pw_8bintrees_7cwalker_7cWalker_31go_right(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
1713static PyObject *__pyx_pw_8bintrees_7cwalker_7cWalker_31go_right(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
1714  PyObject *__pyx_r = 0;
1715  __Pyx_RefNannyDeclarations
1716  __Pyx_RefNannySetupContext("go_right (wrapper)", 0);
1717  __pyx_r = __pyx_pf_8bintrees_7cwalker_7cWalker_30go_right(((struct __pyx_obj_8bintrees_7cwalker_cWalker *)__pyx_v_self));
1718  __Pyx_RefNannyFinishContext();
1719  return __pyx_r;
1720}
1721
1722/* "bintrees\cwalker.pyx":90
1723 *         self.node = self.node.link[0]
1724 *
1725 *     def go_right(self):             # <<<<<<<<<<<<<<
1726 *         self.node = self.node.link[1]
1727 *
1728 */
1729
1730static PyObject *__pyx_pf_8bintrees_7cwalker_7cWalker_30go_right(struct __pyx_obj_8bintrees_7cwalker_cWalker *__pyx_v_self) {
1731  PyObject *__pyx_r = NULL;
1732  __Pyx_RefNannyDeclarations
1733  __Pyx_RefNannySetupContext("go_right", 0);
1734
1735  /* "bintrees\cwalker.pyx":91
1736 *
1737 *     def go_right(self):
1738 *         self.node = self.node.link[1]             # <<<<<<<<<<<<<<
1739 *
1740 *     def has_left(self):
1741 */
1742  __pyx_v_self->node = (__pyx_v_self->node->link[1]);
1743
1744  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
1745  __Pyx_XGIVEREF(__pyx_r);
1746  __Pyx_RefNannyFinishContext();
1747  return __pyx_r;
1748}
1749
1750/* Python wrapper */
1751static PyObject *__pyx_pw_8bintrees_7cwalker_7cWalker_33has_left(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
1752static PyObject *__pyx_pw_8bintrees_7cwalker_7cWalker_33has_left(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
1753  PyObject *__pyx_r = 0;
1754  __Pyx_RefNannyDeclarations
1755  __Pyx_RefNannySetupContext("has_left (wrapper)", 0);
1756  __pyx_r = __pyx_pf_8bintrees_7cwalker_7cWalker_32has_left(((struct __pyx_obj_8bintrees_7cwalker_cWalker *)__pyx_v_self));
1757  __Pyx_RefNannyFinishContext();
1758  return __pyx_r;
1759}
1760
1761/* "bintrees\cwalker.pyx":93
1762 *         self.node = self.node.link[1]
1763 *
1764 *     def has_left(self):             # <<<<<<<<<<<<<<
1765 *         return self.node.link[0] != NULL
1766 *
1767 */
1768
1769static PyObject *__pyx_pf_8bintrees_7cwalker_7cWalker_32has_left(struct __pyx_obj_8bintrees_7cwalker_cWalker *__pyx_v_self) {
1770  PyObject *__pyx_r = NULL;
1771  __Pyx_RefNannyDeclarations
1772  PyObject *__pyx_t_1 = NULL;
1773  int __pyx_lineno = 0;
1774  const char *__pyx_filename = NULL;
1775  int __pyx_clineno = 0;
1776  __Pyx_RefNannySetupContext("has_left", 0);
1777
1778  /* "bintrees\cwalker.pyx":94
1779 *
1780 *     def has_left(self):
1781 *         return self.node.link[0] != NULL             # <<<<<<<<<<<<<<
1782 *
1783 *     def has_right(self):
1784 */
1785  __Pyx_XDECREF(__pyx_r);
1786  __pyx_t_1 = __Pyx_PyBool_FromLong(((__pyx_v_self->node->link[0]) != NULL)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 94; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1787  __Pyx_GOTREF(__pyx_t_1);
1788  __pyx_r = __pyx_t_1;
1789  __pyx_t_1 = 0;
1790  goto __pyx_L0;
1791
1792  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
1793  goto __pyx_L0;
1794  __pyx_L1_error:;
1795  __Pyx_XDECREF(__pyx_t_1);
1796  __Pyx_AddTraceback("bintrees.cwalker.cWalker.has_left", __pyx_clineno, __pyx_lineno, __pyx_filename);
1797  __pyx_r = NULL;
1798  __pyx_L0:;
1799  __Pyx_XGIVEREF(__pyx_r);
1800  __Pyx_RefNannyFinishContext();
1801  return __pyx_r;
1802}
1803
1804/* Python wrapper */
1805static PyObject *__pyx_pw_8bintrees_7cwalker_7cWalker_35has_right(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
1806static PyObject *__pyx_pw_8bintrees_7cwalker_7cWalker_35has_right(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
1807  PyObject *__pyx_r = 0;
1808  __Pyx_RefNannyDeclarations
1809  __Pyx_RefNannySetupContext("has_right (wrapper)", 0);
1810  __pyx_r = __pyx_pf_8bintrees_7cwalker_7cWalker_34has_right(((struct __pyx_obj_8bintrees_7cwalker_cWalker *)__pyx_v_self));
1811  __Pyx_RefNannyFinishContext();
1812  return __pyx_r;
1813}
1814
1815/* "bintrees\cwalker.pyx":96
1816 *         return self.node.link[0] != NULL
1817 *
1818 *     def has_right(self):             # <<<<<<<<<<<<<<
1819 *         return self.node.link[1] != NULL
1820 *
1821 */
1822
1823static PyObject *__pyx_pf_8bintrees_7cwalker_7cWalker_34has_right(struct __pyx_obj_8bintrees_7cwalker_cWalker *__pyx_v_self) {
1824  PyObject *__pyx_r = NULL;
1825  __Pyx_RefNannyDeclarations
1826  PyObject *__pyx_t_1 = NULL;
1827  int __pyx_lineno = 0;
1828  const char *__pyx_filename = NULL;
1829  int __pyx_clineno = 0;
1830  __Pyx_RefNannySetupContext("has_right", 0);
1831
1832  /* "bintrees\cwalker.pyx":97
1833 *
1834 *     def has_right(self):
1835 *         return self.node.link[1] != NULL             # <<<<<<<<<<<<<<
1836 *
1837 *     def succ_item(self, key):
1838 */
1839  __Pyx_XDECREF(__pyx_r);
1840  __pyx_t_1 = __Pyx_PyBool_FromLong(((__pyx_v_self->node->link[1]) != NULL)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 97; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1841  __Pyx_GOTREF(__pyx_t_1);
1842  __pyx_r = __pyx_t_1;
1843  __pyx_t_1 = 0;
1844  goto __pyx_L0;
1845
1846  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
1847  goto __pyx_L0;
1848  __pyx_L1_error:;
1849  __Pyx_XDECREF(__pyx_t_1);
1850  __Pyx_AddTraceback("bintrees.cwalker.cWalker.has_right", __pyx_clineno, __pyx_lineno, __pyx_filename);
1851  __pyx_r = NULL;
1852  __pyx_L0:;
1853  __Pyx_XGIVEREF(__pyx_r);
1854  __Pyx_RefNannyFinishContext();
1855  return __pyx_r;
1856}
1857
1858/* Python wrapper */
1859static PyObject *__pyx_pw_8bintrees_7cwalker_7cWalker_37succ_item(PyObject *__pyx_v_self, PyObject *__pyx_v_key); /*proto*/
1860static char __pyx_doc_8bintrees_7cwalker_7cWalker_36succ_item[] = " Get successor (k,v) pair of key, raises KeyError if key is max key\n        or key does not exist.\n        ";
1861static PyObject *__pyx_pw_8bintrees_7cwalker_7cWalker_37succ_item(PyObject *__pyx_v_self, PyObject *__pyx_v_key) {
1862  PyObject *__pyx_r = 0;
1863  __Pyx_RefNannyDeclarations
1864  __Pyx_RefNannySetupContext("succ_item (wrapper)", 0);
1865  __pyx_r = __pyx_pf_8bintrees_7cwalker_7cWalker_36succ_item(((struct __pyx_obj_8bintrees_7cwalker_cWalker *)__pyx_v_self), ((PyObject *)__pyx_v_key));
1866  __Pyx_RefNannyFinishContext();
1867  return __pyx_r;
1868}
1869
1870/* "bintrees\cwalker.pyx":99
1871 *         return self.node.link[1] != NULL
1872 *
1873 *     def succ_item(self, key):             # <<<<<<<<<<<<<<
1874 *         """ Get successor (k,v) pair of key, raises KeyError if key is max key
1875 *         or key does not exist.
1876 */
1877
1878static PyObject *__pyx_pf_8bintrees_7cwalker_7cWalker_36succ_item(struct __pyx_obj_8bintrees_7cwalker_cWalker *__pyx_v_self, PyObject *__pyx_v_key) {
1879  PyObject *__pyx_r = NULL;
1880  __Pyx_RefNannyDeclarations
1881  int __pyx_t_1;
1882  PyObject *__pyx_t_2 = NULL;
1883  PyObject *__pyx_t_3 = NULL;
1884  int __pyx_lineno = 0;
1885  const char *__pyx_filename = NULL;
1886  int __pyx_clineno = 0;
1887  __Pyx_RefNannySetupContext("succ_item", 0);
1888
1889  /* "bintrees\cwalker.pyx":103
1890 *         or key does not exist.
1891 *         """
1892 *         self.node = ct_succ_node(self.root, key)             # <<<<<<<<<<<<<<
1893 *         if self.node == NULL: # given key is biggest in tree
1894 *             raise KeyError(str(key))
1895 */
1896  __pyx_v_self->node = ct_succ_node(__pyx_v_self->root, __pyx_v_key);
1897
1898  /* "bintrees\cwalker.pyx":104
1899 *         """
1900 *         self.node = ct_succ_node(self.root, key)
1901 *         if self.node == NULL: # given key is biggest in tree             # <<<<<<<<<<<<<<
1902 *             raise KeyError(str(key))
1903 *         return (<object> self.node.key, <object> self.node.value)
1904 */
1905  __pyx_t_1 = (__pyx_v_self->node == NULL);
1906  if (__pyx_t_1) {
1907
1908    /* "bintrees\cwalker.pyx":105
1909 *         self.node = ct_succ_node(self.root, key)
1910 *         if self.node == NULL: # given key is biggest in tree
1911 *             raise KeyError(str(key))             # <<<<<<<<<<<<<<
1912 *         return (<object> self.node.key, <object> self.node.value)
1913 *
1914 */
1915    __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1916    __Pyx_GOTREF(__pyx_t_2);
1917    __Pyx_INCREF(__pyx_v_key);
1918    PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_key);
1919    __Pyx_GIVEREF(__pyx_v_key);
1920    __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)(&PyString_Type))), ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1921    __Pyx_GOTREF(__pyx_t_3);
1922    __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
1923    __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1924    __Pyx_GOTREF(__pyx_t_2);
1925    PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_3);
1926    __Pyx_GIVEREF(__pyx_t_3);
1927    __pyx_t_3 = 0;
1928    __pyx_t_3 = PyObject_Call(__pyx_builtin_KeyError, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1929    __Pyx_GOTREF(__pyx_t_3);
1930    __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
1931    __Pyx_Raise(__pyx_t_3, 0, 0, 0);
1932    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
1933    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1934    goto __pyx_L3;
1935  }
1936  __pyx_L3:;
1937
1938  /* "bintrees\cwalker.pyx":106
1939 *         if self.node == NULL: # given key is biggest in tree
1940 *             raise KeyError(str(key))
1941 *         return (<object> self.node.key, <object> self.node.value)             # <<<<<<<<<<<<<<
1942 *
1943 *     def prev_item(self, key):
1944 */
1945  __Pyx_XDECREF(__pyx_r);
1946  __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1947  __Pyx_GOTREF(__pyx_t_3);
1948  __Pyx_INCREF(((PyObject *)__pyx_v_self->node->key));
1949  PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_v_self->node->key));
1950  __Pyx_GIVEREF(((PyObject *)__pyx_v_self->node->key));
1951  __Pyx_INCREF(((PyObject *)__pyx_v_self->node->value));
1952  PyTuple_SET_ITEM(__pyx_t_3, 1, ((PyObject *)__pyx_v_self->node->value));
1953  __Pyx_GIVEREF(((PyObject *)__pyx_v_self->node->value));
1954  __pyx_r = ((PyObject *)__pyx_t_3);
1955  __pyx_t_3 = 0;
1956  goto __pyx_L0;
1957
1958  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
1959  goto __pyx_L0;
1960  __pyx_L1_error:;
1961  __Pyx_XDECREF(__pyx_t_2);
1962  __Pyx_XDECREF(__pyx_t_3);
1963  __Pyx_AddTraceback("bintrees.cwalker.cWalker.succ_item", __pyx_clineno, __pyx_lineno, __pyx_filename);
1964  __pyx_r = NULL;
1965  __pyx_L0:;
1966  __Pyx_XGIVEREF(__pyx_r);
1967  __Pyx_RefNannyFinishContext();
1968  return __pyx_r;
1969}
1970
1971/* Python wrapper */
1972static PyObject *__pyx_pw_8bintrees_7cwalker_7cWalker_39prev_item(PyObject *__pyx_v_self, PyObject *__pyx_v_key); /*proto*/
1973static char __pyx_doc_8bintrees_7cwalker_7cWalker_38prev_item[] = " Get predecessor (k,v) pair of key, raises KeyError if key is min key\n        or key does not exist.\n        ";
1974static PyObject *__pyx_pw_8bintrees_7cwalker_7cWalker_39prev_item(PyObject *__pyx_v_self, PyObject *__pyx_v_key) {
1975  PyObject *__pyx_r = 0;
1976  __Pyx_RefNannyDeclarations
1977  __Pyx_RefNannySetupContext("prev_item (wrapper)", 0);
1978  __pyx_r = __pyx_pf_8bintrees_7cwalker_7cWalker_38prev_item(((struct __pyx_obj_8bintrees_7cwalker_cWalker *)__pyx_v_self), ((PyObject *)__pyx_v_key));
1979  __Pyx_RefNannyFinishContext();
1980  return __pyx_r;
1981}
1982
1983/* "bintrees\cwalker.pyx":108
1984 *         return (<object> self.node.key, <object> self.node.value)
1985 *
1986 *     def prev_item(self, key):             # <<<<<<<<<<<<<<
1987 *         """ Get predecessor (k,v) pair of key, raises KeyError if key is min key
1988 *         or key does not exist.
1989 */
1990
1991static PyObject *__pyx_pf_8bintrees_7cwalker_7cWalker_38prev_item(struct __pyx_obj_8bintrees_7cwalker_cWalker *__pyx_v_self, PyObject *__pyx_v_key) {
1992  PyObject *__pyx_r = NULL;
1993  __Pyx_RefNannyDeclarations
1994  int __pyx_t_1;
1995  PyObject *__pyx_t_2 = NULL;
1996  PyObject *__pyx_t_3 = NULL;
1997  int __pyx_lineno = 0;
1998  const char *__pyx_filename = NULL;
1999  int __pyx_clineno = 0;
2000  __Pyx_RefNannySetupContext("prev_item", 0);
2001
2002  /* "bintrees\cwalker.pyx":112
2003 *         or key does not exist.
2004 *         """
2005 *         self.node = ct_prev_node(self.root, key)             # <<<<<<<<<<<<<<
2006 *         if self.node == NULL: # given key is smallest in tree
2007 *             raise KeyError(str(key))
2008 */
2009  __pyx_v_self->node = ct_prev_node(__pyx_v_self->root, __pyx_v_key);
2010
2011  /* "bintrees\cwalker.pyx":113
2012 *         """
2013 *         self.node = ct_prev_node(self.root, key)
2014 *         if self.node == NULL: # given key is smallest in tree             # <<<<<<<<<<<<<<
2015 *             raise KeyError(str(key))
2016 *         return (<object> self.node.key, <object> self.node.value)
2017 */
2018  __pyx_t_1 = (__pyx_v_self->node == NULL);
2019  if (__pyx_t_1) {
2020
2021    /* "bintrees\cwalker.pyx":114
2022 *         self.node = ct_prev_node(self.root, key)
2023 *         if self.node == NULL: # given key is smallest in tree
2024 *             raise KeyError(str(key))             # <<<<<<<<<<<<<<
2025 *         return (<object> self.node.key, <object> self.node.value)
2026 *
2027 */
2028    __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2029    __Pyx_GOTREF(__pyx_t_2);
2030    __Pyx_INCREF(__pyx_v_key);
2031    PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_key);
2032    __Pyx_GIVEREF(__pyx_v_key);
2033    __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)(&PyString_Type))), ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2034    __Pyx_GOTREF(__pyx_t_3);
2035    __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
2036    __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2037    __Pyx_GOTREF(__pyx_t_2);
2038    PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_3);
2039    __Pyx_GIVEREF(__pyx_t_3);
2040    __pyx_t_3 = 0;
2041    __pyx_t_3 = PyObject_Call(__pyx_builtin_KeyError, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2042    __Pyx_GOTREF(__pyx_t_3);
2043    __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
2044    __Pyx_Raise(__pyx_t_3, 0, 0, 0);
2045    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
2046    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2047    goto __pyx_L3;
2048  }
2049  __pyx_L3:;
2050
2051  /* "bintrees\cwalker.pyx":115
2052 *         if self.node == NULL: # given key is smallest in tree
2053 *             raise KeyError(str(key))
2054 *         return (<object> self.node.key, <object> self.node.value)             # <<<<<<<<<<<<<<
2055 *
2056 *     def floor_item(self, key):
2057 */
2058  __Pyx_XDECREF(__pyx_r);
2059  __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2060  __Pyx_GOTREF(__pyx_t_3);
2061  __Pyx_INCREF(((PyObject *)__pyx_v_self->node->key));
2062  PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_v_self->node->key));
2063  __Pyx_GIVEREF(((PyObject *)__pyx_v_self->node->key));
2064  __Pyx_INCREF(((PyObject *)__pyx_v_self->node->value));
2065  PyTuple_SET_ITEM(__pyx_t_3, 1, ((PyObject *)__pyx_v_self->node->value));
2066  __Pyx_GIVEREF(((PyObject *)__pyx_v_self->node->value));
2067  __pyx_r = ((PyObject *)__pyx_t_3);
2068  __pyx_t_3 = 0;
2069  goto __pyx_L0;
2070
2071  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
2072  goto __pyx_L0;
2073  __pyx_L1_error:;
2074  __Pyx_XDECREF(__pyx_t_2);
2075  __Pyx_XDECREF(__pyx_t_3);
2076  __Pyx_AddTraceback("bintrees.cwalker.cWalker.prev_item", __pyx_clineno, __pyx_lineno, __pyx_filename);
2077  __pyx_r = NULL;
2078  __pyx_L0:;
2079  __Pyx_XGIVEREF(__pyx_r);
2080  __Pyx_RefNannyFinishContext();
2081  return __pyx_r;
2082}
2083
2084/* Python wrapper */
2085static PyObject *__pyx_pw_8bintrees_7cwalker_7cWalker_41floor_item(PyObject *__pyx_v_self, PyObject *__pyx_v_key); /*proto*/
2086static char __pyx_doc_8bintrees_7cwalker_7cWalker_40floor_item[] = " Get the element (k,v) pair associated with the greatest key less\n        than or equal to the given key, raises KeyError if there is no such key.\n        ";
2087static PyObject *__pyx_pw_8bintrees_7cwalker_7cWalker_41floor_item(PyObject *__pyx_v_self, PyObject *__pyx_v_key) {
2088  PyObject *__pyx_r = 0;
2089  __Pyx_RefNannyDeclarations
2090  __Pyx_RefNannySetupContext("floor_item (wrapper)", 0);
2091  __pyx_r = __pyx_pf_8bintrees_7cwalker_7cWalker_40floor_item(((struct __pyx_obj_8bintrees_7cwalker_cWalker *)__pyx_v_self), ((PyObject *)__pyx_v_key));
2092  __Pyx_RefNannyFinishContext();
2093  return __pyx_r;
2094}
2095
2096/* "bintrees\cwalker.pyx":117
2097 *         return (<object> self.node.key, <object> self.node.value)
2098 *
2099 *     def floor_item(self, key):             # <<<<<<<<<<<<<<
2100 *         """ Get the element (k,v) pair associated with the greatest key less
2101 *         than or equal to the given key, raises KeyError if there is no such key.
2102 */
2103
2104static PyObject *__pyx_pf_8bintrees_7cwalker_7cWalker_40floor_item(struct __pyx_obj_8bintrees_7cwalker_cWalker *__pyx_v_self, PyObject *__pyx_v_key) {
2105  PyObject *__pyx_r = NULL;
2106  __Pyx_RefNannyDeclarations
2107  int __pyx_t_1;
2108  PyObject *__pyx_t_2 = NULL;
2109  PyObject *__pyx_t_3 = NULL;
2110  int __pyx_lineno = 0;
2111  const char *__pyx_filename = NULL;
2112  int __pyx_clineno = 0;
2113  __Pyx_RefNannySetupContext("floor_item", 0);
2114
2115  /* "bintrees\cwalker.pyx":121
2116 *         than or equal to the given key, raises KeyError if there is no such key.
2117 *         """
2118 *         self.node = ct_floor_node(self.root, key)             # <<<<<<<<<<<<<<
2119 *         if self.node == NULL:  # given key is smaller than min-key in tree
2120 *             raise KeyError(str(key))
2121 */
2122  __pyx_v_self->node = ct_floor_node(__pyx_v_self->root, __pyx_v_key);
2123
2124  /* "bintrees\cwalker.pyx":122
2125 *         """
2126 *         self.node = ct_floor_node(self.root, key)
2127 *         if self.node == NULL:  # given key is smaller than min-key in tree             # <<<<<<<<<<<<<<
2128 *             raise KeyError(str(key))
2129 *         return (<object> self.node.key, <object> self.node.value)
2130 */
2131  __pyx_t_1 = (__pyx_v_self->node == NULL);
2132  if (__pyx_t_1) {
2133
2134    /* "bintrees\cwalker.pyx":123
2135 *         self.node = ct_floor_node(self.root, key)
2136 *         if self.node == NULL:  # given key is smaller than min-key in tree
2137 *             raise KeyError(str(key))             # <<<<<<<<<<<<<<
2138 *         return (<object> self.node.key, <object> self.node.value)
2139 *
2140 */
2141    __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2142    __Pyx_GOTREF(__pyx_t_2);
2143    __Pyx_INCREF(__pyx_v_key);
2144    PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_key);
2145    __Pyx_GIVEREF(__pyx_v_key);
2146    __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)(&PyString_Type))), ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2147    __Pyx_GOTREF(__pyx_t_3);
2148    __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
2149    __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2150    __Pyx_GOTREF(__pyx_t_2);
2151    PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_3);
2152    __Pyx_GIVEREF(__pyx_t_3);
2153    __pyx_t_3 = 0;
2154    __pyx_t_3 = PyObject_Call(__pyx_builtin_KeyError, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2155    __Pyx_GOTREF(__pyx_t_3);
2156    __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
2157    __Pyx_Raise(__pyx_t_3, 0, 0, 0);
2158    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
2159    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2160    goto __pyx_L3;
2161  }
2162  __pyx_L3:;
2163
2164  /* "bintrees\cwalker.pyx":124
2165 *         if self.node == NULL:  # given key is smaller than min-key in tree
2166 *             raise KeyError(str(key))
2167 *         return (<object> self.node.key, <object> self.node.value)             # <<<<<<<<<<<<<<
2168 *
2169 *     def ceiling_item(self, key):
2170 */
2171  __Pyx_XDECREF(__pyx_r);
2172  __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 124; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2173  __Pyx_GOTREF(__pyx_t_3);
2174  __Pyx_INCREF(((PyObject *)__pyx_v_self->node->key));
2175  PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_v_self->node->key));
2176  __Pyx_GIVEREF(((PyObject *)__pyx_v_self->node->key));
2177  __Pyx_INCREF(((PyObject *)__pyx_v_self->node->value));
2178  PyTuple_SET_ITEM(__pyx_t_3, 1, ((PyObject *)__pyx_v_self->node->value));
2179  __Pyx_GIVEREF(((PyObject *)__pyx_v_self->node->value));
2180  __pyx_r = ((PyObject *)__pyx_t_3);
2181  __pyx_t_3 = 0;
2182  goto __pyx_L0;
2183
2184  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
2185  goto __pyx_L0;
2186  __pyx_L1_error:;
2187  __Pyx_XDECREF(__pyx_t_2);
2188  __Pyx_XDECREF(__pyx_t_3);
2189  __Pyx_AddTraceback("bintrees.cwalker.cWalker.floor_item", __pyx_clineno, __pyx_lineno, __pyx_filename);
2190  __pyx_r = NULL;
2191  __pyx_L0:;
2192  __Pyx_XGIVEREF(__pyx_r);
2193  __Pyx_RefNannyFinishContext();
2194  return __pyx_r;
2195}
2196
2197/* Python wrapper */
2198static PyObject *__pyx_pw_8bintrees_7cwalker_7cWalker_43ceiling_item(PyObject *__pyx_v_self, PyObject *__pyx_v_key); /*proto*/
2199static char __pyx_doc_8bintrees_7cwalker_7cWalker_42ceiling_item[] = " Get the element (k,v) pair associated with the smallest key greater\n        than or equal to the given key, raises KeyError if there is no such key.\n        ";
2200static PyObject *__pyx_pw_8bintrees_7cwalker_7cWalker_43ceiling_item(PyObject *__pyx_v_self, PyObject *__pyx_v_key) {
2201  PyObject *__pyx_r = 0;
2202  __Pyx_RefNannyDeclarations
2203  __Pyx_RefNannySetupContext("ceiling_item (wrapper)", 0);
2204  __pyx_r = __pyx_pf_8bintrees_7cwalker_7cWalker_42ceiling_item(((struct __pyx_obj_8bintrees_7cwalker_cWalker *)__pyx_v_self), ((PyObject *)__pyx_v_key));
2205  __Pyx_RefNannyFinishContext();
2206  return __pyx_r;
2207}
2208
2209/* "bintrees\cwalker.pyx":126
2210 *         return (<object> self.node.key, <object> self.node.value)
2211 *
2212 *     def ceiling_item(self, key):             # <<<<<<<<<<<<<<
2213 *         """ Get the element (k,v) pair associated with the smallest key greater
2214 *         than or equal to the given key, raises KeyError if there is no such key.
2215 */
2216
2217static PyObject *__pyx_pf_8bintrees_7cwalker_7cWalker_42ceiling_item(struct __pyx_obj_8bintrees_7cwalker_cWalker *__pyx_v_self, PyObject *__pyx_v_key) {
2218  PyObject *__pyx_r = NULL;
2219  __Pyx_RefNannyDeclarations
2220  int __pyx_t_1;
2221  PyObject *__pyx_t_2 = NULL;
2222  PyObject *__pyx_t_3 = NULL;
2223  int __pyx_lineno = 0;
2224  const char *__pyx_filename = NULL;
2225  int __pyx_clineno = 0;
2226  __Pyx_RefNannySetupContext("ceiling_item", 0);
2227
2228  /* "bintrees\cwalker.pyx":130
2229 *         than or equal to the given key, raises KeyError if there is no such key.
2230 *         """
2231 *         self.node = ct_ceiling_node(self.root, key)             # <<<<<<<<<<<<<<
2232 *         if self.node == NULL:  # given key is greater than max-key in tree
2233 *             raise KeyError(str(key))
2234 */
2235  __pyx_v_self->node = ct_ceiling_node(__pyx_v_self->root, __pyx_v_key);
2236
2237  /* "bintrees\cwalker.pyx":131
2238 *         """
2239 *         self.node = ct_ceiling_node(self.root, key)
2240 *         if self.node == NULL:  # given key is greater than max-key in tree             # <<<<<<<<<<<<<<
2241 *             raise KeyError(str(key))
2242 *         return (<object> self.node.key, <object> self.node.value)
2243 */
2244  __pyx_t_1 = (__pyx_v_self->node == NULL);
2245  if (__pyx_t_1) {
2246
2247    /* "bintrees\cwalker.pyx":132
2248 *         self.node = ct_ceiling_node(self.root, key)
2249 *         if self.node == NULL:  # given key is greater than max-key in tree
2250 *             raise KeyError(str(key))             # <<<<<<<<<<<<<<
2251 *         return (<object> self.node.key, <object> self.node.value)
2252 */
2253    __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2254    __Pyx_GOTREF(__pyx_t_2);
2255    __Pyx_INCREF(__pyx_v_key);
2256    PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_key);
2257    __Pyx_GIVEREF(__pyx_v_key);
2258    __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)(&PyString_Type))), ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2259    __Pyx_GOTREF(__pyx_t_3);
2260    __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
2261    __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2262    __Pyx_GOTREF(__pyx_t_2);
2263    PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_3);
2264    __Pyx_GIVEREF(__pyx_t_3);
2265    __pyx_t_3 = 0;
2266    __pyx_t_3 = PyObject_Call(__pyx_builtin_KeyError, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2267    __Pyx_GOTREF(__pyx_t_3);
2268    __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
2269    __Pyx_Raise(__pyx_t_3, 0, 0, 0);
2270    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
2271    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2272    goto __pyx_L3;
2273  }
2274  __pyx_L3:;
2275
2276  /* "bintrees\cwalker.pyx":133
2277 *         if self.node == NULL:  # given key is greater than max-key in tree
2278 *             raise KeyError(str(key))
2279 *         return (<object> self.node.key, <object> self.node.value)             # <<<<<<<<<<<<<<
2280 */
2281  __Pyx_XDECREF(__pyx_r);
2282  __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 133; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2283  __Pyx_GOTREF(__pyx_t_3);
2284  __Pyx_INCREF(((PyObject *)__pyx_v_self->node->key));
2285  PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_v_self->node->key));
2286  __Pyx_GIVEREF(((PyObject *)__pyx_v_self->node->key));
2287  __Pyx_INCREF(((PyObject *)__pyx_v_self->node->value));
2288  PyTuple_SET_ITEM(__pyx_t_3, 1, ((PyObject *)__pyx_v_self->node->value));
2289  __Pyx_GIVEREF(((PyObject *)__pyx_v_self->node->value));
2290  __pyx_r = ((PyObject *)__pyx_t_3);
2291  __pyx_t_3 = 0;
2292  goto __pyx_L0;
2293
2294  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
2295  goto __pyx_L0;
2296  __pyx_L1_error:;
2297  __Pyx_XDECREF(__pyx_t_2);
2298  __Pyx_XDECREF(__pyx_t_3);
2299  __Pyx_AddTraceback("bintrees.cwalker.cWalker.ceiling_item", __pyx_clineno, __pyx_lineno, __pyx_filename);
2300  __pyx_r = NULL;
2301  __pyx_L0:;
2302  __Pyx_XGIVEREF(__pyx_r);
2303  __Pyx_RefNannyFinishContext();
2304  return __pyx_r;
2305}
2306static struct __pyx_vtabstruct_8bintrees_7cwalker_cWalker __pyx_vtable_8bintrees_7cwalker_cWalker;
2307
2308static PyObject *__pyx_tp_new_8bintrees_7cwalker_cWalker(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
2309  struct __pyx_obj_8bintrees_7cwalker_cWalker *p;
2310  PyObject *o = (*t->tp_alloc)(t, 0);
2311  if (!o) return 0;
2312  p = ((struct __pyx_obj_8bintrees_7cwalker_cWalker *)o);
2313  p->__pyx_vtab = __pyx_vtabptr_8bintrees_7cwalker_cWalker;
2314  if (__pyx_pw_8bintrees_7cwalker_7cWalker_1__cinit__(o, __pyx_empty_tuple, NULL) < 0) {
2315    Py_DECREF(o); o = 0;
2316  }
2317  return o;
2318}
2319
2320static void __pyx_tp_dealloc_8bintrees_7cwalker_cWalker(PyObject *o) {
2321  {
2322    PyObject *etype, *eval, *etb;
2323    PyErr_Fetch(&etype, &eval, &etb);
2324    ++Py_REFCNT(o);
2325    __pyx_pw_8bintrees_7cwalker_7cWalker_3__dealloc__(o);
2326    if (PyErr_Occurred()) PyErr_WriteUnraisable(o);
2327    --Py_REFCNT(o);
2328    PyErr_Restore(etype, eval, etb);
2329  }
2330  (*Py_TYPE(o)->tp_free)(o);
2331}
2332
2333static PyMethodDef __pyx_methods_8bintrees_7cwalker_cWalker[] = {
2334  {__Pyx_NAMESTR("reset"), (PyCFunction)__pyx_pw_8bintrees_7cwalker_7cWalker_5reset, METH_NOARGS, __Pyx_DOCSTR(0)},
2335  {__Pyx_NAMESTR("key"), (PyCFunction)__pyx_pw_8bintrees_7cwalker_7cWalker_7key, METH_NOARGS, __Pyx_DOCSTR(0)},
2336  {__Pyx_NAMESTR("value"), (PyCFunction)__pyx_pw_8bintrees_7cwalker_7cWalker_9value, METH_NOARGS, __Pyx_DOCSTR(0)},
2337  {__Pyx_NAMESTR("item"), (PyCFunction)__pyx_pw_8bintrees_7cwalker_7cWalker_11item, METH_NOARGS, __Pyx_DOCSTR(0)},
2338  {__Pyx_NAMESTR("is_valid"), (PyCFunction)__pyx_pw_8bintrees_7cwalker_7cWalker_13is_valid, METH_NOARGS, __Pyx_DOCSTR(0)},
2339  {__Pyx_NAMESTR("goto"), (PyCFunction)__pyx_pw_8bintrees_7cwalker_7cWalker_15goto, METH_O, __Pyx_DOCSTR(0)},
2340  {__Pyx_NAMESTR("push"), (PyCFunction)__pyx_pw_8bintrees_7cwalker_7cWalker_17push, METH_NOARGS, __Pyx_DOCSTR(0)},
2341  {__Pyx_NAMESTR("pop"), (PyCFunction)__pyx_pw_8bintrees_7cwalker_7cWalker_19pop, METH_NOARGS, __Pyx_DOCSTR(0)},
2342  {__Pyx_NAMESTR("stack_is_empty"), (PyCFunction)__pyx_pw_8bintrees_7cwalker_7cWalker_21stack_is_empty, METH_NOARGS, __Pyx_DOCSTR(0)},
2343  {__Pyx_NAMESTR("goto_leaf"), (PyCFunction)__pyx_pw_8bintrees_7cwalker_7cWalker_23goto_leaf, METH_NOARGS, __Pyx_DOCSTR(__pyx_doc_8bintrees_7cwalker_7cWalker_22goto_leaf)},
2344  {__Pyx_NAMESTR("has_child"), (PyCFunction)__pyx_pw_8bintrees_7cwalker_7cWalker_25has_child, METH_O, __Pyx_DOCSTR(0)},
2345  {__Pyx_NAMESTR("down"), (PyCFunction)__pyx_pw_8bintrees_7cwalker_7cWalker_27down, METH_O, __Pyx_DOCSTR(0)},
2346  {__Pyx_NAMESTR("go_left"), (PyCFunction)__pyx_pw_8bintrees_7cwalker_7cWalker_29go_left, METH_NOARGS, __Pyx_DOCSTR(0)},
2347  {__Pyx_NAMESTR("go_right"), (PyCFunction)__pyx_pw_8bintrees_7cwalker_7cWalker_31go_right, METH_NOARGS, __Pyx_DOCSTR(0)},
2348  {__Pyx_NAMESTR("has_left"), (PyCFunction)__pyx_pw_8bintrees_7cwalker_7cWalker_33has_left, METH_NOARGS, __Pyx_DOCSTR(0)},
2349  {__Pyx_NAMESTR("has_right"), (PyCFunction)__pyx_pw_8bintrees_7cwalker_7cWalker_35has_right, METH_NOARGS, __Pyx_DOCSTR(0)},
2350  {__Pyx_NAMESTR("succ_item"), (PyCFunction)__pyx_pw_8bintrees_7cwalker_7cWalker_37succ_item, METH_O, __Pyx_DOCSTR(__pyx_doc_8bintrees_7cwalker_7cWalker_36succ_item)},
2351  {__Pyx_NAMESTR("prev_item"), (PyCFunction)__pyx_pw_8bintrees_7cwalker_7cWalker_39prev_item, METH_O, __Pyx_DOCSTR(__pyx_doc_8bintrees_7cwalker_7cWalker_38prev_item)},
2352  {__Pyx_NAMESTR("floor_item"), (PyCFunction)__pyx_pw_8bintrees_7cwalker_7cWalker_41floor_item, METH_O, __Pyx_DOCSTR(__pyx_doc_8bintrees_7cwalker_7cWalker_40floor_item)},
2353  {__Pyx_NAMESTR("ceiling_item"), (PyCFunction)__pyx_pw_8bintrees_7cwalker_7cWalker_43ceiling_item, METH_O, __Pyx_DOCSTR(__pyx_doc_8bintrees_7cwalker_7cWalker_42ceiling_item)},
2354  {0, 0, 0, 0}
2355};
2356
2357static PyNumberMethods __pyx_tp_as_number_cWalker = {
2358  0, /*nb_add*/
2359  0, /*nb_subtract*/
2360  0, /*nb_multiply*/
2361  #if PY_MAJOR_VERSION < 3
2362  0, /*nb_divide*/
2363  #endif
2364  0, /*nb_remainder*/
2365  0, /*nb_divmod*/
2366  0, /*nb_power*/
2367  0, /*nb_negative*/
2368  0, /*nb_positive*/
2369  0, /*nb_absolute*/
2370  0, /*nb_nonzero*/
2371  0, /*nb_invert*/
2372  0, /*nb_lshift*/
2373  0, /*nb_rshift*/
2374  0, /*nb_and*/
2375  0, /*nb_xor*/
2376  0, /*nb_or*/
2377  #if PY_MAJOR_VERSION < 3
2378  0, /*nb_coerce*/
2379  #endif
2380  0, /*nb_int*/
2381  #if PY_MAJOR_VERSION < 3
2382  0, /*nb_long*/
2383  #else
2384  0, /*reserved*/
2385  #endif
2386  0, /*nb_float*/
2387  #if PY_MAJOR_VERSION < 3
2388  0, /*nb_oct*/
2389  #endif
2390  #if PY_MAJOR_VERSION < 3
2391  0, /*nb_hex*/
2392  #endif
2393  0, /*nb_inplace_add*/
2394  0, /*nb_inplace_subtract*/
2395  0, /*nb_inplace_multiply*/
2396  #if PY_MAJOR_VERSION < 3
2397  0, /*nb_inplace_divide*/
2398  #endif
2399  0, /*nb_inplace_remainder*/
2400  0, /*nb_inplace_power*/
2401  0, /*nb_inplace_lshift*/
2402  0, /*nb_inplace_rshift*/
2403  0, /*nb_inplace_and*/
2404  0, /*nb_inplace_xor*/
2405  0, /*nb_inplace_or*/
2406  0, /*nb_floor_divide*/
2407  0, /*nb_true_divide*/
2408  0, /*nb_inplace_floor_divide*/
2409  0, /*nb_inplace_true_divide*/
2410  #if PY_VERSION_HEX >= 0x02050000
2411  0, /*nb_index*/
2412  #endif
2413};
2414
2415static PySequenceMethods __pyx_tp_as_sequence_cWalker = {
2416  0, /*sq_length*/
2417  0, /*sq_concat*/
2418  0, /*sq_repeat*/
2419  0, /*sq_item*/
2420  0, /*sq_slice*/
2421  0, /*sq_ass_item*/
2422  0, /*sq_ass_slice*/
2423  0, /*sq_contains*/
2424  0, /*sq_inplace_concat*/
2425  0, /*sq_inplace_repeat*/
2426};
2427
2428static PyMappingMethods __pyx_tp_as_mapping_cWalker = {
2429  0, /*mp_length*/
2430  0, /*mp_subscript*/
2431  0, /*mp_ass_subscript*/
2432};
2433
2434static PyBufferProcs __pyx_tp_as_buffer_cWalker = {
2435  #if PY_MAJOR_VERSION < 3
2436  0, /*bf_getreadbuffer*/
2437  #endif
2438  #if PY_MAJOR_VERSION < 3
2439  0, /*bf_getwritebuffer*/
2440  #endif
2441  #if PY_MAJOR_VERSION < 3
2442  0, /*bf_getsegcount*/
2443  #endif
2444  #if PY_MAJOR_VERSION < 3
2445  0, /*bf_getcharbuffer*/
2446  #endif
2447  #if PY_VERSION_HEX >= 0x02060000
2448  0, /*bf_getbuffer*/
2449  #endif
2450  #if PY_VERSION_HEX >= 0x02060000
2451  0, /*bf_releasebuffer*/
2452  #endif
2453};
2454
2455static PyTypeObject __pyx_type_8bintrees_7cwalker_cWalker = {
2456  PyVarObject_HEAD_INIT(0, 0)
2457  __Pyx_NAMESTR("bintrees.cwalker.cWalker"), /*tp_name*/
2458  sizeof(struct __pyx_obj_8bintrees_7cwalker_cWalker), /*tp_basicsize*/
2459  0, /*tp_itemsize*/
2460  __pyx_tp_dealloc_8bintrees_7cwalker_cWalker, /*tp_dealloc*/
2461  0, /*tp_print*/
2462  0, /*tp_getattr*/
2463  0, /*tp_setattr*/
2464  #if PY_MAJOR_VERSION < 3
2465  0, /*tp_compare*/
2466  #else
2467  0, /*reserved*/
2468  #endif
2469  0, /*tp_repr*/
2470  &__pyx_tp_as_number_cWalker, /*tp_as_number*/
2471  &__pyx_tp_as_sequence_cWalker, /*tp_as_sequence*/
2472  &__pyx_tp_as_mapping_cWalker, /*tp_as_mapping*/
2473  0, /*tp_hash*/
2474  0, /*tp_call*/
2475  0, /*tp_str*/
2476  0, /*tp_getattro*/
2477  0, /*tp_setattro*/
2478  &__pyx_tp_as_buffer_cWalker, /*tp_as_buffer*/
2479  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE, /*tp_flags*/
2480  0, /*tp_doc*/
2481  0, /*tp_traverse*/
2482  0, /*tp_clear*/
2483  0, /*tp_richcompare*/
2484  0, /*tp_weaklistoffset*/
2485  0, /*tp_iter*/
2486  0, /*tp_iternext*/
2487  __pyx_methods_8bintrees_7cwalker_cWalker, /*tp_methods*/
2488  0, /*tp_members*/
2489  0, /*tp_getset*/
2490  0, /*tp_base*/
2491  0, /*tp_dict*/
2492  0, /*tp_descr_get*/
2493  0, /*tp_descr_set*/
2494  0, /*tp_dictoffset*/
2495  0, /*tp_init*/
2496  0, /*tp_alloc*/
2497  __pyx_tp_new_8bintrees_7cwalker_cWalker, /*tp_new*/
2498  0, /*tp_free*/
2499  0, /*tp_is_gc*/
2500  0, /*tp_bases*/
2501  0, /*tp_mro*/
2502  0, /*tp_cache*/
2503  0, /*tp_subclasses*/
2504  0, /*tp_weaklist*/
2505  0, /*tp_del*/
2506  #if PY_VERSION_HEX >= 0x02060000
2507  0, /*tp_version_tag*/
2508  #endif
2509};
2510
2511static PyMethodDef __pyx_methods[] = {
2512  {0, 0, 0, 0}
2513};
2514
2515#if PY_MAJOR_VERSION >= 3
2516static struct PyModuleDef __pyx_moduledef = {
2517    PyModuleDef_HEAD_INIT,
2518    __Pyx_NAMESTR("cwalker"),
2519    0, /* m_doc */
2520    -1, /* m_size */
2521    __pyx_methods /* m_methods */,
2522    NULL, /* m_reload */
2523    NULL, /* m_traverse */
2524    NULL, /* m_clear */
2525    NULL /* m_free */
2526};
2527#endif
2528
2529static __Pyx_StringTabEntry __pyx_string_tab[] = {
2530  {&__pyx_kp_s_1, __pyx_k_1, sizeof(__pyx_k_1), 0, 0, 1, 0},
2531  {&__pyx_n_s__IndexError, __pyx_k__IndexError, sizeof(__pyx_k__IndexError), 0, 0, 1, 1},
2532  {&__pyx_n_s__KeyError, __pyx_k__KeyError, sizeof(__pyx_k__KeyError), 0, 0, 1, 1},
2533  {&__pyx_n_s____main__, __pyx_k____main__, sizeof(__pyx_k____main__), 0, 0, 1, 1},
2534  {&__pyx_n_s____test__, __pyx_k____test__, sizeof(__pyx_k____test__), 0, 0, 1, 1},
2535  {&__pyx_n_s__is_valid, __pyx_k__is_valid, sizeof(__pyx_k__is_valid), 0, 0, 1, 1},
2536  {&__pyx_n_s__item, __pyx_k__item, sizeof(__pyx_k__item), 0, 0, 1, 1},
2537  {&__pyx_n_s__key, __pyx_k__key, sizeof(__pyx_k__key), 0, 0, 1, 1},
2538  {&__pyx_n_s__pop, __pyx_k__pop, sizeof(__pyx_k__pop), 0, 0, 1, 1},
2539  {&__pyx_n_s__property, __pyx_k__property, sizeof(__pyx_k__property), 0, 0, 1, 1},
2540  {&__pyx_n_s__push, __pyx_k__push, sizeof(__pyx_k__push), 0, 0, 1, 1},
2541  {&__pyx_n_s__reset, __pyx_k__reset, sizeof(__pyx_k__reset), 0, 0, 1, 1},
2542  {&__pyx_n_s__value, __pyx_k__value, sizeof(__pyx_k__value), 0, 0, 1, 1},
2543  {0, 0, 0, 0, 0, 0, 0}
2544};
2545static int __Pyx_InitCachedBuiltins(void) {
2546  __pyx_builtin_property = __Pyx_GetName(__pyx_b, __pyx_n_s__property); if (!__pyx_builtin_property) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2547  __pyx_builtin_IndexError = __Pyx_GetName(__pyx_b, __pyx_n_s__IndexError); if (!__pyx_builtin_IndexError) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2548  __pyx_builtin_KeyError = __Pyx_GetName(__pyx_b, __pyx_n_s__KeyError); if (!__pyx_builtin_KeyError) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2549  return 0;
2550  __pyx_L1_error:;
2551  return -1;
2552}
2553
2554static int __Pyx_InitCachedConstants(void) {
2555  __Pyx_RefNannyDeclarations
2556  __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0);
2557
2558  /* "bintrees\cwalker.pyx":65
2559 *     cpdef pop(self):
2560 *         if stack_is_empty(self.stack) != 0:
2561 *             raise IndexError('pop(): stack is empty')             # <<<<<<<<<<<<<<
2562 *         self.node = stack_pop(self.stack)
2563 *
2564 */
2565  __pyx_k_tuple_2 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2566  __Pyx_GOTREF(__pyx_k_tuple_2);
2567  __Pyx_INCREF(((PyObject *)__pyx_kp_s_1));
2568  PyTuple_SET_ITEM(__pyx_k_tuple_2, 0, ((PyObject *)__pyx_kp_s_1));
2569  __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_1));
2570  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_2));
2571  __Pyx_RefNannyFinishContext();
2572  return 0;
2573  __pyx_L1_error:;
2574  __Pyx_RefNannyFinishContext();
2575  return -1;
2576}
2577
2578static int __Pyx_InitGlobals(void) {
2579  if (__Pyx_InitStrings(__pyx_string_tab) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
2580  return 0;
2581  __pyx_L1_error:;
2582  return -1;
2583}
2584
2585#if PY_MAJOR_VERSION < 3
2586PyMODINIT_FUNC initcwalker(void); /*proto*/
2587PyMODINIT_FUNC initcwalker(void)
2588#else
2589PyMODINIT_FUNC PyInit_cwalker(void); /*proto*/
2590PyMODINIT_FUNC PyInit_cwalker(void)
2591#endif
2592{
2593  PyObject *__pyx_t_1 = NULL;
2594  PyObject *__pyx_t_2 = NULL;
2595  __Pyx_RefNannyDeclarations
2596  #if CYTHON_REFNANNY
2597  __Pyx_RefNanny = __Pyx_RefNannyImportAPI("refnanny");
2598  if (!__Pyx_RefNanny) {
2599      PyErr_Clear();
2600      __Pyx_RefNanny = __Pyx_RefNannyImportAPI("Cython.Runtime.refnanny");
2601      if (!__Pyx_RefNanny)
2602          Py_FatalError("failed to import 'refnanny' module");
2603  }
2604  #endif
2605  __Pyx_RefNannySetupContext("PyMODINIT_FUNC PyInit_cwalker(void)", 0);
2606  if ( __Pyx_check_binary_version() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2607  __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2608  __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2609  #ifdef __Pyx_CyFunction_USED
2610  if (__Pyx_CyFunction_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2611  #endif
2612  #ifdef __Pyx_FusedFunction_USED
2613  if (__pyx_FusedFunction_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2614  #endif
2615  #ifdef __Pyx_Generator_USED
2616  if (__pyx_Generator_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2617  #endif
2618  /*--- Library function declarations ---*/
2619  /*--- Threads initialization code ---*/
2620  #if defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS
2621  #ifdef WITH_THREAD /* Python build with threading support? */
2622  PyEval_InitThreads();
2623  #endif
2624  #endif
2625  /*--- Module creation code ---*/
2626  #if PY_MAJOR_VERSION < 3
2627  __pyx_m = Py_InitModule4(__Pyx_NAMESTR("cwalker"), __pyx_methods, 0, 0, PYTHON_API_VERSION); Py_XINCREF(__pyx_m);
2628  #else
2629  __pyx_m = PyModule_Create(&__pyx_moduledef);
2630  #endif
2631  if (unlikely(!__pyx_m)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2632  #if PY_MAJOR_VERSION >= 3
2633  {
2634    PyObject *modules = PyImport_GetModuleDict(); if (unlikely(!modules)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2635    if (!PyDict_GetItemString(modules, "bintrees.cwalker")) {
2636      if (unlikely(PyDict_SetItemString(modules, "bintrees.cwalker", __pyx_m) < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2637    }
2638  }
2639  #endif
2640  __pyx_b = PyImport_AddModule(__Pyx_NAMESTR(__Pyx_BUILTIN_MODULE_NAME)); if (unlikely(!__pyx_b)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2641  #if CYTHON_COMPILING_IN_PYPY
2642  Py_INCREF(__pyx_b);
2643  #endif
2644  if (__Pyx_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
2645  /*--- Initialize various global constants etc. ---*/
2646  if (unlikely(__Pyx_InitGlobals() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2647  if (__pyx_module_is_main_bintrees__cwalker) {
2648    if (__Pyx_SetAttrString(__pyx_m, "__name__", __pyx_n_s____main__) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
2649  }
2650  /*--- Builtin init code ---*/
2651  if (unlikely(__Pyx_InitCachedBuiltins() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2652  /*--- Constants init code ---*/
2653  if (unlikely(__Pyx_InitCachedConstants() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2654  /*--- Global init code ---*/
2655  /*--- Variable export code ---*/
2656  /*--- Function export code ---*/
2657  /*--- Type init code ---*/
2658  __pyx_vtabptr_8bintrees_7cwalker_cWalker = &__pyx_vtable_8bintrees_7cwalker_cWalker;
2659  __pyx_vtable_8bintrees_7cwalker_cWalker.set_tree = (void (*)(struct __pyx_obj_8bintrees_7cwalker_cWalker *, node_t *))__pyx_f_8bintrees_7cwalker_7cWalker_set_tree;
2660  __pyx_vtable_8bintrees_7cwalker_cWalker.reset = (PyObject *(*)(struct __pyx_obj_8bintrees_7cwalker_cWalker *, int __pyx_skip_dispatch))__pyx_f_8bintrees_7cwalker_7cWalker_reset;
2661  __pyx_vtable_8bintrees_7cwalker_cWalker.push = (PyObject *(*)(struct __pyx_obj_8bintrees_7cwalker_cWalker *, int __pyx_skip_dispatch))__pyx_f_8bintrees_7cwalker_7cWalker_push;
2662  __pyx_vtable_8bintrees_7cwalker_cWalker.pop = (PyObject *(*)(struct __pyx_obj_8bintrees_7cwalker_cWalker *, int __pyx_skip_dispatch))__pyx_f_8bintrees_7cwalker_7cWalker_pop;
2663  if (PyType_Ready(&__pyx_type_8bintrees_7cwalker_cWalker) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 14; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2664  if (__Pyx_SetVtable(__pyx_type_8bintrees_7cwalker_cWalker.tp_dict, __pyx_vtabptr_8bintrees_7cwalker_cWalker) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 14; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2665  if (__Pyx_SetAttrString(__pyx_m, "cWalker", (PyObject *)&__pyx_type_8bintrees_7cwalker_cWalker) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 14; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2666  __pyx_ptype_8bintrees_7cwalker_cWalker = &__pyx_type_8bintrees_7cwalker_cWalker;
2667  /*--- Type import code ---*/
2668  /*--- Variable import code ---*/
2669  /*--- Function import code ---*/
2670  /*--- Execution code ---*/
2671
2672  /* "bintrees\cwalker.pyx":32
2673 *
2674 *     @property
2675 *     def key(self):             # <<<<<<<<<<<<<<
2676 *         return <object> self.node.key
2677 *
2678 */
2679  __pyx_t_1 = __Pyx_GetName((PyObject *)__pyx_ptype_8bintrees_7cwalker_cWalker, __pyx_n_s__key); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2680  __Pyx_GOTREF(__pyx_t_1);
2681  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2682  __Pyx_GOTREF(__pyx_t_2);
2683  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1);
2684  __Pyx_GIVEREF(__pyx_t_1);
2685  __pyx_t_1 = 0;
2686  __pyx_t_1 = PyObject_Call(__pyx_builtin_property, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2687  __Pyx_GOTREF(__pyx_t_1);
2688  __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
2689  if (PyDict_SetItem((PyObject *)__pyx_ptype_8bintrees_7cwalker_cWalker->tp_dict, __pyx_n_s__key, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2690  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
2691  PyType_Modified(__pyx_ptype_8bintrees_7cwalker_cWalker);
2692
2693  /* "bintrees\cwalker.pyx":36
2694 *
2695 *     @property
2696 *     def value(self):             # <<<<<<<<<<<<<<
2697 *         return <object> self.node.value
2698 *
2699 */
2700  __pyx_t_1 = __Pyx_GetName((PyObject *)__pyx_ptype_8bintrees_7cwalker_cWalker, __pyx_n_s__value); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2701  __Pyx_GOTREF(__pyx_t_1);
2702  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 35; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2703  __Pyx_GOTREF(__pyx_t_2);
2704  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1);
2705  __Pyx_GIVEREF(__pyx_t_1);
2706  __pyx_t_1 = 0;
2707  __pyx_t_1 = PyObject_Call(__pyx_builtin_property, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 35; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2708  __Pyx_GOTREF(__pyx_t_1);
2709  __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
2710  if (PyDict_SetItem((PyObject *)__pyx_ptype_8bintrees_7cwalker_cWalker->tp_dict, __pyx_n_s__value, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2711  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
2712  PyType_Modified(__pyx_ptype_8bintrees_7cwalker_cWalker);
2713
2714  /* "bintrees\cwalker.pyx":40
2715 *
2716 *     @property
2717 *     def item(self):             # <<<<<<<<<<<<<<
2718 *         return (<object>self.node.key, <object>self.node.value)
2719 *
2720 */
2721  __pyx_t_1 = __Pyx_GetName((PyObject *)__pyx_ptype_8bintrees_7cwalker_cWalker, __pyx_n_s__item); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 40; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2722  __Pyx_GOTREF(__pyx_t_1);
2723  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 39; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2724  __Pyx_GOTREF(__pyx_t_2);
2725  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1);
2726  __Pyx_GIVEREF(__pyx_t_1);
2727  __pyx_t_1 = 0;
2728  __pyx_t_1 = PyObject_Call(__pyx_builtin_property, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 39; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2729  __Pyx_GOTREF(__pyx_t_1);
2730  __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
2731  if (PyDict_SetItem((PyObject *)__pyx_ptype_8bintrees_7cwalker_cWalker->tp_dict, __pyx_n_s__item, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 40; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2732  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
2733  PyType_Modified(__pyx_ptype_8bintrees_7cwalker_cWalker);
2734
2735  /* "bintrees\cwalker.pyx":44
2736 *
2737 *     @property
2738 *     def is_valid(self):             # <<<<<<<<<<<<<<
2739 *         return self.node != NULL
2740 *
2741 */
2742  __pyx_t_1 = __Pyx_GetName((PyObject *)__pyx_ptype_8bintrees_7cwalker_cWalker, __pyx_n_s__is_valid); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2743  __Pyx_GOTREF(__pyx_t_1);
2744  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 43; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2745  __Pyx_GOTREF(__pyx_t_2);
2746  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1);
2747  __Pyx_GIVEREF(__pyx_t_1);
2748  __pyx_t_1 = 0;
2749  __pyx_t_1 = PyObject_Call(__pyx_builtin_property, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 43; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2750  __Pyx_GOTREF(__pyx_t_1);
2751  __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
2752  if (PyDict_SetItem((PyObject *)__pyx_ptype_8bintrees_7cwalker_cWalker->tp_dict, __pyx_n_s__is_valid, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2753  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
2754  PyType_Modified(__pyx_ptype_8bintrees_7cwalker_cWalker);
2755
2756  /* "bintrees\cwalker.pyx":1
2757 * #!/usr/bin/env python             # <<<<<<<<<<<<<<
2758 * #coding:utf-8
2759 * # Author:  mozman
2760 */
2761  __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2762  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
2763  if (PyObject_SetAttr(__pyx_m, __pyx_n_s____test__, ((PyObject *)__pyx_t_1)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2764  __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
2765  goto __pyx_L0;
2766  __pyx_L1_error:;
2767  __Pyx_XDECREF(__pyx_t_1);
2768  __Pyx_XDECREF(__pyx_t_2);
2769  if (__pyx_m) {
2770    __Pyx_AddTraceback("init bintrees.cwalker", __pyx_clineno, __pyx_lineno, __pyx_filename);
2771    Py_DECREF(__pyx_m); __pyx_m = 0;
2772  } else if (!PyErr_Occurred()) {
2773    PyErr_SetString(PyExc_ImportError, "init bintrees.cwalker");
2774  }
2775  __pyx_L0:;
2776  __Pyx_RefNannyFinishContext();
2777  #if PY_MAJOR_VERSION < 3
2778  return;
2779  #else
2780  return __pyx_m;
2781  #endif
2782}
2783
2784/* Runtime support code */
2785#if CYTHON_REFNANNY
2786static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname) {
2787    PyObject *m = NULL, *p = NULL;
2788    void *r = NULL;
2789    m = PyImport_ImportModule((char *)modname);
2790    if (!m) goto end;
2791    p = PyObject_GetAttrString(m, (char *)"RefNannyAPI");
2792    if (!p) goto end;
2793    r = PyLong_AsVoidPtr(p);
2794end:
2795    Py_XDECREF(p);
2796    Py_XDECREF(m);
2797    return (__Pyx_RefNannyAPIStruct *)r;
2798}
2799#endif /* CYTHON_REFNANNY */
2800
2801static PyObject *__Pyx_GetName(PyObject *dict, PyObject *name) {
2802    PyObject *result;
2803    result = PyObject_GetAttr(dict, name);
2804    if (!result) {
2805        if (dict != __pyx_b) {
2806            PyErr_Clear();
2807            result = PyObject_GetAttr(__pyx_b, name);
2808        }
2809        if (!result) {
2810            PyErr_SetObject(PyExc_NameError, name);
2811        }
2812    }
2813    return result;
2814}
2815
2816static void __Pyx_RaiseArgtupleInvalid(
2817    const char* func_name,
2818    int exact,
2819    Py_ssize_t num_min,
2820    Py_ssize_t num_max,
2821    Py_ssize_t num_found)
2822{
2823    Py_ssize_t num_expected;
2824    const char *more_or_less;
2825    if (num_found < num_min) {
2826        num_expected = num_min;
2827        more_or_less = "at least";
2828    } else {
2829        num_expected = num_max;
2830        more_or_less = "at most";
2831    }
2832    if (exact) {
2833        more_or_less = "exactly";
2834    }
2835    PyErr_Format(PyExc_TypeError,
2836                 "%s() takes %s %" CYTHON_FORMAT_SSIZE_T "d positional argument%s (%" CYTHON_FORMAT_SSIZE_T "d given)",
2837                 func_name, more_or_less, num_expected,
2838                 (num_expected == 1) ? "" : "s", num_found);
2839}
2840
2841static CYTHON_INLINE int __Pyx_CheckKeywordStrings(
2842    PyObject *kwdict,
2843    const char* function_name,
2844    int kw_allowed)
2845{
2846    PyObject* key = 0;
2847    Py_ssize_t pos = 0;
2848#if CPYTHON_COMPILING_IN_PYPY
2849    if (!kw_allowed && PyDict_Next(kwdict, &pos, &key, 0))
2850        goto invalid_keyword;
2851    return 1;
2852#else
2853    while (PyDict_Next(kwdict, &pos, &key, 0)) {
2854        #if PY_MAJOR_VERSION < 3
2855        if (unlikely(!PyString_CheckExact(key)) && unlikely(!PyString_Check(key)))
2856        #endif
2857            if (unlikely(!PyUnicode_Check(key)))
2858                goto invalid_keyword_type;
2859    }
2860    if ((!kw_allowed) && unlikely(key))
2861        goto invalid_keyword;
2862    return 1;
2863invalid_keyword_type:
2864    PyErr_Format(PyExc_TypeError,
2865        "%s() keywords must be strings", function_name);
2866    return 0;
2867#endif
2868invalid_keyword:
2869    PyErr_Format(PyExc_TypeError,
2870    #if PY_MAJOR_VERSION < 3
2871        "%s() got an unexpected keyword argument '%s'",
2872        function_name, PyString_AsString(key));
2873    #else
2874        "%s() got an unexpected keyword argument '%U'",
2875        function_name, key);
2876    #endif
2877    return 0;
2878}
2879
2880static CYTHON_INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *tb) {
2881#if CYTHON_COMPILING_IN_CPYTHON
2882    PyObject *tmp_type, *tmp_value, *tmp_tb;
2883    PyThreadState *tstate = PyThreadState_GET();
2884    tmp_type = tstate->curexc_type;
2885    tmp_value = tstate->curexc_value;
2886    tmp_tb = tstate->curexc_traceback;
2887    tstate->curexc_type = type;
2888    tstate->curexc_value = value;
2889    tstate->curexc_traceback = tb;
2890    Py_XDECREF(tmp_type);
2891    Py_XDECREF(tmp_value);
2892    Py_XDECREF(tmp_tb);
2893#else
2894    PyErr_Restore(type, value, tb);
2895#endif
2896}
2897static CYTHON_INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyObject **tb) {
2898#if CYTHON_COMPILING_IN_CPYTHON
2899    PyThreadState *tstate = PyThreadState_GET();
2900    *type = tstate->curexc_type;
2901    *value = tstate->curexc_value;
2902    *tb = tstate->curexc_traceback;
2903    tstate->curexc_type = 0;
2904    tstate->curexc_value = 0;
2905    tstate->curexc_traceback = 0;
2906#else
2907    PyErr_Fetch(type, value, tb);
2908#endif
2909}
2910
2911#if PY_MAJOR_VERSION < 3
2912static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb,
2913                        CYTHON_UNUSED PyObject *cause) {
2914    Py_XINCREF(type);
2915    if (!value || value == Py_None)
2916        value = NULL;
2917    else
2918        Py_INCREF(value);
2919    if (!tb || tb == Py_None)
2920        tb = NULL;
2921    else {
2922        Py_INCREF(tb);
2923        if (!PyTraceBack_Check(tb)) {
2924            PyErr_SetString(PyExc_TypeError,
2925                "raise: arg 3 must be a traceback or None");
2926            goto raise_error;
2927        }
2928    }
2929    #if PY_VERSION_HEX < 0x02050000
2930    if (PyClass_Check(type)) {
2931    #else
2932    if (PyType_Check(type)) {
2933    #endif
2934#if CYTHON_COMPILING_IN_PYPY
2935        if (!value) {
2936            Py_INCREF(Py_None);
2937            value = Py_None;
2938        }
2939#endif
2940        PyErr_NormalizeException(&type, &value, &tb);
2941    } else {
2942        if (value) {
2943            PyErr_SetString(PyExc_TypeError,
2944                "instance exception may not have a separate value");
2945            goto raise_error;
2946        }
2947        value = type;
2948        #if PY_VERSION_HEX < 0x02050000
2949            if (PyInstance_Check(type)) {
2950                type = (PyObject*) ((PyInstanceObject*)type)->in_class;
2951                Py_INCREF(type);
2952            }
2953            else {
2954                type = 0;
2955                PyErr_SetString(PyExc_TypeError,
2956                    "raise: exception must be an old-style class or instance");
2957                goto raise_error;
2958            }
2959        #else
2960            type = (PyObject*) Py_TYPE(type);
2961            Py_INCREF(type);
2962            if (!PyType_IsSubtype((PyTypeObject *)type, (PyTypeObject *)PyExc_BaseException)) {
2963                PyErr_SetString(PyExc_TypeError,
2964                    "raise: exception class must be a subclass of BaseException");
2965                goto raise_error;
2966            }
2967        #endif
2968    }
2969    __Pyx_ErrRestore(type, value, tb);
2970    return;
2971raise_error:
2972    Py_XDECREF(value);
2973    Py_XDECREF(type);
2974    Py_XDECREF(tb);
2975    return;
2976}
2977#else /* Python 3+ */
2978static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) {
2979    PyObject* owned_instance = NULL;
2980    if (tb == Py_None) {
2981        tb = 0;
2982    } else if (tb && !PyTraceBack_Check(tb)) {
2983        PyErr_SetString(PyExc_TypeError,
2984            "raise: arg 3 must be a traceback or None");
2985        goto bad;
2986    }
2987    if (value == Py_None)
2988        value = 0;
2989    if (PyExceptionInstance_Check(type)) {
2990        if (value) {
2991            PyErr_SetString(PyExc_TypeError,
2992                "instance exception may not have a separate value");
2993            goto bad;
2994        }
2995        value = type;
2996        type = (PyObject*) Py_TYPE(value);
2997    } else if (PyExceptionClass_Check(type)) {
2998        PyObject *args;
2999        if (!value)
3000            args = PyTuple_New(0);
3001        else if (PyTuple_Check(value)) {
3002            Py_INCREF(value);
3003            args = value;
3004        }
3005        else
3006            args = PyTuple_Pack(1, value);
3007        if (!args)
3008            goto bad;
3009        owned_instance = PyEval_CallObject(type, args);
3010        Py_DECREF(args);
3011        if (!owned_instance)
3012            goto bad;
3013        value = owned_instance;
3014        if (!PyExceptionInstance_Check(value)) {
3015            PyErr_Format(PyExc_TypeError,
3016                         "calling %R should have returned an instance of "
3017                         "BaseException, not %R",
3018                         type, Py_TYPE(value));
3019            goto bad;
3020        }
3021    } else {
3022        PyErr_SetString(PyExc_TypeError,
3023            "raise: exception class must be a subclass of BaseException");
3024        goto bad;
3025    }
3026    if (cause && cause != Py_None) {
3027        PyObject *fixed_cause;
3028        if (PyExceptionClass_Check(cause)) {
3029            fixed_cause = PyObject_CallObject(cause, NULL);
3030            if (fixed_cause == NULL)
3031                goto bad;
3032        }
3033        else if (PyExceptionInstance_Check(cause)) {
3034            fixed_cause = cause;
3035            Py_INCREF(fixed_cause);
3036        }
3037        else {
3038            PyErr_SetString(PyExc_TypeError,
3039                            "exception causes must derive from "
3040                            "BaseException");
3041            goto bad;
3042        }
3043        PyException_SetCause(value, fixed_cause);
3044    }
3045    PyErr_SetObject(type, value);
3046    if (tb) {
3047        PyThreadState *tstate = PyThreadState_GET();
3048        PyObject* tmp_tb = tstate->curexc_traceback;
3049        if (tb != tmp_tb) {
3050            Py_INCREF(tb);
3051            tstate->curexc_traceback = tb;
3052            Py_XDECREF(tmp_tb);
3053        }
3054    }
3055bad:
3056    Py_XDECREF(owned_instance);
3057    return;
3058}
3059#endif
3060
3061static CYTHON_INLINE unsigned char __Pyx_PyInt_AsUnsignedChar(PyObject* x) {
3062    const unsigned char neg_one = (unsigned char)-1, const_zero = 0;
3063    const int is_unsigned = neg_one > const_zero;
3064    if (sizeof(unsigned char) < sizeof(long)) {
3065        long val = __Pyx_PyInt_AsLong(x);
3066        if (unlikely(val != (long)(unsigned char)val)) {
3067            if (!unlikely(val == -1 && PyErr_Occurred())) {
3068                PyErr_SetString(PyExc_OverflowError,
3069                    (is_unsigned && unlikely(val < 0)) ?
3070                    "can't convert negative value to unsigned char" :
3071                    "value too large to convert to unsigned char");
3072            }
3073            return (unsigned char)-1;
3074        }
3075        return (unsigned char)val;
3076    }
3077    return (unsigned char)__Pyx_PyInt_AsUnsignedLong(x);
3078}
3079
3080static CYTHON_INLINE unsigned short __Pyx_PyInt_AsUnsignedShort(PyObject* x) {
3081    const unsigned short neg_one = (unsigned short)-1, const_zero = 0;
3082    const int is_unsigned = neg_one > const_zero;
3083    if (sizeof(unsigned short) < sizeof(long)) {
3084        long val = __Pyx_PyInt_AsLong(x);
3085        if (unlikely(val != (long)(unsigned short)val)) {
3086            if (!unlikely(val == -1 && PyErr_Occurred())) {
3087                PyErr_SetString(PyExc_OverflowError,
3088                    (is_unsigned && unlikely(val < 0)) ?
3089                    "can't convert negative value to unsigned short" :
3090                    "value too large to convert to unsigned short");
3091            }
3092            return (unsigned short)-1;
3093        }
3094        return (unsigned short)val;
3095    }
3096    return (unsigned short)__Pyx_PyInt_AsUnsignedLong(x);
3097}
3098
3099static CYTHON_INLINE unsigned int __Pyx_PyInt_AsUnsignedInt(PyObject* x) {
3100    const unsigned int neg_one = (unsigned int)-1, const_zero = 0;
3101    const int is_unsigned = neg_one > const_zero;
3102    if (sizeof(unsigned int) < sizeof(long)) {
3103        long val = __Pyx_PyInt_AsLong(x);
3104        if (unlikely(val != (long)(unsigned int)val)) {
3105            if (!unlikely(val == -1 && PyErr_Occurred())) {
3106                PyErr_SetString(PyExc_OverflowError,
3107                    (is_unsigned && unlikely(val < 0)) ?
3108                    "can't convert negative value to unsigned int" :
3109                    "value too large to convert to unsigned int");
3110            }
3111            return (unsigned int)-1;
3112        }
3113        return (unsigned int)val;
3114    }
3115    return (unsigned int)__Pyx_PyInt_AsUnsignedLong(x);
3116}
3117
3118static CYTHON_INLINE char __Pyx_PyInt_AsChar(PyObject* x) {
3119    const char neg_one = (char)-1, const_zero = 0;
3120    const int is_unsigned = neg_one > const_zero;
3121    if (sizeof(char) < sizeof(long)) {
3122        long val = __Pyx_PyInt_AsLong(x);
3123        if (unlikely(val != (long)(char)val)) {
3124            if (!unlikely(val == -1 && PyErr_Occurred())) {
3125                PyErr_SetString(PyExc_OverflowError,
3126                    (is_unsigned && unlikely(val < 0)) ?
3127                    "can't convert negative value to char" :
3128                    "value too large to convert to char");
3129            }
3130            return (char)-1;
3131        }
3132        return (char)val;
3133    }
3134    return (char)__Pyx_PyInt_AsLong(x);
3135}
3136
3137static CYTHON_INLINE short __Pyx_PyInt_AsShort(PyObject* x) {
3138    const short neg_one = (short)-1, const_zero = 0;
3139    const int is_unsigned = neg_one > const_zero;
3140    if (sizeof(short) < sizeof(long)) {
3141        long val = __Pyx_PyInt_AsLong(x);
3142        if (unlikely(val != (long)(short)val)) {
3143            if (!unlikely(val == -1 && PyErr_Occurred())) {
3144                PyErr_SetString(PyExc_OverflowError,
3145                    (is_unsigned && unlikely(val < 0)) ?
3146                    "can't convert negative value to short" :
3147                    "value too large to convert to short");
3148            }
3149            return (short)-1;
3150        }
3151        return (short)val;
3152    }
3153    return (short)__Pyx_PyInt_AsLong(x);
3154}
3155
3156static CYTHON_INLINE int __Pyx_PyInt_AsInt(PyObject* x) {
3157    const int neg_one = (int)-1, const_zero = 0;
3158    const int is_unsigned = neg_one > const_zero;
3159    if (sizeof(int) < sizeof(long)) {
3160        long val = __Pyx_PyInt_AsLong(x);
3161        if (unlikely(val != (long)(int)val)) {
3162            if (!unlikely(val == -1 && PyErr_Occurred())) {
3163                PyErr_SetString(PyExc_OverflowError,
3164                    (is_unsigned && unlikely(val < 0)) ?
3165                    "can't convert negative value to int" :
3166                    "value too large to convert to int");
3167            }
3168            return (int)-1;
3169        }
3170        return (int)val;
3171    }
3172    return (int)__Pyx_PyInt_AsLong(x);
3173}
3174
3175static CYTHON_INLINE signed char __Pyx_PyInt_AsSignedChar(PyObject* x) {
3176    const signed char neg_one = (signed char)-1, const_zero = 0;
3177    const int is_unsigned = neg_one > const_zero;
3178    if (sizeof(signed char) < sizeof(long)) {
3179        long val = __Pyx_PyInt_AsLong(x);
3180        if (unlikely(val != (long)(signed char)val)) {
3181            if (!unlikely(val == -1 && PyErr_Occurred())) {
3182                PyErr_SetString(PyExc_OverflowError,
3183                    (is_unsigned && unlikely(val < 0)) ?
3184                    "can't convert negative value to signed char" :
3185                    "value too large to convert to signed char");
3186            }
3187            return (signed char)-1;
3188        }
3189        return (signed char)val;
3190    }
3191    return (signed char)__Pyx_PyInt_AsSignedLong(x);
3192}
3193
3194static CYTHON_INLINE signed short __Pyx_PyInt_AsSignedShort(PyObject* x) {
3195    const signed short neg_one = (signed short)-1, const_zero = 0;
3196    const int is_unsigned = neg_one > const_zero;
3197    if (sizeof(signed short) < sizeof(long)) {
3198        long val = __Pyx_PyInt_AsLong(x);
3199        if (unlikely(val != (long)(signed short)val)) {
3200            if (!unlikely(val == -1 && PyErr_Occurred())) {
3201                PyErr_SetString(PyExc_OverflowError,
3202                    (is_unsigned && unlikely(val < 0)) ?
3203                    "can't convert negative value to signed short" :
3204                    "value too large to convert to signed short");
3205            }
3206            return (signed short)-1;
3207        }
3208        return (signed short)val;
3209    }
3210    return (signed short)__Pyx_PyInt_AsSignedLong(x);
3211}
3212
3213static CYTHON_INLINE signed int __Pyx_PyInt_AsSignedInt(PyObject* x) {
3214    const signed int neg_one = (signed int)-1, const_zero = 0;
3215    const int is_unsigned = neg_one > const_zero;
3216    if (sizeof(signed int) < sizeof(long)) {
3217        long val = __Pyx_PyInt_AsLong(x);
3218        if (unlikely(val != (long)(signed int)val)) {
3219            if (!unlikely(val == -1 && PyErr_Occurred())) {
3220                PyErr_SetString(PyExc_OverflowError,
3221                    (is_unsigned && unlikely(val < 0)) ?
3222                    "can't convert negative value to signed int" :
3223                    "value too large to convert to signed int");
3224            }
3225            return (signed int)-1;
3226        }
3227        return (signed int)val;
3228    }
3229    return (signed int)__Pyx_PyInt_AsSignedLong(x);
3230}
3231
3232static CYTHON_INLINE int __Pyx_PyInt_AsLongDouble(PyObject* x) {
3233    const int neg_one = (int)-1, const_zero = 0;
3234    const int is_unsigned = neg_one > const_zero;
3235    if (sizeof(int) < sizeof(long)) {
3236        long val = __Pyx_PyInt_AsLong(x);
3237        if (unlikely(val != (long)(int)val)) {
3238            if (!unlikely(val == -1 && PyErr_Occurred())) {
3239                PyErr_SetString(PyExc_OverflowError,
3240                    (is_unsigned && unlikely(val < 0)) ?
3241                    "can't convert negative value to int" :
3242                    "value too large to convert to int");
3243            }
3244            return (int)-1;
3245        }
3246        return (int)val;
3247    }
3248    return (int)__Pyx_PyInt_AsLong(x);
3249}
3250
3251static CYTHON_INLINE unsigned long __Pyx_PyInt_AsUnsignedLong(PyObject* x) {
3252    const unsigned long neg_one = (unsigned long)-1, const_zero = 0;
3253    const int is_unsigned = neg_one > const_zero;
3254#if PY_VERSION_HEX < 0x03000000
3255    if (likely(PyInt_Check(x))) {
3256        long val = PyInt_AS_LONG(x);
3257        if (is_unsigned && unlikely(val < 0)) {
3258            PyErr_SetString(PyExc_OverflowError,
3259                            "can't convert negative value to unsigned long");
3260            return (unsigned long)-1;
3261        }
3262        return (unsigned long)val;
3263    } else
3264#endif
3265    if (likely(PyLong_Check(x))) {
3266        if (is_unsigned) {
3267            if (unlikely(Py_SIZE(x) < 0)) {
3268                PyErr_SetString(PyExc_OverflowError,
3269                                "can't convert negative value to unsigned long");
3270                return (unsigned long)-1;
3271            }
3272            return (unsigned long)PyLong_AsUnsignedLong(x);
3273        } else {
3274            return (unsigned long)PyLong_AsLong(x);
3275        }
3276    } else {
3277        unsigned long val;
3278        PyObject *tmp = __Pyx_PyNumber_Int(x);
3279        if (!tmp) return (unsigned long)-1;
3280        val = __Pyx_PyInt_AsUnsignedLong(tmp);
3281        Py_DECREF(tmp);
3282        return val;
3283    }
3284}
3285
3286static CYTHON_INLINE unsigned PY_LONG_LONG __Pyx_PyInt_AsUnsignedLongLong(PyObject* x) {
3287    const unsigned PY_LONG_LONG neg_one = (unsigned PY_LONG_LONG)-1, const_zero = 0;
3288    const int is_unsigned = neg_one > const_zero;
3289#if PY_VERSION_HEX < 0x03000000
3290    if (likely(PyInt_Check(x))) {
3291        long val = PyInt_AS_LONG(x);
3292        if (is_unsigned && unlikely(val < 0)) {
3293            PyErr_SetString(PyExc_OverflowError,
3294                            "can't convert negative value to unsigned PY_LONG_LONG");
3295            return (unsigned PY_LONG_LONG)-1;
3296        }
3297        return (unsigned PY_LONG_LONG)val;
3298    } else
3299#endif
3300    if (likely(PyLong_Check(x))) {
3301        if (is_unsigned) {
3302            if (unlikely(Py_SIZE(x) < 0)) {
3303                PyErr_SetString(PyExc_OverflowError,
3304                                "can't convert negative value to unsigned PY_LONG_LONG");
3305                return (unsigned PY_LONG_LONG)-1;
3306            }
3307            return (unsigned PY_LONG_LONG)PyLong_AsUnsignedLongLong(x);
3308        } else {
3309            return (unsigned PY_LONG_LONG)PyLong_AsLongLong(x);
3310        }
3311    } else {
3312        unsigned PY_LONG_LONG val;
3313        PyObject *tmp = __Pyx_PyNumber_Int(x);
3314        if (!tmp) return (unsigned PY_LONG_LONG)-1;
3315        val = __Pyx_PyInt_AsUnsignedLongLong(tmp);
3316        Py_DECREF(tmp);
3317        return val;
3318    }
3319}
3320
3321static CYTHON_INLINE long __Pyx_PyInt_AsLong(PyObject* x) {
3322    const long neg_one = (long)-1, const_zero = 0;
3323    const int is_unsigned = neg_one > const_zero;
3324#if PY_VERSION_HEX < 0x03000000
3325    if (likely(PyInt_Check(x))) {
3326        long val = PyInt_AS_LONG(x);
3327        if (is_unsigned && unlikely(val < 0)) {
3328            PyErr_SetString(PyExc_OverflowError,
3329                            "can't convert negative value to long");
3330            return (long)-1;
3331        }
3332        return (long)val;
3333    } else
3334#endif
3335    if (likely(PyLong_Check(x))) {
3336        if (is_unsigned) {
3337            if (unlikely(Py_SIZE(x) < 0)) {
3338                PyErr_SetString(PyExc_OverflowError,
3339                                "can't convert negative value to long");
3340                return (long)-1;
3341            }
3342            return (long)PyLong_AsUnsignedLong(x);
3343        } else {
3344            return (long)PyLong_AsLong(x);
3345        }
3346    } else {
3347        long val;
3348        PyObject *tmp = __Pyx_PyNumber_Int(x);
3349        if (!tmp) return (long)-1;
3350        val = __Pyx_PyInt_AsLong(tmp);
3351        Py_DECREF(tmp);
3352        return val;
3353    }
3354}
3355
3356static CYTHON_INLINE PY_LONG_LONG __Pyx_PyInt_AsLongLong(PyObject* x) {
3357    const PY_LONG_LONG neg_one = (PY_LONG_LONG)-1, const_zero = 0;
3358    const int is_unsigned = neg_one > const_zero;
3359#if PY_VERSION_HEX < 0x03000000
3360    if (likely(PyInt_Check(x))) {
3361        long val = PyInt_AS_LONG(x);
3362        if (is_unsigned && unlikely(val < 0)) {
3363            PyErr_SetString(PyExc_OverflowError,
3364                            "can't convert negative value to PY_LONG_LONG");
3365            return (PY_LONG_LONG)-1;
3366        }
3367        return (PY_LONG_LONG)val;
3368    } else
3369#endif
3370    if (likely(PyLong_Check(x))) {
3371        if (is_unsigned) {
3372            if (unlikely(Py_SIZE(x) < 0)) {
3373                PyErr_SetString(PyExc_OverflowError,
3374                                "can't convert negative value to PY_LONG_LONG");
3375                return (PY_LONG_LONG)-1;
3376            }
3377            return (PY_LONG_LONG)PyLong_AsUnsignedLongLong(x);
3378        } else {
3379            return (PY_LONG_LONG)PyLong_AsLongLong(x);
3380        }
3381    } else {
3382        PY_LONG_LONG val;
3383        PyObject *tmp = __Pyx_PyNumber_Int(x);
3384        if (!tmp) return (PY_LONG_LONG)-1;
3385        val = __Pyx_PyInt_AsLongLong(tmp);
3386        Py_DECREF(tmp);
3387        return val;
3388    }
3389}
3390
3391static CYTHON_INLINE signed long __Pyx_PyInt_AsSignedLong(PyObject* x) {
3392    const signed long neg_one = (signed long)-1, const_zero = 0;
3393    const int is_unsigned = neg_one > const_zero;
3394#if PY_VERSION_HEX < 0x03000000
3395    if (likely(PyInt_Check(x))) {
3396        long val = PyInt_AS_LONG(x);
3397        if (is_unsigned && unlikely(val < 0)) {
3398            PyErr_SetString(PyExc_OverflowError,
3399                            "can't convert negative value to signed long");
3400            return (signed long)-1;
3401        }
3402        return (signed long)val;
3403    } else
3404#endif
3405    if (likely(PyLong_Check(x))) {
3406        if (is_unsigned) {
3407            if (unlikely(Py_SIZE(x) < 0)) {
3408                PyErr_SetString(PyExc_OverflowError,
3409                                "can't convert negative value to signed long");
3410                return (signed long)-1;
3411            }
3412            return (signed long)PyLong_AsUnsignedLong(x);
3413        } else {
3414            return (signed long)PyLong_AsLong(x);
3415        }
3416    } else {
3417        signed long val;
3418        PyObject *tmp = __Pyx_PyNumber_Int(x);
3419        if (!tmp) return (signed long)-1;
3420        val = __Pyx_PyInt_AsSignedLong(tmp);
3421        Py_DECREF(tmp);
3422        return val;
3423    }
3424}
3425
3426static CYTHON_INLINE signed PY_LONG_LONG __Pyx_PyInt_AsSignedLongLong(PyObject* x) {
3427    const signed PY_LONG_LONG neg_one = (signed PY_LONG_LONG)-1, const_zero = 0;
3428    const int is_unsigned = neg_one > const_zero;
3429#if PY_VERSION_HEX < 0x03000000
3430    if (likely(PyInt_Check(x))) {
3431        long val = PyInt_AS_LONG(x);
3432        if (is_unsigned && unlikely(val < 0)) {
3433            PyErr_SetString(PyExc_OverflowError,
3434                            "can't convert negative value to signed PY_LONG_LONG");
3435            return (signed PY_LONG_LONG)-1;
3436        }
3437        return (signed PY_LONG_LONG)val;
3438    } else
3439#endif
3440    if (likely(PyLong_Check(x))) {
3441        if (is_unsigned) {
3442            if (unlikely(Py_SIZE(x) < 0)) {
3443                PyErr_SetString(PyExc_OverflowError,
3444                                "can't convert negative value to signed PY_LONG_LONG");
3445                return (signed PY_LONG_LONG)-1;
3446            }
3447            return (signed PY_LONG_LONG)PyLong_AsUnsignedLongLong(x);
3448        } else {
3449            return (signed PY_LONG_LONG)PyLong_AsLongLong(x);
3450        }
3451    } else {
3452        signed PY_LONG_LONG val;
3453        PyObject *tmp = __Pyx_PyNumber_Int(x);
3454        if (!tmp) return (signed PY_LONG_LONG)-1;
3455        val = __Pyx_PyInt_AsSignedLongLong(tmp);
3456        Py_DECREF(tmp);
3457        return val;
3458    }
3459}
3460
3461static void __Pyx_WriteUnraisable(const char *name, CYTHON_UNUSED int clineno,
3462                                  CYTHON_UNUSED int lineno, CYTHON_UNUSED const char *filename) {
3463    PyObject *old_exc, *old_val, *old_tb;
3464    PyObject *ctx;
3465    __Pyx_ErrFetch(&old_exc, &old_val, &old_tb);
3466    #if PY_MAJOR_VERSION < 3
3467    ctx = PyString_FromString(name);
3468    #else
3469    ctx = PyUnicode_FromString(name);
3470    #endif
3471    __Pyx_ErrRestore(old_exc, old_val, old_tb);
3472    if (!ctx) {
3473        PyErr_WriteUnraisable(Py_None);
3474    } else {
3475        PyErr_WriteUnraisable(ctx);
3476        Py_DECREF(ctx);
3477    }
3478}
3479
3480static int __Pyx_check_binary_version(void) {
3481    char ctversion[4], rtversion[4];
3482    PyOS_snprintf(ctversion, 4, "%d.%d", PY_MAJOR_VERSION, PY_MINOR_VERSION);
3483    PyOS_snprintf(rtversion, 4, "%s", Py_GetVersion());
3484    if (ctversion[0] != rtversion[0] || ctversion[2] != rtversion[2]) {
3485        char message[200];
3486        PyOS_snprintf(message, sizeof(message),
3487                      "compiletime version %s of module '%.100s' "
3488                      "does not match runtime version %s",
3489                      ctversion, __Pyx_MODULE_NAME, rtversion);
3490        #if PY_VERSION_HEX < 0x02050000
3491        return PyErr_Warn(NULL, message);
3492        #else
3493        return PyErr_WarnEx(NULL, message, 1);
3494        #endif
3495    }
3496    return 0;
3497}
3498
3499static int __Pyx_SetVtable(PyObject *dict, void *vtable) {
3500#if PY_VERSION_HEX >= 0x02070000 && !(PY_MAJOR_VERSION==3&&PY_MINOR_VERSION==0)
3501    PyObject *ob = PyCapsule_New(vtable, 0, 0);
3502#else
3503    PyObject *ob = PyCObject_FromVoidPtr(vtable, 0);
3504#endif
3505    if (!ob)
3506        goto bad;
3507    if (PyDict_SetItemString(dict, "__pyx_vtable__", ob) < 0)
3508        goto bad;
3509    Py_DECREF(ob);
3510    return 0;
3511bad:
3512    Py_XDECREF(ob);
3513    return -1;
3514}
3515
3516static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line) {
3517    int start = 0, mid = 0, end = count - 1;
3518    if (end >= 0 && code_line > entries[end].code_line) {
3519        return count;
3520    }
3521    while (start < end) {
3522        mid = (start + end) / 2;
3523        if (code_line < entries[mid].code_line) {
3524            end = mid;
3525        } else if (code_line > entries[mid].code_line) {
3526             start = mid + 1;
3527        } else {
3528            return mid;
3529        }
3530    }
3531    if (code_line <= entries[mid].code_line) {
3532        return mid;
3533    } else {
3534        return mid + 1;
3535    }
3536}
3537static PyCodeObject *__pyx_find_code_object(int code_line) {
3538    PyCodeObject* code_object;
3539    int pos;
3540    if (unlikely(!code_line) || unlikely(!__pyx_code_cache.entries)) {
3541        return NULL;
3542    }
3543    pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line);
3544    if (unlikely(pos >= __pyx_code_cache.count) || unlikely(__pyx_code_cache.entries[pos].code_line != code_line)) {
3545        return NULL;
3546    }
3547    code_object = __pyx_code_cache.entries[pos].code_object;
3548    Py_INCREF(code_object);
3549    return code_object;
3550}
3551static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) {
3552    int pos, i;
3553    __Pyx_CodeObjectCacheEntry* entries = __pyx_code_cache.entries;
3554    if (unlikely(!code_line)) {
3555        return;
3556    }
3557    if (unlikely(!entries)) {
3558        entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Malloc(64*sizeof(__Pyx_CodeObjectCacheEntry));
3559        if (likely(entries)) {
3560            __pyx_code_cache.entries = entries;
3561            __pyx_code_cache.max_count = 64;
3562            __pyx_code_cache.count = 1;
3563            entries[0].code_line = code_line;
3564            entries[0].code_object = code_object;
3565            Py_INCREF(code_object);
3566        }
3567        return;
3568    }
3569    pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line);
3570    if ((pos < __pyx_code_cache.count) && unlikely(__pyx_code_cache.entries[pos].code_line == code_line)) {
3571        PyCodeObject* tmp = entries[pos].code_object;
3572        entries[pos].code_object = code_object;
3573        Py_DECREF(tmp);
3574        return;
3575    }
3576    if (__pyx_code_cache.count == __pyx_code_cache.max_count) {
3577        int new_max = __pyx_code_cache.max_count + 64;
3578        entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Realloc(
3579            __pyx_code_cache.entries, new_max*sizeof(__Pyx_CodeObjectCacheEntry));
3580        if (unlikely(!entries)) {
3581            return;
3582        }
3583        __pyx_code_cache.entries = entries;
3584        __pyx_code_cache.max_count = new_max;
3585    }
3586    for (i=__pyx_code_cache.count; i>pos; i--) {
3587        entries[i] = entries[i-1];
3588    }
3589    entries[pos].code_line = code_line;
3590    entries[pos].code_object = code_object;
3591    __pyx_code_cache.count++;
3592    Py_INCREF(code_object);
3593}
3594
3595#include "compile.h"
3596#include "frameobject.h"
3597#include "traceback.h"
3598static PyCodeObject* __Pyx_CreateCodeObjectForTraceback(
3599            const char *funcname, int c_line,
3600            int py_line, const char *filename) {
3601    PyCodeObject *py_code = 0;
3602    PyObject *py_srcfile = 0;
3603    PyObject *py_funcname = 0;
3604    #if PY_MAJOR_VERSION < 3
3605    py_srcfile = PyString_FromString(filename);
3606    #else
3607    py_srcfile = PyUnicode_FromString(filename);
3608    #endif
3609    if (!py_srcfile) goto bad;
3610    if (c_line) {
3611        #if PY_MAJOR_VERSION < 3
3612        py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line);
3613        #else
3614        py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line);
3615        #endif
3616    }
3617    else {
3618        #if PY_MAJOR_VERSION < 3
3619        py_funcname = PyString_FromString(funcname);
3620        #else
3621        py_funcname = PyUnicode_FromString(funcname);
3622        #endif
3623    }
3624    if (!py_funcname) goto bad;
3625    py_code = __Pyx_PyCode_New(
3626        0,            /*int argcount,*/
3627        0,            /*int kwonlyargcount,*/
3628        0,            /*int nlocals,*/
3629        0,            /*int stacksize,*/
3630        0,            /*int flags,*/
3631        __pyx_empty_bytes, /*PyObject *code,*/
3632        __pyx_empty_tuple, /*PyObject *consts,*/
3633        __pyx_empty_tuple, /*PyObject *names,*/
3634        __pyx_empty_tuple, /*PyObject *varnames,*/
3635        __pyx_empty_tuple, /*PyObject *freevars,*/
3636        __pyx_empty_tuple, /*PyObject *cellvars,*/
3637        py_srcfile,   /*PyObject *filename,*/
3638        py_funcname,  /*PyObject *name,*/
3639        py_line,      /*int firstlineno,*/
3640        __pyx_empty_bytes  /*PyObject *lnotab*/
3641    );
3642    Py_DECREF(py_srcfile);
3643    Py_DECREF(py_funcname);
3644    return py_code;
3645bad:
3646    Py_XDECREF(py_srcfile);
3647    Py_XDECREF(py_funcname);
3648    return NULL;
3649}
3650static void __Pyx_AddTraceback(const char *funcname, int c_line,
3651                               int py_line, const char *filename) {
3652    PyCodeObject *py_code = 0;
3653    PyObject *py_globals = 0;
3654    PyFrameObject *py_frame = 0;
3655    py_code = __pyx_find_code_object(c_line ? c_line : py_line);
3656    if (!py_code) {
3657        py_code = __Pyx_CreateCodeObjectForTraceback(
3658            funcname, c_line, py_line, filename);
3659        if (!py_code) goto bad;
3660        __pyx_insert_code_object(c_line ? c_line : py_line, py_code);
3661    }
3662    py_globals = PyModule_GetDict(__pyx_m);
3663    if (!py_globals) goto bad;
3664    py_frame = PyFrame_New(
3665        PyThreadState_GET(), /*PyThreadState *tstate,*/
3666        py_code,             /*PyCodeObject *code,*/
3667        py_globals,          /*PyObject *globals,*/
3668        0                    /*PyObject *locals*/
3669    );
3670    if (!py_frame) goto bad;
3671    py_frame->f_lineno = py_line;
3672    PyTraceBack_Here(py_frame);
3673bad:
3674    Py_XDECREF(py_code);
3675    Py_XDECREF(py_frame);
3676}
3677
3678static int __Pyx_InitStrings(__Pyx_StringTabEntry *t) {
3679    while (t->p) {
3680        #if PY_MAJOR_VERSION < 3
3681        if (t->is_unicode) {
3682            *t->p = PyUnicode_DecodeUTF8(t->s, t->n - 1, NULL);
3683        } else if (t->intern) {
3684            *t->p = PyString_InternFromString(t->s);
3685        } else {
3686            *t->p = PyString_FromStringAndSize(t->s, t->n - 1);
3687        }
3688        #else  /* Python 3+ has unicode identifiers */
3689        if (t->is_unicode | t->is_str) {
3690            if (t->intern) {
3691                *t->p = PyUnicode_InternFromString(t->s);
3692            } else if (t->encoding) {
3693                *t->p = PyUnicode_Decode(t->s, t->n - 1, t->encoding, NULL);
3694            } else {
3695                *t->p = PyUnicode_FromStringAndSize(t->s, t->n - 1);
3696            }
3697        } else {
3698            *t->p = PyBytes_FromStringAndSize(t->s, t->n - 1);
3699        }
3700        #endif
3701        if (!*t->p)
3702            return -1;
3703        ++t;
3704    }
3705    return 0;
3706}
3707
3708
3709/* Type Conversion Functions */
3710
3711static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject* x) {
3712   int is_true = x == Py_True;
3713   if (is_true | (x == Py_False) | (x == Py_None)) return is_true;
3714   else return PyObject_IsTrue(x);
3715}
3716
3717static CYTHON_INLINE PyObject* __Pyx_PyNumber_Int(PyObject* x) {
3718  PyNumberMethods *m;
3719  const char *name = NULL;
3720  PyObject *res = NULL;
3721#if PY_VERSION_HEX < 0x03000000
3722  if (PyInt_Check(x) || PyLong_Check(x))
3723#else
3724  if (PyLong_Check(x))
3725#endif
3726    return Py_INCREF(x), x;
3727  m = Py_TYPE(x)->tp_as_number;
3728#if PY_VERSION_HEX < 0x03000000
3729  if (m && m->nb_int) {
3730    name = "int";
3731    res = PyNumber_Int(x);
3732  }
3733  else if (m && m->nb_long) {
3734    name = "long";
3735    res = PyNumber_Long(x);
3736  }
3737#else
3738  if (m && m->nb_int) {
3739    name = "int";
3740    res = PyNumber_Long(x);
3741  }
3742#endif
3743  if (res) {
3744#if PY_VERSION_HEX < 0x03000000
3745    if (!PyInt_Check(res) && !PyLong_Check(res)) {
3746#else
3747    if (!PyLong_Check(res)) {
3748#endif
3749      PyErr_Format(PyExc_TypeError,
3750                   "__%s__ returned non-%s (type %.200s)",
3751                   name, name, Py_TYPE(res)->tp_name);
3752      Py_DECREF(res);
3753      return NULL;
3754    }
3755  }
3756  else if (!PyErr_Occurred()) {
3757    PyErr_SetString(PyExc_TypeError,
3758                    "an integer is required");
3759  }
3760  return res;
3761}
3762
3763static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) {
3764  Py_ssize_t ival;
3765  PyObject* x = PyNumber_Index(b);
3766  if (!x) return -1;
3767  ival = PyInt_AsSsize_t(x);
3768  Py_DECREF(x);
3769  return ival;
3770}
3771
3772static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) {
3773#if PY_VERSION_HEX < 0x02050000
3774   if (ival <= LONG_MAX)
3775       return PyInt_FromLong((long)ival);
3776   else {
3777       unsigned char *bytes = (unsigned char *) &ival;
3778       int one = 1; int little = (int)*(unsigned char*)&one;
3779       return _PyLong_FromByteArray(bytes, sizeof(size_t), little, 0);
3780   }
3781#else
3782   return PyInt_FromSize_t(ival);
3783#endif
3784}
3785
3786static CYTHON_INLINE size_t __Pyx_PyInt_AsSize_t(PyObject* x) {
3787   unsigned PY_LONG_LONG val = __Pyx_PyInt_AsUnsignedLongLong(x);
3788   if (unlikely(val == (unsigned PY_LONG_LONG)-1 && PyErr_Occurred())) {
3789       return (size_t)-1;
3790   } else if (unlikely(val != (unsigned PY_LONG_LONG)(size_t)val)) {
3791       PyErr_SetString(PyExc_OverflowError,
3792                       "value too large to convert to size_t");
3793       return (size_t)-1;
3794   }
3795   return (size_t)val;
3796}
3797
3798
3799#endif /* Py_PYTHON_H */
3800