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> &current_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> &current_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();
}