Skip to content

Commit e184e8c

Browse files
committed
Put bit.hpp and bump_alloc.hpp in /util
1 parent e1fea9a commit e184e8c

File tree

7 files changed

+35
-31
lines changed

7 files changed

+35
-31
lines changed

cp-algo/math/fft.hpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -290,10 +290,9 @@ namespace cp_algo::math::fft {
290290
}
291291
return std::max(flen, std::bit_ceil(as + bs - 1) / 2);
292292
}
293-
static const int naive_threshold = 64;
294293
void mul_truncate(auto &a, auto const& b, size_t k) {
295294
using base = std::decay_t<decltype(a[0])>;
296-
if(std::min({k, size(a), size(b)}) < naive_threshold) {
295+
if(std::min({k, size(a), size(b)}) < magic) {
297296
mul_slow(a, b, k);
298297
return;
299298
}
Lines changed: 5 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,7 @@
1-
#ifndef CP_ALGO_BIT_HPP
2-
#define CP_ALGO_BIT_HPP
3-
#include <immintrin.h>
4-
#include <cstdint>
5-
#include <array>
6-
#include <bit>
7-
namespace cp_algo {
8-
template<typename Uint>
9-
constexpr size_t bit_width = sizeof(Uint) * 8;
10-
template<size_t maxc, typename Uint = uint64_t>
11-
using popcount_array = std::array<int, maxc / bit_width<Uint> + 1>;
12-
13-
size_t order_of_bit(auto x, size_t k) {
14-
return k ? std::popcount(x << (bit_width<decltype(x)> - k)) : 0;
15-
}
16-
// Requires GCC target("popcnt,bmi2")
17-
size_t kth_set_bit(uint64_t x, size_t k) {
18-
return std::countr_zero(_pdep_u64(1ULL << k, x));
19-
}
20-
1+
#ifndef CP_ALGO_STRUCTURES_BIT_ARRAY_HPP
2+
#define CP_ALGO_STRUCTURES_BIT_ARRAY_HPP
3+
#include "cp-algo/util/bit.hpp"
4+
namespace cp_algo::structures {
215
template<size_t N, typename Uint = uint64_t>
226
struct bit_array {
237
static constexpr size_t width = bit_width<Uint>;
@@ -41,4 +25,4 @@ namespace cp_algo {
4125
}
4226
};
4327
}
44-
#endif // CP_ALGO_BIT_HPP
28+
#endif // CP_ALGO_STRUCTURES_BIT_ARRAY_HPP

cp-algo/structures/bitpack.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11

22
#ifndef CP_ALGO_STRUCTURES_BITPACK_HPP
33
#define CP_ALGO_STRUCTURES_BITPACK_HPP
4-
#include "cp-algo/bit.hpp"
4+
#include "bit_array.hpp"
55
#include <cstdint>
66
#include <cstddef>
77
#include <string>

cp-algo/structures/eertree.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
#include <iostream>
66
#include <vector>
77
#include <string>
8-
#include "../bump_alloc.hpp"
8+
#include "../util/bump_alloc.hpp"
99
namespace cp_algo::structures {
1010
template<int sigma = 26, char mch = 'a'>
1111
struct eertree {

cp-algo/structures/fenwick_set.hpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
#ifndef CP_ALGO_STRUCTURES_FENWICK_SET_HPP
22
#define CP_ALGO_STRUCTURES_FENWICK_SET_HPP
33
#include "fenwick.hpp"
4-
#include "cp-algo/bit.hpp"
4+
#include "bit_array.hpp"
55
namespace cp_algo::structures {
6+
template<size_t maxc, typename Uint = uint64_t>
7+
using popcount_array = std::array<int, maxc / bit_width<Uint> + 1>;
68
// fenwick-based set for [0, maxc)
79
template<size_t maxc, typename Uint = uint64_t>
810
struct fenwick_set: fenwick<int, popcount_array<maxc, Uint>> {
@@ -24,15 +26,15 @@ namespace cp_algo::structures {
2426
}
2527
void insert(size_t x) {
2628
if(bits.test(x)) return;
29+
Base::add(x / word, 1);
2730
bits.flip(x);
2831
sz++;
29-
Base::add(x / word, 1);
3032
}
3133
void erase(size_t x) {
3234
if(!bits.test(x)) return;
35+
Base::add(x / word, -1);
3336
bits.flip(x);
3437
sz--;
35-
Base::add(x / word, -1);
3638
}
3739
size_t order_of_key(size_t x) const {
3840
return Base::prefix_sum(x / word) + order_of_bit(bits.word(x / word), x % word);

cp-algo/util/bit.hpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
#ifndef CP_ALGO_UTIL_BIT_HPP
2+
#define CP_ALGO_UTIL_BIT_HPP
3+
#include <immintrin.h>
4+
#include <cstdint>
5+
#include <array>
6+
#include <bit>
7+
namespace cp_algo {
8+
template<typename Uint>
9+
constexpr size_t bit_width = sizeof(Uint) * 8;
10+
11+
size_t order_of_bit(auto x, size_t k) {
12+
return k ? std::popcount(x << (bit_width<decltype(x)> - k)) : 0;
13+
}
14+
// Requires GCC target("popcnt,bmi2")
15+
size_t kth_set_bit(uint64_t x, size_t k) {
16+
return std::countr_zero(_pdep_u64(1ULL << k, x));
17+
}
18+
}
19+
#endif // CP_ALGO_UTIL_BIT_HPP

cp-algo/bump_alloc.hpp renamed to cp-algo/util/bump_alloc.hpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
#ifndef CP_ALGO_BUMP_ALLOC_HPP
2-
#define CP_ALGO_BUMP_ALLOC_HPP
1+
#ifndef CP_ALGO_UTIL_BUMP_ALLOC_HPP
2+
#define CP_ALGO_UTIL_BUMP_ALLOC_HPP
33
#include <cstddef>
44
namespace cp_algo {
55
char buf[450 << 20] alignas(32);
@@ -16,4 +16,4 @@ namespace cp_algo {
1616
void deallocate(T*, size_t) {}
1717
};
1818
}
19-
#endif // CP_ALGO_BUMP_ALLOC_HPP
19+
#endif // CP_ALGO_UTIL_BUMP_ALLOC_HPP

0 commit comments

Comments
 (0)