From 63b65a7e20615d7e049ab09ae7dc6053d705c04b Mon Sep 17 00:00:00 2001 From: Berthold Stoeger Date: Mon, 30 Jul 2018 10:33:25 +0200 Subject: Undo: implement autogrouping of trips in DiveAdd If the autogroup flag is set, search for appropriate trips in DiveAdd() and add the dive to this trip. If no trip exists, add a new trip. Signed-off-by: Berthold Stoeger --- core/divelist.c | 32 ++++++++++++++++++++++++++++++++ core/divelist.h | 1 + 2 files changed, 33 insertions(+) (limited to 'core') diff --git a/core/divelist.c b/core/divelist.c index 08fde01ff..902bbb5ac 100644 --- a/core/divelist.c +++ b/core/divelist.c @@ -24,6 +24,7 @@ * void add_dive_to_trip(struct dive *dive, dive_trip_t *trip) * dive_trip_t *create_and_hookup_trip_from_dive(struct dive *dive) * dive_trip_t *get_dives_to_autogroup(int start, int *from, int *to, bool *allocated) + * dive_trip_t *get_trip_for_new_dive(struct dive *new_dive, bool *allocated) * void autogroup_dives(void) * void combine_trips(struct dive_trip *trip_a, struct dive_trip *trip_b) * dive_trip_t *combine_trips_create(struct dive_trip *trip_a, struct dive_trip *trip_b) @@ -925,6 +926,37 @@ dive_trip_t *create_and_hookup_trip_from_dive(struct dive *dive) return dive_trip; } +/* + * Find a trip a new dive should be autogrouped with. If no such trips + * exist, allocate a new trip. The bool "*allocated" is set to true + * if a new trip was allocated. + */ +dive_trip_t *get_trip_for_new_dive(struct dive *new_dive, bool *allocated) +{ + struct dive *d; + dive_trip_t *trip; + int i; + + /* Find dive that is within TRIP_THRESHOLD of current dive */ + for_each_dive(i, d) { + /* Check if we're past the range of possible dives */ + if (d->when >= new_dive->when + TRIP_THRESHOLD) + break; + + if (d->when + TRIP_THRESHOLD >= new_dive->when && d->divetrip) { + /* Found a dive with trip in the range */ + *allocated = false; + return d->divetrip; + } + } + + /* Didn't find a trip -> allocate a new one */ + trip = create_trip_from_dive(new_dive); + trip->autogen = true; + *allocated = true; + return trip; +} + /* * Collect dives for auto-grouping. Pass in first dive which should be checked. * Returns range of dives that should be autogrouped and trip it should be diff --git a/core/divelist.h b/core/divelist.h index 8bcf9f55c..9449e36e2 100644 --- a/core/divelist.h +++ b/core/divelist.h @@ -32,6 +32,7 @@ extern dive_trip_t *alloc_trip(void); extern dive_trip_t *create_trip_from_dive(struct dive *dive); extern dive_trip_t *create_and_hookup_trip_from_dive(struct dive *dive); extern dive_trip_t *get_dives_to_autogroup(int start, int *from, int *to, bool *allocated); +extern dive_trip_t *get_trip_for_new_dive(struct dive *new_dive, bool *allocated); extern void autogroup_dives(void); extern struct dive *merge_two_dives(struct dive *a, struct dive *b); extern bool consecutive_selected(); -- cgit v1.2.3-70-g09d2