diff --git a/A1/id_query_indexed b/A1/id_query_indexed new file mode 100755 index 0000000..82d7823 Binary files /dev/null and b/A1/id_query_indexed differ diff --git a/A1/id_query_indexed.c b/A1/id_query_indexed.c new file mode 100644 index 0000000..9028cd2 --- /dev/null +++ b/A1/id_query_indexed.c @@ -0,0 +1,61 @@ +#include +#include +#include +#include +#include +#include +#include + +#include "record.h" +#include "id_query.h" + +struct index_record { + int64_t osm_id; + const struct record* record; +}; + +struct indexed_data { + struct index_record* irs; + int n; +}; + +struct indexed_data* mk_indexed(struct record* rs, int n) { + struct index_record irs[n]; + for (int i = 0 ; i < n ; i++) { + struct record* rec = &rs[i]; + struct index_record irec = { .osm_id = rec->osm_id, .record = rec }; + irs[i] = irec; + } + struct indexed_data* data = malloc(sizeof(struct indexed_data*)); + data->irs = irs; + data->n = n; + return data; +} + +void free_indexed(struct indexed_data* data) { + struct record* rs = malloc(sizeof(struct record*)); + int n = data->n; + for (int i = 0 ; i < n ; i++) { + struct index_record* irec = &data->irs[i]; + rs[i] = *irec->record; + } + free_records(rs, n); +} + +const struct record* lookup_indexed(struct indexed_data *data, int64_t needle) { + int n = data->n; + for (int i = 0 ; i < n ; i++) { + struct index_record* irec = &data->irs[i]; + if (irec->osm_id == needle) { + return irec->record; + } + } + return NULL; +} + +int main(int argc, char** argv) { + return id_query_loop(argc, argv, + (mk_index_fn)mk_indexed, + (free_index_fn)free_indexed, + (lookup_fn)lookup_indexed); +} diff --git a/A1/id_query_naive b/A1/id_query_naive index 86e67b9..9c136e6 100755 Binary files a/A1/id_query_naive and b/A1/id_query_naive differ