diff --git a/core/dive.cpp b/core/dive.cpp index a9747399a..c45f13537 100644 --- a/core/dive.cpp +++ b/core/dive.cpp @@ -2554,7 +2554,7 @@ location_t dive::get_gps_location() const } gasmix_loop::gasmix_loop(const struct dive &d, const struct divecomputer &dc) : - dive(d), dc(dc), first_run(true), loop("gaschange") + dive(d), dc(dc), first_run(true), loop("gaschange", dc) { } @@ -2571,13 +2571,13 @@ std::pair gasmix_loop::next_cylinder_index() return std::make_pair(-1, INT_MAX); if (first_run) { - next_event = loop.next(dc); + next_event = loop.next(); last_cylinder_index = 0; // default to first cylinder last_time = 0; if (next_event && ((!dc.samples.empty() && next_event->time.seconds == dc.samples[0].time.seconds) || next_event->time.seconds <= 1)) { last_cylinder_index = dive.get_cylinder_index(*next_event); last_time = next_event->time.seconds; - next_event = loop.next(dc); + next_event = loop.next(); } else if (dc.divemode == CCR) { last_cylinder_index = std::max(get_cylinder_idx_by_use(dive, DILUENT), last_cylinder_index); } @@ -2587,7 +2587,7 @@ std::pair gasmix_loop::next_cylinder_index() if (next_event) { last_cylinder_index = dive.get_cylinder_index(*next_event); last_time = next_event->time.seconds; - next_event = loop.next(dc); + next_event = loop.next(); } else { last_cylinder_index = -1; last_time = INT_MAX; diff --git a/core/divecomputer.cpp b/core/divecomputer.cpp index f8e2c370c..1f62546b8 100644 --- a/core/divecomputer.cpp +++ b/core/divecomputer.cpp @@ -200,17 +200,17 @@ void fake_dc(struct divecomputer *dc) } divemode_loop::divemode_loop(const struct divecomputer &dc) : - dc(dc), last(dc.divemode), loop("modechange") + last(dc.divemode), loop("modechange", dc) { /* on first invocation, get first event (if any) */ - ev = loop.next(dc); + ev = loop.next(); } -divemode_t divemode_loop::next(int time) +divemode_t divemode_loop::at(int time) { while (ev && ev->time.seconds <= time) { last = static_cast(ev->value); - ev = loop.next(dc); + ev = loop.next(); } return last; } diff --git a/core/divelist.cpp b/core/divelist.cpp index f64fa0219..ca9a07800 100644 --- a/core/divelist.cpp +++ b/core/divelist.cpp @@ -433,7 +433,7 @@ static void add_dive_to_deco(struct deco_state *ds, const struct dive &dive, boo int depth = interpolate(psample.depth.mm, sample.depth.mm, j - t0, t1 - t0); auto gasmix = loop.at(j).first; add_segment(ds, dive.depth_to_bar(depth), gasmix, 1, sample.setpoint.mbar, - loop_d.next(j), dive.sac, + loop_d.at(j), dive.sac, in_planner); } } diff --git a/core/event.cpp b/core/event.cpp index 6ea384d7b..329daf009 100644 --- a/core/event.cpp +++ b/core/event.cpp @@ -81,27 +81,22 @@ enum event_severity event::get_severity() const } } -event_loop::event_loop(const char *name) : name(name), idx(0) +event_loop::event_loop(const char *name, const struct divecomputer &dc) : name(name), idx(0), dc(dc) { } -struct event *event_loop::next(struct divecomputer &dc) +const struct event *event_loop::next() { if (name.empty()) return nullptr; while (idx < dc.events.size()) { - struct event &ev = dc.events[idx++]; + const struct event &ev = dc.events[idx++]; if (ev.name == name) return &ev; } return nullptr; } -const struct event *event_loop::next(const struct divecomputer &dc) -{ - return next(const_cast(dc)); -} - struct event *get_first_event(struct divecomputer &dc, const std::string &name) { auto it = std::find_if(dc.events.begin(), dc.events.end(), [name](auto &ev) { return ev.name == name; }); diff --git a/core/event.h b/core/event.h index 54b47e692..d96df5733 100644 --- a/core/event.h +++ b/core/event.h @@ -58,10 +58,10 @@ class event_loop { std::string name; size_t idx; + const struct divecomputer &dc; public: - event_loop(const char *name); - struct event *next(struct divecomputer &dc); // nullptr -> end - const struct event *next(const struct divecomputer &dc); // nullptr -> end + event_loop(const char *name, const struct divecomputer &dc); + const struct event *next(); // nullptr -> end }; /* Get gasmixes at increasing timestamps. */ @@ -92,13 +92,13 @@ public: /* Get divemodes at increasing timestamps. */ class divemode_loop { - const struct divecomputer &dc; divemode_t last; event_loop loop; const struct event *ev; public: divemode_loop(const struct divecomputer &dc); - divemode_t next(int time); + // Return the divemode at a given time during the dive + divemode_t at(int time); }; extern const struct event *get_first_event(const struct divecomputer &dc, const std::string &name); diff --git a/core/gaspressures.cpp b/core/gaspressures.cpp index 9d408d1cb..9698e54c2 100644 --- a/core/gaspressures.cpp +++ b/core/gaspressures.cpp @@ -364,7 +364,7 @@ void populate_pressure_information(const struct dive *dive, const struct divecom cyl = sensor; } - divemode_t dmode = loop_mode.next(time); + divemode_t dmode = loop_mode.at(time); if (current != std::string::npos) { // calculate pressure-time, taking into account the dive mode for this specific segment. entry.pressure_time = (int)(calc_pressure_time(dive, pi.entry[i - 1], entry) * gasfactor[dmode] + 0.5); diff --git a/core/planner.cpp b/core/planner.cpp index 35b9e1827..a457221f9 100644 --- a/core/planner.cpp +++ b/core/planner.cpp @@ -162,7 +162,7 @@ static int tissue_at_end(struct deco_state *ds, struct dive *dive, const struct ds->max_bottom_ceiling_pressure.mbar = ceiling_pressure.mbar; } - divemode_t divemode = loop.next(t0.seconds + 1); + divemode_t divemode = loop.at(t0.seconds + 1); interpolate_transition(ds, dive, t0, t1, lastdepth, sample.depth, gas, setpoint, divemode); psample = &sample; t0 = t1; @@ -720,7 +720,7 @@ bool plan(struct deco_state *ds, struct diveplan *diveplan, struct dive *dive, i current_cylinder = get_cylinderid_at_time(dive, dc, sample.time); // Find the divemode at the end of the dive divemode_loop loop(*dc); - divemode = loop.next(bottom_time); + divemode = loop.at(bottom_time); gas = dive->get_cylinder(current_cylinder)->gasmix; po2 = sample.setpoint.mbar; diff --git a/core/plannernotes.cpp b/core/plannernotes.cpp index 360f7bb8d..55ed8d3b9 100644 --- a/core/plannernotes.cpp +++ b/core/plannernotes.cpp @@ -595,7 +595,7 @@ void add_plan_to_notes(struct diveplan *diveplan, struct dive *dive, bool show_d std::string temp; struct gasmix gasmix = dive->get_cylinder(dp->cylinderid)->gasmix; - divemode_t current_divemode = loop.next(dp->time); + divemode_t current_divemode = loop.at(dp->time); amb = dive->depth_to_atm(dp->depth.mm); gas_pressures pressures = fill_pressures(amb, gasmix, (current_divemode == OC) ? 0.0 : amb * gasmix.o2.permille / 1000.0, current_divemode); diff --git a/core/profile.cpp b/core/profile.cpp index 0d0961062..eb22dfddc 100644 --- a/core/profile.cpp +++ b/core/profile.cpp @@ -212,9 +212,9 @@ static void check_setpoint_events(const struct dive *, const struct divecomputer pressure_t setpoint; setpoint.mbar = 0; - event_loop loop("SP change"); + event_loop loop("SP change", *dc); bool found = false; - while (auto ev = loop.next(*dc)) { + while (auto ev = loop.next()) { i = set_setpoint(pi, i, setpoint.mbar, ev->time.seconds); setpoint.mbar = ev->value; found = true; @@ -876,7 +876,7 @@ static void calculate_deco_information(struct deco_state *ds, const struct deco_ int j, t0 = prev.sec, t1 = entry.sec; int time_stepsize = 20, max_ceiling = -1; - divemode_t current_divemode = loop_d.next(entry.sec); + divemode_t current_divemode = loop_d.at(entry.sec); struct gasmix gasmix = loop.at(t1).first; entry.ambpressure = dive->depth_to_bar(entry.depth); entry.gfline = get_gf(ds, entry.ambpressure, dive) * (100.0 - AMB_PERCENTAGE) + AMB_PERCENTAGE; @@ -1114,7 +1114,7 @@ static void calculate_gas_information_new(const struct dive *dive, const struct auto gasmix = loop.at(entry.sec).first; amb_pressure = dive->depth_to_bar(entry.depth); - divemode_t current_divemode = loop_d.next(entry.sec); + divemode_t current_divemode = loop_d.at(entry.sec); entry.pressures = fill_pressures(amb_pressure, gasmix, (current_divemode == OC) ? 0.0 : entry.o2pressure.mbar / 1000.0, current_divemode); fn2 = 1000.0 * entry.pressures.n2 / amb_pressure; fhe = 1000.0 * entry.pressures.he / amb_pressure; diff --git a/profile-widget/profilewidget2.cpp b/profile-widget/profilewidget2.cpp index cd2bba886..8ca5489e6 100644 --- a/profile-widget/profilewidget2.cpp +++ b/profile-widget/profilewidget2.cpp @@ -568,7 +568,7 @@ void ProfileWidget2::contextMenuEvent(QContextMenuEvent *event) m.addAction(tr("Split dive into two"), [this, seconds]() { splitDive(seconds); }); divemode_loop loop(*d->get_dc(dc)); - divemode_t divemode = loop.next(seconds); + divemode_t divemode = loop.at(seconds); QMenu *changeMode = m.addMenu(tr("Change divemode")); if (divemode != OC) changeMode->addAction(gettextFromC::tr(divemode_text_ui[OC]), diff --git a/qt-models/diveplannermodel.cpp b/qt-models/diveplannermodel.cpp index 7bac5ac30..8eea8f98c 100644 --- a/qt-models/diveplannermodel.cpp +++ b/qt-models/diveplannermodel.cpp @@ -172,7 +172,7 @@ void DivePlannerPointsModel::loadFromDive(dive *dIn, int dcNrIn) if (newtime.seconds - lastrecordedtime.seconds > 10 || cylinderid == get_cylinderid_at_time(d, dc, nexttime)) { if (newtime.seconds == lastrecordedtime.seconds) newtime.seconds += 10; - divemode_t current_divemode = loop.next(newtime.seconds - 1); + divemode_t current_divemode = loop.at(newtime.seconds - 1); addStop(depthsum / samplecount, newtime.seconds, cylinderid, last_sp.mbar, true, current_divemode); lastrecordedtime = newtime; } @@ -182,7 +182,7 @@ void DivePlannerPointsModel::loadFromDive(dive *dIn, int dcNrIn) } } // make sure we get the last point right so the duration is correct - divemode_t current_divemode = loop.next(dc->duration.seconds); + divemode_t current_divemode = loop.at(dc->duration.seconds); if (!hasMarkedSamples && !dc->last_manual_time.seconds) addStop(0, dc->duration.seconds,cylinderid, last_sp.mbar, true, current_divemode); preserved_until = d->duration;