EvolvingObjects
statistics.cpp
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 }
 All Classes Namespaces Files Functions Variables Typedefs Friends