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:
Dirk Hohndel 2014-07-03 13:34:27 -07:00
parent 6b1b2bc919
commit 47f9f59c1a
2 changed files with 16 additions and 0 deletions

15
dive.c
View file

@ -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
View file

@ -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);