NameIndexInterface.h
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifndef ROCKETCOREPYTHONNAMEINDEXINTERFACE_H
00029 #define ROCKETCOREPYTHONNAMEINDEXINTERFACE_H
00030
00031 #include <Rocket/Core/Python/Utilities.h>
00032
00033 namespace Rocket {
00034 namespace Core {
00035 namespace Python {
00036
00037 template < typename HostType >
00038 class NameAccessorInvalid
00039 {
00040 public:
00041 python::object operator()(HostType& host, const char* name)
00042 {
00043 PyErr_SetString(PyExc_KeyError, "Invalid key.");
00044 python::throw_error_already_set();
00045
00046 return python::object();
00047 }
00048 };
00049
00056 template < typename HostType, typename LengthAccessor, typename IndexAccessor, typename NameAccessor = NameAccessorInvalid< HostType > >
00057 class NameIndexInterface : public python::def_visitor< NameIndexInterface< HostType, LengthAccessor, IndexAccessor, NameAccessor > >
00058 {
00059 public:
00060 NameIndexInterface()
00061 {
00062 }
00063
00064 ~NameIndexInterface()
00065 {
00066 }
00067
00069 template < typename ClassType >
00070 void visit(ClassType& _class) const
00071 {
00072 _class.def("__getitem__", &NameIndexInterface< HostType, LengthAccessor, IndexAccessor, NameAccessor >::GetItem);
00073 _class.def("__len__", &NameIndexInterface< HostType, LengthAccessor, IndexAccessor, NameAccessor >::Len);
00074 }
00075
00077 static python::object GetItem(HostType& host, python::object key)
00078 {
00079 static NameAccessor name_accessor;
00080 static LengthAccessor length_accessor;
00081 static IndexAccessor index_accessor;
00082
00083 if (PyString_Check(key.ptr()))
00084 {
00085 return Rocket::Core::Python::Utilities::MakeObject(name_accessor(host, PyString_AsString(key.ptr())));
00086 }
00087 else if (PyInt_Check(key.ptr()))
00088 {
00089 int index = PyInt_AsLong(key.ptr());
00090
00091
00092 if (index < 0)
00093 index = length_accessor(host) + index;
00094
00095
00096 if (index >= length_accessor(host))
00097 {
00098 PyErr_SetString(PyExc_IndexError, "Index out of range.");
00099 python::throw_error_already_set();
00100 }
00101
00102 return Rocket::Core::Python::Utilities::MakeObject(index_accessor(host, index));
00103 }
00104
00105 PyErr_SetString(PyExc_KeyError, "Invalid key.");
00106 python::throw_error_already_set();
00107
00108 return python::object();
00109 }
00110
00112 static int Len(HostType& host)
00113 {
00114 static LengthAccessor length_accessor;
00115 return length_accessor(host);
00116 }
00117 };
00118
00119 }
00120 }
00121 }
00122
00123 #endif