Add range based CRC32 computation for iterable objects

This commit is contained in:
Dennis Luxen 2014-10-13 18:18:15 +02:00
parent a7fd37ae76
commit b890d394ad
3 changed files with 23 additions and 10 deletions

View File

@ -12,10 +12,10 @@
template <typename GraphT> class BFSComponentExplorer template <typename GraphT> class BFSComponentExplorer
{ {
public: public:
BFSComponentExplorer(const GraphT &dynamicGraph, BFSComponentExplorer(const GraphT &dynamic_graph,
const RestrictionMap &restrictions, const RestrictionMap &restrictions,
const std::unordered_set<NodeID> &barrier_nodes) const std::unordered_set<NodeID> &barrier_nodes)
: m_graph(dynamicGraph), m_restriction_map(restrictions), m_barrier_nodes(barrier_nodes) : m_graph(dynamic_graph), m_restriction_map(restrictions), m_barrier_nodes(barrier_nodes)
{ {
BOOST_ASSERT(m_graph.GetNumberOfNodes() > 0); BOOST_ASSERT(m_graph.GetNumberOfNodes() > 0);
} }
@ -23,14 +23,14 @@ template <typename GraphT> class BFSComponentExplorer
/*! /*!
* Returns the size of the component that the node belongs to. * Returns the size of the component that the node belongs to.
*/ */
inline unsigned int GetComponentSize(NodeID node) unsigned int GetComponentSize(const NodeID node) const
{ {
BOOST_ASSERT(node < m_component_index_list.size()); BOOST_ASSERT(node < m_component_index_list.size());
return m_component_index_size[m_component_index_list[node]]; return m_component_index_size[m_component_index_list[node]];
} }
inline unsigned int GetNumberOfComponents() { return m_component_index_size.size(); } unsigned int GetNumberOfComponents() { return m_component_index_size.size(); }
/*! /*!
* Computes the component sizes. * Computes the component sizes.
@ -67,7 +67,7 @@ template <typename GraphT> class BFSComponentExplorer
/*! /*!
* Explores the current component that starts at node using BFS. * Explores the current component that starts at node using BFS.
*/ */
inline unsigned ExploreComponent(std::queue<std::pair<NodeID, NodeID>> &bfs_queue, unsigned ExploreComponent(std::queue<std::pair<NodeID, NodeID>> &bfs_queue,
NodeID node, NodeID node,
unsigned current_component) unsigned current_component)
{ {

View File

@ -129,4 +129,18 @@ class IteratorbasedCRC32
bool use_hardware_implementation; bool use_hardware_implementation;
}; };
struct RangebasedCRC32
{
template<typename Iteratable>
unsigned operator()(const Iteratable &iterable)
{
return crc32(std::begin(iterable), std::end(iterable));
}
bool using_hardware() const { return crc32.using_hardware(); }
private:
IteratorbasedCRC32 crc32;
};
#endif /* ITERATOR_BASED_CRC32_H */ #endif /* ITERATOR_BASED_CRC32_H */

View File

@ -172,7 +172,7 @@ int Prepare::Process(int argc, char *argv[])
BuildRTree(node_based_edge_list); BuildRTree(node_based_edge_list);
IteratorbasedCRC32 crc32; RangebasedCRC32 crc32;
if (crc32.using_hardware()) if (crc32.using_hardware())
{ {
SimpleLogger().Write() << "using hardware based CRC32 computation"; SimpleLogger().Write() << "using hardware based CRC32 computation";
@ -182,11 +182,10 @@ int Prepare::Process(int argc, char *argv[])
SimpleLogger().Write() << "using software based CRC32 computation"; SimpleLogger().Write() << "using software based CRC32 computation";
} }
const unsigned node_based_edge_list_CRC32 = const unsigned crc32_value = crc32(node_based_edge_list);
crc32(node_based_edge_list.begin(), node_based_edge_list.end());
node_based_edge_list.clear(); node_based_edge_list.clear();
node_based_edge_list.shrink_to_fit(); node_based_edge_list.shrink_to_fit();
SimpleLogger().Write() << "CRC32: " << node_based_edge_list_CRC32; SimpleLogger().Write() << "CRC32: " << crc32_value;
WriteNodeMapping(); WriteNodeMapping();
@ -264,7 +263,7 @@ int Prepare::Process(int argc, char *argv[])
const unsigned node_array_size = node_array.size(); const unsigned node_array_size = node_array.size();
// serialize crc32, aka checksum // serialize crc32, aka checksum
hsgr_output_stream.write((char *)&node_based_edge_list_CRC32, sizeof(unsigned)); hsgr_output_stream.write((char *)&crc32_value, sizeof(unsigned));
// serialize number of nodes // serialize number of nodes
hsgr_output_stream.write((char *)&node_array_size, sizeof(unsigned)); hsgr_output_stream.write((char *)&node_array_size, sizeof(unsigned));
// serialize number of edges // serialize number of edges