id_query_indexed.c

This commit is contained in:
Nikolaj
2021-10-03 16:42:25 +02:00
parent f10c6c48d0
commit 740d8bc1e0
3 changed files with 61 additions and 0 deletions

BIN
A1/id_query_indexed Executable file

Binary file not shown.

61
A1/id_query_indexed.c Normal file
View File

@ -0,0 +1,61 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/time.h>
#include <stdint.h>
#include <errno.h>
#include <assert.h>
#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);
}

Binary file not shown.