mirror of
https://github.com/subsurface/subsurface.git
synced 2025-01-19 14:25:27 +00:00
UI restructure: add clone_dive helper
This is kind of the inverse to copy_dive(). Instead of duplicating all the data that the dive points to, it moves it to a new struct dive and zeroes out the old one so there are no two sets of pointers to these data. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
This commit is contained in:
parent
6b1b2bc919
commit
47f9f59c1a
2 changed files with 16 additions and 0 deletions
15
dive.c
15
dive.c
|
@ -326,6 +326,9 @@ void clear_dive(struct dive *d)
|
|||
memset(d, 0, sizeof(struct dive));
|
||||
}
|
||||
|
||||
/* make a true copy that is independent of the source dive;
|
||||
* all data structures are duplicated, so the copy can be modified without
|
||||
* any impact on the source */
|
||||
void copy_dive(struct dive *s, struct dive *d)
|
||||
{
|
||||
clear_dive(d);
|
||||
|
@ -343,6 +346,18 @@ void copy_dive(struct dive *s, struct dive *d)
|
|||
STRUCTURED_LIST_COPY(struct tag_entry, s->tag_list, d->tag_list, copy_tl);
|
||||
}
|
||||
|
||||
/* make a clone of the source dive and clean out the source dive;
|
||||
* this is specifically so we can create a dive in the displayed_dive and then
|
||||
* add it to the divelist.
|
||||
* Note the difference to copy_dive() / clean_dive() */
|
||||
struct dive *clone_dive(struct dive *s)
|
||||
{
|
||||
struct dive *dive = alloc_dive();
|
||||
*dive = *s; // so all the pointers in dive point to the things s pointed to
|
||||
memset(s, 0, sizeof(struct dive)); // and now the pointers in s are gone
|
||||
return dive;
|
||||
}
|
||||
|
||||
/* only copies events from the first dive computer */
|
||||
void copy_events(struct divecomputer *s, struct divecomputer *d)
|
||||
{
|
||||
|
|
1
dive.h
1
dive.h
|
@ -605,6 +605,7 @@ extern struct dive *alloc_dive(void);
|
|||
extern void record_dive(struct dive *dive);
|
||||
extern void clear_dive(struct dive *dive);
|
||||
extern void copy_dive(struct dive *s, struct dive *d);
|
||||
extern struct dive *clone_dive(struct dive *s);
|
||||
|
||||
extern struct sample *prepare_sample(struct divecomputer *dc);
|
||||
extern void finish_sample(struct divecomputer *dc);
|
||||
|
|
Loading…
Add table
Reference in a new issue