PlainTime.h 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. /*
  2. * Copyright (c) 2021, Idan Horowitz <idan.horowitz@serenityos.org>
  3. * Copyright (c) 2021-2023, Linus Groh <linusg@serenityos.org>
  4. * Copyright (c) 2024, Tim Flynn <trflynn89@ladybird.org>
  5. *
  6. * SPDX-License-Identifier: BSD-2-Clause
  7. */
  8. #pragma once
  9. #include <LibJS/Runtime/Temporal/AbstractOperations.h>
  10. #include <LibJS/Runtime/Temporal/ISORecords.h>
  11. namespace JS::Temporal {
  12. class PlainTime final : public Object {
  13. JS_OBJECT(PlainTime, Object);
  14. GC_DECLARE_ALLOCATOR(PlainTime);
  15. public:
  16. virtual ~PlainTime() override = default;
  17. [[nodiscard]] Time const& time() const { return m_time; }
  18. private:
  19. PlainTime(Time const&, Object& prototype);
  20. Time m_time; // [[Time]]
  21. };
  22. // Table 5: TemporalTimeLike Record Fields, https://tc39.es/proposal-temporal/#table-temporal-temporaltimelike-record-fields
  23. struct TemporalTimeLike {
  24. static TemporalTimeLike zero()
  25. {
  26. return { .hour = 0, .minute = 0, .second = 0, .millisecond = 0, .microsecond = 0, .nanosecond = 0 };
  27. }
  28. Optional<double> hour;
  29. Optional<double> minute;
  30. Optional<double> second;
  31. Optional<double> millisecond;
  32. Optional<double> microsecond;
  33. Optional<double> nanosecond;
  34. };
  35. enum class Completeness {
  36. Complete,
  37. Partial,
  38. };
  39. Time create_time_record(double hour, double minute, double second, double millisecond, double microsecond, double nanosecond, double delta_days = 0);
  40. Time midnight_time_record();
  41. Time noon_time_record();
  42. TimeDuration difference_time(Time const&, Time const&);
  43. ThrowCompletionOr<GC::Ref<PlainTime>> to_temporal_time(VM&, Value item, Value options = js_undefined());
  44. ThrowCompletionOr<Time> regulate_time(VM&, double hour, double minute, double second, double millisecond, double microsecond, double nanosecond, Overflow);
  45. bool is_valid_time(double hour, double minute, double second, double millisecond, double microsecond, double nanosecond);
  46. Time balance_time(double hour, double minute, double second, double millisecond, double microsecond, double nanosecond);
  47. Time balance_time(double hour, double minute, double second, double millisecond, double microsecond, TimeDuration const& nanosecond);
  48. ThrowCompletionOr<GC::Ref<PlainTime>> create_temporal_time(VM&, Time const&, GC::Ptr<FunctionObject> new_target = {});
  49. ThrowCompletionOr<TemporalTimeLike> to_temporal_time_record(VM&, Object const& temporal_time_like, Completeness = Completeness::Complete);
  50. String time_record_to_string(Time const&, SecondsStringPrecision::Precision);
  51. i8 compare_time_record(Time const&, Time const&);
  52. Time add_time(Time const&, TimeDuration const& time_duration);
  53. Time round_time(Time const&, u64 increment, Unit, RoundingMode);
  54. ThrowCompletionOr<GC::Ref<PlainTime>> add_duration_to_time(VM&, ArithmeticOperation, PlainTime const&, Value temporal_duration_like);
  55. }