Skip to content

Commit dff4e94

Browse files
Fix error of typical_segment_tree (T = bool); Add utility to gen a function that always returns a constant
1 parent 0f1ef51 commit dff4e94

File tree

3 files changed

+10
-5
lines changed

3 files changed

+10
-5
lines changed

library/mrpython/sparse_table.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ using std::size_t;
1818
*/
1919
template <typename T, typename MergeFunction> class sparse_table {
2020
std::vector<std::vector<T>> table;
21-
MergeFunction merge;
21+
MergeFunction const merge;
2222

2323
public:
2424
template <typename InputIterator>

library/mrpython/typical_segment_tree.hpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,12 @@ using std::size_t;
1414
* 一颗 无标记线段树 模板。
1515
* @tparam T 元素类型
1616
* @tparam MergeFunction 合并运算函数,对于函数 `F` 应满足结合律
17-
*/
17+
*/
1818
template <typename T, typename MergeFunction> class typical_segment_tree {
1919
std::vector<T> data;
2020
std::vector<size_t> size;
2121
size_t n;
22-
MergeFunction merge;
22+
MergeFunction const merge;
2323
void build(void) {
2424
data.reserve(2 * n - 1), size.reserve(2 * n - 1);
2525
for (size_t i = n; i < 2 * n - 1; ++i) {
@@ -34,7 +34,7 @@ template <typename T, typename MergeFunction> class typical_segment_tree {
3434
template <typename Fun>
3535
void set_impl(size_t c, Fun const& operate, size_t pos) {
3636
if (size[pos] == 1) {
37-
data[pos] = operate((T const&)data[pos]);
37+
data[pos] = operate((typename std::vector<T>::const_reference)data[pos]);
3838
return;
3939
}
4040
size_t m = size[pos * 2 + 1];

library/mrpython/utility.hpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,12 +33,17 @@ struct gcd {
3333
}
3434
};
3535
template <typename Comp> struct compare_iterator {
36-
Comp comp;
36+
Comp const comp;
3737
compare_iterator(Comp const& c): comp(c) {}
3838
template <typename Iterator>
3939
Iterator operator()(Iterator a, Iterator b) const {
4040
return comp(*a, *b) ? a : b;
4141
}
4242
};
43+
template <typename T> struct const_function {
44+
T const value;
45+
const_function(T const& v): value(v) {}
46+
template <typename... Args> T operator()(Args...) const { return value; }
47+
};
4348
} // namespace mrpython
4449
#endif // MP_LIBRARY_UTILITY_HPP

0 commit comments

Comments
 (0)