diff options
author | Berthold Stoeger <bstoeger@mail.tuwien.ac.at> | 2018-11-08 17:13:17 +0100 |
---|---|---|
committer | Dirk Hohndel <dirk@hohndel.org> | 2018-11-18 16:50:09 -0800 |
commit | 0618aa737fde54e634d16273ec0246ced9c454aa (patch) | |
tree | 0ebcb45cb2c3849d5b78fc979e9984380485a9a3 | |
parent | c48056300d61987850dbe9ad92b20a293d03dc75 (diff) | |
download | subsurface-0618aa737fde54e634d16273ec0246ced9c454aa.tar.gz |
Core: unify insert_trip() and insert_trip_dont_merge()
There were two versions of the insert_trip() function: one
would merge trips if a trip with the same date already existed,
the other wouldn't. The latter was introduced with the dive-list
undo work.
The problem is that the "date" of a trip (i.e. the first dive)
seems ill-defined as this is a volatile value. Moreover in
the context of making dive-import undoable this is a very
dangerous notion, as the caller needs control over when the dives
are added to a trip.
Therefore, unify these two functions and never merge trips.
The decision on merging dives now has to made by the caller.
This will be implemented in a future commit.
Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
-rw-r--r-- | core/dive.h | 3 | ||||
-rw-r--r-- | core/divelist.c | 48 | ||||
-rw-r--r-- | core/load-git.c | 2 | ||||
-rw-r--r-- | core/parse.c | 2 | ||||
-rw-r--r-- | desktop-widgets/command_divelist.cpp | 4 | ||||
-rw-r--r-- | mobile-widgets/qmlmanager.cpp | 2 |
6 files changed, 13 insertions, 48 deletions
diff --git a/core/dive.h b/core/dive.h index 7e4336317..aa37eeb46 100644 --- a/core/dive.h +++ b/core/dive.h @@ -421,8 +421,7 @@ extern void delete_single_dive(int idx); extern int dive_get_insertion_index(struct dive *dive); extern void add_single_dive(int idx, struct dive *dive); -extern void insert_trip(dive_trip_t **trip); -extern void insert_trip_dont_merge(dive_trip_t *trip); +extern void insert_trip(dive_trip_t *trip); extern void unregister_trip(dive_trip_t *trip); extern void free_trip(dive_trip_t *trip); diff --git a/core/divelist.c b/core/divelist.c index 6eb2b2389..52c724429 100644 --- a/core/divelist.c +++ b/core/divelist.c @@ -16,8 +16,7 @@ * int init_decompression(struct dive *dive) * void update_cylinder_related_info(struct dive *dive) * void dump_trip_list(void) - * void insert_trip(dive_trip_t **dive_trip_p) - * void insert_trip_dont_merge(dive_trip_t *dive_trip_p) + * void insert_trip(dive_trip_t *dive_trip_p) * void unregister_trip(dive_trip_t *trip) * void free_trip(dive_trip_t *trip) * void remove_dive_from_trip(struct dive *dive) @@ -742,56 +741,23 @@ void dump_trip_list(void) } #endif -/* insert the trip into the dive_trip_list - but ensure you don't have - * two trips for the same date; but if you have, make sure you don't - * keep the one with less information */ -void insert_trip(dive_trip_t **dive_trip_p) +/* insert the trip into the dive_trip_list */ +void insert_trip(dive_trip_t *dive_trip) { - dive_trip_t *dive_trip = *dive_trip_p; dive_trip_t **p = &dive_trip_list; dive_trip_t *trip; - struct dive *divep; /* Walk the dive trip list looking for the right location.. */ while ((trip = *p) != NULL && trip->when < dive_trip->when) p = &trip->next; - if (trip && trip->when == dive_trip->when) { - if (!trip->location) - trip->location = dive_trip->location; - if (!trip->notes) - trip->notes = dive_trip->notes; - divep = dive_trip->dives; - while (divep) { - add_dive_to_trip(divep, trip); - divep = divep->next; - } - *dive_trip_p = trip; - } else { - dive_trip->next = trip; - *p = dive_trip; - } + dive_trip->next = trip; + *p = dive_trip; #ifdef DEBUG_TRIP dump_trip_list(); #endif } -/* same as insert_trip, but don't merge trips with the same date. - * this is cruical for the merge undo-command, because there we - * add a new trip with the same date and then remove the old one. */ -void insert_trip_dont_merge(dive_trip_t *dive_trip) -{ - dive_trip_t **p = &dive_trip_list; - dive_trip_t *trip; - - /* Walk the dive trip list looking for the right location.. */ - while ((trip = *p) != NULL && trip->when < dive_trip->when) - p = &trip->next; - - dive_trip->next = trip; - *p = dive_trip; -} - /* free resources associated with a trip structure */ void free_trip(dive_trip_t *trip) { @@ -957,7 +923,7 @@ dive_trip_t *create_and_hookup_trip_from_dive(struct dive *dive) dive_trip_t *dive_trip = alloc_trip(); dive_trip = create_trip_from_dive(dive); - insert_trip(&dive_trip); + insert_trip(dive_trip); dive->tripflag = IN_TRIP; add_dive_to_trip(dive, dive_trip); @@ -1072,7 +1038,7 @@ void autogroup_dives(void) for(i = 0; (trip = get_dives_to_autogroup(i, &from, &to, &alloc)) != NULL; i = to) { /* If this was newly allocated, add trip to list */ if (alloc) - insert_trip(&trip); + insert_trip(trip); for (j = from; j < to; ++j) add_dive_to_trip(get_dive(j), trip); } diff --git a/core/load-git.c b/core/load-git.c index 8483b9cf0..8e3254abd 100644 --- a/core/load-git.c +++ b/core/load-git.c @@ -1176,7 +1176,7 @@ static void finish_active_trip(void) if (trip) { active_trip = NULL; - insert_trip(&trip); + insert_trip(trip); } } diff --git a/core/parse.c b/core/parse.c index 56e2e1b6f..f54d36742 100644 --- a/core/parse.c +++ b/core/parse.c @@ -279,7 +279,7 @@ void trip_end(struct parser_state *state) { if (!state->cur_trip) return; - insert_trip(&state->cur_trip); + insert_trip(state->cur_trip); state->cur_trip = NULL; } diff --git a/desktop-widgets/command_divelist.cpp b/desktop-widgets/command_divelist.cpp index e129fefdd..9f4ea8cd2 100644 --- a/desktop-widgets/command_divelist.cpp +++ b/desktop-widgets/command_divelist.cpp @@ -82,7 +82,7 @@ DiveToAdd DiveListBase::removeDive(struct dive *d) dive *DiveListBase::addDive(DiveToAdd &d) { if (d.tripToAdd) - insert_trip_dont_merge(d.tripToAdd.release()); // Return ownership to backend + insert_trip(d.tripToAdd.release()); // Return ownership to backend if (d.trip) add_dive_to_trip(d.dive.get(), d.trip); dive *res = d.dive.release(); // Give up ownership of dive @@ -259,7 +259,7 @@ static void moveDivesBetweenTrips(DivesToTrip &dives) for (OwningTripPtr &trip: dives.tripsToAdd) { dive_trip *t = trip.release(); // Give up ownership createdTrips.push_back(t); - insert_trip_dont_merge(t); // Return ownership to backend + insert_trip(t); // Return ownership to backend } dives.tripsToAdd.clear(); diff --git a/mobile-widgets/qmlmanager.cpp b/mobile-widgets/qmlmanager.cpp index 307acae5d..8bae01d86 100644 --- a/mobile-widgets/qmlmanager.cpp +++ b/mobile-widgets/qmlmanager.cpp @@ -1270,7 +1270,7 @@ bool QMLManager::undoDelete(int id) return false; } if (deletedTrip) - insert_trip(&deletedTrip); + insert_trip(deletedTrip); if (deletedDive->divetrip) { struct dive_trip *trip = deletedDive->divetrip; tripflag_t tripflag = deletedDive->tripflag; // this gets overwritten in add_dive_to_trip() |