added binary search tree lookup to airlines.db

This commit is contained in:
Arjan Onwezen 2021-12-12 04:48:11 -05:00
parent 3cb9e1849b
commit 4a0a243530

View File

@ -293,7 +293,7 @@ ADSBRxDetailsView::ADSBRxDetailsView(
bool found = false; bool found = false;
size_t number_of_airlines = 0; size_t number_of_airlines = 0;
std::string airline_code; std::string airline_code;
size_t c; //size_t c;
add_children({ add_children({
&labels, &labels,
@ -320,18 +320,37 @@ ADSBRxDetailsView::ADSBRxDetailsView(
// Search for 3-letter code // Search for 3-letter code
number_of_airlines = (db_file.size() / 68); // determine number of airlines in file number_of_airlines = (db_file.size() / 68); // determine number of airlines in file
airline_code = entry_copy.callsign.substr(0, 3); airline_code = entry_copy.callsign.substr(0, 3);
c = 0; //c = 0;
do { //do {
db_file.read(file_buffer, 4); // db_file.read(file_buffer, 4);
if (!file_buffer[0]) // if (!file_buffer[0])
break; // break;
if (!airline_code.compare(0, 4, file_buffer)) // if (!airline_code.compare(0, 4, file_buffer))
found = true; // found = true;
else // else
c++; // c++;
} while (!found && (c < number_of_airlines)); //} while (!found && (c < number_of_airlines));
if (found) { // binary search
int first = 0, // First search element
last = number_of_airlines - 1, // Last search element
middle, // Mid point of search
position = -1; // Position of search value
while (!found && first <= last) {
middle = (first + last) / 2; // Calculate mid point
db_file.seek(middle * 4);
db_file.read(file_buffer, 3);
if (file_buffer == airline_code) { // If value is found at mid
found = true;
position = middle;
}
else if (file_buffer > airline_code) // If value is in lower half
last = middle - 1;
else
first = middle + 1; // If value is in upper half
}
if (position > -1) {
db_file.seek((number_of_airlines * 4) + (c << 6)); // seek starting after index db_file.seek((number_of_airlines * 4) + (c << 6)); // seek starting after index
db_file.read(file_buffer, 32); db_file.read(file_buffer, 32);
text_airline.set(file_buffer); text_airline.set(file_buffer);