inline bool serializeFlags(const boost::filesystem::path &path, const std::vector<bool> &flags) { // TODO this should be replaced with a FILE-based write using error checking std::ofstream flag_stream(path.string(), std::ios::binary); writeFingerprint(flag_stream); std::uint32_t number_of_bits = flags.size(); flag_stream.write(reinterpret_cast<const char *>(&number_of_bits), sizeof(number_of_bits)); // putting bits in ints std::uint32_t chunk = 0; std::size_t chunk_count = 0; for (std::size_t bit_nr = 0; bit_nr < number_of_bits;) { std::bitset<32> chunk_bitset; for (std::size_t chunk_bit = 0; chunk_bit < 32 && bit_nr < number_of_bits; ++chunk_bit, ++bit_nr) chunk_bitset[chunk_bit] = flags[bit_nr]; chunk = chunk_bitset.to_ulong(); ++chunk_count; flag_stream.write(reinterpret_cast<const char *>(&chunk), sizeof(chunk)); } Log() << "Wrote " << number_of_bits << " bits in " << chunk_count << " chunks (Flags)."; return static_cast<bool>(flag_stream); }
inline bool deserializeFlags(const boost::filesystem::path &path, std::vector<bool> &flags) { SimpleLogger().Write() << "Reading flags from " << path; std::ifstream flag_stream(path.string(), std::ios::binary); if (!readAndCheckFingerprint(flag_stream)) return false; std::uint32_t number_of_bits; flag_stream.read(reinterpret_cast<char *>(&number_of_bits), sizeof(number_of_bits)); flags.resize(number_of_bits); // putting bits in ints std::uint32_t chunks = (number_of_bits + 31) / 32; std::size_t bit_position = 0; std::uint32_t chunk; for (std::size_t chunk_id = 0; chunk_id < chunks; ++chunk_id) { flag_stream.read(reinterpret_cast<char *>(&chunk), sizeof(chunk)); std::bitset<32> chunk_bits(chunk); for (std::size_t bit = 0; bit < 32 && bit_position < number_of_bits; ++bit, ++bit_position) flags[bit_position] = chunk_bits[bit]; } SimpleLogger().Write() << "Read " << number_of_bits << " bits in " << chunks << " Chunks from disk."; return static_cast<bool>(flag_stream); }