From 9dd106116c496b710570b5270119fed758c76c0a Mon Sep 17 00:00:00 2001 From: Thomas Lauf Date: Wed, 13 Jun 2018 23:01:35 +0200 Subject: [PATCH] Let Interval inherit from Range - Remove 1 level of indirection - Remove public field Interval::range (instead use interval directly) --- src/Database.cpp | 9 +-- src/Datafile.cpp | 4 +- src/Interval.cpp | 48 +++++++++------- src/Interval.h | 5 +- src/Range.h | 2 +- src/commands/CmdCancel.cpp | 2 +- src/commands/CmdChart.cpp | 82 +++++++++++++-------------- src/commands/CmdContinue.cpp | 18 +++--- src/commands/CmdDefault.cpp | 2 +- src/commands/CmdDelete.cpp | 2 +- src/commands/CmdGaps.cpp | 10 ++-- src/commands/CmdJoin.cpp | 2 +- src/commands/CmdLengthen.cpp | 6 +- src/commands/CmdMove.cpp | 22 ++++---- src/commands/CmdReport.cpp | 4 +- src/commands/CmdResize.cpp | 4 +- src/commands/CmdShorten.cpp | 10 ++-- src/commands/CmdSplit.cpp | 16 +++--- src/commands/CmdStart.cpp | 16 +++--- src/commands/CmdStop.cpp | 18 +++--- src/commands/CmdSummary.cpp | 26 ++++----- src/commands/CmdTag.cpp | 4 +- src/commands/CmdTrack.cpp | 6 +- src/commands/CmdUntag.cpp | 4 +- src/data.cpp | 105 ++++++++++++++++++----------------- src/dom.cpp | 22 ++++---- src/helper.cpp | 16 +++--- src/validate.cpp | 40 ++++++------- test/data.t.cpp | 44 +++++++-------- test/interval.t.cpp | 20 +++---- 30 files changed, 289 insertions(+), 280 deletions(-) diff --git a/src/Database.cpp b/src/Database.cpp index 36e8e699..eae635b6 100644 --- a/src/Database.cpp +++ b/src/Database.cpp @@ -116,7 +116,7 @@ void Database::addInterval (const Interval& interval, bool verbose) // Get the index into _files for the appropriate Datafile, which may be // created on demand. - auto df = getDatafile (interval.range.start.year (), interval.range.start.month ()); + auto df = getDatafile (interval.start.year (), interval.start.month ()); _files[df].addInterval (interval); recordIntervalAction ("", interval.json ()); } @@ -132,7 +132,7 @@ void Database::deleteInterval (const Interval& interval) // Get the index into _files for the appropriate Datafile, which may be // created on demand. - auto df = getDatafile (interval.range.start.year (), interval.range.start.month ()); + auto df = getDatafile (interval.start.year (), interval.start.month ()); _files[df].deleteInterval (interval); @@ -347,7 +347,8 @@ std::vector Database::segmentRange (const Range& range) // Capture date after incrementing month. Datetime segmentEnd (start_y, start_m, 1); auto segment = Range (segmentStart, segmentEnd); - if (range.intersects (segment)) { + if (range.intersects (segment)) + { segments.push_back (segment); } } @@ -366,7 +367,7 @@ void Database::initializeTagDatabase () } auto* json = (json::object*) json::parse (content); - + for (auto& pair : json->_data) { auto key = pair.first; diff --git a/src/Datafile.cpp b/src/Datafile.cpp index 2e780fff..b7de0a42 100644 --- a/src/Datafile.cpp +++ b/src/Datafile.cpp @@ -90,7 +90,7 @@ std::vector Datafile::allLines () void Datafile::addInterval (const Interval& interval) { // Note: end date might be zero. - assert (interval.range.startsWithin (_range)); + assert (interval.startsWithin (_range)); if (! _lines_loaded) load_lines (); @@ -108,7 +108,7 @@ void Datafile::addInterval (const Interval& interval) void Datafile::deleteInterval (const Interval& interval) { // Note: end date might be zero. - assert (interval.range.startsWithin (_range)); + assert (interval.startsWithin (_range)); if (! _lines_loaded) load_lines (); diff --git a/src/Interval.cpp b/src/Interval.cpp index 6760b80a..e5eb87c3 100644 --- a/src/Interval.cpp +++ b/src/Interval.cpp @@ -54,7 +54,7 @@ void Interval::initialize (const std::string& line) if (tokens.size () > 1 && tokens[1].length () == 16) { - range.start = Datetime (tokens[1]); + start = Datetime (tokens[1]); offset = 1; // Optional '-' @@ -62,7 +62,7 @@ void Interval::initialize (const std::string& line) tokens[2] == "-" && tokens[3].length () == 16) { - range.end = Datetime (tokens[3]); + end = Datetime (tokens[3]); offset = 3; } } @@ -85,8 +85,8 @@ void Interval::initialize (const std::string& line) //////////////////////////////////////////////////////////////////////////////// bool Interval::empty () const { - return range.start.toEpoch () == 0 && - range.end.toEpoch () == 0 && + return start.toEpoch () == 0 && + end.toEpoch () == 0 && _tags.empty (); } @@ -121,11 +121,11 @@ std::string Interval::serialize () const std::stringstream out; out << "inc"; - if (range.start.toEpoch ()) - out << " " << range.start.toISO (); + if (start.toEpoch ()) + out << " " << start.toISO (); - if (range.end.toEpoch ()) - out << " - " << range.end.toISO (); + if (end.toEpoch ()) + out << " - " << end.toISO (); if (! _tags.empty ()) { @@ -143,14 +143,14 @@ std::string Interval::json () const std::stringstream out; out << '{'; - if (range.is_started ()) - out << "\"start\":\"" << range.start.toISO () << "\""; + if (is_started ()) + out << "\"start\":\"" << start.toISO () << "\""; - if (range.is_ended ()) + if (is_ended ()) { - if (range.is_started ()) + if (is_started ()) out << ','; - out << "\"end\":\"" << range.end.toISO () << "\""; + out << "\"end\":\"" << end.toISO () << "\""; } if (! _tags.empty ()) @@ -164,8 +164,8 @@ std::string Interval::json () const tags += "\"" + escape (tag, '"') + "\""; } - if (range.start.toEpoch () || - range.end.toEpoch ()) + if (start.toEpoch () || + end.toEpoch ()) out << ','; out << "\"tags\":[" @@ -187,11 +187,11 @@ std::string Interval::dump () const if (id) out << " @" << id; - if (range.start.toEpoch ()) - out << " " << range.start.toISOLocalExtended (); + if (start.toEpoch ()) + out << " " << start.toISOLocalExtended (); - if (range.end.toEpoch ()) - out << " - " << range.end.toISOLocalExtended (); + if (end.toEpoch ()) + out << " - " << end.toISOLocalExtended (); if (! _tags.empty ()) { @@ -206,6 +206,12 @@ std::string Interval::dump () const return out.str (); } +void Interval::setRange (const Range& range) +{ + start = range.start; + end = range.end; +} + Interval Interval::fromJson (std::string jsonString) { Interval interval = Interval (); @@ -226,9 +232,9 @@ Interval Interval::fromJson (std::string jsonString) } json::string* start = (json::string*) json->_data["start"]; - interval.range.start = Datetime(start->_data); + interval.start = Datetime(start->_data); json::string* end = (json::string*) json->_data["end"]; - interval.range.end = (end != nullptr) ? Datetime(end->_data) : 0; + interval.end = (end != nullptr) ? Datetime(end->_data) : 0; } return interval; diff --git a/src/Interval.h b/src/Interval.h index 4e499db6..893de3d4 100644 --- a/src/Interval.h +++ b/src/Interval.h @@ -31,7 +31,7 @@ #include #include -class Interval +class Interval : public Range { public: Interval () = default; @@ -43,6 +43,8 @@ public: void tag (const std::string&); void untag (const std::string&); + void setRange (const Range& range); + std::string serialize () const; std::string json () const; std::string dump () const; @@ -50,7 +52,6 @@ public: static Interval fromJson (std::string json); public: - Range range {}; int id {0}; bool synthetic {false}; diff --git a/src/Range.h b/src/Range.h index 5ad7ab34..e692bd24 100644 --- a/src/Range.h +++ b/src/Range.h @@ -59,7 +59,7 @@ public: std::vector subtract (const Range&) const; time_t total () const; - std::string dump () const; + virtual std::string dump () const; public: Datetime start {0}; diff --git a/src/commands/CmdCancel.cpp b/src/commands/CmdCancel.cpp index 4a0a840d..8fb6b31a 100644 --- a/src/commands/CmdCancel.cpp +++ b/src/commands/CmdCancel.cpp @@ -36,7 +36,7 @@ int CmdCancel ( // If there is an open interval, cancel it by deleting it.. auto latest = getLatestInterval (database); - if (!latest.range.is_open ()) + if (!latest.is_open ()) { if (rules.getBoolean ("verbose")) std::cout << "There is no active time tracking.\n"; diff --git a/src/commands/CmdChart.cpp b/src/commands/CmdChart.cpp index d89cdf41..61385f24 100644 --- a/src/commands/CmdChart.cpp +++ b/src/commands/CmdChart.cpp @@ -55,12 +55,12 @@ int CmdChartDay ( { // Create a filter, and if empty, choose the current day. auto filter = getFilter (cli); - if (! filter.range.is_started ()) + if (! filter.is_started ()) { if (rules.has ("reports.day.range")) - expandIntervalHint (rules.get ("reports.day.range"), filter.range); + expandIntervalHint (rules.get ("reports.day.range"), filter); else - filter.range = Range (Datetime ("today"), Datetime ("tomorrow")); + filter.setRange (Range (Datetime ("today"), Datetime ("tomorrow"))); } return renderChart (cli, "day", filter, rules, database); @@ -74,12 +74,12 @@ int CmdChartWeek ( { // Create a filter, and if empty, choose the current week. auto filter = getFilter (cli); - if (! filter.range.is_started ()) + if (! filter.is_started ()) { if (rules.has ("reports.week.range")) - expandIntervalHint (rules.get ("reports.week.range"), filter.range); + expandIntervalHint (rules.get ("reports.week.range"), filter); else - filter.range = Range (Datetime ("sow"), Datetime ("eow")); + filter.setRange (Range (Datetime ("sow"), Datetime ("eow"))); } return renderChart (cli, "week", filter, rules, database); @@ -93,12 +93,12 @@ int CmdChartMonth ( { // Create a filter, and if empty, choose the current month. auto filter = getFilter (cli); - if (! filter.range.is_started ()) + if (! filter.is_started ()) { if (rules.has ("reports.month.range")) - expandIntervalHint (rules.get ("reports.month.range"), filter.range); + expandIntervalHint (rules.get ("reports.month.range"), filter); else - filter.range = Range (Datetime ("som"), Datetime ("eom")); + filter.setRange (Range (Datetime ("som"), Datetime ("eom"))); } return renderChart (cli, "month", filter, rules, database); @@ -113,7 +113,7 @@ int renderChart ( Database& database) { // Load the data. - auto exclusions = getAllExclusions (rules, filter.range); + auto exclusions = getAllExclusions (rules, filter); auto tracked = getTracked (database, rules, filter); // Map tags to colors. @@ -162,7 +162,7 @@ int renderChart ( // Each day is rendered separately. time_t total_work = 0; - for (Datetime day = filter.range.start; day < filter.range.end; day++) + for (Datetime day = filter.start; day < filter.end; day++) { // Render the exclusion blocks. int num_lines = 1; @@ -246,24 +246,24 @@ static void determineHourRange ( // Get the extreme time range for the filtered data. first_hour = 23; last_hour = 0; - for (Datetime day = filter.range.start; day < filter.range.end; day++) + for (Datetime day = filter.start; day < filter.end; day++) { auto day_range = getFullDay (day); for (auto& track : tracked) { - if (day_range.overlaps (track.range)) + if (day_range.overlaps (track)) { Interval clipped = clip (track, day_range); - if (track.range.is_open ()) - clipped.range.end = Datetime (); + if (track.is_open ()) + clipped.end = Datetime (); - if (clipped.range.start.hour () < first_hour) - first_hour = clipped.range.start.hour (); + if (clipped.start.hour () < first_hour) + first_hour = clipped.start.hour (); - if (! clipped.range.is_open () && - clipped.range.end.hour () > last_hour) - last_hour = clipped.range.end.hour (); + if (! clipped.is_open () && + clipped.end.hour () > last_hour) + last_hour = clipped.end.hour (); } } } @@ -521,28 +521,28 @@ static void renderInterval ( // Ignore any track that doesn't overlap with day. auto day_range = getFullDay (day); - if (!day_range.overlaps (track.range) || - (track.range.is_open () && day > now)) + if (! day_range.overlaps (track) || + (track.is_open () && day > now)) return; // If the track is open and day is today, then closed the track now, otherwise // it will be rendered until midnight. Interval clipped = clip (track, day_range); - if (track.range.is_open ()) + if (track.is_open ()) { if (day_range.start.sameDay (now)) - clipped.range.end = now; + clipped.end = now; else - clipped.range.end = day_range.end; + clipped.end = day_range.end; } - auto start_mins = (clipped.range.start.hour () - first_hour) * 60 + clipped.range.start.minute (); - auto end_mins = (clipped.range.end.hour () - first_hour) * 60 + clipped.range.end.minute (); + auto start_mins = (clipped.start.hour () - first_hour) * 60 + clipped.start.minute (); + auto end_mins = (clipped.end.hour () - first_hour) * 60 + clipped.end.minute (); - if (clipped.range.end.hour () == 0) - end_mins += (clipped.range.end.day() + (clipped.range.end.month () - clipped.range.start.month () - 1) * clipped.range.start.day ()) * 24 * 60; + if (clipped.end.hour () == 0) + end_mins += (clipped.end.day() + (clipped.end.month () - clipped.start.month () - 1) * clipped.start.day ()) * 24 * 60; - work = clipped.range.total (); + work = clipped.total (); auto start_block = quantizeToNMinutes (start_mins, cell) / cell; auto end_block = quantizeToNMinutes (end_mins == start_mins ? start_mins + 60 : end_mins, cell) / cell; @@ -584,7 +584,7 @@ static void renderInterval ( // An open interval gets a "..." in the bottom right corner, or // whatever fits. - if (track.range.is_open ()) + if (track.is_open ()) lines.back ().add ("+", start_offset + width - 1, colorTrack); } } @@ -608,8 +608,8 @@ std::string renderHolidays ( auto date = entry.substr (last_dot + 1); std::replace (date.begin (), date.end (), '_', '-'); Datetime holiday (date); - if (holiday >= filter.range.start && - holiday <= filter.range.end) + if (holiday >= filter.start && + holiday <= filter.end) { out << Datetime (date).toString ("Y-M-D") << " [" @@ -640,26 +640,26 @@ static std::string renderSummary ( { time_t total_unavailable = 0; for (auto& exclusion : exclusions) - if (filter.range.overlaps (exclusion)) - total_unavailable += filter.range.intersect (exclusion).total (); + if (filter.overlaps (exclusion)) + total_unavailable += filter.intersect (exclusion).total (); time_t total_worked = 0; if (! blank) { for (auto& interval : tracked) { - if (filter.range.overlaps (interval.range)) + if (filter.overlaps (interval)) { - Interval clipped = clip (interval, filter.range); - if (interval.range.is_open ()) - clipped.range.end = Datetime (); + Interval clipped = clip (interval, filter); + if (interval.is_open ()) + clipped.end = Datetime (); - total_worked += clipped.range.total (); + total_worked += clipped.total (); } } } - auto total_available = filter.range.total () - total_unavailable; + auto total_available = filter.total () - total_unavailable; assert (total_available >= 0); auto total_remaining = total_available - total_worked; diff --git a/src/commands/CmdContinue.cpp b/src/commands/CmdContinue.cpp index 95af8398..ec69aa85 100644 --- a/src/commands/CmdContinue.cpp +++ b/src/commands/CmdContinue.cpp @@ -63,7 +63,7 @@ int CmdContinue ( if (latest.empty ()) throw std::string ("There is no previous tracking to continue."); - if (latest.range.is_open ()) + if (latest.is_open ()) throw std::string ("There is already active tracking."); to_copy = latest; @@ -75,10 +75,10 @@ int CmdContinue ( database.startTransaction (); - if (filter.range.start.toEpoch () != 0) + if (filter.start.toEpoch () != 0) { - start_time = filter.range.start; - end_time = filter.range.end; + start_time = filter.start; + end_time = filter.end; } else { @@ -86,13 +86,13 @@ int CmdContinue ( end_time = 0; } - if (latest.range.is_open ()) + if (latest.is_open ()) { - auto exclusions = getAllExclusions (rules, filter.range); + auto exclusions = getAllExclusions (rules, filter); // Stop it, at the given start time, if applicable. Interval modified {latest}; - modified.range.end = start_time; + modified.end = start_time; // Update database. database.deleteInterval (latest); @@ -106,8 +106,8 @@ int CmdContinue ( } // Create an identical interval and update the DB. - to_copy.range.start = start_time; - to_copy.range.end = end_time; + to_copy.start = start_time; + to_copy.end = end_time; validate (cli, rules, database, to_copy); database.addInterval (to_copy, rules.getBoolean ("verbose")); diff --git a/src/commands/CmdDefault.cpp b/src/commands/CmdDefault.cpp index e33cc9be..224f4b8c 100644 --- a/src/commands/CmdDefault.cpp +++ b/src/commands/CmdDefault.cpp @@ -35,7 +35,7 @@ int CmdDefault (Rules& rules, Database& database) // Load the most recent interval, summarize and display. auto interval = getLatestInterval (database); - if (interval.range.is_open ()) + if (interval.is_open ()) { if (rules.getBoolean ("verbose")) { diff --git a/src/commands/CmdDelete.cpp b/src/commands/CmdDelete.cpp index 1351870f..4c58ed30 100644 --- a/src/commands/CmdDelete.cpp +++ b/src/commands/CmdDelete.cpp @@ -57,7 +57,7 @@ int CmdDelete ( if (tracked[tracked.size() - id].synthetic && dirty) { auto latest = getLatestInterval(database); - auto exclusions = getAllExclusions (rules, filter.range); + auto exclusions = getAllExclusions (rules, filter); Interval modified {latest}; diff --git a/src/commands/CmdGaps.cpp b/src/commands/CmdGaps.cpp index d938e5c2..56453020 100644 --- a/src/commands/CmdGaps.cpp +++ b/src/commands/CmdGaps.cpp @@ -39,12 +39,12 @@ int CmdGaps ( { // If filter is empty, choose 'today'. auto filter = getFilter (cli); - if (! filter.range.is_started ()) + if (! filter.is_started ()) { if (rules.has ("reports.gaps.range")) - expandIntervalHint (rules.get ("reports.gaps.range"), filter.range); + expandIntervalHint (rules.get ("reports.gaps.range"), filter); else - filter.range = Range (Datetime ("today"), Datetime ("tomorrow")); + filter.setRange (Range (Datetime ("today"), Datetime ("tomorrow"))); } // Is the :blank hint being used? @@ -52,7 +52,7 @@ int CmdGaps ( std::vector untracked; if (blank) - untracked = subtractRanges ({filter.range}, getAllExclusions (rules, filter.range)); + untracked = subtractRanges ({filter}, getAllExclusions (rules, filter)); else untracked = getUntracked (database, rules, filter); @@ -70,7 +70,7 @@ int CmdGaps ( // Each day is rendered separately. time_t grand_total = 0; Datetime previous; - for (Datetime day = filter.range.start; day < filter.range.end; day++) + for (Datetime day = filter.start; day < filter.end; day++) { auto day_range = getFullDay (day); time_t daily_total = 0; diff --git a/src/commands/CmdJoin.cpp b/src/commands/CmdJoin.cpp index 2756c3fe..f1ae6d5e 100644 --- a/src/commands/CmdJoin.cpp +++ b/src/commands/CmdJoin.cpp @@ -72,7 +72,7 @@ int CmdJoin ( // TODO Require confirmation if tags don't match. auto combined = second; - combined.range.end = first.range.end; + combined.end = first.end; database.deleteInterval (first); database.deleteInterval (second); diff --git a/src/commands/CmdLengthen.cpp b/src/commands/CmdLengthen.cpp index d19ec357..65ab2c18 100644 --- a/src/commands/CmdLengthen.cpp +++ b/src/commands/CmdLengthen.cpp @@ -70,7 +70,7 @@ int CmdLengthen ( if (tracked[tracked.size () - id].synthetic && dirty) { auto latest = getLatestInterval (database); - auto exclusions = getAllExclusions (rules, filter.range); + auto exclusions = getAllExclusions (rules, filter); Interval modified {latest}; @@ -90,13 +90,13 @@ int CmdLengthen ( throw format ("ID '@{1}' does not correspond to any tracking.", id); Interval i = tracked[tracked.size () - id]; - if (i.range.is_open ()) + if (i.is_open ()) throw format ("Cannot lengthen open interval @{1}", id); database.deleteInterval (tracked[tracked.size () - id]); Duration dur (delta); - i.range.end += dur.toTime_t (); + i.end += dur.toTime_t (); validate (cli, rules, database, i); database.addInterval (i, rules.getBoolean ("verbose")); diff --git a/src/commands/CmdMove.cpp b/src/commands/CmdMove.cpp index 371d4df0..d0db7321 100644 --- a/src/commands/CmdMove.cpp +++ b/src/commands/CmdMove.cpp @@ -73,7 +73,7 @@ int CmdMove ( if (tracked[tracked.size() - id].synthetic) { auto latest = getLatestInterval(database); - auto exclusions = getAllExclusions (rules, filter.range); + auto exclusions = getAllExclusions (rules, filter); Interval modified {latest}; @@ -89,19 +89,19 @@ int CmdMove ( // Changing the start date should also change the end date by the same // amount. - if (i.range.start < start) + if (i.start < start) { - auto delta = start - i.range.start; - i.range.start = start; - if (! i.range.is_open ()) - i.range.end += delta; + auto delta = start - i.start; + i.start = start; + if (! i.is_open ()) + i.end += delta; } else { - auto delta = i.range.start - start; - i.range.start = start; - if (! i.range.is_open ()) - i.range.end -= delta; + auto delta = i.start - start; + i.start = start; + if (! i.is_open ()) + i.end -= delta; } database.deleteInterval (tracked[tracked.size () - id]); @@ -112,7 +112,7 @@ int CmdMove ( database.endTransaction (); if (rules.getBoolean ("verbose")) - std::cout << "Moved @" << id << " to " << i.range.start.toISOLocalExtended () << '\n'; + std::cout << "Moved @" << id << " to " << i.start.toISOLocalExtended () << '\n'; return 0; } diff --git a/src/commands/CmdReport.cpp b/src/commands/CmdReport.cpp index 01b704df..a417adc3 100644 --- a/src/commands/CmdReport.cpp +++ b/src/commands/CmdReport.cpp @@ -82,8 +82,8 @@ int CmdReport ( auto filter = getFilter (cli); auto tracked = getTracked (database, rules, filter); - rules.set ("temp.report.start", filter.range.start.toEpoch () > 0 ? filter.range.start.toISO () : ""); - rules.set ("temp.report.end", filter.range.end.toEpoch () > 0 ? filter.range.end.toISO () : ""); + rules.set ("temp.report.start", filter.start.toEpoch () > 0 ? filter.start.toISO () : ""); + rules.set ("temp.report.end", filter.end.toEpoch () > 0 ? filter.end.toISO () : ""); rules.set ("temp.report.tags", joinQuotedIfNeeded (",", filter.tags ())); rules.set ("temp.version", VERSION); diff --git a/src/commands/CmdResize.cpp b/src/commands/CmdResize.cpp index 0cee7faf..7d2dc0f0 100644 --- a/src/commands/CmdResize.cpp +++ b/src/commands/CmdResize.cpp @@ -65,13 +65,13 @@ int CmdResize ( throw format ("ID '@{1}' does not correspond to any tracking.", id); Interval i = tracked[tracked.size () - id]; - if (i.range.is_open ()) + if (i.is_open ()) throw format ("Cannot resize open interval @{1}", id); Duration dur (delta); database.deleteInterval (tracked[tracked.size () - id]); - i.range.end = i.range.start + dur.toTime_t (); + i.end = i.start + dur.toTime_t (); validate (cli, rules, database, i); database.addInterval (i, rules.getBoolean ("verbose")); diff --git a/src/commands/CmdShorten.cpp b/src/commands/CmdShorten.cpp index 42c348a3..2f4aad3b 100644 --- a/src/commands/CmdShorten.cpp +++ b/src/commands/CmdShorten.cpp @@ -68,7 +68,7 @@ int CmdShorten ( if (tracked[tracked.size() - id].synthetic && dirty) { auto latest = getLatestInterval(database); - auto exclusions = getAllExclusions (rules, filter.range); + auto exclusions = getAllExclusions (rules, filter); Interval modified {latest}; @@ -88,16 +88,16 @@ int CmdShorten ( throw format ("ID '@{1}' does not correspond to any tracking.", id); Interval i = tracked[tracked.size () - id]; - if (i.range.is_open ()) + if (i.is_open ()) throw format ("Cannot shorten open interval @{1}", id); Duration dur (delta); - if (dur > (i.range.end - i.range.start)) - throw format ("Cannot shorten interval @{1} by {2} because it is only {3} in length.", id, dur.formatHours (), Duration (i.range.end - i.range.start).formatHours ()); + if (dur > (i.end - i.start)) + throw format ("Cannot shorten interval @{1} by {2} because it is only {3} in length.", id, dur.formatHours (), Duration (i.end - i.start).formatHours ()); database.deleteInterval (tracked[tracked.size () - id]); - i.range.end -= dur.toTime_t (); + i.end -= dur.toTime_t (); validate (cli, rules, database, i); database.addInterval (i, rules.getBoolean ("verbose")); diff --git a/src/commands/CmdSplit.cpp b/src/commands/CmdSplit.cpp index 34584c34..e6fa03c8 100644 --- a/src/commands/CmdSplit.cpp +++ b/src/commands/CmdSplit.cpp @@ -59,19 +59,19 @@ int CmdSplit ( Interval first = tracked[tracked.size () - id]; Interval second = first; - if (first.range.is_open ()) + if (first.is_open ()) { Datetime midpoint; - midpoint -= (midpoint - first.range.start) / 2; - first.range.end = midpoint; - second.range.start = midpoint; + midpoint -= (midpoint - first.start) / 2; + first.end = midpoint; + second.start = midpoint; } else { - Datetime midpoint = first.range.start; - midpoint += (first.range.end - first.range.start) / 2; - first.range.end = midpoint; - second.range.start = midpoint; + Datetime midpoint = first.start; + midpoint += (first.end - first.start) / 2; + first.end = midpoint; + second.start = midpoint; } database.deleteInterval (tracked[tracked.size () - id]); diff --git a/src/commands/CmdStart.cpp b/src/commands/CmdStart.cpp index 7f79096d..8582cef2 100644 --- a/src/commands/CmdStart.cpp +++ b/src/commands/CmdStart.cpp @@ -41,7 +41,7 @@ int CmdStart ( database.startTransaction (); // If the latest interval is open, close it. - if (latest.range.is_open ()) + if (latest.is_open ()) { // If the new interval tags match those of the currently open interval, then // do nothing - the tags are already being tracked. @@ -55,16 +55,16 @@ int CmdStart ( // Stop it, at the given start time, if applicable. Interval modified {latest}; - if (filter.range.start.toEpoch () != 0) - modified.range.end = filter.range.start; + if (filter.start.toEpoch () != 0) + modified.end = filter.start; else - modified.range.end = Datetime (); + modified.end = Datetime (); // Update database. database.deleteInterval (latest); validate (cli, rules, database, modified); - for (auto& interval : flatten (modified, getAllExclusions (rules, modified.range))) + for (auto& interval : flatten (modified, getAllExclusions (rules, modified))) { database.addInterval (interval, rules.getBoolean ("verbose")); @@ -75,10 +75,10 @@ int CmdStart ( // Now add the new open interval. Interval now; - if (filter.range.start.toEpoch () != 0) - now.range.start = filter.range.start; + if (filter.start.toEpoch () != 0) + now.start = filter.start; else - now.range.start = Datetime (); + now.start = Datetime (); for (auto& tag : filter.tags ()) now.tag (tag); diff --git a/src/commands/CmdStop.cpp b/src/commands/CmdStop.cpp index beda1485..dfc6059c 100644 --- a/src/commands/CmdStop.cpp +++ b/src/commands/CmdStop.cpp @@ -51,32 +51,32 @@ int CmdStop ( auto latest = getLatestInterval (database); // Verify the interval is open. - if (! latest.range.is_open ()) + if (! latest.is_open ()) throw std::string ("There is no active time tracking."); database.startTransaction (); Interval modified {latest}; - // If a stop date is specified (and occupies filter.range.start) then use + // If a stop date is specified (and occupies filter.start) then use // that instead of the current time. - if (filter.range.start.toEpoch () != 0) + if (filter.start.toEpoch () != 0) { - if (modified.range.start >= filter.range.start) + if (modified.start >= filter.start) throw std::string ("The end of a date range must be after the start."); - modified.range.end = filter.range.start; + modified.end = filter.start; } else { - modified.range.end = Datetime (); + modified.end = Datetime (); } // Close the interval. database.deleteInterval (latest); validate (cli, rules, database, modified); - for (auto& interval : flatten (modified, getAllExclusions (rules, modified.range))) + for (auto& interval : flatten (modified, getAllExclusions (rules, modified))) { database.addInterval (interval, rules.getBoolean ("verbose")); @@ -100,8 +100,8 @@ int CmdStop ( if (! filter.tags ().empty () && modified.tags ().size () != latest.tags ().size ()) { - modified.range.start = modified.range.end; - modified.range.end = {0}; + modified.start = modified.end; + modified.end = {0}; validate (cli, rules, database, modified); database.addInterval (modified, rules.getBoolean ("verbose")); if (rules.getBoolean ("verbose")) diff --git a/src/commands/CmdSummary.cpp b/src/commands/CmdSummary.cpp index 15327a6e..84d8e634 100644 --- a/src/commands/CmdSummary.cpp +++ b/src/commands/CmdSummary.cpp @@ -43,11 +43,11 @@ int CmdSummary ( { // Create a filter, and if empty, choose 'today'. auto filter = getFilter (cli); - if (! filter.range.is_started ()) - filter.range = Range (Datetime ("today"), Datetime ("tomorrow")); + if (! filter.is_started ()) + filter.setRange (Range (Datetime ("today"), Datetime ("tomorrow"))); - if (! filter.range.is_ended()) - filter.range.end = filter.range.start + Duration("1d").toTime_t(); + if (! filter.is_ended()) + filter.end = filter.start + Duration("1d").toTime_t(); // Load the data. auto tracked = getTracked (database, rules, filter); @@ -58,11 +58,11 @@ int CmdSummary ( { std::cout << "No filtered data found"; - if (filter.range.is_started ()) + if (filter.is_started ()) { - std::cout << " in the range " << filter.range.start.toISOLocalExtended (); - if (filter.range.is_ended ()) - std::cout << " - " << filter.range.end.toISOLocalExtended (); + std::cout << " in the range " << filter.start.toISOLocalExtended (); + if (filter.is_ended ()) + std::cout << " - " << filter.end.toISOLocalExtended (); } if (! filter.tags ().empty ()) @@ -102,7 +102,7 @@ int CmdSummary ( // Each day is rendered separately. time_t grand_total = 0; Datetime previous; - for (Datetime day = filter.range.start; day < filter.range.end; day++) + for (Datetime day = filter.start; day < filter.end; day++) { auto day_range = getFullDay (day); time_t daily_total = 0; @@ -111,7 +111,7 @@ int CmdSummary ( for (auto& track : subset (day_range, tracked)) { // Make sure the track only represents one day. - if ((track.range.is_open () && day > Datetime ())) + if ((track.is_open () && day > Datetime ())) continue; row = table.addRow (); @@ -125,8 +125,8 @@ int CmdSummary ( } // Intersect track with day. - auto today = day_range.intersect (track.range); - if (track.range.is_open () && day <= Datetime () && today.end > Datetime ()) + auto today = day_range.intersect (track); + if (track.is_open () && day <= Datetime () && today.end > Datetime ()) today.end = Datetime (); std::string tags = join(", ", track.tags()); @@ -136,7 +136,7 @@ int CmdSummary ( table.set (row, (ids ? 4 : 3), tags); table.set (row, (ids ? 5 : 4), today.start.toString ("h:N:S")); - table.set (row, (ids ? 6 : 5), (track.range.is_open () ? "-" : today.end.toString ("h:N:S"))); + table.set (row, (ids ? 6 : 5), (track.is_open () ? "-" : today.end.toString ("h:N:S"))); table.set (row, (ids ? 7 : 6), Duration (today.total ()).formatHours ()); daily_total += today.total (); diff --git a/src/commands/CmdTag.cpp b/src/commands/CmdTag.cpp index 5caa265a..57054d14 100644 --- a/src/commands/CmdTag.cpp +++ b/src/commands/CmdTag.cpp @@ -63,7 +63,7 @@ int CmdTag ( if (tracked[tracked.size() - id].synthetic && dirty) { auto latest = getLatestInterval(database); - auto exclusions = getAllExclusions (rules, filter.range); + auto exclusions = getAllExclusions (rules, filter); Interval modified {latest}; @@ -83,7 +83,7 @@ int CmdTag ( throw std::string ("There is no active time tracking."); } - if (!tracked.back ().range.is_open ()) + if (!tracked.back ().is_open ()) { throw std::string ("At least one ID must be specified. See 'timew help tag'."); } diff --git a/src/commands/CmdTrack.cpp b/src/commands/CmdTrack.cpp index 154e93d6..3f097a81 100644 --- a/src/commands/CmdTrack.cpp +++ b/src/commands/CmdTrack.cpp @@ -38,8 +38,8 @@ int CmdTrack ( // If this is not a proper closed interval, then the user is trying to make // the 'track' command behave like 'start', so delegate to CmdStart. - if (! filter.range.is_started () || - ! filter.range.is_ended ()) + if (! filter.is_started () || + ! filter.is_ended ()) return CmdStart (cli, rules, database); database.startTransaction (); @@ -47,7 +47,7 @@ int CmdTrack ( // Validation must occur before flattening. validate (cli, rules, database, filter); - for (auto& interval : flatten (filter, getAllExclusions (rules, filter.range))) + for (auto& interval : flatten (filter, getAllExclusions (rules, filter))) { database.addInterval (interval, rules.getBoolean ("verbose")); diff --git a/src/commands/CmdUntag.cpp b/src/commands/CmdUntag.cpp index 04f6b4df..b32d0696 100644 --- a/src/commands/CmdUntag.cpp +++ b/src/commands/CmdUntag.cpp @@ -63,7 +63,7 @@ int CmdUntag ( if (tracked[tracked.size() - id].synthetic && dirty) { auto latest = getLatestInterval(database); - auto exclusions = getAllExclusions (rules, filter.range); + auto exclusions = getAllExclusions (rules, filter); Interval modified {latest}; @@ -83,7 +83,7 @@ int CmdUntag ( throw std::string ("There is no active time tracking."); } - if (!tracked.back ().range.is_open ()) + if (!tracked.back ().is_open ()) { throw std::string ("At least one ID must be specified. See 'timew help tag'."); } diff --git a/src/data.cpp b/src/data.cpp index 9a146f07..223b1234 100644 --- a/src/data.cpp +++ b/src/data.cpp @@ -117,7 +117,7 @@ Interval getFilter (const CLI& cli) if (args.size () == 1 && args[0] == "") { - filter.range = {Datetime (start), 0}; + filter.setRange ({Datetime (start), 0}); } // from @@ -125,7 +125,7 @@ Interval getFilter (const CLI& cli) args[0] == "from" && args[1] == "") { - filter.range = {Datetime (start), 0}; + filter.setRange ({Datetime (start), 0}); } // to/- @@ -134,7 +134,7 @@ Interval getFilter (const CLI& cli) (args[1] == "to" || args[1] == "-") && args[2] == "") { - filter.range = {Datetime (start), Datetime (end)}; + filter.setRange ({Datetime (start), Datetime (end)}); } // from to/- @@ -144,7 +144,7 @@ Interval getFilter (const CLI& cli) (args[2] == "to" || args[2] == "-") && args[3] == "") { - filter.range = {Datetime (start), Datetime (end)}; + filter.setRange ({Datetime (start), Datetime (end)}); } // for @@ -153,7 +153,7 @@ Interval getFilter (const CLI& cli) args[1] == "for" && args[2] == "") { - filter.range = {Datetime (start), Datetime (start) + Duration (duration).toTime_t ()}; + filter.setRange ({Datetime (start), Datetime (start) + Duration (duration).toTime_t ()}); } // from for @@ -163,7 +163,7 @@ Interval getFilter (const CLI& cli) args[2] == "for" && args[3] == "") { - filter.range = {Datetime (start), Datetime (start) + Duration (duration).toTime_t ()}; + filter.setRange ({Datetime (start), Datetime (start) + Duration (duration).toTime_t ()}); } // before @@ -172,7 +172,7 @@ Interval getFilter (const CLI& cli) args[1] == "before" && args[2] == "") { - filter.range = {Datetime (start) - Duration (duration).toTime_t (), Datetime (start)}; + filter.setRange ({Datetime (start) - Duration (duration).toTime_t (), Datetime (start)}); } // after @@ -181,7 +181,7 @@ Interval getFilter (const CLI& cli) args[1] == "after" && args[2] == "") { - filter.range = {Datetime (start), Datetime (start) + Duration (duration).toTime_t ()}; + filter.setRange ({Datetime (start), Datetime (start) + Duration (duration).toTime_t ()}); } // ago @@ -189,7 +189,7 @@ Interval getFilter (const CLI& cli) args[0] == "" && args[1] == "ago") { - filter.range = {now - Duration (duration).toTime_t (), 0}; + filter.setRange ({now - Duration (duration).toTime_t (), 0}); } // for @@ -197,14 +197,14 @@ Interval getFilter (const CLI& cli) args[0] == "for" && args[1] == "") { - filter.range = {now - Duration (duration).toTime_t (), now}; + filter.setRange ({now - Duration (duration).toTime_t (), now}); } // else if (args.size () == 1 && args[0] == "") { - filter.range = {now - Duration (duration).toTime_t (), now}; + filter.setRange ({now - Duration (duration).toTime_t (), now}); } // Unrecognized date range construct. @@ -213,10 +213,10 @@ Interval getFilter (const CLI& cli) throw std::string ("Unrecognized date range: '") + join (" ", args) + "'."; } - if (filter.range.start > now) + if (filter.start > now) throw std::string ("Time tracking cannot be set in the future."); - if (filter.range.end != 0 && filter.range.start > filter.range.end) + if (filter.end != 0 && filter.start > filter.end) throw std::string ("The end of a date range must be after the start."); return filter; @@ -359,7 +359,8 @@ std::vector subset ( { std::vector all; for (auto& interval : intervals) { - if (range.intersects (interval.range)) { + if (range.intersects (interval)) + { all.push_back (interval); } } @@ -376,29 +377,29 @@ std::vector flatten ( std::vector enclosed; for (auto& e : exclusions) - if (interval.range.encloses (e)) + if (interval.encloses (e)) enclosed.push_back (e); Datetime now; - for (auto& result : subtractRanges ({interval.range}, enclosed)) + for (auto& result : subtractRanges ({interval}, enclosed)) { Interval chunk {interval}; - chunk.range = result; + chunk.setRange (result); // Only historical data is included. - if (chunk.range.start <= now) + if (chunk.start <= now) { // Closed chunk ranges in the future need to be adjusted. - if (! chunk.range.is_open () && - chunk.range.end > now) + if (! chunk.is_open () && + chunk.end > now) { // If the interval is open, so must be chunk. - if (interval.range.is_open ()) - chunk.range.end = {0}; + if (interval.is_open ()) + chunk.end = {0}; // Otherwise truncate to now. else - chunk.range.end = now; + chunk.end = now; } all.push_back (chunk); @@ -496,17 +497,17 @@ Range outerRange (const std::vector & intervals) Range outer; for (auto& interval : intervals) { - if (interval.range.start < outer.start || outer.start.toEpoch () == 0) - outer.start = interval.range.start; + if (interval.start < outer.start || outer.start.toEpoch () == 0) + outer.start = interval.start; // Deliberately mixed start/end. - if (interval.range.start > outer.end) - outer.end = interval.range.start; + if (interval.start > outer.end) + outer.end = interval.start; - if (interval.range.end > outer.end) - outer.end = interval.range.end; + if (interval.end > outer.end) + outer.end = interval.end; - if (! interval.range.is_ended ()) + if (! interval.is_ended ()) outer.end = Datetime (); } @@ -517,10 +518,10 @@ Range outerRange (const std::vector & intervals) // An interval matches a filter interval if the start/end overlaps, and all // filter interval tags are found in the interval. // -// [1] interval.range.end.toEpoch () == 0 -// [2] interval.range.end > filter.range.start -// [3] filter.range.end.toEpoch () == 0 -// [4] interval.range.start < filter.range.end +// [1] interval.end.toEpoch () == 0 +// [2] interval.end > filter.start +// [3] filter.end.toEpoch () == 0 +// [4] interval.start < filter.end // // Match: (1 || 2) && (3 || 4) @@ -552,9 +553,9 @@ Range outerRange (const std::vector & intervals) // bool matchesFilter (const Interval& interval, const Interval& filter) { - if ((filter.range.start.toEpoch () == 0 && - filter.range.end.toEpoch () == 0 - ) || interval.range.intersects (filter.range)) + if ((filter.start.toEpoch () == 0 && + filter.end.toEpoch () == 0 + ) || interval.intersects (filter)) { for (auto& tag : filter.tags ()) if (! interval.hasTag (tag)) @@ -567,7 +568,7 @@ bool matchesFilter (const Interval& interval, const Interval& filter) } //////////////////////////////////////////////////////////////////////////////// -// Take an interval and clip it to the range. +// Take an interval and clip it to the Interval clip (const Interval& interval, const Range& range) { if (! range.is_started () || @@ -575,13 +576,13 @@ Interval clip (const Interval& interval, const Range& range) return interval; Interval clipped {interval}; - if (clipped.range.start.toEpoch () && - clipped.range.start < range.start) - clipped.range.start = range.start; + if (clipped.start.toEpoch () && + clipped.start < range.start) + clipped.start = range.start; - if (clipped.range.end.toEpoch () && - clipped.range.end > range.end) - clipped.range.end = range.end; + if (clipped.end.toEpoch () && + clipped.end > range.end) + clipped.end = range.end; return clipped; } @@ -600,16 +601,16 @@ std::vector getTracked ( // [earliest start, infinity) // // Avoid assigning a zero-width range - leave it unstarted instead. - if (! filter.range.is_started ()) + if (! filter.is_started ()) { auto outer = outerRange (inclusions); if (outer.total ()) - filter.range = outer; + filter.setRange (outer); // Use an infinite range instead of the last end date; this prevents // issues when there is an empty range [q, q) at the end of a filter // [p, q), in which case there is no overlap or intersection. - filter.range.end = 0; + filter.end = 0; } std::vector intervals = inclusions; @@ -618,11 +619,11 @@ std::vector getTracked ( { auto latest = inclusions.back (); - if (latest.range.is_open ()) + if (latest.is_open ()) { // Get the set of expanded exclusions that overlap the range defined by the // timeline. - auto exclusions = getAllExclusions (rules, filter.range); + auto exclusions = getAllExclusions (rules, filter); if (! exclusions.empty ()) { intervals.pop_back (); @@ -630,7 +631,7 @@ std::vector getTracked ( for (auto& interval : flatten (latest, exclusions)) { if (latest.synthetic || - latest.range != interval.range) + latest != interval) interval.synthetic = true; intervals.push_back (interval); @@ -656,9 +657,9 @@ std::vector getUntracked ( { std::vector inclusion_ranges; for (auto& i : subset (filter, getAllInclusions (database))) - inclusion_ranges.push_back (i.range); + inclusion_ranges.push_back (i); - auto available = subtractRanges ({filter.range}, getAllExclusions (rules, filter.range)); + auto available = subtractRanges ({filter}, getAllExclusions (rules, filter)); auto untracked = subtractRanges (available, inclusion_ranges); debug (format ("Loaded {1} untracked ranges", untracked.size ())); return untracked; diff --git a/src/dom.cpp b/src/dom.cpp index a8a9c29d..81496d3e 100644 --- a/src/dom.cpp +++ b/src/dom.cpp @@ -49,29 +49,29 @@ bool domGet ( // dom.active if (pig.eos ()) { - value = latest.range.is_open () ? "1" : "0"; + value = latest.is_open () ? "1" : "0"; return true; } // dom.active.start if (pig.skipLiteral (".start") && - latest.range.is_open ()) + latest.is_open ()) { - value = latest.range.start.toISOLocalExtended (); + value = latest.start.toISOLocalExtended (); return true; } // dom.active.duration if (pig.skipLiteral (".duration") && - latest.range.is_open ()) + latest.is_open ()) { - value = Duration (latest.range.total ()).formatISO (); + value = Duration (latest.total ()).formatISO (); return true; } // dom.active.tag.count if (pig.skipLiteral (".tag.count") && - latest.range.is_open ()) + latest.is_open ()) { value = format ("{1}", latest.tags ().size ()); return true; @@ -79,7 +79,7 @@ bool domGet ( // dom.active.json if (pig.skipLiteral (".json") && - latest.range.is_open ()) + latest.is_open ()) { value = latest.json (); return true; @@ -130,24 +130,24 @@ bool domGet ( // dom.tracked.N.start if (pig.skipLiteral ("start")) { - value = tracked[count - n].range.start.toISOLocalExtended (); + value = tracked[count - n].start.toISOLocalExtended (); return true; } // dom.tracked.N.end if (pig.skipLiteral ("end")) { - if (tracked[count -n].range.is_open ()) + if (tracked[count -n].is_open ()) value = ""; else - value = tracked[count - n].range.end.toISOLocalExtended (); + value = tracked[count - n].end.toISOLocalExtended (); return true; } // dom.tracked.N.duration if (pig.skipLiteral ("duration")) { - value = Duration (tracked[count - n].range.total ()).formatISO (); + value = Duration (tracked[count - n].total ()).formatISO (); return true; } diff --git a/src/helper.cpp b/src/helper.cpp index 68d0710a..ba099f55 100644 --- a/src/helper.cpp +++ b/src/helper.cpp @@ -85,7 +85,7 @@ std::string intervalSummarize ( { std::stringstream out; - if (interval.range.is_started ()) + if (interval.is_started ()) { // Walk backwards through the inclusions, and stop as soon as the tags // no longer match interval. This means the 'total' is the sum of all time @@ -96,7 +96,7 @@ std::string intervalSummarize ( std::vector ::reverse_iterator i; for (i = inclusions.rbegin (); i != inclusions.rend (); i++) if (interval.tags () == i->tags ()) - total_recorded += i->range.total (); + total_recorded += i->total (); else break; @@ -113,11 +113,11 @@ std::string intervalSummarize ( } // Interval open. - if (interval.range.is_open ()) + if (interval.is_open ()) { out << "Tracking " << tags << '\n' - << " Started " << interval.range.start.toISOLocalExtended () << '\n' - << " Current " << minimalDelta (interval.range.start, Datetime ()) << '\n' + << " Started " << interval.start.toISOLocalExtended () << '\n' + << " Current " << minimalDelta (interval.start, Datetime ()) << '\n' << " Total " << std::setw (19) << std::setfill (' ') << total.formatHours () << '\n'; } @@ -125,8 +125,8 @@ std::string intervalSummarize ( else { out << "Recorded " << tags << '\n' - << " Started " << interval.range.start.toISOLocalExtended () << '\n' - << " Ended " << minimalDelta (interval.range.start, interval.range.end) << '\n' + << " Started " << interval.start.toISOLocalExtended () << '\n' + << " Ended " << minimalDelta (interval.start, interval.end) << '\n' << " Total " << std::setw (19) << std::setfill (' ') << total.formatHours () << '\n'; } } @@ -456,7 +456,7 @@ std::vector getOverlaps ( std::vector overlaps; for (auto& track : tracked) - if (interval.range.overlaps (track.range)) + if (interval.overlaps (track)) overlaps.push_back (track); return overlaps; diff --git a/src/validate.cpp b/src/validate.cpp index 6003442e..cfefcd3f 100644 --- a/src/validate.cpp +++ b/src/validate.cpp @@ -43,40 +43,40 @@ void autoFill ( Database& database, Interval& interval) { - // An empty filter allows scanning beyond interval.range. + // An empty filter allows scanning beyond interval range. Interval range_filter; - // Look backwards from interval.range.start to a boundary. + // Look backwards from interval.start to a boundary. auto tracked = getTracked (database, rules, range_filter); for (auto earlier = tracked.rbegin (); earlier != tracked.rend (); ++earlier) { - if (! earlier->range.is_open () && - earlier->range.end <= interval.range.start) + if (! earlier->is_open () && + earlier->end <= interval.start) { - interval.range.start = earlier->range.end; + interval.start = earlier->end; if (rules.getBoolean ("verbose")) std::cout << "Backfilled " << (interval.id ? format ("@{1} ", interval.id) : "") << "to " - << interval.range.start.toISOLocalExtended () + << interval.start.toISOLocalExtended () << "\n"; break; } } // If the interval is closed, scan forwards for the next boundary. - if (! interval.range.is_open ()) + if (! interval.is_open ()) { for (auto& later : tracked) { - if (interval.range.end <= later.range.start) + if (interval.end <= later.start) { - interval.range.end = later.range.start; + interval.end = later.start; if (rules.getBoolean ("verbose")) std::cout << "Filled " << (interval.id ? format ("@{1} ", interval.id) : "") << "to " - << interval.range.end.toISOLocalExtended () + << interval.end.toISOLocalExtended () << "\n"; break; } @@ -116,21 +116,21 @@ static void autoAdjust ( // implement overwrite resolution, i.e. the new interval overwrites existing intervals for (auto& overlap : overlaps) { - bool start_within_overlap = interval.range.startsWithin (overlap.range); - bool end_within_overlap = interval.range.endsWithin (overlap.range); + bool start_within_overlap = interval.startsWithin (overlap); + bool end_within_overlap = interval.endsWithin (overlap); if (start_within_overlap && !end_within_overlap) { // start date of new interval within old interval Interval modified {overlap}; - modified.range.end = interval.range.start; + modified.end = interval.start; database.modifyInterval (overlap, modified, rules.getBoolean ("verbose")); } else if (!start_within_overlap && end_within_overlap) { // end date of new interval within old interval Interval modified {overlap}; - modified.range.start = interval.range.end; + modified.start = interval.end; database.modifyInterval (overlap, modified, rules.getBoolean ("verbose")); } else if (!start_within_overlap && !end_within_overlap) @@ -144,10 +144,10 @@ static void autoAdjust ( Interval split2 {overlap}; Interval split1 {overlap}; - split1.range.end = interval.range.start; - split2.range.start = interval.range.end; + split1.end = interval.start; + split2.start = interval.end; - if (split1.range.is_empty ()) + if (split1.is_empty ()) { database.deleteInterval (overlap); } @@ -156,7 +156,7 @@ static void autoAdjust ( database.modifyInterval (overlap, split1, rules.getBoolean ("verbose")); } - if (! split2.range.is_empty ()) + if (! split2.is_empty ()) { database.addInterval (split2, rules.getBoolean ("verbose")); } @@ -174,8 +174,8 @@ void validate ( { // Create a filter, and if empty, choose 'today'. auto filter = getFilter (cli); - if (! filter.range.is_started ()) - filter.range = Range (Datetime ("today"), Datetime ("tomorrow")); + if (! filter.is_started ()) + filter.setRange (Range (Datetime ("today"), Datetime ("tomorrow"))); // All validation performed here. if (findHint (cli, ":fill")) diff --git a/test/data.t.cpp b/test/data.t.cpp index c9cd7286..a191c417 100644 --- a/test/data.t.cpp +++ b/test/data.t.cpp @@ -46,8 +46,8 @@ void test_flatten ( Interval tmp; tmp.initialize (output[i]); - t.is (tmp.range.start.toISO (), results[i].range.start.toISO (), "flatten: " + label + " start matches"); - t.is (tmp.range.end.toISO (), results[i].range.end.toISO (), "flatten: " + label + " end matches"); + t.is (tmp.start.toISO (), results[i].start.toISO (), "flatten: " + label + " start matches"); + t.is (tmp.end.toISO (), results[i].end.toISO (), "flatten: " + label + " end matches"); t.ok (tmp.tags () == results[i].tags (), "flatten: " + label + " tags match"); } } @@ -201,12 +201,12 @@ int main (int, char**) // bool matchesFilter (const Interval& interval, const Interval& filter); Interval refOpen; - refOpen.range = Range (Datetime (2016, 6, 1), Datetime (0)); + refOpen.setRange (Range (Datetime (2016, 6, 1), Datetime (0))); refOpen.tag ("tag1"); refOpen.tag ("tag2"); Interval refClosed; - refClosed.range = Range (Datetime (2016, 6, 1), Datetime (2016, 6, 30)); + refClosed.setRange (Range (Datetime (2016, 6, 1), Datetime (2016, 6, 30))); refClosed.tag ("tag1"); refClosed.tag ("tag2"); @@ -235,15 +235,15 @@ int main (int, char**) Interval i; i.tag ("tag1"); i.tag ("tag2"); - i.range = testA; t.notok (matchesFilter (i, refClosed), "matchesFilter A refClosed"); - i.range = testB; t.ok (matchesFilter (i, refClosed), "matchesFilter B <=> refClosed"); - i.range = testC; t.ok (matchesFilter (i, refClosed), "matchesFilter C <=> refClosed"); - i.range = testD; t.ok (matchesFilter (i, refClosed), "matchesFilter D <=> refClosed"); - i.range = testE; t.notok (matchesFilter (i, refClosed), "matchesFilter E refClosed"); - i.range = testF; t.ok (matchesFilter (i, refClosed), "matchesFilter F <=> refClosed"); - i.range = testG; t.ok (matchesFilter (i, refClosed), "matchesFilter G <=> refClosed"); - i.range = testH; t.ok (matchesFilter (i, refClosed), "matchesFilter H <=> refClosed"); - i.range = testI; t.notok (matchesFilter (i, refClosed), "matchesFilter I refClosed"); + i.setRange (testA); t.notok (matchesFilter (i, refClosed), "matchesFilter A refClosed"); + i.setRange (testB); t.ok (matchesFilter (i, refClosed), "matchesFilter B <=> refClosed"); + i.setRange (testC); t.ok (matchesFilter (i, refClosed), "matchesFilter C <=> refClosed"); + i.setRange (testD); t.ok (matchesFilter (i, refClosed), "matchesFilter D <=> refClosed"); + i.setRange (testE); t.notok (matchesFilter (i, refClosed), "matchesFilter E refClosed"); + i.setRange (testF); t.ok (matchesFilter (i, refClosed), "matchesFilter F <=> refClosed"); + i.setRange (testG); t.ok (matchesFilter (i, refClosed), "matchesFilter G <=> refClosed"); + i.setRange (testH); t.ok (matchesFilter (i, refClosed), "matchesFilter H <=> refClosed"); + i.setRange (testI); t.notok (matchesFilter (i, refClosed), "matchesFilter I refClosed"); // this [... // A [--------) @@ -255,15 +255,15 @@ int main (int, char**) // G [... // H [... // I [... - i.range = testA; t.notok (matchesFilter (i, refOpen), "matchesFilter A refOpen"); - i.range = testB; t.ok (matchesFilter (i, refOpen), "matchesFilter B <=> refOpen"); - i.range = testC; t.ok (matchesFilter (i, refOpen), "matchesFilter C <=> refOpen"); - i.range = testD; t.ok (matchesFilter (i, refOpen), "matchesFilter D <=> refOpen"); - i.range = testE; t.ok (matchesFilter (i, refOpen), "matchesFilter E <=> refOpen"); - i.range = testF; t.ok (matchesFilter (i, refOpen), "matchesFilter F <=> refOpen"); - i.range = testG; t.ok (matchesFilter (i, refOpen), "matchesFilter G <=> refOpen"); - i.range = testH; t.ok (matchesFilter (i, refOpen), "matchesFilter H <=> refOpen"); - i.range = testI; t.ok (matchesFilter (i, refOpen), "matchesFilter I <=> refOpen"); + i.setRange (testA); t.notok (matchesFilter (i, refOpen), "matchesFilter A refOpen"); + i.setRange (testB); t.ok (matchesFilter (i, refOpen), "matchesFilter B <=> refOpen"); + i.setRange (testC); t.ok (matchesFilter (i, refOpen), "matchesFilter C <=> refOpen"); + i.setRange (testD); t.ok (matchesFilter (i, refOpen), "matchesFilter D <=> refOpen"); + i.setRange (testE); t.ok (matchesFilter (i, refOpen), "matchesFilter E <=> refOpen"); + i.setRange (testF); t.ok (matchesFilter (i, refOpen), "matchesFilter F <=> refOpen"); + i.setRange (testG); t.ok (matchesFilter (i, refOpen), "matchesFilter G <=> refOpen"); + i.setRange (testH); t.ok (matchesFilter (i, refOpen), "matchesFilter H <=> refOpen"); + i.setRange (testI); t.ok (matchesFilter (i, refOpen), "matchesFilter I <=> refOpen"); // Range getFullDay (const Datetime&); auto r1 = getFullDay (Datetime ("20160501T203112")); diff --git a/test/interval.t.cpp b/test/interval.t.cpp index b312d422..77153dcc 100644 --- a/test/interval.t.cpp +++ b/test/interval.t.cpp @@ -37,19 +37,19 @@ int main (int, char**) // bool is_ended () const; Interval i1; t.is (i1.empty (), true, "Interval().empty -> true"); - t.is (i1.range.is_started (), false, "Interval().is_started -> false"); - t.is (i1.range.is_ended (), false, "Interval().is_ended -> false"); + t.is (i1.is_started (), false, "Interval().is_started -> false"); + t.is (i1.is_ended (), false, "Interval().is_ended -> false"); // void start (Datetime); - i1.range.start = Datetime (); + i1.start = Datetime (); t.is (i1.empty (), false, "Interval().empty -> false"); - t.is (i1.range.is_started (), true, "Interval(start=now).is_started -> true"); - t.is (i1.range.is_ended (), false, "Interval(start=now).is_ended -> false"); + t.is (i1.is_started (), true, "Interval(start=now).is_started -> true"); + t.is (i1.is_ended (), false, "Interval(start=now).is_ended -> false"); // void end (Datetime); - i1.range.end = Datetime (); - t.is (i1.range.is_started (), true, "Interval(start=now,end=now).is_started -> true"); - t.is (i1.range.is_ended (), true, "Interval(start=now,end=now).is_ended -> true"); + i1.end = Datetime (); + t.is (i1.is_started (), true, "Interval(start=now,end=now).is_started -> true"); + t.is (i1.is_ended (), true, "Interval(start=now,end=now).is_ended -> true"); // std::set tags () const; // void tag (const std::string&); @@ -73,9 +73,9 @@ int main (int, char**) t.is (i3.serialize (), "inc # foo", "Interval().serialize -> 'inc # foo'"); i3.tag ("bar"); t.is (i3.serialize (), "inc # bar foo", "Interval().serialize -> 'inc # bar foo'"); - i3.range.start = Datetime(1); + i3.start = Datetime(1); t.is (i3.serialize (), "inc 19700101T000001Z # bar foo", "Interval(Datetime(1)).serialize -> 'inc 19700101T000001Z # bar foo'"); - i3.range.end = Datetime(2); + i3.end = Datetime(2); t.is (i3.serialize (), "inc 19700101T000001Z - 19700101T000002Z # bar foo", "Interval(Datetime(1)).serialize -> 'inc 19700101T000001Z - 19700101T000002Z # bar foo'"); i3.tag ("Trans-Europe Express"); t.is (i3.serialize (), "inc 19700101T000001Z - 19700101T000002Z # \"Trans-Europe Express\" bar foo", "Interval(Datetime(1)).serialize -> 'inc 19700101T000001Z - 19700101T000002Z # \"Trans-Europe Express\" bar foo'");