|  |  |  | @ -261,7 +261,7 @@ void Storage::PopulateLayout(DataLayout &layout) | 
		
	
		
			
				|  |  |  |  |         // collect number of elements to store in shared memory object
 | 
		
	
		
			
				|  |  |  |  |         util::SimpleLogger().Write() << "load names from: " << config.names_data_path; | 
		
	
		
			
				|  |  |  |  |         // number of entries in name index
 | 
		
	
		
			
				|  |  |  |  |         io::FileReader name_file(config.names_data_path); | 
		
	
		
			
				|  |  |  |  |         io::FileReader name_file(config.names_data_path, io::FileReader::HasNoFingerprint); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |         const auto name_blocks = name_file.ReadElementCount32(); | 
		
	
		
			
				|  |  |  |  |         layout.SetBlockSize<unsigned>(DataLayout::NAME_OFFSETS, name_blocks); | 
		
	
	
		
			
				
					
					|  |  |  | @ -287,7 +287,7 @@ void Storage::PopulateLayout(DataLayout &layout) | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     // Loading information for original edges
 | 
		
	
		
			
				|  |  |  |  |     { | 
		
	
		
			
				|  |  |  |  |         io::FileReader edges_file(config.edges_data_path); | 
		
	
		
			
				|  |  |  |  |         io::FileReader edges_file(config.edges_data_path, io::FileReader::HasNoFingerprint); | 
		
	
		
			
				|  |  |  |  |         const auto number_of_original_edges = edges_file.ReadElementCount64(); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |         // note: settings this all to the same size is correct, we extract them from the same struct
 | 
		
	
	
		
			
				
					
					|  |  |  | @ -306,7 +306,7 @@ void Storage::PopulateLayout(DataLayout &layout) | 
		
	
		
			
				|  |  |  |  |     } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     { | 
		
	
		
			
				|  |  |  |  |         io::FileReader hsgr_file(config.hsgr_data_path); | 
		
	
		
			
				|  |  |  |  |         io::FileReader hsgr_file(config.hsgr_data_path, io::FileReader::HasNoFingerprint); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |         const auto hsgr_header = io::readHSGRHeader(hsgr_file); | 
		
	
		
			
				|  |  |  |  |         layout.SetBlockSize<unsigned>(DataLayout::HSGR_CHECKSUM, 1); | 
		
	
	
		
			
				
					
					|  |  |  | @ -318,7 +318,7 @@ void Storage::PopulateLayout(DataLayout &layout) | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     // load rsearch tree size
 | 
		
	
		
			
				|  |  |  |  |     { | 
		
	
		
			
				|  |  |  |  |         io::FileReader tree_node_file(config.ram_index_path); | 
		
	
		
			
				|  |  |  |  |         io::FileReader tree_node_file(config.ram_index_path, io::FileReader::HasNoFingerprint); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |         const auto tree_size = tree_node_file.ReadElementCount64(); | 
		
	
		
			
				|  |  |  |  |         layout.SetBlockSize<RTreeNode>(DataLayout::R_SEARCH_TREE, tree_size); | 
		
	
	
		
			
				
					
					|  |  |  | @ -332,21 +332,21 @@ void Storage::PopulateLayout(DataLayout &layout) | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     // read timestampsize
 | 
		
	
		
			
				|  |  |  |  |     { | 
		
	
		
			
				|  |  |  |  |         io::FileReader timestamp_file(config.timestamp_path); | 
		
	
		
			
				|  |  |  |  |         io::FileReader timestamp_file(config.timestamp_path, io::FileReader::HasNoFingerprint); | 
		
	
		
			
				|  |  |  |  |         const auto timestamp_size = timestamp_file.Size(); | 
		
	
		
			
				|  |  |  |  |         layout.SetBlockSize<char>(DataLayout::TIMESTAMP, timestamp_size); | 
		
	
		
			
				|  |  |  |  |     } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     // load core marker size
 | 
		
	
		
			
				|  |  |  |  |     { | 
		
	
		
			
				|  |  |  |  |         io::FileReader core_marker_file(config.core_data_path); | 
		
	
		
			
				|  |  |  |  |         io::FileReader core_marker_file(config.core_data_path, io::FileReader::HasNoFingerprint); | 
		
	
		
			
				|  |  |  |  |         const auto number_of_core_markers = core_marker_file.ReadElementCount32(); | 
		
	
		
			
				|  |  |  |  |         layout.SetBlockSize<unsigned>(DataLayout::CORE_MARKER, number_of_core_markers); | 
		
	
		
			
				|  |  |  |  |     } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     // load coordinate size
 | 
		
	
		
			
				|  |  |  |  |     { | 
		
	
		
			
				|  |  |  |  |         io::FileReader node_file(config.nodes_data_path); | 
		
	
		
			
				|  |  |  |  |         io::FileReader node_file(config.nodes_data_path, io::FileReader::HasNoFingerprint); | 
		
	
		
			
				|  |  |  |  |         const auto coordinate_list_size = node_file.ReadElementCount64(); | 
		
	
		
			
				|  |  |  |  |         layout.SetBlockSize<util::Coordinate>(DataLayout::COORDINATE_LIST, coordinate_list_size); | 
		
	
		
			
				|  |  |  |  |         // we'll read a list of OSM node IDs from the same data, so set the block size for the same
 | 
		
	
	
		
			
				
					
					|  |  |  | @ -358,7 +358,7 @@ void Storage::PopulateLayout(DataLayout &layout) | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     // load geometries sizes
 | 
		
	
		
			
				|  |  |  |  |     { | 
		
	
		
			
				|  |  |  |  |         io::FileReader geometry_file(config.geometries_path); | 
		
	
		
			
				|  |  |  |  |         io::FileReader geometry_file(config.geometries_path, io::FileReader::HasNoFingerprint); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |         const auto number_of_geometries_indices = geometry_file.ReadElementCount32(); | 
		
	
		
			
				|  |  |  |  |         layout.SetBlockSize<unsigned>(DataLayout::GEOMETRIES_INDEX, number_of_geometries_indices); | 
		
	
	
		
			
				
					
					|  |  |  | @ -377,7 +377,8 @@ void Storage::PopulateLayout(DataLayout &layout) | 
		
	
		
			
				|  |  |  |  |     // load datasource sizes.  This file is optional, and it's non-fatal if it doesn't
 | 
		
	
		
			
				|  |  |  |  |     // exist.
 | 
		
	
		
			
				|  |  |  |  |     { | 
		
	
		
			
				|  |  |  |  |         io::FileReader geometry_datasource_file(config.datasource_indexes_path); | 
		
	
		
			
				|  |  |  |  |         io::FileReader geometry_datasource_file(config.datasource_indexes_path, | 
		
	
		
			
				|  |  |  |  |                                                 io::FileReader::HasNoFingerprint); | 
		
	
		
			
				|  |  |  |  |         const auto number_of_compressed_datasources = geometry_datasource_file.ReadElementCount64(); | 
		
	
		
			
				|  |  |  |  |         layout.SetBlockSize<uint8_t>(DataLayout::DATASOURCES_LIST, | 
		
	
		
			
				|  |  |  |  |                                      number_of_compressed_datasources); | 
		
	
	
		
			
				
					
					|  |  |  | @ -386,7 +387,8 @@ void Storage::PopulateLayout(DataLayout &layout) | 
		
	
		
			
				|  |  |  |  |     // Load datasource name sizes.  This file is optional, and it's non-fatal if it doesn't
 | 
		
	
		
			
				|  |  |  |  |     // exist
 | 
		
	
		
			
				|  |  |  |  |     { | 
		
	
		
			
				|  |  |  |  |         io::FileReader datasource_names_file(config.datasource_names_path); | 
		
	
		
			
				|  |  |  |  |         io::FileReader datasource_names_file(config.datasource_names_path, | 
		
	
		
			
				|  |  |  |  |                                              io::FileReader::HasNoFingerprint); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |         const io::DatasourceNamesData datasource_names_data = | 
		
	
		
			
				|  |  |  |  |             io::readDatasourceNames(datasource_names_file); | 
		
	
	
		
			
				
					
					|  |  |  | @ -400,7 +402,8 @@ void Storage::PopulateLayout(DataLayout &layout) | 
		
	
		
			
				|  |  |  |  |     } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     { | 
		
	
		
			
				|  |  |  |  |         io::FileReader intersection_file(config.intersection_class_path, true); | 
		
	
		
			
				|  |  |  |  |         io::FileReader intersection_file(config.intersection_class_path, | 
		
	
		
			
				|  |  |  |  |                                          io::FileReader::VerifyFingerprint); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |         std::vector<BearingClassID> bearing_class_id_table; | 
		
	
		
			
				|  |  |  |  |         intersection_file.DeserializeVector(bearing_class_id_table); | 
		
	
	
		
			
				
					
					|  |  |  | @ -435,7 +438,7 @@ void Storage::PopulateLayout(DataLayout &layout) | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     { | 
		
	
		
			
				|  |  |  |  |         // Loading turn lane data
 | 
		
	
		
			
				|  |  |  |  |         io::FileReader lane_data_file(config.turn_lane_data_path); | 
		
	
		
			
				|  |  |  |  |         io::FileReader lane_data_file(config.turn_lane_data_path, io::FileReader::HasNoFingerprint); | 
		
	
		
			
				|  |  |  |  |         const auto lane_tuple_count = lane_data_file.ReadElementCount64(); | 
		
	
		
			
				|  |  |  |  |         layout.SetBlockSize<util::guidance::LaneTupleIdPair>(DataLayout::TURN_LANE_DATA, | 
		
	
		
			
				|  |  |  |  |                                                              lane_tuple_count); | 
		
	
	
		
			
				
					
					|  |  |  | @ -450,7 +453,7 @@ void Storage::PopulateData(const DataLayout &layout, char *memory_ptr) | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     // Load the HSGR file
 | 
		
	
		
			
				|  |  |  |  |     { | 
		
	
		
			
				|  |  |  |  |         io::FileReader hsgr_file(config.hsgr_data_path); | 
		
	
		
			
				|  |  |  |  |         io::FileReader hsgr_file(config.hsgr_data_path, io::FileReader::HasNoFingerprint); | 
		
	
		
			
				|  |  |  |  |         auto hsgr_header = io::readHSGRHeader(hsgr_file); | 
		
	
		
			
				|  |  |  |  |         unsigned *checksum_ptr = | 
		
	
		
			
				|  |  |  |  |             layout.GetBlockPtr<unsigned, true>(memory_ptr, DataLayout::HSGR_CHECKSUM); | 
		
	
	
		
			
				
					
					|  |  |  | @ -491,9 +494,9 @@ void Storage::PopulateData(const DataLayout &layout, char *memory_ptr) | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     // Name data
 | 
		
	
		
			
				|  |  |  |  |     { | 
		
	
		
			
				|  |  |  |  |         io::FileReader name_file(config.names_data_path); | 
		
	
		
			
				|  |  |  |  |         io::FileReader name_file(config.names_data_path, io::FileReader::HasNoFingerprint); | 
		
	
		
			
				|  |  |  |  |         const auto name_blocks_count = name_file.ReadElementCount32(); | 
		
	
		
			
				|  |  |  |  |         const auto name_char_list_count = name_file.ReadElementCount32(); | 
		
	
		
			
				|  |  |  |  |         name_file.Skip<std::uint32_t>(1); // name_char_list_count
 | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |         using NameRangeTable = util::RangeTable<16, true>; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
	
		
			
				
					
					|  |  |  | @ -528,7 +531,7 @@ void Storage::PopulateData(const DataLayout &layout, char *memory_ptr) | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     // Turn lane data
 | 
		
	
		
			
				|  |  |  |  |     { | 
		
	
		
			
				|  |  |  |  |         io::FileReader lane_data_file(config.turn_lane_data_path); | 
		
	
		
			
				|  |  |  |  |         io::FileReader lane_data_file(config.turn_lane_data_path, io::FileReader::HasNoFingerprint); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |         const auto lane_tuple_count = lane_data_file.ReadElementCount64(); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
	
		
			
				
					
					|  |  |  | @ -579,7 +582,7 @@ void Storage::PopulateData(const DataLayout &layout, char *memory_ptr) | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     // Load original edge data
 | 
		
	
		
			
				|  |  |  |  |     { | 
		
	
		
			
				|  |  |  |  |         io::FileReader edges_input_file(config.edges_data_path); | 
		
	
		
			
				|  |  |  |  |         io::FileReader edges_input_file(config.edges_data_path, io::FileReader::HasNoFingerprint); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |         const auto number_of_original_edges = edges_input_file.ReadElementCount64(); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
	
		
			
				
					
					|  |  |  | @ -620,7 +623,8 @@ void Storage::PopulateData(const DataLayout &layout, char *memory_ptr) | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     // load compressed geometry
 | 
		
	
		
			
				|  |  |  |  |     { | 
		
	
		
			
				|  |  |  |  |         io::FileReader geometry_input_file(config.geometries_path); | 
		
	
		
			
				|  |  |  |  |         io::FileReader geometry_input_file(config.geometries_path, | 
		
	
		
			
				|  |  |  |  |                                            io::FileReader::HasNoFingerprint); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |         const auto geometry_index_count = geometry_input_file.ReadElementCount32(); | 
		
	
		
			
				|  |  |  |  |         const auto geometries_index_ptr = | 
		
	
	
		
			
				
					
					|  |  |  | @ -649,7 +653,8 @@ void Storage::PopulateData(const DataLayout &layout, char *memory_ptr) | 
		
	
		
			
				|  |  |  |  |     } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     { | 
		
	
		
			
				|  |  |  |  |         io::FileReader geometry_datasource_file(config.datasource_indexes_path); | 
		
	
		
			
				|  |  |  |  |         io::FileReader geometry_datasource_file(config.datasource_indexes_path, | 
		
	
		
			
				|  |  |  |  |                                                 io::FileReader::HasNoFingerprint); | 
		
	
		
			
				|  |  |  |  |         const auto number_of_compressed_datasources = geometry_datasource_file.ReadElementCount64(); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |         // load datasource information (if it exists)
 | 
		
	
	
		
			
				
					
					|  |  |  | @ -664,7 +669,8 @@ void Storage::PopulateData(const DataLayout &layout, char *memory_ptr) | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     { | 
		
	
		
			
				|  |  |  |  |         /* Load names */ | 
		
	
		
			
				|  |  |  |  |         io::FileReader datasource_names_file(config.datasource_names_path); | 
		
	
		
			
				|  |  |  |  |         io::FileReader datasource_names_file(config.datasource_names_path, | 
		
	
		
			
				|  |  |  |  |                                              io::FileReader::HasNoFingerprint); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |         const auto datasource_names_data = io::readDatasourceNames(datasource_names_file); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
	
		
			
				
					
					|  |  |  | @ -711,7 +717,7 @@ void Storage::PopulateData(const DataLayout &layout, char *memory_ptr) | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     // Loading list of coordinates
 | 
		
	
		
			
				|  |  |  |  |     { | 
		
	
		
			
				|  |  |  |  |         io::FileReader nodes_file(config.nodes_data_path); | 
		
	
		
			
				|  |  |  |  |         io::FileReader nodes_file(config.nodes_data_path, io::FileReader::HasNoFingerprint); | 
		
	
		
			
				|  |  |  |  |         nodes_file.Skip<std::uint64_t>(1); // node_count
 | 
		
	
		
			
				|  |  |  |  |         const auto coordinates_ptr = | 
		
	
		
			
				|  |  |  |  |             layout.GetBlockPtr<util::Coordinate, true>(memory_ptr, DataLayout::COORDINATE_LIST); | 
		
	
	
		
			
				
					
					|  |  |  | @ -729,7 +735,7 @@ void Storage::PopulateData(const DataLayout &layout, char *memory_ptr) | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     // store timestamp
 | 
		
	
		
			
				|  |  |  |  |     { | 
		
	
		
			
				|  |  |  |  |         io::FileReader timestamp_file(config.timestamp_path); | 
		
	
		
			
				|  |  |  |  |         io::FileReader timestamp_file(config.timestamp_path, io::FileReader::HasNoFingerprint); | 
		
	
		
			
				|  |  |  |  |         const auto timestamp_size = timestamp_file.Size(); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |         const auto timestamp_ptr = | 
		
	
	
		
			
				
					
					|  |  |  | @ -740,7 +746,7 @@ void Storage::PopulateData(const DataLayout &layout, char *memory_ptr) | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     // store search tree portion of rtree
 | 
		
	
		
			
				|  |  |  |  |     { | 
		
	
		
			
				|  |  |  |  |         io::FileReader tree_node_file(config.ram_index_path); | 
		
	
		
			
				|  |  |  |  |         io::FileReader tree_node_file(config.ram_index_path, io::FileReader::HasNoFingerprint); | 
		
	
		
			
				|  |  |  |  |         // perform this read so that we're at the right stream position for the next
 | 
		
	
		
			
				|  |  |  |  |         // read.
 | 
		
	
		
			
				|  |  |  |  |         tree_node_file.Skip<std::uint64_t>(1); | 
		
	
	
		
			
				
					
					|  |  |  | @ -751,7 +757,7 @@ void Storage::PopulateData(const DataLayout &layout, char *memory_ptr) | 
		
	
		
			
				|  |  |  |  |     } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     { | 
		
	
		
			
				|  |  |  |  |         io::FileReader core_marker_file(config.core_data_path); | 
		
	
		
			
				|  |  |  |  |         io::FileReader core_marker_file(config.core_data_path, io::FileReader::HasNoFingerprint); | 
		
	
		
			
				|  |  |  |  |         const auto number_of_core_markers = core_marker_file.ReadElementCount32(); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |         // load core markers
 | 
		
	
	
		
			
				
					
					|  |  |  | @ -785,7 +791,8 @@ void Storage::PopulateData(const DataLayout &layout, char *memory_ptr) | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     // load profile properties
 | 
		
	
		
			
				|  |  |  |  |     { | 
		
	
		
			
				|  |  |  |  |         io::FileReader profile_properties_file(config.properties_path); | 
		
	
		
			
				|  |  |  |  |         io::FileReader profile_properties_file(config.properties_path, | 
		
	
		
			
				|  |  |  |  |                                                io::FileReader::HasNoFingerprint); | 
		
	
		
			
				|  |  |  |  |         const auto profile_properties_ptr = layout.GetBlockPtr<extractor::ProfileProperties, true>( | 
		
	
		
			
				|  |  |  |  |             memory_ptr, DataLayout::PROPERTIES); | 
		
	
		
			
				|  |  |  |  |         profile_properties_file.ReadInto(profile_properties_ptr, | 
		
	
	
		
			
				
					
					|  |  |  | @ -794,7 +801,8 @@ void Storage::PopulateData(const DataLayout &layout, char *memory_ptr) | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     // Load intersection data
 | 
		
	
		
			
				|  |  |  |  |     { | 
		
	
		
			
				|  |  |  |  |         io::FileReader intersection_file(config.intersection_class_path, true); | 
		
	
		
			
				|  |  |  |  |         io::FileReader intersection_file(config.intersection_class_path, | 
		
	
		
			
				|  |  |  |  |                                          io::FileReader::VerifyFingerprint); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |         std::vector<BearingClassID> bearing_class_id_table; | 
		
	
		
			
				|  |  |  |  |         intersection_file.DeserializeVector(bearing_class_id_table); | 
		
	
	
		
			
				
					
					|  |  |  | 
 |