From f0a6f69e847bd0e96a115d29716f2e800f6aaa91 Mon Sep 17 00:00:00 2001 From: kl-botsu Date: Sun, 1 Sep 2024 20:19:10 +0000 Subject: [PATCH] =?UTF-8?q?Deploying=20to=20gh-pages=20from=20@=20khonsula?= =?UTF-8?q?bs/FunnyBones@2b4b2d01a9dbbb2f1c908a356668d4bf4a7af5f8=20?= =?UTF-8?q?=F0=9F=9A=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main/FunnyBones/all.html | 2 +- main/FunnyBones/enum.Mode.html | 4 +- main/FunnyBones/fn.add_bones_to_skeleton.html | 2 +- main/FunnyBones/fn.bone_editor.html | 2 +- main/FunnyBones/fn.bone_property_editor.html | 2 +- main/FunnyBones/fn.bones_editor.html | 2 +- main/FunnyBones/fn.main.html | 2 +- main/FunnyBones/fn.skeleton_editor.html | 2 +- main/FunnyBones/index.html | 2 +- main/FunnyBones/struct.ChangeAggregator.html | 4 +- main/FunnyBones/struct.EditingSkeleton.html | 4 +- main/FunnyBones/struct.SkeletalBone.html | 4 +- main/funnybones/all.html | 2 +- .../animation/enum.BoneProperty.html | 75 + .../animation/enum.JointProperty.html | 74 + ...angeKind.html => enum.PropertyUpdate.html} | 24 +- main/funnybones/animation/enum.Target.html | 81 + main/funnybones/animation/enum.Value.html | 80 + main/funnybones/animation/index.html | 2 +- main/funnybones/animation/sidebar-items.js | 2 +- .../animation/struct.Animation.html | 8 +- main/funnybones/animation/struct.Frame.html | 2498 +--------------- ...truct.Change.html => struct.Keyframe.html} | 16 +- .../animation/struct.RunningAnimation.html | 4 +- .../funnybones/animation/struct.Timeline.html | 2526 +++++++++++++++++ main/funnybones/cushy/index.html | 2 +- .../enum.SkeletonMutation.html | 4 +- .../cushy/skeleton_canvas/enum.Target.html | 4 +- .../cushy/skeleton_canvas/index.html | 2 +- .../struct.SkeletonCanvas.html | 2 +- main/funnybones/enum.BoneEnd.html | 16 +- main/funnybones/enum.BoneKind.html | 19 +- main/funnybones/index.html | 2 +- main/funnybones/struct.Angle.html | 8 +- main/funnybones/struct.Bone.html | 31 +- main/funnybones/struct.BoneAxis.html | 16 +- main/funnybones/struct.BoneId.html | 24 +- main/funnybones/struct.Coordinate.html | 8 +- main/funnybones/struct.Joint.html | 22 +- main/funnybones/struct.JointId.html | 20 +- main/funnybones/struct.LabeledBoneKind.html | 6 +- main/funnybones/struct.Skeleton.html | 40 +- main/funnybones/struct.Vector.html | 12 +- main/help.html | 2 +- main/search-index.js | 4 +- .../funnybones/funnybones-desc-0-.js | 2 +- main/settings.html | 2 +- main/src/FunnyBones/funnybones.rs.html | 2 +- main/src/funnybones/animation.rs.html | 902 +++++- main/src/funnybones/cushy.rs.html | 2 +- .../funnybones/cushy/skeleton_canvas.rs.html | 2 +- main/src/funnybones/lib.rs.html | 120 +- main/src/funnybones/serde.rs.html | 2 +- ...77c2d67d00.js => main-921df33f47b8780c.js} | 2 +- main/static.files/search-a99f1315e7cc5121.js | 5 + main/static.files/search-acd2e111c9cb27e3.js | 5 - main/trait.impl/core/clone/trait.Clone.js | 4 +- main/trait.impl/core/cmp/trait.Eq.js | 4 +- main/trait.impl/core/cmp/trait.Ord.js | 4 +- main/trait.impl/core/cmp/trait.PartialEq.js | 4 +- main/trait.impl/core/cmp/trait.PartialOrd.js | 4 +- main/trait.impl/core/convert/trait.From.js | 4 +- main/trait.impl/core/convert/trait.TryFrom.js | 9 + main/trait.impl/core/default/trait.Default.js | 4 +- main/trait.impl/core/fmt/trait.Debug.js | 4 +- main/trait.impl/core/marker/trait.Copy.js | 4 +- main/trait.impl/core/marker/trait.Freeze.js | 4 +- main/trait.impl/core/marker/trait.Send.js | 4 +- .../core/marker/trait.StructuralPartialEq.js | 4 +- main/trait.impl/core/marker/trait.Sync.js | 4 +- main/trait.impl/core/marker/trait.Unpin.js | 4 +- main/trait.impl/core/ops/arith/trait.Add.js | 4 +- main/trait.impl/core/ops/arith/trait.Sub.js | 4 +- main/trait.impl/core/ops/deref/trait.Deref.js | 4 +- .../core/ops/deref/trait.DerefMut.js | 4 +- .../panic/unwind_safe/trait.RefUnwindSafe.js | 4 +- .../panic/unwind_safe/trait.UnwindSafe.js | 4 +- main/trait.impl/serde/de/trait.Deserialize.js | 4 +- main/trait.impl/serde/ser/trait.Serialize.js | 4 +- 79 files changed, 3991 insertions(+), 2820 deletions(-) create mode 100644 main/funnybones/animation/enum.BoneProperty.html create mode 100644 main/funnybones/animation/enum.JointProperty.html rename main/funnybones/animation/{enum.ChangeKind.html => enum.PropertyUpdate.html} (73%) create mode 100644 main/funnybones/animation/enum.Target.html create mode 100644 main/funnybones/animation/enum.Value.html rename main/funnybones/animation/{struct.Change.html => struct.Keyframe.html} (75%) create mode 100644 main/funnybones/animation/struct.Timeline.html rename main/static.files/{main-cb0df477c2d67d00.js => main-921df33f47b8780c.js} (98%) create mode 100644 main/static.files/search-a99f1315e7cc5121.js delete mode 100644 main/static.files/search-acd2e111c9cb27e3.js create mode 100644 main/trait.impl/core/convert/trait.TryFrom.js diff --git a/main/FunnyBones/all.html b/main/FunnyBones/all.html index 863cd56..c2357f7 100644 --- a/main/FunnyBones/all.html +++ b/main/FunnyBones/all.html @@ -1 +1 @@ -List of all items in this crate
\ No newline at end of file +List of all items in this crate
\ No newline at end of file diff --git a/main/FunnyBones/enum.Mode.html b/main/FunnyBones/enum.Mode.html index 3c46917..b850b9e 100644 --- a/main/FunnyBones/enum.Mode.html +++ b/main/FunnyBones/enum.Mode.html @@ -1,4 +1,4 @@ -Mode in FunnyBones - Rust

Enum FunnyBones::Mode

source ·
pub(crate) enum Mode {
+Mode in FunnyBones - Rust

Enum FunnyBones::Mode

source ·
pub(crate) enum Mode {
     Bones,
     Animation,
 }

Variants§

§

Bones

§

Animation

Trait Implementations§

source§

impl Clone for Mode

source§

fn clone(&self) -> Mode

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for Mode

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Default for Mode

source§

fn default() -> Mode

Returns the “default value” for a type. Read more
source§

impl PartialEq for Mode

source§

fn eq(&self, other: &Mode) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, @@ -28,7 +28,7 @@ further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
§

fn as_any(&self) -> &(dyn Any + 'static)

Convert &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
§

impl<T> DowncastSync for T
where - T: Any + Send + Sync,

§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Sync + Send>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be + T: Any + Send + Sync,
§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where diff --git a/main/FunnyBones/fn.add_bones_to_skeleton.html b/main/FunnyBones/fn.add_bones_to_skeleton.html index afff583..1821b4d 100644 --- a/main/FunnyBones/fn.add_bones_to_skeleton.html +++ b/main/FunnyBones/fn.add_bones_to_skeleton.html @@ -1,4 +1,4 @@ -add_bones_to_skeleton in FunnyBones - Rust

Function FunnyBones::add_bones_to_skeleton

source ·
pub(crate) fn add_bones_to_skeleton(
+add_bones_to_skeleton in FunnyBones - Rust

Function FunnyBones::add_bones_to_skeleton

source ·
pub(crate) fn add_bones_to_skeleton(
     connected_to: BoneAxis,
     bones: &Dynamic<Vec<SkeletalBone>>,
     skeleton: &mut Skeleton,
diff --git a/main/FunnyBones/fn.bone_editor.html b/main/FunnyBones/fn.bone_editor.html
index e3dbe10..ddced23 100644
--- a/main/FunnyBones/fn.bone_editor.html
+++ b/main/FunnyBones/fn.bone_editor.html
@@ -1,4 +1,4 @@
-bone_editor in FunnyBones - Rust

Function FunnyBones::bone_editor

source ·
pub(crate) fn bone_editor(
+bone_editor in FunnyBones - Rust

Function FunnyBones::bone_editor

source ·
pub(crate) fn bone_editor(
     bone: SkeletalBone,
     watcher: &ChangeAggregator,
 ) -> impl MakeWidget
\ No newline at end of file diff --git a/main/FunnyBones/fn.bone_property_editor.html b/main/FunnyBones/fn.bone_property_editor.html index c833eab..6bd738b 100644 --- a/main/FunnyBones/fn.bone_property_editor.html +++ b/main/FunnyBones/fn.bone_property_editor.html @@ -1,4 +1,4 @@ -bone_property_editor in FunnyBones - Rust

Function FunnyBones::bone_property_editor

source ·
pub(crate) fn bone_property_editor(
+bone_property_editor in FunnyBones - Rust

Function FunnyBones::bone_property_editor

source ·
pub(crate) fn bone_property_editor(
     bone: SkeletalBone,
     watcher: &ChangeAggregator,
     is_root: bool,
diff --git a/main/FunnyBones/fn.bones_editor.html b/main/FunnyBones/fn.bones_editor.html
index 7e1138c..c9af819 100644
--- a/main/FunnyBones/fn.bones_editor.html
+++ b/main/FunnyBones/fn.bones_editor.html
@@ -1,4 +1,4 @@
-bones_editor in FunnyBones - Rust

Function FunnyBones::bones_editor

source ·
pub(crate) fn bones_editor(
+bones_editor in FunnyBones - Rust

Function FunnyBones::bones_editor

source ·
pub(crate) fn bones_editor(
     label: &str,
     bones: &Dynamic<Vec<SkeletalBone>>,
     watcher: &ChangeAggregator,
diff --git a/main/FunnyBones/fn.main.html b/main/FunnyBones/fn.main.html
index 43edbdf..97a9104 100644
--- a/main/FunnyBones/fn.main.html
+++ b/main/FunnyBones/fn.main.html
@@ -1 +1 @@
-main in FunnyBones - Rust

Function FunnyBones::main

source ·
pub(crate) fn main() -> Result
\ No newline at end of file +main in FunnyBones - Rust

Function FunnyBones::main

source ·
pub(crate) fn main() -> Result
\ No newline at end of file diff --git a/main/FunnyBones/fn.skeleton_editor.html b/main/FunnyBones/fn.skeleton_editor.html index 89d0375..f3b8da4 100644 --- a/main/FunnyBones/fn.skeleton_editor.html +++ b/main/FunnyBones/fn.skeleton_editor.html @@ -1,4 +1,4 @@ -skeleton_editor in FunnyBones - Rust

Function FunnyBones::skeleton_editor

source ·
pub(crate) fn skeleton_editor(
+skeleton_editor in FunnyBones - Rust

Function FunnyBones::skeleton_editor

source ·
pub(crate) fn skeleton_editor(
     skeleton: &EditingSkeleton,
     watcher: &ChangeAggregator,
 ) -> impl MakeWidget
\ No newline at end of file diff --git a/main/FunnyBones/index.html b/main/FunnyBones/index.html index a3191c5..a815c17 100644 --- a/main/FunnyBones/index.html +++ b/main/FunnyBones/index.html @@ -1,2 +1,2 @@ -FunnyBones - Rust

Crate FunnyBones

source ·
Expand description

The FunnyBones 2D Animation Editor.

+FunnyBones - Rust

Crate FunnyBones

source ·
Expand description

The FunnyBones 2D Animation Editor.

Structs§

Enums§

Functions§

\ No newline at end of file diff --git a/main/FunnyBones/struct.ChangeAggregator.html b/main/FunnyBones/struct.ChangeAggregator.html index 2764d01..74a178b 100644 --- a/main/FunnyBones/struct.ChangeAggregator.html +++ b/main/FunnyBones/struct.ChangeAggregator.html @@ -1,4 +1,4 @@ -ChangeAggregator in FunnyBones - Rust

Struct FunnyBones::ChangeAggregator

source ·
pub(crate) struct ChangeAggregator(pub(crate) Dynamic<usize>);

Tuple Fields§

§0: Dynamic<usize>

Implementations§

source§

impl ChangeAggregator

source

pub fn new<F, T>(when_changed: F) -> (Self, Dynamic<T>)
where +ChangeAggregator in FunnyBones - Rust

Struct FunnyBones::ChangeAggregator

source ·
pub(crate) struct ChangeAggregator(pub(crate) Dynamic<usize>);

Tuple Fields§

§0: Dynamic<usize>

Implementations§

source§

impl ChangeAggregator

source

pub fn new<F, T>(when_changed: F) -> (Self, Dynamic<T>)
where F: FnMut() -> T + Send + 'static, T: PartialEq + Send + 'static,

source

pub fn watch<T>(&self, other: &Dynamic<T>)
where T: Send + 'static,

Trait Implementations§

source§

impl Clone for ChangeAggregator

source§

fn clone(&self) -> ChangeAggregator

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for ChangeAggregator

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for S
where @@ -27,7 +27,7 @@ further downcast into Rc<ConcreteType> where ConcreteType implements Trait.

§

fn as_any(&self) -> &(dyn Any + 'static)

Convert &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.

§

impl<T> DowncastSync for T
where - T: Any + Send + Sync,

§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Sync + Send>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be + T: Any + Send + Sync,

§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T> FromAngle<T> for T

source§

fn from_angle(angle: T) -> T

Performs a conversion from angle.
source§

impl<T, U> FromStimulus<U> for T
where U: IntoStimulus<T>,

source§

fn from_stimulus(other: U) -> T

Converts other into Self, while performing the appropriate scaling, diff --git a/main/FunnyBones/struct.EditingSkeleton.html b/main/FunnyBones/struct.EditingSkeleton.html index 2de09e1..c702fd9 100644 --- a/main/FunnyBones/struct.EditingSkeleton.html +++ b/main/FunnyBones/struct.EditingSkeleton.html @@ -1,4 +1,4 @@ -EditingSkeleton in FunnyBones - Rust

Struct FunnyBones::EditingSkeleton

source ·
pub(crate) struct EditingSkeleton {
+EditingSkeleton in FunnyBones - Rust

Struct FunnyBones::EditingSkeleton

source ·
pub(crate) struct EditingSkeleton {
     pub(crate) root: SkeletalBone,
     pub(crate) a_bones: Dynamic<Vec<SkeletalBone>>,
 }

Fields§

§root: SkeletalBone§a_bones: Dynamic<Vec<SkeletalBone>>

Implementations§

source§

impl EditingSkeleton

source

pub(crate) fn find_bone(&self, id: BoneId) -> Option<SkeletalBone>

source

pub(crate) fn find_bone_in( @@ -34,7 +34,7 @@ further downcast into Rc<ConcreteType> where ConcreteType implements Trait.

§

fn as_any(&self) -> &(dyn Any + 'static)

Convert &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
§

impl<T> DowncastSync for T
where - T: Any + Send + Sync,

§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Sync + Send>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be + T: Any + Send + Sync,
§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T> FromAngle<T> for T

source§

fn from_angle(angle: T) -> T

Performs a conversion from angle.
source§

impl<T, U> FromStimulus<U> for T
where U: IntoStimulus<T>,

source§

fn from_stimulus(other: U) -> T

Converts other into Self, while performing the appropriate scaling, diff --git a/main/FunnyBones/struct.SkeletalBone.html b/main/FunnyBones/struct.SkeletalBone.html index 26b9497..6ffc048 100644 --- a/main/FunnyBones/struct.SkeletalBone.html +++ b/main/FunnyBones/struct.SkeletalBone.html @@ -1,4 +1,4 @@ -SkeletalBone in FunnyBones - Rust

Struct FunnyBones::SkeletalBone

source ·
pub(crate) struct SkeletalBone {
+SkeletalBone in FunnyBones - Rust

Struct FunnyBones::SkeletalBone

source ·
pub(crate) struct SkeletalBone {
     pub(crate) label: Dynamic<String>,
     pub(crate) joint_label: Dynamic<String>,
     pub(crate) joint_angle: Dynamic<Angle>,
@@ -34,7 +34,7 @@
 further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
§

fn as_any(&self) -> &(dyn Any + 'static)

Convert &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
§

impl<T> DowncastSync for T
where - T: Any + Send + Sync,

§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Sync + Send>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be + T: Any + Send + Sync,
§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T> FromAngle<T> for T

source§

fn from_angle(angle: T) -> T

Performs a conversion from angle.
source§

impl<T, U> FromStimulus<U> for T
where U: IntoStimulus<T>,

source§

fn from_stimulus(other: U) -> T

Converts other into Self, while performing the appropriate scaling, diff --git a/main/funnybones/all.html b/main/funnybones/all.html index 467df66..543016b 100644 --- a/main/funnybones/all.html +++ b/main/funnybones/all.html @@ -1 +1 @@ -List of all items in this crate
\ No newline at end of file +List of all items in this crate
\ No newline at end of file diff --git a/main/funnybones/animation/enum.BoneProperty.html b/main/funnybones/animation/enum.BoneProperty.html new file mode 100644 index 0000000..d1de06b --- /dev/null +++ b/main/funnybones/animation/enum.BoneProperty.html @@ -0,0 +1,75 @@ +BoneProperty in funnybones::animation - Rust

Enum funnybones::animation::BoneProperty

source ·
pub enum BoneProperty {
+    Target,
+    Inverse,
+}

Variants§

§

Target

§

Inverse

Implementations§

source§

impl BoneProperty

source

pub fn get(&self, bone: &Bone) -> Value

source

pub fn update(&self, value: Value, bone: &mut Bone)

Trait Implementations§

source§

impl Clone for BoneProperty

source§

fn clone(&self) -> BoneProperty

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for BoneProperty

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'de> Deserialize<'de> for BoneProperty

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl PartialEq for BoneProperty

source§

fn eq(&self, other: &BoneProperty) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
source§

impl Serialize for BoneProperty

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl StructuralPartialEq for BoneProperty

Auto Trait Implementations§

Blanket Implementations§

source§

impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for S
where + T: Real + Zero + Arithmetics + Clone, + Swp: WhitePoint<T>, + Dwp: WhitePoint<T>, + D: AdaptFrom<S, Swp, Dwp, T>,

source§

fn adapt_into_using<M>(self, method: M) -> D
where + M: TransformMatrix<T>,

Convert the source color to the destination color using the specified +method.
source§

fn adapt_into(self) -> D

Convert the source color to the destination color using the bradford +method by default.
source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T, C> ArraysFrom<C> for T
where + C: IntoArrays<T>,

source§

fn arrays_from(colors: C) -> T

Cast a collection of colors into a collection of arrays.
source§

impl<T, C> ArraysInto<C> for T
where + C: FromArrays<T>,

source§

fn arrays_into(self) -> C

Cast this collection of arrays into a collection of colors.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<WpParam, T, U> Cam16IntoUnclamped<WpParam, T> for U
where + T: FromCam16Unclamped<WpParam, U>,

source§

type Scalar = <T as FromCam16Unclamped<WpParam, U>>::Scalar

The number type that’s used in parameters when converting.
source§

fn cam16_into_unclamped( + self, + parameters: BakedParameters<WpParam, <U as Cam16IntoUnclamped<WpParam, T>>::Scalar>, +) -> T

Converts self into C, using the provided parameters.
§

impl<A> Cast for A

§

fn cast<To>(self) -> To
where + To: CastFrom<A>,

Casts self to the To type. This may be a lossy operation.
§

impl<A> CastFrom<A> for A

§

fn from_cast(from: A) -> A

Returns from as Self.
§

impl<A, B> CastInto<A> for B
where + A: CastFrom<B>,

§

fn cast_into(self) -> A

Returns self as To.
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T, C> ComponentsFrom<C> for T
where + C: IntoComponents<T>,

source§

fn components_from(colors: C) -> T

Cast a collection of colors into a collection of color components.
§

impl<T> Downcast<T> for T

§

fn downcast(&self) -> &T

§

impl<T> Downcast for T
where + T: Any,

§

fn into_any(self: Box<T>) -> Box<dyn Any>

Convert Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can +then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.
§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Convert Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be +further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
§

fn as_any(&self) -> &(dyn Any + 'static)

Convert &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot +generate &Any’s vtable from &Trait’s.
§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot +generate &mut Any’s vtable from &mut Trait’s.
§

impl<T> DowncastSync for T
where + T: Any + Send + Sync,

§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be +further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T> FromAngle<T> for T

source§

fn from_angle(angle: T) -> T

Performs a conversion from angle.
source§

impl<T, U> FromStimulus<U> for T
where + U: IntoStimulus<T>,

source§

fn from_stimulus(other: U) -> T

Converts other into Self, while performing the appropriate scaling, +rounding and clamping.
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T, U> IntoAngle<U> for T
where + U: FromAngle<T>,

source§

fn into_angle(self) -> U

Performs a conversion into T.
source§

impl<WpParam, T, U> IntoCam16Unclamped<WpParam, T> for U
where + T: Cam16FromUnclamped<WpParam, U>,

source§

type Scalar = <T as Cam16FromUnclamped<WpParam, U>>::Scalar

The number type that’s used in parameters when converting.
source§

fn into_cam16_unclamped( + self, + parameters: BakedParameters<WpParam, <U as IntoCam16Unclamped<WpParam, T>>::Scalar>, +) -> T

Converts self into C, using the provided parameters.
source§

impl<T, U> IntoColor<U> for T
where + U: FromColor<T>,

source§

fn into_color(self) -> U

Convert into T with values clamped to the color defined bounds Read more
source§

impl<T, U> IntoColorUnclamped<U> for T
where + U: FromColorUnclamped<T>,

source§

fn into_color_unclamped(self) -> U

Convert into T. The resulting color might be invalid in its color space Read more
source§

impl<T> IntoEither for T

source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<T> IntoReadOnly<T> for T

§

fn into_read_only(self) -> ReadOnly<T>

Returns self as a ReadOnly.
source§

impl<T> IntoStimulus<T> for T

source§

fn into_stimulus(self) -> T

Converts self into T, while performing the appropriate scaling, +rounding and clamping.
§

impl<T> IntoValue<Option<T>> for T

§

fn into_value(self) -> Value<Option<T>>

Returns this type as a [Value].
§

impl<T> IntoValue<T> for T

§

fn into_value(self) -> Value<T>

Returns this type as a [Value].
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
source§

impl<T> ToOwned for T
where + T: Clone,

source§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, C> TryComponentsInto<C> for T
where + C: TryFromComponents<T>,

source§

type Error = <C as TryFromComponents<T>>::Error

The error for when try_into_colors fails to cast.
source§

fn try_components_into(self) -> Result<C, <T as TryComponentsInto<C>>::Error>

Try to cast this collection of color components into a collection of +colors. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

source§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
source§

impl<T, U> TryIntoColor<U> for T
where + U: TryFromColor<T>,

source§

fn try_into_color(self) -> Result<U, OutOfBounds<U>>

Convert into T, returning ok if the color is inside of its defined +range, otherwise an OutOfBounds error is returned which contains +the unclamped color. Read more
source§

impl<C, U> UintsFrom<C> for U
where + C: IntoUints<U>,

source§

fn uints_from(colors: C) -> U

Cast a collection of colors into a collection of unsigned integers.
source§

impl<C, U> UintsInto<C> for U
where + C: FromUints<U>,

source§

fn uints_into(self) -> C

Cast this collection of unsigned integers into a collection of colors.
§

impl<T> Upcast<T> for T

§

fn upcast(&self) -> Option<&T>

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

§

impl<T> WasmNotSend for T
where + T: Send,

§

impl<T> WasmNotSendSync for T
where + T: WasmNotSend + WasmNotSync,

§

impl<T> WasmNotSync for T
where + T: Sync,

\ No newline at end of file diff --git a/main/funnybones/animation/enum.JointProperty.html b/main/funnybones/animation/enum.JointProperty.html new file mode 100644 index 0000000..10494e9 --- /dev/null +++ b/main/funnybones/animation/enum.JointProperty.html @@ -0,0 +1,74 @@ +JointProperty in funnybones::animation - Rust

Enum funnybones::animation::JointProperty

source ·
pub enum JointProperty {
+    Angle,
+}

Variants§

§

Angle

Implementations§

source§

impl JointProperty

source

pub fn get(&self, joint: &Joint) -> Value

source

pub fn update(&self, value: Value, joint: &mut Joint)

Trait Implementations§

source§

impl Clone for JointProperty

source§

fn clone(&self) -> JointProperty

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for JointProperty

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'de> Deserialize<'de> for JointProperty

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl PartialEq for JointProperty

source§

fn eq(&self, other: &JointProperty) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
source§

impl Serialize for JointProperty

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl StructuralPartialEq for JointProperty

Auto Trait Implementations§

Blanket Implementations§

source§

impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for S
where + T: Real + Zero + Arithmetics + Clone, + Swp: WhitePoint<T>, + Dwp: WhitePoint<T>, + D: AdaptFrom<S, Swp, Dwp, T>,

source§

fn adapt_into_using<M>(self, method: M) -> D
where + M: TransformMatrix<T>,

Convert the source color to the destination color using the specified +method.
source§

fn adapt_into(self) -> D

Convert the source color to the destination color using the bradford +method by default.
source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T, C> ArraysFrom<C> for T
where + C: IntoArrays<T>,

source§

fn arrays_from(colors: C) -> T

Cast a collection of colors into a collection of arrays.
source§

impl<T, C> ArraysInto<C> for T
where + C: FromArrays<T>,

source§

fn arrays_into(self) -> C

Cast this collection of arrays into a collection of colors.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<WpParam, T, U> Cam16IntoUnclamped<WpParam, T> for U
where + T: FromCam16Unclamped<WpParam, U>,

source§

type Scalar = <T as FromCam16Unclamped<WpParam, U>>::Scalar

The number type that’s used in parameters when converting.
source§

fn cam16_into_unclamped( + self, + parameters: BakedParameters<WpParam, <U as Cam16IntoUnclamped<WpParam, T>>::Scalar>, +) -> T

Converts self into C, using the provided parameters.
§

impl<A> Cast for A

§

fn cast<To>(self) -> To
where + To: CastFrom<A>,

Casts self to the To type. This may be a lossy operation.
§

impl<A> CastFrom<A> for A

§

fn from_cast(from: A) -> A

Returns from as Self.
§

impl<A, B> CastInto<A> for B
where + A: CastFrom<B>,

§

fn cast_into(self) -> A

Returns self as To.
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T, C> ComponentsFrom<C> for T
where + C: IntoComponents<T>,

source§

fn components_from(colors: C) -> T

Cast a collection of colors into a collection of color components.
§

impl<T> Downcast<T> for T

§

fn downcast(&self) -> &T

§

impl<T> Downcast for T
where + T: Any,

§

fn into_any(self: Box<T>) -> Box<dyn Any>

Convert Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can +then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.
§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Convert Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be +further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
§

fn as_any(&self) -> &(dyn Any + 'static)

Convert &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot +generate &Any’s vtable from &Trait’s.
§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot +generate &mut Any’s vtable from &mut Trait’s.
§

impl<T> DowncastSync for T
where + T: Any + Send + Sync,

§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be +further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T> FromAngle<T> for T

source§

fn from_angle(angle: T) -> T

Performs a conversion from angle.
source§

impl<T, U> FromStimulus<U> for T
where + U: IntoStimulus<T>,

source§

fn from_stimulus(other: U) -> T

Converts other into Self, while performing the appropriate scaling, +rounding and clamping.
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T, U> IntoAngle<U> for T
where + U: FromAngle<T>,

source§

fn into_angle(self) -> U

Performs a conversion into T.
source§

impl<WpParam, T, U> IntoCam16Unclamped<WpParam, T> for U
where + T: Cam16FromUnclamped<WpParam, U>,

source§

type Scalar = <T as Cam16FromUnclamped<WpParam, U>>::Scalar

The number type that’s used in parameters when converting.
source§

fn into_cam16_unclamped( + self, + parameters: BakedParameters<WpParam, <U as IntoCam16Unclamped<WpParam, T>>::Scalar>, +) -> T

Converts self into C, using the provided parameters.
source§

impl<T, U> IntoColor<U> for T
where + U: FromColor<T>,

source§

fn into_color(self) -> U

Convert into T with values clamped to the color defined bounds Read more
source§

impl<T, U> IntoColorUnclamped<U> for T
where + U: FromColorUnclamped<T>,

source§

fn into_color_unclamped(self) -> U

Convert into T. The resulting color might be invalid in its color space Read more
source§

impl<T> IntoEither for T

source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<T> IntoReadOnly<T> for T

§

fn into_read_only(self) -> ReadOnly<T>

Returns self as a ReadOnly.
source§

impl<T> IntoStimulus<T> for T

source§

fn into_stimulus(self) -> T

Converts self into T, while performing the appropriate scaling, +rounding and clamping.
§

impl<T> IntoValue<Option<T>> for T

§

fn into_value(self) -> Value<Option<T>>

Returns this type as a [Value].
§

impl<T> IntoValue<T> for T

§

fn into_value(self) -> Value<T>

Returns this type as a [Value].
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
source§

impl<T> ToOwned for T
where + T: Clone,

source§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, C> TryComponentsInto<C> for T
where + C: TryFromComponents<T>,

source§

type Error = <C as TryFromComponents<T>>::Error

The error for when try_into_colors fails to cast.
source§

fn try_components_into(self) -> Result<C, <T as TryComponentsInto<C>>::Error>

Try to cast this collection of color components into a collection of +colors. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

source§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
source§

impl<T, U> TryIntoColor<U> for T
where + U: TryFromColor<T>,

source§

fn try_into_color(self) -> Result<U, OutOfBounds<U>>

Convert into T, returning ok if the color is inside of its defined +range, otherwise an OutOfBounds error is returned which contains +the unclamped color. Read more
source§

impl<C, U> UintsFrom<C> for U
where + C: IntoUints<U>,

source§

fn uints_from(colors: C) -> U

Cast a collection of colors into a collection of unsigned integers.
source§

impl<C, U> UintsInto<C> for U
where + C: FromUints<U>,

source§

fn uints_into(self) -> C

Cast this collection of unsigned integers into a collection of colors.
§

impl<T> Upcast<T> for T

§

fn upcast(&self) -> Option<&T>

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

§

impl<T> WasmNotSend for T
where + T: Send,

§

impl<T> WasmNotSendSync for T
where + T: WasmNotSend + WasmNotSync,

§

impl<T> WasmNotSync for T
where + T: Sync,

\ No newline at end of file diff --git a/main/funnybones/animation/enum.ChangeKind.html b/main/funnybones/animation/enum.PropertyUpdate.html similarity index 73% rename from main/funnybones/animation/enum.ChangeKind.html rename to main/funnybones/animation/enum.PropertyUpdate.html index 9130b34..c4e582e 100644 --- a/main/funnybones/animation/enum.ChangeKind.html +++ b/main/funnybones/animation/enum.PropertyUpdate.html @@ -1,16 +1,10 @@ -ChangeKind in funnybones::animation - Rust

Enum funnybones::animation::ChangeKind

source ·
pub enum ChangeKind {
-    Bone {
-        bone: BoneId,
-        position: Vector,
-    },
-    Joint {
-        joint: JointId,
-        rotation: Angle,
-    },
-}

Variants§

§

Bone

Fields

§bone: BoneId
§position: Vector
§

Joint

Fields

§joint: JointId
§rotation: Angle

Implementations§

source§

impl ChangeKind

source

pub const fn with_easing(self, easing: StandardEasing) -> Change

Trait Implementations§

source§

impl Clone for ChangeKind

source§

fn clone(&self) -> ChangeKind

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for ChangeKind

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'de> Deserialize<'de> for ChangeKind

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where - __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl From<ChangeKind> for Change

source§

fn from(kind: ChangeKind) -> Self

Converts to this type from the input type.
source§

impl PartialEq for ChangeKind

source§

fn eq(&self, other: &ChangeKind) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, -and should not be overridden without very good reason.
source§

impl Serialize for ChangeKind

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where - __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Copy for ChangeKind

source§

impl StructuralPartialEq for ChangeKind

Auto Trait Implementations§

Blanket Implementations§

source§

impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for S
where +PropertyUpdate in funnybones::animation - Rust

Enum funnybones::animation::PropertyUpdate

source ·
pub enum PropertyUpdate {
+    ChangeTo(Value),
+    Add(Value),
+}

Variants§

§

ChangeTo(Value)

§

Add(Value)

Implementations§

source§

impl PropertyUpdate

source

pub fn target(&self, initial: Value) -> Value

Trait Implementations§

source§

impl Clone for PropertyUpdate

source§

fn clone(&self) -> PropertyUpdate

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for PropertyUpdate

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'de> Deserialize<'de> for PropertyUpdate

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl PartialEq for PropertyUpdate

source§

fn eq(&self, other: &PropertyUpdate) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
source§

impl Serialize for PropertyUpdate

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Copy for PropertyUpdate

source§

impl StructuralPartialEq for PropertyUpdate

Auto Trait Implementations§

Blanket Implementations§

source§

impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for S
where T: Real + Zero + Arithmetics + Clone, Swp: WhitePoint<T>, Dwp: WhitePoint<T>, @@ -36,8 +30,8 @@ further downcast into Rc<ConcreteType> where ConcreteType implements Trait.

§

fn as_any(&self) -> &(dyn Any + 'static)

Convert &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.

§

impl<T> DowncastSync for T
where - T: Any + Send + Sync,

§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Sync + Send>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be -further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+ T: Any + Send + Sync,
§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be +further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T> FromAngle<T> for T

source§

fn from_angle(angle: T) -> T

Performs a conversion from angle.
source§

impl<T, U> FromStimulus<U> for T
where U: IntoStimulus<T>,

source§

fn from_stimulus(other: U) -> T

Converts other into Self, while performing the appropriate scaling, rounding and clamping.
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an diff --git a/main/funnybones/animation/enum.Target.html b/main/funnybones/animation/enum.Target.html new file mode 100644 index 0000000..e0b1b46 --- /dev/null +++ b/main/funnybones/animation/enum.Target.html @@ -0,0 +1,81 @@ +Target in funnybones::animation - Rust

Enum funnybones::animation::Target

source ·
pub enum Target {
+    Bone {
+        bone: BoneId,
+        property: BoneProperty,
+    },
+    Joint {
+        joint: JointId,
+        property: JointProperty,
+    },
+}

Variants§

§

Bone

Fields

§bone: BoneId
§property: BoneProperty
§

Joint

Fields

§joint: JointId
§property: JointProperty

Implementations§

source§

impl Target

source

pub fn get(&self, skeleton: &Skeleton) -> Value

source

pub fn update(&self, value: Value, skeleton: &mut Skeleton)

Trait Implementations§

source§

impl Clone for Target

source§

fn clone(&self) -> Target

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for Target

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'de> Deserialize<'de> for Target

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl PartialEq for Target

source§

fn eq(&self, other: &Target) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
source§

impl Serialize for Target

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl StructuralPartialEq for Target

Auto Trait Implementations§

§

impl Freeze for Target

§

impl RefUnwindSafe for Target

§

impl Send for Target

§

impl Sync for Target

§

impl Unpin for Target

§

impl UnwindSafe for Target

Blanket Implementations§

source§

impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for S
where + T: Real + Zero + Arithmetics + Clone, + Swp: WhitePoint<T>, + Dwp: WhitePoint<T>, + D: AdaptFrom<S, Swp, Dwp, T>,

source§

fn adapt_into_using<M>(self, method: M) -> D
where + M: TransformMatrix<T>,

Convert the source color to the destination color using the specified +method.
source§

fn adapt_into(self) -> D

Convert the source color to the destination color using the bradford +method by default.
source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T, C> ArraysFrom<C> for T
where + C: IntoArrays<T>,

source§

fn arrays_from(colors: C) -> T

Cast a collection of colors into a collection of arrays.
source§

impl<T, C> ArraysInto<C> for T
where + C: FromArrays<T>,

source§

fn arrays_into(self) -> C

Cast this collection of arrays into a collection of colors.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<WpParam, T, U> Cam16IntoUnclamped<WpParam, T> for U
where + T: FromCam16Unclamped<WpParam, U>,

source§

type Scalar = <T as FromCam16Unclamped<WpParam, U>>::Scalar

The number type that’s used in parameters when converting.
source§

fn cam16_into_unclamped( + self, + parameters: BakedParameters<WpParam, <U as Cam16IntoUnclamped<WpParam, T>>::Scalar>, +) -> T

Converts self into C, using the provided parameters.
§

impl<A> Cast for A

§

fn cast<To>(self) -> To
where + To: CastFrom<A>,

Casts self to the To type. This may be a lossy operation.
§

impl<A> CastFrom<A> for A

§

fn from_cast(from: A) -> A

Returns from as Self.
§

impl<A, B> CastInto<A> for B
where + A: CastFrom<B>,

§

fn cast_into(self) -> A

Returns self as To.
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T, C> ComponentsFrom<C> for T
where + C: IntoComponents<T>,

source§

fn components_from(colors: C) -> T

Cast a collection of colors into a collection of color components.
§

impl<T> Downcast<T> for T

§

fn downcast(&self) -> &T

§

impl<T> Downcast for T
where + T: Any,

§

fn into_any(self: Box<T>) -> Box<dyn Any>

Convert Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can +then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.
§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Convert Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be +further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
§

fn as_any(&self) -> &(dyn Any + 'static)

Convert &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot +generate &Any’s vtable from &Trait’s.
§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot +generate &mut Any’s vtable from &mut Trait’s.
§

impl<T> DowncastSync for T
where + T: Any + Send + Sync,

§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be +further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T> FromAngle<T> for T

source§

fn from_angle(angle: T) -> T

Performs a conversion from angle.
source§

impl<T, U> FromStimulus<U> for T
where + U: IntoStimulus<T>,

source§

fn from_stimulus(other: U) -> T

Converts other into Self, while performing the appropriate scaling, +rounding and clamping.
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T, U> IntoAngle<U> for T
where + U: FromAngle<T>,

source§

fn into_angle(self) -> U

Performs a conversion into T.
source§

impl<WpParam, T, U> IntoCam16Unclamped<WpParam, T> for U
where + T: Cam16FromUnclamped<WpParam, U>,

source§

type Scalar = <T as Cam16FromUnclamped<WpParam, U>>::Scalar

The number type that’s used in parameters when converting.
source§

fn into_cam16_unclamped( + self, + parameters: BakedParameters<WpParam, <U as IntoCam16Unclamped<WpParam, T>>::Scalar>, +) -> T

Converts self into C, using the provided parameters.
source§

impl<T, U> IntoColor<U> for T
where + U: FromColor<T>,

source§

fn into_color(self) -> U

Convert into T with values clamped to the color defined bounds Read more
source§

impl<T, U> IntoColorUnclamped<U> for T
where + U: FromColorUnclamped<T>,

source§

fn into_color_unclamped(self) -> U

Convert into T. The resulting color might be invalid in its color space Read more
source§

impl<T> IntoEither for T

source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<T> IntoReadOnly<T> for T

§

fn into_read_only(self) -> ReadOnly<T>

Returns self as a ReadOnly.
source§

impl<T> IntoStimulus<T> for T

source§

fn into_stimulus(self) -> T

Converts self into T, while performing the appropriate scaling, +rounding and clamping.
§

impl<T> IntoValue<Option<T>> for T

§

fn into_value(self) -> Value<Option<T>>

Returns this type as a [Value].
§

impl<T> IntoValue<T> for T

§

fn into_value(self) -> Value<T>

Returns this type as a [Value].
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
source§

impl<T> ToOwned for T
where + T: Clone,

source§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, C> TryComponentsInto<C> for T
where + C: TryFromComponents<T>,

source§

type Error = <C as TryFromComponents<T>>::Error

The error for when try_into_colors fails to cast.
source§

fn try_components_into(self) -> Result<C, <T as TryComponentsInto<C>>::Error>

Try to cast this collection of color components into a collection of +colors. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

source§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
source§

impl<T, U> TryIntoColor<U> for T
where + U: TryFromColor<T>,

source§

fn try_into_color(self) -> Result<U, OutOfBounds<U>>

Convert into T, returning ok if the color is inside of its defined +range, otherwise an OutOfBounds error is returned which contains +the unclamped color. Read more
source§

impl<C, U> UintsFrom<C> for U
where + C: IntoUints<U>,

source§

fn uints_from(colors: C) -> U

Cast a collection of colors into a collection of unsigned integers.
source§

impl<C, U> UintsInto<C> for U
where + C: FromUints<U>,

source§

fn uints_into(self) -> C

Cast this collection of unsigned integers into a collection of colors.
§

impl<T> Upcast<T> for T

§

fn upcast(&self) -> Option<&T>

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

§

impl<T> WasmNotSend for T
where + T: Send,

§

impl<T> WasmNotSendSync for T
where + T: WasmNotSend + WasmNotSync,

§

impl<T> WasmNotSync for T
where + T: Sync,

\ No newline at end of file diff --git a/main/funnybones/animation/enum.Value.html b/main/funnybones/animation/enum.Value.html new file mode 100644 index 0000000..475a493 --- /dev/null +++ b/main/funnybones/animation/enum.Value.html @@ -0,0 +1,80 @@ +Value in funnybones::animation - Rust

Enum funnybones::animation::Value

source ·
pub enum Value {
+    Invalid,
+    Number(f32),
+    Vector(Vector),
+    Bool(bool),
+}

Variants§

§

Invalid

§

Number(f32)

§

Vector(Vector)

§

Bool(bool)

Trait Implementations§

source§

impl Add for Value

source§

type Output = Value

The resulting type after applying the + operator.
source§

fn add(self, rhs: Self) -> Self::Output

Performs the + operation. Read more
source§

impl Clone for Value

source§

fn clone(&self) -> Value

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for Value

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'de> Deserialize<'de> for Value

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl From<Vector> for Value

source§

fn from(value: Vector) -> Self

Converts to this type from the input type.
source§

impl From<bool> for Value

source§

fn from(value: bool) -> Self

Converts to this type from the input type.
source§

impl From<f32> for Value

source§

fn from(value: f32) -> Self

Converts to this type from the input type.
source§

impl PartialEq for Value

source§

fn eq(&self, other: &Value) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
source§

impl Serialize for Value

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Copy for Value

source§

impl StructuralPartialEq for Value

Auto Trait Implementations§

§

impl Freeze for Value

§

impl RefUnwindSafe for Value

§

impl Send for Value

§

impl Sync for Value

§

impl Unpin for Value

§

impl UnwindSafe for Value

Blanket Implementations§

source§

impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for S
where + T: Real + Zero + Arithmetics + Clone, + Swp: WhitePoint<T>, + Dwp: WhitePoint<T>, + D: AdaptFrom<S, Swp, Dwp, T>,

source§

fn adapt_into_using<M>(self, method: M) -> D
where + M: TransformMatrix<T>,

Convert the source color to the destination color using the specified +method.
source§

fn adapt_into(self) -> D

Convert the source color to the destination color using the bradford +method by default.
source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T, C> ArraysFrom<C> for T
where + C: IntoArrays<T>,

source§

fn arrays_from(colors: C) -> T

Cast a collection of colors into a collection of arrays.
source§

impl<T, C> ArraysInto<C> for T
where + C: FromArrays<T>,

source§

fn arrays_into(self) -> C

Cast this collection of arrays into a collection of colors.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<WpParam, T, U> Cam16IntoUnclamped<WpParam, T> for U
where + T: FromCam16Unclamped<WpParam, U>,

source§

type Scalar = <T as FromCam16Unclamped<WpParam, U>>::Scalar

The number type that’s used in parameters when converting.
source§

fn cam16_into_unclamped( + self, + parameters: BakedParameters<WpParam, <U as Cam16IntoUnclamped<WpParam, T>>::Scalar>, +) -> T

Converts self into C, using the provided parameters.
§

impl<A> Cast for A

§

fn cast<To>(self) -> To
where + To: CastFrom<A>,

Casts self to the To type. This may be a lossy operation.
§

impl<A> CastFrom<A> for A

§

fn from_cast(from: A) -> A

Returns from as Self.
§

impl<A, B> CastInto<A> for B
where + A: CastFrom<B>,

§

fn cast_into(self) -> A

Returns self as To.
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T, C> ComponentsFrom<C> for T
where + C: IntoComponents<T>,

source§

fn components_from(colors: C) -> T

Cast a collection of colors into a collection of color components.
§

impl<T> Downcast<T> for T

§

fn downcast(&self) -> &T

§

impl<T> Downcast for T
where + T: Any,

§

fn into_any(self: Box<T>) -> Box<dyn Any>

Convert Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can +then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.
§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Convert Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be +further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
§

fn as_any(&self) -> &(dyn Any + 'static)

Convert &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot +generate &Any’s vtable from &Trait’s.
§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot +generate &mut Any’s vtable from &mut Trait’s.
§

impl<T> DowncastSync for T
where + T: Any + Send + Sync,

§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be +further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T> FromAngle<T> for T

source§

fn from_angle(angle: T) -> T

Performs a conversion from angle.
source§

impl<T, U> FromStimulus<U> for T
where + U: IntoStimulus<T>,

source§

fn from_stimulus(other: U) -> T

Converts other into Self, while performing the appropriate scaling, +rounding and clamping.
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T, U> IntoAngle<U> for T
where + U: FromAngle<T>,

source§

fn into_angle(self) -> U

Performs a conversion into T.
source§

impl<WpParam, T, U> IntoCam16Unclamped<WpParam, T> for U
where + T: Cam16FromUnclamped<WpParam, U>,

source§

type Scalar = <T as Cam16FromUnclamped<WpParam, U>>::Scalar

The number type that’s used in parameters when converting.
source§

fn into_cam16_unclamped( + self, + parameters: BakedParameters<WpParam, <U as IntoCam16Unclamped<WpParam, T>>::Scalar>, +) -> T

Converts self into C, using the provided parameters.
source§

impl<T, U> IntoColor<U> for T
where + U: FromColor<T>,

source§

fn into_color(self) -> U

Convert into T with values clamped to the color defined bounds Read more
source§

impl<T, U> IntoColorUnclamped<U> for T
where + U: FromColorUnclamped<T>,

source§

fn into_color_unclamped(self) -> U

Convert into T. The resulting color might be invalid in its color space Read more
§

impl<Unit> IntoComponents<Unit> for Unit
where + Unit: Copy,

§

fn into_components(self) -> (Unit, Unit)

Extracts this type’s 2d vector components.
§

fn to_vec<Type>(self) -> Type
where + Type: FromComponents<Unit>,

Converts this type to another type using [FromComponents] and +[IntoComponents].
source§

impl<T> IntoEither for T

source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<T> IntoReadOnly<T> for T

§

fn into_read_only(self) -> ReadOnly<T>

Returns self as a ReadOnly.
source§

impl<T> IntoStimulus<T> for T

source§

fn into_stimulus(self) -> T

Converts self into T, while performing the appropriate scaling, +rounding and clamping.
§

impl<T> IntoValue<Option<T>> for T

§

fn into_value(self) -> Value<Option<T>>

Returns this type as a [Value].
§

impl<T> IntoValue<T> for T

§

fn into_value(self) -> Value<T>

Returns this type as a [Value].
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
source§

impl<T> ToOwned for T
where + T: Clone,

source§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, C> TryComponentsInto<C> for T
where + C: TryFromComponents<T>,

source§

type Error = <C as TryFromComponents<T>>::Error

The error for when try_into_colors fails to cast.
source§

fn try_components_into(self) -> Result<C, <T as TryComponentsInto<C>>::Error>

Try to cast this collection of color components into a collection of +colors. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

source§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
source§

impl<T, U> TryIntoColor<U> for T
where + U: TryFromColor<T>,

source§

fn try_into_color(self) -> Result<U, OutOfBounds<U>>

Convert into T, returning ok if the color is inside of its defined +range, otherwise an OutOfBounds error is returned which contains +the unclamped color. Read more
source§

impl<C, U> UintsFrom<C> for U
where + C: IntoUints<U>,

source§

fn uints_from(colors: C) -> U

Cast a collection of colors into a collection of unsigned integers.
source§

impl<C, U> UintsInto<C> for U
where + C: FromUints<U>,

source§

fn uints_into(self) -> C

Cast this collection of unsigned integers into a collection of colors.
§

impl<T> Upcast<T> for T

§

fn upcast(&self) -> Option<&T>

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

§

impl<T> WasmNotSend for T
where + T: Send,

§

impl<T> WasmNotSendSync for T
where + T: WasmNotSend + WasmNotSync,

§

impl<T> WasmNotSync for T
where + T: Sync,

\ No newline at end of file diff --git a/main/funnybones/animation/index.html b/main/funnybones/animation/index.html index 6669ee1..d72478f 100644 --- a/main/funnybones/animation/index.html +++ b/main/funnybones/animation/index.html @@ -1 +1 @@ -funnybones::animation - Rust
\ No newline at end of file +funnybones::animation - Rust
\ No newline at end of file diff --git a/main/funnybones/animation/sidebar-items.js b/main/funnybones/animation/sidebar-items.js index 9ac02f3..cdfef8a 100644 --- a/main/funnybones/animation/sidebar-items.js +++ b/main/funnybones/animation/sidebar-items.js @@ -1 +1 @@ -window.SIDEBAR_ITEMS = {"enum":["ChangeKind"],"struct":["Animation","Change","Frame","RunningAnimation"]}; \ No newline at end of file +window.SIDEBAR_ITEMS = {"enum":["BoneProperty","JointProperty","PropertyUpdate","Target","Value"],"struct":["Animation","Frame","Keyframe","RunningAnimation","Timeline"]}; \ No newline at end of file diff --git a/main/funnybones/animation/struct.Animation.html b/main/funnybones/animation/struct.Animation.html index 45f1388..073cdd7 100644 --- a/main/funnybones/animation/struct.Animation.html +++ b/main/funnybones/animation/struct.Animation.html @@ -1,4 +1,4 @@ -Animation in funnybones::animation - Rust

Struct funnybones::animation::Animation

source ·
pub struct Animation(/* private fields */);

Implementations§

source§

impl Animation

source

pub fn push(&mut self, frame: Frame)

source

pub fn with(self, frame: Frame) -> Self

source

pub fn remove(&mut self, frame_index: usize) -> Frame

source

pub fn insert(&mut self, index: usize, frame: Frame)

source

pub fn with_variable(self, name: impl Into<String>, value: f32) -> Self

source

pub fn set_variable<'a>(&mut self, name: impl Into<Cow<'a, str>>, value: f32)

source

pub fn variable(&self, name: &str) -> Option<f32>

source

pub fn start(&self) -> RunningAnimation

Methods from Deref<Target = [Frame]>§

source

pub fn as_str(&self) -> &str

🔬This is a nightly-only experimental API. (ascii_char)

Views this slice of ASCII characters as a UTF-8 str.

+Animation in funnybones::animation - Rust

Struct funnybones::animation::Animation

source ·
pub struct Animation(/* private fields */);

Implementations§

source§

impl Animation

source

pub fn push(&mut self, timeline: Timeline)

source

pub fn with(self, timeline: Timeline) -> Self

source

pub fn remove(&mut self, timeline_index: usize) -> Timeline

source

pub fn insert(&mut self, index: usize, timeline: Timeline)

source

pub fn with_variable(self, name: impl Into<String>, value: f32) -> Self

source

pub fn set_variable<'a>(&mut self, name: impl Into<Cow<'a, str>>, value: f32)

source

pub fn variable(&self, name: &str) -> Option<f32>

source

pub fn start(&self) -> RunningAnimation

Methods from Deref<Target = [Timeline]>§

source

pub fn as_str(&self) -> &str

🔬This is a nightly-only experimental API. (ascii_char)

Views this slice of ASCII characters as a UTF-8 str.

source

pub fn as_bytes(&self) -> &[u8]

🔬This is a nightly-only experimental API. (ascii_char)

Views this slice of ASCII characters as a slice of u8 bytes.

1.23.0 · source

pub fn is_ascii(&self) -> bool

Checks if all bytes in this slice are within the ASCII range.

source

pub fn as_ascii(&self) -> Option<&[AsciiChar]>

🔬This is a nightly-only experimental API. (ascii_char)

If this slice is_ascii, returns it as a slice of @@ -2452,8 +2452,8 @@

§Examples<

ASCII letters ‘A’ to ‘Z’ are mapped to ‘a’ to ‘z’, but non-ASCII letters are unchanged.

To lowercase the value in-place, use make_ascii_lowercase.

-

Trait Implementations§

source§

impl Clone for Animation

source§

fn clone(&self) -> Animation

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for Animation

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Default for Animation

source§

fn default() -> Animation

Returns the “default value” for a type. Read more
source§

impl Deref for Animation

source§

type Target = [Frame]

The resulting type after dereferencing.
source§

fn deref(&self) -> &Self::Target

Dereferences the value.
source§

impl DerefMut for Animation

source§

fn deref_mut(&mut self) -> &mut Self::Target

Mutably dereferences the value.
source§

impl PartialEq for Animation

source§

fn eq(&self, other: &Animation) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, -and should not be overridden without very good reason.
source§

impl StructuralPartialEq for Animation

Auto Trait Implementations§

Blanket Implementations§

source§

impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for S
where +

Trait Implementations§

source§

impl Clone for Animation

source§

fn clone(&self) -> Animation

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for Animation

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Default for Animation

source§

fn default() -> Animation

Returns the “default value” for a type. Read more
source§

impl Deref for Animation

source§

type Target = [Timeline]

The resulting type after dereferencing.
source§

fn deref(&self) -> &Self::Target

Dereferences the value.
source§

impl DerefMut for Animation

source§

fn deref_mut(&mut self) -> &mut Self::Target

Mutably dereferences the value.
source§

impl PartialEq for Animation

source§

fn eq(&self, other: &Animation) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
source§

impl StructuralPartialEq for Animation

Auto Trait Implementations§

Blanket Implementations§

source§

impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for S
where T: Real + Zero + Arithmetics + Clone, Swp: WhitePoint<T>, Dwp: WhitePoint<T>, @@ -2479,7 +2479,7 @@
§Examples< further downcast into Rc<ConcreteType> where ConcreteType implements Trait.

§

fn as_any(&self) -> &(dyn Any + 'static)

Convert &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
§

impl<T> DowncastSync for T
where - T: Any + Send + Sync,

§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Sync + Send>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be + T: Any + Send + Sync,
§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T> FromAngle<T> for T

source§

fn from_angle(angle: T) -> T

Performs a conversion from angle.
source§

impl<T, U> FromStimulus<U> for T
where U: IntoStimulus<T>,

source§

fn from_stimulus(other: U) -> T

Converts other into Self, while performing the appropriate scaling, diff --git a/main/funnybones/animation/struct.Frame.html b/main/funnybones/animation/struct.Frame.html index a589965..c8eb899 100644 --- a/main/funnybones/animation/struct.Frame.html +++ b/main/funnybones/animation/struct.Frame.html @@ -1,2461 +1,13 @@ -Frame in funnybones::animation - Rust

Struct funnybones::animation::Frame

source ·
pub struct Frame { /* private fields */ }

Implementations§

source§

impl Frame

source

pub const fn new(duration: Duration) -> Self

source

pub fn set_duration(&mut self, duration: Duration)

source

pub const fn duration(&self) -> Duration

source

pub fn with_change(self, change: impl Into<Change>) -> Self

source

pub fn push_change(&mut self, change: impl Into<Change>)

Methods from Deref<Target = [Change]>§

source

pub fn as_str(&self) -> &str

🔬This is a nightly-only experimental API. (ascii_char)

Views this slice of ASCII characters as a UTF-8 str.

-
source

pub fn as_bytes(&self) -> &[u8]

🔬This is a nightly-only experimental API. (ascii_char)

Views this slice of ASCII characters as a slice of u8 bytes.

-
1.23.0 · source

pub fn is_ascii(&self) -> bool

Checks if all bytes in this slice are within the ASCII range.

-
source

pub fn as_ascii(&self) -> Option<&[AsciiChar]>

🔬This is a nightly-only experimental API. (ascii_char)

If this slice is_ascii, returns it as a slice of -ASCII characters, otherwise returns None.

-
source

pub unsafe fn as_ascii_unchecked(&self) -> &[AsciiChar]

🔬This is a nightly-only experimental API. (ascii_char)

Converts this slice of bytes into a slice of ASCII characters, -without checking whether they’re valid.

-
§Safety
-

Every byte in the slice must be in 0..=127, or else this is UB.

-
1.23.0 · source

pub fn eq_ignore_ascii_case(&self, other: &[u8]) -> bool

Checks that two slices are an ASCII case-insensitive match.

-

Same as to_ascii_lowercase(a) == to_ascii_lowercase(b), -but without allocating and copying temporaries.

-
1.23.0 · source

pub fn make_ascii_uppercase(&mut self)

Converts this slice to its ASCII upper case equivalent in-place.

-

ASCII letters ‘a’ to ‘z’ are mapped to ‘A’ to ‘Z’, -but non-ASCII letters are unchanged.

-

To return a new uppercased value without modifying the existing one, use -to_ascii_uppercase.

-
1.23.0 · source

pub fn make_ascii_lowercase(&mut self)

Converts this slice to its ASCII lower case equivalent in-place.

-

ASCII letters ‘A’ to ‘Z’ are mapped to ‘a’ to ‘z’, -but non-ASCII letters are unchanged.

-

To return a new lowercased value without modifying the existing one, use -to_ascii_lowercase.

-
1.60.0 · source

pub fn escape_ascii(&self) -> EscapeAscii<'_>

Returns an iterator that produces an escaped version of this slice, -treating it as an ASCII string.

-
§Examples
-

-let s = b"0\t\r\n'\"\\\x9d";
-let escaped = s.escape_ascii().to_string();
-assert_eq!(escaped, "0\\t\\r\\n\\'\\\"\\\\\\x9d");
-
1.80.0 · source

pub fn trim_ascii_start(&self) -> &[u8]

Returns a byte slice with leading ASCII whitespace bytes removed.

-

‘Whitespace’ refers to the definition used by -u8::is_ascii_whitespace.

-
§Examples
-
assert_eq!(b" \t hello world\n".trim_ascii_start(), b"hello world\n");
-assert_eq!(b"  ".trim_ascii_start(), b"");
-assert_eq!(b"".trim_ascii_start(), b"");
-
1.80.0 · source

pub fn trim_ascii_end(&self) -> &[u8]

Returns a byte slice with trailing ASCII whitespace bytes removed.

-

‘Whitespace’ refers to the definition used by -u8::is_ascii_whitespace.

-
§Examples
-
assert_eq!(b"\r hello world\n ".trim_ascii_end(), b"\r hello world");
-assert_eq!(b"  ".trim_ascii_end(), b"");
-assert_eq!(b"".trim_ascii_end(), b"");
-
1.80.0 · source

pub fn trim_ascii(&self) -> &[u8]

Returns a byte slice with leading and trailing ASCII whitespace bytes -removed.

-

‘Whitespace’ refers to the definition used by -u8::is_ascii_whitespace.

-
§Examples
-
assert_eq!(b"\r hello world\n ".trim_ascii(), b"hello world");
-assert_eq!(b"  ".trim_ascii(), b"");
-assert_eq!(b"".trim_ascii(), b"");
-
1.0.0 · source

pub fn len(&self) -> usize

Returns the number of elements in the slice.

-
§Examples
-
let a = [1, 2, 3];
-assert_eq!(a.len(), 3);
-
1.0.0 · source

pub fn is_empty(&self) -> bool

Returns true if the slice has a length of 0.

-
§Examples
-
let a = [1, 2, 3];
-assert!(!a.is_empty());
-
-let b: &[i32] = &[];
-assert!(b.is_empty());
-
1.0.0 · source

pub fn first(&self) -> Option<&T>

Returns the first element of the slice, or None if it is empty.

-
§Examples
-
let v = [10, 40, 30];
-assert_eq!(Some(&10), v.first());
-
-let w: &[i32] = &[];
-assert_eq!(None, w.first());
-
1.0.0 · source

pub fn first_mut(&mut self) -> Option<&mut T>

Returns a mutable pointer to the first element of the slice, or None if it is empty.

-
§Examples
-
let x = &mut [0, 1, 2];
-
-if let Some(first) = x.first_mut() {
-    *first = 5;
-}
-assert_eq!(x, &[5, 1, 2]);
-
-let y: &mut [i32] = &mut [];
-assert_eq!(None, y.first_mut());
-
1.5.0 · source

pub fn split_first(&self) -> Option<(&T, &[T])>

Returns the first and all the rest of the elements of the slice, or None if it is empty.

-
§Examples
-
let x = &[0, 1, 2];
-
-if let Some((first, elements)) = x.split_first() {
-    assert_eq!(first, &0);
-    assert_eq!(elements, &[1, 2]);
-}
-
1.5.0 · source

pub fn split_first_mut(&mut self) -> Option<(&mut T, &mut [T])>

Returns the first and all the rest of the elements of the slice, or None if it is empty.

-
§Examples
-
let x = &mut [0, 1, 2];
-
-if let Some((first, elements)) = x.split_first_mut() {
-    *first = 3;
-    elements[0] = 4;
-    elements[1] = 5;
-}
-assert_eq!(x, &[3, 4, 5]);
-
1.5.0 · source

pub fn split_last(&self) -> Option<(&T, &[T])>

Returns the last and all the rest of the elements of the slice, or None if it is empty.

-
§Examples
-
let x = &[0, 1, 2];
-
-if let Some((last, elements)) = x.split_last() {
-    assert_eq!(last, &2);
-    assert_eq!(elements, &[0, 1]);
-}
-
1.5.0 · source

pub fn split_last_mut(&mut self) -> Option<(&mut T, &mut [T])>

Returns the last and all the rest of the elements of the slice, or None if it is empty.

-
§Examples
-
let x = &mut [0, 1, 2];
-
-if let Some((last, elements)) = x.split_last_mut() {
-    *last = 3;
-    elements[0] = 4;
-    elements[1] = 5;
-}
-assert_eq!(x, &[4, 5, 3]);
-
1.0.0 · source

pub fn last(&self) -> Option<&T>

Returns the last element of the slice, or None if it is empty.

-
§Examples
-
let v = [10, 40, 30];
-assert_eq!(Some(&30), v.last());
-
-let w: &[i32] = &[];
-assert_eq!(None, w.last());
-
1.0.0 · source

pub fn last_mut(&mut self) -> Option<&mut T>

Returns a mutable reference to the last item in the slice, or None if it is empty.

-
§Examples
-
let x = &mut [0, 1, 2];
-
-if let Some(last) = x.last_mut() {
-    *last = 10;
-}
-assert_eq!(x, &[0, 1, 10]);
-
-let y: &mut [i32] = &mut [];
-assert_eq!(None, y.last_mut());
-
1.77.0 · source

pub fn first_chunk<const N: usize>(&self) -> Option<&[T; N]>

Returns an array reference to the first N items in the slice.

-

If the slice is not at least N in length, this will return None.

-
§Examples
-
let u = [10, 40, 30];
-assert_eq!(Some(&[10, 40]), u.first_chunk::<2>());
-
-let v: &[i32] = &[10];
-assert_eq!(None, v.first_chunk::<2>());
-
-let w: &[i32] = &[];
-assert_eq!(Some(&[]), w.first_chunk::<0>());
-
1.77.0 · source

pub fn first_chunk_mut<const N: usize>(&mut self) -> Option<&mut [T; N]>

Returns a mutable array reference to the first N items in the slice.

-

If the slice is not at least N in length, this will return None.

-
§Examples
-
let x = &mut [0, 1, 2];
-
-if let Some(first) = x.first_chunk_mut::<2>() {
-    first[0] = 5;
-    first[1] = 4;
-}
-assert_eq!(x, &[5, 4, 2]);
-
-assert_eq!(None, x.first_chunk_mut::<4>());
-
1.77.0 · source

pub fn split_first_chunk<const N: usize>(&self) -> Option<(&[T; N], &[T])>

Returns an array reference to the first N items in the slice and the remaining slice.

-

If the slice is not at least N in length, this will return None.

-
§Examples
-
let x = &[0, 1, 2];
-
-if let Some((first, elements)) = x.split_first_chunk::<2>() {
-    assert_eq!(first, &[0, 1]);
-    assert_eq!(elements, &[2]);
-}
-
-assert_eq!(None, x.split_first_chunk::<4>());
-
1.77.0 · source

pub fn split_first_chunk_mut<const N: usize>( - &mut self, -) -> Option<(&mut [T; N], &mut [T])>

Returns a mutable array reference to the first N items in the slice and the remaining -slice.

-

If the slice is not at least N in length, this will return None.

-
§Examples
-
let x = &mut [0, 1, 2];
-
-if let Some((first, elements)) = x.split_first_chunk_mut::<2>() {
-    first[0] = 3;
-    first[1] = 4;
-    elements[0] = 5;
-}
-assert_eq!(x, &[3, 4, 5]);
-
-assert_eq!(None, x.split_first_chunk_mut::<4>());
-
1.77.0 · source

pub fn split_last_chunk<const N: usize>(&self) -> Option<(&[T], &[T; N])>

Returns an array reference to the last N items in the slice and the remaining slice.

-

If the slice is not at least N in length, this will return None.

-
§Examples
-
let x = &[0, 1, 2];
-
-if let Some((elements, last)) = x.split_last_chunk::<2>() {
-    assert_eq!(elements, &[0]);
-    assert_eq!(last, &[1, 2]);
-}
-
-assert_eq!(None, x.split_last_chunk::<4>());
-
1.77.0 · source

pub fn split_last_chunk_mut<const N: usize>( - &mut self, -) -> Option<(&mut [T], &mut [T; N])>

Returns a mutable array reference to the last N items in the slice and the remaining -slice.

-

If the slice is not at least N in length, this will return None.

-
§Examples
-
let x = &mut [0, 1, 2];
-
-if let Some((elements, last)) = x.split_last_chunk_mut::<2>() {
-    last[0] = 3;
-    last[1] = 4;
-    elements[0] = 5;
-}
-assert_eq!(x, &[5, 3, 4]);
-
-assert_eq!(None, x.split_last_chunk_mut::<4>());
-
1.77.0 · source

pub fn last_chunk<const N: usize>(&self) -> Option<&[T; N]>

Returns an array reference to the last N items in the slice.

-

If the slice is not at least N in length, this will return None.

-
§Examples
-
let u = [10, 40, 30];
-assert_eq!(Some(&[40, 30]), u.last_chunk::<2>());
-
-let v: &[i32] = &[10];
-assert_eq!(None, v.last_chunk::<2>());
-
-let w: &[i32] = &[];
-assert_eq!(Some(&[]), w.last_chunk::<0>());
-
1.77.0 · source

pub fn last_chunk_mut<const N: usize>(&mut self) -> Option<&mut [T; N]>

Returns a mutable array reference to the last N items in the slice.

-

If the slice is not at least N in length, this will return None.

-
§Examples
-
let x = &mut [0, 1, 2];
-
-if let Some(last) = x.last_chunk_mut::<2>() {
-    last[0] = 10;
-    last[1] = 20;
-}
-assert_eq!(x, &[0, 10, 20]);
-
-assert_eq!(None, x.last_chunk_mut::<4>());
-
1.0.0 · source

pub fn get<I>(&self, index: I) -> Option<&<I as SliceIndex<[T]>>::Output>
where - I: SliceIndex<[T]>,

Returns a reference to an element or subslice depending on the type of -index.

-
    -
  • If given a position, returns a reference to the element at that -position or None if out of bounds.
  • -
  • If given a range, returns the subslice corresponding to that range, -or None if out of bounds.
  • -
-
§Examples
-
let v = [10, 40, 30];
-assert_eq!(Some(&40), v.get(1));
-assert_eq!(Some(&[10, 40][..]), v.get(0..2));
-assert_eq!(None, v.get(3));
-assert_eq!(None, v.get(0..4));
-
1.0.0 · source

pub fn get_mut<I>( - &mut self, - index: I, -) -> Option<&mut <I as SliceIndex<[T]>>::Output>
where - I: SliceIndex<[T]>,

Returns a mutable reference to an element or subslice depending on the -type of index (see get) or None if the index is out of bounds.

-
§Examples
-
let x = &mut [0, 1, 2];
-
-if let Some(elem) = x.get_mut(1) {
-    *elem = 42;
-}
-assert_eq!(x, &[0, 42, 2]);
-
1.0.0 · source

pub unsafe fn get_unchecked<I>( - &self, - index: I, -) -> &<I as SliceIndex<[T]>>::Output
where - I: SliceIndex<[T]>,

Returns a reference to an element or subslice, without doing bounds -checking.

-

For a safe alternative see get.

-
§Safety
-

Calling this method with an out-of-bounds index is undefined behavior -even if the resulting reference is not used.

-

You can think of this like .get(index).unwrap_unchecked(). It’s UB -to call .get_unchecked(len), even if you immediately convert to a -pointer. And it’s UB to call .get_unchecked(..len + 1), -.get_unchecked(..=len), or similar.

-
§Examples
-
let x = &[1, 2, 4];
-
-unsafe {
-    assert_eq!(x.get_unchecked(1), &2);
-}
-
1.0.0 · source

pub unsafe fn get_unchecked_mut<I>( - &mut self, - index: I, -) -> &mut <I as SliceIndex<[T]>>::Output
where - I: SliceIndex<[T]>,

Returns a mutable reference to an element or subslice, without doing -bounds checking.

-

For a safe alternative see get_mut.

-
§Safety
-

Calling this method with an out-of-bounds index is undefined behavior -even if the resulting reference is not used.

-

You can think of this like .get_mut(index).unwrap_unchecked(). It’s -UB to call .get_unchecked_mut(len), even if you immediately convert -to a pointer. And it’s UB to call .get_unchecked_mut(..len + 1), -.get_unchecked_mut(..=len), or similar.

-
§Examples
-
let x = &mut [1, 2, 4];
-
-unsafe {
-    let elem = x.get_unchecked_mut(1);
-    *elem = 13;
-}
-assert_eq!(x, &[1, 13, 4]);
-
1.0.0 · source

pub fn as_ptr(&self) -> *const T

Returns a raw pointer to the slice’s buffer.

-

The caller must ensure that the slice outlives the pointer this -function returns, or else it will end up dangling.

-

The caller must also ensure that the memory the pointer (non-transitively) points to -is never written to (except inside an UnsafeCell) using this pointer or any pointer -derived from it. If you need to mutate the contents of the slice, use as_mut_ptr.

-

Modifying the container referenced by this slice may cause its buffer -to be reallocated, which would also make any pointers to it invalid.

-
§Examples
-
let x = &[1, 2, 4];
-let x_ptr = x.as_ptr();
-
-unsafe {
-    for i in 0..x.len() {
-        assert_eq!(x.get_unchecked(i), &*x_ptr.add(i));
-    }
-}
-
1.0.0 · source

pub fn as_mut_ptr(&mut self) -> *mut T

Returns an unsafe mutable pointer to the slice’s buffer.

-

The caller must ensure that the slice outlives the pointer this -function returns, or else it will end up dangling.

-

Modifying the container referenced by this slice may cause its buffer -to be reallocated, which would also make any pointers to it invalid.

-
§Examples
-
let x = &mut [1, 2, 4];
-let x_ptr = x.as_mut_ptr();
-
-unsafe {
-    for i in 0..x.len() {
-        *x_ptr.add(i) += 2;
-    }
-}
-assert_eq!(x, &[3, 4, 6]);
-
1.48.0 · source

pub fn as_ptr_range(&self) -> Range<*const T>

Returns the two raw pointers spanning the slice.

-

The returned range is half-open, which means that the end pointer -points one past the last element of the slice. This way, an empty -slice is represented by two equal pointers, and the difference between -the two pointers represents the size of the slice.

-

See as_ptr for warnings on using these pointers. The end pointer -requires extra caution, as it does not point to a valid element in the -slice.

-

This function is useful for interacting with foreign interfaces which -use two pointers to refer to a range of elements in memory, as is -common in C++.

-

It can also be useful to check if a pointer to an element refers to an -element of this slice:

- -
let a = [1, 2, 3];
-let x = &a[1] as *const _;
-let y = &5 as *const _;
-
-assert!(a.as_ptr_range().contains(&x));
-assert!(!a.as_ptr_range().contains(&y));
-
1.48.0 · source

pub fn as_mut_ptr_range(&mut self) -> Range<*mut T>

Returns the two unsafe mutable pointers spanning the slice.

-

The returned range is half-open, which means that the end pointer -points one past the last element of the slice. This way, an empty -slice is represented by two equal pointers, and the difference between -the two pointers represents the size of the slice.

-

See as_mut_ptr for warnings on using these pointers. The end -pointer requires extra caution, as it does not point to a valid element -in the slice.

-

This function is useful for interacting with foreign interfaces which -use two pointers to refer to a range of elements in memory, as is -common in C++.

-
1.0.0 · source

pub fn swap(&mut self, a: usize, b: usize)

Swaps two elements in the slice.

-

If a equals to b, it’s guaranteed that elements won’t change value.

-
§Arguments
-
    -
  • a - The index of the first element
  • -
  • b - The index of the second element
  • -
-
§Panics
-

Panics if a or b are out of bounds.

-
§Examples
-
let mut v = ["a", "b", "c", "d", "e"];
-v.swap(2, 4);
-assert!(v == ["a", "b", "e", "d", "c"]);
-
source

pub unsafe fn swap_unchecked(&mut self, a: usize, b: usize)

🔬This is a nightly-only experimental API. (slice_swap_unchecked)

Swaps two elements in the slice, without doing bounds checking.

-

For a safe alternative see swap.

-
§Arguments
-
    -
  • a - The index of the first element
  • -
  • b - The index of the second element
  • -
-
§Safety
-

Calling this method with an out-of-bounds index is undefined behavior. -The caller has to ensure that a < self.len() and b < self.len().

-
§Examples
-
#![feature(slice_swap_unchecked)]
-
-let mut v = ["a", "b", "c", "d"];
-// SAFETY: we know that 1 and 3 are both indices of the slice
-unsafe { v.swap_unchecked(1, 3) };
-assert!(v == ["a", "d", "c", "b"]);
-
1.0.0 · source

pub fn reverse(&mut self)

Reverses the order of elements in the slice, in place.

-
§Examples
-
let mut v = [1, 2, 3];
-v.reverse();
-assert!(v == [3, 2, 1]);
-
1.0.0 · source

pub fn iter(&self) -> Iter<'_, T>

Returns an iterator over the slice.

-

The iterator yields all items from start to end.

-
§Examples
-
let x = &[1, 2, 4];
-let mut iterator = x.iter();
-
-assert_eq!(iterator.next(), Some(&1));
-assert_eq!(iterator.next(), Some(&2));
-assert_eq!(iterator.next(), Some(&4));
-assert_eq!(iterator.next(), None);
-
1.0.0 · source

pub fn iter_mut(&mut self) -> IterMut<'_, T>

Returns an iterator that allows modifying each value.

-

The iterator yields all items from start to end.

-
§Examples
-
let x = &mut [1, 2, 4];
-for elem in x.iter_mut() {
-    *elem += 2;
-}
-assert_eq!(x, &[3, 4, 6]);
-
1.0.0 · source

pub fn windows(&self, size: usize) -> Windows<'_, T>

Returns an iterator over all contiguous windows of length -size. The windows overlap. If the slice is shorter than -size, the iterator returns no values.

-
§Panics
-

Panics if size is 0.

-
§Examples
-
let slice = ['l', 'o', 'r', 'e', 'm'];
-let mut iter = slice.windows(3);
-assert_eq!(iter.next().unwrap(), &['l', 'o', 'r']);
-assert_eq!(iter.next().unwrap(), &['o', 'r', 'e']);
-assert_eq!(iter.next().unwrap(), &['r', 'e', 'm']);
-assert!(iter.next().is_none());
-

If the slice is shorter than size:

- -
let slice = ['f', 'o', 'o'];
-let mut iter = slice.windows(4);
-assert!(iter.next().is_none());
-

There’s no windows_mut, as that existing would let safe code violate the -“only one &mut at a time to the same thing” rule. However, you can sometimes -use Cell::as_slice_of_cells in -conjunction with windows to accomplish something similar:

- -
use std::cell::Cell;
-
-let mut array = ['R', 'u', 's', 't', ' ', '2', '0', '1', '5'];
-let slice = &mut array[..];
-let slice_of_cells: &[Cell<char>] = Cell::from_mut(slice).as_slice_of_cells();
-for w in slice_of_cells.windows(3) {
-    Cell::swap(&w[0], &w[2]);
-}
-assert_eq!(array, ['s', 't', ' ', '2', '0', '1', '5', 'u', 'R']);
-
1.0.0 · source

pub fn chunks(&self, chunk_size: usize) -> Chunks<'_, T>

Returns an iterator over chunk_size elements of the slice at a time, starting at the -beginning of the slice.

-

The chunks are slices and do not overlap. If chunk_size does not divide the length of the -slice, then the last chunk will not have length chunk_size.

-

See chunks_exact for a variant of this iterator that returns chunks of always exactly -chunk_size elements, and rchunks for the same iterator but starting at the end of the -slice.

-
§Panics
-

Panics if chunk_size is 0.

-
§Examples
-
let slice = ['l', 'o', 'r', 'e', 'm'];
-let mut iter = slice.chunks(2);
-assert_eq!(iter.next().unwrap(), &['l', 'o']);
-assert_eq!(iter.next().unwrap(), &['r', 'e']);
-assert_eq!(iter.next().unwrap(), &['m']);
-assert!(iter.next().is_none());
-
1.0.0 · source

pub fn chunks_mut(&mut self, chunk_size: usize) -> ChunksMut<'_, T>

Returns an iterator over chunk_size elements of the slice at a time, starting at the -beginning of the slice.

-

The chunks are mutable slices, and do not overlap. If chunk_size does not divide the -length of the slice, then the last chunk will not have length chunk_size.

-

See chunks_exact_mut for a variant of this iterator that returns chunks of always -exactly chunk_size elements, and rchunks_mut for the same iterator but starting at -the end of the slice.

-
§Panics
-

Panics if chunk_size is 0.

-
§Examples
-
let v = &mut [0, 0, 0, 0, 0];
-let mut count = 1;
-
-for chunk in v.chunks_mut(2) {
-    for elem in chunk.iter_mut() {
-        *elem += count;
-    }
-    count += 1;
-}
-assert_eq!(v, &[1, 1, 2, 2, 3]);
-
1.31.0 · source

pub fn chunks_exact(&self, chunk_size: usize) -> ChunksExact<'_, T>

Returns an iterator over chunk_size elements of the slice at a time, starting at the -beginning of the slice.

-

The chunks are slices and do not overlap. If chunk_size does not divide the length of the -slice, then the last up to chunk_size-1 elements will be omitted and can be retrieved -from the remainder function of the iterator.

-

Due to each chunk having exactly chunk_size elements, the compiler can often optimize the -resulting code better than in the case of chunks.

-

See chunks for a variant of this iterator that also returns the remainder as a smaller -chunk, and rchunks_exact for the same iterator but starting at the end of the slice.

-
§Panics
-

Panics if chunk_size is 0.

-
§Examples
-
let slice = ['l', 'o', 'r', 'e', 'm'];
-let mut iter = slice.chunks_exact(2);
-assert_eq!(iter.next().unwrap(), &['l', 'o']);
-assert_eq!(iter.next().unwrap(), &['r', 'e']);
-assert!(iter.next().is_none());
-assert_eq!(iter.remainder(), &['m']);
-
1.31.0 · source

pub fn chunks_exact_mut(&mut self, chunk_size: usize) -> ChunksExactMut<'_, T>

Returns an iterator over chunk_size elements of the slice at a time, starting at the -beginning of the slice.

-

The chunks are mutable slices, and do not overlap. If chunk_size does not divide the -length of the slice, then the last up to chunk_size-1 elements will be omitted and can be -retrieved from the into_remainder function of the iterator.

-

Due to each chunk having exactly chunk_size elements, the compiler can often optimize the -resulting code better than in the case of chunks_mut.

-

See chunks_mut for a variant of this iterator that also returns the remainder as a -smaller chunk, and rchunks_exact_mut for the same iterator but starting at the end of -the slice.

-
§Panics
-

Panics if chunk_size is 0.

-
§Examples
-
let v = &mut [0, 0, 0, 0, 0];
-let mut count = 1;
-
-for chunk in v.chunks_exact_mut(2) {
-    for elem in chunk.iter_mut() {
-        *elem += count;
-    }
-    count += 1;
-}
-assert_eq!(v, &[1, 1, 2, 2, 0]);
-
source

pub unsafe fn as_chunks_unchecked<const N: usize>(&self) -> &[[T; N]]

🔬This is a nightly-only experimental API. (slice_as_chunks)

Splits the slice into a slice of N-element arrays, -assuming that there’s no remainder.

-
§Safety
-

This may only be called when

-
    -
  • The slice splits exactly into N-element chunks (aka self.len() % N == 0).
  • -
  • N != 0.
  • -
-
§Examples
-
#![feature(slice_as_chunks)]
-let slice: &[char] = &['l', 'o', 'r', 'e', 'm', '!'];
-let chunks: &[[char; 1]] =
-    // SAFETY: 1-element chunks never have remainder
-    unsafe { slice.as_chunks_unchecked() };
-assert_eq!(chunks, &[['l'], ['o'], ['r'], ['e'], ['m'], ['!']]);
-let chunks: &[[char; 3]] =
-    // SAFETY: The slice length (6) is a multiple of 3
-    unsafe { slice.as_chunks_unchecked() };
-assert_eq!(chunks, &[['l', 'o', 'r'], ['e', 'm', '!']]);
-
-// These would be unsound:
-// let chunks: &[[_; 5]] = slice.as_chunks_unchecked() // The slice length is not a multiple of 5
-// let chunks: &[[_; 0]] = slice.as_chunks_unchecked() // Zero-length chunks are never allowed
-
source

pub fn as_chunks<const N: usize>(&self) -> (&[[T; N]], &[T])

🔬This is a nightly-only experimental API. (slice_as_chunks)

Splits the slice into a slice of N-element arrays, -starting at the beginning of the slice, -and a remainder slice with length strictly less than N.

-
§Panics
-

Panics if N is 0. This check will most probably get changed to a compile time -error before this method gets stabilized.

-
§Examples
-
#![feature(slice_as_chunks)]
-let slice = ['l', 'o', 'r', 'e', 'm'];
-let (chunks, remainder) = slice.as_chunks();
-assert_eq!(chunks, &[['l', 'o'], ['r', 'e']]);
-assert_eq!(remainder, &['m']);
-

If you expect the slice to be an exact multiple, you can combine -let-else with an empty slice pattern:

- -
#![feature(slice_as_chunks)]
-let slice = ['R', 'u', 's', 't'];
-let (chunks, []) = slice.as_chunks::<2>() else {
-    panic!("slice didn't have even length")
-};
-assert_eq!(chunks, &[['R', 'u'], ['s', 't']]);
-
source

pub fn as_rchunks<const N: usize>(&self) -> (&[T], &[[T; N]])

🔬This is a nightly-only experimental API. (slice_as_chunks)

Splits the slice into a slice of N-element arrays, -starting at the end of the slice, -and a remainder slice with length strictly less than N.

-
§Panics
-

Panics if N is 0. This check will most probably get changed to a compile time -error before this method gets stabilized.

-
§Examples
-
#![feature(slice_as_chunks)]
-let slice = ['l', 'o', 'r', 'e', 'm'];
-let (remainder, chunks) = slice.as_rchunks();
-assert_eq!(remainder, &['l']);
-assert_eq!(chunks, &[['o', 'r'], ['e', 'm']]);
-
source

pub fn array_chunks<const N: usize>(&self) -> ArrayChunks<'_, T, N>

🔬This is a nightly-only experimental API. (array_chunks)

Returns an iterator over N elements of the slice at a time, starting at the -beginning of the slice.

-

The chunks are array references and do not overlap. If N does not divide the -length of the slice, then the last up to N-1 elements will be omitted and can be -retrieved from the remainder function of the iterator.

-

This method is the const generic equivalent of chunks_exact.

-
§Panics
-

Panics if N is 0. This check will most probably get changed to a compile time -error before this method gets stabilized.

-
§Examples
-
#![feature(array_chunks)]
-let slice = ['l', 'o', 'r', 'e', 'm'];
-let mut iter = slice.array_chunks();
-assert_eq!(iter.next().unwrap(), &['l', 'o']);
-assert_eq!(iter.next().unwrap(), &['r', 'e']);
-assert!(iter.next().is_none());
-assert_eq!(iter.remainder(), &['m']);
-
source

pub unsafe fn as_chunks_unchecked_mut<const N: usize>( - &mut self, -) -> &mut [[T; N]]

🔬This is a nightly-only experimental API. (slice_as_chunks)

Splits the slice into a slice of N-element arrays, -assuming that there’s no remainder.

-
§Safety
-

This may only be called when

-
    -
  • The slice splits exactly into N-element chunks (aka self.len() % N == 0).
  • -
  • N != 0.
  • -
-
§Examples
-
#![feature(slice_as_chunks)]
-let slice: &mut [char] = &mut ['l', 'o', 'r', 'e', 'm', '!'];
-let chunks: &mut [[char; 1]] =
-    // SAFETY: 1-element chunks never have remainder
-    unsafe { slice.as_chunks_unchecked_mut() };
-chunks[0] = ['L'];
-assert_eq!(chunks, &[['L'], ['o'], ['r'], ['e'], ['m'], ['!']]);
-let chunks: &mut [[char; 3]] =
-    // SAFETY: The slice length (6) is a multiple of 3
-    unsafe { slice.as_chunks_unchecked_mut() };
-chunks[1] = ['a', 'x', '?'];
-assert_eq!(slice, &['L', 'o', 'r', 'a', 'x', '?']);
-
-// These would be unsound:
-// let chunks: &[[_; 5]] = slice.as_chunks_unchecked_mut() // The slice length is not a multiple of 5
-// let chunks: &[[_; 0]] = slice.as_chunks_unchecked_mut() // Zero-length chunks are never allowed
-
source

pub fn as_chunks_mut<const N: usize>(&mut self) -> (&mut [[T; N]], &mut [T])

🔬This is a nightly-only experimental API. (slice_as_chunks)

Splits the slice into a slice of N-element arrays, -starting at the beginning of the slice, -and a remainder slice with length strictly less than N.

-
§Panics
-

Panics if N is 0. This check will most probably get changed to a compile time -error before this method gets stabilized.

-
§Examples
-
#![feature(slice_as_chunks)]
-let v = &mut [0, 0, 0, 0, 0];
-let mut count = 1;
-
-let (chunks, remainder) = v.as_chunks_mut();
-remainder[0] = 9;
-for chunk in chunks {
-    *chunk = [count; 2];
-    count += 1;
-}
-assert_eq!(v, &[1, 1, 2, 2, 9]);
-
source

pub fn as_rchunks_mut<const N: usize>(&mut self) -> (&mut [T], &mut [[T; N]])

🔬This is a nightly-only experimental API. (slice_as_chunks)

Splits the slice into a slice of N-element arrays, -starting at the end of the slice, -and a remainder slice with length strictly less than N.

-
§Panics
-

Panics if N is 0. This check will most probably get changed to a compile time -error before this method gets stabilized.

-
§Examples
-
#![feature(slice_as_chunks)]
-let v = &mut [0, 0, 0, 0, 0];
-let mut count = 1;
-
-let (remainder, chunks) = v.as_rchunks_mut();
-remainder[0] = 9;
-for chunk in chunks {
-    *chunk = [count; 2];
-    count += 1;
-}
-assert_eq!(v, &[9, 1, 1, 2, 2]);
-
source

pub fn array_chunks_mut<const N: usize>(&mut self) -> ArrayChunksMut<'_, T, N>

🔬This is a nightly-only experimental API. (array_chunks)

Returns an iterator over N elements of the slice at a time, starting at the -beginning of the slice.

-

The chunks are mutable array references and do not overlap. If N does not divide -the length of the slice, then the last up to N-1 elements will be omitted and -can be retrieved from the into_remainder function of the iterator.

-

This method is the const generic equivalent of chunks_exact_mut.

-
§Panics
-

Panics if N is 0. This check will most probably get changed to a compile time -error before this method gets stabilized.

-
§Examples
-
#![feature(array_chunks)]
-let v = &mut [0, 0, 0, 0, 0];
-let mut count = 1;
-
-for chunk in v.array_chunks_mut() {
-    *chunk = [count; 2];
-    count += 1;
-}
-assert_eq!(v, &[1, 1, 2, 2, 0]);
-
source

pub fn array_windows<const N: usize>(&self) -> ArrayWindows<'_, T, N>

🔬This is a nightly-only experimental API. (array_windows)

Returns an iterator over overlapping windows of N elements of a slice, -starting at the beginning of the slice.

-

This is the const generic equivalent of windows.

-

If N is greater than the size of the slice, it will return no windows.

-
§Panics
-

Panics if N is 0. This check will most probably get changed to a compile time -error before this method gets stabilized.

-
§Examples
-
#![feature(array_windows)]
-let slice = [0, 1, 2, 3];
-let mut iter = slice.array_windows();
-assert_eq!(iter.next().unwrap(), &[0, 1]);
-assert_eq!(iter.next().unwrap(), &[1, 2]);
-assert_eq!(iter.next().unwrap(), &[2, 3]);
-assert!(iter.next().is_none());
-
1.31.0 · source

pub fn rchunks(&self, chunk_size: usize) -> RChunks<'_, T>

Returns an iterator over chunk_size elements of the slice at a time, starting at the end -of the slice.

-

The chunks are slices and do not overlap. If chunk_size does not divide the length of the -slice, then the last chunk will not have length chunk_size.

-

See rchunks_exact for a variant of this iterator that returns chunks of always exactly -chunk_size elements, and chunks for the same iterator but starting at the beginning -of the slice.

-
§Panics
-

Panics if chunk_size is 0.

-
§Examples
-
let slice = ['l', 'o', 'r', 'e', 'm'];
-let mut iter = slice.rchunks(2);
-assert_eq!(iter.next().unwrap(), &['e', 'm']);
-assert_eq!(iter.next().unwrap(), &['o', 'r']);
-assert_eq!(iter.next().unwrap(), &['l']);
-assert!(iter.next().is_none());
-
1.31.0 · source

pub fn rchunks_mut(&mut self, chunk_size: usize) -> RChunksMut<'_, T>

Returns an iterator over chunk_size elements of the slice at a time, starting at the end -of the slice.

-

The chunks are mutable slices, and do not overlap. If chunk_size does not divide the -length of the slice, then the last chunk will not have length chunk_size.

-

See rchunks_exact_mut for a variant of this iterator that returns chunks of always -exactly chunk_size elements, and chunks_mut for the same iterator but starting at the -beginning of the slice.

-
§Panics
-

Panics if chunk_size is 0.

-
§Examples
-
let v = &mut [0, 0, 0, 0, 0];
-let mut count = 1;
-
-for chunk in v.rchunks_mut(2) {
-    for elem in chunk.iter_mut() {
-        *elem += count;
-    }
-    count += 1;
-}
-assert_eq!(v, &[3, 2, 2, 1, 1]);
-
1.31.0 · source

pub fn rchunks_exact(&self, chunk_size: usize) -> RChunksExact<'_, T>

Returns an iterator over chunk_size elements of the slice at a time, starting at the -end of the slice.

-

The chunks are slices and do not overlap. If chunk_size does not divide the length of the -slice, then the last up to chunk_size-1 elements will be omitted and can be retrieved -from the remainder function of the iterator.

-

Due to each chunk having exactly chunk_size elements, the compiler can often optimize the -resulting code better than in the case of rchunks.

-

See rchunks for a variant of this iterator that also returns the remainder as a smaller -chunk, and chunks_exact for the same iterator but starting at the beginning of the -slice.

-
§Panics
-

Panics if chunk_size is 0.

-
§Examples
-
let slice = ['l', 'o', 'r', 'e', 'm'];
-let mut iter = slice.rchunks_exact(2);
-assert_eq!(iter.next().unwrap(), &['e', 'm']);
-assert_eq!(iter.next().unwrap(), &['o', 'r']);
-assert!(iter.next().is_none());
-assert_eq!(iter.remainder(), &['l']);
-
1.31.0 · source

pub fn rchunks_exact_mut(&mut self, chunk_size: usize) -> RChunksExactMut<'_, T>

Returns an iterator over chunk_size elements of the slice at a time, starting at the end -of the slice.

-

The chunks are mutable slices, and do not overlap. If chunk_size does not divide the -length of the slice, then the last up to chunk_size-1 elements will be omitted and can be -retrieved from the into_remainder function of the iterator.

-

Due to each chunk having exactly chunk_size elements, the compiler can often optimize the -resulting code better than in the case of chunks_mut.

-

See rchunks_mut for a variant of this iterator that also returns the remainder as a -smaller chunk, and chunks_exact_mut for the same iterator but starting at the beginning -of the slice.

-
§Panics
-

Panics if chunk_size is 0.

-
§Examples
-
let v = &mut [0, 0, 0, 0, 0];
-let mut count = 1;
-
-for chunk in v.rchunks_exact_mut(2) {
-    for elem in chunk.iter_mut() {
-        *elem += count;
-    }
-    count += 1;
-}
-assert_eq!(v, &[0, 2, 2, 1, 1]);
-
1.77.0 · source

pub fn chunk_by<F>(&self, pred: F) -> ChunkBy<'_, T, F>
where - F: FnMut(&T, &T) -> bool,

Returns an iterator over the slice producing non-overlapping runs -of elements using the predicate to separate them.

-

The predicate is called for every pair of consecutive elements, -meaning that it is called on slice[0] and slice[1], -followed by slice[1] and slice[2], and so on.

-
§Examples
-
let slice = &[1, 1, 1, 3, 3, 2, 2, 2];
-
-let mut iter = slice.chunk_by(|a, b| a == b);
-
-assert_eq!(iter.next(), Some(&[1, 1, 1][..]));
-assert_eq!(iter.next(), Some(&[3, 3][..]));
-assert_eq!(iter.next(), Some(&[2, 2, 2][..]));
-assert_eq!(iter.next(), None);
-

This method can be used to extract the sorted subslices:

- -
let slice = &[1, 1, 2, 3, 2, 3, 2, 3, 4];
-
-let mut iter = slice.chunk_by(|a, b| a <= b);
-
-assert_eq!(iter.next(), Some(&[1, 1, 2, 3][..]));
-assert_eq!(iter.next(), Some(&[2, 3][..]));
-assert_eq!(iter.next(), Some(&[2, 3, 4][..]));
-assert_eq!(iter.next(), None);
-
1.77.0 · source

pub fn chunk_by_mut<F>(&mut self, pred: F) -> ChunkByMut<'_, T, F>
where - F: FnMut(&T, &T) -> bool,

Returns an iterator over the slice producing non-overlapping mutable -runs of elements using the predicate to separate them.

-

The predicate is called for every pair of consecutive elements, -meaning that it is called on slice[0] and slice[1], -followed by slice[1] and slice[2], and so on.

-
§Examples
-
let slice = &mut [1, 1, 1, 3, 3, 2, 2, 2];
-
-let mut iter = slice.chunk_by_mut(|a, b| a == b);
-
-assert_eq!(iter.next(), Some(&mut [1, 1, 1][..]));
-assert_eq!(iter.next(), Some(&mut [3, 3][..]));
-assert_eq!(iter.next(), Some(&mut [2, 2, 2][..]));
-assert_eq!(iter.next(), None);
-

This method can be used to extract the sorted subslices:

- -
let slice = &mut [1, 1, 2, 3, 2, 3, 2, 3, 4];
-
-let mut iter = slice.chunk_by_mut(|a, b| a <= b);
-
-assert_eq!(iter.next(), Some(&mut [1, 1, 2, 3][..]));
-assert_eq!(iter.next(), Some(&mut [2, 3][..]));
-assert_eq!(iter.next(), Some(&mut [2, 3, 4][..]));
-assert_eq!(iter.next(), None);
-
1.0.0 · source

pub fn split_at(&self, mid: usize) -> (&[T], &[T])

Divides one slice into two at an index.

-

The first will contain all indices from [0, mid) (excluding -the index mid itself) and the second will contain all -indices from [mid, len) (excluding the index len itself).

-
§Panics
-

Panics if mid > len. For a non-panicking alternative see -split_at_checked.

-
§Examples
-
let v = [1, 2, 3, 4, 5, 6];
-
-{
-   let (left, right) = v.split_at(0);
-   assert_eq!(left, []);
-   assert_eq!(right, [1, 2, 3, 4, 5, 6]);
-}
-
-{
-    let (left, right) = v.split_at(2);
-    assert_eq!(left, [1, 2]);
-    assert_eq!(right, [3, 4, 5, 6]);
-}
-
-{
-    let (left, right) = v.split_at(6);
-    assert_eq!(left, [1, 2, 3, 4, 5, 6]);
-    assert_eq!(right, []);
-}
-
1.0.0 · source

pub fn split_at_mut(&mut self, mid: usize) -> (&mut [T], &mut [T])

Divides one mutable slice into two at an index.

-

The first will contain all indices from [0, mid) (excluding -the index mid itself) and the second will contain all -indices from [mid, len) (excluding the index len itself).

-
§Panics
-

Panics if mid > len. For a non-panicking alternative see -split_at_mut_checked.

-
§Examples
-
let mut v = [1, 0, 3, 0, 5, 6];
-let (left, right) = v.split_at_mut(2);
-assert_eq!(left, [1, 0]);
-assert_eq!(right, [3, 0, 5, 6]);
-left[1] = 2;
-right[1] = 4;
-assert_eq!(v, [1, 2, 3, 4, 5, 6]);
-
1.79.0 · source

pub unsafe fn split_at_unchecked(&self, mid: usize) -> (&[T], &[T])

Divides one slice into two at an index, without doing bounds checking.

-

The first will contain all indices from [0, mid) (excluding -the index mid itself) and the second will contain all -indices from [mid, len) (excluding the index len itself).

-

For a safe alternative see split_at.

-
§Safety
-

Calling this method with an out-of-bounds index is undefined behavior -even if the resulting reference is not used. The caller has to ensure that -0 <= mid <= self.len().

-
§Examples
-
let v = [1, 2, 3, 4, 5, 6];
-
-unsafe {
-   let (left, right) = v.split_at_unchecked(0);
-   assert_eq!(left, []);
-   assert_eq!(right, [1, 2, 3, 4, 5, 6]);
-}
-
-unsafe {
-    let (left, right) = v.split_at_unchecked(2);
-    assert_eq!(left, [1, 2]);
-    assert_eq!(right, [3, 4, 5, 6]);
-}
-
-unsafe {
-    let (left, right) = v.split_at_unchecked(6);
-    assert_eq!(left, [1, 2, 3, 4, 5, 6]);
-    assert_eq!(right, []);
-}
-
1.79.0 · source

pub unsafe fn split_at_mut_unchecked( - &mut self, - mid: usize, -) -> (&mut [T], &mut [T])

Divides one mutable slice into two at an index, without doing bounds checking.

-

The first will contain all indices from [0, mid) (excluding -the index mid itself) and the second will contain all -indices from [mid, len) (excluding the index len itself).

-

For a safe alternative see split_at_mut.

-
§Safety
-

Calling this method with an out-of-bounds index is undefined behavior -even if the resulting reference is not used. The caller has to ensure that -0 <= mid <= self.len().

-
§Examples
-
let mut v = [1, 0, 3, 0, 5, 6];
-// scoped to restrict the lifetime of the borrows
-unsafe {
-    let (left, right) = v.split_at_mut_unchecked(2);
-    assert_eq!(left, [1, 0]);
-    assert_eq!(right, [3, 0, 5, 6]);
-    left[1] = 2;
-    right[1] = 4;
-}
-assert_eq!(v, [1, 2, 3, 4, 5, 6]);
-
1.80.0 · source

pub fn split_at_checked(&self, mid: usize) -> Option<(&[T], &[T])>

Divides one slice into two at an index, returning None if the slice is -too short.

-

If mid ≤ len returns a pair of slices where the first will contain all -indices from [0, mid) (excluding the index mid itself) and the -second will contain all indices from [mid, len) (excluding the index -len itself).

-

Otherwise, if mid > len, returns None.

-
§Examples
-
let v = [1, -2, 3, -4, 5, -6];
-
-{
-   let (left, right) = v.split_at_checked(0).unwrap();
-   assert_eq!(left, []);
-   assert_eq!(right, [1, -2, 3, -4, 5, -6]);
-}
-
-{
-    let (left, right) = v.split_at_checked(2).unwrap();
-    assert_eq!(left, [1, -2]);
-    assert_eq!(right, [3, -4, 5, -6]);
-}
-
-{
-    let (left, right) = v.split_at_checked(6).unwrap();
-    assert_eq!(left, [1, -2, 3, -4, 5, -6]);
-    assert_eq!(right, []);
-}
-
-assert_eq!(None, v.split_at_checked(7));
-
1.80.0 · source

pub fn split_at_mut_checked( - &mut self, - mid: usize, -) -> Option<(&mut [T], &mut [T])>

Divides one mutable slice into two at an index, returning None if the -slice is too short.

-

If mid ≤ len returns a pair of slices where the first will contain all -indices from [0, mid) (excluding the index mid itself) and the -second will contain all indices from [mid, len) (excluding the index -len itself).

-

Otherwise, if mid > len, returns None.

-
§Examples
-
let mut v = [1, 0, 3, 0, 5, 6];
-
-if let Some((left, right)) = v.split_at_mut_checked(2) {
-    assert_eq!(left, [1, 0]);
-    assert_eq!(right, [3, 0, 5, 6]);
-    left[1] = 2;
-    right[1] = 4;
-}
-assert_eq!(v, [1, 2, 3, 4, 5, 6]);
-
-assert_eq!(None, v.split_at_mut_checked(7));
-
1.0.0 · source

pub fn split<F>(&self, pred: F) -> Split<'_, T, F>
where - F: FnMut(&T) -> bool,

Returns an iterator over subslices separated by elements that match -pred. The matched element is not contained in the subslices.

-
§Examples
-
let slice = [10, 40, 33, 20];
-let mut iter = slice.split(|num| num % 3 == 0);
-
-assert_eq!(iter.next().unwrap(), &[10, 40]);
-assert_eq!(iter.next().unwrap(), &[20]);
-assert!(iter.next().is_none());
-

If the first element is matched, an empty slice will be the first item -returned by the iterator. Similarly, if the last element in the slice -is matched, an empty slice will be the last item returned by the -iterator:

- -
let slice = [10, 40, 33];
-let mut iter = slice.split(|num| num % 3 == 0);
-
-assert_eq!(iter.next().unwrap(), &[10, 40]);
-assert_eq!(iter.next().unwrap(), &[]);
-assert!(iter.next().is_none());
-

If two matched elements are directly adjacent, an empty slice will be -present between them:

- -
let slice = [10, 6, 33, 20];
-let mut iter = slice.split(|num| num % 3 == 0);
-
-assert_eq!(iter.next().unwrap(), &[10]);
-assert_eq!(iter.next().unwrap(), &[]);
-assert_eq!(iter.next().unwrap(), &[20]);
-assert!(iter.next().is_none());
-
1.0.0 · source

pub fn split_mut<F>(&mut self, pred: F) -> SplitMut<'_, T, F>
where - F: FnMut(&T) -> bool,

Returns an iterator over mutable subslices separated by elements that -match pred. The matched element is not contained in the subslices.

-
§Examples
-
let mut v = [10, 40, 30, 20, 60, 50];
-
-for group in v.split_mut(|num| *num % 3 == 0) {
-    group[0] = 1;
-}
-assert_eq!(v, [1, 40, 30, 1, 60, 1]);
-
1.51.0 · source

pub fn split_inclusive<F>(&self, pred: F) -> SplitInclusive<'_, T, F>
where - F: FnMut(&T) -> bool,

Returns an iterator over subslices separated by elements that match -pred. The matched element is contained in the end of the previous -subslice as a terminator.

-
§Examples
-
let slice = [10, 40, 33, 20];
-let mut iter = slice.split_inclusive(|num| num % 3 == 0);
-
-assert_eq!(iter.next().unwrap(), &[10, 40, 33]);
-assert_eq!(iter.next().unwrap(), &[20]);
-assert!(iter.next().is_none());
-

If the last element of the slice is matched, -that element will be considered the terminator of the preceding slice. -That slice will be the last item returned by the iterator.

- -
let slice = [3, 10, 40, 33];
-let mut iter = slice.split_inclusive(|num| num % 3 == 0);
-
-assert_eq!(iter.next().unwrap(), &[3]);
-assert_eq!(iter.next().unwrap(), &[10, 40, 33]);
-assert!(iter.next().is_none());
-
1.51.0 · source

pub fn split_inclusive_mut<F>(&mut self, pred: F) -> SplitInclusiveMut<'_, T, F>
where - F: FnMut(&T) -> bool,

Returns an iterator over mutable subslices separated by elements that -match pred. The matched element is contained in the previous -subslice as a terminator.

-
§Examples
-
let mut v = [10, 40, 30, 20, 60, 50];
-
-for group in v.split_inclusive_mut(|num| *num % 3 == 0) {
-    let terminator_idx = group.len()-1;
-    group[terminator_idx] = 1;
-}
-assert_eq!(v, [10, 40, 1, 20, 1, 1]);
-
1.27.0 · source

pub fn rsplit<F>(&self, pred: F) -> RSplit<'_, T, F>
where - F: FnMut(&T) -> bool,

Returns an iterator over subslices separated by elements that match -pred, starting at the end of the slice and working backwards. -The matched element is not contained in the subslices.

-
§Examples
-
let slice = [11, 22, 33, 0, 44, 55];
-let mut iter = slice.rsplit(|num| *num == 0);
-
-assert_eq!(iter.next().unwrap(), &[44, 55]);
-assert_eq!(iter.next().unwrap(), &[11, 22, 33]);
-assert_eq!(iter.next(), None);
-

As with split(), if the first or last element is matched, an empty -slice will be the first (or last) item returned by the iterator.

- -
let v = &[0, 1, 1, 2, 3, 5, 8];
-let mut it = v.rsplit(|n| *n % 2 == 0);
-assert_eq!(it.next().unwrap(), &[]);
-assert_eq!(it.next().unwrap(), &[3, 5]);
-assert_eq!(it.next().unwrap(), &[1, 1]);
-assert_eq!(it.next().unwrap(), &[]);
-assert_eq!(it.next(), None);
-
1.27.0 · source

pub fn rsplit_mut<F>(&mut self, pred: F) -> RSplitMut<'_, T, F>
where - F: FnMut(&T) -> bool,

Returns an iterator over mutable subslices separated by elements that -match pred, starting at the end of the slice and working -backwards. The matched element is not contained in the subslices.

-
§Examples
-
let mut v = [100, 400, 300, 200, 600, 500];
-
-let mut count = 0;
-for group in v.rsplit_mut(|num| *num % 3 == 0) {
-    count += 1;
-    group[0] = count;
-}
-assert_eq!(v, [3, 400, 300, 2, 600, 1]);
-
1.0.0 · source

pub fn splitn<F>(&self, n: usize, pred: F) -> SplitN<'_, T, F>
where - F: FnMut(&T) -> bool,

Returns an iterator over subslices separated by elements that match -pred, limited to returning at most n items. The matched element is -not contained in the subslices.

-

The last element returned, if any, will contain the remainder of the -slice.

-
§Examples
-

Print the slice split once by numbers divisible by 3 (i.e., [10, 40], -[20, 60, 50]):

- -
let v = [10, 40, 30, 20, 60, 50];
-
-for group in v.splitn(2, |num| *num % 3 == 0) {
-    println!("{group:?}");
-}
-
1.0.0 · source

pub fn splitn_mut<F>(&mut self, n: usize, pred: F) -> SplitNMut<'_, T, F>
where - F: FnMut(&T) -> bool,

Returns an iterator over mutable subslices separated by elements that match -pred, limited to returning at most n items. The matched element is -not contained in the subslices.

-

The last element returned, if any, will contain the remainder of the -slice.

-
§Examples
-
let mut v = [10, 40, 30, 20, 60, 50];
-
-for group in v.splitn_mut(2, |num| *num % 3 == 0) {
-    group[0] = 1;
-}
-assert_eq!(v, [1, 40, 30, 1, 60, 50]);
-
1.0.0 · source

pub fn rsplitn<F>(&self, n: usize, pred: F) -> RSplitN<'_, T, F>
where - F: FnMut(&T) -> bool,

Returns an iterator over subslices separated by elements that match -pred limited to returning at most n items. This starts at the end of -the slice and works backwards. The matched element is not contained in -the subslices.

-

The last element returned, if any, will contain the remainder of the -slice.

-
§Examples
-

Print the slice split once, starting from the end, by numbers divisible -by 3 (i.e., [50], [10, 40, 30, 20]):

- -
let v = [10, 40, 30, 20, 60, 50];
-
-for group in v.rsplitn(2, |num| *num % 3 == 0) {
-    println!("{group:?}");
-}
-
1.0.0 · source

pub fn rsplitn_mut<F>(&mut self, n: usize, pred: F) -> RSplitNMut<'_, T, F>
where - F: FnMut(&T) -> bool,

Returns an iterator over subslices separated by elements that match -pred limited to returning at most n items. This starts at the end of -the slice and works backwards. The matched element is not contained in -the subslices.

-

The last element returned, if any, will contain the remainder of the -slice.

-
§Examples
-
let mut s = [10, 40, 30, 20, 60, 50];
-
-for group in s.rsplitn_mut(2, |num| *num % 3 == 0) {
-    group[0] = 1;
-}
-assert_eq!(s, [1, 40, 30, 20, 60, 1]);
-
source

pub fn split_once<F>(&self, pred: F) -> Option<(&[T], &[T])>
where - F: FnMut(&T) -> bool,

🔬This is a nightly-only experimental API. (slice_split_once)

Splits the slice on the first element that matches the specified -predicate.

-

If any matching elements are present in the slice, returns the prefix -before the match and suffix after. The matching element itself is not -included. If no elements match, returns None.

-
§Examples
-
#![feature(slice_split_once)]
-let s = [1, 2, 3, 2, 4];
-assert_eq!(s.split_once(|&x| x == 2), Some((
-    &[1][..],
-    &[3, 2, 4][..]
-)));
-assert_eq!(s.split_once(|&x| x == 0), None);
-
source

pub fn rsplit_once<F>(&self, pred: F) -> Option<(&[T], &[T])>
where - F: FnMut(&T) -> bool,

🔬This is a nightly-only experimental API. (slice_split_once)

Splits the slice on the last element that matches the specified -predicate.

-

If any matching elements are present in the slice, returns the prefix -before the match and suffix after. The matching element itself is not -included. If no elements match, returns None.

-
§Examples
-
#![feature(slice_split_once)]
-let s = [1, 2, 3, 2, 4];
-assert_eq!(s.rsplit_once(|&x| x == 2), Some((
-    &[1, 2, 3][..],
-    &[4][..]
-)));
-assert_eq!(s.rsplit_once(|&x| x == 0), None);
-
1.0.0 · source

pub fn contains(&self, x: &T) -> bool
where - T: PartialEq,

Returns true if the slice contains an element with the given value.

-

This operation is O(n).

-

Note that if you have a sorted slice, binary_search may be faster.

-
§Examples
-
let v = [10, 40, 30];
-assert!(v.contains(&30));
-assert!(!v.contains(&50));
-

If you do not have a &T, but some other value that you can compare -with one (for example, String implements PartialEq<str>), you can -use iter().any:

- -
let v = [String::from("hello"), String::from("world")]; // slice of `String`
-assert!(v.iter().any(|e| e == "hello")); // search with `&str`
-assert!(!v.iter().any(|e| e == "hi"));
-
1.0.0 · source

pub fn starts_with(&self, needle: &[T]) -> bool
where - T: PartialEq,

Returns true if needle is a prefix of the slice or equal to the slice.

-
§Examples
-
let v = [10, 40, 30];
-assert!(v.starts_with(&[10]));
-assert!(v.starts_with(&[10, 40]));
-assert!(v.starts_with(&v));
-assert!(!v.starts_with(&[50]));
-assert!(!v.starts_with(&[10, 50]));
-

Always returns true if needle is an empty slice:

- -
let v = &[10, 40, 30];
-assert!(v.starts_with(&[]));
-let v: &[u8] = &[];
-assert!(v.starts_with(&[]));
-
1.0.0 · source

pub fn ends_with(&self, needle: &[T]) -> bool
where - T: PartialEq,

Returns true if needle is a suffix of the slice or equal to the slice.

-
§Examples
-
let v = [10, 40, 30];
-assert!(v.ends_with(&[30]));
-assert!(v.ends_with(&[40, 30]));
-assert!(v.ends_with(&v));
-assert!(!v.ends_with(&[50]));
-assert!(!v.ends_with(&[50, 30]));
-

Always returns true if needle is an empty slice:

- -
let v = &[10, 40, 30];
-assert!(v.ends_with(&[]));
-let v: &[u8] = &[];
-assert!(v.ends_with(&[]));
-
1.51.0 · source

pub fn strip_prefix<P>(&self, prefix: &P) -> Option<&[T]>
where - P: SlicePattern<Item = T> + ?Sized, - T: PartialEq,

Returns a subslice with the prefix removed.

-

If the slice starts with prefix, returns the subslice after the prefix, wrapped in Some. -If prefix is empty, simply returns the original slice. If prefix is equal to the -original slice, returns an empty slice.

-

If the slice does not start with prefix, returns None.

-
§Examples
-
let v = &[10, 40, 30];
-assert_eq!(v.strip_prefix(&[10]), Some(&[40, 30][..]));
-assert_eq!(v.strip_prefix(&[10, 40]), Some(&[30][..]));
-assert_eq!(v.strip_prefix(&[10, 40, 30]), Some(&[][..]));
-assert_eq!(v.strip_prefix(&[50]), None);
-assert_eq!(v.strip_prefix(&[10, 50]), None);
-
-let prefix : &str = "he";
-assert_eq!(b"hello".strip_prefix(prefix.as_bytes()),
-           Some(b"llo".as_ref()));
-
1.51.0 · source

pub fn strip_suffix<P>(&self, suffix: &P) -> Option<&[T]>
where - P: SlicePattern<Item = T> + ?Sized, - T: PartialEq,

Returns a subslice with the suffix removed.

-

If the slice ends with suffix, returns the subslice before the suffix, wrapped in Some. -If suffix is empty, simply returns the original slice. If suffix is equal to the -original slice, returns an empty slice.

-

If the slice does not end with suffix, returns None.

-
§Examples
-
let v = &[10, 40, 30];
-assert_eq!(v.strip_suffix(&[30]), Some(&[10, 40][..]));
-assert_eq!(v.strip_suffix(&[40, 30]), Some(&[10][..]));
-assert_eq!(v.strip_suffix(&[10, 40, 30]), Some(&[][..]));
-assert_eq!(v.strip_suffix(&[50]), None);
-assert_eq!(v.strip_suffix(&[50, 30]), None);
-

Binary searches this slice for a given element. -If the slice is not sorted, the returned result is unspecified and -meaningless.

-

If the value is found then Result::Ok is returned, containing the -index of the matching element. If there are multiple matches, then any -one of the matches could be returned. The index is chosen -deterministically, but is subject to change in future versions of Rust. -If the value is not found then Result::Err is returned, containing -the index where a matching element could be inserted while maintaining -sorted order.

-

See also binary_search_by, binary_search_by_key, and partition_point.

-
§Examples
-

Looks up a series of four elements. The first is found, with a -uniquely determined position; the second and third are not -found; the fourth could match any position in [1, 4].

- -
let s = [0, 1, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55];
-
-assert_eq!(s.binary_search(&13),  Ok(9));
-assert_eq!(s.binary_search(&4),   Err(7));
-assert_eq!(s.binary_search(&100), Err(13));
-let r = s.binary_search(&1);
-assert!(match r { Ok(1..=4) => true, _ => false, });
-

If you want to find that whole range of matching items, rather than -an arbitrary matching one, that can be done using partition_point:

- -
let s = [0, 1, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55];
-
-let low = s.partition_point(|x| x < &1);
-assert_eq!(low, 1);
-let high = s.partition_point(|x| x <= &1);
-assert_eq!(high, 5);
-let r = s.binary_search(&1);
-assert!((low..high).contains(&r.unwrap()));
-
-assert!(s[..low].iter().all(|&x| x < 1));
-assert!(s[low..high].iter().all(|&x| x == 1));
-assert!(s[high..].iter().all(|&x| x > 1));
-
-// For something not found, the "range" of equal items is empty
-assert_eq!(s.partition_point(|x| x < &11), 9);
-assert_eq!(s.partition_point(|x| x <= &11), 9);
-assert_eq!(s.binary_search(&11), Err(9));
-

If you want to insert an item to a sorted vector, while maintaining -sort order, consider using partition_point:

- -
let mut s = vec![0, 1, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55];
-let num = 42;
-let idx = s.partition_point(|&x| x <= num);
-// If `num` is unique, `s.partition_point(|&x| x < num)` (with `<`) is equivalent to
-// `s.binary_search(&num).unwrap_or_else(|x| x)`, but using `<=` will allow `insert`
-// to shift less elements.
-s.insert(idx, num);
-assert_eq!(s, [0, 1, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 42, 55]);
-
1.0.0 · source

pub fn binary_search_by<'a, F>(&'a self, f: F) -> Result<usize, usize>
where - F: FnMut(&'a T) -> Ordering,

Binary searches this slice with a comparator function.

-

The comparator function should return an order code that indicates -whether its argument is Less, Equal or Greater the desired -target. -If the slice is not sorted or if the comparator function does not -implement an order consistent with the sort order of the underlying -slice, the returned result is unspecified and meaningless.

-

If the value is found then Result::Ok is returned, containing the -index of the matching element. If there are multiple matches, then any -one of the matches could be returned. The index is chosen -deterministically, but is subject to change in future versions of Rust. -If the value is not found then Result::Err is returned, containing -the index where a matching element could be inserted while maintaining -sorted order.

-

See also binary_search, binary_search_by_key, and partition_point.

-
§Examples
-

Looks up a series of four elements. The first is found, with a -uniquely determined position; the second and third are not -found; the fourth could match any position in [1, 4].

- -
let s = [0, 1, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55];
-
-let seek = 13;
-assert_eq!(s.binary_search_by(|probe| probe.cmp(&seek)), Ok(9));
-let seek = 4;
-assert_eq!(s.binary_search_by(|probe| probe.cmp(&seek)), Err(7));
-let seek = 100;
-assert_eq!(s.binary_search_by(|probe| probe.cmp(&seek)), Err(13));
-let seek = 1;
-let r = s.binary_search_by(|probe| probe.cmp(&seek));
-assert!(match r { Ok(1..=4) => true, _ => false, });
-
1.10.0 · source

pub fn binary_search_by_key<'a, B, F>( - &'a self, - b: &B, - f: F, -) -> Result<usize, usize>
where - F: FnMut(&'a T) -> B, - B: Ord,

Binary searches this slice with a key extraction function.

-

Assumes that the slice is sorted by the key, for instance with -sort_by_key using the same key extraction function. -If the slice is not sorted by the key, the returned result is -unspecified and meaningless.

-

If the value is found then Result::Ok is returned, containing the -index of the matching element. If there are multiple matches, then any -one of the matches could be returned. The index is chosen -deterministically, but is subject to change in future versions of Rust. -If the value is not found then Result::Err is returned, containing -the index where a matching element could be inserted while maintaining -sorted order.

-

See also binary_search, binary_search_by, and partition_point.

-
§Examples
-

Looks up a series of four elements in a slice of pairs sorted by -their second elements. The first is found, with a uniquely -determined position; the second and third are not found; the -fourth could match any position in [1, 4].

- -
let s = [(0, 0), (2, 1), (4, 1), (5, 1), (3, 1),
-         (1, 2), (2, 3), (4, 5), (5, 8), (3, 13),
-         (1, 21), (2, 34), (4, 55)];
-
-assert_eq!(s.binary_search_by_key(&13, |&(a, b)| b),  Ok(9));
-assert_eq!(s.binary_search_by_key(&4, |&(a, b)| b),   Err(7));
-assert_eq!(s.binary_search_by_key(&100, |&(a, b)| b), Err(13));
-let r = s.binary_search_by_key(&1, |&(a, b)| b);
-assert!(match r { Ok(1..=4) => true, _ => false, });
-
1.20.0 · source

pub fn sort_unstable(&mut self)
where - T: Ord,

Sorts the slice without preserving the initial order of equal elements.

-

This sort is unstable (i.e., may reorder equal elements), in-place (i.e., does not -allocate), and O(n * log(n)) worst-case.

-

If the implementation of Ord for T does not implement a total order the resulting -order of elements in the slice is unspecified. All original elements will remain in the -slice and any possible modifications via interior mutability are observed in the input. Same -is true if the implementation of Ord for T panics.

-

Sorting types that only implement PartialOrd such as f32 and f64 require -additional precautions. For example, f32::NAN != f32::NAN, which doesn’t fulfill the -reflexivity requirement of Ord. By using an alternative comparison function with -slice::sort_unstable_by such as f32::total_cmp or f64::total_cmp that defines a -total order users can sort slices containing floating-point values. Alternatively, if all -values in the slice are guaranteed to be in a subset for which PartialOrd::partial_cmp -forms a total order, it’s possible to sort the slice with sort_unstable_by(|a, b| a.partial_cmp(b).unwrap()).

-
§Current implementation
-

The current implementation is based on ipnsort by Lukas Bergdoll and Orson Peters, which -combines the fast average case of quicksort with the fast worst case of heapsort, achieving -linear time on fully sorted and reversed inputs. On inputs with k distinct elements, the -expected time to sort the data is O(n * log(k)).

-

It is typically faster than stable sorting, except in a few special cases, e.g., when the -slice is partially sorted.

-
§Panics
-

May panic if the implementation of Ord for T does not implement a total order.

-
§Examples
-
let mut v = [4, -5, 1, -3, 2];
-
-v.sort_unstable();
-assert_eq!(v, [-5, -3, 1, 2, 4]);
-
1.20.0 · source

pub fn sort_unstable_by<F>(&mut self, compare: F)
where - F: FnMut(&T, &T) -> Ordering,

Sorts the slice with a comparison function, without preserving the initial order of -equal elements.

-

This sort is unstable (i.e., may reorder equal elements), in-place (i.e., does not -allocate), and O(n * log(n)) worst-case.

-

If the comparison function compare does not implement a total order the resulting order -of elements in the slice is unspecified. All original elements will remain in the slice and -any possible modifications via interior mutability are observed in the input. Same is true -if compare panics.

-

For example |a, b| (a - b).cmp(a) is a comparison function that is neither transitive nor -reflexive nor total, a < b < c < a with a = 1, b = 2, c = 3. For more information and -examples see the Ord documentation.

-
§Current implementation
-

The current implementation is based on ipnsort by Lukas Bergdoll and Orson Peters, which -combines the fast average case of quicksort with the fast worst case of heapsort, achieving -linear time on fully sorted and reversed inputs. On inputs with k distinct elements, the -expected time to sort the data is O(n * log(k)).

-

It is typically faster than stable sorting, except in a few special cases, e.g., when the -slice is partially sorted.

-
§Panics
-

May panic if compare does not implement a total order.

-
§Examples
-
let mut v = [4, -5, 1, -3, 2];
-v.sort_unstable_by(|a, b| a.cmp(b));
-assert_eq!(v, [-5, -3, 1, 2, 4]);
-
-// reverse sorting
-v.sort_unstable_by(|a, b| b.cmp(a));
-assert_eq!(v, [4, 2, 1, -3, -5]);
-
1.20.0 · source

pub fn sort_unstable_by_key<K, F>(&mut self, f: F)
where - F: FnMut(&T) -> K, - K: Ord,

Sorts the slice with a key extraction function, without preserving the initial order of -equal elements.

-

This sort is unstable (i.e., may reorder equal elements), in-place (i.e., does not -allocate), and O(n * log(n)) worst-case.

-

If the implementation of Ord for K does not implement a total order the resulting -order of elements in the slice is unspecified. All original elements will remain in the -slice and any possible modifications via interior mutability are observed in the input. Same -is true if the implementation of Ord for K panics.

-
§Current implementation
-

The current implementation is based on ipnsort by Lukas Bergdoll and Orson Peters, which -combines the fast average case of quicksort with the fast worst case of heapsort, achieving -linear time on fully sorted and reversed inputs. On inputs with k distinct elements, the -expected time to sort the data is O(n * log(k)).

-

It is typically faster than stable sorting, except in a few special cases, e.g., when the -slice is partially sorted.

-
§Panics
-

May panic if the implementation of Ord for K does not implement a total order.

-
§Examples
-
let mut v = [4i32, -5, 1, -3, 2];
-
-v.sort_unstable_by_key(|k| k.abs());
-assert_eq!(v, [1, 2, -3, 4, -5]);
-
1.49.0 · source

pub fn select_nth_unstable( - &mut self, - index: usize, -) -> (&mut [T], &mut T, &mut [T])
where - T: Ord,

Reorders the slice such that the element at index after the reordering is at its final -sorted position.

-

This reordering has the additional property that any value at position i < index will be -less than or equal to any value at a position j > index. Additionally, this reordering is -unstable (i.e. any number of equal elements may end up at position index), in-place (i.e. -does not allocate), and runs in O(n) time. This function is also known as “kth element” -in other libraries.

-

It returns a triplet of the following from the reordered slice: the subslice prior to -index, the element at index, and the subslice after index; accordingly, the values in -those two subslices will respectively all be less-than-or-equal-to and -greater-than-or-equal-to the value of the element at index.

-
§Current implementation
-

The current algorithm is an introselect implementation based on ipnsort by Lukas Bergdoll -and Orson Peters, which is also the basis for sort_unstable. The fallback algorithm is -Median of Medians using Tukey’s Ninther for pivot selection, which guarantees linear runtime -for all inputs.

-
§Panics
-

Panics when index >= len(), meaning it always panics on empty slices.

-

May panic if the implementation of Ord for T does not implement a total order.

-
§Examples
-
let mut v = [-5i32, 4, 2, -3, 1];
-
-// Find the items less than or equal to the median, the median, and greater than or equal to
-// the median.
-let (lesser, median, greater) = v.select_nth_unstable(2);
-
-assert!(lesser == [-3, -5] || lesser == [-5, -3]);
-assert_eq!(median, &mut 1);
-assert!(greater == [4, 2] || greater == [2, 4]);
-
-// We are only guaranteed the slice will be one of the following, based on the way we sort
-// about the specified index.
-assert!(v == [-3, -5, 1, 2, 4] ||
-        v == [-5, -3, 1, 2, 4] ||
-        v == [-3, -5, 1, 4, 2] ||
-        v == [-5, -3, 1, 4, 2]);
-
1.49.0 · source

pub fn select_nth_unstable_by<F>( - &mut self, - index: usize, - compare: F, -) -> (&mut [T], &mut T, &mut [T])
where - F: FnMut(&T, &T) -> Ordering,

Reorders the slice with a comparator function such that the element at index after the -reordering is at its final sorted position.

-

This reordering has the additional property that any value at position i < index will be -less than or equal to any value at a position j > index using the comparator function. -Additionally, this reordering is unstable (i.e. any number of equal elements may end up at -position index), in-place (i.e. does not allocate), and runs in O(n) time. This -function is also known as “kth element” in other libraries.

-

It returns a triplet of the following from the slice reordered according to the provided -comparator function: the subslice prior to index, the element at index, and the subslice -after index; accordingly, the values in those two subslices will respectively all be -less-than-or-equal-to and greater-than-or-equal-to the value of the element at index.

-
§Current implementation
-

The current algorithm is an introselect implementation based on ipnsort by Lukas Bergdoll -and Orson Peters, which is also the basis for sort_unstable. The fallback algorithm is -Median of Medians using Tukey’s Ninther for pivot selection, which guarantees linear runtime -for all inputs.

-
§Panics
-

Panics when index >= len(), meaning it always panics on empty slices.

-

May panic if compare does not implement a total order.

-
§Examples
-
let mut v = [-5i32, 4, 2, -3, 1];
-
-// Find the items less than or equal to the median, the median, and greater than or equal to
-// the median as if the slice were sorted in descending order.
-let (lesser, median, greater) = v.select_nth_unstable_by(2, |a, b| b.cmp(a));
-
-assert!(lesser == [4, 2] || lesser == [2, 4]);
-assert_eq!(median, &mut 1);
-assert!(greater == [-3, -5] || greater == [-5, -3]);
-
-// We are only guaranteed the slice will be one of the following, based on the way we sort
-// about the specified index.
-assert!(v == [2, 4, 1, -5, -3] ||
-        v == [2, 4, 1, -3, -5] ||
-        v == [4, 2, 1, -5, -3] ||
-        v == [4, 2, 1, -3, -5]);
-
1.49.0 · source

pub fn select_nth_unstable_by_key<K, F>( - &mut self, - index: usize, - f: F, -) -> (&mut [T], &mut T, &mut [T])
where - F: FnMut(&T) -> K, - K: Ord,

Reorders the slice with a key extraction function such that the element at index after the -reordering is at its final sorted position.

-

This reordering has the additional property that any value at position i < index will be -less than or equal to any value at a position j > index using the key extraction function. -Additionally, this reordering is unstable (i.e. any number of equal elements may end up at -position index), in-place (i.e. does not allocate), and runs in O(n) time. This -function is also known as “kth element” in other libraries.

-

It returns a triplet of the following from the slice reordered according to the provided key -extraction function: the subslice prior to index, the element at index, and the subslice -after index; accordingly, the values in those two subslices will respectively all be -less-than-or-equal-to and greater-than-or-equal-to the value of the element at index.

-
§Current implementation
-

The current algorithm is an introselect implementation based on ipnsort by Lukas Bergdoll -and Orson Peters, which is also the basis for sort_unstable. The fallback algorithm is -Median of Medians using Tukey’s Ninther for pivot selection, which guarantees linear runtime -for all inputs.

-
§Panics
-

Panics when index >= len(), meaning it always panics on empty slices.

-

May panic if K: Ord does not implement a total order.

-
§Examples
-
let mut v = [-5i32, 4, 1, -3, 2];
-
-// Find the items less than or equal to the median, the median, and greater than or equal to
-// the median as if the slice were sorted according to absolute value.
-let (lesser, median, greater) = v.select_nth_unstable_by_key(2, |a| a.abs());
-
-assert!(lesser == [1, 2] || lesser == [2, 1]);
-assert_eq!(median, &mut -3);
-assert!(greater == [4, -5] || greater == [-5, 4]);
-
-// We are only guaranteed the slice will be one of the following, based on the way we sort
-// about the specified index.
-assert!(v == [1, 2, -3, 4, -5] ||
-        v == [1, 2, -3, -5, 4] ||
-        v == [2, 1, -3, 4, -5] ||
-        v == [2, 1, -3, -5, 4]);
-
source

pub fn partition_dedup(&mut self) -> (&mut [T], &mut [T])
where - T: PartialEq,

🔬This is a nightly-only experimental API. (slice_partition_dedup)

Moves all consecutive repeated elements to the end of the slice according to the -PartialEq trait implementation.

-

Returns two slices. The first contains no consecutive repeated elements. -The second contains all the duplicates in no specified order.

-

If the slice is sorted, the first returned slice contains no duplicates.

-
§Examples
-
#![feature(slice_partition_dedup)]
-
-let mut slice = [1, 2, 2, 3, 3, 2, 1, 1];
-
-let (dedup, duplicates) = slice.partition_dedup();
-
-assert_eq!(dedup, [1, 2, 3, 2, 1]);
-assert_eq!(duplicates, [2, 3, 1]);
-
source

pub fn partition_dedup_by<F>(&mut self, same_bucket: F) -> (&mut [T], &mut [T])
where - F: FnMut(&mut T, &mut T) -> bool,

🔬This is a nightly-only experimental API. (slice_partition_dedup)

Moves all but the first of consecutive elements to the end of the slice satisfying -a given equality relation.

-

Returns two slices. The first contains no consecutive repeated elements. -The second contains all the duplicates in no specified order.

-

The same_bucket function is passed references to two elements from the slice and -must determine if the elements compare equal. The elements are passed in opposite order -from their order in the slice, so if same_bucket(a, b) returns true, a is moved -at the end of the slice.

-

If the slice is sorted, the first returned slice contains no duplicates.

-
§Examples
-
#![feature(slice_partition_dedup)]
-
-let mut slice = ["foo", "Foo", "BAZ", "Bar", "bar", "baz", "BAZ"];
-
-let (dedup, duplicates) = slice.partition_dedup_by(|a, b| a.eq_ignore_ascii_case(b));
-
-assert_eq!(dedup, ["foo", "BAZ", "Bar", "baz"]);
-assert_eq!(duplicates, ["bar", "Foo", "BAZ"]);
-
source

pub fn partition_dedup_by_key<K, F>(&mut self, key: F) -> (&mut [T], &mut [T])
where - F: FnMut(&mut T) -> K, - K: PartialEq,

🔬This is a nightly-only experimental API. (slice_partition_dedup)

Moves all but the first of consecutive elements to the end of the slice that resolve -to the same key.

-

Returns two slices. The first contains no consecutive repeated elements. -The second contains all the duplicates in no specified order.

-

If the slice is sorted, the first returned slice contains no duplicates.

-
§Examples
-
#![feature(slice_partition_dedup)]
-
-let mut slice = [10, 20, 21, 30, 30, 20, 11, 13];
-
-let (dedup, duplicates) = slice.partition_dedup_by_key(|i| *i / 10);
-
-assert_eq!(dedup, [10, 20, 30, 20, 11]);
-assert_eq!(duplicates, [21, 30, 13]);
-
1.26.0 · source

pub fn rotate_left(&mut self, mid: usize)

Rotates the slice in-place such that the first mid elements of the -slice move to the end while the last self.len() - mid elements move to -the front.

-

After calling rotate_left, the element previously at index mid will -become the first element in the slice.

-
§Panics
-

This function will panic if mid is greater than the length of the -slice. Note that mid == self.len() does not panic and is a no-op -rotation.

-
§Complexity
-

Takes linear (in self.len()) time.

-
§Examples
-
let mut a = ['a', 'b', 'c', 'd', 'e', 'f'];
-a.rotate_left(2);
-assert_eq!(a, ['c', 'd', 'e', 'f', 'a', 'b']);
-

Rotating a subslice:

- -
let mut a = ['a', 'b', 'c', 'd', 'e', 'f'];
-a[1..5].rotate_left(1);
-assert_eq!(a, ['a', 'c', 'd', 'e', 'b', 'f']);
-
1.26.0 · source

pub fn rotate_right(&mut self, k: usize)

Rotates the slice in-place such that the first self.len() - k -elements of the slice move to the end while the last k elements move -to the front.

-

After calling rotate_right, the element previously at index -self.len() - k will become the first element in the slice.

-
§Panics
-

This function will panic if k is greater than the length of the -slice. Note that k == self.len() does not panic and is a no-op -rotation.

-
§Complexity
-

Takes linear (in self.len()) time.

-
§Examples
-
let mut a = ['a', 'b', 'c', 'd', 'e', 'f'];
-a.rotate_right(2);
-assert_eq!(a, ['e', 'f', 'a', 'b', 'c', 'd']);
-

Rotating a subslice:

- -
let mut a = ['a', 'b', 'c', 'd', 'e', 'f'];
-a[1..5].rotate_right(1);
-assert_eq!(a, ['a', 'e', 'b', 'c', 'd', 'f']);
-
1.50.0 · source

pub fn fill(&mut self, value: T)
where - T: Clone,

Fills self with elements by cloning value.

-
§Examples
-
let mut buf = vec![0; 10];
-buf.fill(1);
-assert_eq!(buf, vec![1; 10]);
-
1.51.0 · source

pub fn fill_with<F>(&mut self, f: F)
where - F: FnMut() -> T,

Fills self with elements returned by calling a closure repeatedly.

-

This method uses a closure to create new values. If you’d rather -Clone a given value, use fill. If you want to use the Default -trait to generate values, you can pass Default::default as the -argument.

-
§Examples
-
let mut buf = vec![1; 10];
-buf.fill_with(Default::default);
-assert_eq!(buf, vec![0; 10]);
-
1.7.0 · source

pub fn clone_from_slice(&mut self, src: &[T])
where - T: Clone,

Copies the elements from src into self.

-

The length of src must be the same as self.

-
§Panics
-

This function will panic if the two slices have different lengths.

-
§Examples
-

Cloning two elements from a slice into another:

- -
let src = [1, 2, 3, 4];
-let mut dst = [0, 0];
-
-// Because the slices have to be the same length,
-// we slice the source slice from four elements
-// to two. It will panic if we don't do this.
-dst.clone_from_slice(&src[2..]);
-
-assert_eq!(src, [1, 2, 3, 4]);
-assert_eq!(dst, [3, 4]);
-

Rust enforces that there can only be one mutable reference with no -immutable references to a particular piece of data in a particular -scope. Because of this, attempting to use clone_from_slice on a -single slice will result in a compile failure:

- -
let mut slice = [1, 2, 3, 4, 5];
-
-slice[..2].clone_from_slice(&slice[3..]); // compile fail!
-

To work around this, we can use split_at_mut to create two distinct -sub-slices from a slice:

- -
let mut slice = [1, 2, 3, 4, 5];
-
-{
-    let (left, right) = slice.split_at_mut(2);
-    left.clone_from_slice(&right[1..]);
-}
-
-assert_eq!(slice, [4, 5, 3, 4, 5]);
-
1.9.0 · source

pub fn copy_from_slice(&mut self, src: &[T])
where - T: Copy,

Copies all elements from src into self, using a memcpy.

-

The length of src must be the same as self.

-

If T does not implement Copy, use clone_from_slice.

-
§Panics
-

This function will panic if the two slices have different lengths.

-
§Examples
-

Copying two elements from a slice into another:

- -
let src = [1, 2, 3, 4];
-let mut dst = [0, 0];
-
-// Because the slices have to be the same length,
-// we slice the source slice from four elements
-// to two. It will panic if we don't do this.
-dst.copy_from_slice(&src[2..]);
-
-assert_eq!(src, [1, 2, 3, 4]);
-assert_eq!(dst, [3, 4]);
-

Rust enforces that there can only be one mutable reference with no -immutable references to a particular piece of data in a particular -scope. Because of this, attempting to use copy_from_slice on a -single slice will result in a compile failure:

- -
let mut slice = [1, 2, 3, 4, 5];
-
-slice[..2].copy_from_slice(&slice[3..]); // compile fail!
-

To work around this, we can use split_at_mut to create two distinct -sub-slices from a slice:

- -
let mut slice = [1, 2, 3, 4, 5];
-
-{
-    let (left, right) = slice.split_at_mut(2);
-    left.copy_from_slice(&right[1..]);
-}
-
-assert_eq!(slice, [4, 5, 3, 4, 5]);
-
1.37.0 · source

pub fn copy_within<R>(&mut self, src: R, dest: usize)
where - R: RangeBounds<usize>, - T: Copy,

Copies elements from one part of the slice to another part of itself, -using a memmove.

-

src is the range within self to copy from. dest is the starting -index of the range within self to copy to, which will have the same -length as src. The two ranges may overlap. The ends of the two ranges -must be less than or equal to self.len().

-
§Panics
-

This function will panic if either range exceeds the end of the slice, -or if the end of src is before the start.

-
§Examples
-

Copying four bytes within a slice:

- -
let mut bytes = *b"Hello, World!";
-
-bytes.copy_within(1..5, 8);
-
-assert_eq!(&bytes, b"Hello, Wello!");
-
1.27.0 · source

pub fn swap_with_slice(&mut self, other: &mut [T])

Swaps all elements in self with those in other.

-

The length of other must be the same as self.

-
§Panics
-

This function will panic if the two slices have different lengths.

-
§Example
-

Swapping two elements across slices:

- -
let mut slice1 = [0, 0];
-let mut slice2 = [1, 2, 3, 4];
-
-slice1.swap_with_slice(&mut slice2[2..]);
-
-assert_eq!(slice1, [3, 4]);
-assert_eq!(slice2, [1, 2, 0, 0]);
-

Rust enforces that there can only be one mutable reference to a -particular piece of data in a particular scope. Because of this, -attempting to use swap_with_slice on a single slice will result in -a compile failure:

- -
let mut slice = [1, 2, 3, 4, 5];
-slice[..2].swap_with_slice(&mut slice[3..]); // compile fail!
-

To work around this, we can use split_at_mut to create two distinct -mutable sub-slices from a slice:

- -
let mut slice = [1, 2, 3, 4, 5];
-
-{
-    let (left, right) = slice.split_at_mut(2);
-    left.swap_with_slice(&mut right[1..]);
-}
-
-assert_eq!(slice, [4, 5, 3, 1, 2]);
-
1.30.0 · source

pub unsafe fn align_to<U>(&self) -> (&[T], &[U], &[T])

Transmutes the slice to a slice of another type, ensuring alignment of the types is -maintained.

-

This method splits the slice into three distinct slices: prefix, correctly aligned middle -slice of a new type, and the suffix slice. The middle part will be as big as possible under -the given alignment constraint and element size.

-

This method has no purpose when either input element T or output element U are -zero-sized and will return the original slice without splitting anything.

-
§Safety
-

This method is essentially a transmute with respect to the elements in the returned -middle slice, so all the usual caveats pertaining to transmute::<T, U> also apply here.

-
§Examples
-

Basic usage:

- -
unsafe {
-    let bytes: [u8; 7] = [1, 2, 3, 4, 5, 6, 7];
-    let (prefix, shorts, suffix) = bytes.align_to::<u16>();
-    // less_efficient_algorithm_for_bytes(prefix);
-    // more_efficient_algorithm_for_aligned_shorts(shorts);
-    // less_efficient_algorithm_for_bytes(suffix);
-}
-
1.30.0 · source

pub unsafe fn align_to_mut<U>(&mut self) -> (&mut [T], &mut [U], &mut [T])

Transmutes the mutable slice to a mutable slice of another type, ensuring alignment of the -types is maintained.

-

This method splits the slice into three distinct slices: prefix, correctly aligned middle -slice of a new type, and the suffix slice. The middle part will be as big as possible under -the given alignment constraint and element size.

-

This method has no purpose when either input element T or output element U are -zero-sized and will return the original slice without splitting anything.

-
§Safety
-

This method is essentially a transmute with respect to the elements in the returned -middle slice, so all the usual caveats pertaining to transmute::<T, U> also apply here.

-
§Examples
-

Basic usage:

- -
unsafe {
-    let mut bytes: [u8; 7] = [1, 2, 3, 4, 5, 6, 7];
-    let (prefix, shorts, suffix) = bytes.align_to_mut::<u16>();
-    // less_efficient_algorithm_for_bytes(prefix);
-    // more_efficient_algorithm_for_aligned_shorts(shorts);
-    // less_efficient_algorithm_for_bytes(suffix);
-}
-
source

pub fn as_simd<const LANES: usize>(&self) -> (&[T], &[Simd<T, LANES>], &[T])
where - Simd<T, LANES>: AsRef<[T; LANES]>, - T: SimdElement, - LaneCount<LANES>: SupportedLaneCount,

🔬This is a nightly-only experimental API. (portable_simd)

Splits a slice into a prefix, a middle of aligned SIMD types, and a suffix.

-

This is a safe wrapper around slice::align_to, so inherits the same -guarantees as that method.

-
§Panics
-

This will panic if the size of the SIMD type is different from -LANES times that of the scalar.

-

At the time of writing, the trait restrictions on Simd<T, LANES> keeps -that from ever happening, as only power-of-two numbers of lanes are -supported. It’s possible that, in the future, those restrictions might -be lifted in a way that would make it possible to see panics from this -method for something like LANES == 3.

-
§Examples
-
#![feature(portable_simd)]
-use core::simd::prelude::*;
-
-let short = &[1, 2, 3];
-let (prefix, middle, suffix) = short.as_simd::<4>();
-assert_eq!(middle, []); // Not enough elements for anything in the middle
-
-// They might be split in any possible way between prefix and suffix
-let it = prefix.iter().chain(suffix).copied();
-assert_eq!(it.collect::<Vec<_>>(), vec![1, 2, 3]);
-
-fn basic_simd_sum(x: &[f32]) -> f32 {
-    use std::ops::Add;
-    let (prefix, middle, suffix) = x.as_simd();
-    let sums = f32x4::from_array([
-        prefix.iter().copied().sum(),
-        0.0,
-        0.0,
-        suffix.iter().copied().sum(),
-    ]);
-    let sums = middle.iter().copied().fold(sums, f32x4::add);
-    sums.reduce_sum()
-}
-
-let numbers: Vec<f32> = (1..101).map(|x| x as _).collect();
-assert_eq!(basic_simd_sum(&numbers[1..99]), 4949.0);
-
source

pub fn as_simd_mut<const LANES: usize>( - &mut self, -) -> (&mut [T], &mut [Simd<T, LANES>], &mut [T])
where - Simd<T, LANES>: AsMut<[T; LANES]>, - T: SimdElement, - LaneCount<LANES>: SupportedLaneCount,

🔬This is a nightly-only experimental API. (portable_simd)

Splits a mutable slice into a mutable prefix, a middle of aligned SIMD types, -and a mutable suffix.

-

This is a safe wrapper around slice::align_to_mut, so inherits the same -guarantees as that method.

-

This is the mutable version of slice::as_simd; see that for examples.

-
§Panics
-

This will panic if the size of the SIMD type is different from -LANES times that of the scalar.

-

At the time of writing, the trait restrictions on Simd<T, LANES> keeps -that from ever happening, as only power-of-two numbers of lanes are -supported. It’s possible that, in the future, those restrictions might -be lifted in a way that would make it possible to see panics from this -method for something like LANES == 3.

-
1.82.0 · source

pub fn is_sorted(&self) -> bool
where - T: PartialOrd,

Checks if the elements of this slice are sorted.

-

That is, for each element a and its following element b, a <= b must hold. If the -slice yields exactly zero or one element, true is returned.

-

Note that if Self::Item is only PartialOrd, but not Ord, the above definition -implies that this function returns false if any two consecutive items are not -comparable.

-
§Examples
-
let empty: [i32; 0] = [];
-
-assert!([1, 2, 2, 9].is_sorted());
-assert!(![1, 3, 2, 4].is_sorted());
-assert!([0].is_sorted());
-assert!(empty.is_sorted());
-assert!(![0.0, 1.0, f32::NAN].is_sorted());
-
1.82.0 · source

pub fn is_sorted_by<'a, F>(&'a self, compare: F) -> bool
where - F: FnMut(&'a T, &'a T) -> bool,

Checks if the elements of this slice are sorted using the given comparator function.

-

Instead of using PartialOrd::partial_cmp, this function uses the given compare -function to determine whether two elements are to be considered in sorted order.

-
§Examples
-
assert!([1, 2, 2, 9].is_sorted_by(|a, b| a <= b));
-assert!(![1, 2, 2, 9].is_sorted_by(|a, b| a < b));
-
-assert!([0].is_sorted_by(|a, b| true));
-assert!([0].is_sorted_by(|a, b| false));
-
-let empty: [i32; 0] = [];
-assert!(empty.is_sorted_by(|a, b| false));
-assert!(empty.is_sorted_by(|a, b| true));
-
1.82.0 · source

pub fn is_sorted_by_key<'a, F, K>(&'a self, f: F) -> bool
where - F: FnMut(&'a T) -> K, - K: PartialOrd,

Checks if the elements of this slice are sorted using the given key extraction function.

-

Instead of comparing the slice’s elements directly, this function compares the keys of the -elements, as determined by f. Apart from that, it’s equivalent to is_sorted; see its -documentation for more information.

-
§Examples
-
assert!(["c", "bb", "aaa"].is_sorted_by_key(|s| s.len()));
-assert!(![-2i32, -1, 0, 3].is_sorted_by_key(|n| n.abs()));
-
1.52.0 · source

pub fn partition_point<P>(&self, pred: P) -> usize
where - P: FnMut(&T) -> bool,

Returns the index of the partition point according to the given predicate -(the index of the first element of the second partition).

-

The slice is assumed to be partitioned according to the given predicate. -This means that all elements for which the predicate returns true are at the start of the slice -and all elements for which the predicate returns false are at the end. -For example, [7, 15, 3, 5, 4, 12, 6] is partitioned under the predicate x % 2 != 0 -(all odd numbers are at the start, all even at the end).

-

If this slice is not partitioned, the returned result is unspecified and meaningless, -as this method performs a kind of binary search.

-

See also binary_search, binary_search_by, and binary_search_by_key.

-
§Examples
-
let v = [1, 2, 3, 3, 5, 6, 7];
-let i = v.partition_point(|&x| x < 5);
-
-assert_eq!(i, 4);
-assert!(v[..i].iter().all(|&x| x < 5));
-assert!(v[i..].iter().all(|&x| !(x < 5)));
-

If all elements of the slice match the predicate, including if the slice -is empty, then the length of the slice will be returned:

- -
let a = [2, 4, 8];
-assert_eq!(a.partition_point(|x| x < &100), a.len());
-let a: [i32; 0] = [];
-assert_eq!(a.partition_point(|x| x < &100), 0);
-

If you want to insert an item to a sorted vector, while maintaining -sort order:

- -
let mut s = vec![0, 1, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55];
-let num = 42;
-let idx = s.partition_point(|&x| x <= num);
-s.insert(idx, num);
-assert_eq!(s, [0, 1, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 42, 55]);
-
source

pub fn take<'a, R>(self: &mut &'a [T], range: R) -> Option<&'a [T]>
where - R: OneSidedRange<usize>,

🔬This is a nightly-only experimental API. (slice_take)

Removes the subslice corresponding to the given range -and returns a reference to it.

-

Returns None and does not modify the slice if the given -range is out of bounds.

-

Note that this method only accepts one-sided ranges such as -2.. or ..6, but not 2..6.

-
§Examples
-

Taking the first three elements of a slice:

- -
#![feature(slice_take)]
-
-let mut slice: &[_] = &['a', 'b', 'c', 'd'];
-let mut first_three = slice.take(..3).unwrap();
-
-assert_eq!(slice, &['d']);
-assert_eq!(first_three, &['a', 'b', 'c']);
-

Taking the last two elements of a slice:

- -
#![feature(slice_take)]
-
-let mut slice: &[_] = &['a', 'b', 'c', 'd'];
-let mut tail = slice.take(2..).unwrap();
-
-assert_eq!(slice, &['a', 'b']);
-assert_eq!(tail, &['c', 'd']);
-

Getting None when range is out of bounds:

- -
#![feature(slice_take)]
-
-let mut slice: &[_] = &['a', 'b', 'c', 'd'];
-
-assert_eq!(None, slice.take(5..));
-assert_eq!(None, slice.take(..5));
-assert_eq!(None, slice.take(..=4));
-let expected: &[char] = &['a', 'b', 'c', 'd'];
-assert_eq!(Some(expected), slice.take(..4));
-
source

pub fn take_mut<'a, R>(self: &mut &'a mut [T], range: R) -> Option<&'a mut [T]>
where - R: OneSidedRange<usize>,

🔬This is a nightly-only experimental API. (slice_take)

Removes the subslice corresponding to the given range -and returns a mutable reference to it.

-

Returns None and does not modify the slice if the given -range is out of bounds.

-

Note that this method only accepts one-sided ranges such as -2.. or ..6, but not 2..6.

-
§Examples
-

Taking the first three elements of a slice:

- -
#![feature(slice_take)]
-
-let mut slice: &mut [_] = &mut ['a', 'b', 'c', 'd'];
-let mut first_three = slice.take_mut(..3).unwrap();
-
-assert_eq!(slice, &mut ['d']);
-assert_eq!(first_three, &mut ['a', 'b', 'c']);
-

Taking the last two elements of a slice:

- -
#![feature(slice_take)]
-
-let mut slice: &mut [_] = &mut ['a', 'b', 'c', 'd'];
-let mut tail = slice.take_mut(2..).unwrap();
-
-assert_eq!(slice, &mut ['a', 'b']);
-assert_eq!(tail, &mut ['c', 'd']);
-

Getting None when range is out of bounds:

- -
#![feature(slice_take)]
-
-let mut slice: &mut [_] = &mut ['a', 'b', 'c', 'd'];
-
-assert_eq!(None, slice.take_mut(5..));
-assert_eq!(None, slice.take_mut(..5));
-assert_eq!(None, slice.take_mut(..=4));
-let expected: &mut [_] = &mut ['a', 'b', 'c', 'd'];
-assert_eq!(Some(expected), slice.take_mut(..4));
-
source

pub fn take_first<'a>(self: &mut &'a [T]) -> Option<&'a T>

🔬This is a nightly-only experimental API. (slice_take)

Removes the first element of the slice and returns a reference -to it.

-

Returns None if the slice is empty.

-
§Examples
-
#![feature(slice_take)]
-
-let mut slice: &[_] = &['a', 'b', 'c'];
-let first = slice.take_first().unwrap();
-
-assert_eq!(slice, &['b', 'c']);
-assert_eq!(first, &'a');
-
source

pub fn take_first_mut<'a>(self: &mut &'a mut [T]) -> Option<&'a mut T>

🔬This is a nightly-only experimental API. (slice_take)

Removes the first element of the slice and returns a mutable -reference to it.

-

Returns None if the slice is empty.

-
§Examples
-
#![feature(slice_take)]
-
-let mut slice: &mut [_] = &mut ['a', 'b', 'c'];
-let first = slice.take_first_mut().unwrap();
-*first = 'd';
-
-assert_eq!(slice, &['b', 'c']);
-assert_eq!(first, &'d');
-
source

pub fn take_last<'a>(self: &mut &'a [T]) -> Option<&'a T>

🔬This is a nightly-only experimental API. (slice_take)

Removes the last element of the slice and returns a reference -to it.

-

Returns None if the slice is empty.

-
§Examples
-
#![feature(slice_take)]
-
-let mut slice: &[_] = &['a', 'b', 'c'];
-let last = slice.take_last().unwrap();
-
-assert_eq!(slice, &['a', 'b']);
-assert_eq!(last, &'c');
-
source

pub fn take_last_mut<'a>(self: &mut &'a mut [T]) -> Option<&'a mut T>

🔬This is a nightly-only experimental API. (slice_take)

Removes the last element of the slice and returns a mutable -reference to it.

-

Returns None if the slice is empty.

-
§Examples
-
#![feature(slice_take)]
-
-let mut slice: &mut [_] = &mut ['a', 'b', 'c'];
-let last = slice.take_last_mut().unwrap();
-*last = 'd';
-
-assert_eq!(slice, &['a', 'b']);
-assert_eq!(last, &'d');
-
source

pub unsafe fn get_many_unchecked_mut<const N: usize>( - &mut self, - indices: [usize; N], -) -> [&mut T; N]

🔬This is a nightly-only experimental API. (get_many_mut)

Returns mutable references to many indices at once, without doing any checks.

-

For a safe alternative see get_many_mut.

-
§Safety
-

Calling this method with overlapping or out-of-bounds indices is undefined behavior -even if the resulting references are not used.

-
§Examples
-
#![feature(get_many_mut)]
-
-let x = &mut [1, 2, 4];
-
-unsafe {
-    let [a, b] = x.get_many_unchecked_mut([0, 2]);
-    *a *= 10;
-    *b *= 100;
-}
-assert_eq!(x, &[10, 2, 400]);
-
source

pub fn get_many_mut<const N: usize>( - &mut self, - indices: [usize; N], -) -> Result<[&mut T; N], GetManyMutError<N>>

🔬This is a nightly-only experimental API. (get_many_mut)

Returns mutable references to many indices at once.

-

Returns an error if any index is out-of-bounds, or if the same index was -passed more than once.

-
§Examples
-
#![feature(get_many_mut)]
-
-let v = &mut [1, 2, 3];
-if let Ok([a, b]) = v.get_many_mut([0, 2]) {
-    *a = 413;
-    *b = 612;
-}
-assert_eq!(v, &[413, 2, 612]);
-
source

pub fn elem_offset(&self, element: &T) -> Option<usize>

🔬This is a nightly-only experimental API. (substr_range)

Returns the index that an element reference points to.

-

Returns None if element does not point within the slice or if it points between elements.

-

This method is useful for extending slice iterators like slice::split.

-

Note that this uses pointer arithmetic and does not compare elements. -To find the index of an element via comparison, use -.iter().position() instead.

-
§Panics
-

Panics if T is zero-sized.

-
§Examples
-

Basic usage:

- -
#![feature(substr_range)]
-
-let nums: &[u32] = &[1, 7, 1, 1];
-let num = &nums[2];
-
-assert_eq!(num, &1);
-assert_eq!(nums.elem_offset(num), Some(2));
-

Returning None with an in-between element:

- -
#![feature(substr_range)]
-
-let arr: &[[u32; 2]] = &[[0, 1], [2, 3]];
-let flat_arr: &[u32] = arr.as_flattened();
-
-let ok_elm: &[u32; 2] = flat_arr[0..2].try_into().unwrap();
-let weird_elm: &[u32; 2] = flat_arr[1..3].try_into().unwrap();
-
-assert_eq!(ok_elm, &[0, 1]);
-assert_eq!(weird_elm, &[1, 2]);
-
-assert_eq!(arr.elem_offset(ok_elm), Some(0)); // Points to element 0
-assert_eq!(arr.elem_offset(weird_elm), None); // Points between element 0 and 1
-
source

pub fn subslice_range(&self, subslice: &[T]) -> Option<Range<usize>>

🔬This is a nightly-only experimental API. (substr_range)

Returns the range of indices that a subslice points to.

-

Returns None if subslice does not point within the slice or if it points between elements.

-

This method does not compare elements. Instead, this method finds the location in the slice that -subslice was obtained from. To find the index of a subslice via comparison, instead use -.windows().position().

-

This method is useful for extending slice iterators like slice::split.

-

Note that this may return a false positive (either Some(0..0) or Some(self.len()..self.len())) -if subslice has a length of zero and points to the beginning or end of another, separate, slice.

-
§Panics
-

Panics if T is zero-sized.

-
§Examples
-

Basic usage:

- -
#![feature(substr_range)]
-
-let nums = &[0, 5, 10, 0, 0, 5];
-
-let mut iter = nums
-    .split(|t| *t == 0)
-    .map(|n| nums.subslice_range(n).unwrap());
-
-assert_eq!(iter.next(), Some(0..0));
-assert_eq!(iter.next(), Some(1..3));
-assert_eq!(iter.next(), Some(4..4));
-assert_eq!(iter.next(), Some(5..6));
-
1.80.0 · source

pub fn as_flattened(&self) -> &[T]

Takes a &[[T; N]], and flattens it to a &[T].

-
§Panics
-

This panics if the length of the resulting slice would overflow a usize.

-

This is only possible when flattening a slice of arrays of zero-sized -types, and thus tends to be irrelevant in practice. If -size_of::<T>() > 0, this will never panic.

-
§Examples
-
assert_eq!([[1, 2, 3], [4, 5, 6]].as_flattened(), &[1, 2, 3, 4, 5, 6]);
-
-assert_eq!(
-    [[1, 2, 3], [4, 5, 6]].as_flattened(),
-    [[1, 2], [3, 4], [5, 6]].as_flattened(),
-);
-
-let slice_of_empty_arrays: &[[i32; 0]] = &[[], [], [], [], []];
-assert!(slice_of_empty_arrays.as_flattened().is_empty());
-
-let empty_slice_of_arrays: &[[u32; 10]] = &[];
-assert!(empty_slice_of_arrays.as_flattened().is_empty());
-
1.80.0 · source

pub fn as_flattened_mut(&mut self) -> &mut [T]

Takes a &mut [[T; N]], and flattens it to a &mut [T].

-
§Panics
-

This panics if the length of the resulting slice would overflow a usize.

-

This is only possible when flattening a slice of arrays of zero-sized -types, and thus tends to be irrelevant in practice. If -size_of::<T>() > 0, this will never panic.

-
§Examples
-
fn add_5_to_all(slice: &mut [i32]) {
-    for i in slice {
-        *i += 5;
-    }
-}
-
-let mut array = [[1, 2, 3], [4, 5, 6], [7, 8, 9]];
-add_5_to_all(array.as_flattened_mut());
-assert_eq!(array, [[6, 7, 8], [9, 10, 11], [12, 13, 14]]);
-
source

pub fn sort_floats(&mut self)

🔬This is a nightly-only experimental API. (sort_floats)

Sorts the slice of floats.

-

This sort is in-place (i.e. does not allocate), O(n * log(n)) worst-case, and uses -the ordering defined by f32::total_cmp.

-
§Current implementation
-

This uses the same sorting algorithm as sort_unstable_by.

-
§Examples
-
#![feature(sort_floats)]
-let mut v = [2.6, -5e-8, f32::NAN, 8.29, f32::INFINITY, -1.0, 0.0, -f32::INFINITY, -0.0];
-
-v.sort_floats();
-let sorted = [-f32::INFINITY, -1.0, -5e-8, -0.0, 0.0, 2.6, 8.29, f32::INFINITY, f32::NAN];
-assert_eq!(&v[..8], &sorted[..8]);
-assert!(v[8].is_nan());
-
source

pub fn sort_floats(&mut self)

🔬This is a nightly-only experimental API. (sort_floats)

Sorts the slice of floats.

-

This sort is in-place (i.e. does not allocate), O(n * log(n)) worst-case, and uses -the ordering defined by f64::total_cmp.

-
§Current implementation
-

This uses the same sorting algorithm as sort_unstable_by.

-
§Examples
-
#![feature(sort_floats)]
-let mut v = [2.6, -5e-8, f64::NAN, 8.29, f64::INFINITY, -1.0, 0.0, -f64::INFINITY, -0.0];
-
-v.sort_floats();
-let sorted = [-f64::INFINITY, -1.0, -5e-8, -0.0, 0.0, 2.6, 8.29, f64::INFINITY, f64::NAN];
-assert_eq!(&v[..8], &sorted[..8]);
-assert!(v[8].is_nan());
-
1.79.0 · source

pub fn utf8_chunks(&self) -> Utf8Chunks<'_>

Creates an iterator over the contiguous valid UTF-8 ranges of this -slice, and the non-UTF-8 fragments in between.

-
§Examples
-

This function formats arbitrary but mostly-UTF-8 bytes into Rust source -code in the form of a C-string literal (c"...").

- -
use std::fmt::Write as _;
-
-pub fn cstr_literal(bytes: &[u8]) -> String {
-    let mut repr = String::new();
-    repr.push_str("c\"");
-    for chunk in bytes.utf8_chunks() {
-        for ch in chunk.valid().chars() {
-            // Escapes \0, \t, \r, \n, \\, \', \", and uses \u{...} for non-printable characters.
-            write!(repr, "{}", ch.escape_debug()).unwrap();
-        }
-        for byte in chunk.invalid() {
-            write!(repr, "\\x{:02X}", byte).unwrap();
-        }
-    }
-    repr.push('"');
-    repr
-}
-
-fn main() {
-    let lit = cstr_literal(b"\xferris the \xf0\x9f\xa6\x80\x07");
-    let expected = stringify!(c"\xFErris the 🦀\u{7}");
-    assert_eq!(lit, expected);
-}
-
1.0.0 · source

pub fn sort(&mut self)
where - T: Ord,

Sorts the slice, preserving initial order of equal elements.

-

This sort is stable (i.e., does not reorder equal elements) and O(n * log(n)) -worst-case.

-

If the implementation of Ord for T does not implement a total order the resulting -order of elements in the slice is unspecified. All original elements will remain in the -slice and any possible modifications via interior mutability are observed in the input. Same -is true if the implementation of Ord for T panics.

-

When applicable, unstable sorting is preferred because it is generally faster than stable -sorting and it doesn’t allocate auxiliary memory. See -sort_unstable. The exception are partially sorted slices, which -may be better served with slice::sort.

-

Sorting types that only implement PartialOrd such as f32 and f64 require -additional precautions. For example, f32::NAN != f32::NAN, which doesn’t fulfill the -reflexivity requirement of Ord. By using an alternative comparison function with -slice::sort_by such as f32::total_cmp or f64::total_cmp that defines a total -order users can sort slices containing floating-point values. Alternatively, if all values -in the slice are guaranteed to be in a subset for which PartialOrd::partial_cmp forms a -total order, it’s possible to sort the slice with sort_by(|a, b| a.partial_cmp(b).unwrap()).

-
§Current implementation
-

The current implementation is based on driftsort by Orson Peters and Lukas Bergdoll, which -combines the fast average case of quicksort with the fast worst case and partial run -detection of mergesort, achieving linear time on fully sorted and reversed inputs. On inputs -with k distinct elements, the expected time to sort the data is O(n * log(k)).

-

The auxiliary memory allocation behavior depends on the input length. Short slices are -handled without allocation, medium sized slices allocate self.len() and beyond that it -clamps at self.len() / 2.

-
§Panics
-

May panic if the implementation of Ord for T does not implement a total order.

-
§Examples
-
let mut v = [4, -5, 1, -3, 2];
-
-v.sort();
-assert_eq!(v, [-5, -3, 1, 2, 4]);
-
1.0.0 · source

pub fn sort_by<F>(&mut self, compare: F)
where - F: FnMut(&T, &T) -> Ordering,

Sorts the slice with a comparison function, preserving initial order of equal elements.

-

This sort is stable (i.e., does not reorder equal elements) and O(n * log(n)) -worst-case.

-

If the comparison function compare does not implement a total order the resulting order -of elements in the slice is unspecified. All original elements will remain in the slice and -any possible modifications via interior mutability are observed in the input. Same is true -if compare panics.

-

For example |a, b| (a - b).cmp(a) is a comparison function that is neither transitive nor -reflexive nor total, a < b < c < a with a = 1, b = 2, c = 3. For more information and -examples see the Ord documentation.

-
§Current implementation
-

The current implementation is based on driftsort by Orson Peters and Lukas Bergdoll, which -combines the fast average case of quicksort with the fast worst case and partial run -detection of mergesort, achieving linear time on fully sorted and reversed inputs. On inputs -with k distinct elements, the expected time to sort the data is O(n * log(k)).

-

The auxiliary memory allocation behavior depends on the input length. Short slices are -handled without allocation, medium sized slices allocate self.len() and beyond that it -clamps at self.len() / 2.

-
§Panics
-

May panic if compare does not implement a total order.

-
§Examples
-
let mut v = [4, -5, 1, -3, 2];
-v.sort_by(|a, b| a.cmp(b));
-assert_eq!(v, [-5, -3, 1, 2, 4]);
-
-// reverse sorting
-v.sort_by(|a, b| b.cmp(a));
-assert_eq!(v, [4, 2, 1, -3, -5]);
-
1.7.0 · source

pub fn sort_by_key<K, F>(&mut self, f: F)
where - F: FnMut(&T) -> K, - K: Ord,

Sorts the slice with a key extraction function, preserving initial order of equal elements.

-

This sort is stable (i.e., does not reorder equal elements) and O(m * n * log(n)) -worst-case, where the key function is O(m).

-

If the implementation of Ord for K does not implement a total order the resulting -order of elements in the slice is unspecified. All original elements will remain in the -slice and any possible modifications via interior mutability are observed in the input. Same -is true if the implementation of Ord for K panics.

-
§Current implementation
-

The current implementation is based on driftsort by Orson Peters and Lukas Bergdoll, which -combines the fast average case of quicksort with the fast worst case and partial run -detection of mergesort, achieving linear time on fully sorted and reversed inputs. On inputs -with k distinct elements, the expected time to sort the data is O(n * log(k)).

-

The auxiliary memory allocation behavior depends on the input length. Short slices are -handled without allocation, medium sized slices allocate self.len() and beyond that it -clamps at self.len() / 2.

-
§Panics
-

May panic if the implementation of Ord for K does not implement a total order.

-
§Examples
-
let mut v = [4i32, -5, 1, -3, 2];
-
-v.sort_by_key(|k| k.abs());
-assert_eq!(v, [1, 2, -3, 4, -5]);
-
1.34.0 · source

pub fn sort_by_cached_key<K, F>(&mut self, f: F)
where - F: FnMut(&T) -> K, - K: Ord,

Sorts the slice with a key extraction function, preserving initial order of equal elements.

-

This sort is stable (i.e., does not reorder equal elements) and O(m * n + n * -log(n)) worst-case, where the key function is O(m).

-

During sorting, the key function is called at most once per element, by using temporary -storage to remember the results of key evaluation. The order of calls to the key function is -unspecified and may change in future versions of the standard library.

-

If the implementation of Ord for K does not implement a total order the resulting -order of elements in the slice is unspecified. All original elements will remain in the -slice and any possible modifications via interior mutability are observed in the input. Same -is true if the implementation of Ord for K panics.

-

For simple key functions (e.g., functions that are property accesses or basic operations), -sort_by_key is likely to be faster.

-
§Current implementation
-

The current implementation is based on instruction-parallel-network sort by Lukas -Bergdoll, which combines the fast average case of randomized quicksort with the fast worst -case of heapsort, while achieving linear time on fully sorted and reversed inputs. And -O(k * log(n)) where k is the number of distinct elements in the input. It leverages -superscalar out-of-order execution capabilities commonly found in CPUs, to efficiently -perform the operation.

-

In the worst case, the algorithm allocates temporary storage in a Vec<(K, usize)> the -length of the slice.

-
§Panics
-

May panic if the implementation of Ord for K does not implement a total order.

-
§Examples
-
let mut v = [4i32, -5, 1, -3, 2, 10];
-
-// Strings are sorted by lexicographical order.
-v.sort_by_cached_key(|k| k.to_string());
-assert_eq!(v, [-3, -5, 1, 10, 2, 4]);
-
1.0.0 · source

pub fn to_vec(&self) -> Vec<T>
where - T: Clone,

Copies self into a new Vec.

-
§Examples
-
let s = [10, 40, 30];
-let x = s.to_vec();
-// Here, `s` and `x` can be modified independently.
-
source

pub fn to_vec_in<A>(&self, alloc: A) -> Vec<T, A>
where - A: Allocator, - T: Clone,

🔬This is a nightly-only experimental API. (allocator_api)

Copies self into a new Vec with an allocator.

-
§Examples
-
#![feature(allocator_api)]
-
-use std::alloc::System;
-
-let s = [10, 40, 30];
-let x = s.to_vec_in(System);
-// Here, `s` and `x` can be modified independently.
-
1.40.0 · source

pub fn repeat(&self, n: usize) -> Vec<T>
where - T: Copy,

Creates a vector by copying a slice n times.

-
§Panics
-

This function will panic if the capacity would overflow.

-
§Examples
-

Basic usage:

- -
assert_eq!([1, 2].repeat(3), vec![1, 2, 1, 2, 1, 2]);
-

A panic upon overflow:

- -
// this will panic at runtime
-b"0123456789abcdef".repeat(usize::MAX);
-
1.0.0 · source

pub fn concat<Item>(&self) -> <[T] as Concat<Item>>::Output
where - [T]: Concat<Item>, - Item: ?Sized,

Flattens a slice of T into a single value Self::Output.

-
§Examples
-
assert_eq!(["hello", "world"].concat(), "helloworld");
-assert_eq!([[1, 2], [3, 4]].concat(), [1, 2, 3, 4]);
-
1.3.0 · source

pub fn join<Separator>( - &self, - sep: Separator, -) -> <[T] as Join<Separator>>::Output
where - [T]: Join<Separator>,

Flattens a slice of T into a single value Self::Output, placing a -given separator between each.

-
§Examples
-
assert_eq!(["hello", "world"].join(" "), "hello world");
-assert_eq!([[1, 2], [3, 4]].join(&0), [1, 2, 0, 3, 4]);
-assert_eq!([[1, 2], [3, 4]].join(&[0, 0][..]), [1, 2, 0, 0, 3, 4]);
-
1.0.0 · source

pub fn connect<Separator>( - &self, - sep: Separator, -) -> <[T] as Join<Separator>>::Output
where - [T]: Join<Separator>,

👎Deprecated since 1.3.0: renamed to join

Flattens a slice of T into a single value Self::Output, placing a -given separator between each.

-
§Examples
-
assert_eq!(["hello", "world"].connect(" "), "hello world");
-assert_eq!([[1, 2], [3, 4]].connect(&0), [1, 2, 0, 3, 4]);
-
1.23.0 · source

pub fn to_ascii_uppercase(&self) -> Vec<u8>

Returns a vector containing a copy of this slice where each byte -is mapped to its ASCII upper case equivalent.

-

ASCII letters ‘a’ to ‘z’ are mapped to ‘A’ to ‘Z’, -but non-ASCII letters are unchanged.

-

To uppercase the value in-place, use make_ascii_uppercase.

-
1.23.0 · source

pub fn to_ascii_lowercase(&self) -> Vec<u8>

Returns a vector containing a copy of this slice where each byte -is mapped to its ASCII lower case equivalent.

-

ASCII letters ‘A’ to ‘Z’ are mapped to ‘a’ to ‘z’, -but non-ASCII letters are unchanged.

-

To lowercase the value in-place, use make_ascii_lowercase.

-

Trait Implementations§

source§

impl Clone for Frame

source§

fn clone(&self) -> Frame

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for Frame

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Deref for Frame

source§

type Target = [Change]

The resulting type after dereferencing.
source§

fn deref(&self) -> &Self::Target

Dereferences the value.
source§

impl DerefMut for Frame

source§

fn deref_mut(&mut self) -> &mut Self::Target

Mutably dereferences the value.
source§

impl<'de> Deserialize<'de> for Frame

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where - __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl PartialEq for Frame

source§

fn eq(&self, other: &Frame) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, -and should not be overridden without very good reason.
source§

impl Serialize for Frame

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where - __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl StructuralPartialEq for Frame

Auto Trait Implementations§

§

impl Freeze for Frame

§

impl RefUnwindSafe for Frame

§

impl Send for Frame

§

impl Sync for Frame

§

impl Unpin for Frame

§

impl UnwindSafe for Frame

Blanket Implementations§

source§

impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for S
where +Frame in funnybones::animation - Rust

Struct funnybones::animation::Frame

source ·
pub struct Frame(/* private fields */);

Implementations§

source§

impl Frame

source

pub const MAX: Self = _

source

pub const MIN: Self = _

source

pub const ZERO: Self = Self::MIN

Trait Implementations§

source§

impl Clone for Frame

source§

fn clone(&self) -> Frame

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for Frame

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Default for Frame

source§

fn default() -> Frame

Returns the “default value” for a type. Read more
source§

impl<'de> Deserialize<'de> for Frame

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl From<Frame> for Duration

source§

fn from(value: Frame) -> Self

Converts to this type from the input type.
source§

impl From<Frame> for f32

source§

fn from(value: Frame) -> Self

Converts to this type from the input type.
source§

impl From<Frame> for u32

source§

fn from(value: Frame) -> Self

Converts to this type from the input type.
source§

impl From<u32> for Frame

source§

fn from(value: u32) -> Self

Converts to this type from the input type.
source§

impl Ord for Frame

source§

fn cmp(&self, other: &Frame) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · source§

fn max(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · source§

fn min(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · source§

fn clamp(self, min: Self, max: Self) -> Self
where + Self: Sized + PartialOrd,

Restrict a value to a certain interval. Read more
source§

impl PartialEq for Frame

source§

fn eq(&self, other: &Frame) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
source§

impl PartialOrd for Frame

source§

fn partial_cmp(&self, other: &Frame) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
source§

impl Serialize for Frame

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Sub for Frame

source§

type Output = Frame

The resulting type after applying the - operator.
source§

fn sub(self, rhs: Self) -> Self::Output

Performs the - operation. Read more
source§

impl TryFrom<Duration> for Frame

source§

type Error = TryFromIntError

The type returned in the event of a conversion error.
source§

fn try_from(value: Duration) -> Result<Self, Self::Error>

Performs the conversion.
source§

impl Copy for Frame

source§

impl Eq for Frame

source§

impl StructuralPartialEq for Frame

Auto Trait Implementations§

§

impl Freeze for Frame

§

impl RefUnwindSafe for Frame

§

impl Send for Frame

§

impl Sync for Frame

§

impl Unpin for Frame

§

impl UnwindSafe for Frame

Blanket Implementations§

source§

impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for S
where T: Real + Zero + Arithmetics + Clone, Swp: WhitePoint<T>, Dwp: WhitePoint<T>, @@ -2474,15 +26,21 @@
§Examples< ) -> T

Converts self into C, using the provided parameters.

§

impl<A> Cast for A

§

fn cast<To>(self) -> To
where To: CastFrom<A>,

Casts self to the To type. This may be a lossy operation.
§

impl<A> CastFrom<A> for A

§

fn from_cast(from: A) -> A

Returns from as Self.
§

impl<A, B> CastInto<A> for B
where A: CastFrom<B>,

§

fn cast_into(self) -> A

Returns self as To.
source§

impl<T> CloneToUninit for T
where - T: Clone,

source§

unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T, C> ComponentsFrom<C> for T
where + T: Clone,

source§

unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<Q, K> Comparable<K> for Q
where + Q: Ord + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn compare(&self, key: &K) -> Ordering

Compare self to key and return their ordering.
source§

impl<T, C> ComponentsFrom<C> for T
where C: IntoComponents<T>,

source§

fn components_from(colors: C) -> T

Cast a collection of colors into a collection of color components.
§

impl<T> Downcast<T> for T

§

fn downcast(&self) -> &T

§

impl<T> Downcast for T
where T: Any,

§

fn into_any(self: Box<T>) -> Box<dyn Any>

Convert Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.
§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Convert Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
§

fn as_any(&self) -> &(dyn Any + 'static)

Convert &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
§

impl<T> DowncastSync for T
where - T: Any + Send + Sync,

§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Sync + Send>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be -further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+ T: Any + Send + Sync,
§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be +further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T> FromAngle<T> for T

source§

fn from_angle(angle: T) -> T

Performs a conversion from angle.
source§

impl<T, U> FromStimulus<U> for T
where U: IntoStimulus<T>,

source§

fn from_stimulus(other: U) -> T

Converts other into Self, while performing the appropriate scaling, rounding and clamping.
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an @@ -2498,7 +56,10 @@
§Examples< parameters: BakedParameters<WpParam, <U as IntoCam16Unclamped<WpParam, T>>::Scalar>, ) -> T
Converts self into C, using the provided parameters.
source§

impl<T, U> IntoColor<U> for T
where U: FromColor<T>,

source§

fn into_color(self) -> U

Convert into T with values clamped to the color defined bounds Read more
source§

impl<T, U> IntoColorUnclamped<U> for T
where - U: FromColorUnclamped<T>,

source§

fn into_color_unclamped(self) -> U

Convert into T. The resulting color might be invalid in its color space Read more
source§

impl<T> IntoEither for T

source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> + U: FromColorUnclamped<T>,
source§

fn into_color_unclamped(self) -> U

Convert into T. The resulting color might be invalid in its color space Read more
§

impl<Unit> IntoComponents<Unit> for Unit
where + Unit: Copy,

§

fn into_components(self) -> (Unit, Unit)

Extracts this type’s 2d vector components.
§

fn to_vec<Type>(self) -> Type
where + Type: FromComponents<Unit>,

Converts this type to another type using [FromComponents] and +[IntoComponents].
source§

impl<T> IntoEither for T

source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where @@ -2506,12 +67,15 @@
§Examples< if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more

§

impl<T> IntoReadOnly<T> for T

§

fn into_read_only(self) -> ReadOnly<T>

Returns self as a ReadOnly.
source§

impl<T> IntoStimulus<T> for T

source§

fn into_stimulus(self) -> T

Converts self into T, while performing the appropriate scaling, -rounding and clamping.
§

impl<T> IntoValue<Option<T>> for T

§

fn into_value(self) -> Value<Option<T>>

Returns this type as a [Value].
§

impl<T> IntoValue<T> for T

§

fn into_value(self) -> Value<T>

Returns this type as a [Value].
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
source§

impl<T> ToOwned for T
where +rounding and clamping.

§

impl<T> IntoValue<Option<T>> for T

§

fn into_value(self) -> Value<Option<T>>

Returns this type as a [Value].
§

impl<T> IntoValue<T> for T

§

fn into_value(self) -> Value<T>

Returns this type as a [Value].
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
source§

impl<R, P> ReadPrimitive<R> for P
where + R: Read + ReadEndian<P>, + P: Default,

source§

fn read_from_little_endian(read: &mut R) -> Result<Self, Error>

Read this value from the supplied reader. Same as ReadEndian::read_from_little_endian().
source§

fn read_from_big_endian(read: &mut R) -> Result<Self, Error>

Read this value from the supplied reader. Same as ReadEndian::read_from_big_endian().
source§

fn read_from_native_endian(read: &mut R) -> Result<Self, Error>

Read this value from the supplied reader. Same as ReadEndian::read_from_native_endian().
§

impl<Key, SearchFor> Sort<SearchFor> for Key
where + Key: Ord + PartialOrd<SearchFor>,

§

fn compare(&self, b: &SearchFor) -> Ordering

Compare self and other, returning the comparison result. Read more
source§

impl<T> ToOwned for T
where T: Clone,

source§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, C> TryComponentsInto<C> for T
where - C: TryFromComponents<T>,

source§

type Error = <C as TryFromComponents<T>>::Error

The error for when try_into_colors fails to cast.
source§

fn try_components_into(self) -> Result<C, <T as TryComponentsInto<C>>::Error>

Try to cast this collection of color components into a collection of + C: TryFromComponents<T>,
source§

type Error = <C as TryFromComponents<T>>::Error

The error for when try_into_colors fails to cast.
source§

fn try_components_into(self) -> Result<C, <T as TryComponentsInto<C>>::Error>

Try to cast this collection of color components into a collection of colors. Read more
source§

impl<T, U> TryFrom<U> for T
where - U: Into<T>,

source§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where - U: TryFrom<T>,

source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
source§

impl<T, U> TryIntoColor<U> for T
where + U: Into<T>,

source§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
source§

impl<T, U> TryIntoColor<U> for T
where U: TryFromColor<T>,

source§

fn try_into_color(self) -> Result<U, OutOfBounds<U>>

Convert into T, returning ok if the color is inside of its defined range, otherwise an OutOfBounds error is returned which contains the unclamped color. Read more
source§

impl<C, U> UintsFrom<C> for U
where @@ -2523,4 +87,4 @@
§Examples< T: for<'de> Deserialize<'de>,

§

impl<T> WasmNotSend for T
where T: Send,

§

impl<T> WasmNotSendSync for T
where T: WasmNotSend + WasmNotSync,

§

impl<T> WasmNotSync for T
where - T: Sync,

\ No newline at end of file + T: Sync, \ No newline at end of file diff --git a/main/funnybones/animation/struct.Change.html b/main/funnybones/animation/struct.Keyframe.html similarity index 75% rename from main/funnybones/animation/struct.Change.html rename to main/funnybones/animation/struct.Keyframe.html index 16b96b2..a8c3677 100644 --- a/main/funnybones/animation/struct.Change.html +++ b/main/funnybones/animation/struct.Keyframe.html @@ -1,7 +1,11 @@ -Change in funnybones::animation - Rust

Struct funnybones::animation::Change

source ·
pub struct Change { /* private fields */ }

Trait Implementations§

source§

impl Clone for Change

source§

fn clone(&self) -> Change

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for Change

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'de> Deserialize<'de> for Change

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where - __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl From<ChangeKind> for Change

source§

fn from(kind: ChangeKind) -> Self

Converts to this type from the input type.
source§

impl PartialEq for Change

source§

fn eq(&self, other: &Change) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, -and should not be overridden without very good reason.
source§

impl Serialize for Change

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where - __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Copy for Change

source§

impl StructuralPartialEq for Change

Auto Trait Implementations§

§

impl Freeze for Change

§

impl RefUnwindSafe for Change

§

impl Send for Change

§

impl Sync for Change

§

impl Unpin for Change

§

impl UnwindSafe for Change

Blanket Implementations§

source§

impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for S
where +Keyframe in funnybones::animation - Rust

Struct funnybones::animation::Keyframe

source ·
pub struct Keyframe {
+    pub update: PropertyUpdate,
+    pub easing: StandardEasing,
+    /* private fields */
+}

Fields§

§update: PropertyUpdate§easing: StandardEasing

Implementations§

source§

impl Keyframe

source

pub fn new(frame_offset: Frame, update: PropertyUpdate) -> Self

source

pub fn with_easing(self, easing: StandardEasing) -> Self

Trait Implementations§

source§

impl Clone for Keyframe

source§

fn clone(&self) -> Keyframe

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for Keyframe

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'de> Deserialize<'de> for Keyframe

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl PartialEq for Keyframe

source§

fn eq(&self, other: &Keyframe) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
source§

impl Serialize for Keyframe

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Copy for Keyframe

source§

impl StructuralPartialEq for Keyframe

Auto Trait Implementations§

Blanket Implementations§

source§

impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for S
where T: Real + Zero + Arithmetics + Clone, Swp: WhitePoint<T>, Dwp: WhitePoint<T>, @@ -27,8 +31,8 @@ further downcast into Rc<ConcreteType> where ConcreteType implements Trait.

§

fn as_any(&self) -> &(dyn Any + 'static)

Convert &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.

§

impl<T> DowncastSync for T
where - T: Any + Send + Sync,

§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Sync + Send>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be -further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+ T: Any + Send + Sync,
§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be +further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T> FromAngle<T> for T

source§

fn from_angle(angle: T) -> T

Performs a conversion from angle.
source§

impl<T, U> FromStimulus<U> for T
where U: IntoStimulus<T>,

source§

fn from_stimulus(other: U) -> T

Converts other into Self, while performing the appropriate scaling, rounding and clamping.
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an diff --git a/main/funnybones/animation/struct.RunningAnimation.html b/main/funnybones/animation/struct.RunningAnimation.html index 336a067..bf7e910 100644 --- a/main/funnybones/animation/struct.RunningAnimation.html +++ b/main/funnybones/animation/struct.RunningAnimation.html @@ -1,4 +1,4 @@ -RunningAnimation in funnybones::animation - Rust

Struct funnybones::animation::RunningAnimation

source ·
pub struct RunningAnimation { /* private fields */ }

Implementations§

source§

impl RunningAnimation

source

pub fn looping(self) -> Self

source

pub fn update(&mut self, elapsed: Duration, skeleton: &mut Skeleton) -> bool

Auto Trait Implementations§

Blanket Implementations§

source§

impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for S
where +RunningAnimation in funnybones::animation - Rust

Struct funnybones::animation::RunningAnimation

source ·
pub struct RunningAnimation { /* private fields */ }

Implementations§

source§

impl RunningAnimation

source

pub fn looping(self) -> Self

source

pub fn update(&mut self, elapsed: Duration, skeleton: &mut Skeleton) -> bool

Auto Trait Implementations§

Blanket Implementations§

source§

impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for S
where T: Real + Zero + Arithmetics + Clone, Swp: WhitePoint<T>, Dwp: WhitePoint<T>, @@ -23,7 +23,7 @@ further downcast into Rc<ConcreteType> where ConcreteType implements Trait.

§

fn as_any(&self) -> &(dyn Any + 'static)

Convert &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.

§

impl<T> DowncastSync for T
where - T: Any + Send + Sync,

§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Sync + Send>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be + T: Any + Send + Sync,
§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T> FromAngle<T> for T

source§

fn from_angle(angle: T) -> T

Performs a conversion from angle.
source§

impl<T, U> FromStimulus<U> for T
where U: IntoStimulus<T>,

source§

fn from_stimulus(other: U) -> T

Converts other into Self, while performing the appropriate scaling, diff --git a/main/funnybones/animation/struct.Timeline.html b/main/funnybones/animation/struct.Timeline.html new file mode 100644 index 0000000..847d582 --- /dev/null +++ b/main/funnybones/animation/struct.Timeline.html @@ -0,0 +1,2526 @@ +Timeline in funnybones::animation - Rust

Struct funnybones::animation::Timeline

source ·
pub struct Timeline { /* private fields */ }

Implementations§

source§

impl Timeline

source

pub fn new(target: Target) -> Self

source

pub fn with_frame(self, frame: Keyframe) -> Self

source

pub fn insert_frame(&mut self, frame: Keyframe)

source

pub fn set_frame_offset(&mut self, index: usize, new_offset: Frame)

Methods from Deref<Target = [Keyframe]>§

source

pub fn as_str(&self) -> &str

🔬This is a nightly-only experimental API. (ascii_char)

Views this slice of ASCII characters as a UTF-8 str.

+
source

pub fn as_bytes(&self) -> &[u8]

🔬This is a nightly-only experimental API. (ascii_char)

Views this slice of ASCII characters as a slice of u8 bytes.

+
1.23.0 · source

pub fn is_ascii(&self) -> bool

Checks if all bytes in this slice are within the ASCII range.

+
source

pub fn as_ascii(&self) -> Option<&[AsciiChar]>

🔬This is a nightly-only experimental API. (ascii_char)

If this slice is_ascii, returns it as a slice of +ASCII characters, otherwise returns None.

+
source

pub unsafe fn as_ascii_unchecked(&self) -> &[AsciiChar]

🔬This is a nightly-only experimental API. (ascii_char)

Converts this slice of bytes into a slice of ASCII characters, +without checking whether they’re valid.

+
§Safety
+

Every byte in the slice must be in 0..=127, or else this is UB.

+
1.23.0 · source

pub fn eq_ignore_ascii_case(&self, other: &[u8]) -> bool

Checks that two slices are an ASCII case-insensitive match.

+

Same as to_ascii_lowercase(a) == to_ascii_lowercase(b), +but without allocating and copying temporaries.

+
1.23.0 · source

pub fn make_ascii_uppercase(&mut self)

Converts this slice to its ASCII upper case equivalent in-place.

+

ASCII letters ‘a’ to ‘z’ are mapped to ‘A’ to ‘Z’, +but non-ASCII letters are unchanged.

+

To return a new uppercased value without modifying the existing one, use +to_ascii_uppercase.

+
1.23.0 · source

pub fn make_ascii_lowercase(&mut self)

Converts this slice to its ASCII lower case equivalent in-place.

+

ASCII letters ‘A’ to ‘Z’ are mapped to ‘a’ to ‘z’, +but non-ASCII letters are unchanged.

+

To return a new lowercased value without modifying the existing one, use +to_ascii_lowercase.

+
1.60.0 · source

pub fn escape_ascii(&self) -> EscapeAscii<'_>

Returns an iterator that produces an escaped version of this slice, +treating it as an ASCII string.

+
§Examples
+

+let s = b"0\t\r\n'\"\\\x9d";
+let escaped = s.escape_ascii().to_string();
+assert_eq!(escaped, "0\\t\\r\\n\\'\\\"\\\\\\x9d");
+
1.80.0 · source

pub fn trim_ascii_start(&self) -> &[u8]

Returns a byte slice with leading ASCII whitespace bytes removed.

+

‘Whitespace’ refers to the definition used by +u8::is_ascii_whitespace.

+
§Examples
+
assert_eq!(b" \t hello world\n".trim_ascii_start(), b"hello world\n");
+assert_eq!(b"  ".trim_ascii_start(), b"");
+assert_eq!(b"".trim_ascii_start(), b"");
+
1.80.0 · source

pub fn trim_ascii_end(&self) -> &[u8]

Returns a byte slice with trailing ASCII whitespace bytes removed.

+

‘Whitespace’ refers to the definition used by +u8::is_ascii_whitespace.

+
§Examples
+
assert_eq!(b"\r hello world\n ".trim_ascii_end(), b"\r hello world");
+assert_eq!(b"  ".trim_ascii_end(), b"");
+assert_eq!(b"".trim_ascii_end(), b"");
+
1.80.0 · source

pub fn trim_ascii(&self) -> &[u8]

Returns a byte slice with leading and trailing ASCII whitespace bytes +removed.

+

‘Whitespace’ refers to the definition used by +u8::is_ascii_whitespace.

+
§Examples
+
assert_eq!(b"\r hello world\n ".trim_ascii(), b"hello world");
+assert_eq!(b"  ".trim_ascii(), b"");
+assert_eq!(b"".trim_ascii(), b"");
+
1.0.0 · source

pub fn len(&self) -> usize

Returns the number of elements in the slice.

+
§Examples
+
let a = [1, 2, 3];
+assert_eq!(a.len(), 3);
+
1.0.0 · source

pub fn is_empty(&self) -> bool

Returns true if the slice has a length of 0.

+
§Examples
+
let a = [1, 2, 3];
+assert!(!a.is_empty());
+
+let b: &[i32] = &[];
+assert!(b.is_empty());
+
1.0.0 · source

pub fn first(&self) -> Option<&T>

Returns the first element of the slice, or None if it is empty.

+
§Examples
+
let v = [10, 40, 30];
+assert_eq!(Some(&10), v.first());
+
+let w: &[i32] = &[];
+assert_eq!(None, w.first());
+
1.0.0 · source

pub fn first_mut(&mut self) -> Option<&mut T>

Returns a mutable pointer to the first element of the slice, or None if it is empty.

+
§Examples
+
let x = &mut [0, 1, 2];
+
+if let Some(first) = x.first_mut() {
+    *first = 5;
+}
+assert_eq!(x, &[5, 1, 2]);
+
+let y: &mut [i32] = &mut [];
+assert_eq!(None, y.first_mut());
+
1.5.0 · source

pub fn split_first(&self) -> Option<(&T, &[T])>

Returns the first and all the rest of the elements of the slice, or None if it is empty.

+
§Examples
+
let x = &[0, 1, 2];
+
+if let Some((first, elements)) = x.split_first() {
+    assert_eq!(first, &0);
+    assert_eq!(elements, &[1, 2]);
+}
+
1.5.0 · source

pub fn split_first_mut(&mut self) -> Option<(&mut T, &mut [T])>

Returns the first and all the rest of the elements of the slice, or None if it is empty.

+
§Examples
+
let x = &mut [0, 1, 2];
+
+if let Some((first, elements)) = x.split_first_mut() {
+    *first = 3;
+    elements[0] = 4;
+    elements[1] = 5;
+}
+assert_eq!(x, &[3, 4, 5]);
+
1.5.0 · source

pub fn split_last(&self) -> Option<(&T, &[T])>

Returns the last and all the rest of the elements of the slice, or None if it is empty.

+
§Examples
+
let x = &[0, 1, 2];
+
+if let Some((last, elements)) = x.split_last() {
+    assert_eq!(last, &2);
+    assert_eq!(elements, &[0, 1]);
+}
+
1.5.0 · source

pub fn split_last_mut(&mut self) -> Option<(&mut T, &mut [T])>

Returns the last and all the rest of the elements of the slice, or None if it is empty.

+
§Examples
+
let x = &mut [0, 1, 2];
+
+if let Some((last, elements)) = x.split_last_mut() {
+    *last = 3;
+    elements[0] = 4;
+    elements[1] = 5;
+}
+assert_eq!(x, &[4, 5, 3]);
+
1.0.0 · source

pub fn last(&self) -> Option<&T>

Returns the last element of the slice, or None if it is empty.

+
§Examples
+
let v = [10, 40, 30];
+assert_eq!(Some(&30), v.last());
+
+let w: &[i32] = &[];
+assert_eq!(None, w.last());
+
1.0.0 · source

pub fn last_mut(&mut self) -> Option<&mut T>

Returns a mutable reference to the last item in the slice, or None if it is empty.

+
§Examples
+
let x = &mut [0, 1, 2];
+
+if let Some(last) = x.last_mut() {
+    *last = 10;
+}
+assert_eq!(x, &[0, 1, 10]);
+
+let y: &mut [i32] = &mut [];
+assert_eq!(None, y.last_mut());
+
1.77.0 · source

pub fn first_chunk<const N: usize>(&self) -> Option<&[T; N]>

Returns an array reference to the first N items in the slice.

+

If the slice is not at least N in length, this will return None.

+
§Examples
+
let u = [10, 40, 30];
+assert_eq!(Some(&[10, 40]), u.first_chunk::<2>());
+
+let v: &[i32] = &[10];
+assert_eq!(None, v.first_chunk::<2>());
+
+let w: &[i32] = &[];
+assert_eq!(Some(&[]), w.first_chunk::<0>());
+
1.77.0 · source

pub fn first_chunk_mut<const N: usize>(&mut self) -> Option<&mut [T; N]>

Returns a mutable array reference to the first N items in the slice.

+

If the slice is not at least N in length, this will return None.

+
§Examples
+
let x = &mut [0, 1, 2];
+
+if let Some(first) = x.first_chunk_mut::<2>() {
+    first[0] = 5;
+    first[1] = 4;
+}
+assert_eq!(x, &[5, 4, 2]);
+
+assert_eq!(None, x.first_chunk_mut::<4>());
+
1.77.0 · source

pub fn split_first_chunk<const N: usize>(&self) -> Option<(&[T; N], &[T])>

Returns an array reference to the first N items in the slice and the remaining slice.

+

If the slice is not at least N in length, this will return None.

+
§Examples
+
let x = &[0, 1, 2];
+
+if let Some((first, elements)) = x.split_first_chunk::<2>() {
+    assert_eq!(first, &[0, 1]);
+    assert_eq!(elements, &[2]);
+}
+
+assert_eq!(None, x.split_first_chunk::<4>());
+
1.77.0 · source

pub fn split_first_chunk_mut<const N: usize>( + &mut self, +) -> Option<(&mut [T; N], &mut [T])>

Returns a mutable array reference to the first N items in the slice and the remaining +slice.

+

If the slice is not at least N in length, this will return None.

+
§Examples
+
let x = &mut [0, 1, 2];
+
+if let Some((first, elements)) = x.split_first_chunk_mut::<2>() {
+    first[0] = 3;
+    first[1] = 4;
+    elements[0] = 5;
+}
+assert_eq!(x, &[3, 4, 5]);
+
+assert_eq!(None, x.split_first_chunk_mut::<4>());
+
1.77.0 · source

pub fn split_last_chunk<const N: usize>(&self) -> Option<(&[T], &[T; N])>

Returns an array reference to the last N items in the slice and the remaining slice.

+

If the slice is not at least N in length, this will return None.

+
§Examples
+
let x = &[0, 1, 2];
+
+if let Some((elements, last)) = x.split_last_chunk::<2>() {
+    assert_eq!(elements, &[0]);
+    assert_eq!(last, &[1, 2]);
+}
+
+assert_eq!(None, x.split_last_chunk::<4>());
+
1.77.0 · source

pub fn split_last_chunk_mut<const N: usize>( + &mut self, +) -> Option<(&mut [T], &mut [T; N])>

Returns a mutable array reference to the last N items in the slice and the remaining +slice.

+

If the slice is not at least N in length, this will return None.

+
§Examples
+
let x = &mut [0, 1, 2];
+
+if let Some((elements, last)) = x.split_last_chunk_mut::<2>() {
+    last[0] = 3;
+    last[1] = 4;
+    elements[0] = 5;
+}
+assert_eq!(x, &[5, 3, 4]);
+
+assert_eq!(None, x.split_last_chunk_mut::<4>());
+
1.77.0 · source

pub fn last_chunk<const N: usize>(&self) -> Option<&[T; N]>

Returns an array reference to the last N items in the slice.

+

If the slice is not at least N in length, this will return None.

+
§Examples
+
let u = [10, 40, 30];
+assert_eq!(Some(&[40, 30]), u.last_chunk::<2>());
+
+let v: &[i32] = &[10];
+assert_eq!(None, v.last_chunk::<2>());
+
+let w: &[i32] = &[];
+assert_eq!(Some(&[]), w.last_chunk::<0>());
+
1.77.0 · source

pub fn last_chunk_mut<const N: usize>(&mut self) -> Option<&mut [T; N]>

Returns a mutable array reference to the last N items in the slice.

+

If the slice is not at least N in length, this will return None.

+
§Examples
+
let x = &mut [0, 1, 2];
+
+if let Some(last) = x.last_chunk_mut::<2>() {
+    last[0] = 10;
+    last[1] = 20;
+}
+assert_eq!(x, &[0, 10, 20]);
+
+assert_eq!(None, x.last_chunk_mut::<4>());
+
1.0.0 · source

pub fn get<I>(&self, index: I) -> Option<&<I as SliceIndex<[T]>>::Output>
where + I: SliceIndex<[T]>,

Returns a reference to an element or subslice depending on the type of +index.

+
    +
  • If given a position, returns a reference to the element at that +position or None if out of bounds.
  • +
  • If given a range, returns the subslice corresponding to that range, +or None if out of bounds.
  • +
+
§Examples
+
let v = [10, 40, 30];
+assert_eq!(Some(&40), v.get(1));
+assert_eq!(Some(&[10, 40][..]), v.get(0..2));
+assert_eq!(None, v.get(3));
+assert_eq!(None, v.get(0..4));
+
1.0.0 · source

pub fn get_mut<I>( + &mut self, + index: I, +) -> Option<&mut <I as SliceIndex<[T]>>::Output>
where + I: SliceIndex<[T]>,

Returns a mutable reference to an element or subslice depending on the +type of index (see get) or None if the index is out of bounds.

+
§Examples
+
let x = &mut [0, 1, 2];
+
+if let Some(elem) = x.get_mut(1) {
+    *elem = 42;
+}
+assert_eq!(x, &[0, 42, 2]);
+
1.0.0 · source

pub unsafe fn get_unchecked<I>( + &self, + index: I, +) -> &<I as SliceIndex<[T]>>::Output
where + I: SliceIndex<[T]>,

Returns a reference to an element or subslice, without doing bounds +checking.

+

For a safe alternative see get.

+
§Safety
+

Calling this method with an out-of-bounds index is undefined behavior +even if the resulting reference is not used.

+

You can think of this like .get(index).unwrap_unchecked(). It’s UB +to call .get_unchecked(len), even if you immediately convert to a +pointer. And it’s UB to call .get_unchecked(..len + 1), +.get_unchecked(..=len), or similar.

+
§Examples
+
let x = &[1, 2, 4];
+
+unsafe {
+    assert_eq!(x.get_unchecked(1), &2);
+}
+
1.0.0 · source

pub unsafe fn get_unchecked_mut<I>( + &mut self, + index: I, +) -> &mut <I as SliceIndex<[T]>>::Output
where + I: SliceIndex<[T]>,

Returns a mutable reference to an element or subslice, without doing +bounds checking.

+

For a safe alternative see get_mut.

+
§Safety
+

Calling this method with an out-of-bounds index is undefined behavior +even if the resulting reference is not used.

+

You can think of this like .get_mut(index).unwrap_unchecked(). It’s +UB to call .get_unchecked_mut(len), even if you immediately convert +to a pointer. And it’s UB to call .get_unchecked_mut(..len + 1), +.get_unchecked_mut(..=len), or similar.

+
§Examples
+
let x = &mut [1, 2, 4];
+
+unsafe {
+    let elem = x.get_unchecked_mut(1);
+    *elem = 13;
+}
+assert_eq!(x, &[1, 13, 4]);
+
1.0.0 · source

pub fn as_ptr(&self) -> *const T

Returns a raw pointer to the slice’s buffer.

+

The caller must ensure that the slice outlives the pointer this +function returns, or else it will end up dangling.

+

The caller must also ensure that the memory the pointer (non-transitively) points to +is never written to (except inside an UnsafeCell) using this pointer or any pointer +derived from it. If you need to mutate the contents of the slice, use as_mut_ptr.

+

Modifying the container referenced by this slice may cause its buffer +to be reallocated, which would also make any pointers to it invalid.

+
§Examples
+
let x = &[1, 2, 4];
+let x_ptr = x.as_ptr();
+
+unsafe {
+    for i in 0..x.len() {
+        assert_eq!(x.get_unchecked(i), &*x_ptr.add(i));
+    }
+}
+
1.0.0 · source

pub fn as_mut_ptr(&mut self) -> *mut T

Returns an unsafe mutable pointer to the slice’s buffer.

+

The caller must ensure that the slice outlives the pointer this +function returns, or else it will end up dangling.

+

Modifying the container referenced by this slice may cause its buffer +to be reallocated, which would also make any pointers to it invalid.

+
§Examples
+
let x = &mut [1, 2, 4];
+let x_ptr = x.as_mut_ptr();
+
+unsafe {
+    for i in 0..x.len() {
+        *x_ptr.add(i) += 2;
+    }
+}
+assert_eq!(x, &[3, 4, 6]);
+
1.48.0 · source

pub fn as_ptr_range(&self) -> Range<*const T>

Returns the two raw pointers spanning the slice.

+

The returned range is half-open, which means that the end pointer +points one past the last element of the slice. This way, an empty +slice is represented by two equal pointers, and the difference between +the two pointers represents the size of the slice.

+

See as_ptr for warnings on using these pointers. The end pointer +requires extra caution, as it does not point to a valid element in the +slice.

+

This function is useful for interacting with foreign interfaces which +use two pointers to refer to a range of elements in memory, as is +common in C++.

+

It can also be useful to check if a pointer to an element refers to an +element of this slice:

+ +
let a = [1, 2, 3];
+let x = &a[1] as *const _;
+let y = &5 as *const _;
+
+assert!(a.as_ptr_range().contains(&x));
+assert!(!a.as_ptr_range().contains(&y));
+
1.48.0 · source

pub fn as_mut_ptr_range(&mut self) -> Range<*mut T>

Returns the two unsafe mutable pointers spanning the slice.

+

The returned range is half-open, which means that the end pointer +points one past the last element of the slice. This way, an empty +slice is represented by two equal pointers, and the difference between +the two pointers represents the size of the slice.

+

See as_mut_ptr for warnings on using these pointers. The end +pointer requires extra caution, as it does not point to a valid element +in the slice.

+

This function is useful for interacting with foreign interfaces which +use two pointers to refer to a range of elements in memory, as is +common in C++.

+
1.0.0 · source

pub fn swap(&mut self, a: usize, b: usize)

Swaps two elements in the slice.

+

If a equals to b, it’s guaranteed that elements won’t change value.

+
§Arguments
+
    +
  • a - The index of the first element
  • +
  • b - The index of the second element
  • +
+
§Panics
+

Panics if a or b are out of bounds.

+
§Examples
+
let mut v = ["a", "b", "c", "d", "e"];
+v.swap(2, 4);
+assert!(v == ["a", "b", "e", "d", "c"]);
+
source

pub unsafe fn swap_unchecked(&mut self, a: usize, b: usize)

🔬This is a nightly-only experimental API. (slice_swap_unchecked)

Swaps two elements in the slice, without doing bounds checking.

+

For a safe alternative see swap.

+
§Arguments
+
    +
  • a - The index of the first element
  • +
  • b - The index of the second element
  • +
+
§Safety
+

Calling this method with an out-of-bounds index is undefined behavior. +The caller has to ensure that a < self.len() and b < self.len().

+
§Examples
+
#![feature(slice_swap_unchecked)]
+
+let mut v = ["a", "b", "c", "d"];
+// SAFETY: we know that 1 and 3 are both indices of the slice
+unsafe { v.swap_unchecked(1, 3) };
+assert!(v == ["a", "d", "c", "b"]);
+
1.0.0 · source

pub fn reverse(&mut self)

Reverses the order of elements in the slice, in place.

+
§Examples
+
let mut v = [1, 2, 3];
+v.reverse();
+assert!(v == [3, 2, 1]);
+
1.0.0 · source

pub fn iter(&self) -> Iter<'_, T>

Returns an iterator over the slice.

+

The iterator yields all items from start to end.

+
§Examples
+
let x = &[1, 2, 4];
+let mut iterator = x.iter();
+
+assert_eq!(iterator.next(), Some(&1));
+assert_eq!(iterator.next(), Some(&2));
+assert_eq!(iterator.next(), Some(&4));
+assert_eq!(iterator.next(), None);
+
1.0.0 · source

pub fn iter_mut(&mut self) -> IterMut<'_, T>

Returns an iterator that allows modifying each value.

+

The iterator yields all items from start to end.

+
§Examples
+
let x = &mut [1, 2, 4];
+for elem in x.iter_mut() {
+    *elem += 2;
+}
+assert_eq!(x, &[3, 4, 6]);
+
1.0.0 · source

pub fn windows(&self, size: usize) -> Windows<'_, T>

Returns an iterator over all contiguous windows of length +size. The windows overlap. If the slice is shorter than +size, the iterator returns no values.

+
§Panics
+

Panics if size is 0.

+
§Examples
+
let slice = ['l', 'o', 'r', 'e', 'm'];
+let mut iter = slice.windows(3);
+assert_eq!(iter.next().unwrap(), &['l', 'o', 'r']);
+assert_eq!(iter.next().unwrap(), &['o', 'r', 'e']);
+assert_eq!(iter.next().unwrap(), &['r', 'e', 'm']);
+assert!(iter.next().is_none());
+

If the slice is shorter than size:

+ +
let slice = ['f', 'o', 'o'];
+let mut iter = slice.windows(4);
+assert!(iter.next().is_none());
+

There’s no windows_mut, as that existing would let safe code violate the +“only one &mut at a time to the same thing” rule. However, you can sometimes +use Cell::as_slice_of_cells in +conjunction with windows to accomplish something similar:

+ +
use std::cell::Cell;
+
+let mut array = ['R', 'u', 's', 't', ' ', '2', '0', '1', '5'];
+let slice = &mut array[..];
+let slice_of_cells: &[Cell<char>] = Cell::from_mut(slice).as_slice_of_cells();
+for w in slice_of_cells.windows(3) {
+    Cell::swap(&w[0], &w[2]);
+}
+assert_eq!(array, ['s', 't', ' ', '2', '0', '1', '5', 'u', 'R']);
+
1.0.0 · source

pub fn chunks(&self, chunk_size: usize) -> Chunks<'_, T>

Returns an iterator over chunk_size elements of the slice at a time, starting at the +beginning of the slice.

+

The chunks are slices and do not overlap. If chunk_size does not divide the length of the +slice, then the last chunk will not have length chunk_size.

+

See chunks_exact for a variant of this iterator that returns chunks of always exactly +chunk_size elements, and rchunks for the same iterator but starting at the end of the +slice.

+
§Panics
+

Panics if chunk_size is 0.

+
§Examples
+
let slice = ['l', 'o', 'r', 'e', 'm'];
+let mut iter = slice.chunks(2);
+assert_eq!(iter.next().unwrap(), &['l', 'o']);
+assert_eq!(iter.next().unwrap(), &['r', 'e']);
+assert_eq!(iter.next().unwrap(), &['m']);
+assert!(iter.next().is_none());
+
1.0.0 · source

pub fn chunks_mut(&mut self, chunk_size: usize) -> ChunksMut<'_, T>

Returns an iterator over chunk_size elements of the slice at a time, starting at the +beginning of the slice.

+

The chunks are mutable slices, and do not overlap. If chunk_size does not divide the +length of the slice, then the last chunk will not have length chunk_size.

+

See chunks_exact_mut for a variant of this iterator that returns chunks of always +exactly chunk_size elements, and rchunks_mut for the same iterator but starting at +the end of the slice.

+
§Panics
+

Panics if chunk_size is 0.

+
§Examples
+
let v = &mut [0, 0, 0, 0, 0];
+let mut count = 1;
+
+for chunk in v.chunks_mut(2) {
+    for elem in chunk.iter_mut() {
+        *elem += count;
+    }
+    count += 1;
+}
+assert_eq!(v, &[1, 1, 2, 2, 3]);
+
1.31.0 · source

pub fn chunks_exact(&self, chunk_size: usize) -> ChunksExact<'_, T>

Returns an iterator over chunk_size elements of the slice at a time, starting at the +beginning of the slice.

+

The chunks are slices and do not overlap. If chunk_size does not divide the length of the +slice, then the last up to chunk_size-1 elements will be omitted and can be retrieved +from the remainder function of the iterator.

+

Due to each chunk having exactly chunk_size elements, the compiler can often optimize the +resulting code better than in the case of chunks.

+

See chunks for a variant of this iterator that also returns the remainder as a smaller +chunk, and rchunks_exact for the same iterator but starting at the end of the slice.

+
§Panics
+

Panics if chunk_size is 0.

+
§Examples
+
let slice = ['l', 'o', 'r', 'e', 'm'];
+let mut iter = slice.chunks_exact(2);
+assert_eq!(iter.next().unwrap(), &['l', 'o']);
+assert_eq!(iter.next().unwrap(), &['r', 'e']);
+assert!(iter.next().is_none());
+assert_eq!(iter.remainder(), &['m']);
+
1.31.0 · source

pub fn chunks_exact_mut(&mut self, chunk_size: usize) -> ChunksExactMut<'_, T>

Returns an iterator over chunk_size elements of the slice at a time, starting at the +beginning of the slice.

+

The chunks are mutable slices, and do not overlap. If chunk_size does not divide the +length of the slice, then the last up to chunk_size-1 elements will be omitted and can be +retrieved from the into_remainder function of the iterator.

+

Due to each chunk having exactly chunk_size elements, the compiler can often optimize the +resulting code better than in the case of chunks_mut.

+

See chunks_mut for a variant of this iterator that also returns the remainder as a +smaller chunk, and rchunks_exact_mut for the same iterator but starting at the end of +the slice.

+
§Panics
+

Panics if chunk_size is 0.

+
§Examples
+
let v = &mut [0, 0, 0, 0, 0];
+let mut count = 1;
+
+for chunk in v.chunks_exact_mut(2) {
+    for elem in chunk.iter_mut() {
+        *elem += count;
+    }
+    count += 1;
+}
+assert_eq!(v, &[1, 1, 2, 2, 0]);
+
source

pub unsafe fn as_chunks_unchecked<const N: usize>(&self) -> &[[T; N]]

🔬This is a nightly-only experimental API. (slice_as_chunks)

Splits the slice into a slice of N-element arrays, +assuming that there’s no remainder.

+
§Safety
+

This may only be called when

+
    +
  • The slice splits exactly into N-element chunks (aka self.len() % N == 0).
  • +
  • N != 0.
  • +
+
§Examples
+
#![feature(slice_as_chunks)]
+let slice: &[char] = &['l', 'o', 'r', 'e', 'm', '!'];
+let chunks: &[[char; 1]] =
+    // SAFETY: 1-element chunks never have remainder
+    unsafe { slice.as_chunks_unchecked() };
+assert_eq!(chunks, &[['l'], ['o'], ['r'], ['e'], ['m'], ['!']]);
+let chunks: &[[char; 3]] =
+    // SAFETY: The slice length (6) is a multiple of 3
+    unsafe { slice.as_chunks_unchecked() };
+assert_eq!(chunks, &[['l', 'o', 'r'], ['e', 'm', '!']]);
+
+// These would be unsound:
+// let chunks: &[[_; 5]] = slice.as_chunks_unchecked() // The slice length is not a multiple of 5
+// let chunks: &[[_; 0]] = slice.as_chunks_unchecked() // Zero-length chunks are never allowed
+
source

pub fn as_chunks<const N: usize>(&self) -> (&[[T; N]], &[T])

🔬This is a nightly-only experimental API. (slice_as_chunks)

Splits the slice into a slice of N-element arrays, +starting at the beginning of the slice, +and a remainder slice with length strictly less than N.

+
§Panics
+

Panics if N is 0. This check will most probably get changed to a compile time +error before this method gets stabilized.

+
§Examples
+
#![feature(slice_as_chunks)]
+let slice = ['l', 'o', 'r', 'e', 'm'];
+let (chunks, remainder) = slice.as_chunks();
+assert_eq!(chunks, &[['l', 'o'], ['r', 'e']]);
+assert_eq!(remainder, &['m']);
+

If you expect the slice to be an exact multiple, you can combine +let-else with an empty slice pattern:

+ +
#![feature(slice_as_chunks)]
+let slice = ['R', 'u', 's', 't'];
+let (chunks, []) = slice.as_chunks::<2>() else {
+    panic!("slice didn't have even length")
+};
+assert_eq!(chunks, &[['R', 'u'], ['s', 't']]);
+
source

pub fn as_rchunks<const N: usize>(&self) -> (&[T], &[[T; N]])

🔬This is a nightly-only experimental API. (slice_as_chunks)

Splits the slice into a slice of N-element arrays, +starting at the end of the slice, +and a remainder slice with length strictly less than N.

+
§Panics
+

Panics if N is 0. This check will most probably get changed to a compile time +error before this method gets stabilized.

+
§Examples
+
#![feature(slice_as_chunks)]
+let slice = ['l', 'o', 'r', 'e', 'm'];
+let (remainder, chunks) = slice.as_rchunks();
+assert_eq!(remainder, &['l']);
+assert_eq!(chunks, &[['o', 'r'], ['e', 'm']]);
+
source

pub fn array_chunks<const N: usize>(&self) -> ArrayChunks<'_, T, N>

🔬This is a nightly-only experimental API. (array_chunks)

Returns an iterator over N elements of the slice at a time, starting at the +beginning of the slice.

+

The chunks are array references and do not overlap. If N does not divide the +length of the slice, then the last up to N-1 elements will be omitted and can be +retrieved from the remainder function of the iterator.

+

This method is the const generic equivalent of chunks_exact.

+
§Panics
+

Panics if N is 0. This check will most probably get changed to a compile time +error before this method gets stabilized.

+
§Examples
+
#![feature(array_chunks)]
+let slice = ['l', 'o', 'r', 'e', 'm'];
+let mut iter = slice.array_chunks();
+assert_eq!(iter.next().unwrap(), &['l', 'o']);
+assert_eq!(iter.next().unwrap(), &['r', 'e']);
+assert!(iter.next().is_none());
+assert_eq!(iter.remainder(), &['m']);
+
source

pub unsafe fn as_chunks_unchecked_mut<const N: usize>( + &mut self, +) -> &mut [[T; N]]

🔬This is a nightly-only experimental API. (slice_as_chunks)

Splits the slice into a slice of N-element arrays, +assuming that there’s no remainder.

+
§Safety
+

This may only be called when

+
    +
  • The slice splits exactly into N-element chunks (aka self.len() % N == 0).
  • +
  • N != 0.
  • +
+
§Examples
+
#![feature(slice_as_chunks)]
+let slice: &mut [char] = &mut ['l', 'o', 'r', 'e', 'm', '!'];
+let chunks: &mut [[char; 1]] =
+    // SAFETY: 1-element chunks never have remainder
+    unsafe { slice.as_chunks_unchecked_mut() };
+chunks[0] = ['L'];
+assert_eq!(chunks, &[['L'], ['o'], ['r'], ['e'], ['m'], ['!']]);
+let chunks: &mut [[char; 3]] =
+    // SAFETY: The slice length (6) is a multiple of 3
+    unsafe { slice.as_chunks_unchecked_mut() };
+chunks[1] = ['a', 'x', '?'];
+assert_eq!(slice, &['L', 'o', 'r', 'a', 'x', '?']);
+
+// These would be unsound:
+// let chunks: &[[_; 5]] = slice.as_chunks_unchecked_mut() // The slice length is not a multiple of 5
+// let chunks: &[[_; 0]] = slice.as_chunks_unchecked_mut() // Zero-length chunks are never allowed
+
source

pub fn as_chunks_mut<const N: usize>(&mut self) -> (&mut [[T; N]], &mut [T])

🔬This is a nightly-only experimental API. (slice_as_chunks)

Splits the slice into a slice of N-element arrays, +starting at the beginning of the slice, +and a remainder slice with length strictly less than N.

+
§Panics
+

Panics if N is 0. This check will most probably get changed to a compile time +error before this method gets stabilized.

+
§Examples
+
#![feature(slice_as_chunks)]
+let v = &mut [0, 0, 0, 0, 0];
+let mut count = 1;
+
+let (chunks, remainder) = v.as_chunks_mut();
+remainder[0] = 9;
+for chunk in chunks {
+    *chunk = [count; 2];
+    count += 1;
+}
+assert_eq!(v, &[1, 1, 2, 2, 9]);
+
source

pub fn as_rchunks_mut<const N: usize>(&mut self) -> (&mut [T], &mut [[T; N]])

🔬This is a nightly-only experimental API. (slice_as_chunks)

Splits the slice into a slice of N-element arrays, +starting at the end of the slice, +and a remainder slice with length strictly less than N.

+
§Panics
+

Panics if N is 0. This check will most probably get changed to a compile time +error before this method gets stabilized.

+
§Examples
+
#![feature(slice_as_chunks)]
+let v = &mut [0, 0, 0, 0, 0];
+let mut count = 1;
+
+let (remainder, chunks) = v.as_rchunks_mut();
+remainder[0] = 9;
+for chunk in chunks {
+    *chunk = [count; 2];
+    count += 1;
+}
+assert_eq!(v, &[9, 1, 1, 2, 2]);
+
source

pub fn array_chunks_mut<const N: usize>(&mut self) -> ArrayChunksMut<'_, T, N>

🔬This is a nightly-only experimental API. (array_chunks)

Returns an iterator over N elements of the slice at a time, starting at the +beginning of the slice.

+

The chunks are mutable array references and do not overlap. If N does not divide +the length of the slice, then the last up to N-1 elements will be omitted and +can be retrieved from the into_remainder function of the iterator.

+

This method is the const generic equivalent of chunks_exact_mut.

+
§Panics
+

Panics if N is 0. This check will most probably get changed to a compile time +error before this method gets stabilized.

+
§Examples
+
#![feature(array_chunks)]
+let v = &mut [0, 0, 0, 0, 0];
+let mut count = 1;
+
+for chunk in v.array_chunks_mut() {
+    *chunk = [count; 2];
+    count += 1;
+}
+assert_eq!(v, &[1, 1, 2, 2, 0]);
+
source

pub fn array_windows<const N: usize>(&self) -> ArrayWindows<'_, T, N>

🔬This is a nightly-only experimental API. (array_windows)

Returns an iterator over overlapping windows of N elements of a slice, +starting at the beginning of the slice.

+

This is the const generic equivalent of windows.

+

If N is greater than the size of the slice, it will return no windows.

+
§Panics
+

Panics if N is 0. This check will most probably get changed to a compile time +error before this method gets stabilized.

+
§Examples
+
#![feature(array_windows)]
+let slice = [0, 1, 2, 3];
+let mut iter = slice.array_windows();
+assert_eq!(iter.next().unwrap(), &[0, 1]);
+assert_eq!(iter.next().unwrap(), &[1, 2]);
+assert_eq!(iter.next().unwrap(), &[2, 3]);
+assert!(iter.next().is_none());
+
1.31.0 · source

pub fn rchunks(&self, chunk_size: usize) -> RChunks<'_, T>

Returns an iterator over chunk_size elements of the slice at a time, starting at the end +of the slice.

+

The chunks are slices and do not overlap. If chunk_size does not divide the length of the +slice, then the last chunk will not have length chunk_size.

+

See rchunks_exact for a variant of this iterator that returns chunks of always exactly +chunk_size elements, and chunks for the same iterator but starting at the beginning +of the slice.

+
§Panics
+

Panics if chunk_size is 0.

+
§Examples
+
let slice = ['l', 'o', 'r', 'e', 'm'];
+let mut iter = slice.rchunks(2);
+assert_eq!(iter.next().unwrap(), &['e', 'm']);
+assert_eq!(iter.next().unwrap(), &['o', 'r']);
+assert_eq!(iter.next().unwrap(), &['l']);
+assert!(iter.next().is_none());
+
1.31.0 · source

pub fn rchunks_mut(&mut self, chunk_size: usize) -> RChunksMut<'_, T>

Returns an iterator over chunk_size elements of the slice at a time, starting at the end +of the slice.

+

The chunks are mutable slices, and do not overlap. If chunk_size does not divide the +length of the slice, then the last chunk will not have length chunk_size.

+

See rchunks_exact_mut for a variant of this iterator that returns chunks of always +exactly chunk_size elements, and chunks_mut for the same iterator but starting at the +beginning of the slice.

+
§Panics
+

Panics if chunk_size is 0.

+
§Examples
+
let v = &mut [0, 0, 0, 0, 0];
+let mut count = 1;
+
+for chunk in v.rchunks_mut(2) {
+    for elem in chunk.iter_mut() {
+        *elem += count;
+    }
+    count += 1;
+}
+assert_eq!(v, &[3, 2, 2, 1, 1]);
+
1.31.0 · source

pub fn rchunks_exact(&self, chunk_size: usize) -> RChunksExact<'_, T>

Returns an iterator over chunk_size elements of the slice at a time, starting at the +end of the slice.

+

The chunks are slices and do not overlap. If chunk_size does not divide the length of the +slice, then the last up to chunk_size-1 elements will be omitted and can be retrieved +from the remainder function of the iterator.

+

Due to each chunk having exactly chunk_size elements, the compiler can often optimize the +resulting code better than in the case of rchunks.

+

See rchunks for a variant of this iterator that also returns the remainder as a smaller +chunk, and chunks_exact for the same iterator but starting at the beginning of the +slice.

+
§Panics
+

Panics if chunk_size is 0.

+
§Examples
+
let slice = ['l', 'o', 'r', 'e', 'm'];
+let mut iter = slice.rchunks_exact(2);
+assert_eq!(iter.next().unwrap(), &['e', 'm']);
+assert_eq!(iter.next().unwrap(), &['o', 'r']);
+assert!(iter.next().is_none());
+assert_eq!(iter.remainder(), &['l']);
+
1.31.0 · source

pub fn rchunks_exact_mut(&mut self, chunk_size: usize) -> RChunksExactMut<'_, T>

Returns an iterator over chunk_size elements of the slice at a time, starting at the end +of the slice.

+

The chunks are mutable slices, and do not overlap. If chunk_size does not divide the +length of the slice, then the last up to chunk_size-1 elements will be omitted and can be +retrieved from the into_remainder function of the iterator.

+

Due to each chunk having exactly chunk_size elements, the compiler can often optimize the +resulting code better than in the case of chunks_mut.

+

See rchunks_mut for a variant of this iterator that also returns the remainder as a +smaller chunk, and chunks_exact_mut for the same iterator but starting at the beginning +of the slice.

+
§Panics
+

Panics if chunk_size is 0.

+
§Examples
+
let v = &mut [0, 0, 0, 0, 0];
+let mut count = 1;
+
+for chunk in v.rchunks_exact_mut(2) {
+    for elem in chunk.iter_mut() {
+        *elem += count;
+    }
+    count += 1;
+}
+assert_eq!(v, &[0, 2, 2, 1, 1]);
+
1.77.0 · source

pub fn chunk_by<F>(&self, pred: F) -> ChunkBy<'_, T, F>
where + F: FnMut(&T, &T) -> bool,

Returns an iterator over the slice producing non-overlapping runs +of elements using the predicate to separate them.

+

The predicate is called for every pair of consecutive elements, +meaning that it is called on slice[0] and slice[1], +followed by slice[1] and slice[2], and so on.

+
§Examples
+
let slice = &[1, 1, 1, 3, 3, 2, 2, 2];
+
+let mut iter = slice.chunk_by(|a, b| a == b);
+
+assert_eq!(iter.next(), Some(&[1, 1, 1][..]));
+assert_eq!(iter.next(), Some(&[3, 3][..]));
+assert_eq!(iter.next(), Some(&[2, 2, 2][..]));
+assert_eq!(iter.next(), None);
+

This method can be used to extract the sorted subslices:

+ +
let slice = &[1, 1, 2, 3, 2, 3, 2, 3, 4];
+
+let mut iter = slice.chunk_by(|a, b| a <= b);
+
+assert_eq!(iter.next(), Some(&[1, 1, 2, 3][..]));
+assert_eq!(iter.next(), Some(&[2, 3][..]));
+assert_eq!(iter.next(), Some(&[2, 3, 4][..]));
+assert_eq!(iter.next(), None);
+
1.77.0 · source

pub fn chunk_by_mut<F>(&mut self, pred: F) -> ChunkByMut<'_, T, F>
where + F: FnMut(&T, &T) -> bool,

Returns an iterator over the slice producing non-overlapping mutable +runs of elements using the predicate to separate them.

+

The predicate is called for every pair of consecutive elements, +meaning that it is called on slice[0] and slice[1], +followed by slice[1] and slice[2], and so on.

+
§Examples
+
let slice = &mut [1, 1, 1, 3, 3, 2, 2, 2];
+
+let mut iter = slice.chunk_by_mut(|a, b| a == b);
+
+assert_eq!(iter.next(), Some(&mut [1, 1, 1][..]));
+assert_eq!(iter.next(), Some(&mut [3, 3][..]));
+assert_eq!(iter.next(), Some(&mut [2, 2, 2][..]));
+assert_eq!(iter.next(), None);
+

This method can be used to extract the sorted subslices:

+ +
let slice = &mut [1, 1, 2, 3, 2, 3, 2, 3, 4];
+
+let mut iter = slice.chunk_by_mut(|a, b| a <= b);
+
+assert_eq!(iter.next(), Some(&mut [1, 1, 2, 3][..]));
+assert_eq!(iter.next(), Some(&mut [2, 3][..]));
+assert_eq!(iter.next(), Some(&mut [2, 3, 4][..]));
+assert_eq!(iter.next(), None);
+
1.0.0 · source

pub fn split_at(&self, mid: usize) -> (&[T], &[T])

Divides one slice into two at an index.

+

The first will contain all indices from [0, mid) (excluding +the index mid itself) and the second will contain all +indices from [mid, len) (excluding the index len itself).

+
§Panics
+

Panics if mid > len. For a non-panicking alternative see +split_at_checked.

+
§Examples
+
let v = [1, 2, 3, 4, 5, 6];
+
+{
+   let (left, right) = v.split_at(0);
+   assert_eq!(left, []);
+   assert_eq!(right, [1, 2, 3, 4, 5, 6]);
+}
+
+{
+    let (left, right) = v.split_at(2);
+    assert_eq!(left, [1, 2]);
+    assert_eq!(right, [3, 4, 5, 6]);
+}
+
+{
+    let (left, right) = v.split_at(6);
+    assert_eq!(left, [1, 2, 3, 4, 5, 6]);
+    assert_eq!(right, []);
+}
+
1.0.0 · source

pub fn split_at_mut(&mut self, mid: usize) -> (&mut [T], &mut [T])

Divides one mutable slice into two at an index.

+

The first will contain all indices from [0, mid) (excluding +the index mid itself) and the second will contain all +indices from [mid, len) (excluding the index len itself).

+
§Panics
+

Panics if mid > len. For a non-panicking alternative see +split_at_mut_checked.

+
§Examples
+
let mut v = [1, 0, 3, 0, 5, 6];
+let (left, right) = v.split_at_mut(2);
+assert_eq!(left, [1, 0]);
+assert_eq!(right, [3, 0, 5, 6]);
+left[1] = 2;
+right[1] = 4;
+assert_eq!(v, [1, 2, 3, 4, 5, 6]);
+
1.79.0 · source

pub unsafe fn split_at_unchecked(&self, mid: usize) -> (&[T], &[T])

Divides one slice into two at an index, without doing bounds checking.

+

The first will contain all indices from [0, mid) (excluding +the index mid itself) and the second will contain all +indices from [mid, len) (excluding the index len itself).

+

For a safe alternative see split_at.

+
§Safety
+

Calling this method with an out-of-bounds index is undefined behavior +even if the resulting reference is not used. The caller has to ensure that +0 <= mid <= self.len().

+
§Examples
+
let v = [1, 2, 3, 4, 5, 6];
+
+unsafe {
+   let (left, right) = v.split_at_unchecked(0);
+   assert_eq!(left, []);
+   assert_eq!(right, [1, 2, 3, 4, 5, 6]);
+}
+
+unsafe {
+    let (left, right) = v.split_at_unchecked(2);
+    assert_eq!(left, [1, 2]);
+    assert_eq!(right, [3, 4, 5, 6]);
+}
+
+unsafe {
+    let (left, right) = v.split_at_unchecked(6);
+    assert_eq!(left, [1, 2, 3, 4, 5, 6]);
+    assert_eq!(right, []);
+}
+
1.79.0 · source

pub unsafe fn split_at_mut_unchecked( + &mut self, + mid: usize, +) -> (&mut [T], &mut [T])

Divides one mutable slice into two at an index, without doing bounds checking.

+

The first will contain all indices from [0, mid) (excluding +the index mid itself) and the second will contain all +indices from [mid, len) (excluding the index len itself).

+

For a safe alternative see split_at_mut.

+
§Safety
+

Calling this method with an out-of-bounds index is undefined behavior +even if the resulting reference is not used. The caller has to ensure that +0 <= mid <= self.len().

+
§Examples
+
let mut v = [1, 0, 3, 0, 5, 6];
+// scoped to restrict the lifetime of the borrows
+unsafe {
+    let (left, right) = v.split_at_mut_unchecked(2);
+    assert_eq!(left, [1, 0]);
+    assert_eq!(right, [3, 0, 5, 6]);
+    left[1] = 2;
+    right[1] = 4;
+}
+assert_eq!(v, [1, 2, 3, 4, 5, 6]);
+
1.80.0 · source

pub fn split_at_checked(&self, mid: usize) -> Option<(&[T], &[T])>

Divides one slice into two at an index, returning None if the slice is +too short.

+

If mid ≤ len returns a pair of slices where the first will contain all +indices from [0, mid) (excluding the index mid itself) and the +second will contain all indices from [mid, len) (excluding the index +len itself).

+

Otherwise, if mid > len, returns None.

+
§Examples
+
let v = [1, -2, 3, -4, 5, -6];
+
+{
+   let (left, right) = v.split_at_checked(0).unwrap();
+   assert_eq!(left, []);
+   assert_eq!(right, [1, -2, 3, -4, 5, -6]);
+}
+
+{
+    let (left, right) = v.split_at_checked(2).unwrap();
+    assert_eq!(left, [1, -2]);
+    assert_eq!(right, [3, -4, 5, -6]);
+}
+
+{
+    let (left, right) = v.split_at_checked(6).unwrap();
+    assert_eq!(left, [1, -2, 3, -4, 5, -6]);
+    assert_eq!(right, []);
+}
+
+assert_eq!(None, v.split_at_checked(7));
+
1.80.0 · source

pub fn split_at_mut_checked( + &mut self, + mid: usize, +) -> Option<(&mut [T], &mut [T])>

Divides one mutable slice into two at an index, returning None if the +slice is too short.

+

If mid ≤ len returns a pair of slices where the first will contain all +indices from [0, mid) (excluding the index mid itself) and the +second will contain all indices from [mid, len) (excluding the index +len itself).

+

Otherwise, if mid > len, returns None.

+
§Examples
+
let mut v = [1, 0, 3, 0, 5, 6];
+
+if let Some((left, right)) = v.split_at_mut_checked(2) {
+    assert_eq!(left, [1, 0]);
+    assert_eq!(right, [3, 0, 5, 6]);
+    left[1] = 2;
+    right[1] = 4;
+}
+assert_eq!(v, [1, 2, 3, 4, 5, 6]);
+
+assert_eq!(None, v.split_at_mut_checked(7));
+
1.0.0 · source

pub fn split<F>(&self, pred: F) -> Split<'_, T, F>
where + F: FnMut(&T) -> bool,

Returns an iterator over subslices separated by elements that match +pred. The matched element is not contained in the subslices.

+
§Examples
+
let slice = [10, 40, 33, 20];
+let mut iter = slice.split(|num| num % 3 == 0);
+
+assert_eq!(iter.next().unwrap(), &[10, 40]);
+assert_eq!(iter.next().unwrap(), &[20]);
+assert!(iter.next().is_none());
+

If the first element is matched, an empty slice will be the first item +returned by the iterator. Similarly, if the last element in the slice +is matched, an empty slice will be the last item returned by the +iterator:

+ +
let slice = [10, 40, 33];
+let mut iter = slice.split(|num| num % 3 == 0);
+
+assert_eq!(iter.next().unwrap(), &[10, 40]);
+assert_eq!(iter.next().unwrap(), &[]);
+assert!(iter.next().is_none());
+

If two matched elements are directly adjacent, an empty slice will be +present between them:

+ +
let slice = [10, 6, 33, 20];
+let mut iter = slice.split(|num| num % 3 == 0);
+
+assert_eq!(iter.next().unwrap(), &[10]);
+assert_eq!(iter.next().unwrap(), &[]);
+assert_eq!(iter.next().unwrap(), &[20]);
+assert!(iter.next().is_none());
+
1.0.0 · source

pub fn split_mut<F>(&mut self, pred: F) -> SplitMut<'_, T, F>
where + F: FnMut(&T) -> bool,

Returns an iterator over mutable subslices separated by elements that +match pred. The matched element is not contained in the subslices.

+
§Examples
+
let mut v = [10, 40, 30, 20, 60, 50];
+
+for group in v.split_mut(|num| *num % 3 == 0) {
+    group[0] = 1;
+}
+assert_eq!(v, [1, 40, 30, 1, 60, 1]);
+
1.51.0 · source

pub fn split_inclusive<F>(&self, pred: F) -> SplitInclusive<'_, T, F>
where + F: FnMut(&T) -> bool,

Returns an iterator over subslices separated by elements that match +pred. The matched element is contained in the end of the previous +subslice as a terminator.

+
§Examples
+
let slice = [10, 40, 33, 20];
+let mut iter = slice.split_inclusive(|num| num % 3 == 0);
+
+assert_eq!(iter.next().unwrap(), &[10, 40, 33]);
+assert_eq!(iter.next().unwrap(), &[20]);
+assert!(iter.next().is_none());
+

If the last element of the slice is matched, +that element will be considered the terminator of the preceding slice. +That slice will be the last item returned by the iterator.

+ +
let slice = [3, 10, 40, 33];
+let mut iter = slice.split_inclusive(|num| num % 3 == 0);
+
+assert_eq!(iter.next().unwrap(), &[3]);
+assert_eq!(iter.next().unwrap(), &[10, 40, 33]);
+assert!(iter.next().is_none());
+
1.51.0 · source

pub fn split_inclusive_mut<F>(&mut self, pred: F) -> SplitInclusiveMut<'_, T, F>
where + F: FnMut(&T) -> bool,

Returns an iterator over mutable subslices separated by elements that +match pred. The matched element is contained in the previous +subslice as a terminator.

+
§Examples
+
let mut v = [10, 40, 30, 20, 60, 50];
+
+for group in v.split_inclusive_mut(|num| *num % 3 == 0) {
+    let terminator_idx = group.len()-1;
+    group[terminator_idx] = 1;
+}
+assert_eq!(v, [10, 40, 1, 20, 1, 1]);
+
1.27.0 · source

pub fn rsplit<F>(&self, pred: F) -> RSplit<'_, T, F>
where + F: FnMut(&T) -> bool,

Returns an iterator over subslices separated by elements that match +pred, starting at the end of the slice and working backwards. +The matched element is not contained in the subslices.

+
§Examples
+
let slice = [11, 22, 33, 0, 44, 55];
+let mut iter = slice.rsplit(|num| *num == 0);
+
+assert_eq!(iter.next().unwrap(), &[44, 55]);
+assert_eq!(iter.next().unwrap(), &[11, 22, 33]);
+assert_eq!(iter.next(), None);
+

As with split(), if the first or last element is matched, an empty +slice will be the first (or last) item returned by the iterator.

+ +
let v = &[0, 1, 1, 2, 3, 5, 8];
+let mut it = v.rsplit(|n| *n % 2 == 0);
+assert_eq!(it.next().unwrap(), &[]);
+assert_eq!(it.next().unwrap(), &[3, 5]);
+assert_eq!(it.next().unwrap(), &[1, 1]);
+assert_eq!(it.next().unwrap(), &[]);
+assert_eq!(it.next(), None);
+
1.27.0 · source

pub fn rsplit_mut<F>(&mut self, pred: F) -> RSplitMut<'_, T, F>
where + F: FnMut(&T) -> bool,

Returns an iterator over mutable subslices separated by elements that +match pred, starting at the end of the slice and working +backwards. The matched element is not contained in the subslices.

+
§Examples
+
let mut v = [100, 400, 300, 200, 600, 500];
+
+let mut count = 0;
+for group in v.rsplit_mut(|num| *num % 3 == 0) {
+    count += 1;
+    group[0] = count;
+}
+assert_eq!(v, [3, 400, 300, 2, 600, 1]);
+
1.0.0 · source

pub fn splitn<F>(&self, n: usize, pred: F) -> SplitN<'_, T, F>
where + F: FnMut(&T) -> bool,

Returns an iterator over subslices separated by elements that match +pred, limited to returning at most n items. The matched element is +not contained in the subslices.

+

The last element returned, if any, will contain the remainder of the +slice.

+
§Examples
+

Print the slice split once by numbers divisible by 3 (i.e., [10, 40], +[20, 60, 50]):

+ +
let v = [10, 40, 30, 20, 60, 50];
+
+for group in v.splitn(2, |num| *num % 3 == 0) {
+    println!("{group:?}");
+}
+
1.0.0 · source

pub fn splitn_mut<F>(&mut self, n: usize, pred: F) -> SplitNMut<'_, T, F>
where + F: FnMut(&T) -> bool,

Returns an iterator over mutable subslices separated by elements that match +pred, limited to returning at most n items. The matched element is +not contained in the subslices.

+

The last element returned, if any, will contain the remainder of the +slice.

+
§Examples
+
let mut v = [10, 40, 30, 20, 60, 50];
+
+for group in v.splitn_mut(2, |num| *num % 3 == 0) {
+    group[0] = 1;
+}
+assert_eq!(v, [1, 40, 30, 1, 60, 50]);
+
1.0.0 · source

pub fn rsplitn<F>(&self, n: usize, pred: F) -> RSplitN<'_, T, F>
where + F: FnMut(&T) -> bool,

Returns an iterator over subslices separated by elements that match +pred limited to returning at most n items. This starts at the end of +the slice and works backwards. The matched element is not contained in +the subslices.

+

The last element returned, if any, will contain the remainder of the +slice.

+
§Examples
+

Print the slice split once, starting from the end, by numbers divisible +by 3 (i.e., [50], [10, 40, 30, 20]):

+ +
let v = [10, 40, 30, 20, 60, 50];
+
+for group in v.rsplitn(2, |num| *num % 3 == 0) {
+    println!("{group:?}");
+}
+
1.0.0 · source

pub fn rsplitn_mut<F>(&mut self, n: usize, pred: F) -> RSplitNMut<'_, T, F>
where + F: FnMut(&T) -> bool,

Returns an iterator over subslices separated by elements that match +pred limited to returning at most n items. This starts at the end of +the slice and works backwards. The matched element is not contained in +the subslices.

+

The last element returned, if any, will contain the remainder of the +slice.

+
§Examples
+
let mut s = [10, 40, 30, 20, 60, 50];
+
+for group in s.rsplitn_mut(2, |num| *num % 3 == 0) {
+    group[0] = 1;
+}
+assert_eq!(s, [1, 40, 30, 20, 60, 1]);
+
source

pub fn split_once<F>(&self, pred: F) -> Option<(&[T], &[T])>
where + F: FnMut(&T) -> bool,

🔬This is a nightly-only experimental API. (slice_split_once)

Splits the slice on the first element that matches the specified +predicate.

+

If any matching elements are present in the slice, returns the prefix +before the match and suffix after. The matching element itself is not +included. If no elements match, returns None.

+
§Examples
+
#![feature(slice_split_once)]
+let s = [1, 2, 3, 2, 4];
+assert_eq!(s.split_once(|&x| x == 2), Some((
+    &[1][..],
+    &[3, 2, 4][..]
+)));
+assert_eq!(s.split_once(|&x| x == 0), None);
+
source

pub fn rsplit_once<F>(&self, pred: F) -> Option<(&[T], &[T])>
where + F: FnMut(&T) -> bool,

🔬This is a nightly-only experimental API. (slice_split_once)

Splits the slice on the last element that matches the specified +predicate.

+

If any matching elements are present in the slice, returns the prefix +before the match and suffix after. The matching element itself is not +included. If no elements match, returns None.

+
§Examples
+
#![feature(slice_split_once)]
+let s = [1, 2, 3, 2, 4];
+assert_eq!(s.rsplit_once(|&x| x == 2), Some((
+    &[1, 2, 3][..],
+    &[4][..]
+)));
+assert_eq!(s.rsplit_once(|&x| x == 0), None);
+
1.0.0 · source

pub fn contains(&self, x: &T) -> bool
where + T: PartialEq,

Returns true if the slice contains an element with the given value.

+

This operation is O(n).

+

Note that if you have a sorted slice, binary_search may be faster.

+
§Examples
+
let v = [10, 40, 30];
+assert!(v.contains(&30));
+assert!(!v.contains(&50));
+

If you do not have a &T, but some other value that you can compare +with one (for example, String implements PartialEq<str>), you can +use iter().any:

+ +
let v = [String::from("hello"), String::from("world")]; // slice of `String`
+assert!(v.iter().any(|e| e == "hello")); // search with `&str`
+assert!(!v.iter().any(|e| e == "hi"));
+
1.0.0 · source

pub fn starts_with(&self, needle: &[T]) -> bool
where + T: PartialEq,

Returns true if needle is a prefix of the slice or equal to the slice.

+
§Examples
+
let v = [10, 40, 30];
+assert!(v.starts_with(&[10]));
+assert!(v.starts_with(&[10, 40]));
+assert!(v.starts_with(&v));
+assert!(!v.starts_with(&[50]));
+assert!(!v.starts_with(&[10, 50]));
+

Always returns true if needle is an empty slice:

+ +
let v = &[10, 40, 30];
+assert!(v.starts_with(&[]));
+let v: &[u8] = &[];
+assert!(v.starts_with(&[]));
+
1.0.0 · source

pub fn ends_with(&self, needle: &[T]) -> bool
where + T: PartialEq,

Returns true if needle is a suffix of the slice or equal to the slice.

+
§Examples
+
let v = [10, 40, 30];
+assert!(v.ends_with(&[30]));
+assert!(v.ends_with(&[40, 30]));
+assert!(v.ends_with(&v));
+assert!(!v.ends_with(&[50]));
+assert!(!v.ends_with(&[50, 30]));
+

Always returns true if needle is an empty slice:

+ +
let v = &[10, 40, 30];
+assert!(v.ends_with(&[]));
+let v: &[u8] = &[];
+assert!(v.ends_with(&[]));
+
1.51.0 · source

pub fn strip_prefix<P>(&self, prefix: &P) -> Option<&[T]>
where + P: SlicePattern<Item = T> + ?Sized, + T: PartialEq,

Returns a subslice with the prefix removed.

+

If the slice starts with prefix, returns the subslice after the prefix, wrapped in Some. +If prefix is empty, simply returns the original slice. If prefix is equal to the +original slice, returns an empty slice.

+

If the slice does not start with prefix, returns None.

+
§Examples
+
let v = &[10, 40, 30];
+assert_eq!(v.strip_prefix(&[10]), Some(&[40, 30][..]));
+assert_eq!(v.strip_prefix(&[10, 40]), Some(&[30][..]));
+assert_eq!(v.strip_prefix(&[10, 40, 30]), Some(&[][..]));
+assert_eq!(v.strip_prefix(&[50]), None);
+assert_eq!(v.strip_prefix(&[10, 50]), None);
+
+let prefix : &str = "he";
+assert_eq!(b"hello".strip_prefix(prefix.as_bytes()),
+           Some(b"llo".as_ref()));
+
1.51.0 · source

pub fn strip_suffix<P>(&self, suffix: &P) -> Option<&[T]>
where + P: SlicePattern<Item = T> + ?Sized, + T: PartialEq,

Returns a subslice with the suffix removed.

+

If the slice ends with suffix, returns the subslice before the suffix, wrapped in Some. +If suffix is empty, simply returns the original slice. If suffix is equal to the +original slice, returns an empty slice.

+

If the slice does not end with suffix, returns None.

+
§Examples
+
let v = &[10, 40, 30];
+assert_eq!(v.strip_suffix(&[30]), Some(&[10, 40][..]));
+assert_eq!(v.strip_suffix(&[40, 30]), Some(&[10][..]));
+assert_eq!(v.strip_suffix(&[10, 40, 30]), Some(&[][..]));
+assert_eq!(v.strip_suffix(&[50]), None);
+assert_eq!(v.strip_suffix(&[50, 30]), None);
+

Binary searches this slice for a given element. +If the slice is not sorted, the returned result is unspecified and +meaningless.

+

If the value is found then Result::Ok is returned, containing the +index of the matching element. If there are multiple matches, then any +one of the matches could be returned. The index is chosen +deterministically, but is subject to change in future versions of Rust. +If the value is not found then Result::Err is returned, containing +the index where a matching element could be inserted while maintaining +sorted order.

+

See also binary_search_by, binary_search_by_key, and partition_point.

+
§Examples
+

Looks up a series of four elements. The first is found, with a +uniquely determined position; the second and third are not +found; the fourth could match any position in [1, 4].

+ +
let s = [0, 1, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55];
+
+assert_eq!(s.binary_search(&13),  Ok(9));
+assert_eq!(s.binary_search(&4),   Err(7));
+assert_eq!(s.binary_search(&100), Err(13));
+let r = s.binary_search(&1);
+assert!(match r { Ok(1..=4) => true, _ => false, });
+

If you want to find that whole range of matching items, rather than +an arbitrary matching one, that can be done using partition_point:

+ +
let s = [0, 1, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55];
+
+let low = s.partition_point(|x| x < &1);
+assert_eq!(low, 1);
+let high = s.partition_point(|x| x <= &1);
+assert_eq!(high, 5);
+let r = s.binary_search(&1);
+assert!((low..high).contains(&r.unwrap()));
+
+assert!(s[..low].iter().all(|&x| x < 1));
+assert!(s[low..high].iter().all(|&x| x == 1));
+assert!(s[high..].iter().all(|&x| x > 1));
+
+// For something not found, the "range" of equal items is empty
+assert_eq!(s.partition_point(|x| x < &11), 9);
+assert_eq!(s.partition_point(|x| x <= &11), 9);
+assert_eq!(s.binary_search(&11), Err(9));
+

If you want to insert an item to a sorted vector, while maintaining +sort order, consider using partition_point:

+ +
let mut s = vec![0, 1, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55];
+let num = 42;
+let idx = s.partition_point(|&x| x <= num);
+// If `num` is unique, `s.partition_point(|&x| x < num)` (with `<`) is equivalent to
+// `s.binary_search(&num).unwrap_or_else(|x| x)`, but using `<=` will allow `insert`
+// to shift less elements.
+s.insert(idx, num);
+assert_eq!(s, [0, 1, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 42, 55]);
+
1.0.0 · source

pub fn binary_search_by<'a, F>(&'a self, f: F) -> Result<usize, usize>
where + F: FnMut(&'a T) -> Ordering,

Binary searches this slice with a comparator function.

+

The comparator function should return an order code that indicates +whether its argument is Less, Equal or Greater the desired +target. +If the slice is not sorted or if the comparator function does not +implement an order consistent with the sort order of the underlying +slice, the returned result is unspecified and meaningless.

+

If the value is found then Result::Ok is returned, containing the +index of the matching element. If there are multiple matches, then any +one of the matches could be returned. The index is chosen +deterministically, but is subject to change in future versions of Rust. +If the value is not found then Result::Err is returned, containing +the index where a matching element could be inserted while maintaining +sorted order.

+

See also binary_search, binary_search_by_key, and partition_point.

+
§Examples
+

Looks up a series of four elements. The first is found, with a +uniquely determined position; the second and third are not +found; the fourth could match any position in [1, 4].

+ +
let s = [0, 1, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55];
+
+let seek = 13;
+assert_eq!(s.binary_search_by(|probe| probe.cmp(&seek)), Ok(9));
+let seek = 4;
+assert_eq!(s.binary_search_by(|probe| probe.cmp(&seek)), Err(7));
+let seek = 100;
+assert_eq!(s.binary_search_by(|probe| probe.cmp(&seek)), Err(13));
+let seek = 1;
+let r = s.binary_search_by(|probe| probe.cmp(&seek));
+assert!(match r { Ok(1..=4) => true, _ => false, });
+
1.10.0 · source

pub fn binary_search_by_key<'a, B, F>( + &'a self, + b: &B, + f: F, +) -> Result<usize, usize>
where + F: FnMut(&'a T) -> B, + B: Ord,

Binary searches this slice with a key extraction function.

+

Assumes that the slice is sorted by the key, for instance with +sort_by_key using the same key extraction function. +If the slice is not sorted by the key, the returned result is +unspecified and meaningless.

+

If the value is found then Result::Ok is returned, containing the +index of the matching element. If there are multiple matches, then any +one of the matches could be returned. The index is chosen +deterministically, but is subject to change in future versions of Rust. +If the value is not found then Result::Err is returned, containing +the index where a matching element could be inserted while maintaining +sorted order.

+

See also binary_search, binary_search_by, and partition_point.

+
§Examples
+

Looks up a series of four elements in a slice of pairs sorted by +their second elements. The first is found, with a uniquely +determined position; the second and third are not found; the +fourth could match any position in [1, 4].

+ +
let s = [(0, 0), (2, 1), (4, 1), (5, 1), (3, 1),
+         (1, 2), (2, 3), (4, 5), (5, 8), (3, 13),
+         (1, 21), (2, 34), (4, 55)];
+
+assert_eq!(s.binary_search_by_key(&13, |&(a, b)| b),  Ok(9));
+assert_eq!(s.binary_search_by_key(&4, |&(a, b)| b),   Err(7));
+assert_eq!(s.binary_search_by_key(&100, |&(a, b)| b), Err(13));
+let r = s.binary_search_by_key(&1, |&(a, b)| b);
+assert!(match r { Ok(1..=4) => true, _ => false, });
+
1.20.0 · source

pub fn sort_unstable(&mut self)
where + T: Ord,

Sorts the slice without preserving the initial order of equal elements.

+

This sort is unstable (i.e., may reorder equal elements), in-place (i.e., does not +allocate), and O(n * log(n)) worst-case.

+

If the implementation of Ord for T does not implement a total order the resulting +order of elements in the slice is unspecified. All original elements will remain in the +slice and any possible modifications via interior mutability are observed in the input. Same +is true if the implementation of Ord for T panics.

+

Sorting types that only implement PartialOrd such as f32 and f64 require +additional precautions. For example, f32::NAN != f32::NAN, which doesn’t fulfill the +reflexivity requirement of Ord. By using an alternative comparison function with +slice::sort_unstable_by such as f32::total_cmp or f64::total_cmp that defines a +total order users can sort slices containing floating-point values. Alternatively, if all +values in the slice are guaranteed to be in a subset for which PartialOrd::partial_cmp +forms a total order, it’s possible to sort the slice with sort_unstable_by(|a, b| a.partial_cmp(b).unwrap()).

+
§Current implementation
+

The current implementation is based on ipnsort by Lukas Bergdoll and Orson Peters, which +combines the fast average case of quicksort with the fast worst case of heapsort, achieving +linear time on fully sorted and reversed inputs. On inputs with k distinct elements, the +expected time to sort the data is O(n * log(k)).

+

It is typically faster than stable sorting, except in a few special cases, e.g., when the +slice is partially sorted.

+
§Panics
+

May panic if the implementation of Ord for T does not implement a total order.

+
§Examples
+
let mut v = [4, -5, 1, -3, 2];
+
+v.sort_unstable();
+assert_eq!(v, [-5, -3, 1, 2, 4]);
+
1.20.0 · source

pub fn sort_unstable_by<F>(&mut self, compare: F)
where + F: FnMut(&T, &T) -> Ordering,

Sorts the slice with a comparison function, without preserving the initial order of +equal elements.

+

This sort is unstable (i.e., may reorder equal elements), in-place (i.e., does not +allocate), and O(n * log(n)) worst-case.

+

If the comparison function compare does not implement a total order the resulting order +of elements in the slice is unspecified. All original elements will remain in the slice and +any possible modifications via interior mutability are observed in the input. Same is true +if compare panics.

+

For example |a, b| (a - b).cmp(a) is a comparison function that is neither transitive nor +reflexive nor total, a < b < c < a with a = 1, b = 2, c = 3. For more information and +examples see the Ord documentation.

+
§Current implementation
+

The current implementation is based on ipnsort by Lukas Bergdoll and Orson Peters, which +combines the fast average case of quicksort with the fast worst case of heapsort, achieving +linear time on fully sorted and reversed inputs. On inputs with k distinct elements, the +expected time to sort the data is O(n * log(k)).

+

It is typically faster than stable sorting, except in a few special cases, e.g., when the +slice is partially sorted.

+
§Panics
+

May panic if compare does not implement a total order.

+
§Examples
+
let mut v = [4, -5, 1, -3, 2];
+v.sort_unstable_by(|a, b| a.cmp(b));
+assert_eq!(v, [-5, -3, 1, 2, 4]);
+
+// reverse sorting
+v.sort_unstable_by(|a, b| b.cmp(a));
+assert_eq!(v, [4, 2, 1, -3, -5]);
+
1.20.0 · source

pub fn sort_unstable_by_key<K, F>(&mut self, f: F)
where + F: FnMut(&T) -> K, + K: Ord,

Sorts the slice with a key extraction function, without preserving the initial order of +equal elements.

+

This sort is unstable (i.e., may reorder equal elements), in-place (i.e., does not +allocate), and O(n * log(n)) worst-case.

+

If the implementation of Ord for K does not implement a total order the resulting +order of elements in the slice is unspecified. All original elements will remain in the +slice and any possible modifications via interior mutability are observed in the input. Same +is true if the implementation of Ord for K panics.

+
§Current implementation
+

The current implementation is based on ipnsort by Lukas Bergdoll and Orson Peters, which +combines the fast average case of quicksort with the fast worst case of heapsort, achieving +linear time on fully sorted and reversed inputs. On inputs with k distinct elements, the +expected time to sort the data is O(n * log(k)).

+

It is typically faster than stable sorting, except in a few special cases, e.g., when the +slice is partially sorted.

+
§Panics
+

May panic if the implementation of Ord for K does not implement a total order.

+
§Examples
+
let mut v = [4i32, -5, 1, -3, 2];
+
+v.sort_unstable_by_key(|k| k.abs());
+assert_eq!(v, [1, 2, -3, 4, -5]);
+
1.49.0 · source

pub fn select_nth_unstable( + &mut self, + index: usize, +) -> (&mut [T], &mut T, &mut [T])
where + T: Ord,

Reorders the slice such that the element at index after the reordering is at its final +sorted position.

+

This reordering has the additional property that any value at position i < index will be +less than or equal to any value at a position j > index. Additionally, this reordering is +unstable (i.e. any number of equal elements may end up at position index), in-place (i.e. +does not allocate), and runs in O(n) time. This function is also known as “kth element” +in other libraries.

+

It returns a triplet of the following from the reordered slice: the subslice prior to +index, the element at index, and the subslice after index; accordingly, the values in +those two subslices will respectively all be less-than-or-equal-to and +greater-than-or-equal-to the value of the element at index.

+
§Current implementation
+

The current algorithm is an introselect implementation based on ipnsort by Lukas Bergdoll +and Orson Peters, which is also the basis for sort_unstable. The fallback algorithm is +Median of Medians using Tukey’s Ninther for pivot selection, which guarantees linear runtime +for all inputs.

+
§Panics
+

Panics when index >= len(), meaning it always panics on empty slices.

+

May panic if the implementation of Ord for T does not implement a total order.

+
§Examples
+
let mut v = [-5i32, 4, 2, -3, 1];
+
+// Find the items less than or equal to the median, the median, and greater than or equal to
+// the median.
+let (lesser, median, greater) = v.select_nth_unstable(2);
+
+assert!(lesser == [-3, -5] || lesser == [-5, -3]);
+assert_eq!(median, &mut 1);
+assert!(greater == [4, 2] || greater == [2, 4]);
+
+// We are only guaranteed the slice will be one of the following, based on the way we sort
+// about the specified index.
+assert!(v == [-3, -5, 1, 2, 4] ||
+        v == [-5, -3, 1, 2, 4] ||
+        v == [-3, -5, 1, 4, 2] ||
+        v == [-5, -3, 1, 4, 2]);
+
1.49.0 · source

pub fn select_nth_unstable_by<F>( + &mut self, + index: usize, + compare: F, +) -> (&mut [T], &mut T, &mut [T])
where + F: FnMut(&T, &T) -> Ordering,

Reorders the slice with a comparator function such that the element at index after the +reordering is at its final sorted position.

+

This reordering has the additional property that any value at position i < index will be +less than or equal to any value at a position j > index using the comparator function. +Additionally, this reordering is unstable (i.e. any number of equal elements may end up at +position index), in-place (i.e. does not allocate), and runs in O(n) time. This +function is also known as “kth element” in other libraries.

+

It returns a triplet of the following from the slice reordered according to the provided +comparator function: the subslice prior to index, the element at index, and the subslice +after index; accordingly, the values in those two subslices will respectively all be +less-than-or-equal-to and greater-than-or-equal-to the value of the element at index.

+
§Current implementation
+

The current algorithm is an introselect implementation based on ipnsort by Lukas Bergdoll +and Orson Peters, which is also the basis for sort_unstable. The fallback algorithm is +Median of Medians using Tukey’s Ninther for pivot selection, which guarantees linear runtime +for all inputs.

+
§Panics
+

Panics when index >= len(), meaning it always panics on empty slices.

+

May panic if compare does not implement a total order.

+
§Examples
+
let mut v = [-5i32, 4, 2, -3, 1];
+
+// Find the items less than or equal to the median, the median, and greater than or equal to
+// the median as if the slice were sorted in descending order.
+let (lesser, median, greater) = v.select_nth_unstable_by(2, |a, b| b.cmp(a));
+
+assert!(lesser == [4, 2] || lesser == [2, 4]);
+assert_eq!(median, &mut 1);
+assert!(greater == [-3, -5] || greater == [-5, -3]);
+
+// We are only guaranteed the slice will be one of the following, based on the way we sort
+// about the specified index.
+assert!(v == [2, 4, 1, -5, -3] ||
+        v == [2, 4, 1, -3, -5] ||
+        v == [4, 2, 1, -5, -3] ||
+        v == [4, 2, 1, -3, -5]);
+
1.49.0 · source

pub fn select_nth_unstable_by_key<K, F>( + &mut self, + index: usize, + f: F, +) -> (&mut [T], &mut T, &mut [T])
where + F: FnMut(&T) -> K, + K: Ord,

Reorders the slice with a key extraction function such that the element at index after the +reordering is at its final sorted position.

+

This reordering has the additional property that any value at position i < index will be +less than or equal to any value at a position j > index using the key extraction function. +Additionally, this reordering is unstable (i.e. any number of equal elements may end up at +position index), in-place (i.e. does not allocate), and runs in O(n) time. This +function is also known as “kth element” in other libraries.

+

It returns a triplet of the following from the slice reordered according to the provided key +extraction function: the subslice prior to index, the element at index, and the subslice +after index; accordingly, the values in those two subslices will respectively all be +less-than-or-equal-to and greater-than-or-equal-to the value of the element at index.

+
§Current implementation
+

The current algorithm is an introselect implementation based on ipnsort by Lukas Bergdoll +and Orson Peters, which is also the basis for sort_unstable. The fallback algorithm is +Median of Medians using Tukey’s Ninther for pivot selection, which guarantees linear runtime +for all inputs.

+
§Panics
+

Panics when index >= len(), meaning it always panics on empty slices.

+

May panic if K: Ord does not implement a total order.

+
§Examples
+
let mut v = [-5i32, 4, 1, -3, 2];
+
+// Find the items less than or equal to the median, the median, and greater than or equal to
+// the median as if the slice were sorted according to absolute value.
+let (lesser, median, greater) = v.select_nth_unstable_by_key(2, |a| a.abs());
+
+assert!(lesser == [1, 2] || lesser == [2, 1]);
+assert_eq!(median, &mut -3);
+assert!(greater == [4, -5] || greater == [-5, 4]);
+
+// We are only guaranteed the slice will be one of the following, based on the way we sort
+// about the specified index.
+assert!(v == [1, 2, -3, 4, -5] ||
+        v == [1, 2, -3, -5, 4] ||
+        v == [2, 1, -3, 4, -5] ||
+        v == [2, 1, -3, -5, 4]);
+
source

pub fn partition_dedup(&mut self) -> (&mut [T], &mut [T])
where + T: PartialEq,

🔬This is a nightly-only experimental API. (slice_partition_dedup)

Moves all consecutive repeated elements to the end of the slice according to the +PartialEq trait implementation.

+

Returns two slices. The first contains no consecutive repeated elements. +The second contains all the duplicates in no specified order.

+

If the slice is sorted, the first returned slice contains no duplicates.

+
§Examples
+
#![feature(slice_partition_dedup)]
+
+let mut slice = [1, 2, 2, 3, 3, 2, 1, 1];
+
+let (dedup, duplicates) = slice.partition_dedup();
+
+assert_eq!(dedup, [1, 2, 3, 2, 1]);
+assert_eq!(duplicates, [2, 3, 1]);
+
source

pub fn partition_dedup_by<F>(&mut self, same_bucket: F) -> (&mut [T], &mut [T])
where + F: FnMut(&mut T, &mut T) -> bool,

🔬This is a nightly-only experimental API. (slice_partition_dedup)

Moves all but the first of consecutive elements to the end of the slice satisfying +a given equality relation.

+

Returns two slices. The first contains no consecutive repeated elements. +The second contains all the duplicates in no specified order.

+

The same_bucket function is passed references to two elements from the slice and +must determine if the elements compare equal. The elements are passed in opposite order +from their order in the slice, so if same_bucket(a, b) returns true, a is moved +at the end of the slice.

+

If the slice is sorted, the first returned slice contains no duplicates.

+
§Examples
+
#![feature(slice_partition_dedup)]
+
+let mut slice = ["foo", "Foo", "BAZ", "Bar", "bar", "baz", "BAZ"];
+
+let (dedup, duplicates) = slice.partition_dedup_by(|a, b| a.eq_ignore_ascii_case(b));
+
+assert_eq!(dedup, ["foo", "BAZ", "Bar", "baz"]);
+assert_eq!(duplicates, ["bar", "Foo", "BAZ"]);
+
source

pub fn partition_dedup_by_key<K, F>(&mut self, key: F) -> (&mut [T], &mut [T])
where + F: FnMut(&mut T) -> K, + K: PartialEq,

🔬This is a nightly-only experimental API. (slice_partition_dedup)

Moves all but the first of consecutive elements to the end of the slice that resolve +to the same key.

+

Returns two slices. The first contains no consecutive repeated elements. +The second contains all the duplicates in no specified order.

+

If the slice is sorted, the first returned slice contains no duplicates.

+
§Examples
+
#![feature(slice_partition_dedup)]
+
+let mut slice = [10, 20, 21, 30, 30, 20, 11, 13];
+
+let (dedup, duplicates) = slice.partition_dedup_by_key(|i| *i / 10);
+
+assert_eq!(dedup, [10, 20, 30, 20, 11]);
+assert_eq!(duplicates, [21, 30, 13]);
+
1.26.0 · source

pub fn rotate_left(&mut self, mid: usize)

Rotates the slice in-place such that the first mid elements of the +slice move to the end while the last self.len() - mid elements move to +the front.

+

After calling rotate_left, the element previously at index mid will +become the first element in the slice.

+
§Panics
+

This function will panic if mid is greater than the length of the +slice. Note that mid == self.len() does not panic and is a no-op +rotation.

+
§Complexity
+

Takes linear (in self.len()) time.

+
§Examples
+
let mut a = ['a', 'b', 'c', 'd', 'e', 'f'];
+a.rotate_left(2);
+assert_eq!(a, ['c', 'd', 'e', 'f', 'a', 'b']);
+

Rotating a subslice:

+ +
let mut a = ['a', 'b', 'c', 'd', 'e', 'f'];
+a[1..5].rotate_left(1);
+assert_eq!(a, ['a', 'c', 'd', 'e', 'b', 'f']);
+
1.26.0 · source

pub fn rotate_right(&mut self, k: usize)

Rotates the slice in-place such that the first self.len() - k +elements of the slice move to the end while the last k elements move +to the front.

+

After calling rotate_right, the element previously at index +self.len() - k will become the first element in the slice.

+
§Panics
+

This function will panic if k is greater than the length of the +slice. Note that k == self.len() does not panic and is a no-op +rotation.

+
§Complexity
+

Takes linear (in self.len()) time.

+
§Examples
+
let mut a = ['a', 'b', 'c', 'd', 'e', 'f'];
+a.rotate_right(2);
+assert_eq!(a, ['e', 'f', 'a', 'b', 'c', 'd']);
+

Rotating a subslice:

+ +
let mut a = ['a', 'b', 'c', 'd', 'e', 'f'];
+a[1..5].rotate_right(1);
+assert_eq!(a, ['a', 'e', 'b', 'c', 'd', 'f']);
+
1.50.0 · source

pub fn fill(&mut self, value: T)
where + T: Clone,

Fills self with elements by cloning value.

+
§Examples
+
let mut buf = vec![0; 10];
+buf.fill(1);
+assert_eq!(buf, vec![1; 10]);
+
1.51.0 · source

pub fn fill_with<F>(&mut self, f: F)
where + F: FnMut() -> T,

Fills self with elements returned by calling a closure repeatedly.

+

This method uses a closure to create new values. If you’d rather +Clone a given value, use fill. If you want to use the Default +trait to generate values, you can pass Default::default as the +argument.

+
§Examples
+
let mut buf = vec![1; 10];
+buf.fill_with(Default::default);
+assert_eq!(buf, vec![0; 10]);
+
1.7.0 · source

pub fn clone_from_slice(&mut self, src: &[T])
where + T: Clone,

Copies the elements from src into self.

+

The length of src must be the same as self.

+
§Panics
+

This function will panic if the two slices have different lengths.

+
§Examples
+

Cloning two elements from a slice into another:

+ +
let src = [1, 2, 3, 4];
+let mut dst = [0, 0];
+
+// Because the slices have to be the same length,
+// we slice the source slice from four elements
+// to two. It will panic if we don't do this.
+dst.clone_from_slice(&src[2..]);
+
+assert_eq!(src, [1, 2, 3, 4]);
+assert_eq!(dst, [3, 4]);
+

Rust enforces that there can only be one mutable reference with no +immutable references to a particular piece of data in a particular +scope. Because of this, attempting to use clone_from_slice on a +single slice will result in a compile failure:

+ +
let mut slice = [1, 2, 3, 4, 5];
+
+slice[..2].clone_from_slice(&slice[3..]); // compile fail!
+

To work around this, we can use split_at_mut to create two distinct +sub-slices from a slice:

+ +
let mut slice = [1, 2, 3, 4, 5];
+
+{
+    let (left, right) = slice.split_at_mut(2);
+    left.clone_from_slice(&right[1..]);
+}
+
+assert_eq!(slice, [4, 5, 3, 4, 5]);
+
1.9.0 · source

pub fn copy_from_slice(&mut self, src: &[T])
where + T: Copy,

Copies all elements from src into self, using a memcpy.

+

The length of src must be the same as self.

+

If T does not implement Copy, use clone_from_slice.

+
§Panics
+

This function will panic if the two slices have different lengths.

+
§Examples
+

Copying two elements from a slice into another:

+ +
let src = [1, 2, 3, 4];
+let mut dst = [0, 0];
+
+// Because the slices have to be the same length,
+// we slice the source slice from four elements
+// to two. It will panic if we don't do this.
+dst.copy_from_slice(&src[2..]);
+
+assert_eq!(src, [1, 2, 3, 4]);
+assert_eq!(dst, [3, 4]);
+

Rust enforces that there can only be one mutable reference with no +immutable references to a particular piece of data in a particular +scope. Because of this, attempting to use copy_from_slice on a +single slice will result in a compile failure:

+ +
let mut slice = [1, 2, 3, 4, 5];
+
+slice[..2].copy_from_slice(&slice[3..]); // compile fail!
+

To work around this, we can use split_at_mut to create two distinct +sub-slices from a slice:

+ +
let mut slice = [1, 2, 3, 4, 5];
+
+{
+    let (left, right) = slice.split_at_mut(2);
+    left.copy_from_slice(&right[1..]);
+}
+
+assert_eq!(slice, [4, 5, 3, 4, 5]);
+
1.37.0 · source

pub fn copy_within<R>(&mut self, src: R, dest: usize)
where + R: RangeBounds<usize>, + T: Copy,

Copies elements from one part of the slice to another part of itself, +using a memmove.

+

src is the range within self to copy from. dest is the starting +index of the range within self to copy to, which will have the same +length as src. The two ranges may overlap. The ends of the two ranges +must be less than or equal to self.len().

+
§Panics
+

This function will panic if either range exceeds the end of the slice, +or if the end of src is before the start.

+
§Examples
+

Copying four bytes within a slice:

+ +
let mut bytes = *b"Hello, World!";
+
+bytes.copy_within(1..5, 8);
+
+assert_eq!(&bytes, b"Hello, Wello!");
+
1.27.0 · source

pub fn swap_with_slice(&mut self, other: &mut [T])

Swaps all elements in self with those in other.

+

The length of other must be the same as self.

+
§Panics
+

This function will panic if the two slices have different lengths.

+
§Example
+

Swapping two elements across slices:

+ +
let mut slice1 = [0, 0];
+let mut slice2 = [1, 2, 3, 4];
+
+slice1.swap_with_slice(&mut slice2[2..]);
+
+assert_eq!(slice1, [3, 4]);
+assert_eq!(slice2, [1, 2, 0, 0]);
+

Rust enforces that there can only be one mutable reference to a +particular piece of data in a particular scope. Because of this, +attempting to use swap_with_slice on a single slice will result in +a compile failure:

+ +
let mut slice = [1, 2, 3, 4, 5];
+slice[..2].swap_with_slice(&mut slice[3..]); // compile fail!
+

To work around this, we can use split_at_mut to create two distinct +mutable sub-slices from a slice:

+ +
let mut slice = [1, 2, 3, 4, 5];
+
+{
+    let (left, right) = slice.split_at_mut(2);
+    left.swap_with_slice(&mut right[1..]);
+}
+
+assert_eq!(slice, [4, 5, 3, 1, 2]);
+
1.30.0 · source

pub unsafe fn align_to<U>(&self) -> (&[T], &[U], &[T])

Transmutes the slice to a slice of another type, ensuring alignment of the types is +maintained.

+

This method splits the slice into three distinct slices: prefix, correctly aligned middle +slice of a new type, and the suffix slice. The middle part will be as big as possible under +the given alignment constraint and element size.

+

This method has no purpose when either input element T or output element U are +zero-sized and will return the original slice without splitting anything.

+
§Safety
+

This method is essentially a transmute with respect to the elements in the returned +middle slice, so all the usual caveats pertaining to transmute::<T, U> also apply here.

+
§Examples
+

Basic usage:

+ +
unsafe {
+    let bytes: [u8; 7] = [1, 2, 3, 4, 5, 6, 7];
+    let (prefix, shorts, suffix) = bytes.align_to::<u16>();
+    // less_efficient_algorithm_for_bytes(prefix);
+    // more_efficient_algorithm_for_aligned_shorts(shorts);
+    // less_efficient_algorithm_for_bytes(suffix);
+}
+
1.30.0 · source

pub unsafe fn align_to_mut<U>(&mut self) -> (&mut [T], &mut [U], &mut [T])

Transmutes the mutable slice to a mutable slice of another type, ensuring alignment of the +types is maintained.

+

This method splits the slice into three distinct slices: prefix, correctly aligned middle +slice of a new type, and the suffix slice. The middle part will be as big as possible under +the given alignment constraint and element size.

+

This method has no purpose when either input element T or output element U are +zero-sized and will return the original slice without splitting anything.

+
§Safety
+

This method is essentially a transmute with respect to the elements in the returned +middle slice, so all the usual caveats pertaining to transmute::<T, U> also apply here.

+
§Examples
+

Basic usage:

+ +
unsafe {
+    let mut bytes: [u8; 7] = [1, 2, 3, 4, 5, 6, 7];
+    let (prefix, shorts, suffix) = bytes.align_to_mut::<u16>();
+    // less_efficient_algorithm_for_bytes(prefix);
+    // more_efficient_algorithm_for_aligned_shorts(shorts);
+    // less_efficient_algorithm_for_bytes(suffix);
+}
+
source

pub fn as_simd<const LANES: usize>(&self) -> (&[T], &[Simd<T, LANES>], &[T])
where + Simd<T, LANES>: AsRef<[T; LANES]>, + T: SimdElement, + LaneCount<LANES>: SupportedLaneCount,

🔬This is a nightly-only experimental API. (portable_simd)

Splits a slice into a prefix, a middle of aligned SIMD types, and a suffix.

+

This is a safe wrapper around slice::align_to, so inherits the same +guarantees as that method.

+
§Panics
+

This will panic if the size of the SIMD type is different from +LANES times that of the scalar.

+

At the time of writing, the trait restrictions on Simd<T, LANES> keeps +that from ever happening, as only power-of-two numbers of lanes are +supported. It’s possible that, in the future, those restrictions might +be lifted in a way that would make it possible to see panics from this +method for something like LANES == 3.

+
§Examples
+
#![feature(portable_simd)]
+use core::simd::prelude::*;
+
+let short = &[1, 2, 3];
+let (prefix, middle, suffix) = short.as_simd::<4>();
+assert_eq!(middle, []); // Not enough elements for anything in the middle
+
+// They might be split in any possible way between prefix and suffix
+let it = prefix.iter().chain(suffix).copied();
+assert_eq!(it.collect::<Vec<_>>(), vec![1, 2, 3]);
+
+fn basic_simd_sum(x: &[f32]) -> f32 {
+    use std::ops::Add;
+    let (prefix, middle, suffix) = x.as_simd();
+    let sums = f32x4::from_array([
+        prefix.iter().copied().sum(),
+        0.0,
+        0.0,
+        suffix.iter().copied().sum(),
+    ]);
+    let sums = middle.iter().copied().fold(sums, f32x4::add);
+    sums.reduce_sum()
+}
+
+let numbers: Vec<f32> = (1..101).map(|x| x as _).collect();
+assert_eq!(basic_simd_sum(&numbers[1..99]), 4949.0);
+
source

pub fn as_simd_mut<const LANES: usize>( + &mut self, +) -> (&mut [T], &mut [Simd<T, LANES>], &mut [T])
where + Simd<T, LANES>: AsMut<[T; LANES]>, + T: SimdElement, + LaneCount<LANES>: SupportedLaneCount,

🔬This is a nightly-only experimental API. (portable_simd)

Splits a mutable slice into a mutable prefix, a middle of aligned SIMD types, +and a mutable suffix.

+

This is a safe wrapper around slice::align_to_mut, so inherits the same +guarantees as that method.

+

This is the mutable version of slice::as_simd; see that for examples.

+
§Panics
+

This will panic if the size of the SIMD type is different from +LANES times that of the scalar.

+

At the time of writing, the trait restrictions on Simd<T, LANES> keeps +that from ever happening, as only power-of-two numbers of lanes are +supported. It’s possible that, in the future, those restrictions might +be lifted in a way that would make it possible to see panics from this +method for something like LANES == 3.

+
1.82.0 · source

pub fn is_sorted(&self) -> bool
where + T: PartialOrd,

Checks if the elements of this slice are sorted.

+

That is, for each element a and its following element b, a <= b must hold. If the +slice yields exactly zero or one element, true is returned.

+

Note that if Self::Item is only PartialOrd, but not Ord, the above definition +implies that this function returns false if any two consecutive items are not +comparable.

+
§Examples
+
let empty: [i32; 0] = [];
+
+assert!([1, 2, 2, 9].is_sorted());
+assert!(![1, 3, 2, 4].is_sorted());
+assert!([0].is_sorted());
+assert!(empty.is_sorted());
+assert!(![0.0, 1.0, f32::NAN].is_sorted());
+
1.82.0 · source

pub fn is_sorted_by<'a, F>(&'a self, compare: F) -> bool
where + F: FnMut(&'a T, &'a T) -> bool,

Checks if the elements of this slice are sorted using the given comparator function.

+

Instead of using PartialOrd::partial_cmp, this function uses the given compare +function to determine whether two elements are to be considered in sorted order.

+
§Examples
+
assert!([1, 2, 2, 9].is_sorted_by(|a, b| a <= b));
+assert!(![1, 2, 2, 9].is_sorted_by(|a, b| a < b));
+
+assert!([0].is_sorted_by(|a, b| true));
+assert!([0].is_sorted_by(|a, b| false));
+
+let empty: [i32; 0] = [];
+assert!(empty.is_sorted_by(|a, b| false));
+assert!(empty.is_sorted_by(|a, b| true));
+
1.82.0 · source

pub fn is_sorted_by_key<'a, F, K>(&'a self, f: F) -> bool
where + F: FnMut(&'a T) -> K, + K: PartialOrd,

Checks if the elements of this slice are sorted using the given key extraction function.

+

Instead of comparing the slice’s elements directly, this function compares the keys of the +elements, as determined by f. Apart from that, it’s equivalent to is_sorted; see its +documentation for more information.

+
§Examples
+
assert!(["c", "bb", "aaa"].is_sorted_by_key(|s| s.len()));
+assert!(![-2i32, -1, 0, 3].is_sorted_by_key(|n| n.abs()));
+
1.52.0 · source

pub fn partition_point<P>(&self, pred: P) -> usize
where + P: FnMut(&T) -> bool,

Returns the index of the partition point according to the given predicate +(the index of the first element of the second partition).

+

The slice is assumed to be partitioned according to the given predicate. +This means that all elements for which the predicate returns true are at the start of the slice +and all elements for which the predicate returns false are at the end. +For example, [7, 15, 3, 5, 4, 12, 6] is partitioned under the predicate x % 2 != 0 +(all odd numbers are at the start, all even at the end).

+

If this slice is not partitioned, the returned result is unspecified and meaningless, +as this method performs a kind of binary search.

+

See also binary_search, binary_search_by, and binary_search_by_key.

+
§Examples
+
let v = [1, 2, 3, 3, 5, 6, 7];
+let i = v.partition_point(|&x| x < 5);
+
+assert_eq!(i, 4);
+assert!(v[..i].iter().all(|&x| x < 5));
+assert!(v[i..].iter().all(|&x| !(x < 5)));
+

If all elements of the slice match the predicate, including if the slice +is empty, then the length of the slice will be returned:

+ +
let a = [2, 4, 8];
+assert_eq!(a.partition_point(|x| x < &100), a.len());
+let a: [i32; 0] = [];
+assert_eq!(a.partition_point(|x| x < &100), 0);
+

If you want to insert an item to a sorted vector, while maintaining +sort order:

+ +
let mut s = vec![0, 1, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55];
+let num = 42;
+let idx = s.partition_point(|&x| x <= num);
+s.insert(idx, num);
+assert_eq!(s, [0, 1, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 42, 55]);
+
source

pub fn take<'a, R>(self: &mut &'a [T], range: R) -> Option<&'a [T]>
where + R: OneSidedRange<usize>,

🔬This is a nightly-only experimental API. (slice_take)

Removes the subslice corresponding to the given range +and returns a reference to it.

+

Returns None and does not modify the slice if the given +range is out of bounds.

+

Note that this method only accepts one-sided ranges such as +2.. or ..6, but not 2..6.

+
§Examples
+

Taking the first three elements of a slice:

+ +
#![feature(slice_take)]
+
+let mut slice: &[_] = &['a', 'b', 'c', 'd'];
+let mut first_three = slice.take(..3).unwrap();
+
+assert_eq!(slice, &['d']);
+assert_eq!(first_three, &['a', 'b', 'c']);
+

Taking the last two elements of a slice:

+ +
#![feature(slice_take)]
+
+let mut slice: &[_] = &['a', 'b', 'c', 'd'];
+let mut tail = slice.take(2..).unwrap();
+
+assert_eq!(slice, &['a', 'b']);
+assert_eq!(tail, &['c', 'd']);
+

Getting None when range is out of bounds:

+ +
#![feature(slice_take)]
+
+let mut slice: &[_] = &['a', 'b', 'c', 'd'];
+
+assert_eq!(None, slice.take(5..));
+assert_eq!(None, slice.take(..5));
+assert_eq!(None, slice.take(..=4));
+let expected: &[char] = &['a', 'b', 'c', 'd'];
+assert_eq!(Some(expected), slice.take(..4));
+
source

pub fn take_mut<'a, R>(self: &mut &'a mut [T], range: R) -> Option<&'a mut [T]>
where + R: OneSidedRange<usize>,

🔬This is a nightly-only experimental API. (slice_take)

Removes the subslice corresponding to the given range +and returns a mutable reference to it.

+

Returns None and does not modify the slice if the given +range is out of bounds.

+

Note that this method only accepts one-sided ranges such as +2.. or ..6, but not 2..6.

+
§Examples
+

Taking the first three elements of a slice:

+ +
#![feature(slice_take)]
+
+let mut slice: &mut [_] = &mut ['a', 'b', 'c', 'd'];
+let mut first_three = slice.take_mut(..3).unwrap();
+
+assert_eq!(slice, &mut ['d']);
+assert_eq!(first_three, &mut ['a', 'b', 'c']);
+

Taking the last two elements of a slice:

+ +
#![feature(slice_take)]
+
+let mut slice: &mut [_] = &mut ['a', 'b', 'c', 'd'];
+let mut tail = slice.take_mut(2..).unwrap();
+
+assert_eq!(slice, &mut ['a', 'b']);
+assert_eq!(tail, &mut ['c', 'd']);
+

Getting None when range is out of bounds:

+ +
#![feature(slice_take)]
+
+let mut slice: &mut [_] = &mut ['a', 'b', 'c', 'd'];
+
+assert_eq!(None, slice.take_mut(5..));
+assert_eq!(None, slice.take_mut(..5));
+assert_eq!(None, slice.take_mut(..=4));
+let expected: &mut [_] = &mut ['a', 'b', 'c', 'd'];
+assert_eq!(Some(expected), slice.take_mut(..4));
+
source

pub fn take_first<'a>(self: &mut &'a [T]) -> Option<&'a T>

🔬This is a nightly-only experimental API. (slice_take)

Removes the first element of the slice and returns a reference +to it.

+

Returns None if the slice is empty.

+
§Examples
+
#![feature(slice_take)]
+
+let mut slice: &[_] = &['a', 'b', 'c'];
+let first = slice.take_first().unwrap();
+
+assert_eq!(slice, &['b', 'c']);
+assert_eq!(first, &'a');
+
source

pub fn take_first_mut<'a>(self: &mut &'a mut [T]) -> Option<&'a mut T>

🔬This is a nightly-only experimental API. (slice_take)

Removes the first element of the slice and returns a mutable +reference to it.

+

Returns None if the slice is empty.

+
§Examples
+
#![feature(slice_take)]
+
+let mut slice: &mut [_] = &mut ['a', 'b', 'c'];
+let first = slice.take_first_mut().unwrap();
+*first = 'd';
+
+assert_eq!(slice, &['b', 'c']);
+assert_eq!(first, &'d');
+
source

pub fn take_last<'a>(self: &mut &'a [T]) -> Option<&'a T>

🔬This is a nightly-only experimental API. (slice_take)

Removes the last element of the slice and returns a reference +to it.

+

Returns None if the slice is empty.

+
§Examples
+
#![feature(slice_take)]
+
+let mut slice: &[_] = &['a', 'b', 'c'];
+let last = slice.take_last().unwrap();
+
+assert_eq!(slice, &['a', 'b']);
+assert_eq!(last, &'c');
+
source

pub fn take_last_mut<'a>(self: &mut &'a mut [T]) -> Option<&'a mut T>

🔬This is a nightly-only experimental API. (slice_take)

Removes the last element of the slice and returns a mutable +reference to it.

+

Returns None if the slice is empty.

+
§Examples
+
#![feature(slice_take)]
+
+let mut slice: &mut [_] = &mut ['a', 'b', 'c'];
+let last = slice.take_last_mut().unwrap();
+*last = 'd';
+
+assert_eq!(slice, &['a', 'b']);
+assert_eq!(last, &'d');
+
source

pub unsafe fn get_many_unchecked_mut<const N: usize>( + &mut self, + indices: [usize; N], +) -> [&mut T; N]

🔬This is a nightly-only experimental API. (get_many_mut)

Returns mutable references to many indices at once, without doing any checks.

+

For a safe alternative see get_many_mut.

+
§Safety
+

Calling this method with overlapping or out-of-bounds indices is undefined behavior +even if the resulting references are not used.

+
§Examples
+
#![feature(get_many_mut)]
+
+let x = &mut [1, 2, 4];
+
+unsafe {
+    let [a, b] = x.get_many_unchecked_mut([0, 2]);
+    *a *= 10;
+    *b *= 100;
+}
+assert_eq!(x, &[10, 2, 400]);
+
source

pub fn get_many_mut<const N: usize>( + &mut self, + indices: [usize; N], +) -> Result<[&mut T; N], GetManyMutError<N>>

🔬This is a nightly-only experimental API. (get_many_mut)

Returns mutable references to many indices at once.

+

Returns an error if any index is out-of-bounds, or if the same index was +passed more than once.

+
§Examples
+
#![feature(get_many_mut)]
+
+let v = &mut [1, 2, 3];
+if let Ok([a, b]) = v.get_many_mut([0, 2]) {
+    *a = 413;
+    *b = 612;
+}
+assert_eq!(v, &[413, 2, 612]);
+
source

pub fn elem_offset(&self, element: &T) -> Option<usize>

🔬This is a nightly-only experimental API. (substr_range)

Returns the index that an element reference points to.

+

Returns None if element does not point within the slice or if it points between elements.

+

This method is useful for extending slice iterators like slice::split.

+

Note that this uses pointer arithmetic and does not compare elements. +To find the index of an element via comparison, use +.iter().position() instead.

+
§Panics
+

Panics if T is zero-sized.

+
§Examples
+

Basic usage:

+ +
#![feature(substr_range)]
+
+let nums: &[u32] = &[1, 7, 1, 1];
+let num = &nums[2];
+
+assert_eq!(num, &1);
+assert_eq!(nums.elem_offset(num), Some(2));
+

Returning None with an in-between element:

+ +
#![feature(substr_range)]
+
+let arr: &[[u32; 2]] = &[[0, 1], [2, 3]];
+let flat_arr: &[u32] = arr.as_flattened();
+
+let ok_elm: &[u32; 2] = flat_arr[0..2].try_into().unwrap();
+let weird_elm: &[u32; 2] = flat_arr[1..3].try_into().unwrap();
+
+assert_eq!(ok_elm, &[0, 1]);
+assert_eq!(weird_elm, &[1, 2]);
+
+assert_eq!(arr.elem_offset(ok_elm), Some(0)); // Points to element 0
+assert_eq!(arr.elem_offset(weird_elm), None); // Points between element 0 and 1
+
source

pub fn subslice_range(&self, subslice: &[T]) -> Option<Range<usize>>

🔬This is a nightly-only experimental API. (substr_range)

Returns the range of indices that a subslice points to.

+

Returns None if subslice does not point within the slice or if it points between elements.

+

This method does not compare elements. Instead, this method finds the location in the slice that +subslice was obtained from. To find the index of a subslice via comparison, instead use +.windows().position().

+

This method is useful for extending slice iterators like slice::split.

+

Note that this may return a false positive (either Some(0..0) or Some(self.len()..self.len())) +if subslice has a length of zero and points to the beginning or end of another, separate, slice.

+
§Panics
+

Panics if T is zero-sized.

+
§Examples
+

Basic usage:

+ +
#![feature(substr_range)]
+
+let nums = &[0, 5, 10, 0, 0, 5];
+
+let mut iter = nums
+    .split(|t| *t == 0)
+    .map(|n| nums.subslice_range(n).unwrap());
+
+assert_eq!(iter.next(), Some(0..0));
+assert_eq!(iter.next(), Some(1..3));
+assert_eq!(iter.next(), Some(4..4));
+assert_eq!(iter.next(), Some(5..6));
+
1.80.0 · source

pub fn as_flattened(&self) -> &[T]

Takes a &[[T; N]], and flattens it to a &[T].

+
§Panics
+

This panics if the length of the resulting slice would overflow a usize.

+

This is only possible when flattening a slice of arrays of zero-sized +types, and thus tends to be irrelevant in practice. If +size_of::<T>() > 0, this will never panic.

+
§Examples
+
assert_eq!([[1, 2, 3], [4, 5, 6]].as_flattened(), &[1, 2, 3, 4, 5, 6]);
+
+assert_eq!(
+    [[1, 2, 3], [4, 5, 6]].as_flattened(),
+    [[1, 2], [3, 4], [5, 6]].as_flattened(),
+);
+
+let slice_of_empty_arrays: &[[i32; 0]] = &[[], [], [], [], []];
+assert!(slice_of_empty_arrays.as_flattened().is_empty());
+
+let empty_slice_of_arrays: &[[u32; 10]] = &[];
+assert!(empty_slice_of_arrays.as_flattened().is_empty());
+
1.80.0 · source

pub fn as_flattened_mut(&mut self) -> &mut [T]

Takes a &mut [[T; N]], and flattens it to a &mut [T].

+
§Panics
+

This panics if the length of the resulting slice would overflow a usize.

+

This is only possible when flattening a slice of arrays of zero-sized +types, and thus tends to be irrelevant in practice. If +size_of::<T>() > 0, this will never panic.

+
§Examples
+
fn add_5_to_all(slice: &mut [i32]) {
+    for i in slice {
+        *i += 5;
+    }
+}
+
+let mut array = [[1, 2, 3], [4, 5, 6], [7, 8, 9]];
+add_5_to_all(array.as_flattened_mut());
+assert_eq!(array, [[6, 7, 8], [9, 10, 11], [12, 13, 14]]);
+
source

pub fn sort_floats(&mut self)

🔬This is a nightly-only experimental API. (sort_floats)

Sorts the slice of floats.

+

This sort is in-place (i.e. does not allocate), O(n * log(n)) worst-case, and uses +the ordering defined by f32::total_cmp.

+
§Current implementation
+

This uses the same sorting algorithm as sort_unstable_by.

+
§Examples
+
#![feature(sort_floats)]
+let mut v = [2.6, -5e-8, f32::NAN, 8.29, f32::INFINITY, -1.0, 0.0, -f32::INFINITY, -0.0];
+
+v.sort_floats();
+let sorted = [-f32::INFINITY, -1.0, -5e-8, -0.0, 0.0, 2.6, 8.29, f32::INFINITY, f32::NAN];
+assert_eq!(&v[..8], &sorted[..8]);
+assert!(v[8].is_nan());
+
source

pub fn sort_floats(&mut self)

🔬This is a nightly-only experimental API. (sort_floats)

Sorts the slice of floats.

+

This sort is in-place (i.e. does not allocate), O(n * log(n)) worst-case, and uses +the ordering defined by f64::total_cmp.

+
§Current implementation
+

This uses the same sorting algorithm as sort_unstable_by.

+
§Examples
+
#![feature(sort_floats)]
+let mut v = [2.6, -5e-8, f64::NAN, 8.29, f64::INFINITY, -1.0, 0.0, -f64::INFINITY, -0.0];
+
+v.sort_floats();
+let sorted = [-f64::INFINITY, -1.0, -5e-8, -0.0, 0.0, 2.6, 8.29, f64::INFINITY, f64::NAN];
+assert_eq!(&v[..8], &sorted[..8]);
+assert!(v[8].is_nan());
+
1.79.0 · source

pub fn utf8_chunks(&self) -> Utf8Chunks<'_>

Creates an iterator over the contiguous valid UTF-8 ranges of this +slice, and the non-UTF-8 fragments in between.

+
§Examples
+

This function formats arbitrary but mostly-UTF-8 bytes into Rust source +code in the form of a C-string literal (c"...").

+ +
use std::fmt::Write as _;
+
+pub fn cstr_literal(bytes: &[u8]) -> String {
+    let mut repr = String::new();
+    repr.push_str("c\"");
+    for chunk in bytes.utf8_chunks() {
+        for ch in chunk.valid().chars() {
+            // Escapes \0, \t, \r, \n, \\, \', \", and uses \u{...} for non-printable characters.
+            write!(repr, "{}", ch.escape_debug()).unwrap();
+        }
+        for byte in chunk.invalid() {
+            write!(repr, "\\x{:02X}", byte).unwrap();
+        }
+    }
+    repr.push('"');
+    repr
+}
+
+fn main() {
+    let lit = cstr_literal(b"\xferris the \xf0\x9f\xa6\x80\x07");
+    let expected = stringify!(c"\xFErris the 🦀\u{7}");
+    assert_eq!(lit, expected);
+}
+
1.0.0 · source

pub fn sort(&mut self)
where + T: Ord,

Sorts the slice, preserving initial order of equal elements.

+

This sort is stable (i.e., does not reorder equal elements) and O(n * log(n)) +worst-case.

+

If the implementation of Ord for T does not implement a total order the resulting +order of elements in the slice is unspecified. All original elements will remain in the +slice and any possible modifications via interior mutability are observed in the input. Same +is true if the implementation of Ord for T panics.

+

When applicable, unstable sorting is preferred because it is generally faster than stable +sorting and it doesn’t allocate auxiliary memory. See +sort_unstable. The exception are partially sorted slices, which +may be better served with slice::sort.

+

Sorting types that only implement PartialOrd such as f32 and f64 require +additional precautions. For example, f32::NAN != f32::NAN, which doesn’t fulfill the +reflexivity requirement of Ord. By using an alternative comparison function with +slice::sort_by such as f32::total_cmp or f64::total_cmp that defines a total +order users can sort slices containing floating-point values. Alternatively, if all values +in the slice are guaranteed to be in a subset for which PartialOrd::partial_cmp forms a +total order, it’s possible to sort the slice with sort_by(|a, b| a.partial_cmp(b).unwrap()).

+
§Current implementation
+

The current implementation is based on driftsort by Orson Peters and Lukas Bergdoll, which +combines the fast average case of quicksort with the fast worst case and partial run +detection of mergesort, achieving linear time on fully sorted and reversed inputs. On inputs +with k distinct elements, the expected time to sort the data is O(n * log(k)).

+

The auxiliary memory allocation behavior depends on the input length. Short slices are +handled without allocation, medium sized slices allocate self.len() and beyond that it +clamps at self.len() / 2.

+
§Panics
+

May panic if the implementation of Ord for T does not implement a total order.

+
§Examples
+
let mut v = [4, -5, 1, -3, 2];
+
+v.sort();
+assert_eq!(v, [-5, -3, 1, 2, 4]);
+
1.0.0 · source

pub fn sort_by<F>(&mut self, compare: F)
where + F: FnMut(&T, &T) -> Ordering,

Sorts the slice with a comparison function, preserving initial order of equal elements.

+

This sort is stable (i.e., does not reorder equal elements) and O(n * log(n)) +worst-case.

+

If the comparison function compare does not implement a total order the resulting order +of elements in the slice is unspecified. All original elements will remain in the slice and +any possible modifications via interior mutability are observed in the input. Same is true +if compare panics.

+

For example |a, b| (a - b).cmp(a) is a comparison function that is neither transitive nor +reflexive nor total, a < b < c < a with a = 1, b = 2, c = 3. For more information and +examples see the Ord documentation.

+
§Current implementation
+

The current implementation is based on driftsort by Orson Peters and Lukas Bergdoll, which +combines the fast average case of quicksort with the fast worst case and partial run +detection of mergesort, achieving linear time on fully sorted and reversed inputs. On inputs +with k distinct elements, the expected time to sort the data is O(n * log(k)).

+

The auxiliary memory allocation behavior depends on the input length. Short slices are +handled without allocation, medium sized slices allocate self.len() and beyond that it +clamps at self.len() / 2.

+
§Panics
+

May panic if compare does not implement a total order.

+
§Examples
+
let mut v = [4, -5, 1, -3, 2];
+v.sort_by(|a, b| a.cmp(b));
+assert_eq!(v, [-5, -3, 1, 2, 4]);
+
+// reverse sorting
+v.sort_by(|a, b| b.cmp(a));
+assert_eq!(v, [4, 2, 1, -3, -5]);
+
1.7.0 · source

pub fn sort_by_key<K, F>(&mut self, f: F)
where + F: FnMut(&T) -> K, + K: Ord,

Sorts the slice with a key extraction function, preserving initial order of equal elements.

+

This sort is stable (i.e., does not reorder equal elements) and O(m * n * log(n)) +worst-case, where the key function is O(m).

+

If the implementation of Ord for K does not implement a total order the resulting +order of elements in the slice is unspecified. All original elements will remain in the +slice and any possible modifications via interior mutability are observed in the input. Same +is true if the implementation of Ord for K panics.

+
§Current implementation
+

The current implementation is based on driftsort by Orson Peters and Lukas Bergdoll, which +combines the fast average case of quicksort with the fast worst case and partial run +detection of mergesort, achieving linear time on fully sorted and reversed inputs. On inputs +with k distinct elements, the expected time to sort the data is O(n * log(k)).

+

The auxiliary memory allocation behavior depends on the input length. Short slices are +handled without allocation, medium sized slices allocate self.len() and beyond that it +clamps at self.len() / 2.

+
§Panics
+

May panic if the implementation of Ord for K does not implement a total order.

+
§Examples
+
let mut v = [4i32, -5, 1, -3, 2];
+
+v.sort_by_key(|k| k.abs());
+assert_eq!(v, [1, 2, -3, 4, -5]);
+
1.34.0 · source

pub fn sort_by_cached_key<K, F>(&mut self, f: F)
where + F: FnMut(&T) -> K, + K: Ord,

Sorts the slice with a key extraction function, preserving initial order of equal elements.

+

This sort is stable (i.e., does not reorder equal elements) and O(m * n + n * +log(n)) worst-case, where the key function is O(m).

+

During sorting, the key function is called at most once per element, by using temporary +storage to remember the results of key evaluation. The order of calls to the key function is +unspecified and may change in future versions of the standard library.

+

If the implementation of Ord for K does not implement a total order the resulting +order of elements in the slice is unspecified. All original elements will remain in the +slice and any possible modifications via interior mutability are observed in the input. Same +is true if the implementation of Ord for K panics.

+

For simple key functions (e.g., functions that are property accesses or basic operations), +sort_by_key is likely to be faster.

+
§Current implementation
+

The current implementation is based on instruction-parallel-network sort by Lukas +Bergdoll, which combines the fast average case of randomized quicksort with the fast worst +case of heapsort, while achieving linear time on fully sorted and reversed inputs. And +O(k * log(n)) where k is the number of distinct elements in the input. It leverages +superscalar out-of-order execution capabilities commonly found in CPUs, to efficiently +perform the operation.

+

In the worst case, the algorithm allocates temporary storage in a Vec<(K, usize)> the +length of the slice.

+
§Panics
+

May panic if the implementation of Ord for K does not implement a total order.

+
§Examples
+
let mut v = [4i32, -5, 1, -3, 2, 10];
+
+// Strings are sorted by lexicographical order.
+v.sort_by_cached_key(|k| k.to_string());
+assert_eq!(v, [-3, -5, 1, 10, 2, 4]);
+
1.0.0 · source

pub fn to_vec(&self) -> Vec<T>
where + T: Clone,

Copies self into a new Vec.

+
§Examples
+
let s = [10, 40, 30];
+let x = s.to_vec();
+// Here, `s` and `x` can be modified independently.
+
source

pub fn to_vec_in<A>(&self, alloc: A) -> Vec<T, A>
where + A: Allocator, + T: Clone,

🔬This is a nightly-only experimental API. (allocator_api)

Copies self into a new Vec with an allocator.

+
§Examples
+
#![feature(allocator_api)]
+
+use std::alloc::System;
+
+let s = [10, 40, 30];
+let x = s.to_vec_in(System);
+// Here, `s` and `x` can be modified independently.
+
1.40.0 · source

pub fn repeat(&self, n: usize) -> Vec<T>
where + T: Copy,

Creates a vector by copying a slice n times.

+
§Panics
+

This function will panic if the capacity would overflow.

+
§Examples
+

Basic usage:

+ +
assert_eq!([1, 2].repeat(3), vec![1, 2, 1, 2, 1, 2]);
+

A panic upon overflow:

+ +
// this will panic at runtime
+b"0123456789abcdef".repeat(usize::MAX);
+
1.0.0 · source

pub fn concat<Item>(&self) -> <[T] as Concat<Item>>::Output
where + [T]: Concat<Item>, + Item: ?Sized,

Flattens a slice of T into a single value Self::Output.

+
§Examples
+
assert_eq!(["hello", "world"].concat(), "helloworld");
+assert_eq!([[1, 2], [3, 4]].concat(), [1, 2, 3, 4]);
+
1.3.0 · source

pub fn join<Separator>( + &self, + sep: Separator, +) -> <[T] as Join<Separator>>::Output
where + [T]: Join<Separator>,

Flattens a slice of T into a single value Self::Output, placing a +given separator between each.

+
§Examples
+
assert_eq!(["hello", "world"].join(" "), "hello world");
+assert_eq!([[1, 2], [3, 4]].join(&0), [1, 2, 0, 3, 4]);
+assert_eq!([[1, 2], [3, 4]].join(&[0, 0][..]), [1, 2, 0, 0, 3, 4]);
+
1.0.0 · source

pub fn connect<Separator>( + &self, + sep: Separator, +) -> <[T] as Join<Separator>>::Output
where + [T]: Join<Separator>,

👎Deprecated since 1.3.0: renamed to join

Flattens a slice of T into a single value Self::Output, placing a +given separator between each.

+
§Examples
+
assert_eq!(["hello", "world"].connect(" "), "hello world");
+assert_eq!([[1, 2], [3, 4]].connect(&0), [1, 2, 0, 3, 4]);
+
1.23.0 · source

pub fn to_ascii_uppercase(&self) -> Vec<u8>

Returns a vector containing a copy of this slice where each byte +is mapped to its ASCII upper case equivalent.

+

ASCII letters ‘a’ to ‘z’ are mapped to ‘A’ to ‘Z’, +but non-ASCII letters are unchanged.

+

To uppercase the value in-place, use make_ascii_uppercase.

+
1.23.0 · source

pub fn to_ascii_lowercase(&self) -> Vec<u8>

Returns a vector containing a copy of this slice where each byte +is mapped to its ASCII lower case equivalent.

+

ASCII letters ‘A’ to ‘Z’ are mapped to ‘a’ to ‘z’, +but non-ASCII letters are unchanged.

+

To lowercase the value in-place, use make_ascii_lowercase.

+

Trait Implementations§

source§

impl Clone for Timeline

source§

fn clone(&self) -> Timeline

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for Timeline

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Deref for Timeline

source§

type Target = [Keyframe]

The resulting type after dereferencing.
source§

fn deref(&self) -> &Self::Target

Dereferences the value.
source§

impl DerefMut for Timeline

source§

fn deref_mut(&mut self) -> &mut Self::Target

Mutably dereferences the value.
source§

impl<'de> Deserialize<'de> for Timeline

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl PartialEq for Timeline

source§

fn eq(&self, other: &Timeline) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
source§

impl Serialize for Timeline

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl StructuralPartialEq for Timeline

Auto Trait Implementations§

Blanket Implementations§

source§

impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for S
where + T: Real + Zero + Arithmetics + Clone, + Swp: WhitePoint<T>, + Dwp: WhitePoint<T>, + D: AdaptFrom<S, Swp, Dwp, T>,

source§

fn adapt_into_using<M>(self, method: M) -> D
where + M: TransformMatrix<T>,

Convert the source color to the destination color using the specified +method.
source§

fn adapt_into(self) -> D

Convert the source color to the destination color using the bradford +method by default.
source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T, C> ArraysFrom<C> for T
where + C: IntoArrays<T>,

source§

fn arrays_from(colors: C) -> T

Cast a collection of colors into a collection of arrays.
source§

impl<T, C> ArraysInto<C> for T
where + C: FromArrays<T>,

source§

fn arrays_into(self) -> C

Cast this collection of arrays into a collection of colors.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<WpParam, T, U> Cam16IntoUnclamped<WpParam, T> for U
where + T: FromCam16Unclamped<WpParam, U>,

source§

type Scalar = <T as FromCam16Unclamped<WpParam, U>>::Scalar

The number type that’s used in parameters when converting.
source§

fn cam16_into_unclamped( + self, + parameters: BakedParameters<WpParam, <U as Cam16IntoUnclamped<WpParam, T>>::Scalar>, +) -> T

Converts self into C, using the provided parameters.
§

impl<A> Cast for A

§

fn cast<To>(self) -> To
where + To: CastFrom<A>,

Casts self to the To type. This may be a lossy operation.
§

impl<A> CastFrom<A> for A

§

fn from_cast(from: A) -> A

Returns from as Self.
§

impl<A, B> CastInto<A> for B
where + A: CastFrom<B>,

§

fn cast_into(self) -> A

Returns self as To.
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T, C> ComponentsFrom<C> for T
where + C: IntoComponents<T>,

source§

fn components_from(colors: C) -> T

Cast a collection of colors into a collection of color components.
§

impl<T> Downcast<T> for T

§

fn downcast(&self) -> &T

§

impl<T> Downcast for T
where + T: Any,

§

fn into_any(self: Box<T>) -> Box<dyn Any>

Convert Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can +then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.
§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Convert Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be +further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
§

fn as_any(&self) -> &(dyn Any + 'static)

Convert &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot +generate &Any’s vtable from &Trait’s.
§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot +generate &mut Any’s vtable from &mut Trait’s.
§

impl<T> DowncastSync for T
where + T: Any + Send + Sync,

§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be +further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T> FromAngle<T> for T

source§

fn from_angle(angle: T) -> T

Performs a conversion from angle.
source§

impl<T, U> FromStimulus<U> for T
where + U: IntoStimulus<T>,

source§

fn from_stimulus(other: U) -> T

Converts other into Self, while performing the appropriate scaling, +rounding and clamping.
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T, U> IntoAngle<U> for T
where + U: FromAngle<T>,

source§

fn into_angle(self) -> U

Performs a conversion into T.
source§

impl<WpParam, T, U> IntoCam16Unclamped<WpParam, T> for U
where + T: Cam16FromUnclamped<WpParam, U>,

source§

type Scalar = <T as Cam16FromUnclamped<WpParam, U>>::Scalar

The number type that’s used in parameters when converting.
source§

fn into_cam16_unclamped( + self, + parameters: BakedParameters<WpParam, <U as IntoCam16Unclamped<WpParam, T>>::Scalar>, +) -> T

Converts self into C, using the provided parameters.
source§

impl<T, U> IntoColor<U> for T
where + U: FromColor<T>,

source§

fn into_color(self) -> U

Convert into T with values clamped to the color defined bounds Read more
source§

impl<T, U> IntoColorUnclamped<U> for T
where + U: FromColorUnclamped<T>,

source§

fn into_color_unclamped(self) -> U

Convert into T. The resulting color might be invalid in its color space Read more
source§

impl<T> IntoEither for T

source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<T> IntoReadOnly<T> for T

§

fn into_read_only(self) -> ReadOnly<T>

Returns self as a ReadOnly.
source§

impl<T> IntoStimulus<T> for T

source§

fn into_stimulus(self) -> T

Converts self into T, while performing the appropriate scaling, +rounding and clamping.
§

impl<T> IntoValue<Option<T>> for T

§

fn into_value(self) -> Value<Option<T>>

Returns this type as a [Value].
§

impl<T> IntoValue<T> for T

§

fn into_value(self) -> Value<T>

Returns this type as a [Value].
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
source§

impl<T> ToOwned for T
where + T: Clone,

source§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, C> TryComponentsInto<C> for T
where + C: TryFromComponents<T>,

source§

type Error = <C as TryFromComponents<T>>::Error

The error for when try_into_colors fails to cast.
source§

fn try_components_into(self) -> Result<C, <T as TryComponentsInto<C>>::Error>

Try to cast this collection of color components into a collection of +colors. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

source§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
source§

impl<T, U> TryIntoColor<U> for T
where + U: TryFromColor<T>,

source§

fn try_into_color(self) -> Result<U, OutOfBounds<U>>

Convert into T, returning ok if the color is inside of its defined +range, otherwise an OutOfBounds error is returned which contains +the unclamped color. Read more
source§

impl<C, U> UintsFrom<C> for U
where + C: IntoUints<U>,

source§

fn uints_from(colors: C) -> U

Cast a collection of colors into a collection of unsigned integers.
source§

impl<C, U> UintsInto<C> for U
where + C: FromUints<U>,

source§

fn uints_into(self) -> C

Cast this collection of unsigned integers into a collection of colors.
§

impl<T> Upcast<T> for T

§

fn upcast(&self) -> Option<&T>

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

§

impl<T> WasmNotSend for T
where + T: Send,

§

impl<T> WasmNotSendSync for T
where + T: WasmNotSend + WasmNotSync,

§

impl<T> WasmNotSync for T
where + T: Sync,

\ No newline at end of file diff --git a/main/funnybones/cushy/index.html b/main/funnybones/cushy/index.html index ee6337d..46d12dc 100644 --- a/main/funnybones/cushy/index.html +++ b/main/funnybones/cushy/index.html @@ -1,2 +1,2 @@ -funnybones::cushy - Rust

Module funnybones::cushy

source ·
Expand description

Widgets for editing and rendering skeletons.

+funnybones::cushy - Rust

Module funnybones::cushy

source ·
Expand description

Widgets for editing and rendering skeletons.

Modules§

\ No newline at end of file diff --git a/main/funnybones/cushy/skeleton_canvas/enum.SkeletonMutation.html b/main/funnybones/cushy/skeleton_canvas/enum.SkeletonMutation.html index 2d3e7d1..4646618 100644 --- a/main/funnybones/cushy/skeleton_canvas/enum.SkeletonMutation.html +++ b/main/funnybones/cushy/skeleton_canvas/enum.SkeletonMutation.html @@ -1,4 +1,4 @@ -SkeletonMutation in funnybones::cushy::skeleton_canvas - Rust
pub enum SkeletonMutation {
+SkeletonMutation in funnybones::cushy::skeleton_canvas - Rust
pub enum SkeletonMutation {
     SetDesiredEnd {
         bone: BoneId,
         end: Vector,
@@ -34,7 +34,7 @@
 further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
§

fn as_any(&self) -> &(dyn Any + 'static)

Convert &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
§

impl<T> DowncastSync for T
where - T: Any + Send + Sync,

§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Sync + Send>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be + T: Any + Send + Sync,
§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T> FromAngle<T> for T

source§

fn from_angle(angle: T) -> T

Performs a conversion from angle.
source§

impl<T, U> FromStimulus<U> for T
where U: IntoStimulus<T>,

source§

fn from_stimulus(other: U) -> T

Converts other into Self, while performing the appropriate scaling, diff --git a/main/funnybones/cushy/skeleton_canvas/enum.Target.html b/main/funnybones/cushy/skeleton_canvas/enum.Target.html index 9092a63..ff4611c 100644 --- a/main/funnybones/cushy/skeleton_canvas/enum.Target.html +++ b/main/funnybones/cushy/skeleton_canvas/enum.Target.html @@ -1,4 +1,4 @@ -Target in funnybones::cushy::skeleton_canvas - Rust

Enum funnybones::cushy::skeleton_canvas::Target

source ·
pub enum Target {
+Target in funnybones::cushy::skeleton_canvas - Rust

Enum funnybones::cushy::skeleton_canvas::Target

source ·
pub enum Target {
     Joint(JointId),
     DesiredEnd(BoneId),
 }

Variants§

§

Joint(JointId)

§

DesiredEnd(BoneId)

Trait Implementations§

source§

impl Clone for Target

source§

fn clone(&self) -> Target

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for Target

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl PartialEq for Target

source§

fn eq(&self, other: &Target) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, @@ -28,7 +28,7 @@ further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
§

fn as_any(&self) -> &(dyn Any + 'static)

Convert &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
§

impl<T> DowncastSync for T
where - T: Any + Send + Sync,

§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Sync + Send>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be + T: Any + Send + Sync,
§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where diff --git a/main/funnybones/cushy/skeleton_canvas/index.html b/main/funnybones/cushy/skeleton_canvas/index.html index 3dfb123..e28b179 100644 --- a/main/funnybones/cushy/skeleton_canvas/index.html +++ b/main/funnybones/cushy/skeleton_canvas/index.html @@ -1 +1 @@ -funnybones::cushy::skeleton_canvas - Rust
\ No newline at end of file +funnybones::cushy::skeleton_canvas - Rust
\ No newline at end of file diff --git a/main/funnybones/cushy/skeleton_canvas/struct.SkeletonCanvas.html b/main/funnybones/cushy/skeleton_canvas/struct.SkeletonCanvas.html index 1853bbc..474f429 100644 --- a/main/funnybones/cushy/skeleton_canvas/struct.SkeletonCanvas.html +++ b/main/funnybones/cushy/skeleton_canvas/struct.SkeletonCanvas.html @@ -1,4 +1,4 @@ -SkeletonCanvas in funnybones::cushy::skeleton_canvas - Rust

Struct funnybones::cushy::skeleton_canvas::SkeletonCanvas

source ·
pub struct SkeletonCanvas { /* private fields */ }

Implementations§

source§

impl SkeletonCanvas

source

pub fn new(skeleton: Dynamic<Skeleton>) -> Self

source

pub fn maximum_scale(&self) -> &Dynamic<f32>

source

pub fn minimum_scale(&self) -> &Dynamic<f32>

source

pub fn scale(&self) -> &Dynamic<f32>

source

pub fn on_mutate<F>(self, on_mutate: F) -> Self
where +SkeletonCanvas in funnybones::cushy::skeleton_canvas - Rust

Struct funnybones::cushy::skeleton_canvas::SkeletonCanvas

source ·
pub struct SkeletonCanvas { /* private fields */ }

Implementations§

source§

impl SkeletonCanvas

source

pub fn new(skeleton: Dynamic<Skeleton>) -> Self

source

pub fn maximum_scale(&self) -> &Dynamic<f32>

source

pub fn minimum_scale(&self) -> &Dynamic<f32>

source

pub fn scale(&self) -> &Dynamic<f32>

source

pub fn on_mutate<F>(self, on_mutate: F) -> Self
where F: FnMut(SkeletonMutation) + Send + 'static,

Trait Implementations§

source§

impl Debug for SkeletonCanvas

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Widget for SkeletonCanvas

source§

fn redraw(&mut self, context: &mut GraphicsContext<'_, '_, '_, '_>)

Redraw the contents of this widget.
source§

fn layout( &mut self, available_space: Size<ConstraintLimit>, diff --git a/main/funnybones/enum.BoneEnd.html b/main/funnybones/enum.BoneEnd.html index 128d5ca..b4da717 100644 --- a/main/funnybones/enum.BoneEnd.html +++ b/main/funnybones/enum.BoneEnd.html @@ -1,16 +1,16 @@ -BoneEnd in funnybones - Rust

Enum funnybones::BoneEnd

source ·
pub enum BoneEnd {
+BoneEnd in funnybones - Rust

Enum funnybones::BoneEnd

source ·
pub enum BoneEnd {
     A,
     B,
 }
Expand description

A specific end of a Bone.

Variants§

§

A

The first end of a bone.

§

B

The second end of a bone.

-

Implementations§

source§

impl BoneEnd

source

pub const fn inverse(self) -> Self

Returns the opposite end of self.

-

Trait Implementations§

source§

impl Clone for BoneEnd

source§

fn clone(&self) -> BoneEnd

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for BoneEnd

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'de> Deserialize<'de> for BoneEnd

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where - __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl Hash for BoneEnd

source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where +

Implementations§

source§

impl BoneEnd

source

pub const fn inverse(self) -> Self

Returns the opposite end of self.

+

Trait Implementations§

source§

impl Clone for BoneEnd

source§

fn clone(&self) -> BoneEnd

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for BoneEnd

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'de> Deserialize<'de> for BoneEnd

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl Hash for BoneEnd

source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where H: Hasher, - Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
source§

impl PartialEq for BoneEnd

source§

fn eq(&self, other: &BoneEnd) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, -and should not be overridden without very good reason.
source§

impl Serialize for BoneEnd

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where - __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Copy for BoneEnd

source§

impl Eq for BoneEnd

source§

impl StructuralPartialEq for BoneEnd

Auto Trait Implementations§

Blanket Implementations§

source§

impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for S
where + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
source§

impl PartialEq for BoneEnd

source§

fn eq(&self, other: &BoneEnd) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
source§

impl Serialize for BoneEnd

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Copy for BoneEnd

source§

impl Eq for BoneEnd

source§

impl StructuralPartialEq for BoneEnd

Auto Trait Implementations§

Blanket Implementations§

source§

impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for S
where T: Real + Zero + Arithmetics + Clone, Swp: WhitePoint<T>, Dwp: WhitePoint<T>, @@ -36,7 +36,7 @@ further downcast into Rc<ConcreteType> where ConcreteType implements Trait.

§

fn as_any(&self) -> &(dyn Any + 'static)

Convert &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.

§

impl<T> DowncastSync for T
where - T: Any + Send + Sync,

§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Sync + Send>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be + T: Any + Send + Sync,

§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where diff --git a/main/funnybones/enum.BoneKind.html b/main/funnybones/enum.BoneKind.html index cdd520f..3005adb 100644 --- a/main/funnybones/enum.BoneKind.html +++ b/main/funnybones/enum.BoneKind.html @@ -1,4 +1,4 @@ -BoneKind in funnybones - Rust

Enum funnybones::BoneKind

source ·
pub enum BoneKind {
+BoneKind in funnybones - Rust

Enum funnybones::BoneKind

source ·
pub enum BoneKind {
     Rigid {
         length: f32,
     },
@@ -18,12 +18,15 @@
 skeleton.

§inverse: bool

The bend of the simulated joint always goes in one of two directions. This boolean toggles which direction the bend goes in.

-

Implementations§

source§

impl BoneKind

source

pub fn with_label(self, label: impl Into<String>) -> LabeledBoneKind

Attaches a label to this bone when pushed into a skeleton.

-
source

pub fn full_length(&self) -> f32

Returns the full length of this bone.

-

Trait Implementations§

source§

impl Clone for BoneKind

source§

fn clone(&self) -> BoneKind

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for BoneKind

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'de> Deserialize<'de> for BoneKind

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where - __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl From<BoneKind> for LabeledBoneKind

source§

fn from(kind: BoneKind) -> Self

Converts to this type from the input type.
source§

impl PartialEq for BoneKind

source§

fn eq(&self, other: &BoneKind) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, -and should not be overridden without very good reason.
source§

impl Serialize for BoneKind

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where - __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Copy for BoneKind

source§

impl StructuralPartialEq for BoneKind

Auto Trait Implementations§

Blanket Implementations§

source§

impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for S
where +

Implementations§

source§

impl BoneKind

source

pub fn with_label(self, label: impl Into<String>) -> LabeledBoneKind

Attaches a label to this bone when pushed into a skeleton.

+
source

pub fn full_length(&self) -> f32

Returns the full length of this bone.

+
source

pub fn is_inverse(&self) -> bool

Returns true if this is a jointed bone that bends inversely.

+
source

pub fn set_inverse(&mut self, new_inverse: bool)

Sets whether to bend inversely.

+

This function only affects a jointed bone kind.

+

Trait Implementations§

source§

impl Clone for BoneKind

source§

fn clone(&self) -> BoneKind

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for BoneKind

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'de> Deserialize<'de> for BoneKind

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl From<BoneKind> for LabeledBoneKind

source§

fn from(kind: BoneKind) -> Self

Converts to this type from the input type.
source§

impl PartialEq for BoneKind

source§

fn eq(&self, other: &BoneKind) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
source§

impl Serialize for BoneKind

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Copy for BoneKind

source§

impl StructuralPartialEq for BoneKind

Auto Trait Implementations§

Blanket Implementations§

source§

impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for S
where T: Real + Zero + Arithmetics + Clone, Swp: WhitePoint<T>, Dwp: WhitePoint<T>, @@ -49,7 +52,7 @@ further downcast into Rc<ConcreteType> where ConcreteType implements Trait.

§

fn as_any(&self) -> &(dyn Any + 'static)

Convert &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
§

impl<T> DowncastSync for T
where - T: Any + Send + Sync,

§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Sync + Send>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be + T: Any + Send + Sync,
§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T> FromAngle<T> for T

source§

fn from_angle(angle: T) -> T

Performs a conversion from angle.
source§

impl<T, U> FromStimulus<U> for T
where U: IntoStimulus<T>,

source§

fn from_stimulus(other: U) -> T

Converts other into Self, while performing the appropriate scaling, diff --git a/main/funnybones/index.html b/main/funnybones/index.html index 678fa59..862a366 100644 --- a/main/funnybones/index.html +++ b/main/funnybones/index.html @@ -1,4 +1,4 @@ -funnybones - Rust

Crate funnybones

source ·
Expand description
+funnybones - Rust

Crate funnybones

source ·
Expand description

FunnyBones is considered experimental and unsupported crate version diff --git a/main/funnybones/struct.Angle.html b/main/funnybones/struct.Angle.html index a20c29e..dfdc773 100644 --- a/main/funnybones/struct.Angle.html +++ b/main/funnybones/struct.Angle.html @@ -1,4 +1,4 @@ -Angle in funnybones - Rust

Struct funnybones::Angle

source ·
pub struct Angle { /* private fields */ }
Expand description

A value representing a direction.

+Angle in funnybones - Rust

Struct funnybones::Angle

source ·
pub struct Angle { /* private fields */ }
Expand description

A value representing a direction.

Implementations§

source§

impl Angle

source

pub const MIN: Self = _

The minimum rotation represented by this type.

source

pub const MAX: Self = _

The maximum rotation represented by this type.

source

pub fn radians(radians: f32) -> Self

Returns a rotation representing the given radians.

@@ -11,13 +11,13 @@ less than .

source

pub fn cos(self) -> f32

Returns the cosine of this angle.

source

pub fn sin(self) -> f32

Returns the sine of this angle.

-

Trait Implementations§

source§

impl Add<Angle> for Vector

source§

type Output = Vector

The resulting type after applying the + operator.
source§

fn add(self, rhs: Angle) -> Self::Output

Performs the + operation. Read more
source§

impl Add for Angle

source§

type Output = Angle

The resulting type after applying the + operator.
source§

fn add(self, rhs: Self) -> Self::Output

Performs the + operation. Read more
source§

impl AddAssign for Angle

source§

fn add_assign(&mut self, rhs: Self)

Performs the += operation. Read more
source§

impl Clone for Angle

source§

fn clone(&self) -> Angle

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for Angle

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Default for Angle

source§

fn default() -> Self

Returns the “default value” for a type. Read more
source§

impl<'de> Deserialize<'de> for Angle

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where +

Trait Implementations§

source§

impl Add<Angle> for Vector

source§

type Output = Vector

The resulting type after applying the + operator.
source§

fn add(self, rhs: Angle) -> Self::Output

Performs the + operation. Read more
source§

impl Add for Angle

source§

type Output = Angle

The resulting type after applying the + operator.
source§

fn add(self, rhs: Self) -> Self::Output

Performs the + operation. Read more
source§

impl AddAssign for Angle

source§

fn add_assign(&mut self, rhs: Self)

Performs the += operation. Read more
source§

impl Clone for Angle

source§

fn clone(&self) -> Angle

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for Angle

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Default for Angle

source§

fn default() -> Self

Returns the “default value” for a type. Read more
source§

impl<'de> Deserialize<'de> for Angle

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl Display for Angle

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl LinearInterpolate for Angle

source§

fn lerp(&self, target: &Self, percent: f32) -> Self

Interpolate linearly between self and target using percent.
source§

impl Neg for Angle

source§

type Output = Angle

The resulting type after applying the - operator.
source§

fn neg(self) -> Self::Output

Performs the unary - operation. Read more
source§

impl PartialEq for Angle

source§

fn eq(&self, other: &Angle) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
source§

impl PartialOrd for Angle

source§

fn partial_cmp(&self, other: &Angle) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the <= operator. Read more
1.0.0 · source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > operator. Read more
1.0.0 · source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by the >= operator. Read more
source§

impl PercentBetween for Angle

source§

fn percent_between(&self, min: &Self, max: &Self) -> ZeroToOne

Return the percentage that self is between min and max.
source§

impl Ranged for Angle

source§

const MIN: Self = Self::MIN

The minimum value for this type.
source§

const MAX: Self = Self::MAX

The maximum value for this type.
source§

impl Serialize for Angle

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where - __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Sub<Angle> for Vector

source§

type Output = Vector

The resulting type after applying the - operator.
source§

fn sub(self, rhs: Angle) -> Self::Output

Performs the - operation. Read more
source§

impl Sub for Angle

source§

type Output = Angle

The resulting type after applying the - operator.
source§

fn sub(self, rhs: Self) -> Self::Output

Performs the - operation. Read more
source§

impl SubAssign for Angle

source§

fn sub_assign(&mut self, rhs: Self)

Performs the -= operation. Read more
source§

impl Copy for Angle

source§

impl StructuralPartialEq for Angle

Auto Trait Implementations§

§

impl Freeze for Angle

§

impl RefUnwindSafe for Angle

§

impl Send for Angle

§

impl Sync for Angle

§

impl Unpin for Angle

§

impl UnwindSafe for Angle

Blanket Implementations§

source§

impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for S
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Sub<Angle> for Vector

source§

type Output = Vector

The resulting type after applying the - operator.
source§

fn sub(self, rhs: Angle) -> Self::Output

Performs the - operation. Read more
source§

impl Sub for Angle

source§

type Output = Angle

The resulting type after applying the - operator.
source§

fn sub(self, rhs: Self) -> Self::Output

Performs the - operation. Read more
source§

impl SubAssign for Angle

source§

fn sub_assign(&mut self, rhs: Self)

Performs the -= operation. Read more
source§

impl Copy for Angle

source§

impl StructuralPartialEq for Angle

Auto Trait Implementations§

§

impl Freeze for Angle

§

impl RefUnwindSafe for Angle

§

impl Send for Angle

§

impl Sync for Angle

§

impl Unpin for Angle

§

impl UnwindSafe for Angle

Blanket Implementations§

source§

impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for S
where T: Real + Zero + Arithmetics + Clone, Swp: WhitePoint<T>, Dwp: WhitePoint<T>, @@ -43,7 +43,7 @@ further downcast into Rc<ConcreteType> where ConcreteType implements Trait.

§

fn as_any(&self) -> &(dyn Any + 'static)

Convert &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
§

impl<T> DowncastSync for T
where - T: Any + Send + Sync,

§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Sync + Send>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be + T: Any + Send + Sync,
§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
§

impl<T> DynamicDisplay for T
where T: Display,

§

fn fmt( &self, diff --git a/main/funnybones/struct.Bone.html b/main/funnybones/struct.Bone.html index 84a7e3d..8c927a6 100644 --- a/main/funnybones/struct.Bone.html +++ b/main/funnybones/struct.Bone.html @@ -1,22 +1,23 @@ -Bone in funnybones - Rust

Struct funnybones::Bone

source ·
pub struct Bone { /* private fields */ }
Expand description

A bone in a Skeleton.

-

Implementations§

source§

impl Bone

source

pub const fn id(&self) -> BoneId

Returns the unique id of this bone.

-
source

pub const fn is_root(&self) -> bool

Returns true if this bone is the root of the skeleton.

-
source

pub const fn kind(&self) -> &BoneKind

Returns the kind of this bone.

-
source

pub fn set_desired_end(&mut self, end: Option<Vector>)

Sets a relative position to aim the end of this bone towards.

+Bone in funnybones - Rust

Struct funnybones::Bone

source ·
pub struct Bone { /* private fields */ }
Expand description

A bone in a Skeleton.

+

Implementations§

source§

impl Bone

source

pub const fn id(&self) -> BoneId

Returns the unique id of this bone.

+
source

pub const fn is_root(&self) -> bool

Returns true if this bone is the root of the skeleton.

+
source

pub const fn kind(&self) -> &BoneKind

Returns the kind of this bone.

+
source

pub fn kind_mut(&mut self) -> &mut BoneKind

Returns an exclusive reference to the kind of this bone.

+
source

pub fn set_desired_end(&mut self, end: Option<Vector>)

Sets a relative position to aim the end of this bone towards.

The end of the bone that is aimed is the end that is furthest from the root of the skeleton.

This setting only impacts BoneKind::Jointed bones.

-
source

pub const fn desired_end(&self) -> Option<Vector>

Returns the location this bone is being aimed towards.

-
source

pub const fn entry_angle(&self) -> Angle

Returns the angle of the previous bone segment connecting to this bone.

-
source

pub const fn start(&self) -> Coordinate

Returns the solved start position of this bone.

-
source

pub const fn end(&self) -> Coordinate

Returns the solved end position of this bone.

-
source

pub fn final_vector(&self) -> Vector

Returns a vector representing the final segment in this bone.

-
source

pub const fn solved_joint(&self) -> Option<Coordinate>

If this is a BoneKind::Jointed bone, returns the solved position of +

source

pub const fn desired_end(&self) -> Option<Vector>

Returns the location this bone is being aimed towards.

+
source

pub const fn entry_angle(&self) -> Angle

Returns the angle of the previous bone segment connecting to this bone.

+
source

pub const fn start(&self) -> Coordinate

Returns the solved start position of this bone.

+
source

pub const fn end(&self) -> Coordinate

Returns the solved end position of this bone.

+
source

pub fn final_vector(&self) -> Vector

Returns a vector representing the final segment in this bone.

+
source

pub const fn solved_joint(&self) -> Option<Coordinate>

If this is a BoneKind::Jointed bone, returns the solved position of the joint.

-
source

pub fn label(&self) -> &str

Returns the label this bone was created with.

-

Trait Implementations§

source§

impl Debug for Bone

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl PartialEq for Bone

source§

fn eq(&self, other: &Bone) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +
source

pub fn label(&self) -> &str

Returns the label this bone was created with.

+

Trait Implementations§

source§

impl Debug for Bone

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl PartialEq for Bone

source§

fn eq(&self, other: &Bone) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
source§

impl Serialize for Bone

source§

fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where - S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl StructuralPartialEq for Bone

Auto Trait Implementations§

§

impl Freeze for Bone

§

impl RefUnwindSafe for Bone

§

impl Send for Bone

§

impl Sync for Bone

§

impl Unpin for Bone

§

impl UnwindSafe for Bone

Blanket Implementations§

source§

impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for S
where + S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl StructuralPartialEq for Bone

Auto Trait Implementations§

§

impl Freeze for Bone

§

impl RefUnwindSafe for Bone

§

impl Send for Bone

§

impl Sync for Bone

§

impl Unpin for Bone

§

impl UnwindSafe for Bone

Blanket Implementations§

source§

impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for S
where T: Real + Zero + Arithmetics + Clone, Swp: WhitePoint<T>, Dwp: WhitePoint<T>, @@ -41,7 +42,7 @@ further downcast into Rc<ConcreteType> where ConcreteType implements Trait.

§

fn as_any(&self) -> &(dyn Any + 'static)

Convert &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
§

impl<T> DowncastSync for T
where - T: Any + Send + Sync,

§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Sync + Send>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be + T: Any + Send + Sync,

§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T> FromAngle<T> for T

source§

fn from_angle(angle: T) -> T

Performs a conversion from angle.
source§

impl<T, U> FromStimulus<U> for T
where U: IntoStimulus<T>,

source§

fn from_stimulus(other: U) -> T

Converts other into Self, while performing the appropriate scaling, diff --git a/main/funnybones/struct.BoneAxis.html b/main/funnybones/struct.BoneAxis.html index 51b8fd3..2061be8 100644 --- a/main/funnybones/struct.BoneAxis.html +++ b/main/funnybones/struct.BoneAxis.html @@ -1,16 +1,16 @@ -BoneAxis in funnybones - Rust

Struct funnybones::BoneAxis

source ·
pub struct BoneAxis {
+BoneAxis in funnybones - Rust

Struct funnybones::BoneAxis

source ·
pub struct BoneAxis {
     pub bone: BoneId,
     pub end: BoneEnd,
 }
Expand description

A specific end of a specific bone.

Fields§

§bone: BoneId

The unique id of the bone of this axis.

§end: BoneEnd

The end of the bone being referenced.

-

Implementations§

source§

impl BoneAxis

source

pub const fn inverse(self) -> Self

Returns the opposite axis on the same bone.

-

Trait Implementations§

source§

impl Clone for BoneAxis

source§

fn clone(&self) -> BoneAxis

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for BoneAxis

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'de> Deserialize<'de> for BoneAxis

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where - __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl Hash for BoneAxis

source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where +

Implementations§

source§

impl BoneAxis

source

pub const fn inverse(self) -> Self

Returns the opposite axis on the same bone.

+

Trait Implementations§

source§

impl Clone for BoneAxis

source§

fn clone(&self) -> BoneAxis

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for BoneAxis

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'de> Deserialize<'de> for BoneAxis

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl Hash for BoneAxis

source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where H: Hasher, - Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
source§

impl PartialEq for BoneAxis

source§

fn eq(&self, other: &BoneAxis) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, -and should not be overridden without very good reason.
source§

impl Serialize for BoneAxis

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where - __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Copy for BoneAxis

source§

impl Eq for BoneAxis

source§

impl StructuralPartialEq for BoneAxis

Auto Trait Implementations§

Blanket Implementations§

source§

impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for S
where + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
source§

impl PartialEq for BoneAxis

source§

fn eq(&self, other: &BoneAxis) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
source§

impl Serialize for BoneAxis

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Copy for BoneAxis

source§

impl Eq for BoneAxis

source§

impl StructuralPartialEq for BoneAxis

Auto Trait Implementations§

Blanket Implementations§

source§

impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for S
where T: Real + Zero + Arithmetics + Clone, Swp: WhitePoint<T>, Dwp: WhitePoint<T>, @@ -36,7 +36,7 @@ further downcast into Rc<ConcreteType> where ConcreteType implements Trait.

§

fn as_any(&self) -> &(dyn Any + 'static)

Convert &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
§

impl<T> DowncastSync for T
where - T: Any + Send + Sync,

§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Sync + Send>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be + T: Any + Send + Sync,
§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where diff --git a/main/funnybones/struct.BoneId.html b/main/funnybones/struct.BoneId.html index 93fd1e4..93b50d5 100644 --- a/main/funnybones/struct.BoneId.html +++ b/main/funnybones/struct.BoneId.html @@ -1,19 +1,19 @@ -BoneId in funnybones - Rust

Struct funnybones::BoneId

source ·
pub struct BoneId(/* private fields */);
Expand description

The unique ID of a Bone in a Skeleton.

-

Implementations§

source§

impl BoneId

source

pub const fn axis_a(self) -> BoneAxis

Returns the first axis of this bone.

-
source

pub const fn axis_b(self) -> BoneAxis

Returns the second axis of this bone.

-
source

pub fn index(self) -> usize

Returns the index of this bone within the skeleton.

-

Trait Implementations§

source§

impl Clone for BoneId

source§

fn clone(&self) -> BoneId

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for BoneId

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'de> Deserialize<'de> for BoneId

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where - __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl Hash for BoneId

source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where +BoneId in funnybones - Rust

Struct funnybones::BoneId

source ·
pub struct BoneId(/* private fields */);
Expand description

The unique ID of a Bone in a Skeleton.

+

Implementations§

source§

impl BoneId

source

pub const fn axis_a(self) -> BoneAxis

Returns the first axis of this bone.

+
source

pub const fn axis_b(self) -> BoneAxis

Returns the second axis of this bone.

+
source

pub fn index(self) -> usize

Returns the index of this bone within the skeleton.

+

Trait Implementations§

source§

impl Clone for BoneId

source§

fn clone(&self) -> BoneId

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for BoneId

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'de> Deserialize<'de> for BoneId

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl Hash for BoneId

source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where H: Hasher, - Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
source§

impl Index<BoneId> for Skeleton

source§

type Output = Bone

The returned type after indexing.
source§

fn index(&self, index: BoneId) -> &Self::Output

Performs the indexing (container[index]) operation. Read more
source§

impl IndexMut<BoneId> for Skeleton

source§

fn index_mut(&mut self, index: BoneId) -> &mut Self::Output

Performs the mutable indexing (container[index]) operation. Read more
source§

impl Ord for BoneId

source§

fn cmp(&self, other: &BoneId) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · source§

fn max(self, other: Self) -> Self
where + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
source§

impl Index<BoneId> for Skeleton

source§

type Output = Bone

The returned type after indexing.
source§

fn index(&self, index: BoneId) -> &Self::Output

Performs the indexing (container[index]) operation. Read more
source§

impl IndexMut<BoneId> for Skeleton

source§

fn index_mut(&mut self, index: BoneId) -> &mut Self::Output

Performs the mutable indexing (container[index]) operation. Read more
source§

impl Ord for BoneId

source§

fn cmp(&self, other: &BoneId) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · source§

fn max(self, other: Self) -> Self
where Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · source§

fn min(self, other: Self) -> Self
where Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · source§

fn clamp(self, min: Self, max: Self) -> Self
where - Self: Sized + PartialOrd,

Restrict a value to a certain interval. Read more
source§

impl PartialEq for BoneId

source§

fn eq(&self, other: &BoneId) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, -and should not be overridden without very good reason.
source§

impl PartialOrd for BoneId

source§

fn partial_cmp(&self, other: &BoneId) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the + Self: Sized + PartialOrd,

Restrict a value to a certain interval. Read more
source§

impl PartialEq for BoneId

source§

fn eq(&self, other: &BoneId) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
source§

impl PartialOrd for BoneId

source§

fn partial_cmp(&self, other: &BoneId) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the <= operator. Read more
1.0.0 · source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > operator. Read more
1.0.0 · source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by -the >= operator. Read more
source§

impl Serialize for BoneId

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where - __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Copy for BoneId

source§

impl Eq for BoneId

source§

impl StructuralPartialEq for BoneId

Auto Trait Implementations§

§

impl Freeze for BoneId

§

impl RefUnwindSafe for BoneId

§

impl Send for BoneId

§

impl Sync for BoneId

§

impl Unpin for BoneId

§

impl UnwindSafe for BoneId

Blanket Implementations§

source§

impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for S
where +the >= operator. Read more

source§

impl Serialize for BoneId

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Copy for BoneId

source§

impl Eq for BoneId

source§

impl StructuralPartialEq for BoneId

Auto Trait Implementations§

§

impl Freeze for BoneId

§

impl RefUnwindSafe for BoneId

§

impl Send for BoneId

§

impl Sync for BoneId

§

impl Unpin for BoneId

§

impl UnwindSafe for BoneId

Blanket Implementations§

source§

impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for S
where T: Real + Zero + Arithmetics + Clone, Swp: WhitePoint<T>, Dwp: WhitePoint<T>, @@ -41,7 +41,7 @@ further downcast into Rc<ConcreteType> where ConcreteType implements Trait.

§

fn as_any(&self) -> &(dyn Any + 'static)

Convert &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
§

impl<T> DowncastSync for T
where - T: Any + Send + Sync,

§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Sync + Send>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be + T: Any + Send + Sync,
§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where diff --git a/main/funnybones/struct.Coordinate.html b/main/funnybones/struct.Coordinate.html index d5c8d50..077c79d 100644 --- a/main/funnybones/struct.Coordinate.html +++ b/main/funnybones/struct.Coordinate.html @@ -1,4 +1,4 @@ -Coordinate in funnybones - Rust

Struct funnybones::Coordinate

source ·
pub struct Coordinate {
+Coordinate in funnybones - Rust

Struct funnybones::Coordinate

source ·
pub struct Coordinate {
     pub x: f32,
     pub y: f32,
 }
Expand description

A two dimensionsional offset/measurement.

@@ -9,14 +9,14 @@
source

pub fn map(self, f: impl FnMut(f32) -> f32) -> Self

Returns the result of mapping x and y to f.

source

pub fn as_rotation(self) -> Angle

Returns the angle formed a line passing through 0,0 towards this vector.

source

pub fn vector_to(self, other: Coordinate) -> Vector

Returns a vector pointing from self to other.

-

Trait Implementations§

source§

impl Add<Vector> for Coordinate

source§

type Output = Coordinate

The resulting type after applying the + operator.
source§

fn add(self, rhs: Vector) -> Self::Output

Performs the + operation. Read more
source§

impl Add for Coordinate

source§

type Output = Coordinate

The resulting type after applying the + operator.
source§

fn add(self, rhs: Self) -> Self::Output

Performs the + operation. Read more
source§

impl Clone for Coordinate

source§

fn clone(&self) -> Coordinate

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for Coordinate

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Default for Coordinate

source§

fn default() -> Coordinate

Returns the “default value” for a type. Read more
source§

impl<'de> Deserialize<'de> for Coordinate

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where +

Trait Implementations§

source§

impl Add<Vector> for Coordinate

source§

type Output = Coordinate

The resulting type after applying the + operator.
source§

fn add(self, rhs: Vector) -> Self::Output

Performs the + operation. Read more
source§

impl Add for Coordinate

source§

type Output = Coordinate

The resulting type after applying the + operator.
source§

fn add(self, rhs: Self) -> Self::Output

Performs the + operation. Read more
source§

impl Clone for Coordinate

source§

fn clone(&self) -> Coordinate

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for Coordinate

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Default for Coordinate

source§

fn default() -> Coordinate

Returns the “default value” for a type. Read more
source§

impl<'de> Deserialize<'de> for Coordinate

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl Div<f32> for Coordinate

source§

type Output = Coordinate

The resulting type after applying the / operator.
source§

fn div(self, rhs: f32) -> Self::Output

Performs the / operation. Read more
source§

impl From<Coordinate> for Vector

source§

fn from(pt: Coordinate) -> Self

Converts to this type from the input type.
source§

impl From<Vector> for Coordinate

source§

fn from(vec: Vector) -> Self

Converts to this type from the input type.
source§

impl FromComponents<f32> for Coordinate

source§

fn from_components(components: (f32, f32)) -> Self

Returns a new instance from the 2d vector components provided.
§

fn from_vec<Type>(other: Type) -> Self
where Type: IntoComponents<Unit>,

Converts this type to another type using [FromComponents] and [IntoComponents].
source§

impl IntoComponents<f32> for Coordinate

source§

fn into_components(self) -> (f32, f32)

Extracts this type’s 2d vector components.
§

fn to_vec<Type>(self) -> Type
where Type: FromComponents<Unit>,

Converts this type to another type using [FromComponents] and [IntoComponents].
source§

impl Mul<f32> for Coordinate

source§

type Output = Coordinate

The resulting type after applying the * operator.
source§

fn mul(self, rhs: f32) -> Self::Output

Performs the * operation. Read more
source§

impl PartialEq for Coordinate

source§

fn eq(&self, other: &Coordinate) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
source§

impl Serialize for Coordinate

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where - __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Sub<Vector> for Coordinate

source§

type Output = Coordinate

The resulting type after applying the - operator.
source§

fn sub(self, rhs: Vector) -> Self::Output

Performs the - operation. Read more
source§

impl Sub for Coordinate

source§

type Output = Coordinate

The resulting type after applying the - operator.
source§

fn sub(self, rhs: Self) -> Self::Output

Performs the - operation. Read more
source§

impl Copy for Coordinate

source§

impl StructuralPartialEq for Coordinate

Auto Trait Implementations§

Blanket Implementations§

source§

impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for S
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Sub<Vector> for Coordinate

source§

type Output = Coordinate

The resulting type after applying the - operator.
source§

fn sub(self, rhs: Vector) -> Self::Output

Performs the - operation. Read more
source§

impl Sub for Coordinate

source§

type Output = Coordinate

The resulting type after applying the - operator.
source§

fn sub(self, rhs: Self) -> Self::Output

Performs the - operation. Read more
source§

impl Copy for Coordinate

source§

impl StructuralPartialEq for Coordinate

Auto Trait Implementations§

Blanket Implementations§

source§

impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for S
where T: Real + Zero + Arithmetics + Clone, Swp: WhitePoint<T>, Dwp: WhitePoint<T>, @@ -42,7 +42,7 @@ further downcast into Rc<ConcreteType> where ConcreteType implements Trait.

§

fn as_any(&self) -> &(dyn Any + 'static)

Convert &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
§

impl<T> DowncastSync for T
where - T: Any + Send + Sync,

§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Sync + Send>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be + T: Any + Send + Sync,
§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T> FromAngle<T> for T

source§

fn from_angle(angle: T) -> T

Performs a conversion from angle.
source§

impl<T, U> FromStimulus<U> for T
where U: IntoStimulus<T>,

source§

fn from_stimulus(other: U) -> T

Converts other into Self, while performing the appropriate scaling, diff --git a/main/funnybones/struct.Joint.html b/main/funnybones/struct.Joint.html index 656a4d5..65540f1 100644 --- a/main/funnybones/struct.Joint.html +++ b/main/funnybones/struct.Joint.html @@ -1,20 +1,20 @@ -Joint in funnybones - Rust

Struct funnybones::Joint

source ·
pub struct Joint { /* private fields */ }
Expand description

A connection between two bones.

-

Implementations§

source§

impl Joint

source

pub const fn id(&self) -> JointId

Returns the unique id of this joint.

-
source

pub const fn new(angle: Angle, bone_a: BoneAxis, bone_b: BoneAxis) -> Self

Returns a new joint formed by joining bone_a and bone_b at angle.

-
source

pub fn with_label(self, label: impl Into<String>) -> Self

Labels this joint and returns self.

-
source

pub fn label(&self) -> &str

Returns the label of this joint.

-
source

pub fn other_axis(&self, axis: BoneAxis) -> BoneAxis

Given axis is one of the two connections in this joint, return the +Joint in funnybones - Rust

Struct funnybones::Joint

source ·
pub struct Joint { /* private fields */ }
Expand description

A connection between two bones.

+

Implementations§

source§

impl Joint

source

pub const fn id(&self) -> JointId

Returns the unique id of this joint.

+
source

pub const fn new(angle: Angle, bone_a: BoneAxis, bone_b: BoneAxis) -> Self

Returns a new joint formed by joining bone_a and bone_b at angle.

+
source

pub fn with_label(self, label: impl Into<String>) -> Self

Labels this joint and returns self.

+
source

pub fn label(&self) -> &str

Returns the label of this joint.

+
source

pub fn other_axis(&self, axis: BoneAxis) -> BoneAxis

Given axis is one of the two connections in this joint, return the other axis.

§Panics

This function has a debug assertion that ensures that axis is one of the bones in this joint.

-
source

pub fn set_angle(&mut self, angle: Angle)

Sets the angle to form between these joints.

+
source

pub fn set_angle(&mut self, angle: Angle)

Sets the angle to form between these joints.

This setting is ignored if the bone furthest from the root of the joint is a BoneKind::Jointed bone.

-
source

pub const fn angle(&self) -> Angle

Returns the rotation of this joint.

-

Trait Implementations§

source§

impl Debug for Joint

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl PartialEq for Joint

source§

fn eq(&self, other: &Joint) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +
source

pub const fn angle(&self) -> Angle

Returns the rotation of this joint.

+

Trait Implementations§

source§

impl Debug for Joint

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl PartialEq for Joint

source§

fn eq(&self, other: &Joint) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
source§

impl Serialize for Joint

source§

fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where - S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl StructuralPartialEq for Joint

Auto Trait Implementations§

§

impl Freeze for Joint

§

impl RefUnwindSafe for Joint

§

impl Send for Joint

§

impl Sync for Joint

§

impl Unpin for Joint

§

impl UnwindSafe for Joint

Blanket Implementations§

source§

impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for S
where + S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl StructuralPartialEq for Joint

Auto Trait Implementations§

§

impl Freeze for Joint

§

impl RefUnwindSafe for Joint

§

impl Send for Joint

§

impl Sync for Joint

§

impl Unpin for Joint

§

impl UnwindSafe for Joint

Blanket Implementations§

source§

impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for S
where T: Real + Zero + Arithmetics + Clone, Swp: WhitePoint<T>, Dwp: WhitePoint<T>, @@ -39,7 +39,7 @@
§Panics
further downcast into Rc<ConcreteType> where ConcreteType implements Trait.

§

fn as_any(&self) -> &(dyn Any + 'static)

Convert &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
§

impl<T> DowncastSync for T
where - T: Any + Send + Sync,

§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Sync + Send>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be + T: Any + Send + Sync,
§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T> FromAngle<T> for T

source§

fn from_angle(angle: T) -> T

Performs a conversion from angle.
source§

impl<T, U> FromStimulus<U> for T
where U: IntoStimulus<T>,

source§

fn from_stimulus(other: U) -> T

Converts other into Self, while performing the appropriate scaling, diff --git a/main/funnybones/struct.JointId.html b/main/funnybones/struct.JointId.html index 99306cf..c8562f4 100644 --- a/main/funnybones/struct.JointId.html +++ b/main/funnybones/struct.JointId.html @@ -1,17 +1,17 @@ -JointId in funnybones - Rust

Struct funnybones::JointId

source ·
pub struct JointId(/* private fields */);
Expand description

The unique ID of a Joint in a Skeleton.

-

Implementations§

source§

impl JointId

source

pub fn index(self) -> usize

Returns the index of this joint within the skeleton.

-

Trait Implementations§

source§

impl Clone for JointId

source§

fn clone(&self) -> JointId

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for JointId

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'de> Deserialize<'de> for JointId

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where - __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl Hash for JointId

source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where +JointId in funnybones - Rust

Struct funnybones::JointId

source ·
pub struct JointId(/* private fields */);
Expand description

The unique ID of a Joint in a Skeleton.

+

Implementations§

source§

impl JointId

source

pub fn index(self) -> usize

Returns the index of this joint within the skeleton.

+

Trait Implementations§

source§

impl Clone for JointId

source§

fn clone(&self) -> JointId

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for JointId

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'de> Deserialize<'de> for JointId

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl Hash for JointId

source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where H: Hasher, - Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
source§

impl Index<JointId> for Skeleton

source§

type Output = Joint

The returned type after indexing.
source§

fn index(&self, index: JointId) -> &Self::Output

Performs the indexing (container[index]) operation. Read more
source§

impl IndexMut<JointId> for Skeleton

source§

fn index_mut(&mut self, index: JointId) -> &mut Self::Output

Performs the mutable indexing (container[index]) operation. Read more
source§

impl Ord for JointId

source§

fn cmp(&self, other: &JointId) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · source§

fn max(self, other: Self) -> Self
where + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
source§

impl Index<JointId> for Skeleton

source§

type Output = Joint

The returned type after indexing.
source§

fn index(&self, index: JointId) -> &Self::Output

Performs the indexing (container[index]) operation. Read more
source§

impl IndexMut<JointId> for Skeleton

source§

fn index_mut(&mut self, index: JointId) -> &mut Self::Output

Performs the mutable indexing (container[index]) operation. Read more
source§

impl Ord for JointId

source§

fn cmp(&self, other: &JointId) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · source§

fn max(self, other: Self) -> Self
where Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · source§

fn min(self, other: Self) -> Self
where Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · source§

fn clamp(self, min: Self, max: Self) -> Self
where - Self: Sized + PartialOrd,

Restrict a value to a certain interval. Read more
source§

impl PartialEq for JointId

source§

fn eq(&self, other: &JointId) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, -and should not be overridden without very good reason.
source§

impl PartialOrd for JointId

source§

fn partial_cmp(&self, other: &JointId) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the + Self: Sized + PartialOrd,

Restrict a value to a certain interval. Read more
source§

impl PartialEq for JointId

source§

fn eq(&self, other: &JointId) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
source§

impl PartialOrd for JointId

source§

fn partial_cmp(&self, other: &JointId) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the <= operator. Read more
1.0.0 · source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > operator. Read more
1.0.0 · source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by -the >= operator. Read more
source§

impl Serialize for JointId

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where - __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Copy for JointId

source§

impl Eq for JointId

source§

impl StructuralPartialEq for JointId

Auto Trait Implementations§

Blanket Implementations§

source§

impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for S
where +the >= operator. Read more

source§

impl Serialize for JointId

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Copy for JointId

source§

impl Eq for JointId

source§

impl StructuralPartialEq for JointId

Auto Trait Implementations§

Blanket Implementations§

source§

impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for S
where T: Real + Zero + Arithmetics + Clone, Swp: WhitePoint<T>, Dwp: WhitePoint<T>, @@ -39,7 +39,7 @@ further downcast into Rc<ConcreteType> where ConcreteType implements Trait.

§

fn as_any(&self) -> &(dyn Any + 'static)

Convert &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
§

impl<T> DowncastSync for T
where - T: Any + Send + Sync,

§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Sync + Send>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be + T: Any + Send + Sync,
§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where diff --git a/main/funnybones/struct.LabeledBoneKind.html b/main/funnybones/struct.LabeledBoneKind.html index 31d59c4..49fe9ba 100644 --- a/main/funnybones/struct.LabeledBoneKind.html +++ b/main/funnybones/struct.LabeledBoneKind.html @@ -1,10 +1,10 @@ -LabeledBoneKind in funnybones - Rust

Struct funnybones::LabeledBoneKind

source ·
pub struct LabeledBoneKind {
+LabeledBoneKind in funnybones - Rust

Struct funnybones::LabeledBoneKind

source ·
pub struct LabeledBoneKind {
     pub kind: BoneKind,
     pub label: String,
 }
Expand description

A BoneKind with an associated label.

Fields§

§kind: BoneKind

The bone to create.

§label: String

The label of the bone.

-

Trait Implementations§

source§

impl From<BoneKind> for LabeledBoneKind

source§

fn from(kind: BoneKind) -> Self

Converts to this type from the input type.

Auto Trait Implementations§

Blanket Implementations§

source§

impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for S
where +

Trait Implementations§

source§

impl From<BoneKind> for LabeledBoneKind

source§

fn from(kind: BoneKind) -> Self

Converts to this type from the input type.

Auto Trait Implementations§

Blanket Implementations§

source§

impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for S
where T: Real + Zero + Arithmetics + Clone, Swp: WhitePoint<T>, Dwp: WhitePoint<T>, @@ -29,7 +29,7 @@ further downcast into Rc<ConcreteType> where ConcreteType implements Trait.

§

fn as_any(&self) -> &(dyn Any + 'static)

Convert &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
§

impl<T> DowncastSync for T
where - T: Any + Send + Sync,

§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Sync + Send>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be + T: Any + Send + Sync,

§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T> FromAngle<T> for T

source§

fn from_angle(angle: T) -> T

Performs a conversion from angle.
source§

impl<T, U> FromStimulus<U> for T
where U: IntoStimulus<T>,

source§

fn from_stimulus(other: U) -> T

Converts other into Self, while performing the appropriate scaling, diff --git a/main/funnybones/struct.Skeleton.html b/main/funnybones/struct.Skeleton.html index 83df2a3..baff325 100644 --- a/main/funnybones/struct.Skeleton.html +++ b/main/funnybones/struct.Skeleton.html @@ -1,26 +1,32 @@ -Skeleton in funnybones - Rust

Struct funnybones::Skeleton

source ·
pub struct Skeleton { /* private fields */ }
Expand description

A collection of Bones. connected by Joints.

-

Implementations§

source§

impl Skeleton

source

pub fn push_bone(&mut self, bone: impl Into<LabeledBoneKind>) -> BoneId

Creates a new Bone into the skeleton. Returns the unique id of the +Skeleton in funnybones - Rust

Struct funnybones::Skeleton

source ·
pub struct Skeleton { /* private fields */ }
Expand description

A collection of Bones. connected by Joints.

+

Implementations§

source§

impl Skeleton

source

pub fn push_bone(&mut self, bone: impl Into<LabeledBoneKind>) -> BoneId

Creates a new Bone into the skeleton. Returns the unique id of the created bone.

The first bone pushed is considered the root of the skeleton. All other bones must be connected to the root directly or indirectly through Joints.

-
source

pub fn bones(&self) -> &[Bone]

Returns the list of bones in this skeleton.

-
source

pub fn joints(&self) -> &[Joint]

Returns the list of joints in this skeleton.

-
source

pub fn connections_to(&self, axis: BoneAxis) -> Option<&[JointId]>

Returns a list of joints connected to a specific bone axis.

-
source

pub fn push_joint(&mut self, joint: Joint) -> JointId

Creates a new Joint in the skeleton, connecting two bones together +

source

pub fn bones(&self) -> &[Bone]

Returns the list of bones in this skeleton.

+
source

pub fn joints(&self) -> &[Joint]

Returns the list of joints in this skeleton.

+
source

pub fn bone(&self, id: BoneId) -> Option<&Bone>

Returns the bone for a given id, or none if not found.

+
source

pub fn bone_mut(&mut self, id: BoneId) -> Option<&mut Bone>

Returns an exclusive reference to the bone for a given id, or none if +not found.

+
source

pub fn joint(&self, id: JointId) -> Option<&Joint>

Returns the joint for a given id, or none if not found.

+
source

pub fn joint_mut(&mut self, id: JointId) -> Option<&mut Joint>

Returns an exclusive reference to the joint for a given id, or none if +not found.

+
source

pub fn connections_to(&self, axis: BoneAxis) -> Option<&[JointId]>

Returns a list of joints connected to a specific bone axis.

+
source

pub fn push_joint(&mut self, joint: Joint) -> JointId

Creates a new Joint in the skeleton, connecting two bones together by their axis. Returns the unique id of the created joint.

-
source

pub fn find_joint_by_label(&self, label: &str) -> Option<JointId>

Finds an existing Joint by its label.

-
source

pub fn find_bone_by_label(&self, label: &str) -> Option<BoneId>

Finds an existing Bone by its label.

-
source

pub fn set_translation(&mut self, translation: Coordinate)

Sets a translation to be applied to the entire skeleton.

-
source

pub fn translation(&self) -> Coordinate

Returns the translation applied to the entire skeleton.

-
source

pub fn set_rotation(&mut self, rotation: Angle)

Sets a base rotation to apply to the entire skeleton.

-
source

pub const fn rotation(&self) -> Angle

Returns the base rotation being applied to the entire skeleton.

-
source

pub fn solve(&mut self)

Updates the solved positions of all bones in this skeleton that are +

source

pub fn find_joint_by_label(&self, label: &str) -> Option<JointId>

Finds an existing Joint by its label.

+
source

pub fn find_bone_by_label(&self, label: &str) -> Option<BoneId>

Finds an existing Bone by its label.

+
source

pub fn set_translation(&mut self, translation: Coordinate)

Sets a translation to be applied to the entire skeleton.

+
source

pub fn translation(&self) -> Coordinate

Returns the translation applied to the entire skeleton.

+
source

pub fn set_rotation(&mut self, rotation: Angle)

Sets a base rotation to apply to the entire skeleton.

+
source

pub const fn rotation(&self) -> Angle

Returns the base rotation being applied to the entire skeleton.

+
source

pub fn solve(&mut self)

Updates the solved positions of all bones in this skeleton that are connected either directly or indirectly to the root bone via Joints.

-

Trait Implementations§

source§

impl Debug for Skeleton

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Default for Skeleton

source§

fn default() -> Skeleton

Returns the “default value” for a type. Read more
source§

impl<'de> Deserialize<'de> for Skeleton

source§

fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where - D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl Index<BoneId> for Skeleton

source§

type Output = Bone

The returned type after indexing.
source§

fn index(&self, index: BoneId) -> &Self::Output

Performs the indexing (container[index]) operation. Read more
source§

impl Index<JointId> for Skeleton

source§

type Output = Joint

The returned type after indexing.
source§

fn index(&self, index: JointId) -> &Self::Output

Performs the indexing (container[index]) operation. Read more
source§

impl IndexMut<BoneId> for Skeleton

source§

fn index_mut(&mut self, index: BoneId) -> &mut Self::Output

Performs the mutable indexing (container[index]) operation. Read more
source§

impl IndexMut<JointId> for Skeleton

source§

fn index_mut(&mut self, index: JointId) -> &mut Self::Output

Performs the mutable indexing (container[index]) operation. Read more
source§

impl PartialEq for Skeleton

source§

fn eq(&self, other: &Skeleton) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +

Trait Implementations§

source§

impl Debug for Skeleton

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Default for Skeleton

source§

fn default() -> Skeleton

Returns the “default value” for a type. Read more
source§

impl<'de> Deserialize<'de> for Skeleton

source§

fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where + D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl Index<BoneId> for Skeleton

source§

type Output = Bone

The returned type after indexing.
source§

fn index(&self, index: BoneId) -> &Self::Output

Performs the indexing (container[index]) operation. Read more
source§

impl Index<JointId> for Skeleton

source§

type Output = Joint

The returned type after indexing.
source§

fn index(&self, index: JointId) -> &Self::Output

Performs the indexing (container[index]) operation. Read more
source§

impl IndexMut<BoneId> for Skeleton

source§

fn index_mut(&mut self, index: BoneId) -> &mut Self::Output

Performs the mutable indexing (container[index]) operation. Read more
source§

impl IndexMut<JointId> for Skeleton

source§

fn index_mut(&mut self, index: JointId) -> &mut Self::Output

Performs the mutable indexing (container[index]) operation. Read more
source§

impl PartialEq for Skeleton

source§

fn eq(&self, other: &Skeleton) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
source§

impl Serialize for Skeleton

source§

fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where - S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl StructuralPartialEq for Skeleton

Auto Trait Implementations§

Blanket Implementations§

source§

impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for S
where + S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl StructuralPartialEq for Skeleton

Auto Trait Implementations§

Blanket Implementations§

source§

impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for S
where T: Real + Zero + Arithmetics + Clone, Swp: WhitePoint<T>, Dwp: WhitePoint<T>, @@ -45,7 +51,7 @@ further downcast into Rc<ConcreteType> where ConcreteType implements Trait.

§

fn as_any(&self) -> &(dyn Any + 'static)

Convert &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
§

impl<T> DowncastSync for T
where - T: Any + Send + Sync,

§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Sync + Send>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be + T: Any + Send + Sync,
§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T> FromAngle<T> for T

source§

fn from_angle(angle: T) -> T

Performs a conversion from angle.
source§

impl<T, U> FromStimulus<U> for T
where U: IntoStimulus<T>,

source§

fn from_stimulus(other: U) -> T

Converts other into Self, while performing the appropriate scaling, diff --git a/main/funnybones/struct.Vector.html b/main/funnybones/struct.Vector.html index 7b93ec8..70ae435 100644 --- a/main/funnybones/struct.Vector.html +++ b/main/funnybones/struct.Vector.html @@ -1,14 +1,14 @@ -Vector in funnybones - Rust

Struct funnybones::Vector

source ·
pub struct Vector {
+Vector in funnybones - Rust

Struct funnybones::Vector

source ·
pub struct Vector {
     pub magnitude: f32,
     pub direction: Angle,
 }
Expand description

A 2D Euclidean vector.

Fields§

§magnitude: f32

The length of the vector.

§direction: Angle

The direction the vector is heading.

Implementations§

source§

impl Vector

source

pub const fn new(magnitude: f32, direction: Angle) -> Self

Returns a new vector for the given magnitude and direction.

-

Trait Implementations§

source§

impl Add<Angle> for Vector

source§

type Output = Vector

The resulting type after applying the + operator.
source§

fn add(self, rhs: Angle) -> Self::Output

Performs the + operation. Read more
source§

impl Add<Vector> for Coordinate

source§

type Output = Coordinate

The resulting type after applying the + operator.
source§

fn add(self, rhs: Vector) -> Self::Output

Performs the + operation. Read more
source§

impl Clone for Vector

source§

fn clone(&self) -> Vector

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for Vector

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Default for Vector

source§

fn default() -> Vector

Returns the “default value” for a type. Read more
source§

impl<'de> Deserialize<'de> for Vector

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where - __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl From<Coordinate> for Vector

source§

fn from(pt: Coordinate) -> Self

Converts to this type from the input type.
source§

impl From<Vector> for Coordinate

source§

fn from(vec: Vector) -> Self

Converts to this type from the input type.
source§

impl LinearInterpolate for Vector

source§

fn lerp(&self, target: &Self, percent: f32) -> Self

Interpolate linearly between self and target using percent.
source§

impl PartialEq for Vector

source§

fn eq(&self, other: &Vector) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +

Trait Implementations§

source§

impl Add<Angle> for Vector

source§

type Output = Vector

The resulting type after applying the + operator.
source§

fn add(self, rhs: Angle) -> Self::Output

Performs the + operation. Read more
source§

impl Add<Vector> for Coordinate

source§

type Output = Coordinate

The resulting type after applying the + operator.
source§

fn add(self, rhs: Vector) -> Self::Output

Performs the + operation. Read more
source§

impl Add for Vector

source§

type Output = Vector

The resulting type after applying the + operator.
source§

fn add(self, rhs: Vector) -> Self::Output

Performs the + operation. Read more
source§

impl Clone for Vector

source§

fn clone(&self) -> Vector

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for Vector

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Default for Vector

source§

fn default() -> Vector

Returns the “default value” for a type. Read more
source§

impl<'de> Deserialize<'de> for Vector

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl From<Coordinate> for Vector

source§

fn from(pt: Coordinate) -> Self

Converts to this type from the input type.
source§

impl From<Vector> for Coordinate

source§

fn from(vec: Vector) -> Self

Converts to this type from the input type.
source§

impl From<Vector> for Value

source§

fn from(value: Vector) -> Self

Converts to this type from the input type.
source§

impl LinearInterpolate for Vector

source§

fn lerp(&self, target: &Self, percent: f32) -> Self

Interpolate linearly between self and target using percent.
source§

impl PartialEq for Vector

source§

fn eq(&self, other: &Vector) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
source§

impl Serialize for Vector

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where - __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Sub<Angle> for Vector

source§

type Output = Vector

The resulting type after applying the - operator.
source§

fn sub(self, rhs: Angle) -> Self::Output

Performs the - operation. Read more
source§

impl Sub<Vector> for Coordinate

source§

type Output = Coordinate

The resulting type after applying the - operator.
source§

fn sub(self, rhs: Vector) -> Self::Output

Performs the - operation. Read more
source§

impl Copy for Vector

source§

impl StructuralPartialEq for Vector

Auto Trait Implementations§

§

impl Freeze for Vector

§

impl RefUnwindSafe for Vector

§

impl Send for Vector

§

impl Sync for Vector

§

impl Unpin for Vector

§

impl UnwindSafe for Vector

Blanket Implementations§

source§

impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for S
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Sub<Angle> for Vector

source§

type Output = Vector

The resulting type after applying the - operator.
source§

fn sub(self, rhs: Angle) -> Self::Output

Performs the - operation. Read more
source§

impl Sub<Vector> for Coordinate

source§

type Output = Coordinate

The resulting type after applying the - operator.
source§

fn sub(self, rhs: Vector) -> Self::Output

Performs the - operation. Read more
source§

impl Copy for Vector

source§

impl StructuralPartialEq for Vector

Auto Trait Implementations§

§

impl Freeze for Vector

§

impl RefUnwindSafe for Vector

§

impl Send for Vector

§

impl Sync for Vector

§

impl Unpin for Vector

§

impl UnwindSafe for Vector

Blanket Implementations§

source§

impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for S
where T: Real + Zero + Arithmetics + Clone, Swp: WhitePoint<T>, Dwp: WhitePoint<T>, @@ -34,8 +34,8 @@ further downcast into Rc<ConcreteType> where ConcreteType implements Trait.

§

fn as_any(&self) -> &(dyn Any + 'static)

Convert &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
§

impl<T> DowncastSync for T
where - T: Any + Send + Sync,

§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Sync + Send>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be -further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+ T: Any + Send + Sync,
§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be +further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T> FromAngle<T> for T

source§

fn from_angle(angle: T) -> T

Performs a conversion from angle.
source§

impl<T, U> FromStimulus<U> for T
where U: IntoStimulus<T>,

source§

fn from_stimulus(other: U) -> T

Converts other into Self, while performing the appropriate scaling, rounding and clamping.
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an diff --git a/main/help.html b/main/help.html index 2c023f8..db74359 100644 --- a/main/help.html +++ b/main/help.html @@ -1 +1 @@ -Help

Rustdoc help

Back
\ No newline at end of file +Help

Rustdoc help

Back
\ No newline at end of file diff --git a/main/search-index.js b/main/search-index.js index 7bc36a3..17bf716 100644 --- a/main/search-index.js +++ b/main/search-index.js @@ -1,4 +1,4 @@ -var searchIndex = new Map(JSON.parse('[["FunnyBones",{"t":"PPFFGFONNNNHNNNNNNNNNNNNNNNNNHHHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOHNOHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN","n":["Animation","Bones","ChangeAggregator","EditingSkeleton","Mode","SkeletalBone","a_bones","adapt_into_using","","","","add_bones_to_skeleton","arrays_from","","","","arrays_into","","","","as_any","","","","as_any_mut","","","","as_bone_kind","bone_editor","bone_property_editor","bones_editor","borrow","","","","borrow_mut","","","","cam16_into_unclamped","","","","cast","","","","cast_into","","","","clone","","","","clone_into","","","","clone_to_uninit","","","","components_from","","","","connected_bones","default","","","deref","","","","deref_mut","","","","desired_end","downcast","","","","drop","","","","eq","","","equivalent","","","find_bone","find_bone_in","find_joint","find_joint_in","fmt","","","","from","","","","from_angle","","","","from_cast","","","","from_stimulus","","","","init","","","","into","","","","into_angle","","","","into_any","","","","into_any_arc","","","","into_any_rc","","","","into_cam16_unclamped","","","","into_color","","","","into_color_unclamped","","","","into_components","into_read_only","","","","into_stimulus","","","","into_value","","","","","","","","inverse","joint_angle","joint_label","jointed","label","length","main","new","root","skeleton_editor","to_owned","","","","try_components_into","","","","try_from","","","","try_into","","","","try_into_color","","","","type_id","","","","uints_from","","","","uints_into","","","","upcast","","","","watch"],"q":[[0,"FunnyBones"],[219,"palette::chromatic_adaptation"],[220,"funnybones"],[221,"alloc::vec"],[222,"cushy::value"],[223,"core::any"],[224,"cushy::widget"],[225,"palette::cam16::parameters"],[226,"intentional::cast"],[227,"core::option"],[228,"core::ops::control_flow"],[229,"core::fmt"],[230,"alloc::boxed"],[231,"alloc::sync"],[232,"alloc::rc"],[233,"cushy"],[234,"core::cmp"],[235,"core::marker"],[236,"core::ops::function"],[237,"core::result"],[238,"palette::convert::try_from_into_color"]],"i":"Bd0````Bf1Ah1f`31203120312031200```31203120312031203120312031203120312003203120312003120312032033322223120312031203120312031203120312031203120312031203120312033120312033112200000000`12`3120312031203120312031203120312031201","f":"```````{eg{}{{b{c}}}{}}000{{d{l{{j{{h{f}}}}}}{l{nA`}}}Ab}{ce{}{}}000{{}c{}}000{l{{l{Ad}}}}000{{{l{n}}}{{l{nAd}}}}000{{{l{f}}}Af}{{f{l{Ah}}}{{`{Aj}}}}{{f{l{Ah}}Al}{{`{Aj}}}}{{{l{An}}{l{{j{{h{f}}}}}}{l{Ah}}}{{`{Aj}}}}{l{{l{c}}}{}}000{{{l{n}}}{{l{nc}}}{}}000{{{B`{c}}}e{}{}}000{{}e{}{{Bb{c}}}}000::::{{{l{Bd}}}Bd}{{{l{Ah}}}Ah}{{{l{Bf}}}Bf}{{{l{f}}}f}{{l{l{nc}}}Ab{}}000{lAb}000{ce{}{}}000`{{}Bd}{{}Bf}{{}f}{Bh{{l{c}}}{}}000{Bh{{l{nc}}}{}}000`????{BhAb}000{{{l{Bd}}{l{Bd}}}Al}{{{l{Bf}}{l{Bf}}}Al}{{{l{f}}{l{f}}}Al}{{l{l{c}}}Al{}}00{{{l{Bf}}Bj}{{Bl{f}}}}{{{l{{j{{h{f}}}}}}Bh}{{Bn{fBh}}}}{{{l{Bf}}C`}{{Bl{f}}}}1{{{l{Bd}}{l{nCb}}}Cd}{{{l{Ah}}{l{nCb}}}Cd}{{{l{Bf}}{l{nCb}}}Cd}{{{l{f}}{l{nCb}}}Cd}{cc{}}00000000000{ce{}{}}000{{}Bh}000{{}c{}}0000000{{{Cf{c}}}{{Cf{Ad}}}{}}000{{{Ch{c}}}{{Ch{Ad}}}{}}000{{{Cj{c}}}{{Cj{Ad}}}{}}000{{{B`{c}}}e{}{}}00044444444{{}{{Cl{cc}}}{}}{{}{{Cn{c}}}{}}0006666{{}{{D`{c}}}{}}{{}{{D`{{Bl{c}}}}}{}}100110``````{{}Db}{e{{Cl{Ah{j{c}}}}}{DdDf}{{Dj{}{{Dh{c}}}}Df}}`{{{l{Bf}}{l{Ah}}}{{`{Aj}}}}{lc{}}000{{}{{Dl{c}}}{}}000{c{{Dl{e}}}{}{}}0001111{{}{{Dl{c{Dn{c}}}}}{}}000{lE`}000{ce{}{}}000{{}c{}}000{l{{Bl{{l{c}}}}}{}}000{{{l{Ah}}{l{{j{c}}}}}AbDf}","D":"Ab","p":[[10,"TransformMatrix",219],[5,"BoneAxis",220],[5,"SkeletalBone",0],[5,"Vec",221],[5,"Dynamic",222],[1,"reference"],[0,"mut"],[5,"Skeleton",220],[1,"unit"],[10,"Any",223],[5,"LabeledBoneKind",220],[5,"ChangeAggregator",0],[10,"MakeWidget",224],[1,"bool"],[1,"str"],[5,"BakedParameters",225],[10,"CastFrom",226],[6,"Mode",0],[5,"EditingSkeleton",0],[1,"usize"],[5,"BoneId",220],[6,"Option",227],[6,"ControlFlow",228],[5,"JointId",220],[5,"Formatter",229],[8,"Result",229],[5,"Box",230],[5,"Arc",231],[5,"Rc",232],[1,"tuple"],[6,"ReadOnly",222],[6,"Value",222],[8,"Result",233],[10,"PartialEq",234],[10,"Send",235],[17,"Output"],[10,"FnMut",236],[6,"Result",237],[5,"OutOfBounds",238],[5,"TypeId",223]],"r":[],"b":[],"c":"OjAAAAAAAAA=","e":"OzAAAAEAANIAAwABAGYAbAAPAIAAWwA="}],["funnybones",{"t":"PFPFFGFGFFFPFTTPFFNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNONNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOFPFGFPFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOCPPPPFGGNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOO","n":["A","Angle","B","Bone","BoneAxis","BoneEnd","BoneId","BoneKind","Coordinate","Joint","JointId","Jointed","LabeledBoneKind","MAX","MIN","Rigid","Skeleton","Vector","adapt_into_using","","","","","","","","","","","","add","","","","add_assign","angle","animation","arrays_from","","","","","","","","","","","","arrays_into","","","","","","","","","","","","as_any","","","","","","","","","","","","as_any_mut","","","","","","","","","","","","as_rotation","axis_a","axis_b","bone","bones","borrow","","","","","","","","","","","","borrow_mut","","","","","","","","","","","","cam16_into_unclamped","","","","","","","","","","","","cast","","","","","","","","","","","","cast_into","","","","","","","","","","","","clone","","","","","","","","clone_into","","","","","","","","clone_to_uninit","","","","","","","","cmp","","compare","","","","components_from","","","","","","","","","","","","connections_to","cos","cushy","default","","","","degrees","deref","","","","","","","","","","","","deref_mut","","","","","","","","","","","","deserialize","","","","","","","","","desired_end","direction","div","downcast","","","","","","","","","","","","drop","","","","","","","","","","","","end","","entry_angle","eq","","","","","","","","","","","equivalent","","","","","","","","","","","","final_vector","find_bone_by_label","find_joint_by_label","fmt","","","","","","","","","","","","","from","","","","","","","","","","","","","","","from_angle","","","","","","","","","","","","from_cast","","","","","","","","","","","","from_components","from_parts","from_stimulus","","","","","","","","","","","","full_length","hash","","","","id","","index","","","","index_mut","","init","","","","","","","","","","","","into","","","","","","","","","","","","into_angle","","","","","","","","","","","","into_any","","","","","","","","","","","","into_any_arc","","","","","","","","","","","","into_any_rc","","","","","","","","","","","","into_cam16_unclamped","","","","","","","","","","","","into_color","","","","","","","","","","","","into_color_unclamped","","","","","","","","","","","","into_components","","","","","","","","","into_parts","into_read_only","","","","","","","","","","","","into_stimulus","","","","","","","","","","","","into_value","","","","","","","","","","","","","","","","","","","","","","","","inverse","","is_root","joints","kind","","label","","","lerp","","magnitude","","map","mul","neg","new","","","other_axis","partial_cmp","","","percent_between","push_bone","push_joint","radians","rotation","serialize","","","","","","","","","","","set_angle","set_desired_end","set_rotation","set_translation","sin","solve","solved_joint","start","sub","","","","sub_assign","to_degrees","to_owned","","","","","","","","to_progress","to_radians","to_smolstr","to_string","translation","try_components_into","","","","","","","","","","","","try_from","","","","","","","","","","","","try_into","","","","","","","","","","","","try_into_color","","","","","","","","","","","","type_id","","","","","","","","","","","","uints_from","","","","","","","","","","","","uints_into","","","","","","","","","","","","upcast","","","","","","","","","","","","vector_to","with_label","","x","y","end_length","inverse","length","start_length","Animation","Bone","Change","ChangeKind","Frame","Joint","RunningAnimation","adapt_into_using","","","","","arrays_from","","","","","arrays_into","","","","","as_any","","","","","as_any_mut","","","","","borrow","","","","","borrow_mut","","","","","cam16_into_unclamped","","","","","cast","","","","","cast_into","","","","","clone","","","","clone_into","","","","clone_to_uninit","","","","components_from","","","","","default","deref","","","","","","","deref_mut","","","","","","","deserialize","","","downcast","","","","","drop","","","","","duration","eq","","","","fmt","","","","from","","","","","","from_angle","","","","","from_cast","","","","","from_stimulus","","","","","init","","","","","insert","into","","","","","into_angle","","","","","into_any","","","","","into_any_arc","","","","","into_any_rc","","","","","into_cam16_unclamped","","","","","into_color","","","","","into_color_unclamped","","","","","into_components","","into_read_only","","","","","into_stimulus","","","","","into_value","","","","","","","","","","looping","new","push","push_change","remove","serialize","","","set_duration","set_variable","start","to_owned","","","","try_components_into","","","","","try_from","","","","","try_into","","","","","try_into_color","","","","","type_id","","","","","uints_from","","","","","uints_into","","","","","upcast","","","","","update","variable","with","with_change","with_easing","with_variable","bone","joint","position","rotation","skeleton_canvas","DesiredEnd","Joint","SetDesiredEnd","SetJointRotation","SkeletonCanvas","SkeletonMutation","Target","adapt_into_using","","","arrays_from","","","arrays_into","","","as_any","","","as_any_mut","","","borrow","","","borrow_mut","","","cam16_into_unclamped","","","cast","","","cast_into","","","clone","","clone_into","","clone_to_uninit","","components_from","","","deref","","","deref_mut","","","downcast","","","drop","","","eq","","equivalent","","","fmt","","","from","","","from_angle","","","from_cast","","","from_stimulus","","","hit_test","hover","init","","","into","","","into_angle","","","into_any","","","into_any_arc","","into_any_rc","","","into_cam16_unclamped","","","into_color","","","into_color_unclamped","","","into_components","","into_read_only","","","into_stimulus","","","into_value","","","","","","layout","make_widget","make_with_tag","maximum_scale","minimum_scale","mouse_down","mouse_drag","mouse_up","mouse_wheel","new","on_mutate","open","redraw","run","run_in","scale","to_owned","","try_components_into","","","try_from","","","try_into","","","try_into_color","","","type_id","","","uints_from","","","uints_into","","","unhover","upcast","","","bone","end","joint","rotation"],"q":[[0,"funnybones"],[701,"funnybones::BoneKind"],[705,"funnybones::animation"],[966,"funnybones::animation::ChangeKind"],[970,"funnybones::cushy"],[971,"funnybones::cushy::skeleton_canvas"],[1134,"funnybones::cushy::skeleton_canvas::SkeletonMutation"],[1138,"palette::chromatic_adaptation"],[1139,"core::any"],[1140,"palette::cam16::parameters"],[1141,"intentional::cast"],[1142,"core::cmp"],[1143,"core::option"],[1144,"core::result"],[1145,"serde::de"],[1146,"core::fmt"],[1147,"cushy::context"],[1148,"core::hash"],[1149,"alloc::boxed"],[1150,"alloc::sync"],[1151,"alloc::rc"],[1152,"cushy::value"],[1153,"core::ops::function"],[1154,"cushy::animation"],[1155,"core::convert"],[1156,"serde::ser"],[1157,"core::ops::range"],[1158,"cushy::widgets::progress"],[1159,"smol_str"],[1160,"alloc::string"],[1161,"palette::convert::try_from_into_color"],[1162,"core::time"],[1163,"alloc::borrow"],[1164,"easing_function::easings"],[1165,"figures::units"],[1166,"figures::point"],[1167,"cursor_icon"],[1168,"cushy"],[1169,"figures::size"],[1170,"cushy::widget"],[1171,"cushy::window"],[1172,"winit::event"],[1173,"core::marker"],[1174,"winit::error"],[1175,"cushy::app"]],"i":"Bf`0````````Bb`h01``D`d2f4AhAfAjA`AdBd;779692`8796:543210;8796:543210;8796:543210;8796:543210;711458796:543210;8796:543210;8796:543210;8796:543210;8796:543210;796:410;796:410;796:410;1011008796:543210;59`796598796:543210;8796:543210;796:5410;3678796:543210;8796:543210;343796:543210;444111000;;;35579996:543210;8877966:543210;8796:543210;8796:543210;798796:543210;:410;325510558796:543210;8796:543210;8796:543210;8796:543210;8796:543210;8796:543210;8796:543210;8796:543210;8796:543210;7796:410;98796:543210;8796:543210;88779966::554433221100;;4;35383289676779762291095595796:543210;23559533779699796:410;999958796:543210;8796:543210;8796:543210;8796:543210;8796:543210;8796:543210;8796:543210;8796:543210;7:277Jj0Jl1`Fl```0`G`FfFhFj4321043210432104321043210432104321043210432104210421042104321042322110432211041043210432104121042104321004321043210432104321042321043210432104321043210432104321043210404321043210433221100443121210412221043210432104321043210432104321043210432104322142JnK`10`Gf0Gh0```Gj21021021021021021021021021021212121021021021021021212220210210210210210002102102102121021021021021210210210022110000000000000000210210210210210210210210021Kb0Kd0","f":"``````````````````{eg{}{{b{c}}}{}}00000000000{{df}c{}}{{dd}c{}}{{hh}c{}}{{fh}c{}}{{{l{jh}}h}n}{{{l{A`}}}h}`{ce{}{}}00000000000{{}c{}}00000000000{l{{l{Ab}}}}00000000000{{{l{j}}}{{l{jAb}}}}00000000000{dh}{AdAf}0`{{{l{Ah}}}{{l{{Al{Aj}}}}}}{l{{l{c}}}{}}00000000000{{{l{j}}}{{l{jc}}}{}}00000000000{{{An{c}}}e{}{}}00000000000{{}e{}{{B`{c}}}}00000000000999999999999{{{l{d}}}d}{{{l{h}}}h}{{{l{f}}}f}{{{l{Bb}}}Bb}{{{l{Af}}}Af}{{{l{Ad}}}Ad}{{{l{Bd}}}Bd}{{{l{Bf}}}Bf}{{l{l{jc}}}n{}}0000000{ln}0000000{{{l{Ad}}{l{Ad}}}Bh}{{{l{Bd}}{l{Bd}}}Bh}{{l{l{c}}}Bh{}}000{ce{}{}}00000000000{{{l{Ah}}Af}{{Bj{{l{{Al{Bd}}}}}}}}{hBl}`{{}d}{{}h}{{}f}{{}Ah}{Blh}{Bn{{l{c}}}{}}00000000000{Bn{{l{jc}}}{}}00000000000{c{{C`{d}}}Cb}{c{{C`{h}}}Cb}{c{{C`{f}}}Cb}{c{{C`{Bb}}}Cb}{c{{C`{Ah}}}Cb}{c{{C`{Af}}}Cb}{c{{C`{Ad}}}Cb}{c{{C`{Bd}}}Cb}{c{{C`{Bf}}}Cb}{{{l{Aj}}}{{Bj{f}}}}`{{dBl}c{}}{l{{l{c}}}{}}00000000000{Bnn}00000000000{{{l{Aj}}}d}`{{{l{Aj}}}h}{{{l{d}}{l{d}}}Cd}{{{l{h}}{l{h}}}Cd}{{{l{f}}{l{f}}}Cd}{{{l{Bb}}{l{Bb}}}Cd}{{{l{Ah}}{l{Ah}}}Cd}{{{l{Af}}{l{Af}}}Cd}{{{l{Aj}}{l{Aj}}}Cd}{{{l{A`}}{l{A`}}}Cd}{{{l{Ad}}{l{Ad}}}Cd}{{{l{Bd}}{l{Bd}}}Cd}{{{l{Bf}}{l{Bf}}}Cd}{{l{l{c}}}Cd{}}00000000000{{{l{Aj}}}f}{{{l{Ah}}{l{Cf}}}{{Bj{Ad}}}}{{{l{Ah}}{l{Cf}}}{{Bj{Bd}}}}{{{l{d}}{l{jCh}}}Cj}{{{l{h}}{l{jCh}}}Cj}0{{l{l{Cl}}{l{jCh}}}{{C`{nCn}}}}{{{l{f}}{l{jCh}}}Cj}{{{l{Bb}}{l{jCh}}}Cj}{{{l{Ah}}{l{jCh}}}Cj}{{{l{Af}}{l{jCh}}}Cj}{{{l{Aj}}{l{jCh}}}Cj}{{{l{A`}}{l{jCh}}}Cj}{{{l{Ad}}{l{jCh}}}Cj}{{{l{Bd}}{l{jCh}}}Cj}{{{l{Bf}}{l{jCh}}}Cj}{BbD`}{cc{}}{fd}11{df}222222222222222222222222222222222{{{Db{BlBl}}}d}{Bjc{}}{ce{}{}}00000000000{{{l{Bb}}}Bl}{{{l{Af}}{l{jc}}}nDd}{{{l{Ad}}{l{jc}}}nDd}{{{l{Bd}}{l{jc}}}nDd}{{{l{Bf}}{l{jc}}}nDd}{{{l{Aj}}}Ad}{{{l{A`}}}Bd}{{{l{Ah}}Ad}{{l{c}}}{}}{{{l{Ah}}Bd}{{l{c}}}{}}{AdBn}{BdBn}{{{l{jAh}}Bd}{{l{jc}}}{}}{{{l{jAh}}Ad}{{l{jc}}}{}}{{}Bn}00000000000{{}c{}}00000000000000000000000{{{Df{c}}}{{Df{Ab}}}{}}00000000000{{{Dh{c}}}{{Dh{Ab}}}{}}00000000000{{{Dj{c}}}{{Dj{Ab}}}{}}00000000000{{{An{c}}}e{}{}}00000000000444444444444444444444444{d{{Db{BlBl}}}}{{}{{Db{cc}}}{}}0000000{{}{{Db{Bj}}}}{{}{{Dl{c}}}{}}00000000000888888888888{{}{{Dn{c}}}{}}{{}{{Dn{{Bj{c}}}}}{}}1010011001101001100110{AfAf}{BfBf}{{{l{Aj}}}Cd}{{{l{Ah}}}{{l{{Al{A`}}}}}}{{{l{Aj}}}{{l{Bb}}}}`{{{l{Aj}}}{{l{Cf}}}}{{{l{A`}}}{{l{Cf}}}}`{{{l{h}}{l{h}}Bl}h}{{{l{f}}{l{f}}Bl}f}{{{l{d}}}Bl}`{{dc}d{{Eb{Bl}{{E`{Bl}}}}}}{{dBl}c{}}{hc{}}{{BlBl}d}{{Blh}f}{{hAfAf}A`}{{{l{A`}}Af}Af}{{{l{h}}{l{h}}}{{Bj{Bh}}}}{{{l{Ad}}{l{Ad}}}{{Bj{Bh}}}}{{{l{Bd}}{l{Bd}}}{{Bj{Bh}}}}{{{l{h}}{l{h}}{l{h}}}Ed}{{{l{jAh}}c}Ad{{Ef{D`}}}}{{{l{jAh}}A`}Bd}{Blh}{{{l{Ah}}}h}{{{l{d}}c}C`Eh}{{{l{h}}c}C`Eh}{{{l{f}}c}C`Eh}{{{l{Bb}}c}C`Eh}{{{l{Ah}}c}C`Eh}{{{l{Af}}c}C`Eh}{{{l{Aj}}c}C`Eh}{{{l{A`}}c}C`Eh}{{{l{Ad}}c}C`Eh}{{{l{Bd}}c}C`Eh}{{{l{Bf}}c}C`Eh}{{{l{jA`}}h}n}{{{l{jAj}}{Bj{f}}}n}{{{l{jAh}}h}n}{{{l{jAh}}d}n}{hBl}{{{l{jAh}}}n}{{{l{Aj}}}{{Bj{d}}}}{{{l{Aj}}}d}{{dd}c{}}{{df}c{}}{{hh}c{}}{{fh}c{}}{{{l{jh}}h}n}8{lc{}}0000000{{l{Bj{{Ej{l}}}}}El}:{lEn}{lF`}{{{l{Ah}}}d}{{}{{C`{c}}}{}}00000000000{c{{C`{e}}}{}{}}00000000000111111111111{{}{{C`{c{Fb{c}}}}}{}}00000000000{lFd}00000000000{ce{}{}}00000000000{{}c{}}00000000000{l{{Bj{{l{c}}}}}{}}00000000000{{dd}f}{{Bbc}D`{{Ef{F`}}}}{{A`c}A`{{Ef{F`}}}}`````````````{eg{}{{b{c}}}{}}00006666655555{l{{l{Ab}}}}0000{{{l{j}}}{{l{jAb}}}}0000{l{{l{c}}}{}}0000{{{l{j}}}{{l{jc}}}{}}0000{{{An{c}}}e{}{}}0000{{}e{}{{B`{c}}}}0000;;;;;{{{l{Ff}}}Ff}{{{l{Fh}}}Fh}{{{l{Fj}}}Fj}{{{l{Fl}}}Fl}{{l{l{jc}}}n{}}000{ln}000{ce{}{}}0000{{}Ff}{Bn{{l{c}}}{}}0{{{l{Ff}}}{{l{c}}}{}}1{{{l{Fh}}}{{l{c}}}{}}22{Bn{{l{jc}}}{}}{{{l{jFf}}}{{l{jc}}}{}}1{{{l{jFh}}}{{l{jc}}}{}}222{c{{C`{Fh}}}Cb}{c{{C`{Fj}}}Cb}{c{{C`{Fl}}}Cb}{l{{l{c}}}{}}0000{Bnn}0000{{{l{Fh}}}Fn}{{{l{Ff}}{l{Ff}}}Cd}{{{l{Fh}}{l{Fh}}}Cd}{{{l{Fj}}{l{Fj}}}Cd}{{{l{Fl}}{l{Fl}}}Cd}{{{l{Ff}}{l{jCh}}}Cj}{{{l{Fh}}{l{jCh}}}Cj}{{{l{Fj}}{l{jCh}}}Cj}{{{l{Fl}}{l{jCh}}}Cj}{cc{}}000{FlFj}11111111111{ce{}{}}0000{{}Bn}0000{{{l{jFf}}BnFh}n}{{}c{}}000000000{{{Df{c}}}{{Df{Ab}}}{}}0000{{{Dh{c}}}{{Dh{Ab}}}{}}0000{{{Dj{c}}}{{Dj{Ab}}}{}}0000{{{An{c}}}e{}{}}00004444444444{{}{{Db{cc}}}{}}0{{}{{Dl{c}}}{}}000066666{{}{{Dn{{Bj{c}}}}}{}}{{}{{Dn{c}}}{}}01010110{G`G`}{FnFh}{{{l{jFf}}Fh}n}{{{l{jFh}}c}n{{Ef{Fj}}}}{{{l{jFf}}Bn}Fh}{{{l{Fh}}c}C`Eh}{{{l{Fj}}c}C`Eh}{{{l{Fl}}c}C`Eh}{{{l{jFh}}Fn}n}{{{l{jFf}}cBl}n{{Ef{{Gb{Cf}}}}}}{{{l{Ff}}}G`}{lc{}}000{{}{{C`{c}}}{}}0000{c{{C`{e}}}{}{}}000011111{{}{{C`{c{Fb{c}}}}}{}}0000{lFd}0000{ce{}{}}0000{{}c{}}0000{l{{Bj{{l{c}}}}}{}}0000{{{l{jG`}}Fn{l{jAh}}}Cd}{{{l{Ff}}{l{Cf}}}{{Bj{Bl}}}}{{FfFh}Ff}{{Fhc}Fh{{Ef{Fj}}}}{{FlGd}Fj}{{FfcBl}Ff{{Ef{F`}}}}````````````{eg{}{{b{c}}}{}}00999888{l{{l{Ab}}}}00{{{l{j}}}{{l{jAb}}}}00{l{{l{c}}}{}}00{{{l{j}}}{{l{jc}}}{}}00{{{An{c}}}e{}{}}00{{}e{}{{B`{c}}}}00>>>{{{l{Gf}}}Gf}{{{l{Gh}}}Gh}{{l{l{jc}}}n{}}0{ln}0{ce{}{}}00{Bn{{l{c}}}{}}00{Bn{{l{jc}}}{}}00:::{Bnn}00{{{l{Gf}}{l{Gf}}}Cd}{{{l{Gh}}{l{Gh}}}Cd}{{l{l{c}}}Cd{}}00{{{l{Gj}}{l{jCh}}}Cj}{{{l{Gf}}{l{jCh}}}Cj}{{{l{Gh}}{l{jCh}}}Cj}{cc{}}00000000:::{{{l{jGj}}{Gn{Gl}}{l{jH`}}}Cd}{{{l{jGj}}{Gn{Gl}}{l{jH`}}}{{Bj{Hb}}}}{{}Bn}00{{}c{}}00000{{{Df{c}}}{{Df{Ab}}}{}}00{{{Dh{c}}}{{Dh{Ab}}}{}}0{{{Dj{c}}}{{Dj{Ab}}}{}}00{{{An{c}}}e{}{}}00444444{{}{{Db{cc}}}{}}0{{}{{Dl{c}}}{}}00666{{}{{Dn{c}}}{}}{{}{{Dn{{Bj{c}}}}}{}}0110{{{l{jGj}}{Hf{Hd}}{l{jHh}}}{{Hf{Hj}}}}{{}Hl}{HnHl}{{{l{Gj}}}{{l{{I`{Bl}}}}}}0{{{l{jGj}}{Gn{Gl}}IbId{l{jH`}}}If}{{{l{jGj}}{Gn{Gl}}IbId{l{jH`}}}n}{{{l{jGj}}{Bj{{Gn{Gl}}}}IbId{l{jH`}}}n}{{{l{jGj}}IbIhIj{l{jH`}}}If}{{{I`{Ah}}}Gj}{{Gjc}Gj{{Eb{Gh}}Il}}{{{l{jc}}}{{C`{{Bj{In}}J`}}}{JbJd}}{{{l{jGj}}{l{jJf}}}n}{{}{{C`{nJ`}}}}{Jh{{C`{nJ`}}}}:{lc{}}0{{}{{C`{c}}}{}}00{c{{C`{e}}}{}{}}00111{{}{{C`{c{Fb{c}}}}}{}}00{lFd}00{ce{}{}}00{{}c{}}00{{{l{jGj}}{l{jH`}}}n}{l{{Bj{{l{c}}}}}{}}00````","D":"Od","p":[[10,"TransformMatrix",1138],[5,"Coordinate",0],[5,"Vector",0],[5,"Angle",0],[0,"mut"],[1,"reference"],[1,"unit"],[5,"Joint",0],[10,"Any",1139],[5,"BoneId",0],[5,"BoneAxis",0],[5,"Skeleton",0],[5,"Bone",0],[1,"slice"],[5,"BakedParameters",1140],[10,"CastFrom",1141],[6,"BoneKind",0],[5,"JointId",0],[6,"BoneEnd",0],[6,"Ordering",1142],[6,"Option",1143],[1,"f32"],[1,"usize"],[6,"Result",1144],[10,"Deserializer",1145],[1,"bool"],[1,"str"],[5,"Formatter",1146],[8,"Result",1146],[5,"WidgetContext",1147],[5,"Error",1146],[5,"LabeledBoneKind",0],[1,"tuple"],[10,"Hasher",1148],[5,"Box",1149],[5,"Arc",1150],[5,"Rc",1151],[6,"ReadOnly",1152],[6,"Value",1152],[17,"Output"],[10,"FnMut",1153],[5,"ZeroToOne",1154],[10,"Into",1155],[10,"Serializer",1156],[5,"RangeInclusive",1157],[6,"Progress",1158],[5,"SmolStr",1159],[5,"String",1160],[5,"OutOfBounds",1161],[5,"TypeId",1139],[5,"Animation",705],[5,"Frame",705],[5,"Change",705],[6,"ChangeKind",705],[5,"Duration",1162],[5,"RunningAnimation",705],[6,"Cow",1163],[6,"StandardEasing",1164],[6,"Target",971],[6,"SkeletonMutation",971],[5,"SkeletonCanvas",971],[5,"Px",1165],[5,"Point",1166],[5,"EventContext",1147],[6,"CursorIcon",1167],[6,"ConstraintLimit",1168],[5,"Size",1169],[5,"LayoutContext",1147],[5,"UPx",1165],[5,"WidgetInstance",1170],[5,"WidgetTag",1170],[5,"Dynamic",1152],[6,"DeviceId",1171],[6,"MouseButton",1172],[8,"EventHandling",1170],[6,"MouseScrollDelta",1172],[6,"TouchPhase",1172],[10,"Send",1173],[5,"WindowHandle",1171],[6,"EventLoopError",1174],[10,"Application",1175],[10,"Sized",1173],[5,"GraphicsContext",1147],[5,"PendingApp",1175],[15,"Jointed",701],[15,"Rigid",701],[15,"Bone",966],[15,"Joint",966],[15,"SetDesiredEnd",1134],[15,"SetJointRotation",1134]],"r":[],"b":[[30,"impl-Add%3CVector%3E-for-Coordinate"],[31,"impl-Add-for-Coordinate"],[290,"impl-Debug-for-Angle"],[291,"impl-Display-for-Angle"],[362,"impl-Index%3CBoneId%3E-for-Skeleton"],[363,"impl-Index%3CJointId%3E-for-Skeleton"],[366,"impl-IndexMut%3CJointId%3E-for-Skeleton"],[367,"impl-IndexMut%3CBoneId%3E-for-Skeleton"],[581,"impl-Sub-for-Coordinate"],[582,"impl-Sub%3CVector%3E-for-Coordinate"]],"c":"OjAAAAAAAAA=","e":"OzAAAAEAAPgDHQATABAAJQAwAFsAZQDEAAMAyQAgAOwAGAAIARYAIgENADEBAAA0AQAAPgElAGUBAwBrAQEAbwENAIkBjQAgAgEAJQIBACsCAwAzAgoARgIEAEwCCABWAgEAWQJfAMICbgA1AwAANwMUAFEDvAARBA0AIgRQAA=="}]]')); +var searchIndex = new Map(JSON.parse('[["FunnyBones",{"t":"PPFFGFONNNNHNNNNNNNNNNNNNNNNNHHHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOHNOHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN","n":["Animation","Bones","ChangeAggregator","EditingSkeleton","Mode","SkeletalBone","a_bones","adapt_into_using","","","","add_bones_to_skeleton","arrays_from","","","","arrays_into","","","","as_any","","","","as_any_mut","","","","as_bone_kind","bone_editor","bone_property_editor","bones_editor","borrow","","","","borrow_mut","","","","cam16_into_unclamped","","","","cast","","","","cast_into","","","","clone","","","","clone_into","","","","clone_to_uninit","","","","components_from","","","","connected_bones","default","","","deref","","","","deref_mut","","","","desired_end","downcast","","","","drop","","","","eq","","","equivalent","","","find_bone","find_bone_in","find_joint","find_joint_in","fmt","","","","from","","","","from_angle","","","","from_cast","","","","from_stimulus","","","","init","","","","into","","","","into_angle","","","","into_any","","","","into_any_arc","","","","into_any_rc","","","","into_cam16_unclamped","","","","into_color","","","","into_color_unclamped","","","","into_components","into_read_only","","","","into_stimulus","","","","into_value","","","","","","","","inverse","joint_angle","joint_label","jointed","label","length","main","new","root","skeleton_editor","to_owned","","","","try_components_into","","","","try_from","","","","try_into","","","","try_into_color","","","","type_id","","","","uints_from","","","","uints_into","","","","upcast","","","","watch"],"q":[[0,"FunnyBones"],[219,"palette::chromatic_adaptation"],[220,"funnybones"],[221,"alloc::vec"],[222,"cushy::value"],[223,"core::any"],[224,"cushy::widget"],[225,"palette::cam16::parameters"],[226,"intentional::cast"],[227,"core::option"],[228,"core::ops::control_flow"],[229,"core::fmt"],[230,"alloc::boxed"],[231,"alloc::sync"],[232,"alloc::rc"],[233,"cushy"],[234,"core::cmp"],[235,"core::marker"],[236,"core::ops::function"],[237,"core::result"],[238,"palette::convert::try_from_into_color"]],"i":"Bd0````Bf1Ah1f`31203120312031200```31203120312031203120312031203120312003203120312003120312032033322223120312031203120312031203120312031203120312031203120312033120312033112200000000`12`3120312031203120312031203120312031201","f":"```````{eg{}{{b{c}}}{}}000{{d{l{{j{{h{f}}}}}}{l{nA`}}}Ab}{ce{}{}}000{{}c{}}000{l{{l{Ad}}}}000{{{l{n}}}{{l{nAd}}}}000{{{l{f}}}Af}{{f{l{Ah}}}{{`{Aj}}}}{{f{l{Ah}}Al}{{`{Aj}}}}{{{l{An}}{l{{j{{h{f}}}}}}{l{Ah}}}{{`{Aj}}}}{l{{l{c}}}{}}000{{{l{n}}}{{l{nc}}}{}}000{{{B`{c}}}e{}{}}000{{}e{}{{Bb{c}}}}000::::{{{l{Bd}}}Bd}{{{l{Ah}}}Ah}{{{l{Bf}}}Bf}{{{l{f}}}f}{{l{l{nc}}}Ab{}}000{lAb}000{ce{}{}}000`{{}Bd}{{}Bf}{{}f}{Bh{{l{c}}}{}}000{Bh{{l{nc}}}{}}000`????{BhAb}000{{{l{Bd}}{l{Bd}}}Al}{{{l{Bf}}{l{Bf}}}Al}{{{l{f}}{l{f}}}Al}{{l{l{c}}}Al{}}00{{{l{Bf}}Bj}{{Bl{f}}}}{{{l{{j{{h{f}}}}}}Bh}{{Bn{fBh}}}}{{{l{Bf}}C`}{{Bl{f}}}}1{{{l{Bd}}{l{nCb}}}Cd}{{{l{Ah}}{l{nCb}}}Cd}{{{l{Bf}}{l{nCb}}}Cd}{{{l{f}}{l{nCb}}}Cd}{cc{}}00000000000{ce{}{}}000{{}Bh}000{{}c{}}0000000{{{Cf{c}}}{{Cf{Ad}}}{}}000{{{Ch{c}}}{{Ch{Ad}}}{}}000{{{Cj{c}}}{{Cj{Ad}}}{}}000{{{B`{c}}}e{}{}}00044444444{{}{{Cl{cc}}}{}}{{}{{Cn{c}}}{}}0006666{{}{{D`{c}}}{}}{{}{{D`{{Bl{c}}}}}{}}100110``````{{}Db}{e{{Cl{Ah{j{c}}}}}{DdDf}{{Dj{}{{Dh{c}}}}Df}}`{{{l{Bf}}{l{Ah}}}{{`{Aj}}}}{lc{}}000{{}{{Dl{c}}}{}}000{c{{Dl{e}}}{}{}}0001111{{}{{Dl{c{Dn{c}}}}}{}}000{lE`}000{ce{}{}}000{{}c{}}000{l{{Bl{{l{c}}}}}{}}000{{{l{Ah}}{l{{j{c}}}}}AbDf}","D":"Ab","p":[[10,"TransformMatrix",219],[5,"BoneAxis",220],[5,"SkeletalBone",0],[5,"Vec",221],[5,"Dynamic",222],[1,"reference"],[0,"mut"],[5,"Skeleton",220],[1,"unit"],[10,"Any",223],[5,"LabeledBoneKind",220],[5,"ChangeAggregator",0],[10,"MakeWidget",224],[1,"bool"],[1,"str"],[5,"BakedParameters",225],[10,"CastFrom",226],[6,"Mode",0],[5,"EditingSkeleton",0],[1,"usize"],[5,"BoneId",220],[6,"Option",227],[6,"ControlFlow",228],[5,"JointId",220],[5,"Formatter",229],[8,"Result",229],[5,"Box",230],[5,"Arc",231],[5,"Rc",232],[1,"tuple"],[6,"ReadOnly",222],[6,"Value",222],[8,"Result",233],[10,"PartialEq",234],[10,"Send",235],[17,"Output"],[10,"FnMut",236],[6,"Result",237],[5,"OutOfBounds",238],[5,"TypeId",223]],"r":[],"b":[],"c":"OjAAAAAAAAA=","e":"OzAAAAEAANIAAwABAGYAbAAPAIAAWwA="}],["funnybones",{"t":"PFPFFGFGFFFPFTTPFFNNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNONNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOPPFPGPPFPPPGFTTPGFGPFGPTNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNOOOOCPPPPFGGNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOO","n":["A","Angle","B","Bone","BoneAxis","BoneEnd","BoneId","BoneKind","Coordinate","Joint","JointId","Jointed","LabeledBoneKind","MAX","MIN","Rigid","Skeleton","Vector","adapt_into_using","","","","","","","","","","","","add","","","","","add_assign","angle","animation","arrays_from","","","","","","","","","","","","arrays_into","","","","","","","","","","","","as_any","","","","","","","","","","","","as_any_mut","","","","","","","","","","","","as_rotation","axis_a","axis_b","bone","","bone_mut","bones","borrow","","","","","","","","","","","","borrow_mut","","","","","","","","","","","","cam16_into_unclamped","","","","","","","","","","","","cast","","","","","","","","","","","","cast_into","","","","","","","","","","","","clone","","","","","","","","clone_into","","","","","","","","clone_to_uninit","","","","","","","","cmp","","compare","","","","components_from","","","","","","","","","","","","connections_to","cos","cushy","default","","","","degrees","deref","","","","","","","","","","","","deref_mut","","","","","","","","","","","","deserialize","","","","","","","","","desired_end","direction","div","downcast","","","","","","","","","","","","drop","","","","","","","","","","","","end","","entry_angle","eq","","","","","","","","","","","equivalent","","","","","","","","","","","","final_vector","find_bone_by_label","find_joint_by_label","fmt","","","","","","","","","","","","","from","","","","","","","","","","","","","","","from_angle","","","","","","","","","","","","from_cast","","","","","","","","","","","","from_components","from_parts","from_stimulus","","","","","","","","","","","","full_length","hash","","","","id","","index","","","","index_mut","","init","","","","","","","","","","","","into","","","","","","","","","","","","into_angle","","","","","","","","","","","","into_any","","","","","","","","","","","","into_any_arc","","","","","","","","","","","","into_any_rc","","","","","","","","","","","","into_cam16_unclamped","","","","","","","","","","","","into_color","","","","","","","","","","","","into_color_unclamped","","","","","","","","","","","","into_components","","","","","","","","","into_parts","into_read_only","","","","","","","","","","","","into_stimulus","","","","","","","","","","","","into_value","","","","","","","","","","","","","","","","","","","","","","","","inverse","","is_inverse","is_root","joint","joint_mut","joints","kind","","kind_mut","label","","","lerp","","magnitude","","map","mul","neg","new","","","other_axis","partial_cmp","","","percent_between","push_bone","push_joint","radians","rotation","serialize","","","","","","","","","","","set_angle","set_desired_end","set_inverse","set_rotation","set_translation","sin","solve","solved_joint","start","sub","","","","sub_assign","to_degrees","to_owned","","","","","","","","to_progress","to_radians","to_smolstr","to_string","translation","try_components_into","","","","","","","","","","","","try_from","","","","","","","","","","","","try_into","","","","","","","","","","","","try_into_color","","","","","","","","","","","","type_id","","","","","","","","","","","","uints_from","","","","","","","","","","","","uints_into","","","","","","","","","","","","upcast","","","","","","","","","","","","vector_to","with_label","","x","y","end_length","inverse","length","start_length","Add","Angle","Animation","Bone","BoneProperty","Bool","ChangeTo","Frame","Invalid","Inverse","Joint","JointProperty","Keyframe","MAX","MIN","Number","PropertyUpdate","RunningAnimation","Target","","Timeline","Value","Vector","ZERO","adapt_into_using","","","","","","","","","","add","arrays_from","","","","","","","","","","arrays_into","","","","","","","","","","as_any","","","","","","","","","","as_any_mut","","","","","","","","","","borrow","","","","","","","","","","borrow_mut","","","","","","","","","","cam16_into_unclamped","","","","","","","","","","cast","","","","","","","","","","cast_into","","","","","","","","","","clone","","","","","","","","","clone_into","","","","","","","","","clone_to_uninit","","","","","","","","","cmp","compare","","components_from","","","","","","","","","","default","","deref","","","","","","","","","","","","deref_mut","","","","","","","","","","","","deserialize","","","","","","","","downcast","","","","","","","","","","drop","","","","","","","","","","easing","eq","","","","","","","","","equivalent","","","fmt","","","","","","","","","from","","","","","","","","","","","","","","from_angle","","","","","","","","","","from_cast","","","","","","","","","","from_stimulus","","","","","","","","","","get","","","init","","","","","","","","","","insert","insert_frame","into","","","","","","","","","","into_angle","","","","","","","","","","into_any","","","","","","","","","","into_any_arc","","","","","","","","","","into_any_rc","","","","","","","","","","into_cam16_unclamped","","","","","","","","","","into_color","","","","","","","","","","into_color_unclamped","","","","","","","","","","into_components","","","","into_read_only","","","","","","","","","","into_stimulus","","","","","","","","","","into_value","","","","","","","","","","","","","","","","","","","","looping","new","","partial_cmp","push","remove","serialize","","","","","","","","set_frame_offset","set_variable","start","sub","target","to_owned","","","","","","","","","try_components_into","","","","","","","","","","try_from","","","","","","","","","","","try_into","","","","","","","","","","try_into_color","","","","","","","","","","type_id","","","","","","","","","","uints_from","","","","","","","","","","uints_into","","","","","","","","","","upcast","","","","","","","","","","update","","","","","variable","with","with_easing","with_frame","with_variable","bone","joint","property","","skeleton_canvas","DesiredEnd","Joint","SetDesiredEnd","SetJointRotation","SkeletonCanvas","SkeletonMutation","Target","adapt_into_using","","","arrays_from","","","arrays_into","","","as_any","","","as_any_mut","","","borrow","","","borrow_mut","","","cam16_into_unclamped","","","cast","","","cast_into","","","clone","","clone_into","","clone_to_uninit","","components_from","","","deref","","","deref_mut","","","downcast","","","drop","","","eq","","equivalent","","","fmt","","","from","","","from_angle","","","from_cast","","","from_stimulus","","","hit_test","hover","init","","","into","","","into_angle","","","into_any","","","into_any_arc","","into_any_rc","","","into_cam16_unclamped","","","into_color","","","into_color_unclamped","","","into_components","","into_read_only","","","into_stimulus","","","into_value","","","","","","layout","make_widget","make_with_tag","maximum_scale","minimum_scale","mouse_down","mouse_drag","mouse_up","mouse_wheel","new","on_mutate","open","redraw","run","run_in","scale","to_owned","","try_components_into","","","try_from","","","try_into","","","try_into_color","","","type_id","","","uints_from","","","uints_into","","","unhover","upcast","","","bone","end","joint","rotation"],"q":[[0,"funnybones"],[709,"funnybones::BoneKind"],[713,"funnybones::animation"],[1256,"funnybones::animation::Target"],[1260,"funnybones::cushy"],[1261,"funnybones::cushy::skeleton_canvas"],[1424,"funnybones::cushy::skeleton_canvas::SkeletonMutation"],[1428,"palette::chromatic_adaptation"],[1429,"core::any"],[1430,"core::option"],[1431,"palette::cam16::parameters"],[1432,"intentional::cast"],[1433,"core::cmp"],[1434,"core::result"],[1435,"serde::de"],[1436,"core::fmt"],[1437,"cushy::context"],[1438,"core::hash"],[1439,"alloc::boxed"],[1440,"alloc::sync"],[1441,"alloc::rc"],[1442,"cushy::value"],[1443,"core::ops::function"],[1444,"cushy::animation"],[1445,"core::convert"],[1446,"serde::ser"],[1447,"core::ops::range"],[1448,"cushy::widgets::progress"],[1449,"smol_str"],[1450,"alloc::string"],[1451,"palette::convert::try_from_into_color"],[1452,"alloc::borrow"],[1453,"core::time"],[1454,"easing_function::easings"],[1455,"figures::units"],[1456,"figures::point"],[1457,"cursor_icon"],[1458,"cushy"],[1459,"figures::size"],[1460,"cushy::widget"],[1461,"cushy::window"],[1462,"winit::event"],[1463,"core::marker"],[1464,"winit::error"],[1465,"cushy::app"]],"i":"Bh`0````````Bd`h01``D`d2f4AhAfAjA`AdBf;7796692`8796:543210;8796:543210;8796:543210;8796:543210;71154558796:543210;8796:543210;8796:543210;8796:543210;8796:543210;796:410;796:410;796:410;1011008796:543210;59`796598796:543210;8796:543210;796:5410;3678796:543210;8796:543210;343796:543210;444111000;;;35579996:543210;8877966:543210;8796:543210;8796:543210;798796:543210;:410;325510558796:543210;8796:543210;8796:543210;8796:543210;8796:543210;8796:543210;8796:543210;8796:543210;8796:543210;7796:410;98796:543210;8796:543210;88779966::554433221100;;4;:35553833289676779762291095595796:543210;23:559533779699796:410;999958796:543210;8796:543210;8796:543210;8796:543210;8796:543210;8796:543210;8796:543210;8796:543210;7:277Kf0Kh1GdGb`Fn`Ff3`0G`2``Gf02```1``20GjFhFjFl75869463210758694321075869432107586943210758694321075869432107586943210758694321075869432107586942107586942107586942107586944443210758694243221107586943221107586941075869432107586943210758694021075869444421075869432107586666944321075869432107586943210758694758321075869421321075869432107586943210758694321075869432107586943210758694321075869432107586940694321075869432107586943322110077558866994431042210758694122492107586943210758694321075869443210758694321075869432107586943210758694321075869432107586943758022012KjKl10`Hb0Hd0```Hf21021021021021021021021021021212121021021021021021212220210210210210210002102102102121021021021021210210210022110000000000000000210210210210210210210210021Kn0L`0","f":"``````````````````{eg{}{{b{c}}}{}}00000000000{{dd}c{}}{{df}c{}}{{hh}c{}}{{ff}c{}}{{fh}c{}}{{{l{jh}}h}n}{{{l{A`}}}h}`{ce{}{}}00000000000{{}c{}}00000000000{l{{l{Ab}}}}00000000000{{{l{j}}}{{l{jAb}}}}00000000000{dh}{AdAf}0{{{l{Ah}}Ad}{{Al{{l{Aj}}}}}}`{{{l{jAh}}Ad}{{Al{{l{jAj}}}}}}{{{l{Ah}}}{{l{{An{Aj}}}}}}{l{{l{c}}}{}}00000000000{{{l{j}}}{{l{jc}}}{}}00000000000{{{B`{c}}}e{}{}}00000000000{{}e{}{{Bb{c}}}}00000000000;;;;;;;;;;;;{{{l{d}}}d}{{{l{h}}}h}{{{l{f}}}f}{{{l{Bd}}}Bd}{{{l{Af}}}Af}{{{l{Ad}}}Ad}{{{l{Bf}}}Bf}{{{l{Bh}}}Bh}{{l{l{jc}}}n{}}0000000{ln}0000000{{{l{Ad}}{l{Ad}}}Bj}{{{l{Bf}}{l{Bf}}}Bj}{{l{l{c}}}Bj{}}000{ce{}{}}00000000000{{{l{Ah}}Af}{{Al{{l{{An{Bf}}}}}}}}{hBl}`{{}d}{{}h}{{}f}{{}Ah}{Blh}{Bn{{l{c}}}{}}00000000000{Bn{{l{jc}}}{}}00000000000{c{{C`{d}}}Cb}{c{{C`{h}}}Cb}{c{{C`{f}}}Cb}{c{{C`{Bd}}}Cb}{c{{C`{Ah}}}Cb}{c{{C`{Af}}}Cb}{c{{C`{Ad}}}Cb}{c{{C`{Bf}}}Cb}{c{{C`{Bh}}}Cb}{{{l{Aj}}}{{Al{f}}}}`{{dBl}c{}}{l{{l{c}}}{}}00000000000{Bnn}00000000000{{{l{Aj}}}d}`{{{l{Aj}}}h}{{{l{d}}{l{d}}}Cd}{{{l{h}}{l{h}}}Cd}{{{l{f}}{l{f}}}Cd}{{{l{Bd}}{l{Bd}}}Cd}{{{l{Ah}}{l{Ah}}}Cd}{{{l{Af}}{l{Af}}}Cd}{{{l{Aj}}{l{Aj}}}Cd}{{{l{A`}}{l{A`}}}Cd}{{{l{Ad}}{l{Ad}}}Cd}{{{l{Bf}}{l{Bf}}}Cd}{{{l{Bh}}{l{Bh}}}Cd}{{l{l{c}}}Cd{}}00000000000{{{l{Aj}}}f}{{{l{Ah}}{l{Cf}}}{{Al{Ad}}}}{{{l{Ah}}{l{Cf}}}{{Al{Bf}}}}{{{l{d}}{l{jCh}}}Cj}{{l{l{Cl}}{l{jCh}}}{{C`{nCn}}}}{{{l{h}}{l{jCh}}}Cj}0{{{l{f}}{l{jCh}}}Cj}{{{l{Bd}}{l{jCh}}}Cj}{{{l{Ah}}{l{jCh}}}Cj}{{{l{Af}}{l{jCh}}}Cj}{{{l{Aj}}{l{jCh}}}Cj}{{{l{A`}}{l{jCh}}}Cj}{{{l{Ad}}{l{jCh}}}Cj}{{{l{Bf}}{l{jCh}}}Cj}{{{l{Bh}}{l{jCh}}}Cj}{BdD`}{cc{}}{fd}111{df}22222222222222222222222222222222{{{Db{BlBl}}}d}{Alc{}}{ce{}{}}00000000000{{{l{Bd}}}Bl}{{{l{Af}}{l{jc}}}nDd}{{{l{Ad}}{l{jc}}}nDd}{{{l{Bf}}{l{jc}}}nDd}{{{l{Bh}}{l{jc}}}nDd}{{{l{Aj}}}Ad}{{{l{A`}}}Bf}{{{l{Ah}}Bf}{{l{c}}}{}}{{{l{Ah}}Ad}{{l{c}}}{}}{AdBn}{BfBn}{{{l{jAh}}Bf}{{l{jc}}}{}}{{{l{jAh}}Ad}{{l{jc}}}{}}{{}Bn}00000000000{{}c{}}00000000000000000000000{{{Df{c}}}{{Df{Ab}}}{}}00000000000{{{Dh{c}}}{{Dh{Ab}}}{}}00000000000{{{Dj{c}}}{{Dj{Ab}}}{}}00000000000{{{B`{c}}}e{}{}}00000000000444444444444444444444444{{}{{Db{cc}}}{}}{d{{Db{BlBl}}}}1111111{{}{{Db{Al}}}}{{}{{Dl{c}}}{}}00000000000888888888888{{}{{Dn{c}}}{}}{{}{{Dn{{Al{c}}}}}{}}0101100101011001101010{AfAf}{BhBh}{{{l{Bd}}}Cd}{{{l{Aj}}}Cd}{{{l{Ah}}Bf}{{Al{{l{A`}}}}}}{{{l{jAh}}Bf}{{Al{{l{jA`}}}}}}{{{l{Ah}}}{{l{{An{A`}}}}}}{{{l{Aj}}}{{l{Bd}}}}`{{{l{jAj}}}{{l{jBd}}}}{{{l{Aj}}}{{l{Cf}}}}{{{l{A`}}}{{l{Cf}}}}`{{{l{h}}{l{h}}Bl}h}{{{l{f}}{l{f}}Bl}f}{{{l{d}}}Bl}`{{dc}d{{Eb{Bl}{{E`{Bl}}}}}}{{dBl}c{}}{hc{}}{{BlBl}d}{{Blh}f}{{hAfAf}A`}{{{l{A`}}Af}Af}{{{l{h}}{l{h}}}{{Al{Bj}}}}{{{l{Ad}}{l{Ad}}}{{Al{Bj}}}}{{{l{Bf}}{l{Bf}}}{{Al{Bj}}}}{{{l{h}}{l{h}}{l{h}}}Ed}{{{l{jAh}}c}Ad{{Ef{D`}}}}{{{l{jAh}}A`}Bf}{Blh}{{{l{Ah}}}h}{{{l{d}}c}C`Eh}{{{l{h}}c}C`Eh}{{{l{f}}c}C`Eh}{{{l{Bd}}c}C`Eh}{{{l{Ah}}c}C`Eh}{{{l{Af}}c}C`Eh}{{{l{Aj}}c}C`Eh}{{{l{A`}}c}C`Eh}{{{l{Ad}}c}C`Eh}{{{l{Bf}}c}C`Eh}{{{l{Bh}}c}C`Eh}{{{l{jA`}}h}n}{{{l{jAj}}{Al{f}}}n}{{{l{jBd}}Cd}n}{{{l{jAh}}h}n}{{{l{jAh}}d}n}{hBl}{{{l{jAh}}}n}{{{l{Aj}}}{{Al{d}}}}{{{l{Aj}}}d}{{dd}c{}}{{df}c{}}{{hh}c{}}{{fh}c{}}{{{l{jh}}h}n}8{lc{}}0000000{{l{Al{{Ej{l}}}}}El}:{lEn}{lF`}{{{l{Ah}}}d}{{}{{C`{c}}}{}}00000000000{c{{C`{e}}}{}{}}00000000000111111111111{{}{{C`{c{Fb{c}}}}}{}}00000000000{lFd}00000000000{ce{}{}}00000000000{{}c{}}00000000000{l{{Al{{l{c}}}}}{}}00000000000{{dd}f}{{Bdc}D`{{Ef{F`}}}}{{A`c}A`{{Ef{F`}}}}``````````````````````````````{eg{}{{b{c}}}{}}000000000{{FfFf}c{}}77777777776666666666{l{{l{Ab}}}}000000000{{{l{j}}}{{l{jAb}}}}000000000{l{{l{c}}}{}}000000000{{{l{j}}}{{l{jc}}}{}}000000000{{{B`{c}}}e{}{}}000000000{{}e{}{{Bb{c}}}}000000000<<<<<<<<<<{{{l{Fh}}}Fh}{{{l{Fj}}}Fj}{{{l{Fl}}}Fl}{{{l{Fn}}}Fn}{{{l{G`}}}G`}{{{l{Gb}}}Gb}{{{l{Ff}}}Ff}{{{l{Gd}}}Gd}{{{l{Gf}}}Gf}{{l{l{jc}}}n{}}00000000{ln}00000000{{{l{Gf}}{l{Gf}}}Bj}{{l{l{c}}}Bj{}}0{ce{}{}}000000000{{}Fh}{{}Gf}{Bn{{l{c}}}{}}{{{l{Fh}}}{{l{c}}}{}}11{{{l{Fj}}}{{l{c}}}{}}2222222{Bn{{l{jc}}}{}}0{{{l{jFh}}}{{l{jc}}}{}}{{{l{jFj}}}{{l{jc}}}{}}22222222{c{{C`{Fj}}}Cb}{c{{C`{Fl}}}Cb}{c{{C`{Fn}}}Cb}{c{{C`{G`}}}Cb}{c{{C`{Gb}}}Cb}{c{{C`{Ff}}}Cb}{c{{C`{Gd}}}Cb}{c{{C`{Gf}}}Cb}{l{{l{c}}}{}}000000000{Bnn}000000000`{{{l{Fh}}{l{Fh}}}Cd}{{{l{Fj}}{l{Fj}}}Cd}{{{l{Fl}}{l{Fl}}}Cd}{{{l{Fn}}{l{Fn}}}Cd}{{{l{G`}}{l{G`}}}Cd}{{{l{Gb}}{l{Gb}}}Cd}{{{l{Ff}}{l{Ff}}}Cd}{{{l{Gd}}{l{Gd}}}Cd}{{{l{Gf}}{l{Gf}}}Cd}{{l{l{c}}}Cd{}}00{{{l{Fh}}{l{jCh}}}Cj}{{{l{Fj}}{l{jCh}}}Cj}{{{l{Fl}}{l{jCh}}}Cj}{{{l{Fn}}{l{jCh}}}Cj}{{{l{G`}}{l{jCh}}}Cj}{{{l{Gb}}{l{jCh}}}Cj}{{{l{Ff}}{l{jCh}}}Cj}{{{l{Gd}}{l{jCh}}}Cj}{{{l{Gf}}{l{jCh}}}Cj}{cc{}}0000000{CdFf}{BlFf}{fFf}3{GhGf}444444444444444444444{ce{}{}}000000000{{{l{Fn}}{l{Ah}}}Ff}{{{l{G`}}{l{Aj}}}Ff}{{{l{Gb}}{l{A`}}}Ff}{{}Bn}000000000{{{l{jFh}}BnFj}n}{{{l{jFj}}Fl}n}{{}c{}}0000000000000000000{{{Df{c}}}{{Df{Ab}}}{}}000000000{{{Dh{c}}}{{Dh{Ab}}}{}}000000000{{{Dj{c}}}{{Dj{Ab}}}{}}000000000{{{B`{c}}}e{}{}}00000000044444444444444444444{{}{{Db{cc}}}{}}000{{}{{Dl{c}}}{}}0000000006666666666{{}{{Dn{c}}}{}}{{}{{Dn{{Al{c}}}}}{}}011001100101010110{GjGj}{FnFj}{{GfGd}Fl}{{{l{Gf}}{l{Gf}}}{{Al{Bj}}}}{{{l{jFh}}Fj}n}{{{l{jFh}}Bn}Fj}{{{l{Fj}}c}C`Eh}{{{l{Fl}}c}C`Eh}{{{l{Fn}}c}C`Eh}{{{l{G`}}c}C`Eh}{{{l{Gb}}c}C`Eh}{{{l{Ff}}c}C`Eh}{{{l{Gd}}c}C`Eh}{{{l{Gf}}c}C`Eh}{{{l{jFj}}BnGf}n}{{{l{jFh}}cBl}n{{Ef{{Gl{Cf}}}}}}{{{l{Fh}}}Gj}{{GfGf}c{}}{{{l{Gd}}Ff}Ff}{lc{}}00000000{{}{{C`{c}}}{}}000000000{c{{C`{e}}}{}{}}000000000{Gn{{C`{Gfc}}}{}}2222222222{{}{{C`{c{Fb{c}}}}}{}}000000000{lFd}000000000{ce{}{}}000000000{{}c{}}000000000{l{{Al{{l{c}}}}}{}}000000000{{{l{jGj}}Gn{l{jAh}}}Cd}{{{l{Fn}}Ff{l{jAh}}}n}{{{l{G`}}Ff{l{jAj}}}n}{{{l{Gb}}Ff{l{jA`}}}n}`{{{l{Fh}}{l{Cf}}}{{Al{Bl}}}}{{FhFj}Fh}{{FlH`}Fl}{{FjFl}Fj}{{FhcBl}Fh{{Ef{F`}}}}````````````{eg{}{{b{c}}}{}}00<<<;;;{l{{l{Ab}}}}00{{{l{j}}}{{l{jAb}}}}00{l{{l{c}}}{}}00{{{l{j}}}{{l{jc}}}{}}00{{{B`{c}}}e{}{}}00{{}e{}{{Bb{c}}}}00{{}c{}}00{{{l{Hb}}}Hb}{{{l{Hd}}}Hd}{{l{l{jc}}}n{}}0{ln}0{ce{}{}}00{Bn{{l{c}}}{}}00{Bn{{l{jc}}}{}}00;;;{Bnn}00{{{l{Hb}}{l{Hb}}}Cd}{{{l{Hd}}{l{Hd}}}Cd}{{l{l{c}}}Cd{}}00{{{l{Hf}}{l{jCh}}}Cj}{{{l{Hb}}{l{jCh}}}Cj}{{{l{Hd}}{l{jCh}}}Cj}{cc{}}00000000:::{{{l{jHf}}{Hj{Hh}}{l{jHl}}}Cd}{{{l{jHf}}{Hj{Hh}}{l{jHl}}}{{Al{Hn}}}}{{}Bn}00{{}c{}}00000{{{Df{c}}}{{Df{Ab}}}{}}00{{{Dh{c}}}{{Dh{Ab}}}{}}0{{{Dj{c}}}{{Dj{Ab}}}{}}00{{{B`{c}}}e{}{}}00444444{{}{{Db{cc}}}{}}0{{}{{Dl{c}}}{}}00666{{}{{Dn{{Al{c}}}}}{}}{{}{{Dn{c}}}{}}1001{{{l{jHf}}{Ib{I`}}{l{jId}}}{{Ib{If}}}}{{}Ih}{IjIh}{{{l{Hf}}}{{l{{Il{Bl}}}}}}0{{{l{jHf}}{Hj{Hh}}InJ`{l{jHl}}}Jb}{{{l{jHf}}{Hj{Hh}}InJ`{l{jHl}}}n}{{{l{jHf}}{Al{{Hj{Hh}}}}InJ`{l{jHl}}}n}{{{l{jHf}}InJdJf{l{jHl}}}Jb}{{{Il{Ah}}}Hf}{{Hfc}Hf{{Eb{Hd}}Jh}}{{{l{jc}}}{{C`{{Al{Jj}}Jl}}}{JnK`}}{{{l{jHf}}{l{jKb}}}n}{{}{{C`{nJl}}}}{Kd{{C`{nJl}}}}:{lc{}}0{{}{{C`{c}}}{}}00{c{{C`{e}}}{}{}}00111{{}{{C`{c{Fb{c}}}}}{}}00{lFd}00{ce{}{}}00{{}c{}}00{{{l{jHf}}{l{jHl}}}n}{l{{Al{{l{c}}}}}{}}00````","D":"AAf","p":[[10,"TransformMatrix",1428],[5,"Coordinate",0],[5,"Vector",0],[5,"Angle",0],[0,"mut"],[1,"reference"],[1,"unit"],[5,"Joint",0],[10,"Any",1429],[5,"BoneId",0],[5,"BoneAxis",0],[5,"Skeleton",0],[5,"Bone",0],[6,"Option",1430],[1,"slice"],[5,"BakedParameters",1431],[10,"CastFrom",1432],[6,"BoneKind",0],[5,"JointId",0],[6,"BoneEnd",0],[6,"Ordering",1433],[1,"f32"],[1,"usize"],[6,"Result",1434],[10,"Deserializer",1435],[1,"bool"],[1,"str"],[5,"Formatter",1436],[8,"Result",1436],[5,"WidgetContext",1437],[5,"Error",1436],[5,"LabeledBoneKind",0],[1,"tuple"],[10,"Hasher",1438],[5,"Box",1439],[5,"Arc",1440],[5,"Rc",1441],[6,"ReadOnly",1442],[6,"Value",1442],[17,"Output"],[10,"FnMut",1443],[5,"ZeroToOne",1444],[10,"Into",1445],[10,"Serializer",1446],[5,"RangeInclusive",1447],[6,"Progress",1448],[5,"SmolStr",1449],[5,"String",1450],[5,"OutOfBounds",1451],[5,"TypeId",1429],[6,"Value",713],[5,"Animation",713],[5,"Timeline",713],[5,"Keyframe",713],[6,"Target",713],[6,"BoneProperty",713],[6,"JointProperty",713],[6,"PropertyUpdate",713],[5,"Frame",713],[1,"u32"],[5,"RunningAnimation",713],[6,"Cow",1452],[5,"Duration",1453],[6,"StandardEasing",1454],[6,"Target",1261],[6,"SkeletonMutation",1261],[5,"SkeletonCanvas",1261],[5,"Px",1455],[5,"Point",1456],[5,"EventContext",1437],[6,"CursorIcon",1457],[6,"ConstraintLimit",1458],[5,"Size",1459],[5,"LayoutContext",1437],[5,"UPx",1455],[5,"WidgetInstance",1460],[5,"WidgetTag",1460],[5,"Dynamic",1442],[6,"DeviceId",1461],[6,"MouseButton",1462],[8,"EventHandling",1460],[6,"MouseScrollDelta",1462],[6,"TouchPhase",1462],[10,"Send",1463],[5,"WindowHandle",1461],[6,"EventLoopError",1464],[10,"Application",1465],[10,"Sized",1463],[5,"GraphicsContext",1437],[5,"PendingApp",1465],[15,"Jointed",709],[15,"Rigid",709],[15,"Bone",1256],[15,"Joint",1256],[15,"SetDesiredEnd",1424],[15,"SetJointRotation",1424]],"r":[],"b":[[30,"impl-Add-for-Coordinate"],[31,"impl-Add%3CVector%3E-for-Coordinate"],[33,"impl-Add-for-Vector"],[34,"impl-Add%3CAngle%3E-for-Vector"],[294,"impl-Display-for-Angle"],[295,"impl-Debug-for-Angle"],[365,"impl-Index%3CJointId%3E-for-Skeleton"],[366,"impl-Index%3CBoneId%3E-for-Skeleton"],[369,"impl-IndexMut%3CJointId%3E-for-Skeleton"],[370,"impl-IndexMut%3CBoneId%3E-for-Skeleton"],[589,"impl-Sub-for-Coordinate"],[590,"impl-Sub%3CVector%3E-for-Coordinate"],[962,"impl-From%3Cbool%3E-for-Value"],[963,"impl-From%3Cf32%3E-for-Value"],[964,"impl-From%3CVector%3E-for-Value"]],"c":"OjAAAAAAAAA=","e":"OzAAAAEAAAkFHgATABEAJgAwAF4AZQDHAAMAzAAgAO8AGAALARYAJQENADQBAAA4AQAAQQElAGgBAwBuAQEAcgENAIwBjQAnAgEALAIBADICAwA6AgoATgIEAFQCCABeAgEAYQJfAMoC8ADDAwIAxwMAAMkDLAAABC8BMwUNAEQFUAA="}]]')); if (typeof exports !== 'undefined') exports.searchIndex = searchIndex; else if (window.initSearch) window.initSearch(searchIndex); -//{"start":39,"fragment_lengths":[4351,17521]} \ No newline at end of file +//{"start":39,"fragment_lengths":[4351,20584]} \ No newline at end of file diff --git a/main/search.desc/funnybones/funnybones-desc-0-.js b/main/search.desc/funnybones/funnybones-desc-0-.js index dd03ac7..d5af929 100644 --- a/main/search.desc/funnybones/funnybones-desc-0-.js +++ b/main/search.desc/funnybones/funnybones-desc-0-.js @@ -1 +1 @@ -searchState.loadedDescShard("funnybones", 0, "FunnyBones is considered experimental and unsupported …\nThe first end of a bone.\nA value representing a direction.\nThe second end of a bone.\nA bone in a Skeleton.\nA specific end of a specific bone.\nA specific end of a Bone.\nThe unique ID of a Bone in a Skeleton.\nA representation of a bone structure inside of a Skeleton.\nA two dimensionsional offset/measurement.\nA connection between two bones.\nThe unique ID of a Joint in a Skeleton.\nTwo bones connected with a joint that automatically …\nA BoneKind with an associated label.\nThe maximum rotation represented by this type.\nThe minimum rotation represented by this type.\nA single bone of a fixed length.\nA collection of Bones. connected by Joints.\nA 2D Euclidean vector.\nReturns the rotation of this joint.\nReturns the angle formed a line passing through 0,0 …\nReturns the first axis of this bone.\nReturns the second axis of this bone.\nThe unique id of the bone of this axis.\nReturns the list of bones in this skeleton.\nReturns a list of joints connected to a specific bone axis.\nReturns the cosine of this angle.\nWidgets for editing and rendering skeletons.\nReturns a rotation representing the given degrees.\nReturns the location this bone is being aimed towards.\nThe direction the vector is heading.\nReturns the solved end position of this bone.\nThe end of the bone being referenced.\nReturns the angle of the previous bone segment connecting …\nReturns a vector representing the final segment in this …\nFinds an existing Bone by its label.\nFinds an existing Joint by its label.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the full length of this bone.\nReturns the unique id of this bone.\nReturns the unique id of this joint.\nReturns the index of this bone within the skeleton.\nReturns the index of this joint within the skeleton.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nReturns the opposite axis on the same bone.\nReturns the opposite end of self.\nReturns true if this bone is the root of the skeleton.\nReturns the list of joints in this skeleton.\nReturns the kind of this bone.\nThe bone to create.\nReturns the label this bone was created with.\nReturns the label of this joint.\nThe label of the bone.\nReturns the magnitude of this vector.\nThe length of the vector.\nReturns the result of mapping x and y to f.\nReturns a new vector from the x and y values.\nReturns a new vector for the given magnitude and direction.\nReturns a new joint formed by joining bone_a and bone_b at …\nGiven axis is one of the two connections in this joint, …\nCreates a new Bone into the skeleton. Returns the unique …\nCreates a new Joint in the skeleton, connecting two bones …\nReturns a rotation representing the given radians.\nReturns the base rotation being applied to the entire …\nSets the angle to form between these joints.\nSets a relative position to aim the end of this bone …\nSets a base rotation to apply to the entire skeleton.\nSets a translation to be applied to the entire skeleton.\nReturns the sine of this angle.\nUpdates the solved positions of all bones in this skeleton …\nIf this is a BoneKind::Jointed bone, returns the solved …\nReturns the solved start position of this bone.\nReturns this rotation represented in degrees.\nReturns this rotation represented in radians.\nReturns the translation applied to the entire skeleton.\nReturns a vector pointing from self to other.\nAttaches a label to this bone when pushed into a skeleton.\nLabels this joint and returns self.\nThe x-axis component of this vector.\nThe y-axis component of this vector.\nThe length of the bone connected furthes from the root of …\nThe bend of the simulated joint always goes in one of two …\nThe length of the bone.\nThe length of the bone connected closest to the root of the\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).") \ No newline at end of file +searchState.loadedDescShard("funnybones", 0, "FunnyBones is considered experimental and unsupported …\nThe first end of a bone.\nA value representing a direction.\nThe second end of a bone.\nA bone in a Skeleton.\nA specific end of a specific bone.\nA specific end of a Bone.\nThe unique ID of a Bone in a Skeleton.\nA representation of a bone structure inside of a Skeleton.\nA two dimensionsional offset/measurement.\nA connection between two bones.\nThe unique ID of a Joint in a Skeleton.\nTwo bones connected with a joint that automatically …\nA BoneKind with an associated label.\nThe maximum rotation represented by this type.\nThe minimum rotation represented by this type.\nA single bone of a fixed length.\nA collection of Bones. connected by Joints.\nA 2D Euclidean vector.\nReturns the rotation of this joint.\nReturns the angle formed a line passing through 0,0 …\nReturns the first axis of this bone.\nReturns the second axis of this bone.\nReturns the bone for a given id, or none if not found.\nThe unique id of the bone of this axis.\nReturns an exclusive reference to the bone for a given id, …\nReturns the list of bones in this skeleton.\nReturns a list of joints connected to a specific bone axis.\nReturns the cosine of this angle.\nWidgets for editing and rendering skeletons.\nReturns a rotation representing the given degrees.\nReturns the location this bone is being aimed towards.\nThe direction the vector is heading.\nReturns the solved end position of this bone.\nThe end of the bone being referenced.\nReturns the angle of the previous bone segment connecting …\nReturns a vector representing the final segment in this …\nFinds an existing Bone by its label.\nFinds an existing Joint by its label.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the full length of this bone.\nReturns the unique id of this bone.\nReturns the unique id of this joint.\nReturns the index of this bone within the skeleton.\nReturns the index of this joint within the skeleton.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nReturns the opposite axis on the same bone.\nReturns the opposite end of self.\nReturns true if this is a jointed bone that bends …\nReturns true if this bone is the root of the skeleton.\nReturns the joint for a given id, or none if not found.\nReturns an exclusive reference to the joint for a given …\nReturns the list of joints in this skeleton.\nReturns the kind of this bone.\nThe bone to create.\nReturns an exclusive reference to the kind of this bone.\nReturns the label this bone was created with.\nReturns the label of this joint.\nThe label of the bone.\nReturns the magnitude of this vector.\nThe length of the vector.\nReturns the result of mapping x and y to f.\nReturns a new vector from the x and y values.\nReturns a new vector for the given magnitude and direction.\nReturns a new joint formed by joining bone_a and bone_b at …\nGiven axis is one of the two connections in this joint, …\nCreates a new Bone into the skeleton. Returns the unique …\nCreates a new Joint in the skeleton, connecting two bones …\nReturns a rotation representing the given radians.\nReturns the base rotation being applied to the entire …\nSets the angle to form between these joints.\nSets a relative position to aim the end of this bone …\nSets whether to bend inversely.\nSets a base rotation to apply to the entire skeleton.\nSets a translation to be applied to the entire skeleton.\nReturns the sine of this angle.\nUpdates the solved positions of all bones in this skeleton …\nIf this is a BoneKind::Jointed bone, returns the solved …\nReturns the solved start position of this bone.\nReturns this rotation represented in degrees.\nReturns this rotation represented in radians.\nReturns the translation applied to the entire skeleton.\nReturns a vector pointing from self to other.\nAttaches a label to this bone when pushed into a skeleton.\nLabels this joint and returns self.\nThe x-axis component of this vector.\nThe y-axis component of this vector.\nThe length of the bone connected furthes from the root of …\nThe bend of the simulated joint always goes in one of two …\nThe length of the bone.\nThe length of the bone connected closest to the root of the\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).") \ No newline at end of file diff --git a/main/settings.html b/main/settings.html index 3df7636..467bab8 100644 --- a/main/settings.html +++ b/main/settings.html @@ -1 +1 @@ -Settings

Rustdoc settings

Back
\ No newline at end of file +Settings

Rustdoc settings

Back
\ No newline at end of file diff --git a/main/src/FunnyBones/funnybones.rs.html b/main/src/FunnyBones/funnybones.rs.html index 4bc979a..eccc7dc 100644 --- a/main/src/FunnyBones/funnybones.rs.html +++ b/main/src/FunnyBones/funnybones.rs.html @@ -1,4 +1,4 @@ -funnybones.rs - source
1
+funnybones.rs - source
1
 2
 3
 4
diff --git a/main/src/funnybones/animation.rs.html b/main/src/funnybones/animation.rs.html
index 8589936..61295fc 100644
--- a/main/src/funnybones/animation.rs.html
+++ b/main/src/funnybones/animation.rs.html
@@ -1,4 +1,4 @@
-animation.rs - source
1
+animation.rs - source
1
 2
 3
 4
@@ -323,18 +323,338 @@
 323
 324
 325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
+364
+365
+366
+367
+368
+369
+370
+371
+372
+373
+374
+375
+376
+377
+378
+379
+380
+381
+382
+383
+384
+385
+386
+387
+388
+389
+390
+391
+392
+393
+394
+395
+396
+397
+398
+399
+400
+401
+402
+403
+404
+405
+406
+407
+408
+409
+410
+411
+412
+413
+414
+415
+416
+417
+418
+419
+420
+421
+422
+423
+424
+425
+426
+427
+428
+429
+430
+431
+432
+433
+434
+435
+436
+437
+438
+439
+440
+441
+442
+443
+444
+445
+446
+447
+448
+449
+450
+451
+452
+453
+454
+455
+456
+457
+458
+459
+460
+461
+462
+463
+464
+465
+466
+467
+468
+469
+470
+471
+472
+473
+474
+475
+476
+477
+478
+479
+480
+481
+482
+483
+484
+485
+486
+487
+488
+489
+490
+491
+492
+493
+494
+495
+496
+497
+498
+499
+500
+501
+502
+503
+504
+505
+506
+507
+508
+509
+510
+511
+512
+513
+514
+515
+516
+517
+518
+519
+520
+521
+522
+523
+524
+525
+526
+527
+528
+529
+530
+531
+532
+533
+534
+535
+536
+537
+538
+539
+540
+541
+542
+543
+544
+545
+546
+547
+548
+549
+550
+551
+552
+553
+554
+555
+556
+557
+558
+559
+560
+561
+562
+563
+564
+565
+566
+567
+568
+569
+570
+571
+572
+573
+574
+575
+576
+577
+578
+579
+580
+581
+582
+583
+584
+585
+586
+587
+588
+589
+590
+591
+592
+593
+594
+595
+596
+597
+598
+599
+600
+601
+602
+603
+604
+605
+606
+607
+608
+609
+610
+611
+612
+613
+614
+615
+616
+617
+618
+619
+620
+621
+622
+623
+624
+625
+626
+627
+628
+629
+630
+631
+632
+633
+634
+635
+636
+637
+638
+639
+640
+641
+642
+643
 
#![allow(missing_docs)]
 use std::{
     borrow::Cow,
+    cmp::Ordering,
     collections::HashMap,
-    ops::{Deref, DerefMut},
+    num::TryFromIntError,
+    ops::{Add, Deref, DerefMut, Sub},
     sync::Arc,
     time::Duration,
 };
 
-use easing_function::{easings::StandardEasing, Easing};
+use easing_function::easings::StandardEasing;
 
-use crate::{Angle, BoneId, Coordinate, JointId, Skeleton, Vector};
+use crate::{Angle, Bone, BoneId, Coordinate, Joint, JointId, Skeleton, Vector};
 
 #[derive(Default, Debug, PartialEq, Clone)]
 pub struct Animation(Arc<AnimationData>);
@@ -344,22 +664,22 @@
         Arc::make_mut(&mut self.0)
     }
 
-    pub fn push(&mut self, frame: Frame) {
-        self.data_mut().frames.push(frame);
+    pub fn push(&mut self, timeline: Timeline) {
+        self.data_mut().timelines.push(timeline);
     }
 
     #[must_use]
-    pub fn with(mut self, frame: Frame) -> Self {
-        self.push(frame);
+    pub fn with(mut self, timeline: Timeline) -> Self {
+        self.push(timeline);
         self
     }
 
-    pub fn remove(&mut self, frame_index: usize) -> Frame {
-        self.data_mut().frames.remove(frame_index)
+    pub fn remove(&mut self, timeline_index: usize) -> Timeline {
+        self.data_mut().timelines.remove(timeline_index)
     }
 
-    pub fn insert(&mut self, index: usize, frame: Frame) {
-        self.data_mut().frames.insert(index, frame);
+    pub fn insert(&mut self, index: usize, timeline: Timeline) {
+        self.data_mut().timelines.insert(index, timeline);
     }
 
     #[must_use]
@@ -392,25 +712,24 @@
     pub fn start(&self) -> RunningAnimation {
         RunningAnimation {
             animation: self.clone(),
-            frame_elapsed: Duration::ZERO,
-            frame: 0,
             repeat: false,
-            frame_props: Vec::new(),
+            elapsed: Duration::ZERO,
+            timelines: Vec::new(),
         }
     }
 }
 
 impl Deref for Animation {
-    type Target = [Frame];
+    type Target = [Timeline];
 
     fn deref(&self) -> &Self::Target {
-        &self.0.frames
+        &self.0.timelines
     }
 }
 
 impl DerefMut for Animation {
     fn deref_mut(&mut self) -> &mut Self::Target {
-        &mut self.data_mut().frames
+        &mut self.data_mut().timelines
     }
 }
 
@@ -419,100 +738,298 @@
 #[cfg_attr(feature = "serde", serde(rename = "Animation"))]
 struct AnimationData {
     variables: HashMap<String, f32>,
-    frames: Vec<Frame>,
+    timelines: Vec<Timeline>,
 }
 
 #[derive(Debug, PartialEq, Clone)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
-pub struct Frame {
-    duration: Duration,
-    changes: Vec<Change>,
+pub struct Timeline {
+    target: Target,
+    frames: Vec<Keyframe>,
 }
 
-impl Frame {
+impl Timeline {
     #[must_use]
-    pub const fn new(duration: Duration) -> Self {
+    pub fn new(target: Target) -> Self {
         Self {
-            duration,
-            changes: Vec::new(),
+            target,
+            frames: Vec::new(),
         }
     }
 
-    pub fn set_duration(&mut self, duration: Duration) {
-        self.duration = duration;
-    }
-
-    #[must_use]
-    pub const fn duration(&self) -> Duration {
-        self.duration
-    }
-
     #[must_use]
-    pub fn with_change(mut self, change: impl Into<Change>) -> Self {
-        self.push_change(change.into());
+    pub fn with_frame(mut self, frame: Keyframe) -> Self {
+        self.insert_frame(frame);
         self
     }
 
-    pub fn push_change(&mut self, change: impl Into<Change>) {
-        self.changes.push(change.into());
+    pub fn insert_frame(&mut self, frame: Keyframe) {
+        match self
+            .frames
+            .binary_search_by_key(&frame.frame_offset, |f| f.frame_offset)
+        {
+            Ok(existing_index) => {
+                self.frames[existing_index] = frame;
+            }
+            Err(insert_at) => {
+                self.frames.insert(insert_at, frame);
+            }
+        }
+    }
+
+    pub fn set_frame_offset(&mut self, index: usize, new_offset: Frame) {
+        let current_offset = self.frames[index].frame_offset;
+        let (slice_offset, slice) = match current_offset.cmp(&new_offset) {
+            Ordering::Less => (0, &self.frames[0..index]),
+            Ordering::Equal => return,
+            Ordering::Greater => (index + 1, &self.frames[index + 1..]),
+        };
+
+        match slice.binary_search_by_key(&new_offset, |f| f.frame_offset) {
+            Ok(relative_index) => {
+                let new_index = relative_index + slice_offset;
+                self.frames[new_index].easing = self.frames[index].easing;
+                self.frames[new_index].update = self.frames[index].update;
+                self.frames.remove(index);
+            }
+            Err(relative_index) => {
+                let mut new_index = relative_index + slice_offset;
+                let mut removed = self.frames.remove(index);
+                removed.frame_offset = new_offset;
+                if slice_offset > 0 {
+                    new_index -= 1;
+                }
+                self.frames.insert(new_index, removed);
+            }
+        }
     }
 }
 
-impl Deref for Frame {
-    type Target = [Change];
+impl Deref for Timeline {
+    type Target = [Keyframe];
 
     fn deref(&self) -> &Self::Target {
-        &self.changes
+        &self.frames
     }
 }
 
-impl DerefMut for Frame {
+impl DerefMut for Timeline {
     fn deref_mut(&mut self) -> &mut Self::Target {
-        &mut self.changes
+        &mut self.frames
     }
 }
 
 #[derive(Debug, PartialEq, Clone, Copy)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
-pub struct Change {
-    kind: ChangeKind,
-    easing: StandardEasing,
+pub struct Keyframe {
+    frame_offset: Frame,
+    pub update: PropertyUpdate,
+    pub easing: StandardEasing,
 }
 
-impl From<ChangeKind> for Change {
-    fn from(kind: ChangeKind) -> Self {
+impl Keyframe {
+    #[must_use]
+    pub fn new(frame_offset: Frame, update: PropertyUpdate) -> Self {
         Self {
-            kind,
-            easing: StandardEasing::Linear,
+            frame_offset,
+            update,
+            easing: StandardEasing::default(),
         }
     }
+
+    #[must_use]
+    pub fn with_easing(mut self, easing: StandardEasing) -> Self {
+        self.easing = easing;
+        self
+    }
 }
 
-#[derive(Debug, PartialEq, Clone, Copy)]
+#[derive(Debug, PartialEq, Clone)]
+#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
+pub enum Target {
+    Bone {
+        bone: BoneId,
+        property: BoneProperty,
+    },
+    Joint {
+        joint: JointId,
+        property: JointProperty,
+    },
+}
+
+impl Target {
+    #[must_use]
+    pub fn get(&self, skeleton: &Skeleton) -> Value {
+        // TODO this shouldn't be able to panic
+        match self {
+            Target::Bone { bone, property } => skeleton.bone(*bone).map(|bone| property.get(bone)),
+            Target::Joint { joint, property } => {
+                skeleton.joint(*joint).map(|joint| property.get(joint))
+            }
+        }
+        .unwrap_or(Value::Invalid)
+    }
+
+    pub fn update(&self, value: Value, skeleton: &mut Skeleton) {
+        match self {
+            Target::Bone { bone, property } => {
+                let Some(bone) = skeleton.bone_mut(*bone) else {
+                    return;
+                };
+                property.update(value, bone);
+            }
+            Target::Joint { joint, property } => {
+                let Some(joint) = skeleton.joint_mut(*joint) else {
+                    return;
+                };
+                property.update(value, joint);
+            }
+        }
+    }
+}
+
+#[derive(Debug, PartialEq, Clone)]
+#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
+pub enum BoneProperty {
+    Target,
+    // Scale,
+    Inverse,
+}
+
+impl BoneProperty {
+    #[must_use]
+    pub fn get(&self, bone: &Bone) -> Value {
+        match self {
+            BoneProperty::Target => Value::Vector(
+                bone.desired_end()
+                    .unwrap_or_else(|| Vector::new(bone.kind().full_length(), Angle::default())),
+            ),
+            // BoneProperty::Scale => ,
+            BoneProperty::Inverse => Value::Bool(bone.kind().is_inverse()),
+        }
+    }
+
+    pub fn update(&self, value: Value, bone: &mut Bone) {
+        match self {
+            BoneProperty::Target => {
+                let Value::Vector(value) = value else {
+                    return;
+                };
+                bone.set_desired_end(Some(value));
+            }
+            BoneProperty::Inverse => {
+                let Value::Bool(value) = value else {
+                    return;
+                };
+                bone.kind_mut().set_inverse(value);
+            }
+        }
+    }
+}
+
+#[derive(Debug, PartialEq, Clone)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
-pub enum ChangeKind {
-    Bone { bone: BoneId, position: Vector },
-    Joint { joint: JointId, rotation: Angle },
+pub enum JointProperty {
+    Angle,
 }
 
-impl ChangeKind {
+impl JointProperty {
     #[must_use]
-    pub const fn with_easing(self, easing: StandardEasing) -> Change {
-        Change { kind: self, easing }
+    pub fn get(&self, joint: &Joint) -> Value {
+        match self {
+            JointProperty::Angle => Value::Number(joint.angle().to_radians()),
+        }
+    }
+
+    pub fn update(&self, value: Value, joint: &mut Joint) {
+        match self {
+            JointProperty::Angle => {
+                let Value::Number(value) = value else {
+                    return;
+                };
+                joint.set_angle(Angle::radians(value));
+            }
+        }
     }
 }
 
-enum OriginalProperty {
-    Rotation(Angle),
+#[derive(Debug, PartialEq, Clone, Copy)]
+#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
+pub enum Value {
+    Invalid,
+    Number(f32),
     Vector(Vector),
+    Bool(bool),
+}
+
+impl From<f32> for Value {
+    fn from(value: f32) -> Self {
+        Self::Number(value)
+    }
+}
+
+impl From<Vector> for Value {
+    fn from(value: Vector) -> Self {
+        Self::Vector(value)
+    }
+}
+
+impl From<bool> for Value {
+    fn from(value: bool) -> Self {
+        Self::Bool(value)
+    }
+}
+
+impl Lerp for Value {
+    fn lerp(self, target: Self, percent: f32) -> Self {
+        match (self, target) {
+            (Value::Number(this), Value::Number(target)) => {
+                Self::Number(this.lerp(target, percent))
+            }
+            (Value::Vector(this), Value::Vector(target)) => {
+                Self::Vector(this.lerp(target, percent))
+            }
+            (Value::Bool(this), Value::Bool(target)) => Self::Bool(this.lerp(target, percent)),
+            _ => Value::Invalid,
+        }
+    }
+}
+
+impl Add for Value {
+    type Output = Self;
+
+    fn add(self, rhs: Self) -> Self::Output {
+        match (self, rhs) {
+            (Value::Number(this), Value::Number(target)) => Self::Number(this + target),
+            (Value::Vector(this), Value::Vector(target)) => Self::Vector(this + target),
+            (Value::Bool(this), Value::Bool(target)) => Self::Bool(this ^ target),
+            _ => Value::Invalid,
+        }
+    }
+}
+
+#[derive(Debug, PartialEq, Clone, Copy)]
+#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
+pub enum PropertyUpdate {
+    ChangeTo(Value),
+    Add(Value),
+}
+
+impl PropertyUpdate {
+    #[must_use]
+    pub fn target(&self, initial: Value) -> Value {
+        match self {
+            PropertyUpdate::ChangeTo(target) => *target,
+            PropertyUpdate::Add(delta) => initial + *delta,
+        }
+    }
 }
 
 pub struct RunningAnimation {
     animation: Animation,
-    frame: usize,
-    frame_elapsed: Duration,
+    elapsed: Duration,
     repeat: bool,
-    frame_props: Vec<OriginalProperty>,
+    timelines: Vec<RunningTimeline>,
 }
 
 impl RunningAnimation {
@@ -523,87 +1040,156 @@
     }
 
     pub fn update(&mut self, elapsed: Duration, skeleton: &mut Skeleton) -> bool {
-        loop {
-            let Some(frame) = self.animation.get(self.frame) else {
-                return false;
-            };
+        if self.animation.is_empty() {
+            return false;
+        }
 
-            self.frame_elapsed += elapsed;
-            if let Some(after_frame) = self.frame_elapsed.checked_sub(frame.duration) {
-                self.frame_elapsed = after_frame;
-                self.frame += 1;
-                self.frame_props.clear();
-                if self.frame == self.animation.len() && self.repeat {
-                    self.frame = 0;
-                }
-                // Ensure all of the changes are fully tweened.
-                for change in &frame.changes {
-                    match change.kind {
-                        ChangeKind::Bone {
-                            bone,
-                            position: target,
-                        } => {
-                            skeleton[bone].set_desired_end(Some(target));
-                        }
-
-                        ChangeKind::Joint {
-                            joint,
-                            rotation: target,
-                        } => {
-                            skeleton[joint].set_angle(target);
-                        }
-                    }
-                }
-            } else {
-                // If this is the start of the frame, grab the currrent values
-                // to tween towards the next keyframe.
-                if self.frame_props.len() != frame.changes.len() {
-                    self.frame_props.clear();
-                    self.frame_props.reserve(frame.changes.len());
-                    for change in &frame.changes {
-                        self.frame_props.push(match change.kind {
-                            ChangeKind::Bone { bone, .. } => OriginalProperty::Vector(
-                                skeleton[bone].start().vector_to(skeleton[bone].end()),
-                            ),
-
-                            ChangeKind::Joint { joint, .. } => {
-                                OriginalProperty::Rotation(skeleton[joint].angle())
-                            }
-                        });
+        if self.timelines.is_empty() {
+            self.timelines = self
+                .animation
+                .iter()
+                .map(|timeline| {
+                    let frame_start_value = timeline.target.get(skeleton);
+                    RunningTimeline {
+                        frame_entry: Frame::MIN,
+                        frame: 0,
+                        frame_start_value,
+                        frame_target_value: timeline
+                            .frames
+                            .first()
+                            .map_or(Value::Invalid, |f| f.update.target(frame_start_value)),
                     }
-                }
+                })
+                .collect();
+        }
 
-                let percent = self.frame_elapsed.as_secs_f32() / frame.duration.as_secs_f32();
-                for (change, original) in frame.changes.iter().zip(&self.frame_props) {
-                    let factor = change.easing.ease(percent);
-                    match (change.kind, original) {
-                        (
-                            ChangeKind::Bone {
-                                bone,
-                                position: target,
-                            },
-                            OriginalProperty::Vector(original),
-                        ) => {
-                            skeleton[bone].set_desired_end(Some(original.lerp(target, factor)));
-                        }
-                        (
-                            ChangeKind::Joint {
-                                joint,
-                                rotation: target,
-                            },
-                            OriginalProperty::Rotation(original),
-                        ) => {
-                            skeleton[joint].set_angle(original.lerp(target, factor));
-                        }
-                        _ => unreachable!(),
+        self.elapsed += elapsed;
+        let frame = Frame::try_from(self.elapsed).unwrap_or(Frame::MAX);
+        loop {
+            let mut still_running = false;
+            let mut remaining = frame;
+            for (index, timeline) in self.timelines.iter_mut().enumerate() {
+                match timeline.update(&self.animation[index], frame, skeleton) {
+                    Ok(_) => {
+                        still_running = true;
+                    }
+                    Err(unused) => {
+                        remaining = remaining.min(unused);
                     }
                 }
+            }
+
+            if still_running {
+                return false;
+            } else if self.repeat {
+                self.elapsed = Duration::from(remaining)
+                    + Duration::from_nanos(u64::from(self.elapsed.subsec_nanos() % 1_000_000));
+            } else {
                 return true;
             }
         }
     }
 }
 
+#[derive(Clone, Copy, Eq, PartialEq, Debug, Ord, PartialOrd, Default)]
+#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
+pub struct Frame(u32);
+
+impl Frame {
+    pub const MAX: Self = Self(u32::MAX);
+    pub const MIN: Self = Self(0);
+    pub const ZERO: Self = Self::MIN;
+}
+
+impl Sub for Frame {
+    type Output = Frame;
+
+    fn sub(self, rhs: Self) -> Self::Output {
+        Self(self.0 - rhs.0)
+    }
+}
+
+impl TryFrom<Duration> for Frame {
+    type Error = TryFromIntError;
+
+    fn try_from(value: Duration) -> Result<Self, Self::Error> {
+        value.as_millis().try_into().map(Self)
+    }
+}
+
+impl From<Frame> for Duration {
+    fn from(value: Frame) -> Self {
+        Duration::from_millis(u64::from(value.0))
+    }
+}
+
+impl From<u32> for Frame {
+    fn from(value: u32) -> Self {
+        Self(value)
+    }
+}
+
+impl From<Frame> for u32 {
+    fn from(value: Frame) -> Self {
+        value.0
+    }
+}
+
+impl From<Frame> for f32 {
+    #[allow(clippy::cast_precision_loss)]
+    fn from(value: Frame) -> Self {
+        value.0 as f32
+    }
+}
+
+struct RunningTimeline {
+    frame_entry: Frame,
+    frame: usize,
+    frame_start_value: Value,
+    frame_target_value: Value,
+}
+
+impl RunningTimeline {
+    fn update(
+        &mut self,
+        timeline: &Timeline,
+        absolute_frame: Frame,
+        skeleton: &mut Skeleton,
+    ) -> Result<Frame, Frame> {
+        let Some(mut frame) = timeline.frames.get(self.frame) else {
+            return Err(absolute_frame);
+        };
+
+        loop {
+            let relative_frame = absolute_frame - self.frame_entry;
+            let total_frames = frame.frame_offset - self.frame_entry;
+            if relative_frame < frame.frame_offset {
+                let percent = if total_frames > Frame::ZERO {
+                    f32::from(relative_frame) / f32::from(total_frames)
+                } else {
+                    1.
+                };
+                let value = self
+                    .frame_start_value
+                    .lerp(self.frame_target_value, percent);
+                timeline.target.update(value, skeleton);
+                return Ok(frame.frame_offset - relative_frame);
+            }
+
+            self.frame_start_value = self.frame_start_value.lerp(self.frame_target_value, 1.0);
+            timeline.target.update(self.frame_start_value, skeleton);
+            self.frame += 1;
+            self.frame_entry = relative_frame;
+
+            let Some(next_frame) = timeline.frames.get(self.frame) else {
+                return Err(self.frame_entry);
+            };
+            self.frame_target_value = next_frame.update.target(self.frame_start_value);
+            frame = next_frame;
+        }
+    }
+}
+
 trait Lerp: Sized {
     fn lerp(self, target: Self, percent: f32) -> Self;
 }
@@ -648,4 +1234,54 @@
         )
     }
 }
+
+impl Lerp for bool {
+    fn lerp(self, target: Self, percent: f32) -> Self {
+        if percent >= 0.5 {
+            target
+        } else {
+            self
+        }
+    }
+}
+
+#[test]
+fn basic() {
+    use crate::BoneKind;
+
+    #[track_caller]
+    fn assert_approx_eq(lhs: f32, rhs: f32) {
+        assert!((lhs - rhs).abs() < 0.0001, "{lhs} != {rhs}");
+    }
+
+    let mut skeleton = Skeleton::default();
+    let root = skeleton.push_bone(BoneKind::Rigid { length: 1. });
+    let arm = skeleton.push_bone(BoneKind::Rigid { length: 1. });
+    let joint = skeleton.push_joint(Joint::new(Angle::default(), root.axis_b(), arm.axis_a()));
+
+    let animation = Animation::default().with(
+        Timeline::new(Target::Joint {
+            joint,
+            property: JointProperty::Angle,
+        })
+        .with_frame(Keyframe::new(
+            Frame::ZERO,
+            PropertyUpdate::ChangeTo(Value::from(0.)),
+        ))
+        .with_frame(Keyframe::new(
+            Frame::from(1_000),
+            PropertyUpdate::Add(Value::from(1.)),
+        )),
+    );
+
+    let mut running = animation.start();
+    assert!(!running.update(Duration::from_millis(0), &mut skeleton));
+    assert_approx_eq(skeleton[joint].angle().to_radians(), 0.);
+    assert!(!running.update(Duration::from_millis(250), &mut skeleton));
+    assert_approx_eq(skeleton[joint].angle().to_radians(), 0.25);
+    assert!(!running.update(Duration::from_millis(500), &mut skeleton));
+    assert_approx_eq(skeleton[joint].angle().to_radians(), 0.75);
+    assert!(running.update(Duration::from_millis(500), &mut skeleton));
+    assert_approx_eq(skeleton[joint].angle().to_radians(), 1.0);
+}
 
\ No newline at end of file diff --git a/main/src/funnybones/cushy.rs.html b/main/src/funnybones/cushy.rs.html index 075b18c..6bd2438 100644 --- a/main/src/funnybones/cushy.rs.html +++ b/main/src/funnybones/cushy.rs.html @@ -1,4 +1,4 @@ -cushy.rs - source
1
+cushy.rs - source
1
 2
 3
 4
diff --git a/main/src/funnybones/cushy/skeleton_canvas.rs.html b/main/src/funnybones/cushy/skeleton_canvas.rs.html
index 3ffd4e1..a84f3b1 100644
--- a/main/src/funnybones/cushy/skeleton_canvas.rs.html
+++ b/main/src/funnybones/cushy/skeleton_canvas.rs.html
@@ -1,4 +1,4 @@
-skeleton_canvas.rs - source
1
+skeleton_canvas.rs - source
1
 2
 3
 4
diff --git a/main/src/funnybones/lib.rs.html b/main/src/funnybones/lib.rs.html
index d393475..4b970b9 100644
--- a/main/src/funnybones/lib.rs.html
+++ b/main/src/funnybones/lib.rs.html
@@ -1,4 +1,4 @@
-lib.rs - source
1
+lib.rs - source
1
 2
 3
 4
@@ -948,6 +948,65 @@
 948
 949
 950
+951
+952
+953
+954
+955
+956
+957
+958
+959
+960
+961
+962
+963
+964
+965
+966
+967
+968
+969
+970
+971
+972
+973
+974
+975
+976
+977
+978
+979
+980
+981
+982
+983
+984
+985
+986
+987
+988
+989
+990
+991
+992
+993
+994
+995
+996
+997
+998
+999
+1000
+1001
+1002
+1003
+1004
+1005
+1006
+1007
+1008
+1009
 
#![doc = include_str!(".crate-docs.md")]
 
 use std::{
@@ -1217,6 +1276,14 @@
     }
 }
 
+impl Add for Vector {
+    type Output = Self;
+
+    fn add(self, rhs: Vector) -> Self::Output {
+        Vector::from(Coordinate::from(self) + Coordinate::from(rhs))
+    }
+}
+
 impl Add<Vector> for Coordinate {
     type Output = Self;
 
@@ -1297,6 +1364,25 @@
             } => *start_length + *end_length,
         }
     }
+
+    /// Returns true if this is a jointed bone that bends inversely.
+    #[must_use]
+    pub fn is_inverse(&self) -> bool {
+        match self {
+            BoneKind::Rigid { .. } => false,
+            BoneKind::Jointed { inverse, .. } => *inverse,
+        }
+    }
+
+    /// Sets whether to bend inversely.
+    ///
+    /// This function only affects a jointed bone kind.
+    pub fn set_inverse(&mut self, new_inverse: bool) {
+        let BoneKind::Jointed { inverse, .. } = self else {
+            return;
+        };
+        *inverse = new_inverse;
+    }
 }
 
 /// A [`BoneKind`] with an associated label.
@@ -1392,6 +1478,32 @@
         &self.joints
     }
 
+    /// Returns the bone for a given id, or none if not found.
+    #[must_use]
+    pub fn bone(&self, id: BoneId) -> Option<&Bone> {
+        self.bones.get(id.index())
+    }
+
+    /// Returns an exclusive reference to the bone for a given id, or none if
+    /// not found.
+    #[must_use]
+    pub fn bone_mut(&mut self, id: BoneId) -> Option<&mut Bone> {
+        self.bones.get_mut(id.index())
+    }
+
+    /// Returns the joint for a given id, or none if not found.
+    #[must_use]
+    pub fn joint(&self, id: JointId) -> Option<&Joint> {
+        self.joints.get(id.index())
+    }
+
+    /// Returns an exclusive reference to the joint for a given id, or none if
+    /// not found.
+    #[must_use]
+    pub fn joint_mut(&mut self, id: JointId) -> Option<&mut Joint> {
+        self.joints.get_mut(id.index())
+    }
+
     /// Returns a list of joints connected to a specific bone axis.
     #[must_use]
     pub fn connections_to(&self, axis: BoneAxis) -> Option<&[JointId]> {
@@ -1681,6 +1793,12 @@
         &self.kind
     }
 
+    /// Returns an exclusive reference to the kind of this bone.
+    #[must_use]
+    pub fn kind_mut(&mut self) -> &mut BoneKind {
+        &mut self.kind
+    }
+
     /// Sets a relative position to aim the end of this bone towards.
     ///
     /// The end of the bone that is aimed is the end that is furthest from the
diff --git a/main/src/funnybones/serde.rs.html b/main/src/funnybones/serde.rs.html
index ace5fe8..606893f 100644
--- a/main/src/funnybones/serde.rs.html
+++ b/main/src/funnybones/serde.rs.html
@@ -1,4 +1,4 @@
-serde.rs - source
1
+serde.rs - source
1
 2
 3
 4
diff --git a/main/static.files/main-cb0df477c2d67d00.js b/main/static.files/main-921df33f47b8780c.js
similarity index 98%
rename from main/static.files/main-cb0df477c2d67d00.js
rename to main/static.files/main-921df33f47b8780c.js
index 6357eea..c315554 100644
--- a/main/static.files/main-cb0df477c2d67d00.js
+++ b/main/static.files/main-921df33f47b8780c.js
@@ -8,4 +8,4 @@ href="https://doc.rust-lang.org/${channel}/rustdoc/read-documentation/search.htm
              your request: \"string\"","Look for functions that accept or return \
               slices and \
               arrays by writing \
-              square brackets (e.g., -> [u8] or [] -> Option)","Look for items inside another one by searching for a path: vec::Vec",].map(x=>"

"+x+"

").join("");const div_infos=document.createElement("div");addClass(div_infos,"infos");div_infos.innerHTML="

Search Tricks

"+infos;const rustdoc_version=document.createElement("span");rustdoc_version.className="bottom";const rustdoc_version_code=document.createElement("code");rustdoc_version_code.innerText="rustdoc "+getVar("rustdoc-version");rustdoc_version.appendChild(rustdoc_version_code);const container=document.createElement("div");if(!isHelpPage){container.className="popover"}container.id="help";container.style.display="none";const side_by_side=document.createElement("div");side_by_side.className="side-by-side";side_by_side.appendChild(div_shortcuts);side_by_side.appendChild(div_infos);container.appendChild(book_info);container.appendChild(side_by_side);container.appendChild(rustdoc_version);if(isHelpPage){const help_section=document.createElement("section");help_section.appendChild(container);document.getElementById("main-content").appendChild(help_section);container.style.display="block"}else{const help_button=getHelpButton();help_button.appendChild(container);container.onblur=helpBlurHandler;help_button.onblur=helpBlurHandler;help_button.children[0].onblur=helpBlurHandler}return container}window.hideAllModals=switchFocus=>{hideSidebar();window.hidePopoverMenus();hideTooltip(switchFocus)};window.hidePopoverMenus=()=>{onEachLazy(document.querySelectorAll(".search-form .popover"),elem=>{elem.style.display="none"})};function getHelpMenu(buildNeeded){let menu=getHelpButton().querySelector(".popover");if(!menu&&buildNeeded){menu=buildHelpMenu()}return menu}function showHelp(){getHelpButton().querySelector("a").focus();const menu=getHelpMenu(true);if(menu.style.display==="none"){window.hideAllModals();menu.style.display=""}}if(isHelpPage){showHelp();document.querySelector(`#${HELP_BUTTON_ID} > a`).addEventListener("click",event=>{const target=event.target;if(target.tagName!=="A"||target.parentElement.id!==HELP_BUTTON_ID||event.ctrlKey||event.altKey||event.metaKey){return}event.preventDefault()})}else{document.querySelector(`#${HELP_BUTTON_ID} > a`).addEventListener("click",event=>{const target=event.target;if(target.tagName!=="A"||target.parentElement.id!==HELP_BUTTON_ID||event.ctrlKey||event.altKey||event.metaKey){return}event.preventDefault();const menu=getHelpMenu(true);const shouldShowHelp=menu.style.display==="none";if(shouldShowHelp){showHelp()}else{window.hidePopoverMenus()}})}setMobileTopbar();addSidebarItems();addSidebarCrates();onHashChange(null);window.addEventListener("hashchange",onHashChange);searchState.setup()}());(function(){const SIDEBAR_MIN=100;const SIDEBAR_MAX=500;const RUSTDOC_MOBILE_BREAKPOINT=700;const BODY_MIN=400;const SIDEBAR_VANISH_THRESHOLD=SIDEBAR_MIN/2;const sidebarButton=document.getElementById("sidebar-button");if(sidebarButton){sidebarButton.addEventListener("click",e=>{removeClass(document.documentElement,"hide-sidebar");updateLocalStorage("hide-sidebar","false");if(document.querySelector(".rustdoc.src")){window.rustdocToggleSrcSidebar()}e.preventDefault()})}let currentPointerId=null;let desiredSidebarSize=null;let pendingSidebarResizingFrame=false;const resizer=document.querySelector(".sidebar-resizer");const sidebar=document.querySelector(".sidebar");if(!resizer||!sidebar){return}const isSrcPage=hasClass(document.body,"src");function hideSidebar(){if(isSrcPage){window.rustdocCloseSourceSidebar();updateLocalStorage("src-sidebar-width",null);document.documentElement.style.removeProperty("--src-sidebar-width");sidebar.style.removeProperty("--src-sidebar-width");resizer.style.removeProperty("--src-sidebar-width")}else{addClass(document.documentElement,"hide-sidebar");updateLocalStorage("hide-sidebar","true");updateLocalStorage("desktop-sidebar-width",null);document.documentElement.style.removeProperty("--desktop-sidebar-width");sidebar.style.removeProperty("--desktop-sidebar-width");resizer.style.removeProperty("--desktop-sidebar-width")}}function showSidebar(){if(isSrcPage){window.rustdocShowSourceSidebar()}else{removeClass(document.documentElement,"hide-sidebar");updateLocalStorage("hide-sidebar","false")}}function changeSidebarSize(size){if(isSrcPage){updateLocalStorage("src-sidebar-width",size);sidebar.style.setProperty("--src-sidebar-width",size+"px");resizer.style.setProperty("--src-sidebar-width",size+"px")}else{updateLocalStorage("desktop-sidebar-width",size);sidebar.style.setProperty("--desktop-sidebar-width",size+"px");resizer.style.setProperty("--desktop-sidebar-width",size+"px")}}function isSidebarHidden(){return isSrcPage?!hasClass(document.documentElement,"src-sidebar-expanded"):hasClass(document.documentElement,"hide-sidebar")}function resize(e){if(currentPointerId===null||currentPointerId!==e.pointerId){return}e.preventDefault();const pos=e.clientX-3;if(pos=SIDEBAR_MIN){if(isSidebarHidden()){showSidebar()}const constrainedPos=Math.min(pos,window.innerWidth-BODY_MIN,SIDEBAR_MAX);changeSidebarSize(constrainedPos);desiredSidebarSize=constrainedPos;if(pendingSidebarResizingFrame!==false){clearTimeout(pendingSidebarResizingFrame)}pendingSidebarResizingFrame=setTimeout(()=>{if(currentPointerId===null||pendingSidebarResizingFrame===false){return}pendingSidebarResizingFrame=false;document.documentElement.style.setProperty("--resizing-sidebar-width",desiredSidebarSize+"px",)},100)}}window.addEventListener("resize",()=>{if(window.innerWidth=(window.innerWidth-BODY_MIN)){changeSidebarSize(window.innerWidth-BODY_MIN)}else if(desiredSidebarSize!==null&&desiredSidebarSize>SIDEBAR_MIN){changeSidebarSize(desiredSidebarSize)}});function stopResize(e){if(currentPointerId===null){return}if(e){e.preventDefault()}desiredSidebarSize=sidebar.getBoundingClientRect().width;removeClass(resizer,"active");window.removeEventListener("pointermove",resize,false);window.removeEventListener("pointerup",stopResize,false);removeClass(document.documentElement,"sidebar-resizing");document.documentElement.style.removeProperty("--resizing-sidebar-width");if(resizer.releasePointerCapture){resizer.releasePointerCapture(currentPointerId);currentPointerId=null}}function initResize(e){if(currentPointerId!==null||e.altKey||e.ctrlKey||e.metaKey||e.button!==0){return}if(resizer.setPointerCapture){resizer.setPointerCapture(e.pointerId);if(!resizer.hasPointerCapture(e.pointerId)){resizer.releasePointerCapture(e.pointerId);return}currentPointerId=e.pointerId}window.hideAllModals(false);e.preventDefault();window.addEventListener("pointermove",resize,false);window.addEventListener("pointercancel",stopResize,false);window.addEventListener("pointerup",stopResize,false);addClass(resizer,"active");addClass(document.documentElement,"sidebar-resizing");const pos=e.clientX-sidebar.offsetLeft-3;document.documentElement.style.setProperty("--resizing-sidebar-width",pos+"px");desiredSidebarSize=null}resizer.addEventListener("pointerdown",initResize,false)}());(function(){function copyContentToClipboard(content){const el=document.createElement("textarea");el.value=content;el.setAttribute("readonly","");el.style.position="absolute";el.style.left="-9999px";document.body.appendChild(el);el.select();document.execCommand("copy");document.body.removeChild(el)}function copyButtonAnimation(button){button.classList.add("clicked");if(button.reset_button_timeout!==undefined){window.clearTimeout(button.reset_button_timeout)}button.reset_button_timeout=window.setTimeout(()=>{button.reset_button_timeout=undefined;button.classList.remove("clicked")},1000)}const but=document.getElementById("copy-path");if(!but){return}but.onclick=()=>{const parent=but.parentElement;const path=[];onEach(parent.childNodes,child=>{if(child.tagName==="A"){path.push(child.textContent)}});copyContentToClipboard(path.join("::"));copyButtonAnimation(but)};function copyCode(codeElem){if(!codeElem){return}copyContentToClipboard(codeElem.textContent)}function getExampleWrap(event){let elem=event.target;while(!hasClass(elem,"example-wrap")){if(elem===document.body||elem.tagName==="A"||elem.tagName==="BUTTON"||hasClass(elem,"docblock")){return null}elem=elem.parentElement}return elem}function addCopyButton(event){const elem=getExampleWrap(event);if(elem===null){return}elem.removeEventListener("mouseover",addCopyButton);const parent=document.createElement("div");parent.className="button-holder";const runButton=elem.querySelector(".test-arrow");if(runButton!==null){parent.appendChild(runButton)}elem.appendChild(parent);const copyButton=document.createElement("button");copyButton.className="copy-button";copyButton.title="Copy code to clipboard";copyButton.addEventListener("click",()=>{copyCode(elem.querySelector("pre > code"));copyButtonAnimation(copyButton)});parent.appendChild(copyButton)}function showHideCodeExampleButtons(event){const elem=getExampleWrap(event);if(elem===null){return}const buttons=elem.querySelector(".button-holder");if(buttons===null){return}buttons.classList.toggle("keep-visible")}onEachLazy(document.querySelectorAll(".docblock .example-wrap"),elem=>{elem.addEventListener("mouseover",addCopyButton);elem.addEventListener("click",showHideCodeExampleButtons)})}()) \ No newline at end of file + square brackets (e.g., -> [u8] or [] -> Option)","Look for items inside another one by searching for a path: vec::Vec",].map(x=>"

"+x+"

").join("");const div_infos=document.createElement("div");addClass(div_infos,"infos");div_infos.innerHTML="

Search Tricks

"+infos;const rustdoc_version=document.createElement("span");rustdoc_version.className="bottom";const rustdoc_version_code=document.createElement("code");rustdoc_version_code.innerText="rustdoc "+getVar("rustdoc-version");rustdoc_version.appendChild(rustdoc_version_code);const container=document.createElement("div");if(!isHelpPage){container.className="popover"}container.id="help";container.style.display="none";const side_by_side=document.createElement("div");side_by_side.className="side-by-side";side_by_side.appendChild(div_shortcuts);side_by_side.appendChild(div_infos);container.appendChild(book_info);container.appendChild(side_by_side);container.appendChild(rustdoc_version);if(isHelpPage){const help_section=document.createElement("section");help_section.appendChild(container);document.getElementById("main-content").appendChild(help_section);container.style.display="block"}else{const help_button=getHelpButton();help_button.appendChild(container);container.onblur=helpBlurHandler;help_button.onblur=helpBlurHandler;help_button.children[0].onblur=helpBlurHandler}return container}window.hideAllModals=switchFocus=>{hideSidebar();window.hidePopoverMenus();hideTooltip(switchFocus)};window.hidePopoverMenus=()=>{onEachLazy(document.querySelectorAll(".search-form .popover"),elem=>{elem.style.display="none"})};function getHelpMenu(buildNeeded){let menu=getHelpButton().querySelector(".popover");if(!menu&&buildNeeded){menu=buildHelpMenu()}return menu}function showHelp(){getHelpButton().querySelector("a").focus();const menu=getHelpMenu(true);if(menu.style.display==="none"){window.hideAllModals();menu.style.display=""}}if(isHelpPage){showHelp();document.querySelector(`#${HELP_BUTTON_ID} > a`).addEventListener("click",event=>{const target=event.target;if(target.tagName!=="A"||target.parentElement.id!==HELP_BUTTON_ID||event.ctrlKey||event.altKey||event.metaKey){return}event.preventDefault()})}else{document.querySelector(`#${HELP_BUTTON_ID} > a`).addEventListener("click",event=>{const target=event.target;if(target.tagName!=="A"||target.parentElement.id!==HELP_BUTTON_ID||event.ctrlKey||event.altKey||event.metaKey){return}event.preventDefault();const menu=getHelpMenu(true);const shouldShowHelp=menu.style.display==="none";if(shouldShowHelp){showHelp()}else{window.hidePopoverMenus()}})}setMobileTopbar();addSidebarItems();addSidebarCrates();onHashChange(null);window.addEventListener("hashchange",onHashChange);searchState.setup()}());(function(){const SIDEBAR_MIN=100;const SIDEBAR_MAX=500;const RUSTDOC_MOBILE_BREAKPOINT=700;const BODY_MIN=400;const SIDEBAR_VANISH_THRESHOLD=SIDEBAR_MIN/2;const sidebarButton=document.getElementById("sidebar-button");if(sidebarButton){sidebarButton.addEventListener("click",e=>{removeClass(document.documentElement,"hide-sidebar");updateLocalStorage("hide-sidebar","false");if(document.querySelector(".rustdoc.src")){window.rustdocToggleSrcSidebar()}e.preventDefault()})}let currentPointerId=null;let desiredSidebarSize=null;let pendingSidebarResizingFrame=false;const resizer=document.querySelector(".sidebar-resizer");const sidebar=document.querySelector(".sidebar");if(!resizer||!sidebar){return}const isSrcPage=hasClass(document.body,"src");function hideSidebar(){if(isSrcPage){window.rustdocCloseSourceSidebar();updateLocalStorage("src-sidebar-width",null);document.documentElement.style.removeProperty("--src-sidebar-width");sidebar.style.removeProperty("--src-sidebar-width");resizer.style.removeProperty("--src-sidebar-width")}else{addClass(document.documentElement,"hide-sidebar");updateLocalStorage("hide-sidebar","true");updateLocalStorage("desktop-sidebar-width",null);document.documentElement.style.removeProperty("--desktop-sidebar-width");sidebar.style.removeProperty("--desktop-sidebar-width");resizer.style.removeProperty("--desktop-sidebar-width")}}function showSidebar(){if(isSrcPage){window.rustdocShowSourceSidebar()}else{removeClass(document.documentElement,"hide-sidebar");updateLocalStorage("hide-sidebar","false")}}function changeSidebarSize(size){if(isSrcPage){updateLocalStorage("src-sidebar-width",size);sidebar.style.setProperty("--src-sidebar-width",size+"px");resizer.style.setProperty("--src-sidebar-width",size+"px")}else{updateLocalStorage("desktop-sidebar-width",size);sidebar.style.setProperty("--desktop-sidebar-width",size+"px");resizer.style.setProperty("--desktop-sidebar-width",size+"px")}}function isSidebarHidden(){return isSrcPage?!hasClass(document.documentElement,"src-sidebar-expanded"):hasClass(document.documentElement,"hide-sidebar")}function resize(e){if(currentPointerId===null||currentPointerId!==e.pointerId){return}e.preventDefault();const pos=e.clientX-3;if(pos=SIDEBAR_MIN){if(isSidebarHidden()){showSidebar()}const constrainedPos=Math.min(pos,window.innerWidth-BODY_MIN,SIDEBAR_MAX);changeSidebarSize(constrainedPos);desiredSidebarSize=constrainedPos;if(pendingSidebarResizingFrame!==false){clearTimeout(pendingSidebarResizingFrame)}pendingSidebarResizingFrame=setTimeout(()=>{if(currentPointerId===null||pendingSidebarResizingFrame===false){return}pendingSidebarResizingFrame=false;document.documentElement.style.setProperty("--resizing-sidebar-width",desiredSidebarSize+"px",)},100)}}window.addEventListener("resize",()=>{if(window.innerWidth=(window.innerWidth-BODY_MIN)){changeSidebarSize(window.innerWidth-BODY_MIN)}else if(desiredSidebarSize!==null&&desiredSidebarSize>SIDEBAR_MIN){changeSidebarSize(desiredSidebarSize)}});function stopResize(e){if(currentPointerId===null){return}if(e){e.preventDefault()}desiredSidebarSize=sidebar.getBoundingClientRect().width;removeClass(resizer,"active");window.removeEventListener("pointermove",resize,false);window.removeEventListener("pointerup",stopResize,false);removeClass(document.documentElement,"sidebar-resizing");document.documentElement.style.removeProperty("--resizing-sidebar-width");if(resizer.releasePointerCapture){resizer.releasePointerCapture(currentPointerId);currentPointerId=null}}function initResize(e){if(currentPointerId!==null||e.altKey||e.ctrlKey||e.metaKey||e.button!==0){return}if(resizer.setPointerCapture){resizer.setPointerCapture(e.pointerId);if(!resizer.hasPointerCapture(e.pointerId)){resizer.releasePointerCapture(e.pointerId);return}currentPointerId=e.pointerId}window.hideAllModals(false);e.preventDefault();window.addEventListener("pointermove",resize,false);window.addEventListener("pointercancel",stopResize,false);window.addEventListener("pointerup",stopResize,false);addClass(resizer,"active");addClass(document.documentElement,"sidebar-resizing");const pos=e.clientX-sidebar.offsetLeft-3;document.documentElement.style.setProperty("--resizing-sidebar-width",pos+"px");desiredSidebarSize=null}resizer.addEventListener("pointerdown",initResize,false)}());(function(){function copyContentToClipboard(content){const el=document.createElement("textarea");el.value=content;el.setAttribute("readonly","");el.style.position="absolute";el.style.left="-9999px";document.body.appendChild(el);el.select();document.execCommand("copy");document.body.removeChild(el)}function copyButtonAnimation(button){button.classList.add("clicked");if(button.reset_button_timeout!==undefined){window.clearTimeout(button.reset_button_timeout)}button.reset_button_timeout=window.setTimeout(()=>{button.reset_button_timeout=undefined;button.classList.remove("clicked")},1000)}const but=document.getElementById("copy-path");if(!but){return}but.onclick=()=>{const parent=but.parentElement;const path=[];onEach(parent.childNodes,child=>{if(child.tagName==="A"){path.push(child.textContent)}});copyContentToClipboard(path.join("::"));copyButtonAnimation(but)};function copyCode(codeElem){if(!codeElem){return}copyContentToClipboard(codeElem.textContent)}function getExampleWrap(event){let elem=event.target;while(!hasClass(elem,"example-wrap")){if(elem===document.body||elem.tagName==="A"||elem.tagName==="BUTTON"||hasClass(elem,"docblock")){return null}elem=elem.parentElement}return elem}function addCopyButton(event){const elem=getExampleWrap(event);if(elem===null){return}elem.removeEventListener("mouseover",addCopyButton);const parent=document.createElement("div");parent.className="button-holder";const runButton=elem.querySelector(".test-arrow");if(runButton!==null){parent.appendChild(runButton)}elem.appendChild(parent);const copyButton=document.createElement("button");copyButton.className="copy-button";copyButton.title="Copy code to clipboard";copyButton.addEventListener("click",()=>{copyCode(elem.querySelector("pre > code"));copyButtonAnimation(copyButton)});parent.appendChild(copyButton)}function showHideCodeExampleButtons(event){const elem=getExampleWrap(event);if(elem===null){return}let buttons=elem.querySelector(".button-holder");if(buttons===null){addCopyButton(event);buttons=elem.querySelector(".button-holder");if(buttons===null){return}}buttons.classList.toggle("keep-visible")}onEachLazy(document.querySelectorAll(".docblock .example-wrap"),elem=>{elem.addEventListener("mouseover",addCopyButton);elem.addEventListener("click",showHideCodeExampleButtons)})}()) \ No newline at end of file diff --git a/main/static.files/search-a99f1315e7cc5121.js b/main/static.files/search-a99f1315e7cc5121.js new file mode 100644 index 0000000..aee0fc7 --- /dev/null +++ b/main/static.files/search-a99f1315e7cc5121.js @@ -0,0 +1,5 @@ +"use strict";if(!Array.prototype.toSpliced){Array.prototype.toSpliced=function(){const me=this.slice();Array.prototype.splice.apply(me,arguments);return me}}(function(){const itemTypes=["keyword","primitive","mod","externcrate","import","struct","enum","fn","type","static","trait","impl","tymethod","method","structfield","variant","macro","associatedtype","constant","associatedconstant","union","foreigntype","existential","attr","derive","traitalias","generic",];const TY_GENERIC=itemTypes.indexOf("generic");const TY_IMPORT=itemTypes.indexOf("import");const ROOT_PATH=typeof window!=="undefined"?window.rootPath:"../";const UNBOXING_LIMIT=5;const REGEX_IDENT=/\p{ID_Start}\p{ID_Continue}*|_\p{ID_Continue}+/uy;const REGEX_INVALID_TYPE_FILTER=/[^a-z]/ui;const MAX_RESULTS=200;const NO_TYPE_FILTER=-1;const editDistanceState={current:[],prev:[],prevPrev:[],calculate:function calculate(a,b,limit){if(a.lengthlimit){return limit+1}while(b.length>0&&b[0]===a[0]){a=a.substring(1);b=b.substring(1)}while(b.length>0&&b[b.length-1]===a[a.length-1]){a=a.substring(0,a.length-1);b=b.substring(0,b.length-1)}if(b.length===0){return minDist}const aLength=a.length;const bLength=b.length;for(let i=0;i<=bLength;++i){this.current[i]=0;this.prev[i]=i;this.prevPrev[i]=Number.MAX_VALUE}for(let i=1;i<=aLength;++i){this.current[0]=i;const aIdx=i-1;for(let j=1;j<=bLength;++j){const bIdx=j-1;const substitutionCost=a[aIdx]===b[bIdx]?0:1;this.current[j]=Math.min(this.prev[j]+1,this.current[j-1]+1,this.prev[j-1]+substitutionCost,);if((i>1)&&(j>1)&&(a[aIdx]===b[bIdx-1])&&(a[aIdx-1]===b[bIdx])){this.current[j]=Math.min(this.current[j],this.prevPrev[j-2]+1,)}}const prevPrevTmp=this.prevPrev;this.prevPrev=this.prev;this.prev=this.current;this.current=prevPrevTmp}const distance=this.prev[bLength];return distance<=limit?distance:(limit+1)},};function editDistance(a,b,limit){return editDistanceState.calculate(a,b,limit)}function isEndCharacter(c){return"=,>-])".indexOf(c)!==-1}function isSeparatorCharacter(c){return c===","||c==="="}function isReturnArrow(parserState){return parserState.userQuery.slice(parserState.pos,parserState.pos+2)==="->"}function skipWhitespace(parserState){while(parserState.pos0){const c=parserState.userQuery[pos-1];if(c===lookingFor){return true}else if(c!==" "){break}pos-=1}return false}function isLastElemGeneric(elems,parserState){return(elems.length>0&&elems[elems.length-1].generics.length>0)||prevIs(parserState,">")}function getFilteredNextElem(query,parserState,elems,isInGenerics){const start=parserState.pos;if(parserState.userQuery[parserState.pos]===":"&&!isPathStart(parserState)){throw["Expected type filter before ",":"]}getNextElem(query,parserState,elems,isInGenerics);if(parserState.userQuery[parserState.pos]===":"&&!isPathStart(parserState)){if(parserState.typeFilter!==null){throw["Unexpected ",":"," (expected path after type filter ",parserState.typeFilter+":",")",]}if(elems.length===0){throw["Expected type filter before ",":"]}else if(query.literalSearch){throw["Cannot use quotes on type filter"]}const typeFilterElem=elems.pop();checkExtraTypeFilterCharacters(start,parserState);parserState.typeFilter=typeFilterElem.name;parserState.pos+=1;parserState.totalElems-=1;query.literalSearch=false;getNextElem(query,parserState,elems,isInGenerics)}}function getItemsBefore(query,parserState,elems,endChar){let foundStopChar=true;let foundSeparator=false;const oldTypeFilter=parserState.typeFilter;parserState.typeFilter=null;const oldIsInBinding=parserState.isInBinding;parserState.isInBinding=null;let hofParameters=null;let extra="";if(endChar===">"){extra="<"}else if(endChar==="]"){extra="["}else if(endChar===")"){extra="("}else if(endChar===""){extra="->"}else{extra=endChar}while(parserState.pos"," after ","="]}hofParameters=[...elems];elems.length=0;parserState.pos+=2;foundStopChar=true;foundSeparator=false;continue}else if(c===" "){parserState.pos+=1;continue}else if(isSeparatorCharacter(c)){parserState.pos+=1;foundStopChar=true;foundSeparator=true;continue}else if(c===":"&&isPathStart(parserState)){throw["Unexpected ","::",": paths cannot start with ","::"]}else if(isEndCharacter(c)){throw["Unexpected ",c," after ",extra]}if(!foundStopChar){let extra=[];if(isLastElemGeneric(query.elems,parserState)){extra=[" after ",">"]}else if(prevIs(parserState,"\"")){throw["Cannot have more than one element if you use quotes"]}if(endChar!==""){throw["Expected ",",",", ","=",", or ",endChar,...extra,", found ",c,]}throw["Expected ",","," or ","=",...extra,", found ",c,]}const posBefore=parserState.pos;getFilteredNextElem(query,parserState,elems,endChar!=="");if(endChar!==""&&parserState.pos>=parserState.length){throw["Unclosed ",extra]}if(posBefore===parserState.pos){parserState.pos+=1}foundStopChar=false}if(parserState.pos>=parserState.length&&endChar!==""){throw["Unclosed ",extra]}parserState.pos+=1;if(hofParameters){foundSeparator=false;if([...elems,...hofParameters].some(x=>x.bindingName)||parserState.isInBinding){throw["Unexpected ","="," within ","->"]}const hofElem=makePrimitiveElement("->",{generics:hofParameters,bindings:new Map([["output",[...elems]]]),typeFilter:null,});elems.length=0;elems[0]=hofElem}parserState.typeFilter=oldTypeFilter;parserState.isInBinding=oldIsInBinding;return{foundSeparator}}function getNextElem(query,parserState,elems,isInGenerics){const generics=[];skipWhitespace(parserState);let start=parserState.pos;let end;if("[(".indexOf(parserState.userQuery[parserState.pos])!==-1){let endChar=")";let name="()";let friendlyName="tuple";if(parserState.userQuery[parserState.pos]==="["){endChar="]";name="[]";friendlyName="slice"}parserState.pos+=1;const{foundSeparator}=getItemsBefore(query,parserState,generics,endChar);const typeFilter=parserState.typeFilter;const bindingName=parserState.isInBinding;parserState.typeFilter=null;parserState.isInBinding=null;for(const gen of generics){if(gen.bindingName!==null){throw["Type parameter ","=",` cannot be within ${friendlyName} `,name]}}if(name==="()"&&!foundSeparator&&generics.length===1&&typeFilter===null){elems.push(generics[0])}else if(name==="()"&&generics.length===1&&generics[0].name==="->"){generics[0].typeFilter=typeFilter;elems.push(generics[0])}else{if(typeFilter!==null&&typeFilter!=="primitive"){throw["Invalid search type: primitive ",name," and ",typeFilter," both specified",]}parserState.totalElems+=1;if(isInGenerics){parserState.genericsElems+=1}elems.push(makePrimitiveElement(name,{bindingName,generics}))}}else if(parserState.userQuery[parserState.pos]==="&"){if(parserState.typeFilter!==null&&parserState.typeFilter!=="primitive"){throw["Invalid search type: primitive ","&"," and ",parserState.typeFilter," both specified",]}parserState.typeFilter=null;parserState.pos+=1;let c=parserState.userQuery[parserState.pos];while(c===" "&&parserState.pos=end){throw["Found generics without a path"]}parserState.pos+=1;getItemsBefore(query,parserState,generics,">")}else if(parserState.pos=end){throw["Found generics without a path"]}if(parserState.isInBinding){throw["Unexpected ","("," after ","="]}parserState.pos+=1;const typeFilter=parserState.typeFilter;parserState.typeFilter=null;getItemsBefore(query,parserState,generics,")");skipWhitespace(parserState);if(isReturnArrow(parserState)){parserState.pos+=2;skipWhitespace(parserState);getFilteredNextElem(query,parserState,generics,isInGenerics);generics[generics.length-1].bindingName=makePrimitiveElement("output")}else{generics.push(makePrimitiveElement(null,{bindingName:makePrimitiveElement("output"),typeFilter:null,}))}parserState.typeFilter=typeFilter}if(isStringElem){skipWhitespace(parserState)}if(start>=end&&generics.length===0){return}if(parserState.userQuery[parserState.pos]==="="){if(parserState.isInBinding){throw["Cannot write ","="," twice in a binding"]}if(!isInGenerics){throw["Type parameter ","="," must be within generics list"]}const name=parserState.userQuery.slice(start,end).trim();if(name==="!"){throw["Type parameter ","="," key cannot be ","!"," never type"]}if(name.includes("!")){throw["Type parameter ","="," key cannot be ","!"," macro"]}if(name.includes("::")){throw["Type parameter ","="," key cannot contain ","::"," path"]}if(name.includes(":")){throw["Type parameter ","="," key cannot contain ",":"," type"]}parserState.isInBinding={name,generics}}else{elems.push(createQueryElement(query,parserState,parserState.userQuery.slice(start,end),generics,isInGenerics,),)}}}function checkExtraTypeFilterCharacters(start,parserState){const query=parserState.userQuery.slice(start,parserState.pos).trim();const match=query.match(REGEX_INVALID_TYPE_FILTER);if(match){throw["Unexpected ",match[0]," in type filter (before ",":",")",]}}function createQueryElement(query,parserState,name,generics,isInGenerics){const path=name.trim();if(path.length===0&&generics.length===0){throw["Unexpected ",parserState.userQuery[parserState.pos]]}if(query.literalSearch&&parserState.totalElems-parserState.genericsElems>0){throw["Cannot have more than one element if you use quotes"]}const typeFilter=parserState.typeFilter;parserState.typeFilter=null;if(name==="!"){if(typeFilter!==null&&typeFilter!=="primitive"){throw["Invalid search type: primitive never type ","!"," and ",typeFilter," both specified",]}if(generics.length!==0){throw["Never type ","!"," does not accept generic parameters",]}const bindingName=parserState.isInBinding;parserState.isInBinding=null;return makePrimitiveElement("never",{bindingName})}const quadcolon=/::\s*::/.exec(path);if(path.startsWith("::")){throw["Paths cannot start with ","::"]}else if(path.endsWith("::")){throw["Paths cannot end with ","::"]}else if(quadcolon!==null){throw["Unexpected ",quadcolon[0]]}const pathSegments=path.split(/(?:::\s*)|(?:\s+(?:::\s*)?)/);if(pathSegments.length===0||(pathSegments.length===1&&pathSegments[0]==="")){if(generics.length>0||prevIs(parserState,">")){throw["Found generics without a path"]}else{throw["Unexpected ",parserState.userQuery[parserState.pos]]}}for(const[i,pathSegment]of pathSegments.entries()){if(pathSegment==="!"){if(i!==0){throw["Never type ","!"," is not associated item"]}pathSegments[i]="never"}}parserState.totalElems+=1;if(isInGenerics){parserState.genericsElems+=1}const bindingName=parserState.isInBinding;parserState.isInBinding=null;const bindings=new Map();const pathLast=pathSegments[pathSegments.length-1];return{name:name.trim(),id:null,fullPath:pathSegments,pathWithoutLast:pathSegments.slice(0,pathSegments.length-1),pathLast,normalizedPathLast:pathLast.replace(/_/g,""),generics:generics.filter(gen=>{if(gen.bindingName!==null){if(gen.name!==null){gen.bindingName.generics.unshift(gen)}bindings.set(gen.bindingName.name,gen.bindingName.generics);return false}return true}),bindings,typeFilter,bindingName,}}function makePrimitiveElement(name,extra){return Object.assign({name,id:null,fullPath:[name],pathWithoutLast:[],pathLast:name,normalizedPathLast:name,generics:[],bindings:new Map(),typeFilter:"primitive",bindingName:null,},extra)}function getStringElem(query,parserState,isInGenerics){if(isInGenerics){throw["Unexpected ","\""," in generics"]}else if(query.literalSearch){throw["Cannot have more than one literal search element"]}else if(parserState.totalElems-parserState.genericsElems>0){throw["Cannot use literal search when there is more than one element"]}parserState.pos+=1;const start=parserState.pos;const end=getIdentEndPosition(parserState);if(parserState.pos>=parserState.length){throw["Unclosed ","\""]}else if(parserState.userQuery[end]!=="\""){throw["Unexpected ",parserState.userQuery[end]," in a string element"]}else if(start===end){throw["Cannot have empty string element"]}parserState.pos+=1;query.literalSearch=true}function getIdentEndPosition(parserState){let afterIdent=consumeIdent(parserState);let end=parserState.pos;let macroExclamation=-1;while(parserState.pos0){throw["Unexpected ",c," after ",parserState.userQuery[parserState.pos-1]," (not a valid identifier)"]}else{throw["Unexpected ",c," (not a valid identifier)"]}parserState.pos+=1;afterIdent=consumeIdent(parserState);end=parserState.pos}if(macroExclamation!==-1){if(parserState.typeFilter===null){parserState.typeFilter="macro"}else if(parserState.typeFilter!=="macro"){throw["Invalid search type: macro ","!"," and ",parserState.typeFilter," both specified",]}end=macroExclamation}return end}function isSpecialStartCharacter(c){return"<\"".indexOf(c)!==-1}function isPathStart(parserState){return parserState.userQuery.slice(parserState.pos,parserState.pos+2)==="::"}function consumeIdent(parserState){REGEX_IDENT.lastIndex=parserState.pos;const match=parserState.userQuery.match(REGEX_IDENT);if(match){parserState.pos+=match[0].length;return true}return false}function isPathSeparator(c){return c===":"||c===" "}class VlqHexDecoder{constructor(string,cons){this.string=string;this.cons=cons;this.offset=0;this.backrefQueue=[]}decodeList(){let c=this.string.charCodeAt(this.offset);const ret=[];while(c!==125){ret.push(this.decode());c=this.string.charCodeAt(this.offset)}this.offset+=1;return ret}decode(){let n=0;let c=this.string.charCodeAt(this.offset);if(c===123){this.offset+=1;return this.decodeList()}while(c<96){n=(n<<4)|(c&0xF);this.offset+=1;c=this.string.charCodeAt(this.offset)}n=(n<<4)|(c&0xF);const[sign,value]=[n&1,n>>1];this.offset+=1;return sign?-value:value}next(){const c=this.string.charCodeAt(this.offset);if(c>=48&&c<64){this.offset+=1;return this.backrefQueue[c-48]}if(c===96){this.offset+=1;return this.cons(0)}const result=this.cons(this.decode());this.backrefQueue.unshift(result);if(this.backrefQueue.length>16){this.backrefQueue.pop()}return result}}class RoaringBitmap{constructor(str){const strdecoded=atob(str);const u8array=new Uint8Array(strdecoded.length);for(let j=0;j=4){offsets=[];for(let j=0;j>3]&(1<<(j&0x7))){const runcount=(u8array[i]|(u8array[i+1]<<8));i+=2;this.containers.push(new RoaringBitmapRun(runcount,u8array.slice(i,i+(runcount*4)),));i+=runcount*4}else if(this.cardinalities[j]>=4096){this.containers.push(new RoaringBitmapBits(u8array.slice(i,i+8192)));i+=8192}else{const end=this.cardinalities[j]*2;this.containers.push(new RoaringBitmapArray(this.cardinalities[j],u8array.slice(i,i+end),));i+=end}}}contains(keyvalue){const key=keyvalue>>16;const value=keyvalue&0xFFFF;for(let i=0;i=start&&value<=(start+lenm1)){return true}}return false}}class RoaringBitmapArray{constructor(cardinality,array){this.cardinality=cardinality;this.array=array}contains(value){const l=this.cardinality*2;for(let i=0;i>3]&(1<<(value&7)))}}class DocSearch{constructor(rawSearchIndex,rootPath,searchState){this.searchIndexDeprecated=new Map();this.searchIndexEmptyDesc=new Map();this.functionTypeFingerprint=null;this.typeNameIdMap=new Map();this.ALIASES=new Map();this.rootPath=rootPath;this.searchState=searchState;this.typeNameIdOfArray=this.buildTypeMapIndex("array");this.typeNameIdOfSlice=this.buildTypeMapIndex("slice");this.typeNameIdOfArrayOrSlice=this.buildTypeMapIndex("[]");this.typeNameIdOfTuple=this.buildTypeMapIndex("tuple");this.typeNameIdOfUnit=this.buildTypeMapIndex("unit");this.typeNameIdOfTupleOrUnit=this.buildTypeMapIndex("()");this.typeNameIdOfFn=this.buildTypeMapIndex("fn");this.typeNameIdOfFnMut=this.buildTypeMapIndex("fnmut");this.typeNameIdOfFnOnce=this.buildTypeMapIndex("fnonce");this.typeNameIdOfHof=this.buildTypeMapIndex("->");this.EMPTY_BINDINGS_MAP=new Map();this.EMPTY_GENERICS_ARRAY=[];this.TYPES_POOL=new Map();this.searchIndex=this.buildIndex(rawSearchIndex)}buildTypeMapIndex(name,isAssocType){if(name===""||name===null){return null}if(this.typeNameIdMap.has(name)){const obj=this.typeNameIdMap.get(name);obj.assocOnly=isAssocType&&obj.assocOnly;return obj.id}else{const id=this.typeNameIdMap.size;this.typeNameIdMap.set(name,{id,assocOnly:isAssocType});return id}}buildItemSearchTypeAll(types,lowercasePaths){return types.length>0?types.map(type=>this.buildItemSearchType(type,lowercasePaths)):this.EMPTY_GENERICS_ARRAY}buildItemSearchType(type,lowercasePaths,isAssocType){const PATH_INDEX_DATA=0;const GENERICS_DATA=1;const BINDINGS_DATA=2;let pathIndex,generics,bindings;if(typeof type==="number"){pathIndex=type;generics=this.EMPTY_GENERICS_ARRAY;bindings=this.EMPTY_BINDINGS_MAP}else{pathIndex=type[PATH_INDEX_DATA];generics=this.buildItemSearchTypeAll(type[GENERICS_DATA],lowercasePaths,);if(type.length>BINDINGS_DATA&&type[BINDINGS_DATA].length>0){bindings=new Map(type[BINDINGS_DATA].map(binding=>{const[assocType,constraints]=binding;return[this.buildItemSearchType(assocType,lowercasePaths,true).id,this.buildItemSearchTypeAll(constraints,lowercasePaths),]}))}else{bindings=this.EMPTY_BINDINGS_MAP}}let result;if(pathIndex<0){result={id:pathIndex,ty:TY_GENERIC,path:null,exactPath:null,generics,bindings,}}else if(pathIndex===0){result={id:null,ty:null,path:null,exactPath:null,generics,bindings,}}else{const item=lowercasePaths[pathIndex-1];result={id:this.buildTypeMapIndex(item.name,isAssocType),ty:item.ty,path:item.path,exactPath:item.exactPath,generics,bindings,}}const cr=this.TYPES_POOL.get(result.id);if(cr){if(cr.generics.length===result.generics.length&&cr.generics!==result.generics&&cr.generics.every((x,i)=>result.generics[i]===x)){result.generics=cr.generics}if(cr.bindings.size===result.bindings.size&&cr.bindings!==result.bindings){let ok=true;for(const[k,v]of cr.bindings.entries()){const v2=result.bindings.get(v);if(!v2){ok=false;break}if(v!==v2&&v.length===v2.length&&v.every((x,i)=>v2[i]===x)){result.bindings.set(k,v)}else if(v!==v2){ok=false;break}}if(ok){result.bindings=cr.bindings}}if(cr.ty===result.ty&&cr.path===result.path&&cr.bindings===result.bindings&&cr.generics===result.generics&&cr.ty===result.ty){return cr}}this.TYPES_POOL.set(result.id,result);return result}buildFunctionTypeFingerprint(type,output,fps){let input=type.id;if(input===this.typeNameIdOfArray||input===this.typeNameIdOfSlice){input=this.typeNameIdOfArrayOrSlice}if(input===this.typeNameIdOfTuple||input===this.typeNameIdOfUnit){input=this.typeNameIdOfTupleOrUnit}if(input===this.typeNameIdOfFn||input===this.typeNameIdOfFnMut||input===this.typeNameIdOfFnOnce){input=this.typeNameIdOfHof}const hashint1=k=>{k=(~~k+0x7ed55d16)+(k<<12);k=(k ^ 0xc761c23c)^(k>>>19);k=(~~k+0x165667b1)+(k<<5);k=(~~k+0xd3a2646c)^(k<<9);k=(~~k+0xfd7046c5)+(k<<3);return(k ^ 0xb55a4f09)^(k>>>16)};const hashint2=k=>{k=~k+(k<<15);k ^=k>>>12;k+=k<<2;k ^=k>>>4;k=Math.imul(k,2057);return k ^(k>>16)};if(input!==null){const h0a=hashint1(input);const h0b=hashint2(input);const h1a=~~(h0a+Math.imul(h0b,2));const h1b=~~(h0a+Math.imul(h0b,3));const h2a=~~(h0a+Math.imul(h0b,4));const h2b=~~(h0a+Math.imul(h0b,5));output[0]|=(1<<(h0a%32))|(1<<(h1b%32));output[1]|=(1<<(h1a%32))|(1<<(h2b%32));output[2]|=(1<<(h2a%32))|(1<<(h0b%32));fps.add(input)}for(const g of type.generics){this.buildFunctionTypeFingerprint(g,output,fps)}const fb={id:null,ty:0,generics:this.EMPTY_GENERICS_ARRAY,bindings:this.EMPTY_BINDINGS_MAP,};for(const[k,v]of type.bindings.entries()){fb.id=k;fb.generics=v;this.buildFunctionTypeFingerprint(fb,output,fps)}output[3]=fps.size}buildIndex(rawSearchIndex){const buildFunctionSearchTypeCallback=lowercasePaths=>{return functionSearchType=>{if(functionSearchType===0){return null}const INPUTS_DATA=0;const OUTPUT_DATA=1;let inputs,output;if(typeof functionSearchType[INPUTS_DATA]==="number"){inputs=[this.buildItemSearchType(functionSearchType[INPUTS_DATA],lowercasePaths),]}else{inputs=this.buildItemSearchTypeAll(functionSearchType[INPUTS_DATA],lowercasePaths,)}if(functionSearchType.length>1){if(typeof functionSearchType[OUTPUT_DATA]==="number"){output=[this.buildItemSearchType(functionSearchType[OUTPUT_DATA],lowercasePaths,),]}else{output=this.buildItemSearchTypeAll(functionSearchType[OUTPUT_DATA],lowercasePaths,)}}else{output=[]}const where_clause=[];const l=functionSearchType.length;for(let i=2;inoop);let descShard={crate,shard:0,start:0,len:itemDescShardDecoder.next(),promise:null,resolve:null,};const descShardList=[descShard];this.searchIndexDeprecated.set(crate,new RoaringBitmap(crateCorpus.c));this.searchIndexEmptyDesc.set(crate,new RoaringBitmap(crateCorpus.e));let descIndex=0;const crateRow={crate,ty:3,name:crate,path:"",descShard,descIndex,exactPath:"",desc:crateCorpus.doc,parent:undefined,type:null,id,word:crate,normalizedName:crate.indexOf("_")===-1?crate:crate.replace(/_/g,""),bitIndex:0,implDisambiguator:null,};id+=1;searchIndex.push(crateRow);currentIndex+=1;if(!this.searchIndexEmptyDesc.get(crate).contains(0)){descIndex+=1}const itemTypes=crateCorpus.t;const itemNames=crateCorpus.n;const itemPaths=new Map(crateCorpus.q);const itemReexports=new Map(crateCorpus.r);const itemParentIdxDecoder=new VlqHexDecoder(crateCorpus.i,noop=>noop);const implDisambiguator=new Map(crateCorpus.b);const paths=crateCorpus.p;const aliases=crateCorpus.a;const lowercasePaths=[];const itemFunctionDecoder=new VlqHexDecoder(crateCorpus.f,buildFunctionSearchTypeCallback(lowercasePaths),);let len=paths.length;let lastPath=itemPaths.get(0);for(let i=0;i2){path=itemPaths.has(elem[2])?itemPaths.get(elem[2]):lastPath;lastPath=path}const exactPath=elem.length>3?itemPaths.get(elem[3]):path;lowercasePaths.push({ty,name:name.toLowerCase(),path,exactPath});paths[i]={ty,name,path,exactPath}}lastPath="";len=itemTypes.length;let lastName="";let lastWord="";for(let i=0;i=descShard.len&&!this.searchIndexEmptyDesc.get(crate).contains(bitIndex)){descShard={crate,shard:descShard.shard+1,start:descShard.start+descShard.len,len:itemDescShardDecoder.next(),promise:null,resolve:null,};descIndex=0;descShardList.push(descShard)}const name=itemNames[i]===""?lastName:itemNames[i];const word=itemNames[i]===""?lastWord:itemNames[i].toLowerCase();const path=itemPaths.has(i)?itemPaths.get(i):lastPath;const type=itemFunctionDecoder.next();if(type!==null){if(type){const fp=this.functionTypeFingerprint.subarray(id*4,(id+1)*4);const fps=new Set();for(const t of type.inputs){this.buildFunctionTypeFingerprint(t,fp,fps)}for(const t of type.output){this.buildFunctionTypeFingerprint(t,fp,fps)}for(const w of type.where_clause){for(const t of w){this.buildFunctionTypeFingerprint(t,fp,fps)}}}}const itemParentIdx=itemParentIdxDecoder.next();const row={crate,ty:itemTypes.charCodeAt(i)-65,name,path,descShard,descIndex,exactPath:itemReexports.has(i)?itemPaths.get(itemReexports.get(i)):path,parent:itemParentIdx>0?paths[itemParentIdx-1]:undefined,type,id,word,normalizedName:word.indexOf("_")===-1?word:word.replace(/_/g,""),bitIndex,implDisambiguator:implDisambiguator.has(i)?implDisambiguator.get(i):null,};id+=1;searchIndex.push(row);lastPath=row.path;if(!this.searchIndexEmptyDesc.get(crate).contains(bitIndex)){descIndex+=1}lastName=name;lastWord=word}if(aliases){const currentCrateAliases=new Map();this.ALIASES.set(crate,currentCrateAliases);for(const alias_name in aliases){if(!Object.prototype.hasOwnProperty.call(aliases,alias_name)){continue}let currentNameAliases;if(currentCrateAliases.has(alias_name)){currentNameAliases=currentCrateAliases.get(alias_name)}else{currentNameAliases=[];currentCrateAliases.set(alias_name,currentNameAliases)}for(const local_alias of aliases[alias_name]){currentNameAliases.push(local_alias+currentIndex)}}}currentIndex+=itemTypes.length;this.searchState.descShards.set(crate,descShardList)}this.TYPES_POOL=new Map();return searchIndex}static parseQuery(userQuery){function itemTypeFromName(typename){const index=itemTypes.findIndex(i=>i===typename);if(index<0){throw["Unknown type filter ",typename]}return index}function convertTypeFilterOnElem(elem){if(elem.typeFilter!==null){let typeFilter=elem.typeFilter;if(typeFilter==="const"){typeFilter="constant"}elem.typeFilter=itemTypeFromName(typeFilter)}else{elem.typeFilter=NO_TYPE_FILTER}for(const elem2 of elem.generics){convertTypeFilterOnElem(elem2)}for(const constraints of elem.bindings.values()){for(const constraint of constraints){convertTypeFilterOnElem(constraint)}}}function newParsedQuery(userQuery){return{original:userQuery,userQuery:userQuery.toLowerCase(),elems:[],returned:[],foundElems:0,totalElems:0,literalSearch:false,error:null,correction:null,proposeCorrectionFrom:null,proposeCorrectionTo:null,typeFingerprint:new Uint32Array(4),}}function parseInput(query,parserState){let foundStopChar=true;while(parserState.pos"){if(isReturnArrow(parserState)){break}throw["Unexpected ",c," (did you mean ","->","?)"]}else if(parserState.pos>0){throw["Unexpected ",c," after ",parserState.userQuery[parserState.pos-1]]}throw["Unexpected ",c]}else if(c===" "){skipWhitespace(parserState);continue}if(!foundStopChar){let extra="";if(isLastElemGeneric(query.elems,parserState)){extra=[" after ",">"]}else if(prevIs(parserState,"\"")){throw["Cannot have more than one element if you use quotes"]}if(parserState.typeFilter!==null){throw["Expected ",","," or ","->",...extra,", found ",c,]}throw["Expected ",",",", ",":"," or ","->",...extra,", found ",c,]}const before=query.elems.length;getFilteredNextElem(query,parserState,query.elems,false);if(query.elems.length===before){parserState.pos+=1}foundStopChar=false}if(parserState.typeFilter!==null){throw["Unexpected ",":"," (expected path after type filter ",parserState.typeFilter+":",")",]}while(parserState.pos"]}break}else{parserState.pos+=1}}}userQuery=userQuery.trim().replace(/\r|\n|\t/g," ");const parserState={length:userQuery.length,pos:0,totalElems:0,genericsElems:0,typeFilter:null,isInBinding:null,userQuery:userQuery.toLowerCase(),};let query=newParsedQuery(userQuery);try{parseInput(query,parserState);for(const elem of query.elems){convertTypeFilterOnElem(elem)}for(const elem of query.returned){convertTypeFilterOnElem(elem)}}catch(err){query=newParsedQuery(userQuery);query.error=err;return query}if(!query.literalSearch){query.literalSearch=parserState.totalElems>1}query.foundElems=query.elems.length+query.returned.length;query.totalElems=parserState.totalElems;return query}async execQuery(parsedQuery,filterCrates,currentCrate){const results_others=new Map(),results_in_args=new Map(),results_returned=new Map();function createQueryResults(results_in_args,results_returned,results_others,parsedQuery){return{"in_args":results_in_args,"returned":results_returned,"others":results_others,"query":parsedQuery,}}const buildHrefAndPath=item=>{let displayPath;let href;const type=itemTypes[item.ty];const name=item.name;let path=item.path;let exactPath=item.exactPath;if(type==="mod"){displayPath=path+"::";href=this.rootPath+path.replace(/::/g,"/")+"/"+name+"/index.html"}else if(type==="import"){displayPath=item.path+"::";href=this.rootPath+item.path.replace(/::/g,"/")+"/index.html#reexport."+name}else if(type==="primitive"||type==="keyword"){displayPath="";href=this.rootPath+path.replace(/::/g,"/")+"/"+type+"."+name+".html"}else if(type==="externcrate"){displayPath="";href=this.rootPath+name+"/index.html"}else if(item.parent!==undefined){const myparent=item.parent;let anchor=type+"."+name;const parentType=itemTypes[myparent.ty];let pageType=parentType;let pageName=myparent.name;exactPath=`${myparent.exactPath}::${myparent.name}`;if(parentType==="primitive"){displayPath=myparent.name+"::"}else if(type==="structfield"&&parentType==="variant"){const enumNameIdx=item.path.lastIndexOf("::");const enumName=item.path.substr(enumNameIdx+2);path=item.path.substr(0,enumNameIdx);displayPath=path+"::"+enumName+"::"+myparent.name+"::";anchor="variant."+myparent.name+".field."+name;pageType="enum";pageName=enumName}else{displayPath=path+"::"+myparent.name+"::"}if(item.implDisambiguator!==null){anchor=item.implDisambiguator+"/"+anchor}href=this.rootPath+path.replace(/::/g,"/")+"/"+pageType+"."+pageName+".html#"+anchor}else{displayPath=item.path+"::";href=this.rootPath+item.path.replace(/::/g,"/")+"/"+type+"."+name+".html"}return[displayPath,href,`${exactPath}::${name}`]};function pathSplitter(path){const tmp=""+path.replace(/::/g,"::");if(tmp.endsWith("")){return tmp.slice(0,tmp.length-6)}return tmp}const transformResults=results=>{const duplicates=new Set();const out=[];for(const result of results){if(result.id!==-1){const obj=this.searchIndex[result.id];obj.dist=result.dist;const res=buildHrefAndPath(obj);obj.displayPath=pathSplitter(res[0]);obj.fullPath=res[2]+"|"+obj.ty;if(duplicates.has(obj.fullPath)){continue}if(obj.ty===TY_IMPORT&&duplicates.has(res[2])){continue}if(duplicates.has(res[2]+"|"+TY_IMPORT)){continue}duplicates.add(obj.fullPath);duplicates.add(res[2]);obj.href=res[1];out.push(obj);if(out.length>=MAX_RESULTS){break}}}return out};const sortResults=async(results,isType,preferredCrate)=>{const userQuery=parsedQuery.userQuery;const casedUserQuery=parsedQuery.original;const result_list=[];for(const result of results.values()){result.item=this.searchIndex[result.id];result.word=this.searchIndex[result.id].word;result_list.push(result)}result_list.sort((aaa,bbb)=>{let a,b;a=(aaa.item.name!==casedUserQuery);b=(bbb.item.name!==casedUserQuery);if(a!==b){return a-b}a=(aaa.word!==userQuery);b=(bbb.word!==userQuery);if(a!==b){return a-b}a=(aaa.index<0);b=(bbb.index<0);if(a!==b){return a-b}a=aaa.path_dist;b=bbb.path_dist;if(a!==b){return a-b}a=aaa.index;b=bbb.index;if(a!==b){return a-b}a=(aaa.dist);b=(bbb.dist);if(a!==b){return a-b}a=this.searchIndexDeprecated.get(aaa.item.crate).contains(aaa.item.bitIndex);b=this.searchIndexDeprecated.get(bbb.item.crate).contains(bbb.item.bitIndex);if(a!==b){return a-b}a=(aaa.item.crate!==preferredCrate);b=(bbb.item.crate!==preferredCrate);if(a!==b){return a-b}a=aaa.word.length;b=bbb.word.length;if(a!==b){return a-b}a=aaa.word;b=bbb.word;if(a!==b){return(a>b?+1:-1)}a=this.searchIndexEmptyDesc.get(aaa.item.crate).contains(aaa.item.bitIndex);b=this.searchIndexEmptyDesc.get(bbb.item.crate).contains(bbb.item.bitIndex);if(a!==b){return a-b}a=aaa.item.ty;b=bbb.item.ty;if(a!==b){return a-b}a=aaa.item.path;b=bbb.item.path;if(a!==b){return(a>b?+1:-1)}return 0});return transformResults(result_list)};function unifyFunctionTypes(fnTypesIn,queryElems,whereClause,mgensIn,solutionCb,unboxingDepth,){if(unboxingDepth>=UNBOXING_LIMIT){return false}const mgens=mgensIn===null?null:new Map(mgensIn);if(queryElems.length===0){return!solutionCb||solutionCb(mgens)}if(!fnTypesIn||fnTypesIn.length===0){return false}const ql=queryElems.length;const fl=fnTypesIn.length;if(ql===1&&queryElems[0].generics.length===0&&queryElems[0].bindings.size===0){const queryElem=queryElems[0];for(const fnType of fnTypesIn){if(!unifyFunctionTypeIsMatchCandidate(fnType,queryElem,mgens)){continue}if(fnType.id<0&&queryElem.id<0){if(mgens&&mgens.has(fnType.id)&&mgens.get(fnType.id)!==queryElem.id){continue}const mgensScratch=new Map(mgens);mgensScratch.set(fnType.id,queryElem.id);if(!solutionCb||solutionCb(mgensScratch)){return true}}else if(!solutionCb||solutionCb(mgens?new Map(mgens):null)){return true}}for(const fnType of fnTypesIn){if(!unifyFunctionTypeIsUnboxCandidate(fnType,queryElem,whereClause,mgens,unboxingDepth+1,)){continue}if(fnType.id<0){if(mgens&&mgens.has(fnType.id)&&mgens.get(fnType.id)!==0){continue}const mgensScratch=new Map(mgens);mgensScratch.set(fnType.id,0);if(unifyFunctionTypes(whereClause[(-fnType.id)-1],queryElems,whereClause,mgensScratch,solutionCb,unboxingDepth+1,)){return true}}else if(unifyFunctionTypes([...fnType.generics,...Array.from(fnType.bindings.values()).flat()],queryElems,whereClause,mgens?new Map(mgens):null,solutionCb,unboxingDepth+1,)){return true}}return false}const fnTypes=fnTypesIn.slice();const flast=fl-1;const qlast=ql-1;const queryElem=queryElems[qlast];let queryElemsTmp=null;for(let i=flast;i>=0;i-=1){const fnType=fnTypes[i];if(!unifyFunctionTypeIsMatchCandidate(fnType,queryElem,mgens)){continue}let mgensScratch;if(fnType.id<0){mgensScratch=new Map(mgens);if(mgensScratch.has(fnType.id)&&mgensScratch.get(fnType.id)!==queryElem.id){continue}mgensScratch.set(fnType.id,queryElem.id)}else{mgensScratch=mgens}fnTypes[i]=fnTypes[flast];fnTypes.length=flast;if(!queryElemsTmp){queryElemsTmp=queryElems.slice(0,qlast)}const passesUnification=unifyFunctionTypes(fnTypes,queryElemsTmp,whereClause,mgensScratch,mgensScratch=>{if(fnType.generics.length===0&&queryElem.generics.length===0&&fnType.bindings.size===0&&queryElem.bindings.size===0){return!solutionCb||solutionCb(mgensScratch)}const solution=unifyFunctionTypeCheckBindings(fnType,queryElem,whereClause,mgensScratch,unboxingDepth,);if(!solution){return false}const simplifiedGenerics=solution.simplifiedGenerics;for(const simplifiedMgens of solution.mgens){const passesUnification=unifyFunctionTypes(simplifiedGenerics,queryElem.generics,whereClause,simplifiedMgens,solutionCb,unboxingDepth,);if(passesUnification){return true}}return false},unboxingDepth,);if(passesUnification){return true}fnTypes[flast]=fnTypes[i];fnTypes[i]=fnType;fnTypes.length=fl}for(let i=flast;i>=0;i-=1){const fnType=fnTypes[i];if(!unifyFunctionTypeIsUnboxCandidate(fnType,queryElem,whereClause,mgens,unboxingDepth+1,)){continue}let mgensScratch;if(fnType.id<0){mgensScratch=new Map(mgens);if(mgensScratch.has(fnType.id)&&mgensScratch.get(fnType.id)!==0){continue}mgensScratch.set(fnType.id,0)}else{mgensScratch=mgens}const generics=fnType.id<0?whereClause[(-fnType.id)-1]:fnType.generics;const bindings=fnType.bindings?Array.from(fnType.bindings.values()).flat():[];const passesUnification=unifyFunctionTypes(fnTypes.toSpliced(i,1,...generics,...bindings),queryElems,whereClause,mgensScratch,solutionCb,unboxingDepth+1,);if(passesUnification){return true}}return false}const unifyFunctionTypeIsMatchCandidate=(fnType,queryElem,mgensIn)=>{if(!typePassesFilter(queryElem.typeFilter,fnType.ty)){return false}if(fnType.id<0&&queryElem.id<0){if(mgensIn){if(mgensIn.has(fnType.id)&&mgensIn.get(fnType.id)!==queryElem.id){return false}for(const[fid,qid]of mgensIn.entries()){if(fnType.id!==fid&&queryElem.id===qid){return false}if(fnType.id===fid&&queryElem.id!==qid){return false}}}return true}else{if(queryElem.id===this.typeNameIdOfArrayOrSlice&&(fnType.id===this.typeNameIdOfSlice||fnType.id===this.typeNameIdOfArray)){}else if(queryElem.id===this.typeNameIdOfTupleOrUnit&&(fnType.id===this.typeNameIdOfTuple||fnType.id===this.typeNameIdOfUnit)){}else if(queryElem.id===this.typeNameIdOfHof&&(fnType.id===this.typeNameIdOfFn||fnType.id===this.typeNameIdOfFnMut||fnType.id===this.typeNameIdOfFnOnce)){}else if(fnType.id!==queryElem.id||queryElem.id===null){return false}if((fnType.generics.length+fnType.bindings.size)===0&&queryElem.generics.length!==0){return false}if(fnType.bindings.size0){const fnTypePath=fnType.path!==undefined&&fnType.path!==null?fnType.path.split("::"):[];if(queryElemPathLength>fnTypePath.length){return false}let i=0;for(const path of fnTypePath){if(path===queryElem.pathWithoutLast[i]){i+=1;if(i>=queryElemPathLength){break}}}if(i0){let mgensSolutionSet=[mgensIn];for(const[name,constraints]of queryElem.bindings.entries()){if(mgensSolutionSet.length===0){return false}if(!fnType.bindings.has(name)){return false}const fnTypeBindings=fnType.bindings.get(name);mgensSolutionSet=mgensSolutionSet.flatMap(mgens=>{const newSolutions=[];unifyFunctionTypes(fnTypeBindings,constraints,whereClause,mgens,newMgens=>{newSolutions.push(newMgens);return false},unboxingDepth,);return newSolutions})}if(mgensSolutionSet.length===0){return false}const binds=Array.from(fnType.bindings.entries()).flatMap(entry=>{const[name,constraints]=entry;if(queryElem.bindings.has(name)){return[]}else{return constraints}});if(simplifiedGenerics.length>0){simplifiedGenerics=[...simplifiedGenerics,...binds]}else{simplifiedGenerics=binds}return{simplifiedGenerics,mgens:mgensSolutionSet}}return{simplifiedGenerics,mgens:[mgensIn]}}function unifyFunctionTypeIsUnboxCandidate(fnType,queryElem,whereClause,mgens,unboxingDepth,){if(unboxingDepth>=UNBOXING_LIMIT){return false}if(fnType.id<0&&queryElem.id>=0){if(!whereClause){return false}if(mgens&&mgens.has(fnType.id)&&mgens.get(fnType.id)!==0){return false}const mgensTmp=new Map(mgens);mgensTmp.set(fnType.id,null);return checkIfInList(whereClause[(-fnType.id)-1],queryElem,whereClause,mgensTmp,unboxingDepth,)}else if(fnType.generics.length>0||fnType.bindings.size>0){const simplifiedGenerics=[...fnType.generics,...Array.from(fnType.bindings.values()).flat(),];return checkIfInList(simplifiedGenerics,queryElem,whereClause,mgens,unboxingDepth,)}return false}function checkIfInList(list,elem,whereClause,mgens,unboxingDepth){for(const entry of list){if(checkType(entry,elem,whereClause,mgens,unboxingDepth)){return true}}return false}const checkType=(row,elem,whereClause,mgens,unboxingDepth)=>{if(unboxingDepth>=UNBOXING_LIMIT){return false}if(row.bindings.size===0&&elem.bindings.size===0){if(elem.id<0&&mgens===null){return row.id<0||checkIfInList(row.generics,elem,whereClause,mgens,unboxingDepth+1,)}if(row.id>0&&elem.id>0&&elem.pathWithoutLast.length===0&&typePassesFilter(elem.typeFilter,row.ty)&&elem.generics.length===0&&elem.id!==this.typeNameIdOfArrayOrSlice&&elem.id!==this.typeNameIdOfTupleOrUnit&&elem.id!==this.typeNameIdOfHof){return row.id===elem.id||checkIfInList(row.generics,elem,whereClause,mgens,unboxingDepth,)}}return unifyFunctionTypes([row],[elem],whereClause,mgens,null,unboxingDepth)};function checkPath(contains,ty){if(contains.length===0){return 0}const maxPathEditDistance=Math.floor(contains.reduce((acc,next)=>acc+next.length,0)/3,);let ret_dist=maxPathEditDistance+1;const path=ty.path.split("::");if(ty.parent&&ty.parent.name){path.push(ty.parent.name.toLowerCase())}const length=path.length;const clength=contains.length;pathiter:for(let i=length-clength;i>=0;i-=1){let dist_total=0;for(let x=0;xmaxPathEditDistance){continue pathiter}dist_total+=dist}}ret_dist=Math.min(ret_dist,Math.round(dist_total/clength))}return ret_dist>maxPathEditDistance?null:ret_dist}function typePassesFilter(filter,type){if(filter<=NO_TYPE_FILTER||filter===type)return true;const name=itemTypes[type];switch(itemTypes[filter]){case"constant":return name==="associatedconstant";case"fn":return name==="method"||name==="tymethod";case"type":return name==="primitive"||name==="associatedtype";case"trait":return name==="traitalias"}return false}function createAliasFromItem(item){return{crate:item.crate,name:item.name,path:item.path,descShard:item.descShard,descIndex:item.descIndex,exactPath:item.exactPath,ty:item.ty,parent:item.parent,type:item.type,is_alias:true,bitIndex:item.bitIndex,implDisambiguator:item.implDisambiguator,}}const handleAliases=async(ret,query,filterCrates,currentCrate)=>{const lowerQuery=query.toLowerCase();const aliases=[];const crateAliases=[];if(filterCrates!==null){if(this.ALIASES.has(filterCrates)&&this.ALIASES.get(filterCrates).has(lowerQuery)){const query_aliases=this.ALIASES.get(filterCrates).get(lowerQuery);for(const alias of query_aliases){aliases.push(createAliasFromItem(this.searchIndex[alias]))}}}else{for(const[crate,crateAliasesIndex]of this.ALIASES){if(crateAliasesIndex.has(lowerQuery)){const pushTo=crate===currentCrate?crateAliases:aliases;const query_aliases=crateAliasesIndex.get(lowerQuery);for(const alias of query_aliases){pushTo.push(createAliasFromItem(this.searchIndex[alias]))}}}}const sortFunc=(aaa,bbb)=>{if(aaa.path{return this.searchIndexEmptyDesc.get(alias.crate).contains(alias.bitIndex)?"":this.searchState.loadDesc(alias)};const[crateDescs,descs]=await Promise.all([Promise.all(crateAliases.map(fetchDesc)),Promise.all(aliases.map(fetchDesc)),]);const pushFunc=alias=>{alias.alias=query;const res=buildHrefAndPath(alias);alias.displayPath=pathSplitter(res[0]);alias.fullPath=alias.displayPath+alias.name;alias.href=res[1];ret.others.unshift(alias);if(ret.others.length>MAX_RESULTS){ret.others.pop()}};aliases.forEach((alias,i)=>{alias.desc=descs[i]});aliases.forEach(pushFunc);crateAliases.forEach((alias,i)=>{alias.desc=crateDescs[i]});crateAliases.forEach(pushFunc)};function addIntoResults(results,fullId,id,index,dist,path_dist,maxEditDistance){if(dist<=maxEditDistance||index!==-1){if(results.has(fullId)){const result=results.get(fullId);if(result.dontValidate||result.dist<=dist){return}}results.set(fullId,{id:id,index:index,dontValidate:parsedQuery.literalSearch,dist:dist,path_dist:path_dist,})}}function handleSingleArg(row,pos,elem,results_others,results_in_args,results_returned,maxEditDistance,){if(!row||(filterCrates!==null&&row.crate!==filterCrates)){return}let path_dist=0;const fullId=row.id;const tfpDist=compareTypeFingerprints(fullId,parsedQuery.typeFingerprint,);if(tfpDist!==null){const in_args=row.type&&row.type.inputs&&checkIfInList(row.type.inputs,elem,row.type.where_clause,null,0);const returned=row.type&&row.type.output&&checkIfInList(row.type.output,elem,row.type.where_clause,null,0);if(in_args){results_in_args.max_dist=Math.max(results_in_args.max_dist||0,tfpDist);const maxDist=results_in_args.sizenormalizedIndex&&normalizedIndex!==-1)){index=normalizedIndex}if(elem.fullPath.length>1){path_dist=checkPath(elem.pathWithoutLast,row);if(path_dist===null){return}}if(parsedQuery.literalSearch){if(row.word===elem.pathLast){addIntoResults(results_others,fullId,pos,index,0,path_dist)}return}const dist=editDistance(row.normalizedName,elem.normalizedPathLast,maxEditDistance);if(index===-1&&dist>maxEditDistance){return}addIntoResults(results_others,fullId,pos,index,dist,path_dist,maxEditDistance)}function handleArgs(row,pos,results){if(!row||(filterCrates!==null&&row.crate!==filterCrates)||!row.type){return}const tfpDist=compareTypeFingerprints(row.id,parsedQuery.typeFingerprint,);if(tfpDist===null){return}if(results.size>=MAX_RESULTS&&tfpDist>results.max_dist){return}if(!unifyFunctionTypes(row.type.inputs,parsedQuery.elems,row.type.where_clause,null,mgens=>{return unifyFunctionTypes(row.type.output,parsedQuery.returned,row.type.where_clause,mgens,null,0,)},0,)){return}results.max_dist=Math.max(results.max_dist||0,tfpDist);addIntoResults(results,row.id,pos,0,tfpDist,0,Number.MAX_VALUE)}const compareTypeFingerprints=(fullId,queryFingerprint)=>{const fh0=this.functionTypeFingerprint[fullId*4];const fh1=this.functionTypeFingerprint[(fullId*4)+1];const fh2=this.functionTypeFingerprint[(fullId*4)+2];const[qh0,qh1,qh2]=queryFingerprint;const[in0,in1,in2]=[fh0&qh0,fh1&qh1,fh2&qh2];if((in0 ^ qh0)||(in1 ^ qh1)||(in2 ^ qh2)){return null}return this.functionTypeFingerprint[(fullId*4)+3]};const innerRunQuery=()=>{const queryLen=parsedQuery.elems.reduce((acc,next)=>acc+next.pathLast.length,0)+parsedQuery.returned.reduce((acc,next)=>acc+next.pathLast.length,0);const maxEditDistance=Math.floor(queryLen/3);const genericSymbols=new Map();const convertNameToId=(elem,isAssocType)=>{const loweredName=elem.pathLast.toLowerCase();if(this.typeNameIdMap.has(loweredName)&&(isAssocType||!this.typeNameIdMap.get(loweredName).assocOnly)){elem.id=this.typeNameIdMap.get(loweredName).id}else if(!parsedQuery.literalSearch){let match=null;let matchDist=maxEditDistance+1;let matchName="";for(const[name,{id,assocOnly}]of this.typeNameIdMap){const dist=Math.min(editDistance(name,loweredName,maxEditDistance),editDistance(name,elem.normalizedPathLast,maxEditDistance),);if(dist<=matchDist&&dist<=maxEditDistance&&(isAssocType||!assocOnly)){if(dist===matchDist&&matchName>name){continue}match=id;matchDist=dist;matchName=name}}if(match!==null){parsedQuery.correction=matchName}elem.id=match}if((elem.id===null&&parsedQuery.totalElems>1&&elem.typeFilter===-1&&elem.generics.length===0&&elem.bindings.size===0)||elem.typeFilter===TY_GENERIC){if(genericSymbols.has(elem.name)){elem.id=genericSymbols.get(elem.name)}else{elem.id=-(genericSymbols.size+1);genericSymbols.set(elem.name,elem.id)}if(elem.typeFilter===-1&&elem.name.length>=3){const maxPartDistance=Math.floor(elem.name.length/3);let matchDist=maxPartDistance+1;let matchName="";for(const name of this.typeNameIdMap.keys()){const dist=editDistance(name,elem.name,maxPartDistance);if(dist<=matchDist&&dist<=maxPartDistance){if(dist===matchDist&&matchName>name){continue}matchDist=dist;matchName=name}}if(matchName!==""){parsedQuery.proposeCorrectionFrom=elem.name;parsedQuery.proposeCorrectionTo=matchName}}elem.typeFilter=TY_GENERIC}if(elem.generics.length>0&&elem.typeFilter===TY_GENERIC){parsedQuery.error=["Generic type parameter ",elem.name," does not accept generic parameters",]}for(const elem2 of elem.generics){convertNameToId(elem2)}elem.bindings=new Map(Array.from(elem.bindings.entries()).map(entry=>{const[name,constraints]=entry;if(!this.typeNameIdMap.has(name)){parsedQuery.error=["Type parameter ",name," does not exist",];return[null,[]]}for(const elem2 of constraints){convertNameToId(elem2)}return[this.typeNameIdMap.get(name).id,constraints]}),)};const fps=new Set();for(const elem of parsedQuery.elems){convertNameToId(elem);this.buildFunctionTypeFingerprint(elem,parsedQuery.typeFingerprint,fps)}for(const elem of parsedQuery.returned){convertNameToId(elem);this.buildFunctionTypeFingerprint(elem,parsedQuery.typeFingerprint,fps)}if(parsedQuery.foundElems===1&&parsedQuery.returned.length===0){if(parsedQuery.elems.length===1){const elem=parsedQuery.elems[0];const length=this.searchIndex.length;for(let i=0,nSearchIndex=length;i0){const sortQ=(a,b)=>{const ag=a.generics.length===0&&a.bindings.size===0;const bg=b.generics.length===0&&b.bindings.size===0;if(ag!==bg){return ag-bg}const ai=a.id>0;const bi=b.id>0;return ai-bi};parsedQuery.elems.sort(sortQ);parsedQuery.returned.sort(sortQ);for(let i=0,nSearchIndex=this.searchIndex.length;i{const descs=await Promise.all(list.map(result=>{return this.searchIndexEmptyDesc.get(result.crate).contains(result.bitIndex)?"":this.searchState.loadDesc(result)}));for(const[i,result]of list.entries()){result.desc=descs[i]}}));if(parsedQuery.error!==null&&ret.others.length!==0){ret.query.error=null}return ret}}let rawSearchIndex;let docSearch;const longItemTypes=["keyword","primitive type","module","extern crate","re-export","struct","enum","function","type alias","static","trait","","trait method","method","struct field","enum variant","macro","assoc type","constant","assoc const","union","foreign type","existential type","attribute macro","derive macro","trait alias",];let currentResults;function printTab(nb){let iter=0;let foundCurrentTab=false;let foundCurrentResultSet=false;onEachLazy(document.getElementById("search-tabs").childNodes,elem=>{if(nb===iter){addClass(elem,"selected");foundCurrentTab=true}else{removeClass(elem,"selected")}iter+=1});const isTypeSearch=(nb>0||iter===1);iter=0;onEachLazy(document.getElementById("results").childNodes,elem=>{if(nb===iter){addClass(elem,"active");foundCurrentResultSet=true}else{removeClass(elem,"active")}iter+=1});if(foundCurrentTab&&foundCurrentResultSet){searchState.currentTab=nb;const correctionsElem=document.getElementsByClassName("search-corrections");if(isTypeSearch){removeClass(correctionsElem[0],"hidden")}else{addClass(correctionsElem[0],"hidden")}}else if(nb!==0){printTab(0)}}function buildUrl(search,filterCrates){let extra="?search="+encodeURIComponent(search);if(filterCrates!==null){extra+="&filter-crate="+encodeURIComponent(filterCrates)}return getNakedUrl()+extra+window.location.hash}function getFilterCrates(){const elem=document.getElementById("crate-search");if(elem&&elem.value!=="all crates"&&window.searchIndex.has(elem.value)){return elem.value}return null}function nextTab(direction){const next=(searchState.currentTab+direction+3)%searchState.focusedByTab.length;searchState.focusedByTab[searchState.currentTab]=document.activeElement;printTab(next);focusSearchResult()}function focusSearchResult(){const target=searchState.focusedByTab[searchState.currentTab]||document.querySelectorAll(".search-results.active a").item(0)||document.querySelectorAll("#search-tabs button").item(searchState.currentTab);searchState.focusedByTab[searchState.currentTab]=null;if(target){target.focus()}}async function addTab(array,query,display){const extraClass=display?" active":"";const output=document.createElement("div");if(array.length>0){output.className="search-results "+extraClass;for(const item of array){const name=item.name;const type=itemTypes[item.ty];const longType=longItemTypes[item.ty];const typeName=longType.length!==0?`${longType}`:"?";const link=document.createElement("a");link.className="result-"+type;link.href=item.href;const resultName=document.createElement("div");resultName.className="result-name";resultName.insertAdjacentHTML("beforeend",`${typeName}`);link.appendChild(resultName);let alias=" ";if(item.is_alias){alias=`
\ +${item.alias} - see \ +
`}resultName.insertAdjacentHTML("beforeend",`
${alias}\ +${item.displayPath}${name}\ +
`);const description=document.createElement("div");description.className="desc";description.insertAdjacentHTML("beforeend",item.desc);link.appendChild(description);output.appendChild(link)}}else if(query.error===null){output.className="search-failed"+extraClass;output.innerHTML="No results :(
"+"Try on DuckDuckGo?

"+"Or try looking in one of these:"}return[output,array.length]}function makeTabHeader(tabNb,text,nbElems){const fmtNbElems=nbElems<10?`\u{2007}(${nbElems})\u{2007}\u{2007}`:nbElems<100?`\u{2007}(${nbElems})\u{2007}`:`\u{2007}(${nbElems})`;if(searchState.currentTab===tabNb){return""}return""}async function showResults(results,go_to_first,filterCrates){const search=searchState.outputElement();if(go_to_first||(results.others.length===1&&getSettingValue("go-to-only-result")==="true")){window.onunload=()=>{};searchState.removeQueryParameters();const elem=document.createElement("a");elem.href=results.others[0].href;removeClass(elem,"active");document.body.appendChild(elem);elem.click();return}if(results.query===undefined){results.query=DocSearch.parseQuery(searchState.input.value)}currentResults=results.query.userQuery;const[ret_others,ret_in_args,ret_returned]=await Promise.all([addTab(results.others,results.query,true),addTab(results.in_args,results.query,false),addTab(results.returned,results.query,false),]);let currentTab=searchState.currentTab;if((currentTab===0&&ret_others[1]===0)||(currentTab===1&&ret_in_args[1]===0)||(currentTab===2&&ret_returned[1]===0)){if(ret_others[1]!==0){currentTab=0}else if(ret_in_args[1]!==0){currentTab=1}else if(ret_returned[1]!==0){currentTab=2}}let crates="";if(rawSearchIndex.size>1){crates=" in 
"}let output=`

Results${crates}

`;if(results.query.error!==null){const error=results.query.error;error.forEach((value,index)=>{value=value.split("<").join("<").split(">").join(">");if(index%2!==0){error[index]=`${value.replaceAll(" ", " ")}`}else{error[index]=value}});output+=`

Query parser error: "${error.join("")}".

`;output+="
"+makeTabHeader(0,"In Names",ret_others[1])+"
";currentTab=0}else if(results.query.foundElems<=1&&results.query.returned.length===0){output+="
"+makeTabHeader(0,"In Names",ret_others[1])+makeTabHeader(1,"In Parameters",ret_in_args[1])+makeTabHeader(2,"In Return Types",ret_returned[1])+"
"}else{const signatureTabTitle=results.query.elems.length===0?"In Function Return Types":results.query.returned.length===0?"In Function Parameters":"In Function Signatures";output+="
"+makeTabHeader(0,signatureTabTitle,ret_others[1])+"
";currentTab=0}if(results.query.correction!==null){const orig=results.query.returned.length>0?results.query.returned[0].name:results.query.elems[0].name;output+="

"+`Type "${orig}" not found. `+"Showing results for closest type name "+`"${results.query.correction}" instead.

`}if(results.query.proposeCorrectionFrom!==null){const orig=results.query.proposeCorrectionFrom;const targ=results.query.proposeCorrectionTo;output+="

"+`Type "${orig}" not found and used as generic parameter. `+`Consider searching for "${targ}" instead.

`}const resultsElem=document.createElement("div");resultsElem.id="results";resultsElem.appendChild(ret_others[0]);resultsElem.appendChild(ret_in_args[0]);resultsElem.appendChild(ret_returned[0]);search.innerHTML=output;const crateSearch=document.getElementById("crate-search");if(crateSearch){crateSearch.addEventListener("input",updateCrate)}search.appendChild(resultsElem);searchState.showResults(search);const elems=document.getElementById("search-tabs").childNodes;searchState.focusedByTab=[];let i=0;for(const elem of elems){const j=i;elem.onclick=()=>printTab(j);searchState.focusedByTab.push(null);i+=1}printTab(currentTab)}function updateSearchHistory(url){if(!browserSupportsHistoryApi()){return}const params=searchState.getQueryStringParams();if(!history.state&&!params.search){history.pushState(null,"",url)}else{history.replaceState(null,"",url)}}async function search(forced){const query=DocSearch.parseQuery(searchState.input.value.trim());let filterCrates=getFilterCrates();if(!forced&&query.userQuery===currentResults){if(query.userQuery.length>0){putBackSearch()}return}searchState.setLoadingSearch();const params=searchState.getQueryStringParams();if(filterCrates===null&¶ms["filter-crate"]!==undefined){filterCrates=params["filter-crate"]}searchState.title="\""+query.original+"\" Search - Rust";updateSearchHistory(buildUrl(query.original,filterCrates));await showResults(await docSearch.execQuery(query,filterCrates,window.currentCrate),params.go_to_first,filterCrates)}function onSearchSubmit(e){e.preventDefault();searchState.clearInputTimeout();search()}function putBackSearch(){const search_input=searchState.input;if(!searchState.input){return}if(search_input.value!==""&&!searchState.isDisplayed()){searchState.showResults();if(browserSupportsHistoryApi()){history.replaceState(null,"",buildUrl(search_input.value,getFilterCrates()))}document.title=searchState.title}}function registerSearchEvents(){const params=searchState.getQueryStringParams();if(searchState.input.value===""){searchState.input.value=params.search||""}const searchAfter500ms=()=>{searchState.clearInputTimeout();if(searchState.input.value.length===0){searchState.hideResults()}else{searchState.timeout=setTimeout(search,500)}};searchState.input.onkeyup=searchAfter500ms;searchState.input.oninput=searchAfter500ms;document.getElementsByClassName("search-form")[0].onsubmit=onSearchSubmit;searchState.input.onchange=e=>{if(e.target!==document.activeElement){return}searchState.clearInputTimeout();setTimeout(search,0)};searchState.input.onpaste=searchState.input.onchange;searchState.outputElement().addEventListener("keydown",e=>{if(e.altKey||e.ctrlKey||e.shiftKey||e.metaKey){return}if(e.which===38){const previous=document.activeElement.previousElementSibling;if(previous){previous.focus()}else{searchState.focus()}e.preventDefault()}else if(e.which===40){const next=document.activeElement.nextElementSibling;if(next){next.focus()}const rect=document.activeElement.getBoundingClientRect();if(window.innerHeight-rect.bottom{if(e.which===40){focusSearchResult();e.preventDefault()}});searchState.input.addEventListener("focus",()=>{putBackSearch()});searchState.input.addEventListener("blur",()=>{searchState.input.placeholder=searchState.input.origPlaceholder});if(browserSupportsHistoryApi()){const previousTitle=document.title;window.addEventListener("popstate",e=>{const params=searchState.getQueryStringParams();document.title=previousTitle;currentResults=null;if(params.search&¶ms.search.length>0){searchState.input.value=params.search;e.preventDefault();search()}else{searchState.input.value="";searchState.hideResults()}})}window.onpageshow=()=>{const qSearch=searchState.getQueryStringParams().search;if(searchState.input.value===""&&qSearch){searchState.input.value=qSearch}search()}}function updateCrate(ev){if(ev.target.value==="all crates"){const query=searchState.input.value.trim();updateSearchHistory(buildUrl(query,null))}currentResults=null;search(true)}function initSearch(searchIndx){rawSearchIndex=searchIndx;if(typeof window!=="undefined"){docSearch=new DocSearch(rawSearchIndex,ROOT_PATH,searchState);registerSearchEvents();if(window.searchState.getQueryStringParams().search){search()}}else if(typeof exports!=="undefined"){docSearch=new DocSearch(rawSearchIndex,ROOT_PATH,searchState);exports.docSearch=docSearch;exports.parseQuery=DocSearch.parseQuery}}if(typeof exports!=="undefined"){exports.initSearch=initSearch}if(typeof window!=="undefined"){window.initSearch=initSearch;if(window.searchIndex!==undefined){initSearch(window.searchIndex)}}else{initSearch(new Map())}})() \ No newline at end of file diff --git a/main/static.files/search-acd2e111c9cb27e3.js b/main/static.files/search-acd2e111c9cb27e3.js deleted file mode 100644 index 6818530..0000000 --- a/main/static.files/search-acd2e111c9cb27e3.js +++ /dev/null @@ -1,5 +0,0 @@ -"use strict";if(!Array.prototype.toSpliced){Array.prototype.toSpliced=function(){const me=this.slice();Array.prototype.splice.apply(me,arguments);return me}}(function(){const itemTypes=["keyword","primitive","mod","externcrate","import","struct","enum","fn","type","static","trait","impl","tymethod","method","structfield","variant","macro","associatedtype","constant","associatedconstant","union","foreigntype","existential","attr","derive","traitalias","generic",];const longItemTypes=["keyword","primitive type","module","extern crate","re-export","struct","enum","function","type alias","static","trait","","trait method","method","struct field","enum variant","macro","assoc type","constant","assoc const","union","foreign type","existential type","attribute macro","derive macro","trait alias",];const TY_GENERIC=itemTypes.indexOf("generic");const TY_IMPORT=itemTypes.indexOf("import");const ROOT_PATH=typeof window!=="undefined"?window.rootPath:"../";const UNBOXING_LIMIT=5;const REGEX_IDENT=/\p{ID_Start}\p{ID_Continue}*|_\p{ID_Continue}+/uy;const REGEX_INVALID_TYPE_FILTER=/[^a-z]/ui;function printTab(nb){let iter=0;let foundCurrentTab=false;let foundCurrentResultSet=false;onEachLazy(document.getElementById("search-tabs").childNodes,elem=>{if(nb===iter){addClass(elem,"selected");foundCurrentTab=true}else{removeClass(elem,"selected")}iter+=1});const isTypeSearch=(nb>0||iter===1);iter=0;onEachLazy(document.getElementById("results").childNodes,elem=>{if(nb===iter){addClass(elem,"active");foundCurrentResultSet=true}else{removeClass(elem,"active")}iter+=1});if(foundCurrentTab&&foundCurrentResultSet){searchState.currentTab=nb;const correctionsElem=document.getElementsByClassName("search-corrections");if(isTypeSearch){removeClass(correctionsElem[0],"hidden")}else{addClass(correctionsElem[0],"hidden")}}else if(nb!==0){printTab(0)}}const editDistanceState={current:[],prev:[],prevPrev:[],calculate:function calculate(a,b,limit){if(a.lengthlimit){return limit+1}while(b.length>0&&b[0]===a[0]){a=a.substring(1);b=b.substring(1)}while(b.length>0&&b[b.length-1]===a[a.length-1]){a=a.substring(0,a.length-1);b=b.substring(0,b.length-1)}if(b.length===0){return minDist}const aLength=a.length;const bLength=b.length;for(let i=0;i<=bLength;++i){this.current[i]=0;this.prev[i]=i;this.prevPrev[i]=Number.MAX_VALUE}for(let i=1;i<=aLength;++i){this.current[0]=i;const aIdx=i-1;for(let j=1;j<=bLength;++j){const bIdx=j-1;const substitutionCost=a[aIdx]===b[bIdx]?0:1;this.current[j]=Math.min(this.prev[j]+1,this.current[j-1]+1,this.prev[j-1]+substitutionCost,);if((i>1)&&(j>1)&&(a[aIdx]===b[bIdx-1])&&(a[aIdx-1]===b[bIdx])){this.current[j]=Math.min(this.current[j],this.prevPrev[j-2]+1,)}}const prevPrevTmp=this.prevPrev;this.prevPrev=this.prev;this.prev=this.current;this.current=prevPrevTmp}const distance=this.prev[bLength];return distance<=limit?distance:(limit+1)},};function editDistance(a,b,limit){return editDistanceState.calculate(a,b,limit)}function initSearch(rawSearchIndex){const MAX_RESULTS=200;const NO_TYPE_FILTER=-1;let searchIndex;let searchIndexDeprecated;let searchIndexEmptyDesc;let functionTypeFingerprint;let currentResults;const typeNameIdMap=new Map();const ALIASES=new Map();const typeNameIdOfArray=buildTypeMapIndex("array");const typeNameIdOfSlice=buildTypeMapIndex("slice");const typeNameIdOfArrayOrSlice=buildTypeMapIndex("[]");const typeNameIdOfTuple=buildTypeMapIndex("tuple");const typeNameIdOfUnit=buildTypeMapIndex("unit");const typeNameIdOfTupleOrUnit=buildTypeMapIndex("()");const typeNameIdOfFn=buildTypeMapIndex("fn");const typeNameIdOfFnMut=buildTypeMapIndex("fnmut");const typeNameIdOfFnOnce=buildTypeMapIndex("fnonce");const typeNameIdOfHof=buildTypeMapIndex("->");function buildTypeMapIndex(name,isAssocType){if(name===""||name===null){return null}if(typeNameIdMap.has(name)){const obj=typeNameIdMap.get(name);obj.assocOnly=isAssocType&&obj.assocOnly;return obj.id}else{const id=typeNameIdMap.size;typeNameIdMap.set(name,{id,assocOnly:isAssocType});return id}}function isSpecialStartCharacter(c){return"<\"".indexOf(c)!==-1}function isEndCharacter(c){return"=,>-])".indexOf(c)!==-1}function itemTypeFromName(typename){const index=itemTypes.findIndex(i=>i===typename);if(index<0){throw["Unknown type filter ",typename]}return index}function getStringElem(query,parserState,isInGenerics){if(isInGenerics){throw["Unexpected ","\""," in generics"]}else if(query.literalSearch){throw["Cannot have more than one literal search element"]}else if(parserState.totalElems-parserState.genericsElems>0){throw["Cannot use literal search when there is more than one element"]}parserState.pos+=1;const start=parserState.pos;const end=getIdentEndPosition(parserState);if(parserState.pos>=parserState.length){throw["Unclosed ","\""]}else if(parserState.userQuery[end]!=="\""){throw["Unexpected ",parserState.userQuery[end]," in a string element"]}else if(start===end){throw["Cannot have empty string element"]}parserState.pos+=1;query.literalSearch=true}function isPathStart(parserState){return parserState.userQuery.slice(parserState.pos,parserState.pos+2)==="::"}function isReturnArrow(parserState){return parserState.userQuery.slice(parserState.pos,parserState.pos+2)==="->"}function consumeIdent(parserState){REGEX_IDENT.lastIndex=parserState.pos;const match=parserState.userQuery.match(REGEX_IDENT);if(match){parserState.pos+=match[0].length;return true}return false}function isSeparatorCharacter(c){return c===","||c==="="}function isPathSeparator(c){return c===":"||c===" "}function prevIs(parserState,lookingFor){let pos=parserState.pos;while(pos>0){const c=parserState.userQuery[pos-1];if(c===lookingFor){return true}else if(c!==" "){break}pos-=1}return false}function isLastElemGeneric(elems,parserState){return(elems.length>0&&elems[elems.length-1].generics.length>0)||prevIs(parserState,">")}function skipWhitespace(parserState){while(parserState.pos0){throw["Cannot have more than one element if you use quotes"]}const typeFilter=parserState.typeFilter;parserState.typeFilter=null;if(name==="!"){if(typeFilter!==null&&typeFilter!=="primitive"){throw["Invalid search type: primitive never type ","!"," and ",typeFilter," both specified",]}if(generics.length!==0){throw["Never type ","!"," does not accept generic parameters",]}const bindingName=parserState.isInBinding;parserState.isInBinding=null;return makePrimitiveElement("never",{bindingName})}const quadcolon=/::\s*::/.exec(path);if(path.startsWith("::")){throw["Paths cannot start with ","::"]}else if(path.endsWith("::")){throw["Paths cannot end with ","::"]}else if(quadcolon!==null){throw["Unexpected ",quadcolon[0]]}const pathSegments=path.split(/(?:::\s*)|(?:\s+(?:::\s*)?)/);if(pathSegments.length===0||(pathSegments.length===1&&pathSegments[0]==="")){if(generics.length>0||prevIs(parserState,">")){throw["Found generics without a path"]}else{throw["Unexpected ",parserState.userQuery[parserState.pos]]}}for(const[i,pathSegment]of pathSegments.entries()){if(pathSegment==="!"){if(i!==0){throw["Never type ","!"," is not associated item"]}pathSegments[i]="never"}}parserState.totalElems+=1;if(isInGenerics){parserState.genericsElems+=1}const bindingName=parserState.isInBinding;parserState.isInBinding=null;const bindings=new Map();const pathLast=pathSegments[pathSegments.length-1];return{name:name.trim(),id:null,fullPath:pathSegments,pathWithoutLast:pathSegments.slice(0,pathSegments.length-1),pathLast,normalizedPathLast:pathLast.replace(/_/g,""),generics:generics.filter(gen=>{if(gen.bindingName!==null){if(gen.name!==null){gen.bindingName.generics.unshift(gen)}bindings.set(gen.bindingName.name,gen.bindingName.generics);return false}return true}),bindings,typeFilter,bindingName,}}function getIdentEndPosition(parserState){let afterIdent=consumeIdent(parserState);let end=parserState.pos;let macroExclamation=-1;while(parserState.pos0){throw["Unexpected ",c," after ",parserState.userQuery[parserState.pos-1]," (not a valid identifier)"]}else{throw["Unexpected ",c," (not a valid identifier)"]}parserState.pos+=1;afterIdent=consumeIdent(parserState);end=parserState.pos}if(macroExclamation!==-1){if(parserState.typeFilter===null){parserState.typeFilter="macro"}else if(parserState.typeFilter!=="macro"){throw["Invalid search type: macro ","!"," and ",parserState.typeFilter," both specified",]}end=macroExclamation}return end}function getFilteredNextElem(query,parserState,elems,isInGenerics){const start=parserState.pos;if(parserState.userQuery[parserState.pos]===":"&&!isPathStart(parserState)){throw["Expected type filter before ",":"]}getNextElem(query,parserState,elems,isInGenerics);if(parserState.userQuery[parserState.pos]===":"&&!isPathStart(parserState)){if(parserState.typeFilter!==null){throw["Unexpected ",":"," (expected path after type filter ",parserState.typeFilter+":",")",]}if(elems.length===0){throw["Expected type filter before ",":"]}else if(query.literalSearch){throw["Cannot use quotes on type filter"]}const typeFilterElem=elems.pop();checkExtraTypeFilterCharacters(start,parserState);parserState.typeFilter=typeFilterElem.name;parserState.pos+=1;parserState.totalElems-=1;query.literalSearch=false;getNextElem(query,parserState,elems,isInGenerics)}}function getNextElem(query,parserState,elems,isInGenerics){const generics=[];skipWhitespace(parserState);let start=parserState.pos;let end;if("[(".indexOf(parserState.userQuery[parserState.pos])!==-1){let endChar=")";let name="()";let friendlyName="tuple";if(parserState.userQuery[parserState.pos]==="["){endChar="]";name="[]";friendlyName="slice"}parserState.pos+=1;const{foundSeparator}=getItemsBefore(query,parserState,generics,endChar);const typeFilter=parserState.typeFilter;const bindingName=parserState.isInBinding;parserState.typeFilter=null;parserState.isInBinding=null;for(const gen of generics){if(gen.bindingName!==null){throw["Type parameter ","=",` cannot be within ${friendlyName} `,name]}}if(name==="()"&&!foundSeparator&&generics.length===1&&typeFilter===null){elems.push(generics[0])}else if(name==="()"&&generics.length===1&&generics[0].name==="->"){generics[0].typeFilter=typeFilter;elems.push(generics[0])}else{if(typeFilter!==null&&typeFilter!=="primitive"){throw["Invalid search type: primitive ",name," and ",typeFilter," both specified",]}parserState.totalElems+=1;if(isInGenerics){parserState.genericsElems+=1}elems.push(makePrimitiveElement(name,{bindingName,generics}))}}else if(parserState.userQuery[parserState.pos]==="&"){if(parserState.typeFilter!==null&&parserState.typeFilter!=="primitive"){throw["Invalid search type: primitive ","&"," and ",parserState.typeFilter," both specified",]}parserState.typeFilter=null;parserState.pos+=1;let c=parserState.userQuery[parserState.pos];while(c===" "&&parserState.pos=end){throw["Found generics without a path"]}parserState.pos+=1;getItemsBefore(query,parserState,generics,">")}else if(parserState.pos=end){throw["Found generics without a path"]}if(parserState.isInBinding){throw["Unexpected ","("," after ","="]}parserState.pos+=1;const typeFilter=parserState.typeFilter;parserState.typeFilter=null;getItemsBefore(query,parserState,generics,")");skipWhitespace(parserState);if(isReturnArrow(parserState)){parserState.pos+=2;skipWhitespace(parserState);getFilteredNextElem(query,parserState,generics,isInGenerics);generics[generics.length-1].bindingName=makePrimitiveElement("output")}else{generics.push(makePrimitiveElement(null,{bindingName:makePrimitiveElement("output"),typeFilter:null,}))}parserState.typeFilter=typeFilter}if(isStringElem){skipWhitespace(parserState)}if(start>=end&&generics.length===0){return}if(parserState.userQuery[parserState.pos]==="="){if(parserState.isInBinding){throw["Cannot write ","="," twice in a binding"]}if(!isInGenerics){throw["Type parameter ","="," must be within generics list"]}const name=parserState.userQuery.slice(start,end).trim();if(name==="!"){throw["Type parameter ","="," key cannot be ","!"," never type"]}if(name.includes("!")){throw["Type parameter ","="," key cannot be ","!"," macro"]}if(name.includes("::")){throw["Type parameter ","="," key cannot contain ","::"," path"]}if(name.includes(":")){throw["Type parameter ","="," key cannot contain ",":"," type"]}parserState.isInBinding={name,generics}}else{elems.push(createQueryElement(query,parserState,parserState.userQuery.slice(start,end),generics,isInGenerics,),)}}}function getItemsBefore(query,parserState,elems,endChar){let foundStopChar=true;let foundSeparator=false;const oldTypeFilter=parserState.typeFilter;parserState.typeFilter=null;const oldIsInBinding=parserState.isInBinding;parserState.isInBinding=null;let hofParameters=null;let extra="";if(endChar===">"){extra="<"}else if(endChar==="]"){extra="["}else if(endChar===")"){extra="("}else if(endChar===""){extra="->"}else{extra=endChar}while(parserState.pos"," after ","="]}hofParameters=[...elems];elems.length=0;parserState.pos+=2;foundStopChar=true;foundSeparator=false;continue}else if(c===" "){parserState.pos+=1;continue}else if(isSeparatorCharacter(c)){parserState.pos+=1;foundStopChar=true;foundSeparator=true;continue}else if(c===":"&&isPathStart(parserState)){throw["Unexpected ","::",": paths cannot start with ","::"]}else if(isEndCharacter(c)){throw["Unexpected ",c," after ",extra]}if(!foundStopChar){let extra=[];if(isLastElemGeneric(query.elems,parserState)){extra=[" after ",">"]}else if(prevIs(parserState,"\"")){throw["Cannot have more than one element if you use quotes"]}if(endChar!==""){throw["Expected ",",",", ","=",", or ",endChar,...extra,", found ",c,]}throw["Expected ",","," or ","=",...extra,", found ",c,]}const posBefore=parserState.pos;getFilteredNextElem(query,parserState,elems,endChar!=="");if(endChar!==""&&parserState.pos>=parserState.length){throw["Unclosed ",extra]}if(posBefore===parserState.pos){parserState.pos+=1}foundStopChar=false}if(parserState.pos>=parserState.length&&endChar!==""){throw["Unclosed ",extra]}parserState.pos+=1;if(hofParameters){foundSeparator=false;if([...elems,...hofParameters].some(x=>x.bindingName)||parserState.isInBinding){throw["Unexpected ","="," within ","->"]}const hofElem=makePrimitiveElement("->",{generics:hofParameters,bindings:new Map([["output",[...elems]]]),typeFilter:null,});elems.length=0;elems[0]=hofElem}parserState.typeFilter=oldTypeFilter;parserState.isInBinding=oldIsInBinding;return{foundSeparator}}function checkExtraTypeFilterCharacters(start,parserState){const query=parserState.userQuery.slice(start,parserState.pos).trim();const match=query.match(REGEX_INVALID_TYPE_FILTER);if(match){throw["Unexpected ",match[0]," in type filter (before ",":",")",]}}function parseInput(query,parserState){let foundStopChar=true;while(parserState.pos"){if(isReturnArrow(parserState)){break}throw["Unexpected ",c," (did you mean ","->","?)"]}else if(parserState.pos>0){throw["Unexpected ",c," after ",parserState.userQuery[parserState.pos-1]]}throw["Unexpected ",c]}else if(c===" "){skipWhitespace(parserState);continue}if(!foundStopChar){let extra="";if(isLastElemGeneric(query.elems,parserState)){extra=[" after ",">"]}else if(prevIs(parserState,"\"")){throw["Cannot have more than one element if you use quotes"]}if(parserState.typeFilter!==null){throw["Expected ",","," or ","->",...extra,", found ",c,]}throw["Expected ",",",", ",":"," or ","->",...extra,", found ",c,]}const before=query.elems.length;getFilteredNextElem(query,parserState,query.elems,false);if(query.elems.length===before){parserState.pos+=1}foundStopChar=false}if(parserState.typeFilter!==null){throw["Unexpected ",":"," (expected path after type filter ",parserState.typeFilter+":",")",]}while(parserState.pos"]}break}else{parserState.pos+=1}}}function newParsedQuery(userQuery){return{original:userQuery,userQuery:userQuery.toLowerCase(),elems:[],returned:[],foundElems:0,totalElems:0,literalSearch:false,error:null,correction:null,proposeCorrectionFrom:null,proposeCorrectionTo:null,typeFingerprint:new Uint32Array(4),}}function buildUrl(search,filterCrates){let extra="?search="+encodeURIComponent(search);if(filterCrates!==null){extra+="&filter-crate="+encodeURIComponent(filterCrates)}return getNakedUrl()+extra+window.location.hash}function getFilterCrates(){const elem=document.getElementById("crate-search");if(elem&&elem.value!=="all crates"&&rawSearchIndex.has(elem.value)){return elem.value}return null}function parseQuery(userQuery){function convertTypeFilterOnElem(elem){if(elem.typeFilter!==null){let typeFilter=elem.typeFilter;if(typeFilter==="const"){typeFilter="constant"}elem.typeFilter=itemTypeFromName(typeFilter)}else{elem.typeFilter=NO_TYPE_FILTER}for(const elem2 of elem.generics){convertTypeFilterOnElem(elem2)}for(const constraints of elem.bindings.values()){for(const constraint of constraints){convertTypeFilterOnElem(constraint)}}}userQuery=userQuery.trim().replace(/\r|\n|\t/g," ");const parserState={length:userQuery.length,pos:0,totalElems:0,genericsElems:0,typeFilter:null,isInBinding:null,userQuery:userQuery.toLowerCase(),};let query=newParsedQuery(userQuery);try{parseInput(query,parserState);for(const elem of query.elems){convertTypeFilterOnElem(elem)}for(const elem of query.returned){convertTypeFilterOnElem(elem)}}catch(err){query=newParsedQuery(userQuery);query.error=err;return query}if(!query.literalSearch){query.literalSearch=parserState.totalElems>1}query.foundElems=query.elems.length+query.returned.length;query.totalElems=parserState.totalElems;return query}function createQueryResults(results_in_args,results_returned,results_others,parsedQuery){return{"in_args":results_in_args,"returned":results_returned,"others":results_others,"query":parsedQuery,}}async function execQuery(parsedQuery,filterCrates,currentCrate){const results_others=new Map(),results_in_args=new Map(),results_returned=new Map();function transformResults(results){const duplicates=new Set();const out=[];for(const result of results){if(result.id!==-1){const obj=searchIndex[result.id];obj.dist=result.dist;const res=buildHrefAndPath(obj);obj.displayPath=pathSplitter(res[0]);obj.fullPath=res[2]+"|"+obj.ty;if(duplicates.has(obj.fullPath)){continue}if(obj.ty===TY_IMPORT&&duplicates.has(res[2])){continue}if(duplicates.has(res[2]+"|"+TY_IMPORT)){continue}duplicates.add(obj.fullPath);duplicates.add(res[2]);obj.href=res[1];out.push(obj);if(out.length>=MAX_RESULTS){break}}}return out}async function sortResults(results,isType,preferredCrate){const userQuery=parsedQuery.userQuery;const casedUserQuery=parsedQuery.original;const result_list=[];for(const result of results.values()){result.item=searchIndex[result.id];result.word=searchIndex[result.id].word;result_list.push(result)}result_list.sort((aaa,bbb)=>{let a,b;a=(aaa.item.name!==casedUserQuery);b=(bbb.item.name!==casedUserQuery);if(a!==b){return a-b}a=(aaa.word!==userQuery);b=(bbb.word!==userQuery);if(a!==b){return a-b}a=(aaa.index<0);b=(bbb.index<0);if(a!==b){return a-b}a=aaa.path_dist;b=bbb.path_dist;if(a!==b){return a-b}a=aaa.index;b=bbb.index;if(a!==b){return a-b}a=(aaa.dist);b=(bbb.dist);if(a!==b){return a-b}a=searchIndexDeprecated.get(aaa.item.crate).contains(aaa.item.bitIndex);b=searchIndexDeprecated.get(bbb.item.crate).contains(bbb.item.bitIndex);if(a!==b){return a-b}a=(aaa.item.crate!==preferredCrate);b=(bbb.item.crate!==preferredCrate);if(a!==b){return a-b}a=aaa.word.length;b=bbb.word.length;if(a!==b){return a-b}a=aaa.word;b=bbb.word;if(a!==b){return(a>b?+1:-1)}a=searchIndexEmptyDesc.get(aaa.item.crate).contains(aaa.item.bitIndex);b=searchIndexEmptyDesc.get(bbb.item.crate).contains(bbb.item.bitIndex);if(a!==b){return a-b}a=aaa.item.ty;b=bbb.item.ty;if(a!==b){return a-b}a=aaa.item.path;b=bbb.item.path;if(a!==b){return(a>b?+1:-1)}return 0});return transformResults(result_list)}function unifyFunctionTypes(fnTypesIn,queryElems,whereClause,mgensIn,solutionCb,unboxingDepth,){if(unboxingDepth>=UNBOXING_LIMIT){return false}const mgens=mgensIn===null?null:new Map(mgensIn);if(queryElems.length===0){return!solutionCb||solutionCb(mgens)}if(!fnTypesIn||fnTypesIn.length===0){return false}const ql=queryElems.length;const fl=fnTypesIn.length;if(ql===1&&queryElems[0].generics.length===0&&queryElems[0].bindings.size===0){const queryElem=queryElems[0];for(const fnType of fnTypesIn){if(!unifyFunctionTypeIsMatchCandidate(fnType,queryElem,mgens)){continue}if(fnType.id<0&&queryElem.id<0){if(mgens&&mgens.has(fnType.id)&&mgens.get(fnType.id)!==queryElem.id){continue}const mgensScratch=new Map(mgens);mgensScratch.set(fnType.id,queryElem.id);if(!solutionCb||solutionCb(mgensScratch)){return true}}else if(!solutionCb||solutionCb(mgens?new Map(mgens):null)){return true}}for(const fnType of fnTypesIn){if(!unifyFunctionTypeIsUnboxCandidate(fnType,queryElem,whereClause,mgens,unboxingDepth+1,)){continue}if(fnType.id<0){if(mgens&&mgens.has(fnType.id)&&mgens.get(fnType.id)!==0){continue}const mgensScratch=new Map(mgens);mgensScratch.set(fnType.id,0);if(unifyFunctionTypes(whereClause[(-fnType.id)-1],queryElems,whereClause,mgensScratch,solutionCb,unboxingDepth+1,)){return true}}else if(unifyFunctionTypes([...fnType.generics,...Array.from(fnType.bindings.values()).flat()],queryElems,whereClause,mgens?new Map(mgens):null,solutionCb,unboxingDepth+1,)){return true}}return false}const fnTypes=fnTypesIn.slice();const flast=fl-1;const qlast=ql-1;const queryElem=queryElems[qlast];let queryElemsTmp=null;for(let i=flast;i>=0;i-=1){const fnType=fnTypes[i];if(!unifyFunctionTypeIsMatchCandidate(fnType,queryElem,mgens)){continue}let mgensScratch;if(fnType.id<0){mgensScratch=new Map(mgens);if(mgensScratch.has(fnType.id)&&mgensScratch.get(fnType.id)!==queryElem.id){continue}mgensScratch.set(fnType.id,queryElem.id)}else{mgensScratch=mgens}fnTypes[i]=fnTypes[flast];fnTypes.length=flast;if(!queryElemsTmp){queryElemsTmp=queryElems.slice(0,qlast)}const passesUnification=unifyFunctionTypes(fnTypes,queryElemsTmp,whereClause,mgensScratch,mgensScratch=>{if(fnType.generics.length===0&&queryElem.generics.length===0&&fnType.bindings.size===0&&queryElem.bindings.size===0){return!solutionCb||solutionCb(mgensScratch)}const solution=unifyFunctionTypeCheckBindings(fnType,queryElem,whereClause,mgensScratch,unboxingDepth,);if(!solution){return false}const simplifiedGenerics=solution.simplifiedGenerics;for(const simplifiedMgens of solution.mgens){const passesUnification=unifyFunctionTypes(simplifiedGenerics,queryElem.generics,whereClause,simplifiedMgens,solutionCb,unboxingDepth,);if(passesUnification){return true}}return false},unboxingDepth,);if(passesUnification){return true}fnTypes[flast]=fnTypes[i];fnTypes[i]=fnType;fnTypes.length=fl}for(let i=flast;i>=0;i-=1){const fnType=fnTypes[i];if(!unifyFunctionTypeIsUnboxCandidate(fnType,queryElem,whereClause,mgens,unboxingDepth+1,)){continue}let mgensScratch;if(fnType.id<0){mgensScratch=new Map(mgens);if(mgensScratch.has(fnType.id)&&mgensScratch.get(fnType.id)!==0){continue}mgensScratch.set(fnType.id,0)}else{mgensScratch=mgens}const generics=fnType.id<0?whereClause[(-fnType.id)-1]:fnType.generics;const bindings=fnType.bindings?Array.from(fnType.bindings.values()).flat():[];const passesUnification=unifyFunctionTypes(fnTypes.toSpliced(i,1,...generics,...bindings),queryElems,whereClause,mgensScratch,solutionCb,unboxingDepth+1,);if(passesUnification){return true}}return false}function unifyFunctionTypeIsMatchCandidate(fnType,queryElem,mgensIn){if(!typePassesFilter(queryElem.typeFilter,fnType.ty)){return false}if(fnType.id<0&&queryElem.id<0){if(mgensIn){if(mgensIn.has(fnType.id)&&mgensIn.get(fnType.id)!==queryElem.id){return false}for(const[fid,qid]of mgensIn.entries()){if(fnType.id!==fid&&queryElem.id===qid){return false}if(fnType.id===fid&&queryElem.id!==qid){return false}}}return true}else{if(queryElem.id===typeNameIdOfArrayOrSlice&&(fnType.id===typeNameIdOfSlice||fnType.id===typeNameIdOfArray)){}else if(queryElem.id===typeNameIdOfTupleOrUnit&&(fnType.id===typeNameIdOfTuple||fnType.id===typeNameIdOfUnit)){}else if(queryElem.id===typeNameIdOfHof&&(fnType.id===typeNameIdOfFn||fnType.id===typeNameIdOfFnMut||fnType.id===typeNameIdOfFnOnce)){}else if(fnType.id!==queryElem.id||queryElem.id===null){return false}if((fnType.generics.length+fnType.bindings.size)===0&&queryElem.generics.length!==0){return false}if(fnType.bindings.size0){const fnTypePath=fnType.path!==undefined&&fnType.path!==null?fnType.path.split("::"):[];if(queryElemPathLength>fnTypePath.length){return false}let i=0;for(const path of fnTypePath){if(path===queryElem.pathWithoutLast[i]){i+=1;if(i>=queryElemPathLength){break}}}if(i0){let mgensSolutionSet=[mgensIn];for(const[name,constraints]of queryElem.bindings.entries()){if(mgensSolutionSet.length===0){return false}if(!fnType.bindings.has(name)){return false}const fnTypeBindings=fnType.bindings.get(name);mgensSolutionSet=mgensSolutionSet.flatMap(mgens=>{const newSolutions=[];unifyFunctionTypes(fnTypeBindings,constraints,whereClause,mgens,newMgens=>{newSolutions.push(newMgens);return false},unboxingDepth,);return newSolutions})}if(mgensSolutionSet.length===0){return false}const binds=Array.from(fnType.bindings.entries()).flatMap(entry=>{const[name,constraints]=entry;if(queryElem.bindings.has(name)){return[]}else{return constraints}});if(simplifiedGenerics.length>0){simplifiedGenerics=[...simplifiedGenerics,...binds]}else{simplifiedGenerics=binds}return{simplifiedGenerics,mgens:mgensSolutionSet}}return{simplifiedGenerics,mgens:[mgensIn]}}function unifyFunctionTypeIsUnboxCandidate(fnType,queryElem,whereClause,mgens,unboxingDepth,){if(unboxingDepth>=UNBOXING_LIMIT){return false}if(fnType.id<0&&queryElem.id>=0){if(!whereClause){return false}if(mgens&&mgens.has(fnType.id)&&mgens.get(fnType.id)!==0){return false}const mgensTmp=new Map(mgens);mgensTmp.set(fnType.id,null);return checkIfInList(whereClause[(-fnType.id)-1],queryElem,whereClause,mgensTmp,unboxingDepth,)}else if(fnType.generics.length>0||fnType.bindings.size>0){const simplifiedGenerics=[...fnType.generics,...Array.from(fnType.bindings.values()).flat(),];return checkIfInList(simplifiedGenerics,queryElem,whereClause,mgens,unboxingDepth,)}return false}function checkIfInList(list,elem,whereClause,mgens,unboxingDepth){for(const entry of list){if(checkType(entry,elem,whereClause,mgens,unboxingDepth)){return true}}return false}function checkType(row,elem,whereClause,mgens,unboxingDepth){if(unboxingDepth>=UNBOXING_LIMIT){return false}if(row.bindings.size===0&&elem.bindings.size===0){if(elem.id<0&&mgens===null){return row.id<0||checkIfInList(row.generics,elem,whereClause,mgens,unboxingDepth+1,)}if(row.id>0&&elem.id>0&&elem.pathWithoutLast.length===0&&typePassesFilter(elem.typeFilter,row.ty)&&elem.generics.length===0&&elem.id!==typeNameIdOfArrayOrSlice&&elem.id!==typeNameIdOfTupleOrUnit&&elem.id!==typeNameIdOfHof){return row.id===elem.id||checkIfInList(row.generics,elem,whereClause,mgens,unboxingDepth,)}}return unifyFunctionTypes([row],[elem],whereClause,mgens,null,unboxingDepth)}function checkPath(contains,ty){if(contains.length===0){return 0}const maxPathEditDistance=Math.floor(contains.reduce((acc,next)=>acc+next.length,0)/3,);let ret_dist=maxPathEditDistance+1;const path=ty.path.split("::");if(ty.parent&&ty.parent.name){path.push(ty.parent.name.toLowerCase())}const length=path.length;const clength=contains.length;pathiter:for(let i=length-clength;i>=0;i-=1){let dist_total=0;for(let x=0;xmaxPathEditDistance){continue pathiter}dist_total+=dist}}ret_dist=Math.min(ret_dist,Math.round(dist_total/clength))}return ret_dist>maxPathEditDistance?null:ret_dist}function typePassesFilter(filter,type){if(filter<=NO_TYPE_FILTER||filter===type)return true;const name=itemTypes[type];switch(itemTypes[filter]){case"constant":return name==="associatedconstant";case"fn":return name==="method"||name==="tymethod";case"type":return name==="primitive"||name==="associatedtype";case"trait":return name==="traitalias"}return false}function createAliasFromItem(item){return{crate:item.crate,name:item.name,path:item.path,descShard:item.descShard,descIndex:item.descIndex,exactPath:item.exactPath,ty:item.ty,parent:item.parent,type:item.type,is_alias:true,bitIndex:item.bitIndex,implDisambiguator:item.implDisambiguator,}}async function handleAliases(ret,query,filterCrates,currentCrate){const lowerQuery=query.toLowerCase();const aliases=[];const crateAliases=[];if(filterCrates!==null){if(ALIASES.has(filterCrates)&&ALIASES.get(filterCrates).has(lowerQuery)){const query_aliases=ALIASES.get(filterCrates).get(lowerQuery);for(const alias of query_aliases){aliases.push(createAliasFromItem(searchIndex[alias]))}}}else{for(const[crate,crateAliasesIndex]of ALIASES){if(crateAliasesIndex.has(lowerQuery)){const pushTo=crate===currentCrate?crateAliases:aliases;const query_aliases=crateAliasesIndex.get(lowerQuery);for(const alias of query_aliases){pushTo.push(createAliasFromItem(searchIndex[alias]))}}}}const sortFunc=(aaa,bbb)=>{if(aaa.path{return searchIndexEmptyDesc.get(alias.crate).contains(alias.bitIndex)?"":searchState.loadDesc(alias)};const[crateDescs,descs]=await Promise.all([Promise.all(crateAliases.map(fetchDesc)),Promise.all(aliases.map(fetchDesc)),]);const pushFunc=alias=>{alias.alias=query;const res=buildHrefAndPath(alias);alias.displayPath=pathSplitter(res[0]);alias.fullPath=alias.displayPath+alias.name;alias.href=res[1];ret.others.unshift(alias);if(ret.others.length>MAX_RESULTS){ret.others.pop()}};aliases.forEach((alias,i)=>{alias.desc=descs[i]});aliases.forEach(pushFunc);crateAliases.forEach((alias,i)=>{alias.desc=crateDescs[i]});crateAliases.forEach(pushFunc)}function addIntoResults(results,fullId,id,index,dist,path_dist,maxEditDistance){if(dist<=maxEditDistance||index!==-1){if(results.has(fullId)){const result=results.get(fullId);if(result.dontValidate||result.dist<=dist){return}}results.set(fullId,{id:id,index:index,dontValidate:parsedQuery.literalSearch,dist:dist,path_dist:path_dist,})}}function handleSingleArg(row,pos,elem,results_others,results_in_args,results_returned,maxEditDistance,){if(!row||(filterCrates!==null&&row.crate!==filterCrates)){return}let path_dist=0;const fullId=row.id;const tfpDist=compareTypeFingerprints(fullId,parsedQuery.typeFingerprint,);if(tfpDist!==null){const in_args=row.type&&row.type.inputs&&checkIfInList(row.type.inputs,elem,row.type.where_clause,null,0);const returned=row.type&&row.type.output&&checkIfInList(row.type.output,elem,row.type.where_clause,null,0);if(in_args){results_in_args.max_dist=Math.max(results_in_args.max_dist||0,tfpDist);const maxDist=results_in_args.sizenormalizedIndex&&normalizedIndex!==-1)){index=normalizedIndex}if(elem.fullPath.length>1){path_dist=checkPath(elem.pathWithoutLast,row);if(path_dist===null){return}}if(parsedQuery.literalSearch){if(row.word===elem.pathLast){addIntoResults(results_others,fullId,pos,index,0,path_dist)}return}const dist=editDistance(row.normalizedName,elem.normalizedPathLast,maxEditDistance);if(index===-1&&dist>maxEditDistance){return}addIntoResults(results_others,fullId,pos,index,dist,path_dist,maxEditDistance)}function handleArgs(row,pos,results){if(!row||(filterCrates!==null&&row.crate!==filterCrates)||!row.type){return}const tfpDist=compareTypeFingerprints(row.id,parsedQuery.typeFingerprint,);if(tfpDist===null){return}if(results.size>=MAX_RESULTS&&tfpDist>results.max_dist){return}if(!unifyFunctionTypes(row.type.inputs,parsedQuery.elems,row.type.where_clause,null,mgens=>{return unifyFunctionTypes(row.type.output,parsedQuery.returned,row.type.where_clause,mgens,null,0,)},0,)){return}results.max_dist=Math.max(results.max_dist||0,tfpDist);addIntoResults(results,row.id,pos,0,tfpDist,0,Number.MAX_VALUE)}function innerRunQuery(){const queryLen=parsedQuery.elems.reduce((acc,next)=>acc+next.pathLast.length,0)+parsedQuery.returned.reduce((acc,next)=>acc+next.pathLast.length,0);const maxEditDistance=Math.floor(queryLen/3);const genericSymbols=new Map();function convertNameToId(elem,isAssocType){const loweredName=elem.pathLast.toLowerCase();if(typeNameIdMap.has(loweredName)&&(isAssocType||!typeNameIdMap.get(loweredName).assocOnly)){elem.id=typeNameIdMap.get(loweredName).id}else if(!parsedQuery.literalSearch){let match=null;let matchDist=maxEditDistance+1;let matchName="";for(const[name,{id,assocOnly}]of typeNameIdMap){const dist=Math.min(editDistance(name,loweredName,maxEditDistance),editDistance(name,elem.normalizedPathLast,maxEditDistance),);if(dist<=matchDist&&dist<=maxEditDistance&&(isAssocType||!assocOnly)){if(dist===matchDist&&matchName>name){continue}match=id;matchDist=dist;matchName=name}}if(match!==null){parsedQuery.correction=matchName}elem.id=match}if((elem.id===null&&parsedQuery.totalElems>1&&elem.typeFilter===-1&&elem.generics.length===0&&elem.bindings.size===0)||elem.typeFilter===TY_GENERIC){if(genericSymbols.has(elem.name)){elem.id=genericSymbols.get(elem.name)}else{elem.id=-(genericSymbols.size+1);genericSymbols.set(elem.name,elem.id)}if(elem.typeFilter===-1&&elem.name.length>=3){const maxPartDistance=Math.floor(elem.name.length/3);let matchDist=maxPartDistance+1;let matchName="";for(const name of typeNameIdMap.keys()){const dist=editDistance(name,elem.name,maxPartDistance);if(dist<=matchDist&&dist<=maxPartDistance){if(dist===matchDist&&matchName>name){continue}matchDist=dist;matchName=name}}if(matchName!==""){parsedQuery.proposeCorrectionFrom=elem.name;parsedQuery.proposeCorrectionTo=matchName}}elem.typeFilter=TY_GENERIC}if(elem.generics.length>0&&elem.typeFilter===TY_GENERIC){parsedQuery.error=["Generic type parameter ",elem.name," does not accept generic parameters",]}for(const elem2 of elem.generics){convertNameToId(elem2)}elem.bindings=new Map(Array.from(elem.bindings.entries()).map(entry=>{const[name,constraints]=entry;if(!typeNameIdMap.has(name)){parsedQuery.error=["Type parameter ",name," does not exist",];return[null,[]]}for(const elem2 of constraints){convertNameToId(elem2)}return[typeNameIdMap.get(name).id,constraints]}),)}const fps=new Set();for(const elem of parsedQuery.elems){convertNameToId(elem);buildFunctionTypeFingerprint(elem,parsedQuery.typeFingerprint,fps)}for(const elem of parsedQuery.returned){convertNameToId(elem);buildFunctionTypeFingerprint(elem,parsedQuery.typeFingerprint,fps)}if(parsedQuery.foundElems===1&&parsedQuery.returned.length===0){if(parsedQuery.elems.length===1){const elem=parsedQuery.elems[0];for(let i=0,nSearchIndex=searchIndex.length;i0){const sortQ=(a,b)=>{const ag=a.generics.length===0&&a.bindings.size===0;const bg=b.generics.length===0&&b.bindings.size===0;if(ag!==bg){return ag-bg}const ai=a.id>0;const bi=b.id>0;return ai-bi};parsedQuery.elems.sort(sortQ);parsedQuery.returned.sort(sortQ);for(let i=0,nSearchIndex=searchIndex.length;i{const descs=await Promise.all(list.map(result=>{return searchIndexEmptyDesc.get(result.crate).contains(result.bitIndex)?"":searchState.loadDesc(result)}));for(const[i,result]of list.entries()){result.desc=descs[i]}}));if(parsedQuery.error!==null&&ret.others.length!==0){ret.query.error=null}return ret}function nextTab(direction){const next=(searchState.currentTab+direction+3)%searchState.focusedByTab.length;searchState.focusedByTab[searchState.currentTab]=document.activeElement;printTab(next);focusSearchResult()}function focusSearchResult(){const target=searchState.focusedByTab[searchState.currentTab]||document.querySelectorAll(".search-results.active a").item(0)||document.querySelectorAll("#search-tabs button").item(searchState.currentTab);searchState.focusedByTab[searchState.currentTab]=null;if(target){target.focus()}}function buildHrefAndPath(item){let displayPath;let href;const type=itemTypes[item.ty];const name=item.name;let path=item.path;let exactPath=item.exactPath;if(type==="mod"){displayPath=path+"::";href=ROOT_PATH+path.replace(/::/g,"/")+"/"+name+"/index.html"}else if(type==="import"){displayPath=item.path+"::";href=ROOT_PATH+item.path.replace(/::/g,"/")+"/index.html#reexport."+name}else if(type==="primitive"||type==="keyword"){displayPath="";href=ROOT_PATH+path.replace(/::/g,"/")+"/"+type+"."+name+".html"}else if(type==="externcrate"){displayPath="";href=ROOT_PATH+name+"/index.html"}else if(item.parent!==undefined){const myparent=item.parent;let anchor=type+"."+name;const parentType=itemTypes[myparent.ty];let pageType=parentType;let pageName=myparent.name;exactPath=`${myparent.exactPath}::${myparent.name}`;if(parentType==="primitive"){displayPath=myparent.name+"::"}else if(type==="structfield"&&parentType==="variant"){const enumNameIdx=item.path.lastIndexOf("::");const enumName=item.path.substr(enumNameIdx+2);path=item.path.substr(0,enumNameIdx);displayPath=path+"::"+enumName+"::"+myparent.name+"::";anchor="variant."+myparent.name+".field."+name;pageType="enum";pageName=enumName}else{displayPath=path+"::"+myparent.name+"::"}if(item.implDisambiguator!==null){anchor=item.implDisambiguator+"/"+anchor}href=ROOT_PATH+path.replace(/::/g,"/")+"/"+pageType+"."+pageName+".html#"+anchor}else{displayPath=item.path+"::";href=ROOT_PATH+item.path.replace(/::/g,"/")+"/"+type+"."+name+".html"}return[displayPath,href,`${exactPath}::${name}`]}function pathSplitter(path){const tmp=""+path.replace(/::/g,"::");if(tmp.endsWith("")){return tmp.slice(0,tmp.length-6)}return tmp}async function addTab(array,query,display){const extraClass=display?" active":"";const output=document.createElement("div");if(array.length>0){output.className="search-results "+extraClass;for(const item of array){const name=item.name;const type=itemTypes[item.ty];const longType=longItemTypes[item.ty];const typeName=longType.length!==0?`${longType}`:"?";const link=document.createElement("a");link.className="result-"+type;link.href=item.href;const resultName=document.createElement("div");resultName.className="result-name";resultName.insertAdjacentHTML("beforeend",`${typeName}`);link.appendChild(resultName);let alias=" ";if(item.is_alias){alias=`
\ -${item.alias} - see \ -
`}resultName.insertAdjacentHTML("beforeend",`
${alias}\ -${item.displayPath}${name}\ -
`);const description=document.createElement("div");description.className="desc";description.insertAdjacentHTML("beforeend",item.desc);link.appendChild(description);output.appendChild(link)}}else if(query.error===null){output.className="search-failed"+extraClass;output.innerHTML="No results :(
"+"Try on DuckDuckGo?

"+"Or try looking in one of these:"}return[output,array.length]}function makeTabHeader(tabNb,text,nbElems){const fmtNbElems=nbElems<10?`\u{2007}(${nbElems})\u{2007}\u{2007}`:nbElems<100?`\u{2007}(${nbElems})\u{2007}`:`\u{2007}(${nbElems})`;if(searchState.currentTab===tabNb){return""}return""}async function showResults(results,go_to_first,filterCrates){const search=searchState.outputElement();if(go_to_first||(results.others.length===1&&getSettingValue("go-to-only-result")==="true")){window.onunload=()=>{};searchState.removeQueryParameters();const elem=document.createElement("a");elem.href=results.others[0].href;removeClass(elem,"active");document.body.appendChild(elem);elem.click();return}if(results.query===undefined){results.query=parseQuery(searchState.input.value)}currentResults=results.query.userQuery;const[ret_others,ret_in_args,ret_returned]=await Promise.all([addTab(results.others,results.query,true),addTab(results.in_args,results.query,false),addTab(results.returned,results.query,false),]);let currentTab=searchState.currentTab;if((currentTab===0&&ret_others[1]===0)||(currentTab===1&&ret_in_args[1]===0)||(currentTab===2&&ret_returned[1]===0)){if(ret_others[1]!==0){currentTab=0}else if(ret_in_args[1]!==0){currentTab=1}else if(ret_returned[1]!==0){currentTab=2}}let crates="";if(rawSearchIndex.size>1){crates=" in 
"}let output=`

Results${crates}

`;if(results.query.error!==null){const error=results.query.error;error.forEach((value,index)=>{value=value.split("<").join("<").split(">").join(">");if(index%2!==0){error[index]=`${value.replaceAll(" ", " ")}`}else{error[index]=value}});output+=`

Query parser error: "${error.join("")}".

`;output+="
"+makeTabHeader(0,"In Names",ret_others[1])+"
";currentTab=0}else if(results.query.foundElems<=1&&results.query.returned.length===0){output+="
"+makeTabHeader(0,"In Names",ret_others[1])+makeTabHeader(1,"In Parameters",ret_in_args[1])+makeTabHeader(2,"In Return Types",ret_returned[1])+"
"}else{const signatureTabTitle=results.query.elems.length===0?"In Function Return Types":results.query.returned.length===0?"In Function Parameters":"In Function Signatures";output+="
"+makeTabHeader(0,signatureTabTitle,ret_others[1])+"
";currentTab=0}if(results.query.correction!==null){const orig=results.query.returned.length>0?results.query.returned[0].name:results.query.elems[0].name;output+="

"+`Type "${orig}" not found. `+"Showing results for closest type name "+`"${results.query.correction}" instead.

`}if(results.query.proposeCorrectionFrom!==null){const orig=results.query.proposeCorrectionFrom;const targ=results.query.proposeCorrectionTo;output+="

"+`Type "${orig}" not found and used as generic parameter. `+`Consider searching for "${targ}" instead.

`}const resultsElem=document.createElement("div");resultsElem.id="results";resultsElem.appendChild(ret_others[0]);resultsElem.appendChild(ret_in_args[0]);resultsElem.appendChild(ret_returned[0]);search.innerHTML=output;const crateSearch=document.getElementById("crate-search");if(crateSearch){crateSearch.addEventListener("input",updateCrate)}search.appendChild(resultsElem);searchState.showResults(search);const elems=document.getElementById("search-tabs").childNodes;searchState.focusedByTab=[];let i=0;for(const elem of elems){const j=i;elem.onclick=()=>printTab(j);searchState.focusedByTab.push(null);i+=1}printTab(currentTab)}function updateSearchHistory(url){if(!browserSupportsHistoryApi()){return}const params=searchState.getQueryStringParams();if(!history.state&&!params.search){history.pushState(null,"",url)}else{history.replaceState(null,"",url)}}async function search(forced){const query=parseQuery(searchState.input.value.trim());let filterCrates=getFilterCrates();if(!forced&&query.userQuery===currentResults){if(query.userQuery.length>0){putBackSearch()}return}searchState.setLoadingSearch();const params=searchState.getQueryStringParams();if(filterCrates===null&¶ms["filter-crate"]!==undefined){filterCrates=params["filter-crate"]}searchState.title="\""+query.original+"\" Search - Rust";updateSearchHistory(buildUrl(query.original,filterCrates));await showResults(await execQuery(query,filterCrates,window.currentCrate),params.go_to_first,filterCrates)}function buildItemSearchTypeAll(types,lowercasePaths){return types.length>0?types.map(type=>buildItemSearchType(type,lowercasePaths)):EMPTY_GENERICS_ARRAY}const EMPTY_BINDINGS_MAP=new Map();const EMPTY_GENERICS_ARRAY=[];let TYPES_POOL=new Map();function buildItemSearchType(type,lowercasePaths,isAssocType){const PATH_INDEX_DATA=0;const GENERICS_DATA=1;const BINDINGS_DATA=2;let pathIndex,generics,bindings;if(typeof type==="number"){pathIndex=type;generics=EMPTY_GENERICS_ARRAY;bindings=EMPTY_BINDINGS_MAP}else{pathIndex=type[PATH_INDEX_DATA];generics=buildItemSearchTypeAll(type[GENERICS_DATA],lowercasePaths,);if(type.length>BINDINGS_DATA&&type[BINDINGS_DATA].length>0){bindings=new Map(type[BINDINGS_DATA].map(binding=>{const[assocType,constraints]=binding;return[buildItemSearchType(assocType,lowercasePaths,true).id,buildItemSearchTypeAll(constraints,lowercasePaths),]}))}else{bindings=EMPTY_BINDINGS_MAP}}let result;if(pathIndex<0){result={id:pathIndex,ty:TY_GENERIC,path:null,exactPath:null,generics,bindings,}}else if(pathIndex===0){result={id:null,ty:null,path:null,exactPath:null,generics,bindings,}}else{const item=lowercasePaths[pathIndex-1];result={id:buildTypeMapIndex(item.name,isAssocType),ty:item.ty,path:item.path,exactPath:item.exactPath,generics,bindings,}}const cr=TYPES_POOL.get(result.id);if(cr){if(cr.generics.length===result.generics.length&&cr.generics!==result.generics&&cr.generics.every((x,i)=>result.generics[i]===x)){result.generics=cr.generics}if(cr.bindings.size===result.bindings.size&&cr.bindings!==result.bindings){let ok=true;for(const[k,v]of cr.bindings.entries()){const v2=result.bindings.get(v);if(!v2){ok=false;break}if(v!==v2&&v.length===v2.length&&v.every((x,i)=>v2[i]===x)){result.bindings.set(k,v)}else if(v!==v2){ok=false;break}}if(ok){result.bindings=cr.bindings}}if(cr.ty===result.ty&&cr.path===result.path&&cr.bindings===result.bindings&&cr.generics===result.generics&&cr.ty===result.ty){return cr}}TYPES_POOL.set(result.id,result);return result}function buildFunctionSearchTypeCallback(lowercasePaths){return functionSearchType=>{if(functionSearchType===0){return null}const INPUTS_DATA=0;const OUTPUT_DATA=1;let inputs,output;if(typeof functionSearchType[INPUTS_DATA]==="number"){inputs=[buildItemSearchType(functionSearchType[INPUTS_DATA],lowercasePaths)]}else{inputs=buildItemSearchTypeAll(functionSearchType[INPUTS_DATA],lowercasePaths,)}if(functionSearchType.length>1){if(typeof functionSearchType[OUTPUT_DATA]==="number"){output=[buildItemSearchType(functionSearchType[OUTPUT_DATA],lowercasePaths)]}else{output=buildItemSearchTypeAll(functionSearchType[OUTPUT_DATA],lowercasePaths,)}}else{output=[]}const where_clause=[];const l=functionSearchType.length;for(let i=2;i{k=(~~k+0x7ed55d16)+(k<<12);k=(k ^ 0xc761c23c)^(k>>>19);k=(~~k+0x165667b1)+(k<<5);k=(~~k+0xd3a2646c)^(k<<9);k=(~~k+0xfd7046c5)+(k<<3);return(k ^ 0xb55a4f09)^(k>>>16)};const hashint2=k=>{k=~k+(k<<15);k ^=k>>>12;k+=k<<2;k ^=k>>>4;k=Math.imul(k,2057);return k ^(k>>16)};if(input!==null){const h0a=hashint1(input);const h0b=hashint2(input);const h1a=~~(h0a+Math.imul(h0b,2));const h1b=~~(h0a+Math.imul(h0b,3));const h2a=~~(h0a+Math.imul(h0b,4));const h2b=~~(h0a+Math.imul(h0b,5));output[0]|=(1<<(h0a%32))|(1<<(h1b%32));output[1]|=(1<<(h1a%32))|(1<<(h2b%32));output[2]|=(1<<(h2a%32))|(1<<(h0b%32));fps.add(input)}for(const g of type.generics){buildFunctionTypeFingerprint(g,output,fps)}const fb={id:null,ty:0,generics:EMPTY_GENERICS_ARRAY,bindings:EMPTY_BINDINGS_MAP,};for(const[k,v]of type.bindings.entries()){fb.id=k;fb.generics=v;buildFunctionTypeFingerprint(fb,output,fps)}output[3]=fps.size}function compareTypeFingerprints(fullId,queryFingerprint){const fh0=functionTypeFingerprint[fullId*4];const fh1=functionTypeFingerprint[(fullId*4)+1];const fh2=functionTypeFingerprint[(fullId*4)+2];const[qh0,qh1,qh2]=queryFingerprint;const[in0,in1,in2]=[fh0&qh0,fh1&qh1,fh2&qh2];if((in0 ^ qh0)||(in1 ^ qh1)||(in2 ^ qh2)){return null}return functionTypeFingerprint[(fullId*4)+3]}class VlqHexDecoder{constructor(string,cons){this.string=string;this.cons=cons;this.offset=0;this.backrefQueue=[]}decodeList(){let c=this.string.charCodeAt(this.offset);const ret=[];while(c!==125){ret.push(this.decode());c=this.string.charCodeAt(this.offset)}this.offset+=1;return ret}decode(){let n=0;let c=this.string.charCodeAt(this.offset);if(c===123){this.offset+=1;return this.decodeList()}while(c<96){n=(n<<4)|(c&0xF);this.offset+=1;c=this.string.charCodeAt(this.offset)}n=(n<<4)|(c&0xF);const[sign,value]=[n&1,n>>1];this.offset+=1;return sign?-value:value}next(){const c=this.string.charCodeAt(this.offset);if(c>=48&&c<64){this.offset+=1;return this.backrefQueue[c-48]}if(c===96){this.offset+=1;return this.cons(0)}const result=this.cons(this.decode());this.backrefQueue.unshift(result);if(this.backrefQueue.length>16){this.backrefQueue.pop()}return result}}class RoaringBitmap{constructor(str){const strdecoded=atob(str);const u8array=new Uint8Array(strdecoded.length);for(let j=0;j=4){offsets=[];for(let j=0;j>3]&(1<<(j&0x7))){const runcount=(u8array[i]|(u8array[i+1]<<8));i+=2;this.containers.push(new RoaringBitmapRun(runcount,u8array.slice(i,i+(runcount*4)),));i+=runcount*4}else if(this.cardinalities[j]>=4096){this.containers.push(new RoaringBitmapBits(u8array.slice(i,i+8192)));i+=8192}else{const end=this.cardinalities[j]*2;this.containers.push(new RoaringBitmapArray(this.cardinalities[j],u8array.slice(i,i+end),));i+=end}}}contains(keyvalue){const key=keyvalue>>16;const value=keyvalue&0xFFFF;for(let i=0;i=start&&value<=(start+lenm1)){return true}}return false}}class RoaringBitmapArray{constructor(cardinality,array){this.cardinality=cardinality;this.array=array}contains(value){const l=this.cardinality*2;for(let i=0;i>3]&(1<<(value&7)))}}function buildIndex(rawSearchIndex){searchIndex=[];searchIndexDeprecated=new Map();searchIndexEmptyDesc=new Map();let currentIndex=0;let id=0;for(const crate of rawSearchIndex.values()){id+=crate.t.length+1}functionTypeFingerprint=new Uint32Array((id+1)*4);id=0;for(const[crate,crateCorpus]of rawSearchIndex){const itemDescShardDecoder=new VlqHexDecoder(crateCorpus.D,noop=>noop);let descShard={crate,shard:0,start:0,len:itemDescShardDecoder.next(),promise:null,resolve:null,};const descShardList=[descShard];searchIndexDeprecated.set(crate,new RoaringBitmap(crateCorpus.c));searchIndexEmptyDesc.set(crate,new RoaringBitmap(crateCorpus.e));let descIndex=0;const crateRow={crate,ty:3,name:crate,path:"",descShard,descIndex,exactPath:"",desc:crateCorpus.doc,parent:undefined,type:null,id,word:crate,normalizedName:crate.indexOf("_")===-1?crate:crate.replace(/_/g,""),bitIndex:0,implDisambiguator:null,};id+=1;searchIndex.push(crateRow);currentIndex+=1;if(!searchIndexEmptyDesc.get(crate).contains(0)){descIndex+=1}const itemTypes=crateCorpus.t;const itemNames=crateCorpus.n;const itemPaths=new Map(crateCorpus.q);const itemReexports=new Map(crateCorpus.r);const itemParentIdxDecoder=new VlqHexDecoder(crateCorpus.i,noop=>noop);const implDisambiguator=new Map(crateCorpus.b);const paths=crateCorpus.p;const aliases=crateCorpus.a;const lowercasePaths=[];const itemFunctionDecoder=new VlqHexDecoder(crateCorpus.f,buildFunctionSearchTypeCallback(lowercasePaths),);let len=paths.length;let lastPath=itemPaths.get(0);for(let i=0;i2){path=itemPaths.has(elem[2])?itemPaths.get(elem[2]):lastPath;lastPath=path}const exactPath=elem.length>3?itemPaths.get(elem[3]):path;lowercasePaths.push({ty,name:name.toLowerCase(),path,exactPath});paths[i]={ty,name,path,exactPath}}lastPath="";len=itemTypes.length;let lastName="";let lastWord="";for(let i=0;i=descShard.len&&!searchIndexEmptyDesc.get(crate).contains(bitIndex)){descShard={crate,shard:descShard.shard+1,start:descShard.start+descShard.len,len:itemDescShardDecoder.next(),promise:null,resolve:null,};descIndex=0;descShardList.push(descShard)}const name=itemNames[i]===""?lastName:itemNames[i];const word=itemNames[i]===""?lastWord:itemNames[i].toLowerCase();const path=itemPaths.has(i)?itemPaths.get(i):lastPath;const type=itemFunctionDecoder.next();if(type!==null){if(type){const fp=functionTypeFingerprint.subarray(id*4,(id+1)*4);const fps=new Set();for(const t of type.inputs){buildFunctionTypeFingerprint(t,fp,fps)}for(const t of type.output){buildFunctionTypeFingerprint(t,fp,fps)}for(const w of type.where_clause){for(const t of w){buildFunctionTypeFingerprint(t,fp,fps)}}}}const itemParentIdx=itemParentIdxDecoder.next();const row={crate,ty:itemTypes.charCodeAt(i)-65,name,path,descShard,descIndex,exactPath:itemReexports.has(i)?itemPaths.get(itemReexports.get(i)):path,parent:itemParentIdx>0?paths[itemParentIdx-1]:undefined,type,id,word,normalizedName:word.indexOf("_")===-1?word:word.replace(/_/g,""),bitIndex,implDisambiguator:implDisambiguator.has(i)?implDisambiguator.get(i):null,};id+=1;searchIndex.push(row);lastPath=row.path;if(!searchIndexEmptyDesc.get(crate).contains(bitIndex)){descIndex+=1}lastName=name;lastWord=word}if(aliases){const currentCrateAliases=new Map();ALIASES.set(crate,currentCrateAliases);for(const alias_name in aliases){if(!Object.prototype.hasOwnProperty.call(aliases,alias_name)){continue}let currentNameAliases;if(currentCrateAliases.has(alias_name)){currentNameAliases=currentCrateAliases.get(alias_name)}else{currentNameAliases=[];currentCrateAliases.set(alias_name,currentNameAliases)}for(const local_alias of aliases[alias_name]){currentNameAliases.push(local_alias+currentIndex)}}}currentIndex+=itemTypes.length;searchState.descShards.set(crate,descShardList)}TYPES_POOL=new Map()}function onSearchSubmit(e){e.preventDefault();searchState.clearInputTimeout();search()}function putBackSearch(){const search_input=searchState.input;if(!searchState.input){return}if(search_input.value!==""&&!searchState.isDisplayed()){searchState.showResults();if(browserSupportsHistoryApi()){history.replaceState(null,"",buildUrl(search_input.value,getFilterCrates()))}document.title=searchState.title}}function registerSearchEvents(){const params=searchState.getQueryStringParams();if(searchState.input.value===""){searchState.input.value=params.search||""}const searchAfter500ms=()=>{searchState.clearInputTimeout();if(searchState.input.value.length===0){searchState.hideResults()}else{searchState.timeout=setTimeout(search,500)}};searchState.input.onkeyup=searchAfter500ms;searchState.input.oninput=searchAfter500ms;document.getElementsByClassName("search-form")[0].onsubmit=onSearchSubmit;searchState.input.onchange=e=>{if(e.target!==document.activeElement){return}searchState.clearInputTimeout();setTimeout(search,0)};searchState.input.onpaste=searchState.input.onchange;searchState.outputElement().addEventListener("keydown",e=>{if(e.altKey||e.ctrlKey||e.shiftKey||e.metaKey){return}if(e.which===38){const previous=document.activeElement.previousElementSibling;if(previous){previous.focus()}else{searchState.focus()}e.preventDefault()}else if(e.which===40){const next=document.activeElement.nextElementSibling;if(next){next.focus()}const rect=document.activeElement.getBoundingClientRect();if(window.innerHeight-rect.bottom{if(e.which===40){focusSearchResult();e.preventDefault()}});searchState.input.addEventListener("focus",()=>{putBackSearch()});searchState.input.addEventListener("blur",()=>{searchState.input.placeholder=searchState.input.origPlaceholder});if(browserSupportsHistoryApi()){const previousTitle=document.title;window.addEventListener("popstate",e=>{const params=searchState.getQueryStringParams();document.title=previousTitle;currentResults=null;if(params.search&¶ms.search.length>0){searchState.input.value=params.search;e.preventDefault();search()}else{searchState.input.value="";searchState.hideResults()}})}window.onpageshow=()=>{const qSearch=searchState.getQueryStringParams().search;if(searchState.input.value===""&&qSearch){searchState.input.value=qSearch}search()}}function updateCrate(ev){if(ev.target.value==="all crates"){const query=searchState.input.value.trim();updateSearchHistory(buildUrl(query,null))}currentResults=null;search(true)}buildIndex(rawSearchIndex);if(typeof window!=="undefined"){registerSearchEvents();if(window.searchState.getQueryStringParams().search){search()}}if(typeof exports!=="undefined"){exports.initSearch=initSearch;exports.execQuery=execQuery;exports.parseQuery=parseQuery}}if(typeof window!=="undefined"){window.initSearch=initSearch;if(window.searchIndex!==undefined){initSearch(window.searchIndex)}}else{initSearch(new Map())}})() \ No newline at end of file diff --git a/main/trait.impl/core/clone/trait.Clone.js b/main/trait.impl/core/clone/trait.Clone.js index a28a944..64d049a 100644 --- a/main/trait.impl/core/clone/trait.Clone.js +++ b/main/trait.impl/core/clone/trait.Clone.js @@ -1,9 +1,9 @@ (function() { - var implementors = Object.fromEntries([["FunnyBones",[["impl Clone for Mode"],["impl Clone for ChangeAggregator"],["impl Clone for EditingSkeleton"],["impl Clone for SkeletalBone"]]],["funnybones",[["impl Clone for ChangeKind"],["impl Clone for SkeletonMutation"],["impl Clone for Target"],["impl Clone for BoneEnd"],["impl Clone for BoneKind"],["impl Clone for Animation"],["impl Clone for Change"],["impl Clone for Frame"],["impl Clone for Angle"],["impl Clone for BoneAxis"],["impl Clone for BoneId"],["impl Clone for Coordinate"],["impl Clone for JointId"],["impl Clone for Vector"]]]]); + var implementors = Object.fromEntries([["FunnyBones",[["impl Clone for Mode"],["impl Clone for ChangeAggregator"],["impl Clone for EditingSkeleton"],["impl Clone for SkeletalBone"]]],["funnybones",[["impl Clone for BoneProperty"],["impl Clone for JointProperty"],["impl Clone for PropertyUpdate"],["impl Clone for Target"],["impl Clone for Value"],["impl Clone for SkeletonMutation"],["impl Clone for Target"],["impl Clone for BoneEnd"],["impl Clone for BoneKind"],["impl Clone for Animation"],["impl Clone for Frame"],["impl Clone for Keyframe"],["impl Clone for Timeline"],["impl Clone for Angle"],["impl Clone for BoneAxis"],["impl Clone for BoneId"],["impl Clone for Coordinate"],["impl Clone for JointId"],["impl Clone for Vector"]]]]); if (window.register_implementors) { window.register_implementors(implementors); } else { window.pending_implementors = implementors; } })() -//{"start":57,"fragment_lengths":[1095,3794]} \ No newline at end of file +//{"start":57,"fragment_lengths":[1095,5205]} \ No newline at end of file diff --git a/main/trait.impl/core/cmp/trait.Eq.js b/main/trait.impl/core/cmp/trait.Eq.js index e15dd3f..f962eda 100644 --- a/main/trait.impl/core/cmp/trait.Eq.js +++ b/main/trait.impl/core/cmp/trait.Eq.js @@ -1,9 +1,9 @@ (function() { - var implementors = Object.fromEntries([["FunnyBones",[["impl Eq for Mode"]]],["funnybones",[["impl Eq for Target"],["impl Eq for BoneEnd"],["impl Eq for BoneAxis"],["impl Eq for BoneId"],["impl Eq for JointId"]]]]); + var implementors = Object.fromEntries([["FunnyBones",[["impl Eq for Mode"]]],["funnybones",[["impl Eq for Target"],["impl Eq for BoneEnd"],["impl Eq for Frame"],["impl Eq for BoneAxis"],["impl Eq for BoneId"],["impl Eq for JointId"]]]]); if (window.register_implementors) { window.register_implementors(implementors); } else { window.pending_implementors = implementors; } })() -//{"start":57,"fragment_lengths":[245,1268]} \ No newline at end of file +//{"start":57,"fragment_lengths":[245,1527]} \ No newline at end of file diff --git a/main/trait.impl/core/cmp/trait.Ord.js b/main/trait.impl/core/cmp/trait.Ord.js index e272d5f..aae4b8a 100644 --- a/main/trait.impl/core/cmp/trait.Ord.js +++ b/main/trait.impl/core/cmp/trait.Ord.js @@ -1,9 +1,9 @@ (function() { - var implementors = Object.fromEntries([["funnybones",[["impl Ord for BoneId"],["impl Ord for JointId"]]]]); + var implementors = Object.fromEntries([["funnybones",[["impl Ord for Frame"],["impl Ord for BoneId"],["impl Ord for JointId"]]]]); if (window.register_implementors) { window.register_implementors(implementors); } else { window.pending_implementors = implementors; } })() -//{"start":57,"fragment_lengths":[507]} \ No newline at end of file +//{"start":57,"fragment_lengths":[769]} \ No newline at end of file diff --git a/main/trait.impl/core/cmp/trait.PartialEq.js b/main/trait.impl/core/cmp/trait.PartialEq.js index dc25aed..197fb75 100644 --- a/main/trait.impl/core/cmp/trait.PartialEq.js +++ b/main/trait.impl/core/cmp/trait.PartialEq.js @@ -1,9 +1,9 @@ (function() { - var implementors = Object.fromEntries([["FunnyBones",[["impl PartialEq for Mode"],["impl PartialEq for EditingSkeleton"],["impl PartialEq for SkeletalBone"]]],["funnybones",[["impl PartialEq for ChangeKind"],["impl PartialEq for SkeletonMutation"],["impl PartialEq for Target"],["impl PartialEq for BoneEnd"],["impl PartialEq for BoneKind"],["impl PartialEq for Animation"],["impl PartialEq for Change"],["impl PartialEq for Frame"],["impl PartialEq for Angle"],["impl PartialEq for Bone"],["impl PartialEq for BoneAxis"],["impl PartialEq for BoneId"],["impl PartialEq for Coordinate"],["impl PartialEq for Joint"],["impl PartialEq for JointId"],["impl PartialEq for Skeleton"],["impl PartialEq for Vector"]]]]); + var implementors = Object.fromEntries([["FunnyBones",[["impl PartialEq for Mode"],["impl PartialEq for EditingSkeleton"],["impl PartialEq for SkeletalBone"]]],["funnybones",[["impl PartialEq for BoneProperty"],["impl PartialEq for JointProperty"],["impl PartialEq for PropertyUpdate"],["impl PartialEq for Target"],["impl PartialEq for Value"],["impl PartialEq for SkeletonMutation"],["impl PartialEq for Target"],["impl PartialEq for BoneEnd"],["impl PartialEq for BoneKind"],["impl PartialEq for Animation"],["impl PartialEq for Frame"],["impl PartialEq for Keyframe"],["impl PartialEq for Timeline"],["impl PartialEq for Angle"],["impl PartialEq for Bone"],["impl PartialEq for BoneAxis"],["impl PartialEq for BoneId"],["impl PartialEq for Coordinate"],["impl PartialEq for Joint"],["impl PartialEq for JointId"],["impl PartialEq for Skeleton"],["impl PartialEq for Vector"]]]]); if (window.register_implementors) { window.register_implementors(implementors); } else { window.pending_implementors = implementors; } })() -//{"start":57,"fragment_lengths":[835,4689]} \ No newline at end of file +//{"start":57,"fragment_lengths":[835,6140]} \ No newline at end of file diff --git a/main/trait.impl/core/cmp/trait.PartialOrd.js b/main/trait.impl/core/cmp/trait.PartialOrd.js index ca7acd3..33261e9 100644 --- a/main/trait.impl/core/cmp/trait.PartialOrd.js +++ b/main/trait.impl/core/cmp/trait.PartialOrd.js @@ -1,9 +1,9 @@ (function() { - var implementors = Object.fromEntries([["funnybones",[["impl PartialOrd for Angle"],["impl PartialOrd for BoneId"],["impl PartialOrd for JointId"]]]]); + var implementors = Object.fromEntries([["funnybones",[["impl PartialOrd for Frame"],["impl PartialOrd for Angle"],["impl PartialOrd for BoneId"],["impl PartialOrd for JointId"]]]]); if (window.register_implementors) { window.register_implementors(implementors); } else { window.pending_implementors = implementors; } })() -//{"start":57,"fragment_lengths":[811]} \ No newline at end of file +//{"start":57,"fragment_lengths":[1094]} \ No newline at end of file diff --git a/main/trait.impl/core/convert/trait.From.js b/main/trait.impl/core/convert/trait.From.js index bf4c1b3..c1b0a03 100644 --- a/main/trait.impl/core/convert/trait.From.js +++ b/main/trait.impl/core/convert/trait.From.js @@ -1,9 +1,9 @@ (function() { - var implementors = Object.fromEntries([["funnybones",[["impl From<ChangeKind> for Change"],["impl From<BoneKind> for LabeledBoneKind"],["impl From<Coordinate> for Vector"],["impl From<Vector> for Coordinate"]]]]); + var implementors = Object.fromEntries([["funnybones",[["impl From<BoneKind> for LabeledBoneKind"],["impl From<bool> for Value"],["impl From<f32> for Value"],["impl From<u32> for Frame"],["impl From<Frame> for f32"],["impl From<Frame> for u32"],["impl From<Frame> for Duration"],["impl From<Coordinate> for Vector"],["impl From<Vector> for Value"],["impl From<Vector> for Coordinate"]]]]); if (window.register_implementors) { window.register_implementors(implementors); } else { window.pending_implementors = implementors; } })() -//{"start":57,"fragment_lengths":[1587]} \ No newline at end of file +//{"start":57,"fragment_lengths":[3851]} \ No newline at end of file diff --git a/main/trait.impl/core/convert/trait.TryFrom.js b/main/trait.impl/core/convert/trait.TryFrom.js new file mode 100644 index 0000000..aec5462 --- /dev/null +++ b/main/trait.impl/core/convert/trait.TryFrom.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["funnybones",[["impl TryFrom<Duration> for Frame"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[450]} \ No newline at end of file diff --git a/main/trait.impl/core/default/trait.Default.js b/main/trait.impl/core/default/trait.Default.js index 14daf29..6e1678c 100644 --- a/main/trait.impl/core/default/trait.Default.js +++ b/main/trait.impl/core/default/trait.Default.js @@ -1,9 +1,9 @@ (function() { - var implementors = Object.fromEntries([["FunnyBones",[["impl Default for Mode"],["impl Default for EditingSkeleton"],["impl Default for SkeletalBone"]]],["funnybones",[["impl Default for Animation"],["impl Default for Angle"],["impl Default for Coordinate"],["impl Default for Skeleton"],["impl Default for Vector"]]]]); + var implementors = Object.fromEntries([["FunnyBones",[["impl Default for Mode"],["impl Default for EditingSkeleton"],["impl Default for SkeletalBone"]]],["funnybones",[["impl Default for Animation"],["impl Default for Frame"],["impl Default for Angle"],["impl Default for Coordinate"],["impl Default for Skeleton"],["impl Default for Vector"]]]]); if (window.register_implementors) { window.register_implementors(implementors); } else { window.pending_implementors = implementors; } })() -//{"start":57,"fragment_lengths":[841,1382]} \ No newline at end of file +//{"start":57,"fragment_lengths":[841,1664]} \ No newline at end of file diff --git a/main/trait.impl/core/fmt/trait.Debug.js b/main/trait.impl/core/fmt/trait.Debug.js index 29a034a..a752984 100644 --- a/main/trait.impl/core/fmt/trait.Debug.js +++ b/main/trait.impl/core/fmt/trait.Debug.js @@ -1,9 +1,9 @@ (function() { - var implementors = Object.fromEntries([["FunnyBones",[["impl Debug for Mode"],["impl Debug for ChangeAggregator"],["impl Debug for EditingSkeleton"],["impl Debug for SkeletalBone"]]],["funnybones",[["impl Debug for ChangeKind"],["impl Debug for SkeletonMutation"],["impl Debug for Target"],["impl Debug for BoneEnd"],["impl Debug for BoneKind"],["impl Debug for Animation"],["impl Debug for Change"],["impl Debug for Frame"],["impl Debug for SkeletonCanvas"],["impl Debug for Angle"],["impl Debug for Bone"],["impl Debug for BoneAxis"],["impl Debug for BoneId"],["impl Debug for Coordinate"],["impl Debug for Joint"],["impl Debug for JointId"],["impl Debug for Skeleton"],["impl Debug for Vector"]]]]); + var implementors = Object.fromEntries([["FunnyBones",[["impl Debug for Mode"],["impl Debug for ChangeAggregator"],["impl Debug for EditingSkeleton"],["impl Debug for SkeletalBone"]]],["funnybones",[["impl Debug for BoneProperty"],["impl Debug for JointProperty"],["impl Debug for PropertyUpdate"],["impl Debug for Target"],["impl Debug for Value"],["impl Debug for SkeletonMutation"],["impl Debug for Target"],["impl Debug for BoneEnd"],["impl Debug for BoneKind"],["impl Debug for Animation"],["impl Debug for Frame"],["impl Debug for Keyframe"],["impl Debug for Timeline"],["impl Debug for SkeletonCanvas"],["impl Debug for Angle"],["impl Debug for Bone"],["impl Debug for BoneAxis"],["impl Debug for BoneId"],["impl Debug for Coordinate"],["impl Debug for Joint"],["impl Debug for JointId"],["impl Debug for Skeleton"],["impl Debug for Vector"]]]]); if (window.register_implementors) { window.register_implementors(implementors); } else { window.pending_implementors = implementors; } })() -//{"start":57,"fragment_lengths":[1079,4805]} \ No newline at end of file +//{"start":57,"fragment_lengths":[1079,6196]} \ No newline at end of file diff --git a/main/trait.impl/core/marker/trait.Copy.js b/main/trait.impl/core/marker/trait.Copy.js index 1908ac5..68c28f3 100644 --- a/main/trait.impl/core/marker/trait.Copy.js +++ b/main/trait.impl/core/marker/trait.Copy.js @@ -1,9 +1,9 @@ (function() { - var implementors = Object.fromEntries([["FunnyBones",[["impl Copy for Mode"]]],["funnybones",[["impl Copy for ChangeKind"],["impl Copy for SkeletonMutation"],["impl Copy for Target"],["impl Copy for BoneEnd"],["impl Copy for BoneKind"],["impl Copy for Change"],["impl Copy for Angle"],["impl Copy for BoneAxis"],["impl Copy for BoneId"],["impl Copy for Coordinate"],["impl Copy for JointId"],["impl Copy for Vector"]]]]); + var implementors = Object.fromEntries([["FunnyBones",[["impl Copy for Mode"]]],["funnybones",[["impl Copy for PropertyUpdate"],["impl Copy for Value"],["impl Copy for SkeletonMutation"],["impl Copy for Target"],["impl Copy for BoneEnd"],["impl Copy for BoneKind"],["impl Copy for Frame"],["impl Copy for Keyframe"],["impl Copy for Angle"],["impl Copy for BoneAxis"],["impl Copy for BoneId"],["impl Copy for Coordinate"],["impl Copy for JointId"],["impl Copy for Vector"]]]]); if (window.register_implementors) { window.register_implementors(implementors); } else { window.pending_implementors = implementors; } })() -//{"start":57,"fragment_lengths":[257,3226]} \ No newline at end of file +//{"start":57,"fragment_lengths":[257,3780]} \ No newline at end of file diff --git a/main/trait.impl/core/marker/trait.Freeze.js b/main/trait.impl/core/marker/trait.Freeze.js index b64bc67..645b5a5 100644 --- a/main/trait.impl/core/marker/trait.Freeze.js +++ b/main/trait.impl/core/marker/trait.Freeze.js @@ -1,9 +1,9 @@ (function() { - var implementors = Object.fromEntries([["FunnyBones",[["impl Freeze for Mode",1,["FunnyBones::Mode"]],["impl Freeze for ChangeAggregator",1,["FunnyBones::ChangeAggregator"]],["impl Freeze for EditingSkeleton",1,["FunnyBones::EditingSkeleton"]],["impl Freeze for SkeletalBone",1,["FunnyBones::SkeletalBone"]]]],["funnybones",[["impl Freeze for ChangeKind",1,["funnybones::animation::ChangeKind"]],["impl Freeze for SkeletonMutation",1,["funnybones::cushy::skeleton_canvas::SkeletonMutation"]],["impl Freeze for Target",1,["funnybones::cushy::skeleton_canvas::Target"]],["impl Freeze for BoneEnd",1,["funnybones::BoneEnd"]],["impl Freeze for BoneKind",1,["funnybones::BoneKind"]],["impl Freeze for Animation",1,["funnybones::animation::Animation"]],["impl Freeze for Change",1,["funnybones::animation::Change"]],["impl Freeze for Frame",1,["funnybones::animation::Frame"]],["impl Freeze for RunningAnimation",1,["funnybones::animation::RunningAnimation"]],["impl Freeze for SkeletonCanvas",1,["funnybones::cushy::skeleton_canvas::SkeletonCanvas"]],["impl Freeze for Angle",1,["funnybones::Angle"]],["impl Freeze for Bone",1,["funnybones::Bone"]],["impl Freeze for BoneAxis",1,["funnybones::BoneAxis"]],["impl Freeze for BoneId",1,["funnybones::BoneId"]],["impl Freeze for Coordinate",1,["funnybones::Coordinate"]],["impl Freeze for Joint",1,["funnybones::Joint"]],["impl Freeze for JointId",1,["funnybones::JointId"]],["impl Freeze for LabeledBoneKind",1,["funnybones::LabeledBoneKind"]],["impl Freeze for Skeleton",1,["funnybones::Skeleton"]],["impl Freeze for Vector",1,["funnybones::Vector"]]]]]); + var implementors = Object.fromEntries([["FunnyBones",[["impl Freeze for Mode",1,["FunnyBones::Mode"]],["impl Freeze for ChangeAggregator",1,["FunnyBones::ChangeAggregator"]],["impl Freeze for EditingSkeleton",1,["FunnyBones::EditingSkeleton"]],["impl Freeze for SkeletalBone",1,["FunnyBones::SkeletalBone"]]]],["funnybones",[["impl Freeze for BoneProperty",1,["funnybones::animation::BoneProperty"]],["impl Freeze for JointProperty",1,["funnybones::animation::JointProperty"]],["impl Freeze for PropertyUpdate",1,["funnybones::animation::PropertyUpdate"]],["impl Freeze for Target",1,["funnybones::animation::Target"]],["impl Freeze for Value",1,["funnybones::animation::Value"]],["impl Freeze for SkeletonMutation",1,["funnybones::cushy::skeleton_canvas::SkeletonMutation"]],["impl Freeze for Target",1,["funnybones::cushy::skeleton_canvas::Target"]],["impl Freeze for BoneEnd",1,["funnybones::BoneEnd"]],["impl Freeze for BoneKind",1,["funnybones::BoneKind"]],["impl Freeze for Animation",1,["funnybones::animation::Animation"]],["impl Freeze for Frame",1,["funnybones::animation::Frame"]],["impl Freeze for Keyframe",1,["funnybones::animation::Keyframe"]],["impl Freeze for RunningAnimation",1,["funnybones::animation::RunningAnimation"]],["impl Freeze for Timeline",1,["funnybones::animation::Timeline"]],["impl Freeze for SkeletonCanvas",1,["funnybones::cushy::skeleton_canvas::SkeletonCanvas"]],["impl Freeze for Angle",1,["funnybones::Angle"]],["impl Freeze for Bone",1,["funnybones::Bone"]],["impl Freeze for BoneAxis",1,["funnybones::BoneAxis"]],["impl Freeze for BoneId",1,["funnybones::BoneId"]],["impl Freeze for Coordinate",1,["funnybones::Coordinate"]],["impl Freeze for Joint",1,["funnybones::Joint"]],["impl Freeze for JointId",1,["funnybones::JointId"]],["impl Freeze for LabeledBoneKind",1,["funnybones::LabeledBoneKind"]],["impl Freeze for Skeleton",1,["funnybones::Skeleton"]],["impl Freeze for Vector",1,["funnybones::Vector"]]]]]); if (window.register_implementors) { window.register_implementors(implementors); } else { window.pending_implementors = implementors; } })() -//{"start":57,"fragment_lengths":[1238,6241]} \ No newline at end of file +//{"start":57,"fragment_lengths":[1238,7877]} \ No newline at end of file diff --git a/main/trait.impl/core/marker/trait.Send.js b/main/trait.impl/core/marker/trait.Send.js index 6b9fbb6..39fdf52 100644 --- a/main/trait.impl/core/marker/trait.Send.js +++ b/main/trait.impl/core/marker/trait.Send.js @@ -1,9 +1,9 @@ (function() { - var implementors = Object.fromEntries([["FunnyBones",[["impl Send for Mode",1,["FunnyBones::Mode"]],["impl Send for ChangeAggregator",1,["FunnyBones::ChangeAggregator"]],["impl Send for EditingSkeleton",1,["FunnyBones::EditingSkeleton"]],["impl Send for SkeletalBone",1,["FunnyBones::SkeletalBone"]]]],["funnybones",[["impl Send for ChangeKind",1,["funnybones::animation::ChangeKind"]],["impl Send for SkeletonMutation",1,["funnybones::cushy::skeleton_canvas::SkeletonMutation"]],["impl Send for Target",1,["funnybones::cushy::skeleton_canvas::Target"]],["impl Send for BoneEnd",1,["funnybones::BoneEnd"]],["impl Send for BoneKind",1,["funnybones::BoneKind"]],["impl Send for Animation",1,["funnybones::animation::Animation"]],["impl Send for Change",1,["funnybones::animation::Change"]],["impl Send for Frame",1,["funnybones::animation::Frame"]],["impl Send for RunningAnimation",1,["funnybones::animation::RunningAnimation"]],["impl Send for SkeletonCanvas",1,["funnybones::cushy::skeleton_canvas::SkeletonCanvas"]],["impl Send for Angle",1,["funnybones::Angle"]],["impl Send for Bone",1,["funnybones::Bone"]],["impl Send for BoneAxis",1,["funnybones::BoneAxis"]],["impl Send for BoneId",1,["funnybones::BoneId"]],["impl Send for Coordinate",1,["funnybones::Coordinate"]],["impl Send for Joint",1,["funnybones::Joint"]],["impl Send for JointId",1,["funnybones::JointId"]],["impl Send for LabeledBoneKind",1,["funnybones::LabeledBoneKind"]],["impl Send for Skeleton",1,["funnybones::Skeleton"]],["impl Send for Vector",1,["funnybones::Vector"]]]]]); + var implementors = Object.fromEntries([["FunnyBones",[["impl Send for Mode",1,["FunnyBones::Mode"]],["impl Send for ChangeAggregator",1,["FunnyBones::ChangeAggregator"]],["impl Send for EditingSkeleton",1,["FunnyBones::EditingSkeleton"]],["impl Send for SkeletalBone",1,["FunnyBones::SkeletalBone"]]]],["funnybones",[["impl Send for BoneProperty",1,["funnybones::animation::BoneProperty"]],["impl Send for JointProperty",1,["funnybones::animation::JointProperty"]],["impl Send for PropertyUpdate",1,["funnybones::animation::PropertyUpdate"]],["impl Send for Target",1,["funnybones::animation::Target"]],["impl Send for Value",1,["funnybones::animation::Value"]],["impl Send for SkeletonMutation",1,["funnybones::cushy::skeleton_canvas::SkeletonMutation"]],["impl Send for Target",1,["funnybones::cushy::skeleton_canvas::Target"]],["impl Send for BoneEnd",1,["funnybones::BoneEnd"]],["impl Send for BoneKind",1,["funnybones::BoneKind"]],["impl Send for Animation",1,["funnybones::animation::Animation"]],["impl Send for Frame",1,["funnybones::animation::Frame"]],["impl Send for Keyframe",1,["funnybones::animation::Keyframe"]],["impl Send for RunningAnimation",1,["funnybones::animation::RunningAnimation"]],["impl Send for Timeline",1,["funnybones::animation::Timeline"]],["impl Send for SkeletonCanvas",1,["funnybones::cushy::skeleton_canvas::SkeletonCanvas"]],["impl Send for Angle",1,["funnybones::Angle"]],["impl Send for Bone",1,["funnybones::Bone"]],["impl Send for BoneAxis",1,["funnybones::BoneAxis"]],["impl Send for BoneId",1,["funnybones::BoneId"]],["impl Send for Coordinate",1,["funnybones::Coordinate"]],["impl Send for Joint",1,["funnybones::Joint"]],["impl Send for JointId",1,["funnybones::JointId"]],["impl Send for LabeledBoneKind",1,["funnybones::LabeledBoneKind"]],["impl Send for Skeleton",1,["funnybones::Skeleton"]],["impl Send for Vector",1,["funnybones::Vector"]]]]]); if (window.register_implementors) { window.register_implementors(implementors); } else { window.pending_implementors = implementors; } })() -//{"start":57,"fragment_lengths":[1214,6121]} \ No newline at end of file +//{"start":57,"fragment_lengths":[1214,7727]} \ No newline at end of file diff --git a/main/trait.impl/core/marker/trait.StructuralPartialEq.js b/main/trait.impl/core/marker/trait.StructuralPartialEq.js index 99978a1..455c8fd 100644 --- a/main/trait.impl/core/marker/trait.StructuralPartialEq.js +++ b/main/trait.impl/core/marker/trait.StructuralPartialEq.js @@ -1,9 +1,9 @@ (function() { - var implementors = Object.fromEntries([["FunnyBones",[["impl StructuralPartialEq for Mode"],["impl StructuralPartialEq for EditingSkeleton"],["impl StructuralPartialEq for SkeletalBone"]]],["funnybones",[["impl StructuralPartialEq for ChangeKind"],["impl StructuralPartialEq for SkeletonMutation"],["impl StructuralPartialEq for Target"],["impl StructuralPartialEq for BoneEnd"],["impl StructuralPartialEq for BoneKind"],["impl StructuralPartialEq for Animation"],["impl StructuralPartialEq for Change"],["impl StructuralPartialEq for Frame"],["impl StructuralPartialEq for Angle"],["impl StructuralPartialEq for Bone"],["impl StructuralPartialEq for BoneAxis"],["impl StructuralPartialEq for BoneId"],["impl StructuralPartialEq for Coordinate"],["impl StructuralPartialEq for Joint"],["impl StructuralPartialEq for JointId"],["impl StructuralPartialEq for Skeleton"],["impl StructuralPartialEq for Vector"]]]]); + var implementors = Object.fromEntries([["FunnyBones",[["impl StructuralPartialEq for Mode"],["impl StructuralPartialEq for EditingSkeleton"],["impl StructuralPartialEq for SkeletalBone"]]],["funnybones",[["impl StructuralPartialEq for BoneProperty"],["impl StructuralPartialEq for JointProperty"],["impl StructuralPartialEq for PropertyUpdate"],["impl StructuralPartialEq for Target"],["impl StructuralPartialEq for Value"],["impl StructuralPartialEq for SkeletonMutation"],["impl StructuralPartialEq for Target"],["impl StructuralPartialEq for BoneEnd"],["impl StructuralPartialEq for BoneKind"],["impl StructuralPartialEq for Animation"],["impl StructuralPartialEq for Frame"],["impl StructuralPartialEq for Keyframe"],["impl StructuralPartialEq for Timeline"],["impl StructuralPartialEq for Angle"],["impl StructuralPartialEq for Bone"],["impl StructuralPartialEq for BoneAxis"],["impl StructuralPartialEq for BoneId"],["impl StructuralPartialEq for Coordinate"],["impl StructuralPartialEq for Joint"],["impl StructuralPartialEq for JointId"],["impl StructuralPartialEq for Skeleton"],["impl StructuralPartialEq for Vector"]]]]); if (window.register_implementors) { window.register_implementors(implementors); } else { window.pending_implementors = implementors; } })() -//{"start":57,"fragment_lengths":[943,5301]} \ No newline at end of file +//{"start":57,"fragment_lengths":[943,6932]} \ No newline at end of file diff --git a/main/trait.impl/core/marker/trait.Sync.js b/main/trait.impl/core/marker/trait.Sync.js index 123ebb6..28aaa22 100644 --- a/main/trait.impl/core/marker/trait.Sync.js +++ b/main/trait.impl/core/marker/trait.Sync.js @@ -1,9 +1,9 @@ (function() { - var implementors = Object.fromEntries([["FunnyBones",[["impl Sync for Mode",1,["FunnyBones::Mode"]],["impl Sync for ChangeAggregator",1,["FunnyBones::ChangeAggregator"]],["impl Sync for EditingSkeleton",1,["FunnyBones::EditingSkeleton"]],["impl Sync for SkeletalBone",1,["FunnyBones::SkeletalBone"]]]],["funnybones",[["impl !Sync for SkeletonCanvas",1,["funnybones::cushy::skeleton_canvas::SkeletonCanvas"]],["impl Sync for ChangeKind",1,["funnybones::animation::ChangeKind"]],["impl Sync for SkeletonMutation",1,["funnybones::cushy::skeleton_canvas::SkeletonMutation"]],["impl Sync for Target",1,["funnybones::cushy::skeleton_canvas::Target"]],["impl Sync for BoneEnd",1,["funnybones::BoneEnd"]],["impl Sync for BoneKind",1,["funnybones::BoneKind"]],["impl Sync for Animation",1,["funnybones::animation::Animation"]],["impl Sync for Change",1,["funnybones::animation::Change"]],["impl Sync for Frame",1,["funnybones::animation::Frame"]],["impl Sync for RunningAnimation",1,["funnybones::animation::RunningAnimation"]],["impl Sync for Angle",1,["funnybones::Angle"]],["impl Sync for Bone",1,["funnybones::Bone"]],["impl Sync for BoneAxis",1,["funnybones::BoneAxis"]],["impl Sync for BoneId",1,["funnybones::BoneId"]],["impl Sync for Coordinate",1,["funnybones::Coordinate"]],["impl Sync for Joint",1,["funnybones::Joint"]],["impl Sync for JointId",1,["funnybones::JointId"]],["impl Sync for LabeledBoneKind",1,["funnybones::LabeledBoneKind"]],["impl Sync for Skeleton",1,["funnybones::Skeleton"]],["impl Sync for Vector",1,["funnybones::Vector"]]]]]); + var implementors = Object.fromEntries([["FunnyBones",[["impl Sync for Mode",1,["FunnyBones::Mode"]],["impl Sync for ChangeAggregator",1,["FunnyBones::ChangeAggregator"]],["impl Sync for EditingSkeleton",1,["FunnyBones::EditingSkeleton"]],["impl Sync for SkeletalBone",1,["FunnyBones::SkeletalBone"]]]],["funnybones",[["impl !Sync for SkeletonCanvas",1,["funnybones::cushy::skeleton_canvas::SkeletonCanvas"]],["impl Sync for BoneProperty",1,["funnybones::animation::BoneProperty"]],["impl Sync for JointProperty",1,["funnybones::animation::JointProperty"]],["impl Sync for PropertyUpdate",1,["funnybones::animation::PropertyUpdate"]],["impl Sync for Target",1,["funnybones::animation::Target"]],["impl Sync for Value",1,["funnybones::animation::Value"]],["impl Sync for SkeletonMutation",1,["funnybones::cushy::skeleton_canvas::SkeletonMutation"]],["impl Sync for Target",1,["funnybones::cushy::skeleton_canvas::Target"]],["impl Sync for BoneEnd",1,["funnybones::BoneEnd"]],["impl Sync for BoneKind",1,["funnybones::BoneKind"]],["impl Sync for Animation",1,["funnybones::animation::Animation"]],["impl Sync for Frame",1,["funnybones::animation::Frame"]],["impl Sync for Keyframe",1,["funnybones::animation::Keyframe"]],["impl Sync for RunningAnimation",1,["funnybones::animation::RunningAnimation"]],["impl Sync for Timeline",1,["funnybones::animation::Timeline"]],["impl Sync for Angle",1,["funnybones::Angle"]],["impl Sync for Bone",1,["funnybones::Bone"]],["impl Sync for BoneAxis",1,["funnybones::BoneAxis"]],["impl Sync for BoneId",1,["funnybones::BoneId"]],["impl Sync for Coordinate",1,["funnybones::Coordinate"]],["impl Sync for Joint",1,["funnybones::Joint"]],["impl Sync for JointId",1,["funnybones::JointId"]],["impl Sync for LabeledBoneKind",1,["funnybones::LabeledBoneKind"]],["impl Sync for Skeleton",1,["funnybones::Skeleton"]],["impl Sync for Vector",1,["funnybones::Vector"]]]]]); if (window.register_implementors) { window.register_implementors(implementors); } else { window.pending_implementors = implementors; } })() -//{"start":57,"fragment_lengths":[1214,6122]} \ No newline at end of file +//{"start":57,"fragment_lengths":[1214,7728]} \ No newline at end of file diff --git a/main/trait.impl/core/marker/trait.Unpin.js b/main/trait.impl/core/marker/trait.Unpin.js index c084dba..8c8fdd4 100644 --- a/main/trait.impl/core/marker/trait.Unpin.js +++ b/main/trait.impl/core/marker/trait.Unpin.js @@ -1,9 +1,9 @@ (function() { - var implementors = Object.fromEntries([["FunnyBones",[["impl Unpin for Mode",1,["FunnyBones::Mode"]],["impl Unpin for ChangeAggregator",1,["FunnyBones::ChangeAggregator"]],["impl Unpin for EditingSkeleton",1,["FunnyBones::EditingSkeleton"]],["impl Unpin for SkeletalBone",1,["FunnyBones::SkeletalBone"]]]],["funnybones",[["impl Unpin for ChangeKind",1,["funnybones::animation::ChangeKind"]],["impl Unpin for SkeletonMutation",1,["funnybones::cushy::skeleton_canvas::SkeletonMutation"]],["impl Unpin for Target",1,["funnybones::cushy::skeleton_canvas::Target"]],["impl Unpin for BoneEnd",1,["funnybones::BoneEnd"]],["impl Unpin for BoneKind",1,["funnybones::BoneKind"]],["impl Unpin for Animation",1,["funnybones::animation::Animation"]],["impl Unpin for Change",1,["funnybones::animation::Change"]],["impl Unpin for Frame",1,["funnybones::animation::Frame"]],["impl Unpin for RunningAnimation",1,["funnybones::animation::RunningAnimation"]],["impl Unpin for SkeletonCanvas",1,["funnybones::cushy::skeleton_canvas::SkeletonCanvas"]],["impl Unpin for Angle",1,["funnybones::Angle"]],["impl Unpin for Bone",1,["funnybones::Bone"]],["impl Unpin for BoneAxis",1,["funnybones::BoneAxis"]],["impl Unpin for BoneId",1,["funnybones::BoneId"]],["impl Unpin for Coordinate",1,["funnybones::Coordinate"]],["impl Unpin for Joint",1,["funnybones::Joint"]],["impl Unpin for JointId",1,["funnybones::JointId"]],["impl Unpin for LabeledBoneKind",1,["funnybones::LabeledBoneKind"]],["impl Unpin for Skeleton",1,["funnybones::Skeleton"]],["impl Unpin for Vector",1,["funnybones::Vector"]]]]]); + var implementors = Object.fromEntries([["FunnyBones",[["impl Unpin for Mode",1,["FunnyBones::Mode"]],["impl Unpin for ChangeAggregator",1,["FunnyBones::ChangeAggregator"]],["impl Unpin for EditingSkeleton",1,["FunnyBones::EditingSkeleton"]],["impl Unpin for SkeletalBone",1,["FunnyBones::SkeletalBone"]]]],["funnybones",[["impl Unpin for BoneProperty",1,["funnybones::animation::BoneProperty"]],["impl Unpin for JointProperty",1,["funnybones::animation::JointProperty"]],["impl Unpin for PropertyUpdate",1,["funnybones::animation::PropertyUpdate"]],["impl Unpin for Target",1,["funnybones::animation::Target"]],["impl Unpin for Value",1,["funnybones::animation::Value"]],["impl Unpin for SkeletonMutation",1,["funnybones::cushy::skeleton_canvas::SkeletonMutation"]],["impl Unpin for Target",1,["funnybones::cushy::skeleton_canvas::Target"]],["impl Unpin for BoneEnd",1,["funnybones::BoneEnd"]],["impl Unpin for BoneKind",1,["funnybones::BoneKind"]],["impl Unpin for Animation",1,["funnybones::animation::Animation"]],["impl Unpin for Frame",1,["funnybones::animation::Frame"]],["impl Unpin for Keyframe",1,["funnybones::animation::Keyframe"]],["impl Unpin for RunningAnimation",1,["funnybones::animation::RunningAnimation"]],["impl Unpin for Timeline",1,["funnybones::animation::Timeline"]],["impl Unpin for SkeletonCanvas",1,["funnybones::cushy::skeleton_canvas::SkeletonCanvas"]],["impl Unpin for Angle",1,["funnybones::Angle"]],["impl Unpin for Bone",1,["funnybones::Bone"]],["impl Unpin for BoneAxis",1,["funnybones::BoneAxis"]],["impl Unpin for BoneId",1,["funnybones::BoneId"]],["impl Unpin for Coordinate",1,["funnybones::Coordinate"]],["impl Unpin for Joint",1,["funnybones::Joint"]],["impl Unpin for JointId",1,["funnybones::JointId"]],["impl Unpin for LabeledBoneKind",1,["funnybones::LabeledBoneKind"]],["impl Unpin for Skeleton",1,["funnybones::Skeleton"]],["impl Unpin for Vector",1,["funnybones::Vector"]]]]]); if (window.register_implementors) { window.register_implementors(implementors); } else { window.pending_implementors = implementors; } })() -//{"start":57,"fragment_lengths":[1226,6181]} \ No newline at end of file +//{"start":57,"fragment_lengths":[1226,7802]} \ No newline at end of file diff --git a/main/trait.impl/core/ops/arith/trait.Add.js b/main/trait.impl/core/ops/arith/trait.Add.js index 2cb8143..0e7f7a5 100644 --- a/main/trait.impl/core/ops/arith/trait.Add.js +++ b/main/trait.impl/core/ops/arith/trait.Add.js @@ -1,9 +1,9 @@ (function() { - var implementors = Object.fromEntries([["funnybones",[["impl Add for Angle"],["impl Add for Coordinate"],["impl Add<Angle> for Vector"],["impl Add<Vector> for Coordinate"]]]]); + var implementors = Object.fromEntries([["funnybones",[["impl Add for Value"],["impl Add for Angle"],["impl Add for Coordinate"],["impl Add for Vector"],["impl Add<Angle> for Vector"],["impl Add<Vector> for Coordinate"]]]]); if (window.register_implementors) { window.register_implementors(implementors); } else { window.pending_implementors = implementors; } })() -//{"start":57,"fragment_lengths":[1288]} \ No newline at end of file +//{"start":57,"fragment_lengths":[1814]} \ No newline at end of file diff --git a/main/trait.impl/core/ops/arith/trait.Sub.js b/main/trait.impl/core/ops/arith/trait.Sub.js index d06eaf5..2fddfba 100644 --- a/main/trait.impl/core/ops/arith/trait.Sub.js +++ b/main/trait.impl/core/ops/arith/trait.Sub.js @@ -1,9 +1,9 @@ (function() { - var implementors = Object.fromEntries([["funnybones",[["impl Sub for Angle"],["impl Sub for Coordinate"],["impl Sub<Angle> for Vector"],["impl Sub<Vector> for Coordinate"]]]]); + var implementors = Object.fromEntries([["funnybones",[["impl Sub for Frame"],["impl Sub for Angle"],["impl Sub for Coordinate"],["impl Sub<Angle> for Vector"],["impl Sub<Vector> for Coordinate"]]]]); if (window.register_implementors) { window.register_implementors(implementors); } else { window.pending_implementors = implementors; } })() -//{"start":57,"fragment_lengths":[1288]} \ No newline at end of file +//{"start":57,"fragment_lengths":[1563]} \ No newline at end of file diff --git a/main/trait.impl/core/ops/deref/trait.Deref.js b/main/trait.impl/core/ops/deref/trait.Deref.js index 26d3218..b98df3c 100644 --- a/main/trait.impl/core/ops/deref/trait.Deref.js +++ b/main/trait.impl/core/ops/deref/trait.Deref.js @@ -1,9 +1,9 @@ (function() { - var implementors = Object.fromEntries([["funnybones",[["impl Deref for Animation"],["impl Deref for Frame"]]]]); + var implementors = Object.fromEntries([["funnybones",[["impl Deref for Animation"],["impl Deref for Timeline"]]]]); if (window.register_implementors) { window.register_implementors(implementors); } else { window.pending_implementors = implementors; } })() -//{"start":57,"fragment_lengths":[590]} \ No newline at end of file +//{"start":57,"fragment_lengths":[599]} \ No newline at end of file diff --git a/main/trait.impl/core/ops/deref/trait.DerefMut.js b/main/trait.impl/core/ops/deref/trait.DerefMut.js index 883765c..7e252cb 100644 --- a/main/trait.impl/core/ops/deref/trait.DerefMut.js +++ b/main/trait.impl/core/ops/deref/trait.DerefMut.js @@ -1,9 +1,9 @@ (function() { - var implementors = Object.fromEntries([["funnybones",[["impl DerefMut for Animation"],["impl DerefMut for Frame"]]]]); + var implementors = Object.fromEntries([["funnybones",[["impl DerefMut for Animation"],["impl DerefMut for Timeline"]]]]); if (window.register_implementors) { window.register_implementors(implementors); } else { window.pending_implementors = implementors; } })() -//{"start":57,"fragment_lengths":[608]} \ No newline at end of file +//{"start":57,"fragment_lengths":[617]} \ No newline at end of file diff --git a/main/trait.impl/core/panic/unwind_safe/trait.RefUnwindSafe.js b/main/trait.impl/core/panic/unwind_safe/trait.RefUnwindSafe.js index 6601ae0..b77f1a4 100644 --- a/main/trait.impl/core/panic/unwind_safe/trait.RefUnwindSafe.js +++ b/main/trait.impl/core/panic/unwind_safe/trait.RefUnwindSafe.js @@ -1,9 +1,9 @@ (function() { - var implementors = Object.fromEntries([["FunnyBones",[["impl !RefUnwindSafe for ChangeAggregator",1,["FunnyBones::ChangeAggregator"]],["impl !RefUnwindSafe for EditingSkeleton",1,["FunnyBones::EditingSkeleton"]],["impl !RefUnwindSafe for SkeletalBone",1,["FunnyBones::SkeletalBone"]],["impl RefUnwindSafe for Mode",1,["FunnyBones::Mode"]]]],["funnybones",[["impl !RefUnwindSafe for SkeletonCanvas",1,["funnybones::cushy::skeleton_canvas::SkeletonCanvas"]],["impl RefUnwindSafe for ChangeKind",1,["funnybones::animation::ChangeKind"]],["impl RefUnwindSafe for SkeletonMutation",1,["funnybones::cushy::skeleton_canvas::SkeletonMutation"]],["impl RefUnwindSafe for Target",1,["funnybones::cushy::skeleton_canvas::Target"]],["impl RefUnwindSafe for BoneEnd",1,["funnybones::BoneEnd"]],["impl RefUnwindSafe for BoneKind",1,["funnybones::BoneKind"]],["impl RefUnwindSafe for Animation",1,["funnybones::animation::Animation"]],["impl RefUnwindSafe for Change",1,["funnybones::animation::Change"]],["impl RefUnwindSafe for Frame",1,["funnybones::animation::Frame"]],["impl RefUnwindSafe for RunningAnimation",1,["funnybones::animation::RunningAnimation"]],["impl RefUnwindSafe for Angle",1,["funnybones::Angle"]],["impl RefUnwindSafe for Bone",1,["funnybones::Bone"]],["impl RefUnwindSafe for BoneAxis",1,["funnybones::BoneAxis"]],["impl RefUnwindSafe for BoneId",1,["funnybones::BoneId"]],["impl RefUnwindSafe for Coordinate",1,["funnybones::Coordinate"]],["impl RefUnwindSafe for Joint",1,["funnybones::Joint"]],["impl RefUnwindSafe for JointId",1,["funnybones::JointId"]],["impl RefUnwindSafe for LabeledBoneKind",1,["funnybones::LabeledBoneKind"]],["impl RefUnwindSafe for Skeleton",1,["funnybones::Skeleton"]],["impl RefUnwindSafe for Vector",1,["funnybones::Vector"]]]]]); + var implementors = Object.fromEntries([["FunnyBones",[["impl !RefUnwindSafe for ChangeAggregator",1,["FunnyBones::ChangeAggregator"]],["impl !RefUnwindSafe for EditingSkeleton",1,["FunnyBones::EditingSkeleton"]],["impl !RefUnwindSafe for SkeletalBone",1,["FunnyBones::SkeletalBone"]],["impl RefUnwindSafe for Mode",1,["FunnyBones::Mode"]]]],["funnybones",[["impl !RefUnwindSafe for SkeletonCanvas",1,["funnybones::cushy::skeleton_canvas::SkeletonCanvas"]],["impl RefUnwindSafe for BoneProperty",1,["funnybones::animation::BoneProperty"]],["impl RefUnwindSafe for JointProperty",1,["funnybones::animation::JointProperty"]],["impl RefUnwindSafe for PropertyUpdate",1,["funnybones::animation::PropertyUpdate"]],["impl RefUnwindSafe for Target",1,["funnybones::animation::Target"]],["impl RefUnwindSafe for Value",1,["funnybones::animation::Value"]],["impl RefUnwindSafe for SkeletonMutation",1,["funnybones::cushy::skeleton_canvas::SkeletonMutation"]],["impl RefUnwindSafe for Target",1,["funnybones::cushy::skeleton_canvas::Target"]],["impl RefUnwindSafe for BoneEnd",1,["funnybones::BoneEnd"]],["impl RefUnwindSafe for BoneKind",1,["funnybones::BoneKind"]],["impl RefUnwindSafe for Animation",1,["funnybones::animation::Animation"]],["impl RefUnwindSafe for Frame",1,["funnybones::animation::Frame"]],["impl RefUnwindSafe for Keyframe",1,["funnybones::animation::Keyframe"]],["impl RefUnwindSafe for RunningAnimation",1,["funnybones::animation::RunningAnimation"]],["impl RefUnwindSafe for Timeline",1,["funnybones::animation::Timeline"]],["impl RefUnwindSafe for Angle",1,["funnybones::Angle"]],["impl RefUnwindSafe for Bone",1,["funnybones::Bone"]],["impl RefUnwindSafe for BoneAxis",1,["funnybones::BoneAxis"]],["impl RefUnwindSafe for BoneId",1,["funnybones::BoneId"]],["impl RefUnwindSafe for Coordinate",1,["funnybones::Coordinate"]],["impl RefUnwindSafe for Joint",1,["funnybones::Joint"]],["impl RefUnwindSafe for JointId",1,["funnybones::JointId"]],["impl RefUnwindSafe for LabeledBoneKind",1,["funnybones::LabeledBoneKind"]],["impl RefUnwindSafe for Skeleton",1,["funnybones::Skeleton"]],["impl RefUnwindSafe for Vector",1,["funnybones::Vector"]]]]]); if (window.register_implementors) { window.register_implementors(implementors); } else { window.pending_implementors = implementors; } })() -//{"start":57,"fragment_lengths":[1417,7122]} \ No newline at end of file +//{"start":57,"fragment_lengths":[1417,8978]} \ No newline at end of file diff --git a/main/trait.impl/core/panic/unwind_safe/trait.UnwindSafe.js b/main/trait.impl/core/panic/unwind_safe/trait.UnwindSafe.js index 20406f6..267a79a 100644 --- a/main/trait.impl/core/panic/unwind_safe/trait.UnwindSafe.js +++ b/main/trait.impl/core/panic/unwind_safe/trait.UnwindSafe.js @@ -1,9 +1,9 @@ (function() { - var implementors = Object.fromEntries([["FunnyBones",[["impl !UnwindSafe for ChangeAggregator",1,["FunnyBones::ChangeAggregator"]],["impl !UnwindSafe for EditingSkeleton",1,["FunnyBones::EditingSkeleton"]],["impl !UnwindSafe for SkeletalBone",1,["FunnyBones::SkeletalBone"]],["impl UnwindSafe for Mode",1,["FunnyBones::Mode"]]]],["funnybones",[["impl !UnwindSafe for SkeletonCanvas",1,["funnybones::cushy::skeleton_canvas::SkeletonCanvas"]],["impl UnwindSafe for ChangeKind",1,["funnybones::animation::ChangeKind"]],["impl UnwindSafe for SkeletonMutation",1,["funnybones::cushy::skeleton_canvas::SkeletonMutation"]],["impl UnwindSafe for Target",1,["funnybones::cushy::skeleton_canvas::Target"]],["impl UnwindSafe for BoneEnd",1,["funnybones::BoneEnd"]],["impl UnwindSafe for BoneKind",1,["funnybones::BoneKind"]],["impl UnwindSafe for Animation",1,["funnybones::animation::Animation"]],["impl UnwindSafe for Change",1,["funnybones::animation::Change"]],["impl UnwindSafe for Frame",1,["funnybones::animation::Frame"]],["impl UnwindSafe for RunningAnimation",1,["funnybones::animation::RunningAnimation"]],["impl UnwindSafe for Angle",1,["funnybones::Angle"]],["impl UnwindSafe for Bone",1,["funnybones::Bone"]],["impl UnwindSafe for BoneAxis",1,["funnybones::BoneAxis"]],["impl UnwindSafe for BoneId",1,["funnybones::BoneId"]],["impl UnwindSafe for Coordinate",1,["funnybones::Coordinate"]],["impl UnwindSafe for Joint",1,["funnybones::Joint"]],["impl UnwindSafe for JointId",1,["funnybones::JointId"]],["impl UnwindSafe for LabeledBoneKind",1,["funnybones::LabeledBoneKind"]],["impl UnwindSafe for Skeleton",1,["funnybones::Skeleton"]],["impl UnwindSafe for Vector",1,["funnybones::Vector"]]]]]); + var implementors = Object.fromEntries([["FunnyBones",[["impl !UnwindSafe for ChangeAggregator",1,["FunnyBones::ChangeAggregator"]],["impl !UnwindSafe for EditingSkeleton",1,["FunnyBones::EditingSkeleton"]],["impl !UnwindSafe for SkeletalBone",1,["FunnyBones::SkeletalBone"]],["impl UnwindSafe for Mode",1,["FunnyBones::Mode"]]]],["funnybones",[["impl !UnwindSafe for SkeletonCanvas",1,["funnybones::cushy::skeleton_canvas::SkeletonCanvas"]],["impl UnwindSafe for BoneProperty",1,["funnybones::animation::BoneProperty"]],["impl UnwindSafe for JointProperty",1,["funnybones::animation::JointProperty"]],["impl UnwindSafe for PropertyUpdate",1,["funnybones::animation::PropertyUpdate"]],["impl UnwindSafe for Target",1,["funnybones::animation::Target"]],["impl UnwindSafe for Value",1,["funnybones::animation::Value"]],["impl UnwindSafe for SkeletonMutation",1,["funnybones::cushy::skeleton_canvas::SkeletonMutation"]],["impl UnwindSafe for Target",1,["funnybones::cushy::skeleton_canvas::Target"]],["impl UnwindSafe for BoneEnd",1,["funnybones::BoneEnd"]],["impl UnwindSafe for BoneKind",1,["funnybones::BoneKind"]],["impl UnwindSafe for Animation",1,["funnybones::animation::Animation"]],["impl UnwindSafe for Frame",1,["funnybones::animation::Frame"]],["impl UnwindSafe for Keyframe",1,["funnybones::animation::Keyframe"]],["impl UnwindSafe for RunningAnimation",1,["funnybones::animation::RunningAnimation"]],["impl UnwindSafe for Timeline",1,["funnybones::animation::Timeline"]],["impl UnwindSafe for Angle",1,["funnybones::Angle"]],["impl UnwindSafe for Bone",1,["funnybones::Bone"]],["impl UnwindSafe for BoneAxis",1,["funnybones::BoneAxis"]],["impl UnwindSafe for BoneId",1,["funnybones::BoneId"]],["impl UnwindSafe for Coordinate",1,["funnybones::Coordinate"]],["impl UnwindSafe for Joint",1,["funnybones::Joint"]],["impl UnwindSafe for JointId",1,["funnybones::JointId"]],["impl UnwindSafe for LabeledBoneKind",1,["funnybones::LabeledBoneKind"]],["impl UnwindSafe for Skeleton",1,["funnybones::Skeleton"]],["impl UnwindSafe for Vector",1,["funnybones::Vector"]]]]]); if (window.register_implementors) { window.register_implementors(implementors); } else { window.pending_implementors = implementors; } })() -//{"start":57,"fragment_lengths":[1381,6942]} \ No newline at end of file +//{"start":57,"fragment_lengths":[1381,8753]} \ No newline at end of file diff --git a/main/trait.impl/serde/de/trait.Deserialize.js b/main/trait.impl/serde/de/trait.Deserialize.js index f6b303c..f475b62 100644 --- a/main/trait.impl/serde/de/trait.Deserialize.js +++ b/main/trait.impl/serde/de/trait.Deserialize.js @@ -1,9 +1,9 @@ (function() { - var implementors = Object.fromEntries([["funnybones",[["impl<'de> Deserialize<'de> for ChangeKind"],["impl<'de> Deserialize<'de> for BoneEnd"],["impl<'de> Deserialize<'de> for BoneKind"],["impl<'de> Deserialize<'de> for Change"],["impl<'de> Deserialize<'de> for Frame"],["impl<'de> Deserialize<'de> for Angle"],["impl<'de> Deserialize<'de> for BoneAxis"],["impl<'de> Deserialize<'de> for BoneId"],["impl<'de> Deserialize<'de> for Coordinate"],["impl<'de> Deserialize<'de> for JointId"],["impl<'de> Deserialize<'de> for Skeleton"],["impl<'de> Deserialize<'de> for Vector"]]]]); + var implementors = Object.fromEntries([["funnybones",[["impl<'de> Deserialize<'de> for BoneProperty"],["impl<'de> Deserialize<'de> for JointProperty"],["impl<'de> Deserialize<'de> for PropertyUpdate"],["impl<'de> Deserialize<'de> for Target"],["impl<'de> Deserialize<'de> for Value"],["impl<'de> Deserialize<'de> for BoneEnd"],["impl<'de> Deserialize<'de> for BoneKind"],["impl<'de> Deserialize<'de> for Frame"],["impl<'de> Deserialize<'de> for Keyframe"],["impl<'de> Deserialize<'de> for Timeline"],["impl<'de> Deserialize<'de> for Angle"],["impl<'de> Deserialize<'de> for BoneAxis"],["impl<'de> Deserialize<'de> for BoneId"],["impl<'de> Deserialize<'de> for Coordinate"],["impl<'de> Deserialize<'de> for JointId"],["impl<'de> Deserialize<'de> for Skeleton"],["impl<'de> Deserialize<'de> for Vector"]]]]); if (window.register_implementors) { window.register_implementors(implementors); } else { window.pending_implementors = implementors; } })() -//{"start":57,"fragment_lengths":[3535]} \ No newline at end of file +//{"start":57,"fragment_lengths":[5106]} \ No newline at end of file diff --git a/main/trait.impl/serde/ser/trait.Serialize.js b/main/trait.impl/serde/ser/trait.Serialize.js index 4d14891..5d8104c 100644 --- a/main/trait.impl/serde/ser/trait.Serialize.js +++ b/main/trait.impl/serde/ser/trait.Serialize.js @@ -1,9 +1,9 @@ (function() { - var implementors = Object.fromEntries([["funnybones",[["impl Serialize for ChangeKind"],["impl Serialize for BoneEnd"],["impl Serialize for BoneKind"],["impl Serialize for Change"],["impl Serialize for Frame"],["impl Serialize for Angle"],["impl Serialize for Bone"],["impl Serialize for BoneAxis"],["impl Serialize for BoneId"],["impl Serialize for Coordinate"],["impl Serialize for Joint"],["impl Serialize for JointId"],["impl Serialize for Skeleton"],["impl Serialize for Vector"]]]]); + var implementors = Object.fromEntries([["funnybones",[["impl Serialize for BoneProperty"],["impl Serialize for JointProperty"],["impl Serialize for PropertyUpdate"],["impl Serialize for Target"],["impl Serialize for Value"],["impl Serialize for BoneEnd"],["impl Serialize for BoneKind"],["impl Serialize for Frame"],["impl Serialize for Keyframe"],["impl Serialize for Timeline"],["impl Serialize for Angle"],["impl Serialize for Bone"],["impl Serialize for BoneAxis"],["impl Serialize for BoneId"],["impl Serialize for Coordinate"],["impl Serialize for Joint"],["impl Serialize for JointId"],["impl Serialize for Skeleton"],["impl Serialize for Vector"]]]]); if (window.register_implementors) { window.register_implementors(implementors); } else { window.pending_implementors = implementors; } })() -//{"start":57,"fragment_lengths":[3734]} \ No newline at end of file +//{"start":57,"fragment_lengths":[5175]} \ No newline at end of file