Initial vendor packages
Signed-off-by: Valentin Popov <valentin@popov.link>
This commit is contained in:
1
vendor/instant/.cargo-checksum.json
vendored
Normal file
1
vendor/instant/.cargo-checksum.json
vendored
Normal file
@ -0,0 +1 @@
|
||||
{"files":{"AUTHORS":"451a1be16acafff0cb0eaedc49b46063cc6ce087d0c36f6d64d67aa93d20e485","CHANGELOGS.md":"bb587c08dd9b1f04cba934a241a99655f9d7e38bc70e4d45feca95efa09bd799","Cargo.toml":"a64c7ab3a5906d2e7360fb30cc23e5042bd7c22aa640e8e47bb3dad1a3dbf8eb","LICENSE":"2510d4cde8c4e13d8c54b9fe2a9d144daf567ec8d02832f1454e7ca2d58cdda6","README.md":"22b54b9f16ad18144f29e50d1b1f16791c5e8f1afee81265bad9b72f6efb8e62","src/lib.rs":"cc4822f1c4ac7926859045608d91e3f855914468039bffb75bc9b455c0950ab3","src/native.rs":"bd4cd1f888b83a9eaf07f640bef51c4f16138ceb427a685d3ab07152eec53d1c","src/wasm.rs":"c17c7bf8a28fee134444201212d1cf62bff49650f297e42367ec1b7aeaddc7c9","tests/wasm.rs":"1b81ff541bec36bac824a7ec41cd15f68d9919c3c7522290aa003fa4c253e840"},"package":"7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c"}
|
2
vendor/instant/AUTHORS
vendored
Normal file
2
vendor/instant/AUTHORS
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
Main developer:
|
||||
* Sébastien Crozet <developer@crozet.re>
|
7
vendor/instant/CHANGELOGS.md
vendored
Normal file
7
vendor/instant/CHANGELOGS.md
vendored
Normal file
@ -0,0 +1,7 @@
|
||||
# v0.1.12
|
||||
## Added
|
||||
- Add `SystemTime` which works in both native and WASM environments.
|
||||
|
||||
## Modified
|
||||
- The `now` function is always available now: there is no need to enable the `now` feature any more. The `now` feature
|
||||
still exists (but doesn’t do anything) for backwards compatibility.
|
81
vendor/instant/Cargo.toml
vendored
Normal file
81
vendor/instant/Cargo.toml
vendored
Normal file
@ -0,0 +1,81 @@
|
||||
# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO
|
||||
#
|
||||
# When uploading crates to the registry Cargo will automatically
|
||||
# "normalize" Cargo.toml files for maximal compatibility
|
||||
# with all versions of Cargo and also rewrite `path` dependencies
|
||||
# to registry (e.g., crates.io) dependencies.
|
||||
#
|
||||
# If you are reading this file be aware that the original Cargo.toml
|
||||
# will likely look very different (and much more reasonable).
|
||||
# See Cargo.toml.orig for the original contents.
|
||||
|
||||
[package]
|
||||
edition = "2018"
|
||||
name = "instant"
|
||||
version = "0.1.12"
|
||||
authors = ["sebcrozet <developer@crozet.re>"]
|
||||
description = "A partial replacement for std::time::Instant that works on WASM too."
|
||||
readme = "README.md"
|
||||
keywords = ["time", "wasm"]
|
||||
license = "BSD-3-Clause"
|
||||
repository = "https://github.com/sebcrozet/instant"
|
||||
[dependencies.cfg-if]
|
||||
version = "1.0"
|
||||
[dev-dependencies.wasm-bindgen-test]
|
||||
version = "0.3"
|
||||
|
||||
[features]
|
||||
inaccurate = []
|
||||
now = []
|
||||
wasm-bindgen = ["js-sys", "wasm-bindgen_rs", "web-sys"]
|
||||
[target.asmjs-unknown-emscripten.dependencies.js-sys]
|
||||
version = "0.3"
|
||||
optional = true
|
||||
|
||||
[target.asmjs-unknown-emscripten.dependencies.stdweb]
|
||||
version = "0.4"
|
||||
optional = true
|
||||
|
||||
[target.asmjs-unknown-emscripten.dependencies.wasm-bindgen_rs]
|
||||
version = "0.2"
|
||||
optional = true
|
||||
package = "wasm-bindgen"
|
||||
|
||||
[target.asmjs-unknown-emscripten.dependencies.web-sys]
|
||||
version = "0.3"
|
||||
features = ["Window", "Performance", "PerformanceTiming"]
|
||||
optional = true
|
||||
[target.wasm32-unknown-emscripten.dependencies.js-sys]
|
||||
version = "0.3"
|
||||
optional = true
|
||||
|
||||
[target.wasm32-unknown-emscripten.dependencies.stdweb]
|
||||
version = "0.4"
|
||||
optional = true
|
||||
|
||||
[target.wasm32-unknown-emscripten.dependencies.wasm-bindgen_rs]
|
||||
version = "0.2"
|
||||
optional = true
|
||||
package = "wasm-bindgen"
|
||||
|
||||
[target.wasm32-unknown-emscripten.dependencies.web-sys]
|
||||
version = "0.3"
|
||||
features = ["Window", "Performance", "PerformanceTiming"]
|
||||
optional = true
|
||||
[target.wasm32-unknown-unknown.dependencies.js-sys]
|
||||
version = "0.3"
|
||||
optional = true
|
||||
|
||||
[target.wasm32-unknown-unknown.dependencies.stdweb]
|
||||
version = "0.4"
|
||||
optional = true
|
||||
|
||||
[target.wasm32-unknown-unknown.dependencies.wasm-bindgen_rs]
|
||||
version = "0.2"
|
||||
optional = true
|
||||
package = "wasm-bindgen"
|
||||
|
||||
[target.wasm32-unknown-unknown.dependencies.web-sys]
|
||||
version = "0.3"
|
||||
features = ["Window", "Performance", "PerformanceTiming"]
|
||||
optional = true
|
27
vendor/instant/LICENSE
vendored
Normal file
27
vendor/instant/LICENSE
vendored
Normal file
@ -0,0 +1,27 @@
|
||||
Copyright (c) 2019, Sébastien Crozet
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
1. Redistributions of source code must retain the above copyright notice, this
|
||||
list of conditions and the following disclaimer.
|
||||
|
||||
2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
|
||||
3. Neither the name of the author nor the names of its contributors may be used
|
||||
to endorse or promote products derived from this software without specific
|
||||
prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
143
vendor/instant/README.md
vendored
Normal file
143
vendor/instant/README.md
vendored
Normal file
@ -0,0 +1,143 @@
|
||||
# Instant
|
||||
|
||||
If you call `std::time::Instant::now()` on a WASM platform, it will panic. This crate provides a partial
|
||||
replacement for `std::time::Instant` that works on WASM too. This defines the type `instant::Instant` which is:
|
||||
|
||||
* A struct emulating the behavior of **std::time::Instant** if you are targeting `wasm32-unknown-unknown` or `wasm32-unknown-asmjs`
|
||||
**and** you enabled either the `stdweb` or the `wasm-bindgen` feature. This emulation is based on the javascript `performance.now()` function.
|
||||
* A type alias for `std::time::Instant` otherwise.
|
||||
|
||||
|
||||
|
||||
Note that even if the **stdweb** or **wasm-bindgen** feature is enabled, this crate will continue to rely on `std::time::Instant`
|
||||
as long as you are not targeting wasm32. This allows for portable code that will work on both native and WASM platforms.
|
||||
|
||||
This crate also exports the function `instant::now()` which returns a representation of the current time as an `f64`, expressed in milliseconds, in a platform-agnostic way. `instant::now()` will either:
|
||||
|
||||
* Call `performance.now()` when compiling for a WASM platform with the features **stdweb** or **wasm-bindgen** enabled, or using a custom javascript function.
|
||||
* Return the time elapsed since the *Unix Epoch* on *native*, *non-WASM* platforms.
|
||||
|
||||
*Note*: The old feature, `now`, has been deprecated. `instant::now()` is always exported and the `now` feature flag no longer has any effect. It remains listed in `Cargo.toml` to avoid introducing breaking changes and may be removed in future versions.
|
||||
|
||||
## Examples
|
||||
### Using `instant` for a native platform.
|
||||
_Cargo.toml_:
|
||||
```toml
|
||||
[dependencies]
|
||||
instant = "0.1"
|
||||
```
|
||||
|
||||
_main.rs_:
|
||||
```rust
|
||||
fn main() {
|
||||
// Will be the same as `std::time::Instant`.
|
||||
let now = instant::Instant::now();
|
||||
}
|
||||
```
|
||||
|
||||
-----
|
||||
|
||||
### Using `instant` for a WASM platform.
|
||||
This example shows the use of the `stdweb` feature. It would be similar with `wasm-bindgen`.
|
||||
|
||||
_Cargo.toml_:
|
||||
```toml
|
||||
[dependencies]
|
||||
instant = { version = "0.1", features = [ "stdweb" ] }
|
||||
```
|
||||
|
||||
_main.rs_:
|
||||
```rust
|
||||
fn main() {
|
||||
// Will emulate `std::time::Instant` based on `performance.now()`.
|
||||
let now = instant::Instant::now();
|
||||
}
|
||||
```
|
||||
|
||||
-----
|
||||
|
||||
### Using `instant` for a WASM platform where `performance.now()` is not available.
|
||||
This example shows the use of the `inaccurate` feature.
|
||||
|
||||
_Cargo.toml_:
|
||||
```toml
|
||||
[dependencies]
|
||||
instant = { version = "0.1", features = [ "wasm-bindgen", "inaccurate" ] }
|
||||
```
|
||||
|
||||
_main.rs_:
|
||||
```rust
|
||||
fn main() {
|
||||
// Will emulate `std::time::Instant` based on `Date.now()`.
|
||||
let now = instant::Instant::now();
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
-----
|
||||
|
||||
### Using `instant` for any platform enabling a feature transitively.
|
||||
_Cargo.toml_:
|
||||
```toml
|
||||
[features]
|
||||
stdweb = [ "instant/stdweb" ]
|
||||
wasm-bindgen = [ "instant/wasm-bindgen" ]
|
||||
|
||||
[dependencies]
|
||||
instant = "0.1"
|
||||
```
|
||||
|
||||
_lib.rs_:
|
||||
```rust
|
||||
fn my_function() {
|
||||
// Will select the proper implementation depending on the
|
||||
// feature selected by the user.
|
||||
let now = instant::Instant::now();
|
||||
}
|
||||
```
|
||||
|
||||
-----
|
||||
|
||||
### Using `instant::now()`
|
||||
_Cargo.toml_:
|
||||
```toml
|
||||
[features]
|
||||
stdweb = [ "instant/stdweb" ]
|
||||
wasm-bindgen = [ "instant/wasm-bindgen" ]
|
||||
|
||||
[dependencies]
|
||||
instant = "0.1"
|
||||
```
|
||||
|
||||
_lib.rs_:
|
||||
```rust
|
||||
fn my_function() {
|
||||
// Will select the proper implementation depending on the
|
||||
// feature selected by the user.
|
||||
let now_instant = instant::Instant::now();
|
||||
let now_milliseconds = instant::now(); // In milliseconds.
|
||||
}
|
||||
```
|
||||
|
||||
### Using the feature `now` without `stdweb` or `wasm-bindgen`.
|
||||
_Cargo.toml_:
|
||||
```toml
|
||||
[dependencies]
|
||||
instant = "0.1"
|
||||
```
|
||||
|
||||
_lib.rs_:
|
||||
```rust
|
||||
fn my_function() {
|
||||
// Will use the 'now' javascript implementation.
|
||||
let now_instant = instant::Instant::now();
|
||||
let now_milliseconds = instant::now(); // In milliseconds.
|
||||
}
|
||||
```
|
||||
|
||||
_javascript WASM bindings file_:
|
||||
```js
|
||||
function now() {
|
||||
return Date.now() / 1000.0;
|
||||
}
|
||||
```
|
22
vendor/instant/src/lib.rs
vendored
Normal file
22
vendor/instant/src/lib.rs
vendored
Normal file
@ -0,0 +1,22 @@
|
||||
cfg_if::cfg_if! {
|
||||
if #[cfg(any(
|
||||
all(target_arch = "wasm32", not(target_os = "wasi")),
|
||||
target_arch = "asmjs"
|
||||
))] {
|
||||
#[cfg(all(feature = "stdweb", not(feature = "wasm-bindgen")))]
|
||||
#[macro_use]
|
||||
extern crate stdweb;
|
||||
|
||||
mod wasm;
|
||||
pub use wasm::Instant;
|
||||
pub use crate::wasm::now;
|
||||
pub use wasm::SystemTime;
|
||||
} else {
|
||||
mod native;
|
||||
pub use native::Instant;
|
||||
pub use native::now;
|
||||
pub use native::SystemTime;
|
||||
}
|
||||
}
|
||||
|
||||
pub use std::time::Duration;
|
9
vendor/instant/src/native.rs
vendored
Normal file
9
vendor/instant/src/native.rs
vendored
Normal file
@ -0,0 +1,9 @@
|
||||
pub type Instant = std::time::Instant;
|
||||
pub type SystemTime = std::time::SystemTime;
|
||||
|
||||
/// The current time, expressed in milliseconds since the Unix Epoch.
|
||||
pub fn now() -> f64 {
|
||||
std::time::SystemTime::now().duration_since(std::time::SystemTime::UNIX_EPOCH)
|
||||
.expect("System clock was before 1970.")
|
||||
.as_secs_f64() * 1000.0
|
||||
}
|
240
vendor/instant/src/wasm.rs
vendored
Normal file
240
vendor/instant/src/wasm.rs
vendored
Normal file
@ -0,0 +1,240 @@
|
||||
use std::cmp::Ordering;
|
||||
use std::ops::{Add, AddAssign, Sub, SubAssign};
|
||||
use std::time::Duration;
|
||||
|
||||
#[derive(Copy, Clone, Debug, PartialEq, PartialOrd, Hash)]
|
||||
pub struct Instant(Duration);
|
||||
|
||||
impl Ord for Instant {
|
||||
fn cmp(&self, other: &Self) -> std::cmp::Ordering {
|
||||
self.partial_cmp(other)
|
||||
.expect("an instant should never be NaN or Inf.")
|
||||
}
|
||||
}
|
||||
impl Eq for Instant {}
|
||||
|
||||
impl Instant {
|
||||
#[inline]
|
||||
pub fn now() -> Self {
|
||||
Instant(duration_from_f64(now()))
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn duration_since(&self, earlier: Instant) -> Duration {
|
||||
assert!(
|
||||
earlier.0 <= self.0,
|
||||
"`earlier` cannot be later than `self`."
|
||||
);
|
||||
self.0 - earlier.0
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn elapsed(&self) -> Duration {
|
||||
Self::now().duration_since(*self)
|
||||
}
|
||||
|
||||
/// Returns `Some(t)` where `t` is the time `self + duration` if `t` can be represented as
|
||||
/// `Instant` (which means it's inside the bounds of the underlying data structure), `None`
|
||||
/// otherwise.
|
||||
#[inline]
|
||||
pub fn checked_add(&self, duration: Duration) -> Option<Instant> {
|
||||
self.0.checked_add(duration).map(Instant)
|
||||
}
|
||||
|
||||
/// Returns `Some(t)` where `t` is the time `self - duration` if `t` can be represented as
|
||||
/// `Instant` (which means it's inside the bounds of the underlying data structure), `None`
|
||||
/// otherwise.
|
||||
#[inline]
|
||||
pub fn checked_sub(&self, duration: Duration) -> Option<Instant> {
|
||||
self.0.checked_sub(duration).map(Instant)
|
||||
}
|
||||
|
||||
/// Returns the amount of time elapsed from another instant to this one, or None if that
|
||||
/// instant is later than this one.
|
||||
#[inline]
|
||||
pub fn checked_duration_since(&self, earlier: Instant) -> Option<Duration> {
|
||||
if earlier.0 > self.0 {
|
||||
None
|
||||
} else {
|
||||
Some(self.0 - earlier.0)
|
||||
}
|
||||
}
|
||||
|
||||
/// Returns the amount of time elapsed from another instant to this one, or zero duration if
|
||||
/// that instant is later than this one.
|
||||
#[inline]
|
||||
pub fn saturating_duration_since(&self, earlier: Instant) -> Duration {
|
||||
self.checked_duration_since(earlier).unwrap_or_default()
|
||||
}
|
||||
}
|
||||
|
||||
impl Add<Duration> for Instant {
|
||||
type Output = Self;
|
||||
|
||||
#[inline]
|
||||
fn add(self, rhs: Duration) -> Self {
|
||||
Instant(self.0 + rhs)
|
||||
}
|
||||
}
|
||||
|
||||
impl AddAssign<Duration> for Instant {
|
||||
#[inline]
|
||||
fn add_assign(&mut self, rhs: Duration) {
|
||||
self.0 += rhs
|
||||
}
|
||||
}
|
||||
|
||||
impl Sub<Duration> for Instant {
|
||||
type Output = Self;
|
||||
|
||||
#[inline]
|
||||
fn sub(self, rhs: Duration) -> Self {
|
||||
Instant(self.0 - rhs)
|
||||
}
|
||||
}
|
||||
|
||||
impl Sub<Instant> for Instant {
|
||||
type Output = Duration;
|
||||
|
||||
#[inline]
|
||||
fn sub(self, rhs: Instant) -> Duration {
|
||||
self.duration_since(rhs)
|
||||
}
|
||||
}
|
||||
|
||||
impl SubAssign<Duration> for Instant {
|
||||
#[inline]
|
||||
fn sub_assign(&mut self, rhs: Duration) {
|
||||
self.0 -= rhs
|
||||
}
|
||||
}
|
||||
|
||||
fn duration_from_f64(millis: f64) -> Duration {
|
||||
Duration::from_millis(millis.trunc() as u64)
|
||||
+ Duration::from_nanos((millis.fract() * 1.0e6) as u64)
|
||||
}
|
||||
|
||||
#[cfg(all(feature = "stdweb", not(feature = "wasm-bindgen")))]
|
||||
#[allow(unused_results)] // Needed because the js macro triggers it.
|
||||
pub fn now() -> f64 {
|
||||
use stdweb::unstable::TryInto;
|
||||
|
||||
// https://developer.mozilla.org/en-US/docs/Web/API/Performance/now
|
||||
#[cfg(not(feature = "inaccurate"))]
|
||||
let v = js! { return performance.now(); };
|
||||
#[cfg(feature = "inaccurate")]
|
||||
let v = js! { return Date.now(); };
|
||||
v.try_into().unwrap()
|
||||
}
|
||||
|
||||
#[cfg(feature = "wasm-bindgen")]
|
||||
pub fn now() -> f64 {
|
||||
#[cfg(not(feature = "inaccurate"))]
|
||||
let now = {
|
||||
use wasm_bindgen_rs::prelude::*;
|
||||
use wasm_bindgen_rs::JsCast;
|
||||
js_sys::Reflect::get(&js_sys::global(), &JsValue::from_str("performance"))
|
||||
.expect("failed to get performance from global object")
|
||||
.unchecked_into::<web_sys::Performance>()
|
||||
.now()
|
||||
};
|
||||
#[cfg(feature = "inaccurate")]
|
||||
let now = js_sys::Date::now();
|
||||
now
|
||||
}
|
||||
|
||||
// The JS now function is in a module so it won't have to be renamed
|
||||
#[cfg(not(any(feature = "wasm-bindgen", feature = "stdweb")))]
|
||||
mod js {
|
||||
extern "C" {
|
||||
#[cfg(not(target_os = "emscripten"))]
|
||||
pub fn now() -> f64;
|
||||
#[cfg(target_os = "emscripten")]
|
||||
pub fn _emscripten_get_now() -> f64;
|
||||
}
|
||||
}
|
||||
// Make the unsafe extern function "safe" so it can be called like the other 'now' functions
|
||||
#[cfg(not(any(feature = "wasm-bindgen", feature = "stdweb")))]
|
||||
pub fn now() -> f64 {
|
||||
#[cfg(not(target_os = "emscripten"))]
|
||||
return unsafe { js::now() };
|
||||
#[cfg(target_os = "emscripten")]
|
||||
return unsafe { js::_emscripten_get_now() };
|
||||
}
|
||||
|
||||
/// Returns the number of millisecods elapsed since January 1, 1970 00:00:00 UTC.
|
||||
#[cfg(any(feature = "wasm-bindgen", feature = "stdweb"))]
|
||||
fn get_time() -> f64 {
|
||||
#[cfg(feature = "wasm-bindgen")]
|
||||
return js_sys::Date::now();
|
||||
#[cfg(all(feature = "stdweb", not(feature = "wasm-bindgen")))]
|
||||
{
|
||||
let v = js! { return Date.now(); };
|
||||
return v.try_into().unwrap();
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, Debug, PartialEq, PartialOrd)]
|
||||
pub struct SystemTime(f64);
|
||||
|
||||
impl SystemTime {
|
||||
pub const UNIX_EPOCH: SystemTime = SystemTime(0.0);
|
||||
|
||||
pub fn now() -> SystemTime {
|
||||
cfg_if::cfg_if! {
|
||||
if #[cfg(any(feature = "wasm-bindgen", feature = "stdweb"))] {
|
||||
SystemTime(get_time())
|
||||
} else {
|
||||
SystemTime(now())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub fn duration_since(&self, earlier: SystemTime) -> Result<Duration, ()> {
|
||||
let dur_ms = self.0 - earlier.0;
|
||||
if dur_ms < 0.0 {
|
||||
return Err(());
|
||||
}
|
||||
Ok(Duration::from_millis(dur_ms as u64))
|
||||
}
|
||||
|
||||
pub fn elapsed(&self) -> Result<Duration, ()> {
|
||||
self.duration_since(SystemTime::now())
|
||||
}
|
||||
|
||||
pub fn checked_add(&self, duration: Duration) -> Option<SystemTime> {
|
||||
Some(*self + duration)
|
||||
}
|
||||
|
||||
pub fn checked_sub(&self, duration: Duration) -> Option<SystemTime> {
|
||||
Some(*self - duration)
|
||||
}
|
||||
}
|
||||
|
||||
impl Add<Duration> for SystemTime {
|
||||
type Output = SystemTime;
|
||||
|
||||
fn add(self, other: Duration) -> SystemTime {
|
||||
SystemTime(self.0 + other.as_millis() as f64)
|
||||
}
|
||||
}
|
||||
|
||||
impl Sub<Duration> for SystemTime {
|
||||
type Output = SystemTime;
|
||||
|
||||
fn sub(self, other: Duration) -> SystemTime {
|
||||
SystemTime(self.0 - other.as_millis() as f64)
|
||||
}
|
||||
}
|
||||
|
||||
impl AddAssign<Duration> for SystemTime {
|
||||
fn add_assign(&mut self, rhs: Duration) {
|
||||
*self = *self + rhs;
|
||||
}
|
||||
}
|
||||
|
||||
impl SubAssign<Duration> for SystemTime {
|
||||
fn sub_assign(&mut self, rhs: Duration) {
|
||||
*self = *self - rhs;
|
||||
}
|
||||
}
|
57
vendor/instant/tests/wasm.rs
vendored
Normal file
57
vendor/instant/tests/wasm.rs
vendored
Normal file
@ -0,0 +1,57 @@
|
||||
extern crate wasm_bindgen_test;
|
||||
|
||||
use instant::{Instant, SystemTime};
|
||||
use std::time::Duration;
|
||||
use wasm_bindgen_test::*;
|
||||
|
||||
wasm_bindgen_test_configure!(run_in_browser);
|
||||
// run these tests using: wasm-pack test --chrome --headless -- --features wasm-bindgen
|
||||
|
||||
#[wasm_bindgen_test]
|
||||
fn test_instant_now() {
|
||||
let now = Instant::now();
|
||||
#[cfg(feature = "inaccurate")]
|
||||
while now.elapsed().as_millis() == 0 {}
|
||||
#[cfg(not(feature = "inaccurate"))]
|
||||
assert!(now.elapsed().as_nanos() > 0);
|
||||
}
|
||||
|
||||
#[wasm_bindgen_test]
|
||||
fn test_duration() {
|
||||
let now = Instant::now();
|
||||
let one_sec = Duration::from_secs(1);
|
||||
assert!(now.elapsed() < one_sec);
|
||||
}
|
||||
|
||||
// Duration::new will overflow when you have u64::MAX seconds and one billion nanoseconds.
|
||||
// <https://doc.rust-lang.org/std/time/struct.Duration.html#method.new>
|
||||
const ONE_BILLION: u32 = 1_000_000_000;
|
||||
|
||||
#[wasm_bindgen_test]
|
||||
fn test_checked_add() {
|
||||
let now = Instant::now();
|
||||
|
||||
assert!(now.checked_add(Duration::from_millis(1)).is_some());
|
||||
assert_eq!(
|
||||
None,
|
||||
now.checked_add(Duration::new(u64::MAX, ONE_BILLION - 1))
|
||||
);
|
||||
}
|
||||
|
||||
#[wasm_bindgen_test]
|
||||
fn test_checked_sub() {
|
||||
let now = Instant::now();
|
||||
|
||||
assert!(now.checked_sub(Duration::from_millis(1)).is_some());
|
||||
assert!(now
|
||||
.checked_sub(Duration::new(u64::MAX, ONE_BILLION - 1))
|
||||
.is_none());
|
||||
}
|
||||
|
||||
#[wasm_bindgen_test]
|
||||
fn test_system_time() {
|
||||
assert!(SystemTime::UNIX_EPOCH
|
||||
.duration_since(SystemTime::now())
|
||||
.is_err());
|
||||
}
|
||||
|
Reference in New Issue
Block a user