@@ -76,3 +76,96 @@ TEST_CASE("sparse") { run_test(128); }
7676TEST_CASE (" dense" ) { run_test (32 ); }
7777TEST_CASE (" very_dense" ) { run_test (8 ); }
7878TEST_CASE (" super_dense" ) { run_test (2 ); }
79+
80+ void test_save_load_swap (const uint64_t max_int) {
81+ constexpr bool all_distinct = true ;
82+ std::vector<uint64_t > seq = test::get_sorted_sequence (num_positions, max_int, all_distinct);
83+ auto [B, rank_index] = encode_with_ranked_bit_vector (seq);
84+
85+ const std::string output_filename (" r9_swap.bin" );
86+ uint64_t num_saved_bytes = 0 ;
87+
88+ {
89+ // Assertions on original
90+ REQUIRE (rank_index.num_ones () == seq.size ());
91+ REQUIRE (rank_index.rank1 (B, 0 ) == 0 );
92+
93+ num_saved_bytes = essentials::save (rank_index, output_filename.c_str ());
94+ std::cout << " num_saved_bytes = " << num_saved_bytes << std::endl;
95+ }
96+
97+ rank9 rank_index_loaded;
98+ uint64_t num_loaded_bytes = essentials::load (rank_index_loaded, output_filename.c_str ());
99+ std::cout << " num_loaded_bytes = " << num_loaded_bytes << std::endl;
100+ REQUIRE (num_saved_bytes == num_loaded_bytes);
101+
102+ std::cout << " checking correctness of rank1 and rank0 after swap..." << std::endl;
103+ rank9 other;
104+ rank_index_loaded.swap (other);
105+
106+ REQUIRE (other.num_ones () == seq.size ());
107+ REQUIRE (other.rank1 (B, 0 ) == 0 );
108+ for (uint64_t i = 0 ; i != seq.size (); ++i) {
109+ uint64_t j = seq[i];
110+ uint64_t num_ones = other.rank1 (B, j); // number of 1s in B[0..j)
111+ uint64_t num_zeros = other.rank0 (B, j); // number of 0s in B[0..j)
112+ REQUIRE (num_ones + num_zeros == j);
113+ REQUIRE_MESSAGE (num_ones == i, " got " << num_ones << " but expected " << i);
114+ REQUIRE_MESSAGE (num_zeros == j - i, " got " << num_zeros << " but expected " << j - i);
115+ }
116+
117+ std::remove (output_filename.c_str ());
118+ std::cout << " EVERYTHING OK!" << std::endl;
119+ }
120+
121+ void test_save_mmap (const uint64_t max_int) {
122+ constexpr bool all_distinct = true ;
123+ std::vector<uint64_t > seq = test::get_sorted_sequence (num_positions, max_int, all_distinct);
124+ auto [B, rank_index] = encode_with_ranked_bit_vector (seq);
125+
126+ const std::string output_filename (" r9_mmap.bin" );
127+ uint64_t num_saved_bytes = 0 ;
128+ uint64_t num_mapped_bytes = 0 ;
129+
130+ {
131+ num_saved_bytes = essentials::save (rank_index, output_filename.c_str ());
132+ std::cout << " num_saved_bytes = " << num_saved_bytes << std::endl;
133+ }
134+
135+ {
136+ rank9 rank_index_mmapped;
137+ num_mapped_bytes = essentials::mmap (rank_index_mmapped, output_filename.c_str ());
138+ std::cout << " num_mapped_bytes = " << num_mapped_bytes << std::endl;
139+ REQUIRE (num_saved_bytes == num_mapped_bytes);
140+
141+ std::cout << " checking correctness of rank1 and rank0 after mmap..." << std::endl;
142+ REQUIRE (rank_index_mmapped.num_ones () == seq.size ());
143+ REQUIRE (rank_index_mmapped.rank1 (B, 0 ) == 0 );
144+
145+ for (uint64_t i = 0 ; i != seq.size (); ++i) {
146+ uint64_t j = seq[i];
147+ uint64_t num_ones = rank_index_mmapped.rank1 (B, j);
148+ uint64_t num_zeros = rank_index_mmapped.rank0 (B, j);
149+ REQUIRE (num_ones + num_zeros == j);
150+ REQUIRE_MESSAGE (num_ones == i, " got " << num_ones << " but expected " << i);
151+ REQUIRE_MESSAGE (num_zeros == j - i, " got " << num_zeros << " but expected " << j - i);
152+ }
153+ std::cout << " EVERYTHING OK!" << std::endl;
154+ }
155+
156+ std::remove (output_filename.c_str ());
157+ }
158+
159+ TEST_CASE (" rank9_save_load_swap_super_sparse" ) { test_save_load_swap (32 * 1024 ); }
160+ TEST_CASE (" rank9_save_load_swap_very_sparse" ) { test_save_load_swap (1024 ); }
161+ TEST_CASE (" rank9_save_load_swap_sparse" ) { test_save_load_swap (128 ); }
162+ TEST_CASE (" rank9_save_load_swap_dense" ) { test_save_load_swap (32 ); }
163+ TEST_CASE (" rank9_save_load_swap_very_dense" ) { test_save_load_swap (8 ); }
164+ TEST_CASE (" rank9_save_load_swap_super_dense" ) { test_save_load_swap (2 ); }
165+
166+ TEST_CASE (" rank9_save_mmap_super_sparse" ) { test_save_mmap (32 * 1024 ); }
167+ TEST_CASE (" rank9_save_mmap_very_sparse" ) { test_save_mmap (1024 ); }
168+ TEST_CASE (" rank9_save_mmap_sparse" ) { test_save_mmap (128 ); }
169+ TEST_CASE (" rank9_save_mmap_dense" ) { test_save_mmap (32 ); }
170+ TEST_CASE (" rank9_save_mmap_very_dense" ) { test_save_mmap (8 ); }
171+ TEST_CASE (" rank9_save_mmap_super_dense" ) { test_save_mmap (2 ); }
0 commit comments