k1a  1.1
Accelerated functionalities for k1lib
StrIter.h
Go to the documentation of this file.
1 #pragma once
2 #define PY_SSIZE_T_CLEAN
3 #include <Python.h>
4 
5 #include <string>
6 #include <typeinfo>
7 #include <vector>
8 
9 #include "utils.h"
10 
11 namespace k1a {
12 
13 typedef std::string (*transformF)(std::string);
14 
79 class StrIter {
80  public:
81  PyObject *pyObj;
82  bool done;
83 
84  StrIter();
85  StrIter(PyObject *pyObj);
86  virtual std::string next();
87  StrIter *transform(std::vector<transformF> fs, bool decref = false);
88  long length();
89  ~StrIter();
90 
91  template <class T>
92  static PyObject *Py_next(PyObject *self);
93  template <class T>
94  static PyObject *Py_repr(PyObject *self);
95  template <class T>
96  static Py_ssize_t Py_length(PyObject *self);
97  template <class T>
98  static void Py_dealloc(PyObject *self);
99  template <class T>
100  static PySequenceMethods *Py_as_sequence();
101 };
102 
117 template <class T>
118 PySequenceMethods *StrIter::Py_as_sequence() {
119  PySequenceMethods *answer = new PySequenceMethods();
120  *answer = {
121  (lenfunc)StrIter::Py_length<T>, /* sq_length */
122  0, /* sq_concat */
123  0, /* sq_repeat */
124  0, /* sq_item */
125  0, /* sq_slice */
126  0, /* sq_ass_item */
127  0, /* sq_ass_slice */
128  0, /* sq_contains */
129  0, /* sq_inplace_concat */
130  0, /* sq_inplace_repeat */
131  };
132  return answer;
133 }
134 
150 template <class T>
151 PyObject *StrIter::Py_next(PyObject *self) {
152  T *it = (T *)self;
153  if (debug) log_println(std::string("StrIter::Py_next - ") + demangle(typeid(T).name()));
154  std::string res = it->val->next();
155  if (it->val->done)
156  return NULL;
157  else
158  return PyUnicode_FromString(res.c_str());
159 }
160 
176 template <class T>
177 PyObject *StrIter::Py_repr(PyObject *self) {
178  return PyUnicode_FromString(std::string("<").append(demangle(typeid(T).name())).append(" object>").c_str());
179 }
180 
181 template <class T>
182 Py_ssize_t StrIter::Py_length(PyObject *self) {
183  return ((T *)self)->val->length();
184 }
185 
201 template <class T>
202 void StrIter::Py_dealloc(PyObject *self) {
203  if (debug) log_println(std::string("StrIter::Py_dealloc - ") + demangle(typeid(T).name()));
204  T *_self = (T *)self;
205  delete _self->val;
206  Py_TYPE(_self)->tp_free(self);
207 }
208 } // namespace k1a
String iterator.
Definition: StrIter.h:79
static PyObject * Py_next(PyObject *self)
Default __next__ function.
Definition: StrIter.h:151
bool done
Whether the iterator has any elements left.
Definition: StrIter.h:82
static Py_ssize_t Py_length(PyObject *self)
Definition: StrIter.h:182
virtual std::string next()
Definition: StrIter.cpp:51
StrIter * transform(std::vector< transformF > fs, bool decref=false)
Transforms StrIter into other iterators.
Definition: StrIter.cpp:38
static PyObject * Py_repr(PyObject *self)
Default __repr__ function.
Definition: StrIter.h:177
long length()
Definition: StrIter.cpp:56
PyObject * pyObj
Associated python object.
Definition: StrIter.h:81
static PySequenceMethods * Py_as_sequence()
Default tp_as_sequence method generator.
Definition: StrIter.h:118
static void Py_dealloc(PyObject *self)
Default dealloc function.
Definition: StrIter.h:202
Definition: funcs.cpp:15
bool debug
Definition: utils.cpp:14
std::string(* transformF)(std::string)
Definition: StrIter.h:13
void log_println(T s)
Definition: utils.h:21
std::string demangle(const char *name)
Demangles C++ signatures.
Definition: utils.cpp:39