Duration.h 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  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/Object.h>
  9. namespace JS::Temporal {
  10. class Duration final : public Object {
  11. JS_OBJECT(Duration, Object);
  12. public:
  13. explicit Duration(double years, double months, double weeks, double days, double hours, double minutes, double seconds, double milliseconds, double microseconds, double nanoseconds, Object& prototype);
  14. virtual ~Duration() override = default;
  15. double years() const { return m_years; }
  16. double months() const { return m_months; }
  17. double weeks() const { return m_weeks; }
  18. double days() const { return m_days; }
  19. double hours() const { return m_hours; }
  20. double minutes() const { return m_minutes; }
  21. double seconds() const { return m_seconds; }
  22. double milliseconds() const { return m_milliseconds; }
  23. double microseconds() const { return m_microseconds; }
  24. double nanoseconds() const { return m_nanoseconds; }
  25. private:
  26. // 7.4 Properties of Temporal.Duration Instances, https://tc39.es/proposal-temporal/#sec-properties-of-temporal-duration-instances
  27. double m_years; // [[Years]]
  28. double m_months; // [[Months]]
  29. double m_weeks; // [[Weeks]]
  30. double m_days; // [[Days]]
  31. double m_hours; // [[Hours]]
  32. double m_minutes; // [[Minutes]]
  33. double m_seconds; // [[Seconds]]
  34. double m_milliseconds; // [[Milliseconds]]
  35. double m_microseconds; // [[Microseconds]]
  36. double m_nanoseconds; // [[Nanoseconds]]
  37. };
  38. // Used by ToTemporalDurationRecord to temporarily hold values
  39. struct TemporalDuration {
  40. double years;
  41. double months;
  42. double weeks;
  43. double days;
  44. double hours;
  45. double minutes;
  46. double seconds;
  47. double milliseconds;
  48. double microseconds;
  49. double nanoseconds;
  50. };
  51. // Used by ToPartialDuration to temporarily hold values
  52. struct PartialDuration {
  53. Optional<double> years;
  54. Optional<double> months;
  55. Optional<double> weeks;
  56. Optional<double> days;
  57. Optional<double> hours;
  58. Optional<double> minutes;
  59. Optional<double> seconds;
  60. Optional<double> milliseconds;
  61. Optional<double> microseconds;
  62. Optional<double> nanoseconds;
  63. };
  64. // Table 7: Properties of a TemporalDurationLike, https://tc39.es/proposal-temporal/#table-temporal-temporaldurationlike-properties
  65. template<typename StructT, typename ValueT>
  66. struct TemporalDurationLikeProperty {
  67. ValueT StructT::*internal_slot { nullptr };
  68. PropertyName property;
  69. };
  70. template<typename StructT, typename ValueT>
  71. auto temporal_duration_like_properties = [](VM& vm) {
  72. using PropertyT = TemporalDurationLikeProperty<StructT, ValueT>;
  73. return AK::Array<PropertyT, 10> {
  74. PropertyT { &StructT::days, vm.names.days },
  75. PropertyT { &StructT::hours, vm.names.hours },
  76. PropertyT { &StructT::microseconds, vm.names.microseconds },
  77. PropertyT { &StructT::milliseconds, vm.names.milliseconds },
  78. PropertyT { &StructT::minutes, vm.names.minutes },
  79. PropertyT { &StructT::months, vm.names.months },
  80. PropertyT { &StructT::nanoseconds, vm.names.nanoseconds },
  81. PropertyT { &StructT::seconds, vm.names.seconds },
  82. PropertyT { &StructT::weeks, vm.names.weeks },
  83. PropertyT { &StructT::years, vm.names.years },
  84. };
  85. };
  86. Duration* to_temporal_duration(GlobalObject&, Value item);
  87. TemporalDuration to_temporal_duration_record(GlobalObject&, Object& temporal_duration_like);
  88. i8 duration_sign(double years, double months, double weeks, double days, double hours, double minutes, double seconds, double milliseconds, double microseconds, double nanoseconds);
  89. bool is_valid_duration(double years, double months, double weeks, double days, double hours, double minutes, double seconds, double milliseconds, double microseconds, double nanoseconds);
  90. PartialDuration to_partial_duration(GlobalObject&, Value temporal_duration_like);
  91. 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* new_target = nullptr);
  92. }