summaryrefslogtreecommitdiffstats
path: root/divelist.c
diff options
context:
space:
mode:
authorGravatar Linus Torvalds <torvalds@linux-foundation.org>2012-11-25 18:53:15 -0800
committerGravatar Dirk Hohndel <dirk@hohndel.org>2012-11-26 09:27:24 -0800
commitba3e6bcc5185b0427f5591c4fc8566f5d66ffb7d (patch)
treeefa5c02ed30c32ab426f3c00a7c3b38860a0d31f /divelist.c
parent2f82ec39b89b782d1aeb2433a44d102fed5af7de (diff)
downloadsubsurface-ba3e6bcc5185b0427f5591c4fc8566f5d66ffb7d.tar.gz
Associate each dive trip with the dives in that trip
We already kept a count of dives per trip in order to figure out when there are no more dives left and the trip needs to be freed. Now we explicitly keep track of the list of dives associated with the trip too, which simplifies the "find the time of the trip" logic. We may want to sort it in time, but for now this is mainly about trying to keep track of the divetrip relationships explicitly. I want to move away from the whole "use the gtk tree model to keep track of things" approach. Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
Diffstat (limited to 'divelist.c')
-rw-r--r--divelist.c31
1 files changed, 24 insertions, 7 deletions
diff --git a/divelist.c b/divelist.c
index cc301a8b0..28c2e8d53 100644
--- a/divelist.c
+++ b/divelist.c
@@ -1053,6 +1053,7 @@ static void delete_trip(dive_trip_t *trip)
{
GList *trip_list = find_trip(trip);
+ assert(!trip->dives);
/*
* The trip may not be on the list, if it had the
* same time as another trip.
@@ -1066,23 +1067,31 @@ static void delete_trip(dive_trip_t *trip)
static void find_new_trip_start_time(dive_trip_t *trip)
{
- int i;
- struct dive *dive;
+ struct dive *dive = trip->dives;
+ timestamp_t when = dive->when;
- for_each_dive(i, dive) {
- if (dive->divetrip != trip)
- continue;
- trip->when = dive->when;
- break;
+ while ((dive = dive->next) != NULL) {
+ if (dive->when < when)
+ when = dive->when;
}
+ trip->when = when;
}
void remove_dive_from_trip(struct dive *dive)
{
+ struct dive *next, **pprev;
dive_trip_t *trip = dive->divetrip;
if (!trip)
return;
+
+ /* Remove the dive from the trip's list of dives */
+ next = dive->next;
+ pprev = dive->pprev;
+ *pprev = next;
+ if (next)
+ next->pprev = pprev;
+
dive->divetrip = NULL;
assert(trip->nrdives > 0);
if (!--trip->nrdives)
@@ -1099,6 +1108,14 @@ void add_dive_to_trip(struct dive *dive, dive_trip_t *trip)
remove_dive_from_trip(dive);
trip->nrdives++;
dive->divetrip = trip;
+
+ /* Add it to the trip's list of dives*/
+ dive->next = trip->dives;
+ if (dive->next)
+ dive->next->pprev = &dive->next;
+ trip->dives = dive;
+ dive->pprev = &trip->dives;
+
if (dive->when && trip->when > dive->when)
trip->when = dive->when;
}