77#include < pybind11/pybind11.h>
88
99#include < sdsl/rmq_support_sparse_table.hpp>
10+ #include < sdsl/rmq_succinct_sada.hpp>
1011
1112#include " operations/sizes.hpp"
1213#include " operations/iteration.hpp"
1718
1819
1920
21+ namespace detail {
22+ // adds constructors of t_rac... containers
23+ template <typename ... t_rac>
24+ typename std::enable_if<sizeof ...(t_rac) == 0 >::type add_rac_constructor (const auto &) {}
25+
26+ template <typename t_rac_head, typename ... t_rac_tail>
27+ void add_rac_constructor (auto & cls) {
28+ cls.def (py::init ([](const t_rac_head* rac) {
29+ return typename std::remove_reference<decltype (cls)>::type::type (rac);
30+ }));
31+ add_rac_constructor<t_rac_tail...>(cls);
32+ }
33+ }
34+
35+ // containers names
36+ namespace RAC_names {
37+ const char INT_VECTOR_NAME[] = " IntVector" ,
38+ INT16_VECTOR_NAME[] = " Int16Vector" ;
39+ }
40+
41+
2042struct add_rmq_sparse_table_functor {
2143 py::module & m;
2244 const char * doc;
@@ -36,7 +58,10 @@ struct add_rmq_sparse_table_functor {
3658 auto cls = py::class_<T>(m, name.c_str ())
3759 .def_property_readonly (" size" , (typename T::size_type (T::*)(void ) const )& T::size)
3860 .def (py::init ([](const t_rac* rac) {return T (rac);}))
39- .def (" __call__" , (typename T::size_type (T::*)(typename T::size_type, typename T::size_type) const )& T::operator ());
61+ .def (" set_vector" , &T::set_vector)
62+ .def (" __call__" ,
63+ (typename T::size_type
64+ (T::*)(typename T::size_type, typename T::size_type) const )& T::operator ());
4065
4166 add_sizes (cls);
4267 add_description (cls);
@@ -49,13 +74,92 @@ struct add_rmq_sparse_table_functor {
4974};
5075
5176
52- namespace RAC_names {
53- const char INT_VECTOR_NAME[] = " IntVector" ;
54- }
77+ struct add_rmq_sada_functor {
78+ py::module & m;
79+ const char * doc;
80+
81+ constexpr add_rmq_sada_functor (py::module & m, const char * doc = nullptr )
82+ : m(m), doc(doc) {}
83+
84+
85+ template <typename ... t_rac, bool t_min>
86+ decltype (auto ) operator ()(std::tuple<std::tuple<t_rac...>,
87+ std::integral_constant<bool , t_min>>) {
88+ using T = typename std::conditional<t_min, sdsl::rmq_succinct_sada<>,
89+ typename sdsl::range_maximum_support_sada<>::type>::type;
90+
91+ std::string name =
92+ std::string (" Range" ) + (t_min ? " Min" : " Max" ) + " QuerySuccintSada" ;
93+
94+ auto cls = py::class_<T>(m, name.c_str ())
95+ .def_property_readonly (" size" , (typename T::size_type (T::*)(void ) const )& T::size)
96+ .def (py::init ())
97+ .def (" __call__" ,
98+ (typename T::size_type
99+ (T::*)(typename T::size_type, typename T::size_type) const )& T::operator ());
100+
101+ detail::add_rac_constructor<t_rac...>(cls);
102+
103+ add_sizes (cls);
104+ add_description (cls);
105+ add_serialization (cls);
106+
107+ return cls;
108+ }
109+ };
110+
111+
112+ struct add_rmq_sct_functor {
113+ py::module & m;
114+ const char * doc;
115+
116+ constexpr add_rmq_sct_functor (py::module & m, const char * doc = nullptr )
117+ : m(m), doc(doc) {}
118+
119+
120+ template <typename ... t_rac, bool t_min>
121+ decltype (auto ) operator ()(std::tuple<std::tuple<t_rac...>,
122+ std::integral_constant<bool , t_min>>) {
123+ using T = typename std::conditional<t_min, sdsl::rmq_succinct_sct<>,
124+ typename sdsl::range_maximum_sct<>::type>::type;
125+
126+ std::string name =
127+ std::string (" Range" ) + (t_min ? " Min" : " Max" ) + " QuerySuccintSct" ;
128+
129+ auto cls = py::class_<T>(m, name.c_str ())
130+ .def_property_readonly (" size" , (typename T::size_type (T::*)(void ) const )& T::size)
131+ .def (py::init ())
132+ .def (" __call__" ,
133+ (typename T::size_type
134+ (T::*)(typename T::size_type, typename T::size_type) const )& T::operator ());
135+
136+ detail::add_rac_constructor<t_rac...>(cls);
137+
138+ add_sizes (cls);
139+ add_description (cls);
140+ add_serialization (cls);
141+
142+ return cls;
143+ }
144+ };
145+
55146
147+ // generalized (constants -> typenames) template for usage with GeneralSubsetFunctor
56148template <typename t_rac, typename t_min_ic>
57149using general_rmq_sparse_table = py::class_<sdsl::rmq_support_sparse_table<t_rac, t_min_ic::value>>;
58150
151+ template <typename t_min_ic>
152+ using general_rmq_sada = py::class_<
153+ typename std::conditional<t_min_ic::value,
154+ sdsl::rmq_succinct_sada<>,
155+ typename sdsl::range_maximum_support_sada<>::type>::type>;
156+
157+ template <typename t_min_ic>
158+ using general_rmq_sct = py::class_<
159+ typename std::conditional<t_min_ic::value,
160+ sdsl::rmq_succinct_sct<>,
161+ typename sdsl::range_maximum_sct<>::type>::type>;
162+
59163
60164inline auto add_rmq_classes (py::module & m) {
61165 m.attr (" rmq_sparse_table" ) = py::dict ();
@@ -67,11 +171,35 @@ inline auto add_rmq_classes(py::module& m) {
67171 std::integral_constant<bool , true >>,
68172 std::tuple<sdsl::int_vector<>,
69173 std::integral_constant<const char *, RAC_names::INT_VECTOR_NAME>,
174+ std::integral_constant<bool , false >>,
175+ std::tuple<sdsl::int_vector<16 >,
176+ std::integral_constant<const char *, RAC_names::INT16_VECTOR_NAME>,
177+ std::integral_constant<bool , true >>,
178+ std::tuple<sdsl::int_vector<16 >,
179+ std::integral_constant<const char *, RAC_names::INT16_VECTOR_NAME>,
180+ std::integral_constant<bool , false >>
181+ >;
182+
183+ using rmq_sada_params = std::tuple<
184+ std::tuple<std::tuple<sdsl::int_vector<>, sdsl::int_vector<16 >>,
185+ std::integral_constant<bool , true >>,
186+ std::tuple<std::tuple<sdsl::int_vector<>, sdsl::int_vector<16 >>,
187+ std::integral_constant<bool , false >>
188+ >;
189+
190+ using rmq_sct_params = std::tuple<
191+ std::tuple<std::tuple<sdsl::int_vector<>, sdsl::int_vector<16 >>,
192+ std::integral_constant<bool , true >>,
193+ std::tuple<std::tuple<sdsl::int_vector<>, sdsl::int_vector<16 >>,
70194 std::integral_constant<bool , false >>
71195 >;
72196
73197 auto rmq_sparse_tables = for_each_in_tuple (rmq_support_sparse_table_params (),
74198 add_rmq_sparse_table_functor (m, doc_rmq_sparse_table));
199+ auto rmq_sada_classes = for_each_in_tuple (rmq_sada_params (),
200+ add_rmq_sada_functor (m, doc_rmq_sada));
201+ auto rmq_sct_classes = for_each_in_tuple (rmq_sct_params (),
202+ add_rmq_sct_functor (m, doc_rmq_sada));
75203
76204 // //////////// as params //////////////////////
77205 using rmq_support_sparse_table_as_params = std::tuple<
@@ -83,5 +211,5 @@ inline auto add_rmq_classes(py::module& m) {
83211 make_general_sybset_functor<general_rmq_sparse_table>(rmq_sparse_tables));
84212 // /////////////////////////////////////////////
85213
86- return std::tuple_cat (rmq_sparse_tables);
214+ return std::make_tuple (rmq_sparse_tables, rmq_sada_classes, rmq_sct_classes );
87215}
0 commit comments