00001 #include <utils/eoStat.h>
00002
00003 #include "PyEO.h"
00004 #include "valueParam.h"
00005
00006 using namespace boost::python;
00007
00008 class StatBaseWrapper : public eoStatBase<PyEO>
00009 {
00010 public:
00011 PyObject* self;
00012 StatBaseWrapper(PyObject* p) : self(p) {}
00013
00014 void operator()(const eoPop<PyEO>& pop)
00015 {
00016 call_method<void>(self, "__call__", boost::ref(pop));
00017 }
00018 };
00019
00020 class SortedStatBaseWrapper : public eoSortedStatBase<PyEO>
00021 {
00022 public:
00023 PyObject* self;
00024 SortedStatBaseWrapper(PyObject* p) : self(p) {}
00025
00026 void operator()(const std::vector<const PyEO*>& pop)
00027 {
00028 call_method<void>(self, "__call__", boost::ref(pop));
00029 }
00030 };
00031
00032 typedef std::vector<const PyEO*> eoPopView;
00033
00034 const PyEO& popview_getitem(const std::vector<const PyEO*>& pop, int it)
00035 {
00036 unsigned item = unsigned(it);
00037 if (item > pop.size())
00038 throw index_error("too much");
00039
00040 return *pop[item];
00041 }
00042
00043 void statistics()
00044 {
00045 class_<eoStatBase<PyEO>, StatBaseWrapper, boost::noncopyable>
00046 ("eoStatBase", init<>())
00047 .def("lastCall", &eoStatBase<PyEO>::lastCall)
00048 .def("__call__", &StatBaseWrapper::operator())
00049 ;
00050
00051 class_< eoPopView >("eoPopView")
00052 .def("__getitem__", popview_getitem, return_internal_reference<>() )
00053 .def("__len__", &eoPopView::size)
00054 ;
00055
00056 class_<eoSortedStatBase<PyEO>, SortedStatBaseWrapper, boost::noncopyable>
00057 ("eoSortedStatBase", init<>())
00058 .def("lastCall", &eoSortedStatBase<PyEO>::lastCall)
00059 .def("__call__", &SortedStatBaseWrapper::operator())
00060 ;
00061 }