Duration.h 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. /*
  2. * Copyright (c) 2021, Linus Groh <linusg@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/Optional.h>
  8. #include <LibJS/Runtime/Completion.h>
  9. #include <LibJS/Runtime/Object.h>
  10. namespace JS::Temporal {
  11. class Duration final : public Object {
  12. JS_OBJECT(Duration, Object);
  13. public:
  14. Duration(double years, double months, double weeks, double days, double hours, double minutes, double seconds, double milliseconds, double microseconds, double nanoseconds, Object& prototype);
  15. virtual ~Duration() override = default;
  16. [[nodiscard]] double years() const { return m_years; }
  17. [[nodiscard]] double months() const { return m_months; }
  18. [[nodiscard]] double weeks() const { return m_weeks; }
  19. [[nodiscard]] double days() const { return m_days; }
  20. [[nodiscard]] double hours() const { return m_hours; }
  21. [[nodiscard]] double minutes() const { return m_minutes; }
  22. [[nodiscard]] double seconds() const { return m_seconds; }
  23. [[nodiscard]] double milliseconds() const { return m_milliseconds; }
  24. [[nodiscard]] double microseconds() const { return m_microseconds; }
  25. [[nodiscard]] double nanoseconds() const { return m_nanoseconds; }
  26. private:
  27. // 7.4 Properties of Temporal.Duration Instances, https://tc39.es/proposal-temporal/#sec-properties-of-temporal-duration-instances
  28. double m_years; // [[Years]]
  29. double m_months; // [[Months]]
  30. double m_weeks; // [[Weeks]]
  31. double m_days; // [[Days]]
  32. double m_hours; // [[Hours]]
  33. double m_minutes; // [[Minutes]]
  34. double m_seconds; // [[Seconds]]
  35. double m_milliseconds; // [[Milliseconds]]
  36. double m_microseconds; // [[Microseconds]]
  37. double m_nanoseconds; // [[Nanoseconds]]
  38. };
  39. // Used by ToTemporalDurationRecord to temporarily hold values
  40. struct TemporalDuration {
  41. double years;
  42. double months;
  43. double weeks;
  44. double days;
  45. double hours;
  46. double minutes;
  47. double seconds;
  48. double milliseconds;
  49. double microseconds;
  50. double nanoseconds;
  51. };
  52. // Used by ToPartialDuration to temporarily hold values
  53. struct PartialDuration {
  54. Optional<double> years;
  55. Optional<double> months;
  56. Optional<double> weeks;
  57. Optional<double> days;
  58. Optional<double> hours;
  59. Optional<double> minutes;
  60. Optional<double> seconds;
  61. Optional<double> milliseconds;
  62. Optional<double> microseconds;
  63. Optional<double> nanoseconds;
  64. };
  65. // Used by BalanceDuration to temporarily hold values
  66. struct BalancedDuration {
  67. double days;
  68. double hours;
  69. double minutes;
  70. double seconds;
  71. double milliseconds;
  72. double microseconds;
  73. double nanoseconds;
  74. };
  75. // Table 7: Properties of a TemporalDurationLike, https://tc39.es/proposal-temporal/#table-temporal-temporaldurationlike-properties
  76. template<typename StructT, typename ValueT>
  77. struct TemporalDurationLikeProperty {
  78. ValueT StructT::*internal_slot { nullptr };
  79. PropertyName property;
  80. };
  81. template<typename StructT, typename ValueT>
  82. auto temporal_duration_like_properties = [](VM& vm) {
  83. using PropertyT = TemporalDurationLikeProperty<StructT, ValueT>;
  84. return AK::Array<PropertyT, 10> {
  85. PropertyT { &StructT::days, vm.names.days },
  86. PropertyT { &StructT::hours, vm.names.hours },
  87. PropertyT { &StructT::microseconds, vm.names.microseconds },
  88. PropertyT { &StructT::milliseconds, vm.names.milliseconds },
  89. PropertyT { &StructT::minutes, vm.names.minutes },
  90. PropertyT { &StructT::months, vm.names.months },
  91. PropertyT { &StructT::nanoseconds, vm.names.nanoseconds },
  92. PropertyT { &StructT::seconds, vm.names.seconds },
  93. PropertyT { &StructT::weeks, vm.names.weeks },
  94. PropertyT { &StructT::years, vm.names.years },
  95. };
  96. };
  97. ThrowCompletionOr<Duration*> to_temporal_duration(GlobalObject&, Value item);
  98. ThrowCompletionOr<TemporalDuration> to_temporal_duration_record(GlobalObject&, Object const& temporal_duration_like);
  99. i8 duration_sign(double years, double months, double weeks, double days, double hours, double minutes, double seconds, double milliseconds, double microseconds, double nanoseconds);
  100. bool is_valid_duration(double years, double months, double weeks, double days, double hours, double minutes, double seconds, double milliseconds, double microseconds, double nanoseconds);
  101. ThrowCompletionOr<PartialDuration> to_partial_duration(GlobalObject&, Value temporal_duration_like);
  102. ThrowCompletionOr<Duration*> create_temporal_duration(GlobalObject&, double years, double months, double weeks, double days, double hours, double minutes, double seconds, double milliseconds, double microseconds, double nanoseconds, FunctionObject const* new_target = nullptr);
  103. Duration* create_negated_temporal_duration(GlobalObject& global_object, Duration const& duration);
  104. BigInt* total_duration_nanoseconds(GlobalObject&, double days, double hours, double minutes, double seconds, double milliseconds, double microseconds, BigInt const& nanoseconds, double offset_shift);
  105. ThrowCompletionOr<BalancedDuration> balance_duration(GlobalObject&, double days, double hours, double minutes, double seconds, double milliseconds, double microseconds, BigInt const& nanoseconds, String const& largest_unit, Object* relative_to = nullptr);
  106. ThrowCompletionOr<TemporalDuration> to_limited_temporal_duration(GlobalObject&, Value temporal_duration_like, Vector<StringView> const& disallowed_fields);
  107. }