Dive list: implement trip_less_than function

As a step towards proper sorting, introduce a trip_less_than()
function in core. It simply sorts by the first dive, which should
be unique as dives may belong to only one trip.

Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
This commit is contained in:
Berthold Stoeger 2018-11-09 16:28:54 +01:00 committed by Dirk Hohndel
parent 6b283e598a
commit 9d3a5fa997
2 changed files with 22 additions and 1 deletions

View file

@ -556,6 +556,7 @@ extern void add_sample_pressure(struct sample *sample, int sensor, int mbar);
extern int legacy_format_o2pressures(const struct dive *dive, const struct divecomputer *dc);
extern bool dive_less_than(const struct dive *a, const struct dive *b);
extern bool trip_less_than(const struct dive_trip *a, const struct dive_trip *b);
extern void sort_table(struct dive_table *table);
extern struct dive *fixup_dive(struct dive *dive);
extern void fixup_dc_duration(struct divecomputer *dc);

View file

@ -39,6 +39,7 @@
* int unsaved_changes()
* void remove_autogen_trips()
* bool dive_less_than(const struct dive *a, const struct dive *b)
* bool trip_less_than(const struct dive_trip *a, const struct dive_trip *b)
* void sort_table(struct dive_table *table)
* bool is_trip_before_after(const struct dive *dive, bool before)
* void delete_dive_from_table(struct dive_table *table, int idx)
@ -758,7 +759,7 @@ void insert_trip(dive_trip_t *dive_trip)
dive_trip_t *trip;
/* Walk the dive trip list looking for the right location.. */
while ((trip = *p) != NULL && trip->when < dive_trip->when)
while ((trip = *p) != NULL && trip_less_than(trip, dive_trip))
p = &trip->next;
dive_trip->next = trip;
@ -1741,6 +1742,25 @@ bool dive_less_than(const struct dive *a, const struct dive *b)
return comp_dives(a, b) < 0;
}
/* Trips are compared according to the first dive in the trip.
* Even though it shouldn't happen, take care about "empty" trips.
* Since a dive can only belong to one trip, no two trips should
* compare as equal
*/
static int comp_trips(const struct dive_trip *a, const struct dive_trip *b)
{
if (a->dives.nr <= 0)
return b->dives.nr <= 0 ? 0 : -1;
if (b->dives.nr <= 0)
return 1;
return comp_dives(a->dives.dives[0], b->dives.dives[0]);
}
bool trip_less_than(const struct dive_trip *a, const struct dive_trip *b)
{
return comp_trips(a, b) < 0;
}
static int sortfn(const void *_a, const void *_b)
{
const struct dive *a = (const struct dive *)*(const void **)_a;