base_file_name blocksize const size_of_Index .index_to_buf(Index) operator<(Index) const size_of_Head operator<(Head) .head_to_buf(Head) .index_of(Head) .index_of_buf() .id_of(Head) .id_of_buf() const size_of_Data .data_to_buf(Data) (Annahme: Interne Datenstruktur ist (Head, vector< Data >)) struct Indexed_Ordered_Id_To_Many< Index, Head, Data > { .blocksize() .data_file() .index_file() .id_idx_file() { base_file_name } .size_of_buf() { const size_of_Head const size_of_Data } void flush_data(elem_begin(), elem_end()) .block_index< Index >() .index_of() .size_of() .to_buf() .compare() .index_of_buf() .index_to_buf() void delete_insert(elem_begin(), elem_end()) .block_index() .elem_begin() .elem_end() .index_of() .keep_this_elem() .compare() .size_of() .size_of_part() .to_buf() Ansatz mit to_delete, to_insert - Drei Durchläufe über die Datei, ggf. Nutzung des Caches void make_block_index() .block_index() .size_of_Index() .index_of_buf() .index_to_buf() void make_id_index() .first_new_block() .id_of_buf() void update_id_index(elem_begin(), elem_end()) .first_new_block() .block_of_elem_begin() .elem_begin() .elem_end() .id_of() Container& select_by_id< Container >(ids_begin(), ids_end()) .ids_begin() .ids_end() .process() Container& select_with_idx< Container >(idxs_begin(), idxs_end()) pair< Container, Container >& select_with_idx_dbl_range< Container >(idxs_inside_begin(), idxs_inside_end(), idxs_border_begin(), idxs_border_end()) .idxs_begin() .idxs_end() .block_notify() .process() select_all .process() count_with_idx .count_idx() --- zu den Wegen: - füge die Wege einschließlich Knoten in eine Map< Way_ > ein - erzeuge daraus die Node-Anfrage - leite aus dem Ergebnis die richtigen Indexe für die Ways ab