summaryrefslogtreecommitdiffstats
path: root/js/src/builtin/temporal/Duration.h
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/builtin/temporal/Duration.h')
-rw-r--r--js/src/builtin/temporal/Duration.h210
1 files changed, 210 insertions, 0 deletions
diff --git a/js/src/builtin/temporal/Duration.h b/js/src/builtin/temporal/Duration.h
new file mode 100644
index 0000000000..47708458f4
--- /dev/null
+++ b/js/src/builtin/temporal/Duration.h
@@ -0,0 +1,210 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
+ * vim: set ts=8 sts=2 et sw=2 tw=80:
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef builtin_temporal_Duration_h
+#define builtin_temporal_Duration_h
+
+#include <stdint.h>
+
+#include "builtin/temporal/TemporalTypes.h"
+#include "builtin/temporal/Wrapped.h"
+#include "js/RootingAPI.h"
+#include "js/TypeDecls.h"
+#include "js/Value.h"
+#include "vm/NativeObject.h"
+
+namespace js {
+struct ClassSpec;
+}
+
+namespace js::temporal {
+
+class DurationObject : public NativeObject {
+ public:
+ static const JSClass class_;
+ static const JSClass& protoClass_;
+
+ static constexpr uint32_t YEARS_SLOT = 0;
+ static constexpr uint32_t MONTHS_SLOT = 1;
+ static constexpr uint32_t WEEKS_SLOT = 2;
+ static constexpr uint32_t DAYS_SLOT = 3;
+ static constexpr uint32_t HOURS_SLOT = 4;
+ static constexpr uint32_t MINUTES_SLOT = 5;
+ static constexpr uint32_t SECONDS_SLOT = 6;
+ static constexpr uint32_t MILLISECONDS_SLOT = 7;
+ static constexpr uint32_t MICROSECONDS_SLOT = 8;
+ static constexpr uint32_t NANOSECONDS_SLOT = 9;
+ static constexpr uint32_t SLOT_COUNT = 10;
+
+ double years() const { return getFixedSlot(YEARS_SLOT).toNumber(); }
+ double months() const { return getFixedSlot(MONTHS_SLOT).toNumber(); }
+ double weeks() const { return getFixedSlot(WEEKS_SLOT).toNumber(); }
+ double days() const { return getFixedSlot(DAYS_SLOT).toNumber(); }
+ double hours() const { return getFixedSlot(HOURS_SLOT).toNumber(); }
+ double minutes() const { return getFixedSlot(MINUTES_SLOT).toNumber(); }
+ double seconds() const { return getFixedSlot(SECONDS_SLOT).toNumber(); }
+ double milliseconds() const {
+ return getFixedSlot(MILLISECONDS_SLOT).toNumber();
+ }
+ double microseconds() const {
+ return getFixedSlot(MICROSECONDS_SLOT).toNumber();
+ }
+ double nanoseconds() const {
+ return getFixedSlot(NANOSECONDS_SLOT).toNumber();
+ }
+
+ private:
+ static const ClassSpec classSpec_;
+};
+
+/**
+ * Extract the duration fields from the Duration object.
+ */
+inline Duration ToDuration(const DurationObject* duration) {
+ return {
+ duration->years(), duration->months(),
+ duration->weeks(), duration->days(),
+ duration->hours(), duration->minutes(),
+ duration->seconds(), duration->milliseconds(),
+ duration->microseconds(), duration->nanoseconds(),
+ };
+}
+
+class Increment;
+class CalendarRecord;
+class PlainDateObject;
+class TimeZoneRecord;
+class ZonedDateTime;
+class ZonedDateTimeObject;
+enum class TemporalRoundingMode;
+enum class TemporalUnit;
+
+/**
+ * DurationSign ( years, months, weeks, days, hours, minutes, seconds,
+ * milliseconds, microseconds, nanoseconds )
+ */
+int32_t DurationSign(const Duration& duration);
+
+/**
+ * IsValidDuration ( years, months, weeks, days, hours, minutes, seconds,
+ * milliseconds, microseconds, nanoseconds )
+ */
+bool IsValidDuration(const Duration& duration);
+
+/**
+ * IsValidDuration ( years, months, weeks, days, hours, minutes, seconds,
+ * milliseconds, microseconds, nanoseconds )
+ */
+bool ThrowIfInvalidDuration(JSContext* cx, const Duration& duration);
+
+/**
+ * CreateTemporalDuration ( years, months, weeks, days, hours, minutes, seconds,
+ * milliseconds, microseconds, nanoseconds [ , newTarget ] )
+ */
+DurationObject* CreateTemporalDuration(JSContext* cx, const Duration& duration);
+
+/**
+ * ToTemporalDuration ( item )
+ */
+Wrapped<DurationObject*> ToTemporalDuration(JSContext* cx,
+ JS::Handle<JS::Value> item);
+
+/**
+ * ToTemporalDuration ( item )
+ */
+bool ToTemporalDuration(JSContext* cx, JS::Handle<JS::Value> item,
+ Duration* result);
+
+/**
+ * ToTemporalDurationRecord ( temporalDurationLike )
+ */
+bool ToTemporalDurationRecord(JSContext* cx,
+ JS::Handle<JS::Value> temporalDurationLike,
+ Duration* result);
+
+/**
+ * BalanceTimeDuration ( days, hours, minutes, seconds, milliseconds,
+ * microseconds, nanoseconds, largestUnit )
+ */
+bool BalanceTimeDuration(JSContext* cx, const Duration& duration,
+ TemporalUnit largestUnit, TimeDuration* result);
+
+/**
+ * BalanceTimeDuration ( days, hours, minutes, seconds, milliseconds,
+ * microseconds, nanoseconds, largestUnit )
+ */
+bool BalanceTimeDuration(JSContext* cx, const InstantSpan& nanoseconds,
+ TemporalUnit largestUnit, TimeDuration* result);
+
+/**
+ * BalanceDateDurationRelative ( years, months, weeks, days, largestUnit,
+ * smallestUnit, plainRelativeTo, calendarRec )
+ */
+bool BalanceDateDurationRelative(
+ JSContext* cx, const Duration& duration, TemporalUnit largestUnit,
+ TemporalUnit smallestUnit,
+ JS::Handle<Wrapped<PlainDateObject*>> plainRelativeTo,
+ JS::Handle<CalendarRecord> calendar, DateDuration* result);
+
+/**
+ * AdjustRoundedDurationDays ( years, months, weeks, days, hours, minutes,
+ * seconds, milliseconds, microseconds, nanoseconds, increment, unit,
+ * roundingMode, zonedRelativeTo, calendarRec, timeZoneRec,
+ * precalculatedPlainDateTime )
+ */
+bool AdjustRoundedDurationDays(JSContext* cx, const Duration& duration,
+ Increment increment, TemporalUnit unit,
+ TemporalRoundingMode roundingMode,
+ JS::Handle<ZonedDateTime> relativeTo,
+ JS::Handle<CalendarRecord> calendar,
+ JS::Handle<TimeZoneRecord> timeZone,
+ const PlainDateTime& precalculatedPlainDateTime,
+ Duration* result);
+
+/**
+ * RoundDuration ( years, months, weeks, days, hours, minutes, seconds,
+ * milliseconds, microseconds, nanoseconds, increment, unit, roundingMode [ ,
+ * plainRelativeTo [ , calendarRec [ , zonedRelativeTo [ , timeZoneRec [ ,
+ * precalculatedPlainDateTime ] ] ] ] ] )
+ */
+bool RoundDuration(JSContext* cx, const Duration& duration, Increment increment,
+ TemporalUnit unit, TemporalRoundingMode roundingMode,
+ Duration* result);
+
+/**
+ * RoundDuration ( years, months, weeks, days, hours, minutes, seconds,
+ * milliseconds, microseconds, nanoseconds, increment, unit, roundingMode [ ,
+ * plainRelativeTo [ , calendarRec [ , zonedRelativeTo [ , timeZoneRec [ ,
+ * precalculatedPlainDateTime ] ] ] ] ] )
+ */
+bool RoundDuration(JSContext* cx, const Duration& duration, Increment increment,
+ TemporalUnit unit, TemporalRoundingMode roundingMode,
+ JS::Handle<Wrapped<PlainDateObject*>> plainRelativeTo,
+ JS::Handle<CalendarRecord> calendar, Duration* result);
+
+/**
+ * RoundDuration ( years, months, weeks, days, hours, minutes, seconds,
+ * milliseconds, microseconds, nanoseconds, increment, unit, roundingMode [ ,
+ * plainRelativeTo [ , calendarRec [ , zonedRelativeTo [ , timeZoneRec [ ,
+ * precalculatedPlainDateTime ] ] ] ] ] )
+ */
+bool RoundDuration(JSContext* cx, const Duration& duration, Increment increment,
+ TemporalUnit unit, TemporalRoundingMode roundingMode,
+ JS::Handle<PlainDateObject*> plainRelativeTo,
+ JS::Handle<CalendarRecord> calendar,
+ JS::Handle<ZonedDateTime> zonedRelativeTo,
+ JS::Handle<TimeZoneRecord> timeZone,
+ const PlainDateTime& precalculatedPlainDateTime,
+ Duration* result);
+
+/**
+ * DaysUntil ( earlier, later )
+ */
+int32_t DaysUntil(const PlainDate& earlier, const PlainDate& later);
+
+} /* namespace js::temporal */
+
+#endif /* builtin_temporal_Duration_h */