summaryrefslogtreecommitdiff
path: root/src/departures_type.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/departures_type.h')
-rw-r--r--src/departures_type.h101
1 files changed, 101 insertions, 0 deletions
diff --git a/src/departures_type.h b/src/departures_type.h
new file mode 100644
index 000000000..cb06b144f
--- /dev/null
+++ b/src/departures_type.h
@@ -0,0 +1,101 @@
+/* $Id: departures_type.h $ */
+
+/*
+ * This file is part of OpenTTD.
+ * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
+ * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/** @file departures_type.h Types related to departures. */
+
+#ifndef DEPARTURES_TYPE_H
+#define DEPARTURES_TYPE_H
+
+#include "station_base.h"
+#include "order_base.h"
+#include "vehicle_base.h"
+
+/** Whether or not a vehicle has arrived for a departure. */
+typedef enum {
+ D_TRAVELLING = 0,
+ D_ARRIVED = 1,
+ D_CANCELLED = 2,
+} DepartureStatus;
+
+/** The type of departures. */
+typedef enum {
+ D_DEPARTURE = 0,
+ D_ARRIVAL = 1,
+} DepartureType;
+
+typedef struct CallAt {
+ StationID station;
+ DateTicks scheduled_date;
+
+ CallAt(const StationID& s) : station(s), scheduled_date(0) { }
+ CallAt(const StationID& s, const DateTicks& t) : station(s), scheduled_date(t) { }
+ CallAt(const CallAt& c) : station(c.station), scheduled_date(c.scheduled_date) { }
+
+ inline bool operator==(const CallAt& c) const {
+ return this->station == c.station;
+ }
+
+ inline bool operator!=(const CallAt& c) const {
+ return this->station != c.station;
+ }
+
+ inline bool operator>=(const CallAt& c) const {
+ return this->station == c.station &&
+ this->scheduled_date != 0 &&
+ c.scheduled_date != 0 &&
+ this->scheduled_date >= c.scheduled_date;
+ }
+
+ CallAt& operator=(const CallAt& c) {
+ this->station = c.station;
+ this->scheduled_date = c.scheduled_date;
+ return *this;
+ }
+
+ inline bool operator==(StationID s) const {
+ return this->station == s;
+ }
+} CallAt;
+
+/** A scheduled departure. */
+typedef struct Departure {
+ DateTicks scheduled_date; ///< The date this departure is scheduled to finish on (i.e. when the vehicle leaves the station)
+ DateTicks lateness; ///< How delayed the departure is expected to be
+ CallAt terminus; ///< The station at which the vehicle will terminate following this departure
+ StationID via; ///< The station the departure should list as going via
+ SmallVector<CallAt, 32> calling_at; ///< The stations both called at and unloaded at by the vehicle after this departure before it terminates
+ DepartureStatus status; ///< Whether the vehicle has arrived yet for this departure
+ DepartureType type; ///< The type of the departure (departure or arrival)
+ const Vehicle *vehicle; ///< The vehicle performing this departure
+ const Order *order; ///< The order corresponding to this departure
+ Departure() : terminus(INVALID_STATION), via(INVALID_STATION), calling_at(), vehicle(NULL) { }
+ ~Departure()
+ {
+ calling_at.Reset();
+ }
+
+ inline bool operator==(const Departure& d) const {
+ if (this->calling_at.Length() != d.calling_at.Length()) return false;
+
+ for (uint i = 0; i < this->calling_at.Length(); ++i) {
+ if (*(this->calling_at.Get(i)) != *(d.calling_at.Get(i))) return false;
+ }
+
+ return
+ (this->scheduled_date / DATE_UNIT_SIZE) == (d.scheduled_date / DATE_UNIT_SIZE) &&
+ this->vehicle->type == d.vehicle->type &&
+ this->via == d.via &&
+ this->type == d.type
+ ;
+ }
+} Departure;
+
+typedef SmallVector<Departure*, 32> DepartureList;
+
+#endif /* DEPARTURES_TYPE_H */