9#ifndef CLASSDESC_PYTHON_BASE_H
10#define CLASSDESC_PYTHON_BASE_H
11#include <boost/python/detail/wrap_python.hpp>
15#include <boost/mpl/vector.hpp>
38 public And<And<And<is_class<T>, Not<is_container<T> > >, Not<is_associative_container<T> > >, Not<is_enum<T> > > {};
43 public Or<is_fundamental<T>, is_string<T> > {};
47 template <
class T,
class Base=T>
49 python(
python_t& p,
const string& d);
57 namespace pythonDetail
62 template <
class U,
class V>
73 template <
class R,
int>
struct SigArg;
75 template <
class F>
struct SigArg<F,0>
77 typedef boost::mpl::vector<> T;
80 template <
class F>
struct SigArg<F,1>
82 typedef boost::mpl::vector<typename Arg<F,Arity<F>::V>::T> T;
85 template <
class F,
int N>
struct SigArg
87 typedef typename boost::mpl::push_front<
95 typedef typename boost::mpl::push_front<
107 template <
class T>
struct Sig:
public std::conditional<is_class<T>::value, SigObj<T>, SigFun<T>>::type {};
110 size_t len(
T& x) {
return x.size();}
112 template <
class T,
class U>
114 assign(
T& x,
const U& y) {x=y;}
116 template <
class T,
class U>
118 assign(T& x,
const U& y) {
throw std::runtime_error(
"assignment not supported between "+typeName<U>()+
" and "+typeName<T>());}
121 template <
class T,
int rank>
123 {
static void registerClass(
python_t& p);};
127 {
static void registerClass(
python_t& p) {python<T>(p,
"");}};
131 template <
class T,
int rank>
134 static_assert(rank==std::rank<T>::value,
"rank==std::rank<T>::value");
137 ArrayGet(
T& x): x(&x) {}
138 typedef typename ArrayGetReturn<T,rank>::T L;
139 L get(
size_t i)
const
141 void set(
size_t i,
const L& v) {assign((*x)[i],v);}
147 {
typedef typename std::remove_extent<U>::type T;};
150 template <
class T,
class M>
153 typedef typename MemberType<M>::T MT;
154 static constexpr size_t rank=std::rank<MT>::value;
155 static_assert(rank>0,
"rank>0");
157 ArrayMemRef(M m): m(m) {}
160 L operator()(
T& o)
const
164 template<
class T,
class M>
165 struct ArrayMemRefSetItem
168 ArrayMemRefSetItem(M m): m(m) {}
169 typedef typename std::remove_all_extents<typename MemberType<M>::T>::type V;
170 void operator()(
T& o,
size_t i, V& v)
const
171 {assign((o.*m)[i], v);}
174 template <
class T,
class M>
175 size_t arrayMemLen(
const T&) {
return std::extent<M>::value;}
177 template <
class C,
class M>
180 typedef typename MemberType<M>::T E;
182 EnumGet(M m): m(m) {}
183 string operator()(
const C& o)
const {
return enum_keys<E>()(o.*m);}
186 template <
class C,
class M>
189 typedef typename MemberType<M>::T E;
191 EnumSet(M m): m(m) {}
192 void operator()(C& o,
const string& v)
const {o.*m=enum_keys<E>()(v);}
195 template <
class C,
class M>
197 template <
class C,
class M>
198 EnumSet<C,M> enumSet(M m) {
return EnumSet<C,M>(m);}
201 typename T::value_type& getItemRef(T& c,
size_t n)
203 if (n>=
size_t(c.size()))
204 throw std::out_of_range(
"index out of bounds");
212 typename enable_if<Not<PythonBasicType<typename T::value_type> >,
214 typename T::value_type& >::T
215 getItem(
T& c,
size_t n) {
return getItemRef(c,n);}
220 typename enable_if<PythonBasicType<typename T::value_type>,
221 typename T::value_type>::T
222 getItem(
T& c,
size_t n) {
return getItemRef(c,n);}
225 typename enable_if<Not<PythonBasicType<typename T::value_type> >,
227 setItem(
T&,
size_t,
const typename T::value_type&) {}
230 typename enable_if<PythonBasicType<typename T::value_type>,
232 setItem(
T& c,
size_t n,
const typename T::value_type& v)
236 typename T::mapped_type basicGetMapItem(
T& x,
const typename T::key_type& k)
242 throw std::runtime_error(
"key not found");
246 typename enable_if<PythonBasicType<typename T::mapped_type>,
247 typename T::mapped_type>::T
248 getMapItem(
T& x,
const typename T::key_type& k)
249 {
return basicGetMapItem(x,k);}
252 typename enable_if<Not<PythonBasicType<typename T::mapped_type> >,
253 typename T::mapped_type& >::T
254 getMapItem(
T& x,
const typename T::key_type& k)
255 {
return basicGetMapItem(x,k);}
259 (
T& x,
const typename T::key_type& k,
const typename T::mapped_type& v)
268 typedef typename T::const_iterator I;
271 Iterator(I begin, I end): i(begin), end(end) {}
272 typename T::key_type next() {
281 static void registerClass(
python_t&);
290 inline bool classDefStarted()
292 static bool value=
false;
293 if (value)
return true;
300 defaultEquality(
const T& x,
const T& y)
301 {
return &x==&y || x==y;}
304 typename enable_if<And<is_container<T>, has_equality_operator<typename T::value_type>>,
bool>::T
305 defaultEquality(
const T& x,
const T& y)
306 {
return &x==&y || x==y;}
309 typename enable_if<Not<has_equality_operator<T>>,
bool>::T
310 defaultEquality(
const T& x,
const T& y)
314 typename enable_if<And<is_container<T>,
315 Not<has_equality_operator<typename T::value_type>>>,
bool>::T
316 defaultEquality(
const T& x,
const T& y)
322 template <
class T,
int rank>
struct tn<pythonDetail::ArrayGet<T,rank>>
324 static std::string name()
325 {
return "pythonDetail::ArrayGet<"+typeName<T>()+
","+std::to_string(rank)+
">";}
331 static string name() {
return "classdesc::pythonDetail::Iterator<"+typeName<T>()+
">";}
342 template <
class F,
class T>
345 template <
class F,
class T>
346 typename classdesc::pythonDetail::Sig<F>::T get_signature(F,T*)
347 {
return typename classdesc::pythonDetail::Sig<F>::T();}
352#include <boost/python.hpp>
353#include <boost/python/raw_function.hpp>
354#include <boost/python/slice.hpp>
366 return_policy() {
return boost::python::return_internal_reference<>();}
370 return_policy() {
return boost::python::default_call_policies();}
372 namespace pythonDetail
374 template <class F, int arity=Arity<F>::value==2>
383 template <
int i>
struct Arg
385 typedef typename remove_const<typename remove_reference<typename functional::Arg<F,i>::T>::type>::type T;
388 static const bool value=
389 is_same<typename Arg<1>::T,boost::python::tuple>::value &&
390 is_same<typename Arg<2>::T,boost::python::dict>::value;
395 static const bool value=
false;
399 boost::python::object rawInit(
const boost::python::tuple& args,
const boost::python::dict&) {
400 if (boost::python::len(args)>2)
402 auto& x=boost::python::extract<T&>(args[0])();
403 auto el=boost::python::extract<boost::python::list>(args[1]);
407 return boost::python::object();
411#if PY_MAJOR_VERSION < 3
412 inline const char* to_string(
PyObject* x) {
return PyString_AsString(x);}
414 inline const char* to_string(PyObject* x) {
return PyUnicode_AsUTF8(x);}
421 return boost::python::incref
422 (boost::python::object
423 (classdesc::enum_keys<E>()(e)).ptr());
432 boost::python::converter::registry::push_back
433 (&convertible, &construct,
434 boost::python::type_id<E>());
437 static void* convertible(
PyObject* obj_ptr)
440 const char* value = to_string(obj_ptr);
441 if (!value || !classdesc::enum_keys<E>().has(value))
return 0;
445 static void construct(
447 boost::python::converter::rvalue_from_python_stage1_data* data)
450 const char* value = to_string(obj_ptr);
457 (boost::python::converter::rvalue_from_python_storage<E>*)
458 data)->storage.bytes;
462 new (storage) E(classdesc::enum_keys<E>()(value));
465 data->convertible = storage;
473 template <class M, int N=functional::Arity<M>::value>
struct Init;
481 :
public InitArgs<Init<M,N-1>,typename functional::Arg<M,N>::T,A...> {};
484 {
typedef boost::python::init<A...> T;};
501 boost::python::class_<PythonDummy> object;
502 shared_ptr<boost::python::scope> scope;
503 Scope(
const string& name):
504 name(name), object(name.c_str()), scope(new boost::python::scope(object)) {}
506 Scope(): name(PyModule_GetName(boost::python::scope().ptr())),
507 object(name.c_str()), scope(new boost::python::scope(
object)) {}
509 std::vector<Scope> scopeStack;
510 boost::python::scope topScope;
511 std::map<string,shared_ptr<boost::python::object>> namedScope;
513 struct ExtractClassNameAndSetScope
515 string className, modName;
516 boost::python::scope topScope;
517 std::vector<std::shared_ptr<boost::python::scope>> scopeStack;
518 ExtractClassNameAndSetScope(
python_t& p,
const string& qualifiedName)
520 const char* b=qualifiedName.c_str(), *e;
522 for (; *b==
':'; b++);
527 if (nAngle==0 && *(e+1)==
':')
529 if (!modName.empty()) modName+=
".";
530 modName+=string(b,e);
531 auto i=p.namedScope.find(modName);
532 if (i==p.namedScope.end())
533 i=p.namedScope.emplace
534 (modName, std::make_shared<Class<Scope::PythonDummy,true>>(modName)).first;
535 scopeStack.emplace_back(
new boost::python::scope(*i->second));
557 bool completed=
false, started=
false;
559 template <
class T,
bool copiable>
struct PyClass;
560 template <
class T>
struct PyClass<
T,true>:
public boost::python::class_<T>
562 PyClass(
const char* n): boost::python::class_<T>(n,boost::python::no_init){}
564 template <
class T>
struct PyClass<
T,false>:
public boost::python::class_<T,boost::noncopyable>
566 PyClass(
const char* n): boost::python::class_<T,boost::noncopyable>(n,boost::python::no_init){}
573 template <
class T,
bool copiable>
576 {c.def(boost::python::init<>());}
578 template <
class T,
bool copiable>
583 template <
class T,
bool copiable>
struct Class:
590 defFn(
"__eq__",pythonDetail::defaultEquality<T>);
597 std::is_copy_assignable<typename pythonDetail::MemberType<X>::T>,
600 addProperty(
const string& d, X x) {this->def_readwrite(d.c_str(),x);}
606 is_const<typename pythonDetail::MemberType<X>::T>
608 addProperty(
const string& d, X x) {this->def_readonly(d.c_str(),x);}
614 defFn(
const char* n, F f) {
616 "\nreference return of raw function not supported.\nUse boost::python::ptr instead");
626 is_copy_constructible<functional::Return<F>>
637 defFn(
const char* n, F f) {
return *
this;}
641 template <
class R,
class...
Args>
643 overload(
const char* n, R (
T::*m)(
Args...)) {
647 template <
class R,
class...
Args>
649 overload(
const char* n, R (
T::*m)(
Args...)) {
653 template <
class R,
class O,
class...
Args>
655 overload(
const char* n, R (
T::*m)(
Args...),
const O& o) {
659 template <
class R,
class O,
class...
Args>
661 overload(
const char* n, R (
T::*m)(
Args...),
const O& o) {
666 template <
class R,
class...
Args>
668 overload(
const char* n, R (
T::*m)(
Args...)
const) {
672 template <
class R,
class...
Args>
674 overload(
const char* n, R (
T::*m)(
Args...)
const) {
678 template <
class R,
class O,
class...
Args>
680 overload(
const char* n, R (
T::*m)(
Args...)
const,
const O& o) {
684 template <
class R,
class O,
class...
Args>
686 overload(
const char* n, R (
T::*m)(
Args...)
const,
const O& o) {
699 static std::vector<shared_ptr<ClassBase> >& classes()
701 static std::vector<shared_ptr<ClassBase> > impl;
708 Class<T,is_copy_constructible<T>::value>& getClass()
710 typedef Class<T,is_copy_constructible<T>::value> C;
711 static size_t id=classes().size();
712 if (
id==classes().size())
714 ExtractClassNameAndSetScope scope(*
this,typeName<T>());
715 classes().push_back(shared_ptr<ClassBase>(
new C(scope.className)));
717 if (!scope.modName.empty()) pyQualName=scope.modName+
".";
718 pyQualName+=scope.className;
720 if (!namedScope.count(pyQualName))
722 (pyQualName, std::dynamic_pointer_cast<boost::python::object>(classes().back()));
724 else if (
id>classes().size())
725 throw exception(
"classes registry no longer valid");
726 return dynamic_cast<C&
>(*classes()[id]);
730 string tail(
const string& d) {
731 size_t p=d.rfind(
'.');
735 return d.substr(p+1);
738 void checkScope(
string d) {
740 for (
size_t p=d.find(
'.'); p!=string::npos; p=d.find(
'.'), level++)
742 string head=d.substr(0,p);
743 if (level<scopeStack.size() && head!=scopeStack[level].name)
744 scopeStack.erase(scopeStack.begin()+level,scopeStack.end());
745 if (level==scopeStack.size())
746 scopeStack.push_back(Scope(head));
749 scopeStack.erase(scopeStack.begin()+level,scopeStack.end());
754 template <
class F,
int N>
757 typedef typename remove_const<
758 typename remove_reference<
762 if (!pythonDetail::classDefStarted<T>())
764 DefineArgClasses<F,N-1>::define(p);
771 typedef typename remove_const<
772 typename remove_reference<
776 if (!pythonDetail::classDefStarted<T>())
784 addObject(
const string& d,
T& o) {
785 using namespace boost::python;
788 if (!scopeStack.empty())
789 scopeStack.back().object.def_readwrite(tail(d).c_str(),o);
791 extract<dict>(scope().attr(
"__dict__"))()[tail(d).c_str()]=ptr(&o);
795 addObject(
const string& d,
const T& o) {
796 using namespace boost::python;
798 if (!scopeStack.empty())
799 scopeStack.back().object.def_readonly(tail(d).c_str(),o);
801 extract<dict>(scope().attr(
"__dict__"))()[tail(d).c_str()]=ptr(&o);
806 addFunctional(
const string& d, F f) {
808 boost::python::def(tail(d).c_str(),f);
809 if (!scopeStack.empty())
810 scopeStack.back().object.staticmethod(tail(d).c_str());
811 DefineArgClasses<F,functional::Arity<F>::value>::define(*
this);
816 typename enable_if<is_pointer<typename functional::Return<F>::T>,
void>::T
817 addFunctional(
const string&, F) {}
820 template <
class C,
class M>
823 Not<is_reference<typename functional::Return<M>::T>>,
824 Not<is_pointer<typename functional::Return<M>::T>>
826 addMemberFunction(
const string& d, M m)
828 auto& c=getClass<C>();
830 c.defFn(tail(d).c_str(),m);
836 template <
class C,
class M>
837 typename enable_if<is_reference<typename functional::Return<M>::T>,
void>::T
838 addMemberFunction(
const string& d, M m)
840 auto& c=getClass<C>();
842 c.def(tail(d).c_str(),m,boost::python::return_internal_reference<>());
847 template <
class C,
class M>
848 typename enable_if<is_pointer<typename functional::Return<M>::T>,
void>::T
849 addMemberFunction(
const string&, M) {}
851 template <
class C,
class M>
852 typename enable_if<functional::is_nonmember_function_ptr<M>,
void>::T
853 addMemberObject(
const string& d, M m)
855 auto& c=getClass<C>();
857 c.defFn(tail(d).c_str(),m);
860 template <
class C,
class M>
861 typename enable_if<And<Not<is_Carray<typename pythonDetail::MemberType<M>::T> >, Not<functional::is_nonmember_function_ptr<M> > >,
void>::T
862 addMemberObject(
const string& d, M m)
864 auto& c=getClass<C>();
866 c.addProperty(tail(d),m);
868 DefineArgClasses<M,0>::define(*
this);
871 template <
class C,
class M>
872 typename enable_if<is_Carray<typename pythonDetail::MemberType<M>::T>,
void>::T
873 addMemberObject(
const string& d, M m)
875 auto& c=getClass<C>();
877 c.add_property(tail(d).c_str(), pythonDetail::ArrayMemRef<C,M>(m),
878 pythonDetail::ArrayMemRef<C,M>(m));
879 pythonDetail::ArrayMemRef<C,M>::L::registerClass(*
this);
883 template <
class C,
class M>
885 And<is_member_function_pointer<M>,
886 functional::AllArgs<M,PythonTypableMember>,
887 Not<is_pointer<typename functional::Return<M>::T>>
889 addMember(
const string& d, M m) {addMemberFunction<C>(d,m);}
899 template <
class C,
class M>
900 typename enable_if<And<is_member_object_pointer<M>,
901 PythonTypableMember<M>,
902 Not<functional::is_nonmember_function_ptr<M> >
904 addMember(
const string& d, M m) {addMemberObject<C>(d,m);}
907 template <
class C,
class M>
908 typename enable_if<And<is_member_object_pointer<M>,
910 Not<PythonTypableMember<M>>,
911 functional::is_nonmember_function_ptr<M>
913 addMember(
const string& d, M m) {}
916 template <
class C,
class M>
919 functional::is_nonmember_function_ptr<M>,
920 functional::AllArgs<M,PythonTypableMember>,
921 Not<is_pointer<typename functional::Return<M>::T>>
923 addMember(
const string& d, M m) {
924 auto& c=getClass<C>();
926 c.defFn(tail(d).c_str(),m);
930 template <
class C,
class M>
933 is_pointer<typename functional::Return<M>::T>,
934 Not<functional::AllArgs<M, PythonTypableMember>>
936 addMember(
const string&, M) {}
938 template <
class C,
class T>
939 void addStaticMember(
const string& d, T* a) {
940 auto& c=getClass<C>();
942 c.addProperty(tail(d).c_str(),a);
945 template <
class C,
class M>
946 void addConstructor(M) {
947 auto& c=getClass<C>();
949 c.def(
typename pythonDetail::Init<M>::T());
953 template <
class C,
class M>
954 void addEnum(
const string& d, M m)
956 auto& c=getClass<C>();
958 c.add_property(tail(d).c_str(),pythonDetail::enumGet<C>(m),pythonDetail::enumSet<C>(m));
963 typename enable_if<Not<is_abstract<T> >,
void>::T
980 for (
int i=0; i<boost::python::len(y); ++i)
981 x.push_back(boost::python::extract<typename T::value_type>(y[i]));
986 void assignList(T& x,
const boost::python::list& y)
990 boost::shared_ptr<T> constructFromList(
const boost::python::list& y)
992 boost::shared_ptr<T> x(
new T);
997 template <
class C,
class T=C>
999 python(
python_t& p,
const string& ) {
1000 auto& c=p.getClass<C>();
1002 c.def(
"__len__", &pythonDetail::len<T>).
1003 def(
"__getitem__", &pythonDetail::getItem<T>, return_policy<typename T::value_type>()).
1004 def(
"__setitem__", &pythonDetail::setItem<T>).
1005 def(
"assign",assignList<T>).
1006 def(
"__init__",boost::python::make_constructor(constructFromList<T>)).
1007 def(
"constructor",boost::python::make_constructor(constructFromList<T>));
1009 python<typename T::value_type>(p,
"");
1014 template <
class C,
class T=C>
1016 python(
python_t& p,
const string& ) {
1017 auto& c=p.getClass<C>();
1019 c.defFn(
"__len__", &pythonDetail::len<C>).
1020 defFn(
"__getitem__", &pythonDetail::getMapItem<C>).
1021 defFn(
"__setitem__", &pythonDetail::setMapItem<C>).
1022 defFn(
"__iter__", &pythonDetail::iter<C>);
1023 python<typename T::mapped_type>(p,
"");
1024 python<typename T::key_type>(p,
"");
1025 pythonDetail::Iterator<C>::registerClass(p);
1029 T& sharedPtrTargetRefGetter(
const shared_ptr<T>& self)
1034 throw std::runtime_error(
"null dereference");
1037 T sharedPtrTargetGetter(
const shared_ptr<T>& self)
1038 {
return sharedPtrTargetRefGetter(self);}
1042 sharedPtrTargetSetter(
const shared_ptr<T>& self,
const T& v)
1047 throw std::runtime_error(
"null dereference");
1051 sharedPtrTargetSetter(
const shared_ptr<T>& self,
const T&)
1054 throw std::runtime_error(typeName<T>()+
" not assignable");
1056 throw std::runtime_error(
"null dereference");
1061 pythonSharedPtr(
python_t& p,
const string& d)
1063 auto& c=p.getClass<classdesc::shared_ptr<T> >();
1065 c.add_property(
"target",
1066 make_function(&sharedPtrTargetRefGetter<T>, boost::python::return_internal_reference<>()),
1067 &sharedPtrTargetSetter<T>);
1072 pythonSharedPtr(
python_t& p,
const string& d)
1074 auto& c=p.getClass<classdesc::shared_ptr<T> >();
1076 c.add_property(
"target",
1077 &sharedPtrTargetGetter<T>,
1078 &sharedPtrTargetSetter<T>);
1084 python(
python_t& p,
const string& d, F f) {
1085 p.addFunctional(d,f);
1091 p.addObject(tail(d),*a);
1094 template <
class C,
class T,
class M>
1097 p.addStaticMember<C>(d,m);
1100 template <
class C,
class T,
class M>
1102 python_type(
python_t& p,
const string& d, M* m)
1104 p.addStaticMember<C>(d,m);
1111 template <
class C,
class T,
class M>
1115 p.addConstructor<
T>(m);
1118 template <
class C,
class T,
class M>
1123 template <
class C,
class B,
class M>
1124 void python_type(
python_t& p,
const string& d, M m)
1126 p.addMember<C>(d,m);
1129 template <
class C,
class T>
1135 void python_onbase(
python_t& p,
const string& d,
T& a);
1137 namespace pythonDetail
1141 {PyErr_SetString(PyExc_StopIteration,
"");}
1142 static int dummy = (boost::python::register_exception_translator<StopIteration>(&translate),0);
1145 void Iterator<T>::registerClass(python_t& p)
1150 c.defFn(
"__next__",&Iterator<T>::next);
1174 using namespace boost::python;
1175 auto lastDot=path.rfind(
'.');
1176 string module, name;
1177 if (lastDot==std::string::npos)
1184 module=path.substr(0,lastDot);
1185 name=path.substr(lastDot+1);
1187 dict the_dict=extract<dict>(
import(module.c_str()).attr(
"__dict__"));
1188 the_dict[name]=ptr(&
object);
1191 template <>
inline void python<boost::python::object>(
python_t&,
const string&) {}
1192 template <>
inline void python<boost::python::tuple>(
python_t&,
const string&) {}
1193 template <>
inline void python<boost::python::list>(
python_t&,
const string&) {}
1194 template <>
inline void python<boost::python::dict>(
python_t&,
const string&) {}
1195 template <>
inline void python<boost::python::slice>(
python_t&,
const string&) {}
1196 template <>
inline void python<boost::python::str>(
python_t&,
const string&) {}
1200 python(
python_t& p,
const string&) {
1213 void type(cd::python_t&,
const cd::string&) {}
1219 void type(cd::python_t& p,
const cd::string& d) {
1220 classdesc::pythonSharedPtr<T>(p,d);
1226using classdesc::python;
1227using classdesc::python_onbase;
Definition classdesc.h:923
Definition classdesc.h:926
Definition python_base.h:496
static enable_if< is_default_constructible< T >, void >::T addDefaultConstructor(ClassBase::PyClass< T, copiable > &c)
Definition python_base.h:575
enable_if< Not< is_abstract< T > >, void >::T defineClass()
utility method to add a Python wrapper class for T
Definition python_base.h:964
Metaprogramming support for processing functions of multiple arguments.
contains code generated by functiondb.sh that defines functional attributes.
Contains access_* structs, and nothing else. These structs are used to gain access to private members...
Definition classdesc_access.h:20
Contains definitions related to classdesc functionality.
void addPythonObject(const std::string &path, T &object)
Definition python_base.h:1172
T convertListTo(const boost::python::list &y)
convert a python list to a sequence type T
Definition python_base.h:977
Definition pythonCAPI.h:97
Definition classdesc.h:420
Definition RESTProcess_epilogue.h:159
Definition python_base.h:38
Definition classdesc.h:1012
Definition classdesc.h:405
Definition classdesc.h:423
types that have a primitive representation in Python
Definition python_base.h:43
Definition python_base.h:360
Definition python_epilogue.h:61
controlled template specialisation: stolen from boost::enable_if.
Definition classdesc.h:282
base class for exceptions thrown by classdesc
Definition classdesc.h:546
Return::T (or ::type) is the return type of F
Definition function.h:45
Definition python_base.h:123
Definition python_base.h:145
Definition python_base.h:133
Definition python_base.h:179
Definition python_base.h:418
Definition python_base.h:475
Definition python_base.h:489
Definition python_base.h:267
Definition python_base.h:61
Definition python_base.h:86
Definition python_base.h:94
Definition python_base.h:103
Definition python_base.h:107
exception to signal end of iteration
Definition python_base.h:263
Definition python_base.h:384
Definition python_base.h:375
Definition python_base.h:559
Definition python_base.h:555
Definition python_base.h:755
Definition python_base.h:499
Definition classdesc.h:571
Definition python_base.h:1208