void CompressedEdgeContainer::SerializeInternalVector(const std::string &path) const { boost::filesystem::fstream geometry_out_stream(path, std::ios::binary | std::ios::out); const unsigned compressed_geometry_indices = m_compressed_geometry_index.size() + 1; const unsigned compressed_geometries = m_compressed_geometry_nodes.size(); BOOST_ASSERT(std::numeric_limits<unsigned>::max() != compressed_geometry_indices); geometry_out_stream.write((char *)&compressed_geometry_indices, sizeof(unsigned)); geometry_out_stream.write((char *)(m_compressed_geometry_index.data()), sizeof(unsigned) * m_compressed_geometry_index.size()); // sentinel element geometry_out_stream.write((char *)&(compressed_geometries), sizeof(unsigned)); // number of geometry entries to follow geometry_out_stream.write((char *)&(compressed_geometries), sizeof(unsigned)); // write compressed geometry node id's geometry_out_stream.write((char *)(m_compressed_geometry_nodes.data()), sizeof(NodeID) * m_compressed_geometry_nodes.size()); // write compressed geometry forward weights geometry_out_stream.write((char *)(m_compressed_geometry_fwd_weights.data()), sizeof(EdgeWeight) * m_compressed_geometry_fwd_weights.size()); // write compressed geometry reverse weights geometry_out_stream.write((char *)(m_compressed_geometry_rev_weights.data()), sizeof(EdgeWeight) * m_compressed_geometry_rev_weights.size()); }
void GeometryCompressor::SerializeInternalVector(const std::string &path) const { boost::filesystem::fstream geometry_out_stream(path, std::ios::binary | std::ios::out); const unsigned compressed_geometries = m_compressed_geometries.size() + 1; BOOST_ASSERT(std::numeric_limits<unsigned>::max() != compressed_geometries); geometry_out_stream.write((char *)&compressed_geometries, sizeof(unsigned)); // write indices array unsigned prefix_sum_of_list_indices = 0; for (const auto &elem : m_compressed_geometries) { geometry_out_stream.write((char *)&prefix_sum_of_list_indices, sizeof(unsigned)); const std::vector<CompressedNode> ¤t_vector = elem; const unsigned unpacked_size = current_vector.size(); BOOST_ASSERT(std::numeric_limits<unsigned>::max() != unpacked_size); prefix_sum_of_list_indices += unpacked_size; } // sentinel element geometry_out_stream.write((char *)&prefix_sum_of_list_indices, sizeof(unsigned)); // number of geometry entries to follow, it is the (inclusive) prefix sum geometry_out_stream.write((char *)&prefix_sum_of_list_indices, sizeof(unsigned)); unsigned control_sum = 0; // write compressed geometries for (auto &elem : m_compressed_geometries) { const std::vector<CompressedNode> ¤t_vector = elem; const unsigned unpacked_size = current_vector.size(); control_sum += unpacked_size; BOOST_ASSERT(std::numeric_limits<unsigned>::max() != unpacked_size); for (const CompressedNode current_node : current_vector) { geometry_out_stream.write((char *)&(current_node.first), sizeof(NodeID)); } } BOOST_ASSERT(control_sum == prefix_sum_of_list_indices); // all done, let's close the resource geometry_out_stream.close(); }