43#ifndef LASS_GUARDIAN_OF_INCLUSION_UTIL_PY_TUPLE_H
44#define LASS_GUARDIAN_OF_INCLUSION_UTIL_PY_TUPLE_H
51#if LASS_COMPILER_TYPE == LASS_COMPILER_TYPE_MSVC
53# pragma warning(disable: 4267)
66 inline bool tupleSetItems(PyObject* tuple, Py_ssize_t index,
const P& p)
68 return PyTuple_SetItem(tuple, index, pyBuildSimpleObject(p)) == 0;
74 template <
typename P,
typename... Ptail>
75 inline bool tupleSetItems(PyObject* tuple, Py_ssize_t index,
const P& p, Ptail&... tail)
77 return PyTuple_SetItem(tuple, index, pyBuildSimpleObject(p)) == 0
78 && tupleSetItems(tuple, index + 1, tail...);
85 inline bool decodeObject(PyObject* in, Py_ssize_t index, P& out)
87 if (lass::python::pyGetSimpleObject(in, out) != 0)
89 std::ostringstream buffer;
90 buffer <<
"Bad Argument on " << (index + 1) <<
"th position";
100 template <
typename P>
101 inline bool decodeObjects(PyObject** objects, Py_ssize_t index, P& p)
103 return impl::decodeObject(objects[index], index, p);
109 template <
typename P,
typename... Ptail>
110 inline bool decodeObjects(PyObject** objects, Py_ssize_t index, P& p, Ptail&... tail)
112 return impl::decodeObject(objects[index], index, p)
113 && decodeObjects(objects, index + 1, tail...);
119 template <
typename P>
120 inline bool decodeObjectsMinimum(PyObject** objects, Py_ssize_t index, Py_ssize_t size, P& p)
123 || impl::decodeObject(objects[index], index, p);
129 template <
typename P,
typename... Ptail>
130 inline bool decodeObjectsMinimum(PyObject** objects, Py_ssize_t index, Py_ssize_t size, P& p, Ptail&... tail)
133 || (impl::decodeObject(objects[index], index, p)
134 && decodeObjectsMinimum(objects, index + 1, size, tail...));
149template <
typename... P>
153 TPyObjPtr tuple(PyTuple_New(
sizeof...(P)));
154 return impl::tupleSetItems(tuple.get(), 0, p...)
163inline int decodeTuple(PyObject* obj)
166 return impl::checkSequenceSize(obj, 0) ? 0 : 1;
171template <
typename... P>
172int decodeTuple(PyObject* obj, P&... p)
175 const TPyObjPtr tuple = impl::checkedFastSequence(obj,
sizeof...(P));
180 PyObject** objects = PySequence_Fast_ITEMS(tuple.get());
181 return impl::decodeObjects(objects, 0, p...)
190inline int decodeTuple(
const TPyObjPtr& obj)
192 return decodeTuple(obj.get());
197template <
typename... P>
198inline int decodeTuple(
const TPyObjPtr& obj, P&... p)
200 return decodeTuple(obj.get(), p...);
207template <
typename... P>
208int decodeTupleMinimum(PyObject* obj, Py_ssize_t minumumLength, P&... p)
211 const TPyObjPtr tuple = impl::checkedFastSequence(obj, minumumLength,
sizeof...(P));
216 const Py_ssize_t size = PySequence_Fast_GET_SIZE(tuple.get());
217 PyObject** objects = PySequence_Fast_ITEMS(tuple.get());
218 return impl::decodeObjectsMinimum(objects, 0, size, p...)
227template <
typename... P>
228int decodeTupleMinimum(
const TPyObjPtr& obj, Py_ssize_t minumumLength, P&... p)
230 return decodeTupleMinimum(obj.get(), minumumLength, p...);
240template <
typename T1,
typename T2>
243 constexpr static const char* py_typing =
"tuple[T1, T2]";
245 static PyObject* build(
const std::pair<T1, T2>& v)
250 static int get(PyObject* obj, std::pair<T1, T2>& v)
252 if (decodeTuple(obj, v.first, v.second) != 0)
265template <
typename... T>
268 constexpr static const char* py_typing =
"tuple[T...]";
270 static PyObject* build(
const std::tuple<T...>& v)
272 return doBuild(v, std::index_sequence_for<T...>());
274 static int get(PyObject* obj, std::tuple<T...>& v)
276 return doGet(obj, v, std::index_sequence_for<T...>());
280 template <std::size_t... I>
281 static PyObject* doBuild(
const std::tuple<T...>& v, std::index_sequence<I...>)
285 template <std::size_t... I>
286 static int doGet(PyObject* obj, std::tuple<T...>& v, std::index_sequence<I...>)
288 if (decodeTuple(obj, std::get<I>(v)...) != 0)
301#if LASS_COMPILER_TYPE == LASS_COMPILER_TYPE_MSVC
acquire the GIL for the current scope.
void addMessageHeader(const char *header)
Prepend a message to the current Python exception value.
PyObjectPtr< PyObject >::Type TPyObjPtr
PyObjectPtr to a PyObject.
PyObject * fromSharedPtrToNakedCast(const util::SharedPtr< T, PyObjectStorage, PyObjectCounter > &object)
fromSharedPtrToNakedCast.
Comprehensive C++ to Python binding library.
Library for Assembled Shared Sources.
by copy, general case assumes shadow type or PyObjectPlus based type.