tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

Instant.h (3519B)


      1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
      2 * vim: set ts=8 sts=2 et sw=2 tw=80:
      3 * This Source Code Form is subject to the terms of the Mozilla Public
      4 * License, v. 2.0. If a copy of the MPL was not distributed with this
      5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      6 
      7 #ifndef builtin_temporal_Instant_h
      8 #define builtin_temporal_Instant_h
      9 
     10 #include "mozilla/Assertions.h"
     11 
     12 #include <stdint.h>
     13 
     14 #include "builtin/temporal/TemporalTypes.h"
     15 #include "js/TypeDecls.h"
     16 #include "js/Value.h"
     17 #include "vm/NativeObject.h"
     18 
     19 namespace js {
     20 struct ClassSpec;
     21 }
     22 
     23 namespace js::temporal {
     24 
     25 class InstantObject : public NativeObject {
     26 public:
     27  static const JSClass class_;
     28  static const JSClass& protoClass_;
     29 
     30  static constexpr uint32_t SECONDS_SLOT = 0;
     31  static constexpr uint32_t NANOSECONDS_SLOT = 1;
     32  static constexpr uint32_t SLOT_COUNT = 2;
     33 
     34  /**
     35   * Extract the epoch nanoseconds fields from this ZonedDateTime object.
     36   */
     37  EpochNanoseconds epochNanoseconds() const {
     38    double seconds = getFixedSlot(SECONDS_SLOT).toNumber();
     39    MOZ_ASSERT(-8'640'000'000'000 <= seconds && seconds <= 8'640'000'000'000);
     40 
     41    int32_t nanoseconds = getFixedSlot(NANOSECONDS_SLOT).toInt32();
     42    MOZ_ASSERT(0 <= nanoseconds && nanoseconds <= 999'999'999);
     43 
     44    return {{int64_t(seconds), nanoseconds}};
     45  }
     46 
     47 private:
     48  static const ClassSpec classSpec_;
     49 };
     50 
     51 class Increment;
     52 enum class TemporalUnit;
     53 enum class TemporalRoundingMode;
     54 
     55 /**
     56 * IsValidEpochNanoseconds ( epochNanoseconds )
     57 */
     58 bool IsValidEpochNanoseconds(const JS::BigInt* epochNanoseconds);
     59 
     60 /**
     61 * IsValidEpochNanoseconds ( epochNanoseconds )
     62 */
     63 bool IsValidEpochNanoseconds(const EpochNanoseconds& epochNanoseconds);
     64 
     65 #ifdef DEBUG
     66 /**
     67 * Return true if the input is within the valid epoch duration limits.
     68 */
     69 bool IsValidEpochDuration(const EpochDuration& duration);
     70 #endif
     71 
     72 /**
     73 * Convert a BigInt to epoch nanoseconds. The input must be a valid epoch
     74 * nanoseconds value.
     75 */
     76 EpochNanoseconds ToEpochNanoseconds(const JS::BigInt* epochNanoseconds);
     77 
     78 /**
     79 * Convert epoch nanoseconds to a BigInt. The input must be valid epoch
     80 * nanoseconds.
     81 */
     82 JS::BigInt* ToBigInt(JSContext* cx, const EpochNanoseconds& epochNanoseconds);
     83 
     84 /**
     85 * CreateTemporalInstant ( epochNanoseconds [ , newTarget ] )
     86 */
     87 InstantObject* CreateTemporalInstant(JSContext* cx,
     88                                     const EpochNanoseconds& epochNanoseconds);
     89 
     90 /**
     91 * GetUTCEpochNanoseconds ( isoDateTime )
     92 */
     93 EpochNanoseconds GetUTCEpochNanoseconds(const ISODateTime& isoDateTime);
     94 
     95 /**
     96 * RoundTemporalInstant ( ns, increment, unit, roundingMode )
     97 */
     98 EpochNanoseconds RoundTemporalInstant(const EpochNanoseconds& ns,
     99                                      Increment increment, TemporalUnit unit,
    100                                      TemporalRoundingMode roundingMode);
    101 
    102 /**
    103 * AddInstant ( epochNanoseconds, norm )
    104 */
    105 bool AddInstant(JSContext* cx, const EpochNanoseconds& epochNanoseconds,
    106                const TimeDuration& duration, EpochNanoseconds* result);
    107 
    108 /**
    109 * DifferenceInstant ( ns1, ns2, roundingIncrement, smallestUnit, roundingMode )
    110 */
    111 TimeDuration DifferenceInstant(const EpochNanoseconds& ns1,
    112                               const EpochNanoseconds& ns2,
    113                               Increment roundingIncrement,
    114                               TemporalUnit smallestUnit,
    115                               TemporalRoundingMode roundingMode);
    116 
    117 } /* namespace js::temporal */
    118 
    119 #endif /* builtin_temporal_Instant_h */