diff --git a/bindings/python/mapnik_feature.cpp b/bindings/python/mapnik_feature.cpp index 470308563..28f48d735 100644 --- a/bindings/python/mapnik_feature.cpp +++ b/bindings/python/mapnik_feature.cpp @@ -22,7 +22,10 @@ //$Id$ // boost + #include +#include + #include #include #include @@ -65,148 +68,10 @@ void __setitem__(Feature & feature, std::string const& name, mapnik::value const namespace boost { namespace python { - // Forward declaration - template - class map_indexing_suite2; +// TODO mapnik.Context : implement vector_indexing_suite - we don't want to expose internal key->index mapping +// TODO mapnik.Feature : implement map_indexing_suite - namespace detail - { - template - class final_map_derived_policies - : public map_indexing_suite2 > {}; - } - - template > - class map_indexing_suite2 - : public indexing_suite< - Container - , DerivedPolicies - , NoProxy - , true - , typename Container::value_type::second_type - , typename Container::key_type - , typename Container::key_type - > - { - public: - - typedef typename Container::value_type value_type; - typedef typename Container::value_type::second_type data_type; - typedef typename Container::key_type key_type; - typedef typename Container::key_type index_type; - typedef typename Container::size_type size_type; - typedef typename Container::difference_type difference_type; - - template - static void - extension_def(Class& cl) - { - cl - .def("get", &get) - ; - } - - static data_type& - get_item(Container& container, index_type i_) - { - typename Container::iterator i = container.props().find(i_); - if (i == container.end()) - { - PyErr_SetString(PyExc_KeyError, i_.c_str()); - throw_error_already_set(); - } - // will be auto-converted to proper python type by `mapnik_value_to_python` - return i->second; - } - - static data_type - get(Container& container, index_type i_) - { - typename Container::iterator i = container.props().find(i_); - if (i != container.end()) - { - // will be auto-converted to proper python type by `mapnik_value_to_python` - return i->second; - } - return mapnik::value_null(); - } - - static void - set_item(Container& container, index_type i, data_type const& v) - { - container[i] = v; - } - - static void - delete_item(Container& container, index_type i) - { - container.props().erase(i); - } - - static size_t - size(Container& container) - { - return container.props().size(); - } - - static bool - contains(Container& container, key_type const& key) - { - return container.props().find(key) != container.end(); - } - - static bool - compare_index(Container& container, index_type a, index_type b) - { - return container.props().key_comp()(a, b); - } - - static index_type - convert_index(Container& /*container*/, PyObject* i_) - { - extract i(i_); - if (i.check()) - { - return i(); - } - else - { - extract i(i_); - if (i.check()) - return i(); - } - - PyErr_SetString(PyExc_TypeError, "Invalid index type"); - throw_error_already_set(); - return index_type(); - } - }; - - - template - struct std_pair_to_tuple - { - static PyObject* convert(std::pair const& p) - { - return boost::python::incref( - boost::python::make_tuple(p.first, p.second).ptr()); - } - }; - - template - struct std_pair_to_python_converter - { - std_pair_to_python_converter() - { - boost::python::to_python_converter< - std::pair, - std_pair_to_tuple >(); - } - }; - - }} +}} struct UnicodeString_from_python_str { @@ -267,31 +132,33 @@ void export_feature() using namespace boost::python; using mapnik::Feature; + // Python to mapnik::value convrters implicitly_convertible(); implicitly_convertible(); implicitly_convertible(); implicitly_convertible(); - - std_pair_to_python_converter(); + + //std_pair_to_python_converter(); UnicodeString_from_python_str(); class_ ("Context",init<>("Default ctor.")) .def("push", &context::push) + // TODO .def("__iter__", .....) ; class_, boost::noncopyable>("Feature",init("Default ctor.")) - .def("id",&Feature::id) - .def("__str__",&Feature::to_string) - .def("add_geometries_from_wkb", &feature_add_geometries_from_wkb) - .def("add_geometries_from_wkt", &feature_add_geometries_from_wkt) - .def("add_geometry", &Feature::add_geometry) - .def("num_geometries",&Feature::num_geometries) - .def("get_geometry", make_function(get_geom1,return_value_policy())) - .def("geometries",make_function(&Feature::paths,return_value_policy())) - .def("envelope", &Feature::envelope) - .def("__setitem__",&__setitem__) + .def("id",&Feature::id) + .def("__str__",&Feature::to_string) + .def("add_geometries_from_wkb", &feature_add_geometries_from_wkb) + .def("add_geometries_from_wkt", &feature_add_geometries_from_wkt) + .def("add_geometry", &Feature::add_geometry) + .def("num_geometries",&Feature::num_geometries) + .def("get_geometry", make_function(get_geom1,return_value_policy())) + .def("geometries",make_function(&Feature::paths,return_value_policy())) + .def("envelope", &Feature::envelope) + .def("__setitem__",&__setitem__) // FIXME // .def(map_indexing_suite2())