mirror of
https://github.com/subsurface/subsurface.git
synced 2025-02-19 22:16:15 +00:00
core: turn C dive-table into an owning table
This is a humongous commit, because it touches all parts of the code. It removes the last user of our horrible TABLE macros, which simulate std::vector<> in a very clumsy way. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
This commit is contained in:
parent
f00c30ad4a
commit
b95ac3f79c
73 changed files with 1030 additions and 1230 deletions
|
@ -3,6 +3,7 @@
|
|||
#include "divelist.h"
|
||||
#include "divesite.h"
|
||||
#include "device.h"
|
||||
#include "dive.h"
|
||||
#include "errorhelper.h"
|
||||
#include "filterpreset.h"
|
||||
#include "trip.h"
|
||||
|
@ -10,21 +11,14 @@
|
|||
struct divelog divelog;
|
||||
|
||||
divelog::divelog() :
|
||||
dives(std::make_unique<dive_table>()),
|
||||
trips(std::make_unique<trip_table>()),
|
||||
sites(std::make_unique<dive_site_table>()),
|
||||
filter_presets(std::make_unique<filter_preset_table>()),
|
||||
autogroup(false)
|
||||
{
|
||||
*dives = empty_dive_table;
|
||||
}
|
||||
|
||||
divelog::~divelog()
|
||||
{
|
||||
if (dives)
|
||||
clear_dive_table(dives.get());
|
||||
}
|
||||
|
||||
divelog::~divelog() = default;
|
||||
divelog::divelog(divelog &&) = default;
|
||||
struct divelog &divelog::operator=(divelog &&) = default;
|
||||
|
||||
|
@ -32,11 +26,11 @@ struct divelog &divelog::operator=(divelog &&) = default;
|
|||
* dive log and the trip, but doesn't deal with updating dive trips, etc */
|
||||
void divelog::delete_single_dive(int idx)
|
||||
{
|
||||
if (idx < 0 || idx > dives->nr) {
|
||||
report_info("Warning: deleting unexisting dive with index %d", idx);
|
||||
if (idx < 0 || static_cast<size_t>(idx) >= dives.size()) {
|
||||
report_info("Warning: deleting non-existing dive with index %d", idx);
|
||||
return;
|
||||
}
|
||||
struct dive *dive = dives->dives[idx];
|
||||
struct dive *dive = dives[idx].get();
|
||||
struct dive_trip *trip = unregister_dive_from_trip(dive);
|
||||
|
||||
// Deleting a dive may change the order of trips!
|
||||
|
@ -46,15 +40,58 @@ void divelog::delete_single_dive(int idx)
|
|||
if (trip && trip->dives.empty())
|
||||
trips->pull(trip);
|
||||
unregister_dive_from_dive_site(dive);
|
||||
delete_dive_from_table(dives.get(), idx);
|
||||
dives.erase(dives.begin() + idx);
|
||||
}
|
||||
|
||||
void divelog::delete_multiple_dives(const std::vector<dive *> &dives_to_delete)
|
||||
{
|
||||
bool trips_changed = false;
|
||||
|
||||
for (dive *d: dives_to_delete) {
|
||||
// Delete dive from trip and delete trip if empty
|
||||
struct dive_trip *trip = unregister_dive_from_trip(d);
|
||||
if (trip && trip->dives.empty()) {
|
||||
trips_changed = true;
|
||||
trips->pull(trip);
|
||||
}
|
||||
|
||||
unregister_dive_from_dive_site(d);
|
||||
dives.pull(d);
|
||||
}
|
||||
|
||||
// Deleting a dive may change the order of trips!
|
||||
if (trips_changed)
|
||||
trips->sort();
|
||||
}
|
||||
|
||||
void divelog::clear()
|
||||
{
|
||||
while (dives->nr > 0)
|
||||
delete_dive_from_table(dives.get(), dives->nr - 1);
|
||||
dives.clear();
|
||||
sites->clear();
|
||||
trips->clear();
|
||||
devices.clear();
|
||||
filter_presets->clear();
|
||||
}
|
||||
|
||||
/* check if we have a trip right before / after this dive */
|
||||
bool divelog::is_trip_before_after(const struct dive *dive, bool before) const
|
||||
{
|
||||
auto it = std::find_if(dives.begin(), dives.end(),
|
||||
[dive](auto &d) { return d.get() == dive; });
|
||||
if (it == dives.end())
|
||||
return false;
|
||||
|
||||
if (before) {
|
||||
do {
|
||||
if (it == dives.begin())
|
||||
return false;
|
||||
--it;
|
||||
} while ((*it)->invalid);
|
||||
return (*it)->divetrip != nullptr;
|
||||
} else {
|
||||
++it;
|
||||
while (it != dives.end() && (*it)->invalid)
|
||||
++it;
|
||||
return it != dives.end() && (*it)->divetrip != nullptr;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue