From c59007eee858c9fe2affc41e8304a697d6c669a3 Mon Sep 17 00:00:00 2001 From: Dmitry Kamaldinov Date: Sun, 31 Mar 2019 04:18:06 +0300 Subject: [PATCH] encvectors (#8) * functor for dac --- pysdsl/types/encodedvector.hpp | 124 ++++++++++++++++++++++++--------- 1 file changed, 91 insertions(+), 33 deletions(-) diff --git a/pysdsl/types/encodedvector.hpp b/pysdsl/types/encodedvector.hpp index 11dd297..bdf26a6 100644 --- a/pysdsl/types/encodedvector.hpp +++ b/pysdsl/types/encodedvector.hpp @@ -148,33 +148,94 @@ template inline std::string key_to_string(KEY_T key) { return std::to_string(key); } -template -inline -auto add_dac_vector(py::module& m, KEY_T key, - const char* doc = nullptr) +namespace { + +const char dprrr[] = "DPRRR"; +const char dp[] = "DP"; + +template ::value> +struct get_vector_type {}; + +template +struct get_vector_type { + using type = sdsl::dac_vector; +}; + +template <> +struct get_vector_type { + using type = sdsl::dac_vector_dp<>; +}; + +template <> +struct get_vector_type { + using type = sdsl::dac_vector_dp>; +}; + +template +using get_vector_type_t = typename get_vector_type::type; + +} // namespace + + +class add_dac_vector_functor { - auto name = "DirectAccessibleCodesVector" + key_to_string(key); +public: + constexpr add_dac_vector_functor(py::module& m, const char* doc = nullptr, + const char* doc_dp = nullptr): + m(m), doc(doc), doc_dp(doc_dp) {} + + + template + inline + decltype(auto) get_vector(std::integral_constant) { + using type = get_vector_type_t; + auto name = "DirectAccessibleCodesVector" + key_to_string(key); + + auto cls = py::class_(m, name.c_str()).def(py::init()); - auto cls = py::class_(m, name.c_str()).def(py::init()); + add_sizes(cls); + add_description(cls); + add_serialization(cls); + add_to_string(cls); - add_sizes(cls); - add_description(cls); - add_serialization(cls); - add_to_string(cls); + add_read_access(cls); + add_std_algo(cls); - add_read_access(cls); - add_std_algo(cls); + if (doc && std::is_integral::value) + cls.doc() = doc; + else if (doc_dp && !std::is_integral::value) + cls.doc() = doc_dp; - if (doc) { - cls.doc() = doc; } - cls.def_property_readonly("levels", &Sequence::levels); + cls.def_property_readonly("levels", &type::levels); - m.attr("direct_accessible_codes_vector").attr("__setitem__")(key, cls); - m.attr("all_compressed_integer_vectors").attr("append")(cls); + m.attr("direct_accessible_codes_vector").attr("__setitem__")(key, cls); + m.attr("all_compressed_integer_vectors").attr("append")(cls); - return cls; -} + return cls; + } + + template ::value>::type* dummy = nullptr> + inline + decltype(auto) operator()(std::integral_constant t) { + return get_vector(t); + } + template ::value>::type* dummy = nullptr> + inline + decltype(auto) operator()(std::integral_constant t) { + return get_vector(t).def("cost", &get_vector_type_t::cost, + py::arg("n"), py::arg("m")); + } + +private: + py::module& m; + const char* doc; + const char* doc_dp; +}; auto add_encoded_vectors(py::module& m) @@ -186,20 +247,17 @@ auto add_encoded_vectors(py::module& m) auto enc_classes = for_each_in_tuple(coders, add_enc_coders_functor(m)); auto vlc_classes = for_each_in_tuple(coders, add_vlc_coders_functor(m)); - auto dac_classes = std::make_tuple( - add_dac_vector>(m, 4, doc_dac_vector), - add_dac_vector>(m, 8, doc_dac_vector), - add_dac_vector>(m, 16, doc_dac_vector), - add_dac_vector>(m, 63, doc_dac_vector), - add_dac_vector>(m, "DP", doc_dac_vector_dp) - .def("cost", &sdsl::dac_vector_dp<>::cost, - py::arg("n"), py::arg("m")), - add_dac_vector< - sdsl::dac_vector_dp< - sdsl::rrr_vector<>>>(m, "DPRRR", doc_dac_vector_dp) - .def("cost", &sdsl::dac_vector_dp>::cost, - py::arg("n"), py::arg("m")) - ); + + using dac_params = std::tuple< + std::integral_constant, + std::integral_constant, + std::integral_constant, + std::integral_constant, + std::integral_constant, + std::integral_constant + >; + auto dac_classes = for_each_in_tuple(dac_params(), + add_dac_vector_functor(m, doc_dac_vector, doc_dac_vector_dp)); m.attr("DACVector") = m.attr("DirectAccessibleCodesVector4"); m.attr("DirectAccessibleCodesVector") = m.attr(