diff --git a/.lock b/.lock new file mode 100644 index 0000000..e69de29 diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/crates.js b/crates.js new file mode 100644 index 0000000..e9d9053 --- /dev/null +++ b/crates.js @@ -0,0 +1 @@ +window.ALL_CRATES = ["metis","metis_sys"]; \ No newline at end of file diff --git a/help.html b/help.html new file mode 100644 index 0000000..b575de1 --- /dev/null +++ b/help.html @@ -0,0 +1,2 @@ +Help +

Rustdoc help

Back
\ No newline at end of file diff --git a/metis/all.html b/metis/all.html new file mode 100644 index 0000000..e6a026f --- /dev/null +++ b/metis/all.html @@ -0,0 +1,2 @@ +List of all items in this crate +

List of all items

Structs

Enums

Traits

Functions

Type Aliases

Constants

\ No newline at end of file diff --git a/metis/constant.NOPTIONS.html b/metis/constant.NOPTIONS.html new file mode 100644 index 0000000..09259ee --- /dev/null +++ b/metis/constant.NOPTIONS.html @@ -0,0 +1,5 @@ +NOPTIONS in metis - Rust +

Constant metis::NOPTIONS

source ·
pub const NOPTIONS: usize = _; // 40usize
Expand description

The length of the options array.

+

See Graph::set_options for an example. It is also used in +Mesh::set_options.

+
\ No newline at end of file diff --git a/metis/enum.Error.html b/metis/enum.Error.html new file mode 100644 index 0000000..1b596f4 --- /dev/null +++ b/metis/enum.Error.html @@ -0,0 +1,24 @@ +Error in metis - Rust +

Enum metis::Error

source ·
pub enum Error {
+    Input,
+    Memory,
+    Other,
+}
Expand description

Error type returned by METIS.

+

Variants§

§

Input

Input is invalid.

+

These bindings should check for most input errors, if not all.

+
§

Memory

METIS hit an out-of-memory error.

+
§

Other

METIS returned an error but its meaning is unknown.

+

Trait Implementations§

source§

impl Debug for Error

source§

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

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

impl Display for Error

source§

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

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

impl Error for Error

1.30.0 · source§

fn source(&self) -> Option<&(dyn Error + 'static)>

The lower-level source of this error, if any. Read more
1.0.0 · source§

fn description(&self) -> &str

👎Deprecated since 1.42.0: use the Display impl or to_string()
1.0.0 · source§

fn cause(&self) -> Option<&dyn Error>

👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
source§

fn provide<'a>(&'a self, request: &mut Request<'a>)

🔬This is a nightly-only experimental API. (error_generic_member_access)
Provides type based access to context intended for error reports. Read more
source§

impl From<NewGraphError> for Error

source§

fn from(_: NewGraphError) -> Self

Converts to this type from the input type.
source§

impl From<NewMeshError> for Error

source§

fn from(_: NewMeshError) -> Self

Converts to this type from the input type.
source§

impl PartialEq for Error

source§

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

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

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

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

impl Eq for Error

source§

impl StructuralEq for Error

source§

impl StructuralPartialEq for Error

Auto Trait Implementations§

§

impl RefUnwindSafe for Error

§

impl Send for Error

§

impl Sync for Error

§

impl Unpin for Error

§

impl UnwindSafe for Error

Blanket Implementations§

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> 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<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
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> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

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

§

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>,

§

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.
\ No newline at end of file diff --git a/metis/enum.NewGraphError.html b/metis/enum.NewGraphError.html new file mode 100644 index 0000000..8fe2933 --- /dev/null +++ b/metis/enum.NewGraphError.html @@ -0,0 +1,27 @@ +NewGraphError in metis - Rust +

Enum metis::NewGraphError

source ·
#[non_exhaustive]
pub enum NewGraphError { + NoConstraints, + NoParts, + TooLarge, + InvalidGraph(InvalidGraphError), +}
Expand description

Error type returned by Graph::new.

+

Unlike Error, this error originates from the Rust bindings.

+

Variants (Non-exhaustive)§

This enum is marked as non-exhaustive
Non-exhaustive enums could have additional variants added in future. Therefore, when matching against variants of non-exhaustive enums, an extra wildcard arm must be added to account for any future variants.
§

NoConstraints

ncon must be greater than 1.

+
§

NoParts

nparts must be greater than 1.

+
§

TooLarge

Graph is too large. One of the array’s length doesn’t fit into Idx.

+
§

InvalidGraph(InvalidGraphError)

The input arrays are malformed and cannot be safely passed to METIS.

+

Note that these bindings do not check for all the invariants. Some might +be raised during Graph::part_recursive and Graph::part_kway as +Error::Input.

+

Trait Implementations§

source§

impl Debug for NewGraphError

source§

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

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

impl Display for NewGraphError

source§

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

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

impl Error for NewGraphError

1.30.0 · source§

fn source(&self) -> Option<&(dyn Error + 'static)>

The lower-level source of this error, if any. Read more
1.0.0 · source§

fn description(&self) -> &str

👎Deprecated since 1.42.0: use the Display impl or to_string()
1.0.0 · source§

fn cause(&self) -> Option<&dyn Error>

👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
source§

fn provide<'a>(&'a self, request: &mut Request<'a>)

🔬This is a nightly-only experimental API. (error_generic_member_access)
Provides type based access to context intended for error reports. Read more
source§

impl From<NewGraphError> for Error

source§

fn from(_: NewGraphError) -> Self

Converts to this type from the input type.

Auto Trait Implementations§

Blanket Implementations§

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> 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<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
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> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

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

§

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>,

§

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.
\ No newline at end of file diff --git a/metis/enum.NewMeshError.html b/metis/enum.NewMeshError.html new file mode 100644 index 0000000..1f778bd --- /dev/null +++ b/metis/enum.NewMeshError.html @@ -0,0 +1,25 @@ +NewMeshError in metis - Rust +

Enum metis::NewMeshError

source ·
#[non_exhaustive]
pub enum NewMeshError { + NoParts, + TooLarge, + InvalidMesh(InvalidMeshError), +}
Expand description

Error type returned by Mesh::new.

+

Unlike Error, this error originates from the Rust bindings.

+

Variants (Non-exhaustive)§

This enum is marked as non-exhaustive
Non-exhaustive enums could have additional variants added in future. Therefore, when matching against variants of non-exhaustive enums, an extra wildcard arm must be added to account for any future variants.
§

NoParts

nparts must be greater than 1.

+
§

TooLarge

Mesh is too large. One of the array’s length doesn’t fit into Idx.

+
§

InvalidMesh(InvalidMeshError)

The input arrays are malformed and cannot be safely passed to METIS.

+

Note that these bindings do not check for all the invariants. Some might +be raised during Mesh::part_dual and Mesh::part_nodal as +Error::Input.

+

Trait Implementations§

source§

impl Debug for NewMeshError

source§

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

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

impl Display for NewMeshError

source§

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

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

impl Error for NewMeshError

1.30.0 · source§

fn source(&self) -> Option<&(dyn Error + 'static)>

The lower-level source of this error, if any. Read more
1.0.0 · source§

fn description(&self) -> &str

👎Deprecated since 1.42.0: use the Display impl or to_string()
1.0.0 · source§

fn cause(&self) -> Option<&dyn Error>

👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
source§

fn provide<'a>(&'a self, request: &mut Request<'a>)

🔬This is a nightly-only experimental API. (error_generic_member_access)
Provides type based access to context intended for error reports. Read more
source§

impl From<NewMeshError> for Error

source§

fn from(_: NewMeshError) -> Self

Converts to this type from the input type.

Auto Trait Implementations§

Blanket Implementations§

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> 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<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
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> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

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

§

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>,

§

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.
\ No newline at end of file diff --git a/metis/fn.mesh_to_dual.html b/metis/fn.mesh_to_dual.html new file mode 100644 index 0000000..2e91797 --- /dev/null +++ b/metis/fn.mesh_to_dual.html @@ -0,0 +1,6 @@ +mesh_to_dual in metis - Rust +

Function metis::mesh_to_dual

source ·
pub fn mesh_to_dual(eptr: &[Idx], eind: &[Idx], ncommon: Idx) -> Result<Dual>
Expand description

Generate the dual graph of a mesh.

+

Errors

+

This function returns an error if eptr and eind don’t follow the mesh +format given in Mesh::new.

+
\ No newline at end of file diff --git a/metis/index.html b/metis/index.html new file mode 100644 index 0000000..88bb4f9 --- /dev/null +++ b/metis/index.html @@ -0,0 +1,7 @@ +metis - Rust +

Crate metis

source ·
Expand description

This crate provides a thin but idiomatic API around libmetis.

+

See Graph for a usage example.

+

Modules

  • Fine-tuning parameter types.

Structs

  • The dual of a mesh.
  • Builder structure to set up a graph partition computation.
  • Error raised when the graph data fed to Graph::new cannot be safely +passed to METIS.
  • Error raised when the mesh data fed to Mesh::new cannot be safely passed +to METIS.
  • Builder structure to set up a mesh partition computation.

Enums

Constants

  • The length of the options array.

Functions

Type Aliases

  • Integer type used by METIS, can either be an i32 or an i64.
  • Floating-point type used by METIS, can either be an f32 or an f64.
  • The result of a partitioning.
\ No newline at end of file diff --git a/metis/option/enum.CType.html b/metis/option/enum.CType.html new file mode 100644 index 0000000..4db7c68 --- /dev/null +++ b/metis/option/enum.CType.html @@ -0,0 +1,20 @@ +CType in metis::option - Rust +

Enum metis::option::CType

source ·
pub enum CType {
+    Rm,
+    Shem,
+}
Expand description

Specifies the matching scheme to be used during coarsening.

+

Variants§

§

Rm

Random matching.

+
§

Shem

Sorted heavy-edge matching.

+

Trait Implementations§

source§

impl Opt for CType

source§

const INDEX: usize = 2usize

Index of the option in the array from crate::Graph::set_options and +crate::Mesh::set_options.
source§

fn value(self) -> Idx

Convert the value into metis’ format, for use with +crate::Graph::set_options and crate::Mesh::set_options.

Auto Trait Implementations§

§

impl RefUnwindSafe for CType

§

impl Send for CType

§

impl Sync for CType

§

impl Unpin for CType

§

impl UnwindSafe for CType

Blanket Implementations§

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> 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<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
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> TryFrom<U> for T
where + U: Into<T>,

§

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>,

§

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.
\ No newline at end of file diff --git a/metis/option/enum.IpType.html b/metis/option/enum.IpType.html new file mode 100644 index 0000000..8690766 --- /dev/null +++ b/metis/option/enum.IpType.html @@ -0,0 +1,24 @@ +IpType in metis::option - Rust +

Enum metis::option::IpType

source ·
pub enum IpType {
+    Grow,
+    Random,
+    Edge,
+    Node,
+}
Expand description

Determines the algorithm used during initial partitioning.

+

Variants§

§

Grow

Grows a bisection using a greedy strategy.

+
§

Random

Compute a bisection at random followed by a refinement.

+
§

Edge

Derives a separator from an edge cut.

+
§

Node

Grow a bisection using a greedy node-based strategy.

+

Trait Implementations§

source§

impl Opt for IpType

source§

const INDEX: usize = 3usize

Index of the option in the array from crate::Graph::set_options and +crate::Mesh::set_options.
source§

fn value(self) -> Idx

Convert the value into metis’ format, for use with +crate::Graph::set_options and crate::Mesh::set_options.

Auto Trait Implementations§

Blanket Implementations§

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> 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<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
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> TryFrom<U> for T
where + U: Into<T>,

§

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>,

§

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.
\ No newline at end of file diff --git a/metis/option/enum.ObjType.html b/metis/option/enum.ObjType.html new file mode 100644 index 0000000..f402cf8 --- /dev/null +++ b/metis/option/enum.ObjType.html @@ -0,0 +1,20 @@ +ObjType in metis::option - Rust +

Enum metis::option::ObjType

source ·
pub enum ObjType {
+    Cut,
+    Vol,
+}
Expand description

Specifies the type of objective.

+

Variants§

§

Cut

Edge-cut minimization.

+
§

Vol

Total communication volume minimization.

+

Trait Implementations§

source§

impl Opt for ObjType

source§

const INDEX: usize = 1usize

Index of the option in the array from crate::Graph::set_options and +crate::Mesh::set_options.
source§

fn value(self) -> Idx

Convert the value into metis’ format, for use with +crate::Graph::set_options and crate::Mesh::set_options.

Auto Trait Implementations§

Blanket Implementations§

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> 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<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
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> TryFrom<U> for T
where + U: Into<T>,

§

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>,

§

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.
\ No newline at end of file diff --git a/metis/option/enum.PType.html b/metis/option/enum.PType.html new file mode 100644 index 0000000..384d4ee --- /dev/null +++ b/metis/option/enum.PType.html @@ -0,0 +1,20 @@ +PType in metis::option - Rust +

Enum metis::option::PType

source ·
pub enum PType {
+    Rb,
+    Kway,
+}
Expand description

Specifies the partitioning method.

+

Variants§

§

Rb

Multilevel recursive bisection.

+
§

Kway

Multilevel k-way partitioning.

+

Trait Implementations§

source§

impl Opt for PType

source§

const INDEX: usize = 0usize

Index of the option in the array from crate::Graph::set_options and +crate::Mesh::set_options.
source§

fn value(self) -> Idx

Convert the value into metis’ format, for use with +crate::Graph::set_options and crate::Mesh::set_options.

Auto Trait Implementations§

§

impl RefUnwindSafe for PType

§

impl Send for PType

§

impl Sync for PType

§

impl Unpin for PType

§

impl UnwindSafe for PType

Blanket Implementations§

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> 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<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
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> TryFrom<U> for T
where + U: Into<T>,

§

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>,

§

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.
\ No newline at end of file diff --git a/metis/option/enum.RType.html b/metis/option/enum.RType.html new file mode 100644 index 0000000..246e694 --- /dev/null +++ b/metis/option/enum.RType.html @@ -0,0 +1,24 @@ +RType in metis::option - Rust +

Enum metis::option::RType

source ·
pub enum RType {
+    Fm,
+    Greedy,
+    Sep2Sided,
+    Sep1Sided,
+}
Expand description

Determines the algorithm used for refinement.

+

Variants§

§

Fm

FM-based cut refinement.

+
§

Greedy

Greedy-based cut and volume refinement.

+
§

Sep2Sided

Two-sided FM refinement.

+
§

Sep1Sided

One-sided FM refinement.

+

Trait Implementations§

source§

impl Opt for RType

source§

const INDEX: usize = 4usize

Index of the option in the array from crate::Graph::set_options and +crate::Mesh::set_options.
source§

fn value(self) -> Idx

Convert the value into metis’ format, for use with +crate::Graph::set_options and crate::Mesh::set_options.

Auto Trait Implementations§

§

impl RefUnwindSafe for RType

§

impl Send for RType

§

impl Sync for RType

§

impl Unpin for RType

§

impl UnwindSafe for RType

Blanket Implementations§

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> 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<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
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> TryFrom<U> for T
where + U: Into<T>,

§

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>,

§

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.
\ No newline at end of file diff --git a/metis/option/index.html b/metis/option/index.html new file mode 100644 index 0000000..f050c77 --- /dev/null +++ b/metis/option/index.html @@ -0,0 +1,15 @@ +metis::option - Rust +

Module metis::option

source ·
Expand description

Fine-tuning parameter types.

+

For options that take an integer value, should this value be negative, the +default will be used, if any.

+

Structs

  • Specifies if the connected components of the graph should first be +identified and ordered separately.
  • Specifies that the graph should be compressed by combining vertices +that have identical adjacency lists.
  • Specifies that the partitioning routines should try to produce partitions +that are contiguous.
  • Specifies the amount of progress/debugging information will be printed +during the execution of the algorithms.
  • Specifies that the partitioning routines should try to minimize the maximum +degree of the subdomain graph.
  • Specifies the number of different partitions that it will compute. The +final partition is the one that achieves the best edge cut or +communication volume. Default is 1.
  • Specifies the number of iterations for the refinement algorithms at each +stage of the uncoarsening process.
  • Specifies the number of different separators that it will compute at each +level of nested dissection.
  • Specifies that the coarsening will not perform any 2-hop matching when the +standards matching approach fails to sufficiently coarsen the graph.
  • Specifies the minimum degree of the vertices that will be ordered last.
  • Specifies the seed for the random number generator.
  • Specifies the maximum allowed load imbalance among the partitions.

Enums

  • Specifies the matching scheme to be used during coarsening.
  • Determines the algorithm used during initial partitioning.
  • Specifies the type of objective.
  • Specifies the partitioning method.
  • Determines the algorithm used for refinement.

Traits

  • Trait implemented by METIS’ options.
\ No newline at end of file diff --git a/metis/option/sidebar-items.js b/metis/option/sidebar-items.js new file mode 100644 index 0000000..f674678 --- /dev/null +++ b/metis/option/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"enum":["CType","IpType","ObjType","PType","RType"],"struct":["CCOrder","Compress","Contig","DbgLvl","MinConn","NCuts","NIter","NSeps","No2Hop","PFactor","Seed","UFactor"],"trait":["Opt"]}; \ No newline at end of file diff --git a/metis/option/struct.CCOrder.html b/metis/option/struct.CCOrder.html new file mode 100644 index 0000000..d621b69 --- /dev/null +++ b/metis/option/struct.CCOrder.html @@ -0,0 +1,16 @@ +CCOrder in metis::option - Rust +

Struct metis::option::CCOrder

source ·
pub struct CCOrder(pub bool);
Expand description

Specifies if the connected components of the graph should first be +identified and ordered separately.

+

Tuple Fields§

§0: bool

Trait Implementations§

source§

impl Opt for CCOrder

source§

const INDEX: usize = 14usize

Index of the option in the array from crate::Graph::set_options and +crate::Mesh::set_options.
source§

fn value(self) -> Idx

Convert the value into metis’ format, for use with +crate::Graph::set_options and crate::Mesh::set_options.

Auto Trait Implementations§

Blanket Implementations§

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> 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<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
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> TryFrom<U> for T
where + U: Into<T>,

§

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>,

§

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.
\ No newline at end of file diff --git a/metis/option/struct.Compress.html b/metis/option/struct.Compress.html new file mode 100644 index 0000000..61f9ec6 --- /dev/null +++ b/metis/option/struct.Compress.html @@ -0,0 +1,16 @@ +Compress in metis::option - Rust +

Struct metis::option::Compress

source ·
pub struct Compress(pub bool);
Expand description

Specifies that the graph should be compressed by combining vertices +that have identical adjacency lists.

+

Tuple Fields§

§0: bool

Trait Implementations§

source§

impl Opt for Compress

source§

const INDEX: usize = 13usize

Index of the option in the array from crate::Graph::set_options and +crate::Mesh::set_options.
source§

fn value(self) -> Idx

Convert the value into metis’ format, for use with +crate::Graph::set_options and crate::Mesh::set_options.

Auto Trait Implementations§

Blanket Implementations§

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> 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<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
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> TryFrom<U> for T
where + U: Into<T>,

§

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>,

§

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.
\ No newline at end of file diff --git a/metis/option/struct.Contig.html b/metis/option/struct.Contig.html new file mode 100644 index 0000000..17febeb --- /dev/null +++ b/metis/option/struct.Contig.html @@ -0,0 +1,17 @@ +Contig in metis::option - Rust +

Struct metis::option::Contig

source ·
pub struct Contig(pub bool);
Expand description

Specifies that the partitioning routines should try to produce partitions +that are contiguous.

+

Note that if the input graph is not connected this option is ignored.

+

Tuple Fields§

§0: bool

Trait Implementations§

source§

impl Opt for Contig

source§

const INDEX: usize = 12usize

Index of the option in the array from crate::Graph::set_options and +crate::Mesh::set_options.
source§

fn value(self) -> Idx

Convert the value into metis’ format, for use with +crate::Graph::set_options and crate::Mesh::set_options.

Auto Trait Implementations§

Blanket Implementations§

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> 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<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
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> TryFrom<U> for T
where + U: Into<T>,

§

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>,

§

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.
\ No newline at end of file diff --git a/metis/option/struct.DbgLvl.html b/metis/option/struct.DbgLvl.html new file mode 100644 index 0000000..0160d75 --- /dev/null +++ b/metis/option/struct.DbgLvl.html @@ -0,0 +1,38 @@ +DbgLvl in metis::option - Rust +

Struct metis::option::DbgLvl

source ·
pub struct DbgLvl {
+    pub info: bool,
+    pub time: bool,
+    pub coarsen: bool,
+    pub refine: bool,
+    pub ipart: bool,
+    pub move_info: bool,
+    pub sep_info: bool,
+    pub conn_info: bool,
+    pub contig_info: bool,
+}
Expand description

Specifies the amount of progress/debugging information will be printed +during the execution of the algorithms.

+

The default value is false for every field (no debugging/progress +information).

+

Fields§

§info: bool

Prints various diagnostic messages.

+
§time: bool

Performs timing analysis.

+
§coarsen: bool

Displays various statistics during coarsening.

+
§refine: bool

Displays various statistics during refinement.

+
§ipart: bool

Displays various statistics during initial partitioning.

+
§move_info: bool

Display detailed information about vertex moves during refinement.

+
§sep_info: bool

Display detailed information about vertex separators.

+
§conn_info: bool

Display information related to the minimization of subdomain +connectivity.

+
§contig_info: bool

Display information related to the elimination of connected components.

+

Trait Implementations§

source§

impl Opt for DbgLvl

source§

const INDEX: usize = 5usize

Index of the option in the array from crate::Graph::set_options and +crate::Mesh::set_options.
source§

fn value(self) -> Idx

Convert the value into metis’ format, for use with +crate::Graph::set_options and crate::Mesh::set_options.

Auto Trait Implementations§

Blanket Implementations§

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> 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<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
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> TryFrom<U> for T
where + U: Into<T>,

§

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>,

§

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.
\ No newline at end of file diff --git a/metis/option/struct.MinConn.html b/metis/option/struct.MinConn.html new file mode 100644 index 0000000..ec3e6f0 --- /dev/null +++ b/metis/option/struct.MinConn.html @@ -0,0 +1,18 @@ +MinConn in metis::option - Rust +

Struct metis::option::MinConn

source ·
pub struct MinConn(pub bool);
Expand description

Specifies that the partitioning routines should try to minimize the maximum +degree of the subdomain graph.

+

I.e., the graph in which each partition is a node, and edges connect +subdomains with a shared interface.

+

Tuple Fields§

§0: bool

Trait Implementations§

source§

impl Opt for MinConn

source§

const INDEX: usize = 11usize

Index of the option in the array from crate::Graph::set_options and +crate::Mesh::set_options.
source§

fn value(self) -> Idx

Convert the value into metis’ format, for use with +crate::Graph::set_options and crate::Mesh::set_options.

Auto Trait Implementations§

Blanket Implementations§

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> 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<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
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> TryFrom<U> for T
where + U: Into<T>,

§

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>,

§

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.
\ No newline at end of file diff --git a/metis/option/struct.NCuts.html b/metis/option/struct.NCuts.html new file mode 100644 index 0000000..210d7f5 --- /dev/null +++ b/metis/option/struct.NCuts.html @@ -0,0 +1,17 @@ +NCuts in metis::option - Rust +

Struct metis::option::NCuts

source ·
pub struct NCuts(pub Idx);
Expand description

Specifies the number of different partitions that it will compute. The +final partition is the one that achieves the best edge cut or +communication volume. Default is 1.

+

Tuple Fields§

§0: Idx

Trait Implementations§

source§

impl Opt for NCuts

source§

const INDEX: usize = 8usize

Index of the option in the array from crate::Graph::set_options and +crate::Mesh::set_options.
source§

fn value(self) -> Idx

Convert the value into metis’ format, for use with +crate::Graph::set_options and crate::Mesh::set_options.

Auto Trait Implementations§

§

impl RefUnwindSafe for NCuts

§

impl Send for NCuts

§

impl Sync for NCuts

§

impl Unpin for NCuts

§

impl UnwindSafe for NCuts

Blanket Implementations§

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> 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<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
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> TryFrom<U> for T
where + U: Into<T>,

§

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>,

§

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.
\ No newline at end of file diff --git a/metis/option/struct.NIter.html b/metis/option/struct.NIter.html new file mode 100644 index 0000000..16dce67 --- /dev/null +++ b/metis/option/struct.NIter.html @@ -0,0 +1,17 @@ +NIter in metis::option - Rust +

Struct metis::option::NIter

source ·
pub struct NIter(pub Idx);
Expand description

Specifies the number of iterations for the refinement algorithms at each +stage of the uncoarsening process.

+

Default is 10.

+

Tuple Fields§

§0: Idx

Trait Implementations§

source§

impl Opt for NIter

source§

const INDEX: usize = 7usize

Index of the option in the array from crate::Graph::set_options and +crate::Mesh::set_options.
source§

fn value(self) -> Idx

Convert the value into metis’ format, for use with +crate::Graph::set_options and crate::Mesh::set_options.

Auto Trait Implementations§

§

impl RefUnwindSafe for NIter

§

impl Send for NIter

§

impl Sync for NIter

§

impl Unpin for NIter

§

impl UnwindSafe for NIter

Blanket Implementations§

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> 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<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
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> TryFrom<U> for T
where + U: Into<T>,

§

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>,

§

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.
\ No newline at end of file diff --git a/metis/option/struct.NSeps.html b/metis/option/struct.NSeps.html new file mode 100644 index 0000000..5ba2544 --- /dev/null +++ b/metis/option/struct.NSeps.html @@ -0,0 +1,17 @@ +NSeps in metis::option - Rust +

Struct metis::option::NSeps

source ·
pub struct NSeps(pub Idx);
Expand description

Specifies the number of different separators that it will compute at each +level of nested dissection.

+

The final separator that is used is the smallest one. Default is 1.

+

Tuple Fields§

§0: Idx

Trait Implementations§

source§

impl Opt for NSeps

source§

const INDEX: usize = 16usize

Index of the option in the array from crate::Graph::set_options and +crate::Mesh::set_options.
source§

fn value(self) -> Idx

Convert the value into metis’ format, for use with +crate::Graph::set_options and crate::Mesh::set_options.

Auto Trait Implementations§

§

impl RefUnwindSafe for NSeps

§

impl Send for NSeps

§

impl Sync for NSeps

§

impl Unpin for NSeps

§

impl UnwindSafe for NSeps

Blanket Implementations§

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> 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<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
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> TryFrom<U> for T
where + U: Into<T>,

§

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>,

§

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.
\ No newline at end of file diff --git a/metis/option/struct.No2Hop.html b/metis/option/struct.No2Hop.html new file mode 100644 index 0000000..6babafd --- /dev/null +++ b/metis/option/struct.No2Hop.html @@ -0,0 +1,18 @@ +No2Hop in metis::option - Rust +

Struct metis::option::No2Hop

source ·
pub struct No2Hop(pub bool);
Expand description

Specifies that the coarsening will not perform any 2-hop matching when the +standards matching approach fails to sufficiently coarsen the graph.

+

The 2-hop matching is very effective for graphs with power-law degree +distributions.

+

Tuple Fields§

§0: bool

Trait Implementations§

source§

impl Opt for No2Hop

source§

const INDEX: usize = 20usize

Index of the option in the array from crate::Graph::set_options and +crate::Mesh::set_options.
source§

fn value(self) -> Idx

Convert the value into metis’ format, for use with +crate::Graph::set_options and crate::Mesh::set_options.

Auto Trait Implementations§

Blanket Implementations§

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> 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<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
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> TryFrom<U> for T
where + U: Into<T>,

§

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>,

§

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.
\ No newline at end of file diff --git a/metis/option/struct.PFactor.html b/metis/option/struct.PFactor.html new file mode 100644 index 0000000..5d30961 --- /dev/null +++ b/metis/option/struct.PFactor.html @@ -0,0 +1,31 @@ +PFactor in metis::option - Rust +

Struct metis::option::PFactor

source ·
pub struct PFactor(pub Idx);
Expand description

Specifies the minimum degree of the vertices that will be ordered last.

+

If the specified value is x > 0, then any vertices with a degree greater +than 0.1*x*(average degree) are removed from the graph, an ordering of the +rest of the vertices is computed, and an overall ordering is computed by +ordering the removed vertices at the end of the overall ordering. For +example if x == 40, and the average degree is 5, then the algorithm will +remove all vertices with degree greater than 20. The vertices that are +removed are ordered last (i.e., they are automatically placed in the +top-level separator). Good values are often in the range of 60 to 200 (i.e., +6 to 20 times more than the average). Default value is 0, indicating that no +vertices are removed.

+

Used to control whether the ordering algorithm should remove any +vertices with high degree (i.e., dense columns). This is particularly +helpful for certain classes of LP matrices, in which there a few vertices +that are connected to many other vertices. By removing these vertices prior +to ordering, the quality and the amount of time required to do the ordering +improves.

+

Tuple Fields§

§0: Idx

Trait Implementations§

source§

impl Opt for PFactor

source§

const INDEX: usize = 15usize

Index of the option in the array from crate::Graph::set_options and +crate::Mesh::set_options.
source§

fn value(self) -> Idx

Convert the value into metis’ format, for use with +crate::Graph::set_options and crate::Mesh::set_options.

Auto Trait Implementations§

Blanket Implementations§

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> 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<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
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> TryFrom<U> for T
where + U: Into<T>,

§

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>,

§

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.
\ No newline at end of file diff --git a/metis/option/struct.Seed.html b/metis/option/struct.Seed.html new file mode 100644 index 0000000..2a4147c --- /dev/null +++ b/metis/option/struct.Seed.html @@ -0,0 +1,15 @@ +Seed in metis::option - Rust +

Struct metis::option::Seed

source ·
pub struct Seed(pub Idx);
Expand description

Specifies the seed for the random number generator.

+

Tuple Fields§

§0: Idx

Trait Implementations§

source§

impl Opt for Seed

source§

const INDEX: usize = 9usize

Index of the option in the array from crate::Graph::set_options and +crate::Mesh::set_options.
source§

fn value(self) -> Idx

Convert the value into metis’ format, for use with +crate::Graph::set_options and crate::Mesh::set_options.

Auto Trait Implementations§

§

impl RefUnwindSafe for Seed

§

impl Send for Seed

§

impl Sync for Seed

§

impl Unpin for Seed

§

impl UnwindSafe for Seed

Blanket Implementations§

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> 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<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
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> TryFrom<U> for T
where + U: Into<T>,

§

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>,

§

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.
\ No newline at end of file diff --git a/metis/option/struct.UFactor.html b/metis/option/struct.UFactor.html new file mode 100644 index 0000000..1ca6702 --- /dev/null +++ b/metis/option/struct.UFactor.html @@ -0,0 +1,23 @@ +UFactor in metis::option - Rust +

Struct metis::option::UFactor

source ·
pub struct UFactor(pub Idx);
Expand description

Specifies the maximum allowed load imbalance among the partitions.

+

A value of x indicates that the allowed load imbalance is (1 + x)/1000. +The load imbalance for the jth constraint is defined to be +max_i(w[j,i]/t[j,i]), where w[j,i] is the fraction of the overall +weight of the jth constraint that is assigned to theith partition and +t[j,i] is the desired target weight of the jth constraint for the ith +partition (i.e., that specified via -tpwgts). For -ptype=rb, the default +value is 1 (i.e., load imbalance of 1.001) and for -ptype=kway, the +default value is 30 (i.e., load imbalance of 1.03).

+

Tuple Fields§

§0: Idx

Trait Implementations§

source§

impl Opt for UFactor

source§

const INDEX: usize = 17usize

Index of the option in the array from crate::Graph::set_options and +crate::Mesh::set_options.
source§

fn value(self) -> Idx

Convert the value into metis’ format, for use with +crate::Graph::set_options and crate::Mesh::set_options.

Auto Trait Implementations§

Blanket Implementations§

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> 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<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
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> TryFrom<U> for T
where + U: Into<T>,

§

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>,

§

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.
\ No newline at end of file diff --git a/metis/option/trait.Opt.html b/metis/option/trait.Opt.html new file mode 100644 index 0000000..0f8bfb9 --- /dev/null +++ b/metis/option/trait.Opt.html @@ -0,0 +1,14 @@ +Opt in metis::option - Rust +

Trait metis::option::Opt

source ·
pub trait Opt: Sealed {
+    const INDEX: usize;
+
+    // Required method
+    fn value(self) -> Idx;
+}
Expand description

Trait implemented by METIS’ options.

+

See crate::Graph::set_options for an example. It is also used in +crate::Mesh::set_options.

+

Required Associated Constants§

source

const INDEX: usize

Index of the option in the array from crate::Graph::set_options and +crate::Mesh::set_options.

+

Required Methods§

source

fn value(self) -> Idx

Convert the value into metis’ format, for use with +crate::Graph::set_options and crate::Mesh::set_options.

+

Object Safety§

This trait is not object safe.

Implementors§

source§

impl Opt for CType

source§

const INDEX: usize = 2usize

source§

impl Opt for IpType

source§

const INDEX: usize = 3usize

source§

impl Opt for ObjType

source§

const INDEX: usize = 1usize

source§

impl Opt for PType

source§

const INDEX: usize = 0usize

source§

impl Opt for RType

source§

const INDEX: usize = 4usize

source§

impl Opt for CCOrder

source§

const INDEX: usize = 14usize

source§

impl Opt for Compress

source§

const INDEX: usize = 13usize

source§

impl Opt for Contig

source§

const INDEX: usize = 12usize

source§

impl Opt for DbgLvl

source§

const INDEX: usize = 5usize

source§

impl Opt for MinConn

source§

const INDEX: usize = 11usize

source§

impl Opt for NCuts

source§

const INDEX: usize = 8usize

source§

impl Opt for NIter

source§

const INDEX: usize = 7usize

source§

impl Opt for NSeps

source§

const INDEX: usize = 16usize

source§

impl Opt for No2Hop

source§

const INDEX: usize = 20usize

source§

impl Opt for PFactor

source§

const INDEX: usize = 15usize

source§

impl Opt for Seed

source§

const INDEX: usize = 9usize

source§

impl Opt for UFactor

source§

const INDEX: usize = 17usize

\ No newline at end of file diff --git a/metis/sidebar-items.js b/metis/sidebar-items.js new file mode 100644 index 0000000..a8df0d8 --- /dev/null +++ b/metis/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"constant":["NOPTIONS"],"enum":["Error","NewGraphError","NewMeshError"],"fn":["mesh_to_dual"],"mod":["option"],"struct":["Dual","Graph","InvalidGraphError","InvalidMeshError","Mesh"],"type":["Idx","Real","Result"]}; \ No newline at end of file diff --git a/metis/struct.Dual.html b/metis/struct.Dual.html new file mode 100644 index 0000000..cb263fc --- /dev/null +++ b/metis/struct.Dual.html @@ -0,0 +1,19 @@ +Dual in metis - Rust +

Struct metis::Dual

source ·
pub struct Dual { /* private fields */ }
Expand description

The dual of a mesh.

+

Result of mesh_to_dual.

+

Implementations§

source§

impl Dual

source

pub fn xadj(&self) -> &[Idx]

The adjacency index array.

+
source

pub fn adjncy(&self) -> &[Idx]

The adjacency array.

+
source

pub fn as_mut(&mut self) -> (&mut [Idx], &mut [Idx])

The adjacency index array, and the adjacency array as mutable slices.

+

Trait Implementations§

source§

impl Debug for Dual

source§

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

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

impl Drop for Dual

source§

fn drop(&mut self)

Executes the destructor for this type. Read more
source§

impl PartialEq for Dual

source§

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

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

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

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

impl Eq for Dual

source§

impl StructuralEq for Dual

source§

impl StructuralPartialEq for Dual

Auto Trait Implementations§

§

impl RefUnwindSafe for Dual

§

impl Send for Dual

§

impl Sync for Dual

§

impl Unpin for Dual

§

impl !UnwindSafe for Dual

Blanket Implementations§

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> 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<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
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> TryFrom<U> for T
where + U: Into<T>,

§

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>,

§

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.
\ No newline at end of file diff --git a/metis/struct.Graph.html b/metis/struct.Graph.html new file mode 100644 index 0000000..e394674 --- /dev/null +++ b/metis/struct.Graph.html @@ -0,0 +1,227 @@ +Graph in metis - Rust +

Struct metis::Graph

source ·
pub struct Graph<'a> { /* private fields */ }
Expand description

Builder structure to set up a graph partition computation.

+

This structure holds the required arguments for METIS to compute a +partition. It also offers methods to easily set any optional argument.

+

Example

+
// Make a graph with two vertices and an edge between the two.
+let xadj = &mut [0, 1, 2];
+let adjncy = &mut [1, 0];
+
+// Allocate the partition array which stores the partition of each vertex.
+let mut part = [0, 0];
+
+// There are one constraint and two parts.  The partitioning algorithm used
+// is recursive bisection.  The k-way algorithm can also be used.
+Graph::new(1, 2, xadj, adjncy)?
+    .part_recursive(&mut part)?;
+
+// The two vertices are placed in different parts.
+assert_ne!(part[0], part[1]);
+

Implementations§

source§

impl<'a> Graph<'a>

source

pub fn new( + ncon: Idx, + nparts: Idx, + xadj: &'a [Idx], + adjncy: &'a [Idx] +) -> StdResult<Graph<'a>, NewGraphError>

Creates a new Graph object to be partitioned.

+
    +
  • ncon is the number of constraints on each vertex (at least 1),
  • +
  • nparts is the number of parts wanted in the graph partition.
  • +
+
Input format
+

CSR (Compressed Sparse Row) is a data structure for representing sparse +matrices and is the primary data structure used by METIS. A CSR +formatted graph is represented with two slices: an adjacency list +(adjcny) and an index list (xadj). The nodes adjacent to node n +are adjncy[xadj[n]..xadj[n + 1]]. Additionally, metis requires that +graphs are undirected: if (u, v) is in the graph, then (v, u) must +also be in the graph.

+

Consider translating this simple graph to CSR format:

+ +
// 5 - 3 - 4 - 0
+//     |   | /
+//     2 - 1
+let adjncy = [1, 4, 0, 2, 4, 1, 3, 2, 4, 5, 0, 1, 3, 3];
+let xadj = [0, 2, 5, 7, 10, 13, 14];
+
+// iterate over adjacent nodes
+let mut it = xadj
+    .windows(2)
+    .map(|x| &adjncy[x[0]..x[1]]);
+
+// node 0 is adjacent to nodes 1 and 4
+assert_eq!(it.next().unwrap(), &[1, 4]);
+
+// node 1 is adjacent to nodes 0, 2, and 4
+assert_eq!(it.next().unwrap(), &[0, 2, 4]);
+
+// node 2 is adjacent to nodes 1 and 3
+assert_eq!(it.next().unwrap(), &[1, 3]);
+
+// node 3 is adjacent to nodes 2, 4, and 5
+assert_eq!(it.next().unwrap(), &[2, 4, 5]);
+
+// node 4 is adjacent to nodes 0, 1, and 3
+assert_eq!(it.next().unwrap(), &[0, 1, 3]);
+
+// node 5 is adjacent to node 3
+assert_eq!(it.next().unwrap(), &[3]);
+
+assert!(it.next().is_none());
+

More info can be found at: +https://en.wikipedia.org/wiki/Sparse_matrix#Compressed_sparse_row_(CSR,_CRS_or_Yale_format)

+
Errors
+

The following invariants must be held, otherwise this function returns +an error:

+
    +
  • all the arrays have a length that can be held by an Idx,
  • +
  • ncon is strictly greater than zero,
  • +
  • nparts is strictly greater than zero,
  • +
  • xadj has at least one element (its length is the one more than the +number of vertices),
  • +
  • xadj is sorted,
  • +
  • elements of xadj are positive,
  • +
  • the last element of xadj is the length of adjncy,
  • +
  • elements of adjncy are within zero and the number of vertices.
  • +
+
Mutability
+

Graph::part_kway and Graph::part_recursive may mutate the +contents of xadj and adjncy, but should revert all changes before +returning.

+
source

pub unsafe fn new_unchecked( + ncon: Idx, + nparts: Idx, + xadj: &'a [Idx], + adjncy: &'a [Idx] +) -> Graph<'a>

Creates a new Graph object to be partitioned (unchecked version).

+
    +
  • ncon is the number of constraints on each vertex (at least 1),
  • +
  • nparts is the number of parts wanted in the graph partition.
  • +
+
Input format
+

xadj and adjncy are the CSR encoding of the adjacency matrix +that represents the graph. xadj is the row index and adjncy is the +column index.

+
Safety
+

This function still does some checks listed in “Panics” below. However, +the caller is reponsible for upholding all invariants listed in the +“Errors” section of Graph::new. Otherwise, the behavior of this +function is undefined.

+
Panics
+

This function panics if:

+
    +
  • any of the arrays have a length that cannot be held by an Idx, or
  • +
  • ncon is not strictly greater than zero, or
  • +
  • nparts is not strictly greater than zero, or
  • +
  • xadj is empty, or
  • +
  • the length of adjncy is different from the last element of xadj.
  • +
+
Mutability
+

Graph::part_kway and Graph::part_recursive may mutate the +contents of xadj and adjncy, but should revert all changes before +returning.

+
source

pub fn set_vwgt(self, vwgt: &'a [Idx]) -> Graph<'a>

Sets the computational weights of the vertices.

+

By default, all vertices have the same weight.

+

The ncon weights of the ith vertex must be located in +vwgt[i*ncon..(i+1)*ncon], and all elements of vwgt must be positive.

+
Panics
+

This function panics if the length of vwgt is not ncon times the +number of vertices.

+
source

pub fn set_vsize(self, vsize: &'a [Idx]) -> Graph<'a>

Sets the communication weights of the vertices.

+

By default, all vertices have the same communication weight.

+

Vertices can only have one communication weight. The length of vsize +does not depend on ncon.

+
Panics
+

This function panics if the length of vsize is not the number of +vertices.

+
source

pub fn set_adjwgt(self, adjwgt: &'a [Idx]) -> Graph<'a>

Sets the weights of the edges.

+

By default, all edges have the same weight.

+

All elements of adjwgt must be positive.

+
Panics
+

This function panics if the length of adjwgt is not equal to the +length of adjncy.

+
source

pub fn set_tpwgts(self, tpwgts: &'a [Real]) -> Graph<'a>

Sets the target partition weights for each part and constraint.

+

By default, the graph is divided equally.

+

The target partition weight for the ith part and jth constraint is +specified at tpwgts[i*ncon+j]. For each constraint j, the sum of the +target partition weights must be 1.0. Meaning +(0..nparts).map(|i| tpwgts[i*ncon+j]).sum() == 1.0.

+
Panics
+

This function panics if the length of tpwgts is not equal to ncon +times nparts.

+
source

pub fn set_ubvec(self, ubvec: &'a [Real]) -> Graph<'a>

Sets the load imbalance tolerance for each constraint.

+

By default, it equals to 1.001 if ncon equals 1 and 1.01 otherwise.

+

For the ith partition and jth constraint the allowed weight is the +ubvec[j]*tpwgts[i*ncon+j] fraction of the jth’s constraint total +weight. The load imbalances must be greater than 1.0.

+
Panics
+

This function panics if the length of ubvec is not equal to ncon.

+
source

pub fn set_options(self, options: &[Idx; 40]) -> Graph<'a>

Sets the fine-tuning parameters for this partitioning.

+

When few options are to be set, Graph::set_option might be a +better fit.

+

See the option module for the list of available parameters. Note that +not all are applicable to a given partitioning method. Refer to the +documentation of METIS (link) for more info on this.

+
Example
+
use metis::option::Opt as _;
+
+let xadj = &[0, 1, 2];
+let adjncy = &[1, 0];
+let mut part = [0, 0];
+
+// -1 is the default value.
+let mut options = [-1; metis::NOPTIONS];
+
+// four refinement iterations instead of the default 10.
+options[metis::option::NIter::INDEX] = 4;
+
+Graph::new(1, 2, xadj, adjncy)?
+    .set_options(&options)
+    .part_recursive(&mut part)?;
+
+// The two vertices are placed in different parts.
+assert_ne!(part[0], part[1]);
+
source

pub fn set_option<O>(self, option: O) -> Graph<'a>
where + O: Opt,

Sets a fine-tuning parameter for this partitioning.

+

When options are to be set in batches, Graph::set_options might be a +better fit.

+

See the option module for the list of available parameters. Note that +not all are applicable to a given partitioning method. Refer to the +documentation of METIS (link) for more info on this.

+
Example
+
let xadj = &[0, 1, 2];
+let adjncy = &[1, 0];
+let mut part = [0, 0];
+
+Graph::new(1, 2, xadj, adjncy)?
+    .set_option(metis::option::NIter(4))
+    .part_recursive(&mut part)?;
+
+// The two vertices are placed in different parts.
+assert_ne!(part[0], part[1]);
+
source

pub fn part_recursive(self, part: &mut [Idx]) -> Result<Idx>

Partition the graph using multilevel recursive bisection.

+

Returns the edge-cut, the total communication volume of the +partitioning solution.

+

Equivalent of METIS_PartGraphRecursive.

+
Panics
+

This function panics if the length of part is not the number of +vertices.

+
source

pub fn part_kway(self, part: &mut [Idx]) -> Result<Idx>

Partition the graph using multilevel k-way partitioning.

+

Returns the edge-cut, the total communication volume of the +partitioning solution.

+

Equivalent of METIS_PartGraphKway.

+
Panics
+

This function panics if the length of part is not the number of +vertices.

+

Trait Implementations§

source§

impl<'a> Debug for Graph<'a>

source§

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

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

impl<'a> PartialEq for Graph<'a>

source§

fn eq(&self, other: &Graph<'a>) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

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

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

impl<'a> StructuralPartialEq for Graph<'a>

Auto Trait Implementations§

§

impl<'a> RefUnwindSafe for Graph<'a>

§

impl<'a> Send for Graph<'a>

§

impl<'a> Sync for Graph<'a>

§

impl<'a> Unpin for Graph<'a>

§

impl<'a> UnwindSafe for Graph<'a>

Blanket Implementations§

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> 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<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
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> TryFrom<U> for T
where + U: Into<T>,

§

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>,

§

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.
\ No newline at end of file diff --git a/metis/struct.InvalidGraphError.html b/metis/struct.InvalidGraphError.html new file mode 100644 index 0000000..b7bd6d1 --- /dev/null +++ b/metis/struct.InvalidGraphError.html @@ -0,0 +1,16 @@ +InvalidGraphError in metis - Rust +
pub struct InvalidGraphError { /* private fields */ }
Expand description

Error raised when the graph data fed to Graph::new cannot be safely +passed to METIS.

+

Graph data must follow the format described in Graph::new.

+

Trait Implementations§

source§

impl Debug for InvalidGraphError

source§

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

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

impl Display for InvalidGraphError

source§

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

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

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> 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<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
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> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

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

§

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>,

§

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.
\ No newline at end of file diff --git a/metis/struct.InvalidMeshError.html b/metis/struct.InvalidMeshError.html new file mode 100644 index 0000000..e9b4ad3 --- /dev/null +++ b/metis/struct.InvalidMeshError.html @@ -0,0 +1,16 @@ +InvalidMeshError in metis - Rust +

Struct metis::InvalidMeshError

source ·
pub struct InvalidMeshError { /* private fields */ }
Expand description

Error raised when the mesh data fed to Mesh::new cannot be safely passed +to METIS.

+

Mesh data must follow the format described in Mesh::new.

+

Trait Implementations§

source§

impl Debug for InvalidMeshError

source§

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

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

impl Display for InvalidMeshError

source§

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

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

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> 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<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
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> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

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

§

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>,

§

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.
\ No newline at end of file diff --git a/metis/struct.Mesh.html b/metis/struct.Mesh.html new file mode 100644 index 0000000..2a9f69b --- /dev/null +++ b/metis/struct.Mesh.html @@ -0,0 +1,124 @@ +Mesh in metis - Rust +

Struct metis::Mesh

source ·
pub struct Mesh<'a> { /* private fields */ }
Expand description

Builder structure to set up a mesh partition computation.

+

This structure holds the required arguments for METIS to compute a +partition. It also offers methods to easily set any optional argument.

+

Example

+

Usage is fairly similar to Graph. Refer to its documentation for +details.

+

Implementations§

source§

impl<'a> Mesh<'a>

source

pub fn new( + nparts: Idx, + eptr: &'a [Idx], + eind: &'a [Idx] +) -> StdResult<Mesh<'a>, NewMeshError>

Creates a new Mesh object to be partitioned.

+

nparts is the number of parts wanted in the mesh partition.

+
Input format
+

The length of eptr is n + 1, where n is the number of elements in +the mesh. The length of eind is the sum of the number of nodes in all +the elements of the mesh. The list of nodes belonging to the ith +element of the mesh are stored in consecutive locations of eind +starting at position eptr[i] up to (but not including) position +eptr[i+1].

+
Errors
+

The following invariants must be held, otherwise this function returns +an error:

+
    +
  • nparts is strictly greater than zero,
  • +
  • eptr has at least one element (its length is the one more than the +number of mesh elements),
  • +
  • eptr is sorted,
  • +
  • elements of eptr are positive,
  • +
  • the last element of eptr is the length of eind,
  • +
  • all the arrays have a length that can be held by an Idx.
  • +
+
Mutability
+

Mesh::part_dual and Mesh::part_nodal may mutate the contents of +eptr and eind, but should revert all changes before returning.

+
source

pub unsafe fn new_unchecked( + nn: Idx, + nparts: Idx, + eptr: &'a [Idx], + eind: &'a [Idx] +) -> Mesh<'a>

Creates a new Mesh object to be partitioned (unchecked version).

+
    +
  • nn is the number of nodes in the mesh,
  • +
  • nparts is the number of parts wanted in the mesh partition.
  • +
+
Input format
+

See Mesh::new.

+
Safety
+

This function still does some checks listed in “Panics” below. However, +the caller is reponsible for upholding all invariants listed in the +“Errors” section of Mesh::new. Otherwise, the behavior of this +function is undefined.

+
Panics
+

This function panics if:

+
    +
  • any of the arrays have a length that cannot be hold by an Idx, or
  • +
  • nn is not strictly greater than zero, or
  • +
  • nparts is not strictly greater than zero, or
  • +
  • eptr is empty, or
  • +
  • the length of eind is different from the last element of eptr.
  • +
+
Mutability
+

While nothing should be modified by the Mesh structure, METIS +doesn’t specify any const modifier, so everything must be mutable on +Rust’s side.

+
source

pub fn set_vwgt(self, vwgt: &'a [Idx]) -> Mesh<'a>

Sets the computational weights of the elements.

+

By default, all elements have the same weight.

+

All elements of vwgt must be positive.

+
Panics
+

This function panics if the length of vwgt is not the number of +elements.

+
source

pub fn set_vsize(self, vsize: &'a [Idx]) -> Mesh<'a>

Sets the communication weights of the elements.

+

By default, all elements have the same communication weight.

+
Panics
+

This function panics if the length of vsize is not the number of +elements.

+
source

pub fn set_tpwgts(self, tpwgts: &'a [Real]) -> Mesh<'a>

Sets the target partition weights for each part.

+

By default, the mesh is divided equally.

+

The sum of the target partition weights must be 1.0.

+
Panics
+

This function panics if the length of tpwgts is not equal to nparts.

+
source

pub fn set_options(self, options: &[Idx; 40]) -> Mesh<'a>

Sets the fine-tuning parameters for this partitioning.

+

When few options are to be set, Mesh::set_option might be a +better fit.

+

See the option module for the list of available parameters. Note that +not all are applicable to a given partitioning method. Refer to the +documentation of METIS (link) for more info on this.

+

See Graph::set_options for a usage example.

+
source

pub fn set_option<O>(self, option: O) -> Mesh<'a>
where + O: Opt,

Sets a fine-tuning parameter for this partitioning.

+

When options are to be set in batches, Mesh::set_options might be a +better fit.

+

See the option module for the list of available parameters. Note that +not all are applicable to a given partitioning method. Refer to the +documentation of METIS (link) for more info on this.

+

See Graph::set_option for a usage example.

+
source

pub fn part_dual(self, epart: &mut [Idx], npart: &mut [Idx]) -> Result<Idx>

Partition the mesh using its dual graph.

+

Returns the edge-cut, the total communication volume of the +partitioning solution.

+

Equivalent of METIS_PartMeshDual.

+
Panics
+

This function panics if the length of epart is not the number of +elements, or if nparts’s is not the number of nodes.

+
source

pub fn part_nodal(self, epart: &mut [Idx], npart: &mut [Idx]) -> Result<Idx>

Partition the mesh using its nodal graph.

+

Returns the edge-cut, the total communication volume of the +partitioning solution.

+

Previous settings of ncommon are not used by this function.

+

Equivalent of METIS_PartMeshNodal.

+
Panics
+

This function panics if the length of epart is not the number of +elements, or if nparts’s is not the number of nodes.

+

Trait Implementations§

source§

impl<'a> Debug for Mesh<'a>

source§

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

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

impl<'a> PartialEq for Mesh<'a>

source§

fn eq(&self, other: &Mesh<'a>) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

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

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

impl<'a> StructuralPartialEq for Mesh<'a>

Auto Trait Implementations§

§

impl<'a> RefUnwindSafe for Mesh<'a>

§

impl<'a> Send for Mesh<'a>

§

impl<'a> Sync for Mesh<'a>

§

impl<'a> Unpin for Mesh<'a>

§

impl<'a> UnwindSafe for Mesh<'a>

Blanket Implementations§

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> 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<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
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> TryFrom<U> for T
where + U: Into<T>,

§

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>,

§

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.
\ No newline at end of file diff --git a/metis/type.Idx.html b/metis/type.Idx.html new file mode 100644 index 0000000..f7ca840 --- /dev/null +++ b/metis/type.Idx.html @@ -0,0 +1,3 @@ +Idx in metis - Rust +

Type Alias metis::Idx

source ·
pub type Idx = idx_t;
Expand description

Integer type used by METIS, can either be an i32 or an i64.

+
\ No newline at end of file diff --git a/metis/type.Real.html b/metis/type.Real.html new file mode 100644 index 0000000..83e20bb --- /dev/null +++ b/metis/type.Real.html @@ -0,0 +1,3 @@ +Real in metis - Rust +

Type Alias metis::Real

source ·
pub type Real = real_t;
Expand description

Floating-point type used by METIS, can either be an f32 or an f64.

+
\ No newline at end of file diff --git a/metis/type.Result.html b/metis/type.Result.html new file mode 100644 index 0000000..9861f75 --- /dev/null +++ b/metis/type.Result.html @@ -0,0 +1,8 @@ +Result in metis - Rust +

Type Alias metis::Result

source ·
pub type Result<T> = Result<T, Error>;
Expand description

The result of a partitioning.

+

Aliased Type§

enum Result<T> {
+    Ok(T),
+    Err(Error),
+}

Variants§

§1.0.0

Ok(T)

Contains the success value

+
§1.0.0

Err(Error)

Contains the error value

+
\ No newline at end of file diff --git a/metis_sys/all.html b/metis_sys/all.html new file mode 100644 index 0000000..18cbdc4 --- /dev/null +++ b/metis_sys/all.html @@ -0,0 +1,2 @@ +List of all items in this crate +

List of all items

Functions

Type Aliases

Constants

\ No newline at end of file diff --git a/metis_sys/constant.METIS_NOPTIONS.html b/metis_sys/constant.METIS_NOPTIONS.html new file mode 100644 index 0000000..8093f70 --- /dev/null +++ b/metis_sys/constant.METIS_NOPTIONS.html @@ -0,0 +1,2 @@ +METIS_NOPTIONS in metis_sys - Rust +

Constant metis_sys::METIS_NOPTIONS

source ·
pub const METIS_NOPTIONS: u32 = 40;
\ No newline at end of file diff --git a/metis_sys/constant.METIS_VER_MAJOR.html b/metis_sys/constant.METIS_VER_MAJOR.html new file mode 100644 index 0000000..b85fd03 --- /dev/null +++ b/metis_sys/constant.METIS_VER_MAJOR.html @@ -0,0 +1,2 @@ +METIS_VER_MAJOR in metis_sys - Rust +

Constant metis_sys::METIS_VER_MAJOR

source ·
pub const METIS_VER_MAJOR: u32 = 5;
\ No newline at end of file diff --git a/metis_sys/constant.METIS_VER_MINOR.html b/metis_sys/constant.METIS_VER_MINOR.html new file mode 100644 index 0000000..524c532 --- /dev/null +++ b/metis_sys/constant.METIS_VER_MINOR.html @@ -0,0 +1,2 @@ +METIS_VER_MINOR in metis_sys - Rust +

Constant metis_sys::METIS_VER_MINOR

source ·
pub const METIS_VER_MINOR: u32 = 2;
\ No newline at end of file diff --git a/metis_sys/constant.METIS_VER_SUBMINOR.html b/metis_sys/constant.METIS_VER_SUBMINOR.html new file mode 100644 index 0000000..58e8b98 --- /dev/null +++ b/metis_sys/constant.METIS_VER_SUBMINOR.html @@ -0,0 +1,2 @@ +METIS_VER_SUBMINOR in metis_sys - Rust +
pub const METIS_VER_SUBMINOR: u32 = 1;
\ No newline at end of file diff --git a/metis_sys/constant.mctype_et_METIS_CTYPE_RM.html b/metis_sys/constant.mctype_et_METIS_CTYPE_RM.html new file mode 100644 index 0000000..aa51323 --- /dev/null +++ b/metis_sys/constant.mctype_et_METIS_CTYPE_RM.html @@ -0,0 +1,2 @@ +mctype_et_METIS_CTYPE_RM in metis_sys - Rust +
pub const mctype_et_METIS_CTYPE_RM: mctype_et = 0;
\ No newline at end of file diff --git a/metis_sys/constant.mctype_et_METIS_CTYPE_SHEM.html b/metis_sys/constant.mctype_et_METIS_CTYPE_SHEM.html new file mode 100644 index 0000000..d90119c --- /dev/null +++ b/metis_sys/constant.mctype_et_METIS_CTYPE_SHEM.html @@ -0,0 +1,2 @@ +mctype_et_METIS_CTYPE_SHEM in metis_sys - Rust +
pub const mctype_et_METIS_CTYPE_SHEM: mctype_et = 1;
\ No newline at end of file diff --git a/metis_sys/constant.mdbglvl_et_METIS_DBG_COARSEN.html b/metis_sys/constant.mdbglvl_et_METIS_DBG_COARSEN.html new file mode 100644 index 0000000..6bbf131 --- /dev/null +++ b/metis_sys/constant.mdbglvl_et_METIS_DBG_COARSEN.html @@ -0,0 +1,3 @@ +mdbglvl_et_METIS_DBG_COARSEN in metis_sys - Rust +
pub const mdbglvl_et_METIS_DBG_COARSEN: mdbglvl_et = 4;
Expand description

< Show the coarsening progress

+
\ No newline at end of file diff --git a/metis_sys/constant.mdbglvl_et_METIS_DBG_CONNINFO.html b/metis_sys/constant.mdbglvl_et_METIS_DBG_CONNINFO.html new file mode 100644 index 0000000..464c193 --- /dev/null +++ b/metis_sys/constant.mdbglvl_et_METIS_DBG_CONNINFO.html @@ -0,0 +1,3 @@ +mdbglvl_et_METIS_DBG_CONNINFO in metis_sys - Rust +
pub const mdbglvl_et_METIS_DBG_CONNINFO: mdbglvl_et = 128;
Expand description

< Show info on minimization of subdomain connectivity

+
\ No newline at end of file diff --git a/metis_sys/constant.mdbglvl_et_METIS_DBG_CONTIGINFO.html b/metis_sys/constant.mdbglvl_et_METIS_DBG_CONTIGINFO.html new file mode 100644 index 0000000..e40c1ed --- /dev/null +++ b/metis_sys/constant.mdbglvl_et_METIS_DBG_CONTIGINFO.html @@ -0,0 +1,3 @@ +mdbglvl_et_METIS_DBG_CONTIGINFO in metis_sys - Rust +
pub const mdbglvl_et_METIS_DBG_CONTIGINFO: mdbglvl_et = 256;
Expand description

< Show info on elimination of connected components

+
\ No newline at end of file diff --git a/metis_sys/constant.mdbglvl_et_METIS_DBG_INFO.html b/metis_sys/constant.mdbglvl_et_METIS_DBG_INFO.html new file mode 100644 index 0000000..0f7d794 --- /dev/null +++ b/metis_sys/constant.mdbglvl_et_METIS_DBG_INFO.html @@ -0,0 +1,3 @@ +mdbglvl_et_METIS_DBG_INFO in metis_sys - Rust +
pub const mdbglvl_et_METIS_DBG_INFO: mdbglvl_et = 1;
Expand description

< Shows various diagnostic messages

+
\ No newline at end of file diff --git a/metis_sys/constant.mdbglvl_et_METIS_DBG_IPART.html b/metis_sys/constant.mdbglvl_et_METIS_DBG_IPART.html new file mode 100644 index 0000000..46d49aa --- /dev/null +++ b/metis_sys/constant.mdbglvl_et_METIS_DBG_IPART.html @@ -0,0 +1,3 @@ +mdbglvl_et_METIS_DBG_IPART in metis_sys - Rust +
pub const mdbglvl_et_METIS_DBG_IPART: mdbglvl_et = 16;
Expand description

< Show info on initial partitioning

+
\ No newline at end of file diff --git a/metis_sys/constant.mdbglvl_et_METIS_DBG_MEMORY.html b/metis_sys/constant.mdbglvl_et_METIS_DBG_MEMORY.html new file mode 100644 index 0000000..0802983 --- /dev/null +++ b/metis_sys/constant.mdbglvl_et_METIS_DBG_MEMORY.html @@ -0,0 +1,3 @@ +mdbglvl_et_METIS_DBG_MEMORY in metis_sys - Rust +
pub const mdbglvl_et_METIS_DBG_MEMORY: mdbglvl_et = 2048;
Expand description

< Show info related to wspace allocation

+
\ No newline at end of file diff --git a/metis_sys/constant.mdbglvl_et_METIS_DBG_MOVEINFO.html b/metis_sys/constant.mdbglvl_et_METIS_DBG_MOVEINFO.html new file mode 100644 index 0000000..c4b0373 --- /dev/null +++ b/metis_sys/constant.mdbglvl_et_METIS_DBG_MOVEINFO.html @@ -0,0 +1,3 @@ +mdbglvl_et_METIS_DBG_MOVEINFO in metis_sys - Rust +
pub const mdbglvl_et_METIS_DBG_MOVEINFO: mdbglvl_et = 32;
Expand description

< Show info on vertex moves during refinement

+
\ No newline at end of file diff --git a/metis_sys/constant.mdbglvl_et_METIS_DBG_REFINE.html b/metis_sys/constant.mdbglvl_et_METIS_DBG_REFINE.html new file mode 100644 index 0000000..3bafcd2 --- /dev/null +++ b/metis_sys/constant.mdbglvl_et_METIS_DBG_REFINE.html @@ -0,0 +1,3 @@ +mdbglvl_et_METIS_DBG_REFINE in metis_sys - Rust +
pub const mdbglvl_et_METIS_DBG_REFINE: mdbglvl_et = 8;
Expand description

< Show the refinement progress

+
\ No newline at end of file diff --git a/metis_sys/constant.mdbglvl_et_METIS_DBG_SEPINFO.html b/metis_sys/constant.mdbglvl_et_METIS_DBG_SEPINFO.html new file mode 100644 index 0000000..3795aaf --- /dev/null +++ b/metis_sys/constant.mdbglvl_et_METIS_DBG_SEPINFO.html @@ -0,0 +1,3 @@ +mdbglvl_et_METIS_DBG_SEPINFO in metis_sys - Rust +
pub const mdbglvl_et_METIS_DBG_SEPINFO: mdbglvl_et = 64;
Expand description

< Show info on vertex moves during sep refinement

+
\ No newline at end of file diff --git a/metis_sys/constant.mdbglvl_et_METIS_DBG_TIME.html b/metis_sys/constant.mdbglvl_et_METIS_DBG_TIME.html new file mode 100644 index 0000000..67e5d07 --- /dev/null +++ b/metis_sys/constant.mdbglvl_et_METIS_DBG_TIME.html @@ -0,0 +1,3 @@ +mdbglvl_et_METIS_DBG_TIME in metis_sys - Rust +
pub const mdbglvl_et_METIS_DBG_TIME: mdbglvl_et = 2;
Expand description

< Perform timing analysis

+
\ No newline at end of file diff --git a/metis_sys/constant.mgtype_et_METIS_GTYPE_DUAL.html b/metis_sys/constant.mgtype_et_METIS_GTYPE_DUAL.html new file mode 100644 index 0000000..abac754 --- /dev/null +++ b/metis_sys/constant.mgtype_et_METIS_GTYPE_DUAL.html @@ -0,0 +1,2 @@ +mgtype_et_METIS_GTYPE_DUAL in metis_sys - Rust +
pub const mgtype_et_METIS_GTYPE_DUAL: mgtype_et = 0;
\ No newline at end of file diff --git a/metis_sys/constant.mgtype_et_METIS_GTYPE_NODAL.html b/metis_sys/constant.mgtype_et_METIS_GTYPE_NODAL.html new file mode 100644 index 0000000..1802682 --- /dev/null +++ b/metis_sys/constant.mgtype_et_METIS_GTYPE_NODAL.html @@ -0,0 +1,2 @@ +mgtype_et_METIS_GTYPE_NODAL in metis_sys - Rust +
pub const mgtype_et_METIS_GTYPE_NODAL: mgtype_et = 1;
\ No newline at end of file diff --git a/metis_sys/constant.miptype_et_METIS_IPTYPE_EDGE.html b/metis_sys/constant.miptype_et_METIS_IPTYPE_EDGE.html new file mode 100644 index 0000000..59c9867 --- /dev/null +++ b/metis_sys/constant.miptype_et_METIS_IPTYPE_EDGE.html @@ -0,0 +1,2 @@ +miptype_et_METIS_IPTYPE_EDGE in metis_sys - Rust +
pub const miptype_et_METIS_IPTYPE_EDGE: miptype_et = 2;
\ No newline at end of file diff --git a/metis_sys/constant.miptype_et_METIS_IPTYPE_GROW.html b/metis_sys/constant.miptype_et_METIS_IPTYPE_GROW.html new file mode 100644 index 0000000..485c641 --- /dev/null +++ b/metis_sys/constant.miptype_et_METIS_IPTYPE_GROW.html @@ -0,0 +1,2 @@ +miptype_et_METIS_IPTYPE_GROW in metis_sys - Rust +
pub const miptype_et_METIS_IPTYPE_GROW: miptype_et = 0;
\ No newline at end of file diff --git a/metis_sys/constant.miptype_et_METIS_IPTYPE_METISRB.html b/metis_sys/constant.miptype_et_METIS_IPTYPE_METISRB.html new file mode 100644 index 0000000..120a96f --- /dev/null +++ b/metis_sys/constant.miptype_et_METIS_IPTYPE_METISRB.html @@ -0,0 +1,2 @@ +miptype_et_METIS_IPTYPE_METISRB in metis_sys - Rust +
pub const miptype_et_METIS_IPTYPE_METISRB: miptype_et = 4;
\ No newline at end of file diff --git a/metis_sys/constant.miptype_et_METIS_IPTYPE_NODE.html b/metis_sys/constant.miptype_et_METIS_IPTYPE_NODE.html new file mode 100644 index 0000000..5429fa3 --- /dev/null +++ b/metis_sys/constant.miptype_et_METIS_IPTYPE_NODE.html @@ -0,0 +1,2 @@ +miptype_et_METIS_IPTYPE_NODE in metis_sys - Rust +
pub const miptype_et_METIS_IPTYPE_NODE: miptype_et = 3;
\ No newline at end of file diff --git a/metis_sys/constant.miptype_et_METIS_IPTYPE_RANDOM.html b/metis_sys/constant.miptype_et_METIS_IPTYPE_RANDOM.html new file mode 100644 index 0000000..2341468 --- /dev/null +++ b/metis_sys/constant.miptype_et_METIS_IPTYPE_RANDOM.html @@ -0,0 +1,2 @@ +miptype_et_METIS_IPTYPE_RANDOM in metis_sys - Rust +
pub const miptype_et_METIS_IPTYPE_RANDOM: miptype_et = 1;
\ No newline at end of file diff --git a/metis_sys/constant.mobjtype_et_METIS_OBJTYPE_CUT.html b/metis_sys/constant.mobjtype_et_METIS_OBJTYPE_CUT.html new file mode 100644 index 0000000..29b6239 --- /dev/null +++ b/metis_sys/constant.mobjtype_et_METIS_OBJTYPE_CUT.html @@ -0,0 +1,2 @@ +mobjtype_et_METIS_OBJTYPE_CUT in metis_sys - Rust +
pub const mobjtype_et_METIS_OBJTYPE_CUT: mobjtype_et = 0;
\ No newline at end of file diff --git a/metis_sys/constant.mobjtype_et_METIS_OBJTYPE_NODE.html b/metis_sys/constant.mobjtype_et_METIS_OBJTYPE_NODE.html new file mode 100644 index 0000000..3e064ac --- /dev/null +++ b/metis_sys/constant.mobjtype_et_METIS_OBJTYPE_NODE.html @@ -0,0 +1,2 @@ +mobjtype_et_METIS_OBJTYPE_NODE in metis_sys - Rust +
pub const mobjtype_et_METIS_OBJTYPE_NODE: mobjtype_et = 2;
\ No newline at end of file diff --git a/metis_sys/constant.mobjtype_et_METIS_OBJTYPE_VOL.html b/metis_sys/constant.mobjtype_et_METIS_OBJTYPE_VOL.html new file mode 100644 index 0000000..e13aa7a --- /dev/null +++ b/metis_sys/constant.mobjtype_et_METIS_OBJTYPE_VOL.html @@ -0,0 +1,2 @@ +mobjtype_et_METIS_OBJTYPE_VOL in metis_sys - Rust +
pub const mobjtype_et_METIS_OBJTYPE_VOL: mobjtype_et = 1;
\ No newline at end of file diff --git a/metis_sys/constant.moptions_et_METIS_OPTION_BALANCE.html b/metis_sys/constant.moptions_et_METIS_OPTION_BALANCE.html new file mode 100644 index 0000000..6d91002 --- /dev/null +++ b/metis_sys/constant.moptions_et_METIS_OPTION_BALANCE.html @@ -0,0 +1,2 @@ +moptions_et_METIS_OPTION_BALANCE in metis_sys - Rust +
pub const moptions_et_METIS_OPTION_BALANCE: moptions_et = 27;
\ No newline at end of file diff --git a/metis_sys/constant.moptions_et_METIS_OPTION_CCORDER.html b/metis_sys/constant.moptions_et_METIS_OPTION_CCORDER.html new file mode 100644 index 0000000..fd4c988 --- /dev/null +++ b/metis_sys/constant.moptions_et_METIS_OPTION_CCORDER.html @@ -0,0 +1,2 @@ +moptions_et_METIS_OPTION_CCORDER in metis_sys - Rust +
pub const moptions_et_METIS_OPTION_CCORDER: moptions_et = 14;
\ No newline at end of file diff --git a/metis_sys/constant.moptions_et_METIS_OPTION_COMPRESS.html b/metis_sys/constant.moptions_et_METIS_OPTION_COMPRESS.html new file mode 100644 index 0000000..82b7042 --- /dev/null +++ b/metis_sys/constant.moptions_et_METIS_OPTION_COMPRESS.html @@ -0,0 +1,2 @@ +moptions_et_METIS_OPTION_COMPRESS in metis_sys - Rust +
pub const moptions_et_METIS_OPTION_COMPRESS: moptions_et = 13;
\ No newline at end of file diff --git a/metis_sys/constant.moptions_et_METIS_OPTION_CONTIG.html b/metis_sys/constant.moptions_et_METIS_OPTION_CONTIG.html new file mode 100644 index 0000000..23c68b8 --- /dev/null +++ b/metis_sys/constant.moptions_et_METIS_OPTION_CONTIG.html @@ -0,0 +1,2 @@ +moptions_et_METIS_OPTION_CONTIG in metis_sys - Rust +
pub const moptions_et_METIS_OPTION_CONTIG: moptions_et = 12;
\ No newline at end of file diff --git a/metis_sys/constant.moptions_et_METIS_OPTION_CTYPE.html b/metis_sys/constant.moptions_et_METIS_OPTION_CTYPE.html new file mode 100644 index 0000000..0f4a68c --- /dev/null +++ b/metis_sys/constant.moptions_et_METIS_OPTION_CTYPE.html @@ -0,0 +1,2 @@ +moptions_et_METIS_OPTION_CTYPE in metis_sys - Rust +
pub const moptions_et_METIS_OPTION_CTYPE: moptions_et = 2;
\ No newline at end of file diff --git a/metis_sys/constant.moptions_et_METIS_OPTION_DBGLVL.html b/metis_sys/constant.moptions_et_METIS_OPTION_DBGLVL.html new file mode 100644 index 0000000..1200ca1 --- /dev/null +++ b/metis_sys/constant.moptions_et_METIS_OPTION_DBGLVL.html @@ -0,0 +1,2 @@ +moptions_et_METIS_OPTION_DBGLVL in metis_sys - Rust +
pub const moptions_et_METIS_OPTION_DBGLVL: moptions_et = 5;
\ No newline at end of file diff --git a/metis_sys/constant.moptions_et_METIS_OPTION_DROPEDGES.html b/metis_sys/constant.moptions_et_METIS_OPTION_DROPEDGES.html new file mode 100644 index 0000000..acf03f3 --- /dev/null +++ b/metis_sys/constant.moptions_et_METIS_OPTION_DROPEDGES.html @@ -0,0 +1,2 @@ +moptions_et_METIS_OPTION_DROPEDGES in metis_sys - Rust +
pub const moptions_et_METIS_OPTION_DROPEDGES: moptions_et = 19;
\ No newline at end of file diff --git a/metis_sys/constant.moptions_et_METIS_OPTION_FAST.html b/metis_sys/constant.moptions_et_METIS_OPTION_FAST.html new file mode 100644 index 0000000..9d7e678 --- /dev/null +++ b/metis_sys/constant.moptions_et_METIS_OPTION_FAST.html @@ -0,0 +1,2 @@ +moptions_et_METIS_OPTION_FAST in metis_sys - Rust +
pub const moptions_et_METIS_OPTION_FAST: moptions_et = 22;
\ No newline at end of file diff --git a/metis_sys/constant.moptions_et_METIS_OPTION_GTYPE.html b/metis_sys/constant.moptions_et_METIS_OPTION_GTYPE.html new file mode 100644 index 0000000..7aae6f5 --- /dev/null +++ b/metis_sys/constant.moptions_et_METIS_OPTION_GTYPE.html @@ -0,0 +1,2 @@ +moptions_et_METIS_OPTION_GTYPE in metis_sys - Rust +
pub const moptions_et_METIS_OPTION_GTYPE: moptions_et = 28;
\ No newline at end of file diff --git a/metis_sys/constant.moptions_et_METIS_OPTION_HELP.html b/metis_sys/constant.moptions_et_METIS_OPTION_HELP.html new file mode 100644 index 0000000..ba3f634 --- /dev/null +++ b/metis_sys/constant.moptions_et_METIS_OPTION_HELP.html @@ -0,0 +1,2 @@ +moptions_et_METIS_OPTION_HELP in metis_sys - Rust +
pub const moptions_et_METIS_OPTION_HELP: moptions_et = 23;
\ No newline at end of file diff --git a/metis_sys/constant.moptions_et_METIS_OPTION_IPTYPE.html b/metis_sys/constant.moptions_et_METIS_OPTION_IPTYPE.html new file mode 100644 index 0000000..d6e785f --- /dev/null +++ b/metis_sys/constant.moptions_et_METIS_OPTION_IPTYPE.html @@ -0,0 +1,2 @@ +moptions_et_METIS_OPTION_IPTYPE in metis_sys - Rust +
pub const moptions_et_METIS_OPTION_IPTYPE: moptions_et = 3;
\ No newline at end of file diff --git a/metis_sys/constant.moptions_et_METIS_OPTION_MINCONN.html b/metis_sys/constant.moptions_et_METIS_OPTION_MINCONN.html new file mode 100644 index 0000000..051957f --- /dev/null +++ b/metis_sys/constant.moptions_et_METIS_OPTION_MINCONN.html @@ -0,0 +1,2 @@ +moptions_et_METIS_OPTION_MINCONN in metis_sys - Rust +
pub const moptions_et_METIS_OPTION_MINCONN: moptions_et = 11;
\ No newline at end of file diff --git a/metis_sys/constant.moptions_et_METIS_OPTION_NCOMMON.html b/metis_sys/constant.moptions_et_METIS_OPTION_NCOMMON.html new file mode 100644 index 0000000..281ce29 --- /dev/null +++ b/metis_sys/constant.moptions_et_METIS_OPTION_NCOMMON.html @@ -0,0 +1,2 @@ +moptions_et_METIS_OPTION_NCOMMON in metis_sys - Rust +
pub const moptions_et_METIS_OPTION_NCOMMON: moptions_et = 25;
\ No newline at end of file diff --git a/metis_sys/constant.moptions_et_METIS_OPTION_NCUTS.html b/metis_sys/constant.moptions_et_METIS_OPTION_NCUTS.html new file mode 100644 index 0000000..5dcc053 --- /dev/null +++ b/metis_sys/constant.moptions_et_METIS_OPTION_NCUTS.html @@ -0,0 +1,2 @@ +moptions_et_METIS_OPTION_NCUTS in metis_sys - Rust +
pub const moptions_et_METIS_OPTION_NCUTS: moptions_et = 8;
\ No newline at end of file diff --git a/metis_sys/constant.moptions_et_METIS_OPTION_NIPARTS.html b/metis_sys/constant.moptions_et_METIS_OPTION_NIPARTS.html new file mode 100644 index 0000000..3235daf --- /dev/null +++ b/metis_sys/constant.moptions_et_METIS_OPTION_NIPARTS.html @@ -0,0 +1,2 @@ +moptions_et_METIS_OPTION_NIPARTS in metis_sys - Rust +
pub const moptions_et_METIS_OPTION_NIPARTS: moptions_et = 6;
\ No newline at end of file diff --git a/metis_sys/constant.moptions_et_METIS_OPTION_NITER.html b/metis_sys/constant.moptions_et_METIS_OPTION_NITER.html new file mode 100644 index 0000000..584bf2a --- /dev/null +++ b/metis_sys/constant.moptions_et_METIS_OPTION_NITER.html @@ -0,0 +1,2 @@ +moptions_et_METIS_OPTION_NITER in metis_sys - Rust +
pub const moptions_et_METIS_OPTION_NITER: moptions_et = 7;
\ No newline at end of file diff --git a/metis_sys/constant.moptions_et_METIS_OPTION_NO2HOP.html b/metis_sys/constant.moptions_et_METIS_OPTION_NO2HOP.html new file mode 100644 index 0000000..bdd7a86 --- /dev/null +++ b/metis_sys/constant.moptions_et_METIS_OPTION_NO2HOP.html @@ -0,0 +1,2 @@ +moptions_et_METIS_OPTION_NO2HOP in metis_sys - Rust +
pub const moptions_et_METIS_OPTION_NO2HOP: moptions_et = 20;
\ No newline at end of file diff --git a/metis_sys/constant.moptions_et_METIS_OPTION_NOOUTPUT.html b/metis_sys/constant.moptions_et_METIS_OPTION_NOOUTPUT.html new file mode 100644 index 0000000..b97b508 --- /dev/null +++ b/metis_sys/constant.moptions_et_METIS_OPTION_NOOUTPUT.html @@ -0,0 +1,2 @@ +moptions_et_METIS_OPTION_NOOUTPUT in metis_sys - Rust +
pub const moptions_et_METIS_OPTION_NOOUTPUT: moptions_et = 26;
\ No newline at end of file diff --git a/metis_sys/constant.moptions_et_METIS_OPTION_NSEPS.html b/metis_sys/constant.moptions_et_METIS_OPTION_NSEPS.html new file mode 100644 index 0000000..c86ac3b --- /dev/null +++ b/metis_sys/constant.moptions_et_METIS_OPTION_NSEPS.html @@ -0,0 +1,2 @@ +moptions_et_METIS_OPTION_NSEPS in metis_sys - Rust +
pub const moptions_et_METIS_OPTION_NSEPS: moptions_et = 16;
\ No newline at end of file diff --git a/metis_sys/constant.moptions_et_METIS_OPTION_NUMBERING.html b/metis_sys/constant.moptions_et_METIS_OPTION_NUMBERING.html new file mode 100644 index 0000000..254ec7d --- /dev/null +++ b/metis_sys/constant.moptions_et_METIS_OPTION_NUMBERING.html @@ -0,0 +1,2 @@ +moptions_et_METIS_OPTION_NUMBERING in metis_sys - Rust +
pub const moptions_et_METIS_OPTION_NUMBERING: moptions_et = 18;
\ No newline at end of file diff --git a/metis_sys/constant.moptions_et_METIS_OPTION_OBJTYPE.html b/metis_sys/constant.moptions_et_METIS_OPTION_OBJTYPE.html new file mode 100644 index 0000000..164cece --- /dev/null +++ b/metis_sys/constant.moptions_et_METIS_OPTION_OBJTYPE.html @@ -0,0 +1,2 @@ +moptions_et_METIS_OPTION_OBJTYPE in metis_sys - Rust +
pub const moptions_et_METIS_OPTION_OBJTYPE: moptions_et = 1;
\ No newline at end of file diff --git a/metis_sys/constant.moptions_et_METIS_OPTION_ONDISK.html b/metis_sys/constant.moptions_et_METIS_OPTION_ONDISK.html new file mode 100644 index 0000000..87d4efb --- /dev/null +++ b/metis_sys/constant.moptions_et_METIS_OPTION_ONDISK.html @@ -0,0 +1,2 @@ +moptions_et_METIS_OPTION_ONDISK in metis_sys - Rust +
pub const moptions_et_METIS_OPTION_ONDISK: moptions_et = 10;
\ No newline at end of file diff --git a/metis_sys/constant.moptions_et_METIS_OPTION_PFACTOR.html b/metis_sys/constant.moptions_et_METIS_OPTION_PFACTOR.html new file mode 100644 index 0000000..c3d57fb --- /dev/null +++ b/metis_sys/constant.moptions_et_METIS_OPTION_PFACTOR.html @@ -0,0 +1,2 @@ +moptions_et_METIS_OPTION_PFACTOR in metis_sys - Rust +
pub const moptions_et_METIS_OPTION_PFACTOR: moptions_et = 15;
\ No newline at end of file diff --git a/metis_sys/constant.moptions_et_METIS_OPTION_PTYPE.html b/metis_sys/constant.moptions_et_METIS_OPTION_PTYPE.html new file mode 100644 index 0000000..857303b --- /dev/null +++ b/metis_sys/constant.moptions_et_METIS_OPTION_PTYPE.html @@ -0,0 +1,2 @@ +moptions_et_METIS_OPTION_PTYPE in metis_sys - Rust +
pub const moptions_et_METIS_OPTION_PTYPE: moptions_et = 0;
\ No newline at end of file diff --git a/metis_sys/constant.moptions_et_METIS_OPTION_RTYPE.html b/metis_sys/constant.moptions_et_METIS_OPTION_RTYPE.html new file mode 100644 index 0000000..f7a598b --- /dev/null +++ b/metis_sys/constant.moptions_et_METIS_OPTION_RTYPE.html @@ -0,0 +1,2 @@ +moptions_et_METIS_OPTION_RTYPE in metis_sys - Rust +
pub const moptions_et_METIS_OPTION_RTYPE: moptions_et = 4;
\ No newline at end of file diff --git a/metis_sys/constant.moptions_et_METIS_OPTION_SEED.html b/metis_sys/constant.moptions_et_METIS_OPTION_SEED.html new file mode 100644 index 0000000..e6fd901 --- /dev/null +++ b/metis_sys/constant.moptions_et_METIS_OPTION_SEED.html @@ -0,0 +1,2 @@ +moptions_et_METIS_OPTION_SEED in metis_sys - Rust +
pub const moptions_et_METIS_OPTION_SEED: moptions_et = 9;
\ No newline at end of file diff --git a/metis_sys/constant.moptions_et_METIS_OPTION_TPWGTS.html b/metis_sys/constant.moptions_et_METIS_OPTION_TPWGTS.html new file mode 100644 index 0000000..5ea8904 --- /dev/null +++ b/metis_sys/constant.moptions_et_METIS_OPTION_TPWGTS.html @@ -0,0 +1,2 @@ +moptions_et_METIS_OPTION_TPWGTS in metis_sys - Rust +
pub const moptions_et_METIS_OPTION_TPWGTS: moptions_et = 24;
\ No newline at end of file diff --git a/metis_sys/constant.moptions_et_METIS_OPTION_TWOHOP.html b/metis_sys/constant.moptions_et_METIS_OPTION_TWOHOP.html new file mode 100644 index 0000000..d3281e3 --- /dev/null +++ b/metis_sys/constant.moptions_et_METIS_OPTION_TWOHOP.html @@ -0,0 +1,2 @@ +moptions_et_METIS_OPTION_TWOHOP in metis_sys - Rust +
pub const moptions_et_METIS_OPTION_TWOHOP: moptions_et = 21;
\ No newline at end of file diff --git a/metis_sys/constant.moptions_et_METIS_OPTION_UBVEC.html b/metis_sys/constant.moptions_et_METIS_OPTION_UBVEC.html new file mode 100644 index 0000000..80484e0 --- /dev/null +++ b/metis_sys/constant.moptions_et_METIS_OPTION_UBVEC.html @@ -0,0 +1,2 @@ +moptions_et_METIS_OPTION_UBVEC in metis_sys - Rust +
pub const moptions_et_METIS_OPTION_UBVEC: moptions_et = 29;
\ No newline at end of file diff --git a/metis_sys/constant.moptions_et_METIS_OPTION_UFACTOR.html b/metis_sys/constant.moptions_et_METIS_OPTION_UFACTOR.html new file mode 100644 index 0000000..06927fb --- /dev/null +++ b/metis_sys/constant.moptions_et_METIS_OPTION_UFACTOR.html @@ -0,0 +1,2 @@ +moptions_et_METIS_OPTION_UFACTOR in metis_sys - Rust +
pub const moptions_et_METIS_OPTION_UFACTOR: moptions_et = 17;
\ No newline at end of file diff --git a/metis_sys/constant.moptype_et_METIS_OP_KMETIS.html b/metis_sys/constant.moptype_et_METIS_OP_KMETIS.html new file mode 100644 index 0000000..f380ae4 --- /dev/null +++ b/metis_sys/constant.moptype_et_METIS_OP_KMETIS.html @@ -0,0 +1,2 @@ +moptype_et_METIS_OP_KMETIS in metis_sys - Rust +
pub const moptype_et_METIS_OP_KMETIS: moptype_et = 1;
\ No newline at end of file diff --git a/metis_sys/constant.moptype_et_METIS_OP_OMETIS.html b/metis_sys/constant.moptype_et_METIS_OP_OMETIS.html new file mode 100644 index 0000000..7f0e0a9 --- /dev/null +++ b/metis_sys/constant.moptype_et_METIS_OP_OMETIS.html @@ -0,0 +1,2 @@ +moptype_et_METIS_OP_OMETIS in metis_sys - Rust +
pub const moptype_et_METIS_OP_OMETIS: moptype_et = 2;
\ No newline at end of file diff --git a/metis_sys/constant.moptype_et_METIS_OP_PMETIS.html b/metis_sys/constant.moptype_et_METIS_OP_PMETIS.html new file mode 100644 index 0000000..2f2482d --- /dev/null +++ b/metis_sys/constant.moptype_et_METIS_OP_PMETIS.html @@ -0,0 +1,2 @@ +moptype_et_METIS_OP_PMETIS in metis_sys - Rust +
pub const moptype_et_METIS_OP_PMETIS: moptype_et = 0;
\ No newline at end of file diff --git a/metis_sys/constant.mptype_et_METIS_PTYPE_KWAY.html b/metis_sys/constant.mptype_et_METIS_PTYPE_KWAY.html new file mode 100644 index 0000000..2aa496b --- /dev/null +++ b/metis_sys/constant.mptype_et_METIS_PTYPE_KWAY.html @@ -0,0 +1,2 @@ +mptype_et_METIS_PTYPE_KWAY in metis_sys - Rust +
pub const mptype_et_METIS_PTYPE_KWAY: mptype_et = 1;
\ No newline at end of file diff --git a/metis_sys/constant.mptype_et_METIS_PTYPE_RB.html b/metis_sys/constant.mptype_et_METIS_PTYPE_RB.html new file mode 100644 index 0000000..8898881 --- /dev/null +++ b/metis_sys/constant.mptype_et_METIS_PTYPE_RB.html @@ -0,0 +1,2 @@ +mptype_et_METIS_PTYPE_RB in metis_sys - Rust +
pub const mptype_et_METIS_PTYPE_RB: mptype_et = 0;
\ No newline at end of file diff --git a/metis_sys/constant.mrtype_et_METIS_RTYPE_FM.html b/metis_sys/constant.mrtype_et_METIS_RTYPE_FM.html new file mode 100644 index 0000000..92370cd --- /dev/null +++ b/metis_sys/constant.mrtype_et_METIS_RTYPE_FM.html @@ -0,0 +1,2 @@ +mrtype_et_METIS_RTYPE_FM in metis_sys - Rust +
pub const mrtype_et_METIS_RTYPE_FM: mrtype_et = 0;
\ No newline at end of file diff --git a/metis_sys/constant.mrtype_et_METIS_RTYPE_GREEDY.html b/metis_sys/constant.mrtype_et_METIS_RTYPE_GREEDY.html new file mode 100644 index 0000000..925c3b4 --- /dev/null +++ b/metis_sys/constant.mrtype_et_METIS_RTYPE_GREEDY.html @@ -0,0 +1,2 @@ +mrtype_et_METIS_RTYPE_GREEDY in metis_sys - Rust +
pub const mrtype_et_METIS_RTYPE_GREEDY: mrtype_et = 1;
\ No newline at end of file diff --git a/metis_sys/constant.mrtype_et_METIS_RTYPE_SEP1SIDED.html b/metis_sys/constant.mrtype_et_METIS_RTYPE_SEP1SIDED.html new file mode 100644 index 0000000..a63bd68 --- /dev/null +++ b/metis_sys/constant.mrtype_et_METIS_RTYPE_SEP1SIDED.html @@ -0,0 +1,2 @@ +mrtype_et_METIS_RTYPE_SEP1SIDED in metis_sys - Rust +
pub const mrtype_et_METIS_RTYPE_SEP1SIDED: mrtype_et = 3;
\ No newline at end of file diff --git a/metis_sys/constant.mrtype_et_METIS_RTYPE_SEP2SIDED.html b/metis_sys/constant.mrtype_et_METIS_RTYPE_SEP2SIDED.html new file mode 100644 index 0000000..e79f898 --- /dev/null +++ b/metis_sys/constant.mrtype_et_METIS_RTYPE_SEP2SIDED.html @@ -0,0 +1,2 @@ +mrtype_et_METIS_RTYPE_SEP2SIDED in metis_sys - Rust +
pub const mrtype_et_METIS_RTYPE_SEP2SIDED: mrtype_et = 2;
\ No newline at end of file diff --git a/metis_sys/constant.rstatus_et_METIS_ERROR.html b/metis_sys/constant.rstatus_et_METIS_ERROR.html new file mode 100644 index 0000000..4e69420 --- /dev/null +++ b/metis_sys/constant.rstatus_et_METIS_ERROR.html @@ -0,0 +1,3 @@ +rstatus_et_METIS_ERROR in metis_sys - Rust +
pub const rstatus_et_METIS_ERROR: rstatus_et = -4;
Expand description

< Some other errors

+
\ No newline at end of file diff --git a/metis_sys/constant.rstatus_et_METIS_ERROR_INPUT.html b/metis_sys/constant.rstatus_et_METIS_ERROR_INPUT.html new file mode 100644 index 0000000..854b467 --- /dev/null +++ b/metis_sys/constant.rstatus_et_METIS_ERROR_INPUT.html @@ -0,0 +1,3 @@ +rstatus_et_METIS_ERROR_INPUT in metis_sys - Rust +
pub const rstatus_et_METIS_ERROR_INPUT: rstatus_et = -2;
Expand description

< Returned due to erroneous inputs and/or options

+
\ No newline at end of file diff --git a/metis_sys/constant.rstatus_et_METIS_ERROR_MEMORY.html b/metis_sys/constant.rstatus_et_METIS_ERROR_MEMORY.html new file mode 100644 index 0000000..6a833cf --- /dev/null +++ b/metis_sys/constant.rstatus_et_METIS_ERROR_MEMORY.html @@ -0,0 +1,3 @@ +rstatus_et_METIS_ERROR_MEMORY in metis_sys - Rust +
pub const rstatus_et_METIS_ERROR_MEMORY: rstatus_et = -3;
Expand description

< Returned due to insufficient memory

+
\ No newline at end of file diff --git a/metis_sys/constant.rstatus_et_METIS_OK.html b/metis_sys/constant.rstatus_et_METIS_OK.html new file mode 100644 index 0000000..eb4430d --- /dev/null +++ b/metis_sys/constant.rstatus_et_METIS_OK.html @@ -0,0 +1,3 @@ +rstatus_et_METIS_OK in metis_sys - Rust +
pub const rstatus_et_METIS_OK: rstatus_et = 1;
Expand description

< Returned normally

+
\ No newline at end of file diff --git a/metis_sys/fn.METIS_CacheFriendlyReordering.html b/metis_sys/fn.METIS_CacheFriendlyReordering.html new file mode 100644 index 0000000..d54f247 --- /dev/null +++ b/metis_sys/fn.METIS_CacheFriendlyReordering.html @@ -0,0 +1,8 @@ +METIS_CacheFriendlyReordering in metis_sys - Rust +
pub unsafe extern "C" fn METIS_CacheFriendlyReordering(
+    nvtxs: idx_t,
+    xadj: *mut idx_t,
+    adjncy: *mut idx_t,
+    part: *mut idx_t,
+    old2new: *mut idx_t
+) -> c_int
\ No newline at end of file diff --git a/metis_sys/fn.METIS_ComputeVertexSeparator.html b/metis_sys/fn.METIS_ComputeVertexSeparator.html new file mode 100644 index 0000000..838a7a2 --- /dev/null +++ b/metis_sys/fn.METIS_ComputeVertexSeparator.html @@ -0,0 +1,10 @@ +METIS_ComputeVertexSeparator in metis_sys - Rust +
pub unsafe extern "C" fn METIS_ComputeVertexSeparator(
+    nvtxs: *mut idx_t,
+    xadj: *mut idx_t,
+    adjncy: *mut idx_t,
+    vwgt: *mut idx_t,
+    options: *mut idx_t,
+    sepsize: *mut idx_t,
+    part: *mut idx_t
+) -> c_int
\ No newline at end of file diff --git a/metis_sys/fn.METIS_Free.html b/metis_sys/fn.METIS_Free.html new file mode 100644 index 0000000..ab434b0 --- /dev/null +++ b/metis_sys/fn.METIS_Free.html @@ -0,0 +1,2 @@ +METIS_Free in metis_sys - Rust +

Function metis_sys::METIS_Free

source ·
pub unsafe extern "C" fn METIS_Free(ptr: *mut c_void) -> c_int
\ No newline at end of file diff --git a/metis_sys/fn.METIS_MeshToDual.html b/metis_sys/fn.METIS_MeshToDual.html new file mode 100644 index 0000000..f0dc094 --- /dev/null +++ b/metis_sys/fn.METIS_MeshToDual.html @@ -0,0 +1,11 @@ +METIS_MeshToDual in metis_sys - Rust +
pub unsafe extern "C" fn METIS_MeshToDual(
+    ne: *mut idx_t,
+    nn: *mut idx_t,
+    eptr: *mut idx_t,
+    eind: *mut idx_t,
+    ncommon: *mut idx_t,
+    numflag: *mut idx_t,
+    r_xadj: *mut *mut idx_t,
+    r_adjncy: *mut *mut idx_t
+) -> c_int
\ No newline at end of file diff --git a/metis_sys/fn.METIS_MeshToNodal.html b/metis_sys/fn.METIS_MeshToNodal.html new file mode 100644 index 0000000..058c55a --- /dev/null +++ b/metis_sys/fn.METIS_MeshToNodal.html @@ -0,0 +1,10 @@ +METIS_MeshToNodal in metis_sys - Rust +
pub unsafe extern "C" fn METIS_MeshToNodal(
+    ne: *mut idx_t,
+    nn: *mut idx_t,
+    eptr: *mut idx_t,
+    eind: *mut idx_t,
+    numflag: *mut idx_t,
+    r_xadj: *mut *mut idx_t,
+    r_adjncy: *mut *mut idx_t
+) -> c_int
\ No newline at end of file diff --git a/metis_sys/fn.METIS_NodeND.html b/metis_sys/fn.METIS_NodeND.html new file mode 100644 index 0000000..7509f41 --- /dev/null +++ b/metis_sys/fn.METIS_NodeND.html @@ -0,0 +1,10 @@ +METIS_NodeND in metis_sys - Rust +

Function metis_sys::METIS_NodeND

source ·
pub unsafe extern "C" fn METIS_NodeND(
+    nvtxs: *mut idx_t,
+    xadj: *mut idx_t,
+    adjncy: *mut idx_t,
+    vwgt: *mut idx_t,
+    options: *mut idx_t,
+    perm: *mut idx_t,
+    iperm: *mut idx_t
+) -> c_int
\ No newline at end of file diff --git a/metis_sys/fn.METIS_NodeNDP.html b/metis_sys/fn.METIS_NodeNDP.html new file mode 100644 index 0000000..d291d11 --- /dev/null +++ b/metis_sys/fn.METIS_NodeNDP.html @@ -0,0 +1,12 @@ +METIS_NodeNDP in metis_sys - Rust +

Function metis_sys::METIS_NodeNDP

source ·
pub unsafe extern "C" fn METIS_NodeNDP(
+    nvtxs: idx_t,
+    xadj: *mut idx_t,
+    adjncy: *mut idx_t,
+    vwgt: *mut idx_t,
+    npes: idx_t,
+    options: *mut idx_t,
+    perm: *mut idx_t,
+    iperm: *mut idx_t,
+    sizes: *mut idx_t
+) -> c_int
\ No newline at end of file diff --git a/metis_sys/fn.METIS_NodeRefine.html b/metis_sys/fn.METIS_NodeRefine.html new file mode 100644 index 0000000..c7e05d9 --- /dev/null +++ b/metis_sys/fn.METIS_NodeRefine.html @@ -0,0 +1,10 @@ +METIS_NodeRefine in metis_sys - Rust +
pub unsafe extern "C" fn METIS_NodeRefine(
+    nvtxs: idx_t,
+    xadj: *mut idx_t,
+    vwgt: *mut idx_t,
+    adjncy: *mut idx_t,
+    where_: *mut idx_t,
+    hmarker: *mut idx_t,
+    ubfactor: real_t
+) -> c_int
\ No newline at end of file diff --git a/metis_sys/fn.METIS_PartGraphKway.html b/metis_sys/fn.METIS_PartGraphKway.html new file mode 100644 index 0000000..007081c --- /dev/null +++ b/metis_sys/fn.METIS_PartGraphKway.html @@ -0,0 +1,16 @@ +METIS_PartGraphKway in metis_sys - Rust +
pub unsafe extern "C" fn METIS_PartGraphKway(
+    nvtxs: *mut idx_t,
+    ncon: *mut idx_t,
+    xadj: *mut idx_t,
+    adjncy: *mut idx_t,
+    vwgt: *mut idx_t,
+    vsize: *mut idx_t,
+    adjwgt: *mut idx_t,
+    nparts: *mut idx_t,
+    tpwgts: *mut real_t,
+    ubvec: *mut real_t,
+    options: *mut idx_t,
+    edgecut: *mut idx_t,
+    part: *mut idx_t
+) -> c_int
\ No newline at end of file diff --git a/metis_sys/fn.METIS_PartGraphRecursive.html b/metis_sys/fn.METIS_PartGraphRecursive.html new file mode 100644 index 0000000..9315e49 --- /dev/null +++ b/metis_sys/fn.METIS_PartGraphRecursive.html @@ -0,0 +1,16 @@ +METIS_PartGraphRecursive in metis_sys - Rust +
pub unsafe extern "C" fn METIS_PartGraphRecursive(
+    nvtxs: *mut idx_t,
+    ncon: *mut idx_t,
+    xadj: *mut idx_t,
+    adjncy: *mut idx_t,
+    vwgt: *mut idx_t,
+    vsize: *mut idx_t,
+    adjwgt: *mut idx_t,
+    nparts: *mut idx_t,
+    tpwgts: *mut real_t,
+    ubvec: *mut real_t,
+    options: *mut idx_t,
+    edgecut: *mut idx_t,
+    part: *mut idx_t
+) -> c_int
\ No newline at end of file diff --git a/metis_sys/fn.METIS_PartMeshDual.html b/metis_sys/fn.METIS_PartMeshDual.html new file mode 100644 index 0000000..e4d7431 --- /dev/null +++ b/metis_sys/fn.METIS_PartMeshDual.html @@ -0,0 +1,16 @@ +METIS_PartMeshDual in metis_sys - Rust +
pub unsafe extern "C" fn METIS_PartMeshDual(
+    ne: *mut idx_t,
+    nn: *mut idx_t,
+    eptr: *mut idx_t,
+    eind: *mut idx_t,
+    vwgt: *mut idx_t,
+    vsize: *mut idx_t,
+    ncommon: *mut idx_t,
+    nparts: *mut idx_t,
+    tpwgts: *mut real_t,
+    options: *mut idx_t,
+    objval: *mut idx_t,
+    epart: *mut idx_t,
+    npart: *mut idx_t
+) -> c_int
\ No newline at end of file diff --git a/metis_sys/fn.METIS_PartMeshNodal.html b/metis_sys/fn.METIS_PartMeshNodal.html new file mode 100644 index 0000000..85a5077 --- /dev/null +++ b/metis_sys/fn.METIS_PartMeshNodal.html @@ -0,0 +1,15 @@ +METIS_PartMeshNodal in metis_sys - Rust +
pub unsafe extern "C" fn METIS_PartMeshNodal(
+    ne: *mut idx_t,
+    nn: *mut idx_t,
+    eptr: *mut idx_t,
+    eind: *mut idx_t,
+    vwgt: *mut idx_t,
+    vsize: *mut idx_t,
+    nparts: *mut idx_t,
+    tpwgts: *mut real_t,
+    options: *mut idx_t,
+    objval: *mut idx_t,
+    epart: *mut idx_t,
+    npart: *mut idx_t
+) -> c_int
\ No newline at end of file diff --git a/metis_sys/fn.METIS_SetDefaultOptions.html b/metis_sys/fn.METIS_SetDefaultOptions.html new file mode 100644 index 0000000..6933354 --- /dev/null +++ b/metis_sys/fn.METIS_SetDefaultOptions.html @@ -0,0 +1,4 @@ +METIS_SetDefaultOptions in metis_sys - Rust +
pub unsafe extern "C" fn METIS_SetDefaultOptions(
+    options: *mut idx_t
+) -> c_int
\ No newline at end of file diff --git a/metis_sys/index.html b/metis_sys/index.html new file mode 100644 index 0000000..a52a4bb --- /dev/null +++ b/metis_sys/index.html @@ -0,0 +1,3 @@ +metis_sys - Rust +

Crate metis_sys

source ·

Constants

Functions

Type Aliases

\ No newline at end of file diff --git a/metis_sys/sidebar-items.js b/metis_sys/sidebar-items.js new file mode 100644 index 0000000..bc139ea --- /dev/null +++ b/metis_sys/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"constant":["METIS_NOPTIONS","METIS_VER_MAJOR","METIS_VER_MINOR","METIS_VER_SUBMINOR","mctype_et_METIS_CTYPE_RM","mctype_et_METIS_CTYPE_SHEM","mdbglvl_et_METIS_DBG_COARSEN","mdbglvl_et_METIS_DBG_CONNINFO","mdbglvl_et_METIS_DBG_CONTIGINFO","mdbglvl_et_METIS_DBG_INFO","mdbglvl_et_METIS_DBG_IPART","mdbglvl_et_METIS_DBG_MEMORY","mdbglvl_et_METIS_DBG_MOVEINFO","mdbglvl_et_METIS_DBG_REFINE","mdbglvl_et_METIS_DBG_SEPINFO","mdbglvl_et_METIS_DBG_TIME","mgtype_et_METIS_GTYPE_DUAL","mgtype_et_METIS_GTYPE_NODAL","miptype_et_METIS_IPTYPE_EDGE","miptype_et_METIS_IPTYPE_GROW","miptype_et_METIS_IPTYPE_METISRB","miptype_et_METIS_IPTYPE_NODE","miptype_et_METIS_IPTYPE_RANDOM","mobjtype_et_METIS_OBJTYPE_CUT","mobjtype_et_METIS_OBJTYPE_NODE","mobjtype_et_METIS_OBJTYPE_VOL","moptions_et_METIS_OPTION_BALANCE","moptions_et_METIS_OPTION_CCORDER","moptions_et_METIS_OPTION_COMPRESS","moptions_et_METIS_OPTION_CONTIG","moptions_et_METIS_OPTION_CTYPE","moptions_et_METIS_OPTION_DBGLVL","moptions_et_METIS_OPTION_DROPEDGES","moptions_et_METIS_OPTION_FAST","moptions_et_METIS_OPTION_GTYPE","moptions_et_METIS_OPTION_HELP","moptions_et_METIS_OPTION_IPTYPE","moptions_et_METIS_OPTION_MINCONN","moptions_et_METIS_OPTION_NCOMMON","moptions_et_METIS_OPTION_NCUTS","moptions_et_METIS_OPTION_NIPARTS","moptions_et_METIS_OPTION_NITER","moptions_et_METIS_OPTION_NO2HOP","moptions_et_METIS_OPTION_NOOUTPUT","moptions_et_METIS_OPTION_NSEPS","moptions_et_METIS_OPTION_NUMBERING","moptions_et_METIS_OPTION_OBJTYPE","moptions_et_METIS_OPTION_ONDISK","moptions_et_METIS_OPTION_PFACTOR","moptions_et_METIS_OPTION_PTYPE","moptions_et_METIS_OPTION_RTYPE","moptions_et_METIS_OPTION_SEED","moptions_et_METIS_OPTION_TPWGTS","moptions_et_METIS_OPTION_TWOHOP","moptions_et_METIS_OPTION_UBVEC","moptions_et_METIS_OPTION_UFACTOR","moptype_et_METIS_OP_KMETIS","moptype_et_METIS_OP_OMETIS","moptype_et_METIS_OP_PMETIS","mptype_et_METIS_PTYPE_KWAY","mptype_et_METIS_PTYPE_RB","mrtype_et_METIS_RTYPE_FM","mrtype_et_METIS_RTYPE_GREEDY","mrtype_et_METIS_RTYPE_SEP1SIDED","mrtype_et_METIS_RTYPE_SEP2SIDED","rstatus_et_METIS_ERROR","rstatus_et_METIS_ERROR_INPUT","rstatus_et_METIS_ERROR_MEMORY","rstatus_et_METIS_OK"],"fn":["METIS_CacheFriendlyReordering","METIS_ComputeVertexSeparator","METIS_Free","METIS_MeshToDual","METIS_MeshToNodal","METIS_NodeND","METIS_NodeNDP","METIS_NodeRefine","METIS_PartGraphKway","METIS_PartGraphRecursive","METIS_PartMeshDual","METIS_PartMeshNodal","METIS_SetDefaultOptions"],"type":["idx_t","mctype_et","mdbglvl_et","mgtype_et","miptype_et","mobjtype_et","moptions_et","moptype_et","mptype_et","mrtype_et","real_t","rstatus_et"]}; \ No newline at end of file diff --git a/metis_sys/type.idx_t.html b/metis_sys/type.idx_t.html new file mode 100644 index 0000000..cd6546a --- /dev/null +++ b/metis_sys/type.idx_t.html @@ -0,0 +1,2 @@ +idx_t in metis_sys - Rust +

Type Alias metis_sys::idx_t

source ·
pub type idx_t = i32;
\ No newline at end of file diff --git a/metis_sys/type.mctype_et.html b/metis_sys/type.mctype_et.html new file mode 100644 index 0000000..4f4d133 --- /dev/null +++ b/metis_sys/type.mctype_et.html @@ -0,0 +1,3 @@ +mctype_et in metis_sys - Rust +

Type Alias metis_sys::mctype_et

source ·
pub type mctype_et = c_int;
Expand description

Coarsening Schemes

+
\ No newline at end of file diff --git a/metis_sys/type.mdbglvl_et.html b/metis_sys/type.mdbglvl_et.html new file mode 100644 index 0000000..c981d3a --- /dev/null +++ b/metis_sys/type.mdbglvl_et.html @@ -0,0 +1,3 @@ +mdbglvl_et in metis_sys - Rust +

Type Alias metis_sys::mdbglvl_et

source ·
pub type mdbglvl_et = c_int;
Expand description

Debug Levels

+
\ No newline at end of file diff --git a/metis_sys/type.mgtype_et.html b/metis_sys/type.mgtype_et.html new file mode 100644 index 0000000..57ac644 --- /dev/null +++ b/metis_sys/type.mgtype_et.html @@ -0,0 +1,3 @@ +mgtype_et in metis_sys - Rust +

Type Alias metis_sys::mgtype_et

source ·
pub type mgtype_et = c_int;
Expand description

Graph types for meshes

+
\ No newline at end of file diff --git a/metis_sys/type.miptype_et.html b/metis_sys/type.miptype_et.html new file mode 100644 index 0000000..a492f99 --- /dev/null +++ b/metis_sys/type.miptype_et.html @@ -0,0 +1,3 @@ +miptype_et in metis_sys - Rust +

Type Alias metis_sys::miptype_et

source ·
pub type miptype_et = c_int;
Expand description

Initial partitioning schemes

+
\ No newline at end of file diff --git a/metis_sys/type.mobjtype_et.html b/metis_sys/type.mobjtype_et.html new file mode 100644 index 0000000..4888227 --- /dev/null +++ b/metis_sys/type.mobjtype_et.html @@ -0,0 +1,2 @@ +mobjtype_et in metis_sys - Rust +

Type Alias metis_sys::mobjtype_et

source ·
pub type mobjtype_et = c_int;
\ No newline at end of file diff --git a/metis_sys/type.moptions_et.html b/metis_sys/type.moptions_et.html new file mode 100644 index 0000000..820369c --- /dev/null +++ b/metis_sys/type.moptions_et.html @@ -0,0 +1,3 @@ +moptions_et in metis_sys - Rust +

Type Alias metis_sys::moptions_et

source ·
pub type moptions_et = c_int;
Expand description

Options codes (i.e., options[])

+
\ No newline at end of file diff --git a/metis_sys/type.moptype_et.html b/metis_sys/type.moptype_et.html new file mode 100644 index 0000000..0ff7e3a --- /dev/null +++ b/metis_sys/type.moptype_et.html @@ -0,0 +1,3 @@ +moptype_et in metis_sys - Rust +

Type Alias metis_sys::moptype_et

source ·
pub type moptype_et = c_int;
Expand description

Operation type codes

+
\ No newline at end of file diff --git a/metis_sys/type.mptype_et.html b/metis_sys/type.mptype_et.html new file mode 100644 index 0000000..2603e27 --- /dev/null +++ b/metis_sys/type.mptype_et.html @@ -0,0 +1,3 @@ +mptype_et in metis_sys - Rust +

Type Alias metis_sys::mptype_et

source ·
pub type mptype_et = c_int;
Expand description

Partitioning Schemes

+
\ No newline at end of file diff --git a/metis_sys/type.mrtype_et.html b/metis_sys/type.mrtype_et.html new file mode 100644 index 0000000..e154ed5 --- /dev/null +++ b/metis_sys/type.mrtype_et.html @@ -0,0 +1,3 @@ +mrtype_et in metis_sys - Rust +

Type Alias metis_sys::mrtype_et

source ·
pub type mrtype_et = c_int;
Expand description

Refinement schemes

+
\ No newline at end of file diff --git a/metis_sys/type.real_t.html b/metis_sys/type.real_t.html new file mode 100644 index 0000000..ee638cb --- /dev/null +++ b/metis_sys/type.real_t.html @@ -0,0 +1,2 @@ +real_t in metis_sys - Rust +

Type Alias metis_sys::real_t

source ·
pub type real_t = f32;
\ No newline at end of file diff --git a/metis_sys/type.rstatus_et.html b/metis_sys/type.rstatus_et.html new file mode 100644 index 0000000..e5ca903 --- /dev/null +++ b/metis_sys/type.rstatus_et.html @@ -0,0 +1,3 @@ +rstatus_et in metis_sys - Rust +

Type Alias metis_sys::rstatus_et

source ·
pub type rstatus_et = c_int;
Expand description

Return codes

+
\ No newline at end of file diff --git a/search-index.js b/search-index.js new file mode 100644 index 0000000..2743bd8 --- /dev/null +++ b/search-index.js @@ -0,0 +1,6 @@ +var searchIndex = new Map(JSON.parse('[\ +["metis",{"doc":"This crate provides a thin but idiomatic API around …","t":"FPGFIPPFPFPFSGGPPPPPIIPPNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHNNNNCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFGFFPFPPPPTGPFFFFFPGKFGGPPPFPPPFPNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOONNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNOOOOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNNNNNNNNNNNNNNNNN","n":["Dual","Err","Error","Graph","Idx","Input","InvalidGraph","InvalidGraphError","InvalidMesh","InvalidMeshError","Memory","Mesh","NOPTIONS","NewGraphError","NewMeshError","NoConstraints","NoParts","NoParts","Ok","Other","Real","Result","TooLarge","TooLarge","adjncy","as_mut","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","drop","eq","eq","eq","eq","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","from","into","into","into","into","into","into","into","into","mesh_to_dual","new","new","new_unchecked","new_unchecked","option","part_dual","part_kway","part_nodal","part_recursive","set_adjwgt","set_option","set_option","set_options","set_options","set_tpwgts","set_tpwgts","set_ubvec","set_vsize","set_vsize","set_vwgt","set_vwgt","to_string","to_string","to_string","to_string","to_string","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","xadj","CCOrder","CType","Compress","Contig","Cut","DbgLvl","Edge","Fm","Greedy","Grow","INDEX","IpType","Kway","MinConn","NCuts","NIter","NSeps","No2Hop","Node","ObjType","Opt","PFactor","PType","RType","Random","Rb","Rm","Seed","Sep1Sided","Sep2Sided","Shem","UFactor","Vol","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","coarsen","conn_info","contig_info","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","info","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","ipart","move_info","refine","sep_info","time","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","value","value","value","value","value","value","value","value","value","value","value","value","value","value","value","value","value","value"],"q":[[0,"metis"],[130,"metis::option"],[309,"core::fmt"],[310,"core::fmt"],[311,"alloc::string"],[312,"core::any"]],"d":["The dual of a mesh.","Contains the error value","Error type returned by METIS.","Builder structure to set up a graph partition computation.","Integer type used by METIS, can either be an i32 or an i64.","Input is invalid.","The input arrays are malformed and cannot be safely passed …","Error raised when the graph data fed to Graph::new cannot …","The input arrays are malformed and cannot be safely passed …","Error raised when the mesh data fed to Mesh::new cannot be …","METIS hit an out-of-memory error.","Builder structure to set up a mesh partition computation.","The length of the options array.","Error type returned by Graph::new.","Error type returned by Mesh::new.","ncon must be greater than 1.","nparts must be greater than 1.","nparts must be greater than 1.","Contains the success value","METIS returned an error but its meaning is unknown.","Floating-point type used by METIS, can either be an f32 or …","The result of a partitioning.","Graph is too large. One of the array’s length doesn’t …","Mesh is too large. One of the array’s length doesn’t …","The adjacency array.","The adjacency index array, and the adjacency array as …","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Generate the dual graph of a mesh.","Creates a new Graph object to be partitioned.","Creates a new Mesh object to be partitioned.","Creates a new Graph object to be partitioned (unchecked …","Creates a new Mesh object to be partitioned (unchecked …","Fine-tuning parameter types.","Partition the mesh using its dual graph.","Partition the graph using multilevel k-way partitioning.","Partition the mesh using its nodal graph.","Partition the graph using multilevel recursive bisection.","Sets the weights of the edges.","Sets a fine-tuning parameter for this partitioning.","Sets a fine-tuning parameter for this partitioning.","Sets the fine-tuning parameters for this partitioning.","Sets the fine-tuning parameters for this partitioning.","Sets the target partition weights for each part and …","Sets the target partition weights for each part.","Sets the load imbalance tolerance for each constraint.","Sets the communication weights of the vertices.","Sets the communication weights of the elements.","Sets the computational weights of the vertices.","Sets the computational weights of the elements.","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","The adjacency index array.","Specifies if the connected components of the graph should …","Specifies the matching scheme to be used during coarsening.","Specifies that the graph should be compressed by combining …","Specifies that the partitioning routines should try to …","Edge-cut minimization.","Specifies the amount of progress/debugging information …","Derives a separator from an edge cut.","FM-based cut refinement.","Greedy-based cut and volume refinement.","Grows a bisection using a greedy strategy.","Index of the option in the array from …","Determines the algorithm used during initial partitioning.","Multilevel k-way partitioning.","Specifies that the partitioning routines should try to …","Specifies the number of different partitions that it will …","Specifies the number of iterations for the refinement …","Specifies the number of different separators that it will …","Specifies that the coarsening will not perform any 2-hop …","Grow a bisection using a greedy node-based strategy.","Specifies the type of objective.","Trait implemented by METIS’ options.","Specifies the minimum degree of the vertices that will be …","Specifies the partitioning method.","Determines the algorithm used for refinement.","Compute a bisection at random followed by a refinement.","Multilevel recursive bisection.","Random matching.","Specifies the seed for the random number generator.","One-sided FM refinement.","Two-sided FM refinement.","Sorted heavy-edge matching.","Specifies the maximum allowed load imbalance among the …","Total communication volume minimization.","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Displays various statistics during coarsening.","Display information related to the minimization of …","Display information related to the elimination of …","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Prints various diagnostic messages.","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Displays various statistics during initial partitioning.","Display detailed information about vertex moves during …","Displays various statistics during refinement.","Display detailed information about vertex separators.","Performs timing analysis.","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Convert the value into metis’ format, for use with …","","","","","","","","","","","","","","","","",""],"i":[0,15,0,0,0,5,12,0,14,0,5,0,0,0,0,12,12,14,15,5,0,0,12,14,1,1,5,11,12,7,13,14,8,1,5,11,12,7,13,14,8,1,1,5,7,8,1,5,5,11,11,12,12,7,13,13,14,14,8,1,5,5,5,11,12,7,13,14,8,1,5,11,12,7,13,14,8,1,0,7,8,7,8,0,8,7,8,7,7,7,8,7,8,7,8,7,7,8,7,8,5,11,12,13,14,5,11,12,7,13,14,8,1,5,11,12,7,13,14,8,1,5,11,12,7,13,14,8,1,1,0,0,0,0,23,0,25,26,26,25,17,0,22,0,0,0,0,0,25,0,0,0,0,0,25,22,24,0,26,26,24,0,23,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,38,38,38,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,38,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,38,38,38,38,38,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,17,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38],"f":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,[1,[[3,[2]]]],[1,[[4,[[3,[2]],[3,[2]]]]]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[1,4],[[5,5],6],[[7,7],6],[[8,8],6],[[1,1],6],[[5,9],10],[[5,9],10],[[11,9],10],[[11,9],10],[[12,9],10],[[12,9],10],[[7,9],10],[[13,9],10],[[13,9],10],[[14,9],10],[[14,9],10],[[8,9],10],[[1,9],10],[14,5],[12,5],[-1,-1,[]],[-1,-1,[]],[-1,-1,[]],[-1,-1,[]],[-1,-1,[]],[-1,-1,[]],[-1,-1,[]],[-1,-1,[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[[[3,[2]],[3,[2]],2],[[15,[1]]]],[[2,2,[3,[2]],[3,[2]]],[[16,[7,12]]]],[[2,[3,[2]],[3,[2]]],[[16,[8,14]]]],[[2,2,[3,[2]],[3,[2]]],7],[[2,2,[3,[2]],[3,[2]]],8],0,[[8,[3,[2]],[3,[2]]],[[15,[2]]]],[[7,[3,[2]]],[[15,[2]]]],[[8,[3,[2]],[3,[2]]],[[15,[2]]]],[[7,[3,[2]]],[[15,[2]]]],[[7,[3,[2]]],7],[[7,-1],7,17],[[8,-1],8,17],[[7,[18,[2]]],7],[[8,[18,[2]]],8],[[7,[3,[19]]],7],[[8,[3,[19]]],8],[[7,[3,[19]]],7],[[7,[3,[2]]],7],[[8,[3,[2]]],8],[[7,[3,[2]]],7],[[8,[3,[2]]],8],[-1,20,[]],[-1,20,[]],[-1,20,[]],[-1,20,[]],[-1,20,[]],[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[-1,21,[]],[-1,21,[]],[-1,21,[]],[-1,21,[]],[-1,21,[]],[-1,21,[]],[-1,21,[]],[-1,21,[]],[1,[[3,[2]]]],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],0,0,0,[-1,-1,[]],[-1,-1,[]],[-1,-1,[]],[-1,-1,[]],[-1,-1,[]],[-1,-1,[]],[-1,-1,[]],[-1,-1,[]],[-1,-1,[]],[-1,-1,[]],[-1,-1,[]],[-1,-1,[]],[-1,-1,[]],[-1,-1,[]],[-1,-1,[]],[-1,-1,[]],[-1,-1,[]],0,[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],0,0,0,0,0,[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[-1,21,[]],[-1,21,[]],[-1,21,[]],[-1,21,[]],[-1,21,[]],[-1,21,[]],[-1,21,[]],[-1,21,[]],[-1,21,[]],[-1,21,[]],[-1,21,[]],[-1,21,[]],[-1,21,[]],[-1,21,[]],[-1,21,[]],[-1,21,[]],[-1,21,[]],[17,2],[22,2],[23,2],[24,2],[25,2],[26,2],[27,2],[28,2],[29,2],[30,2],[31,2],[32,2],[33,2],[34,2],[35,2],[36,2],[37,2],[38,2]],"c":[],"p":[[5,"Dual",0],[8,"Idx",0],[1,"slice"],[1,"tuple"],[6,"Error",0],[1,"bool"],[5,"Graph",0],[5,"Mesh",0],[5,"Formatter",309],[8,"Result",309],[5,"InvalidGraphError",0],[6,"NewGraphError",0],[5,"InvalidMeshError",0],[6,"NewMeshError",0],[8,"Result",0],[6,"Result",310],[10,"Opt",130],[1,"array"],[8,"Real",0],[5,"String",311],[5,"TypeId",312],[6,"PType",130],[6,"ObjType",130],[6,"CType",130],[6,"IpType",130],[6,"RType",130],[5,"NCuts",130],[5,"NSeps",130],[5,"NIter",130],[5,"Seed",130],[5,"MinConn",130],[5,"No2Hop",130],[5,"Contig",130],[5,"Compress",130],[5,"CCOrder",130],[5,"PFactor",130],[5,"UFactor",130],[5,"DbgLvl",130]],"b":[[47,"impl-Debug-for-Error"],[48,"impl-Display-for-Error"],[49,"impl-Debug-for-InvalidGraphError"],[50,"impl-Display-for-InvalidGraphError"],[51,"impl-Debug-for-NewGraphError"],[52,"impl-Display-for-NewGraphError"],[54,"impl-Debug-for-InvalidMeshError"],[55,"impl-Display-for-InvalidMeshError"],[56,"impl-Display-for-NewMeshError"],[57,"impl-Debug-for-NewMeshError"],[60,"impl-From%3CNewMeshError%3E-for-Error"],[61,"impl-From%3CNewGraphError%3E-for-Error"]]}],\ +["metis_sys",{"doc":"","t":"HHHHHSHHHHHHHHSSSIISSISSSSSSSSSSISSISSSSSISSSISSSSSSSSSSSSSSSSSSSSSSSSSSSSSSISSSISSISSSSIISSSS","n":["METIS_CacheFriendlyReordering","METIS_ComputeVertexSeparator","METIS_Free","METIS_MeshToDual","METIS_MeshToNodal","METIS_NOPTIONS","METIS_NodeND","METIS_NodeNDP","METIS_NodeRefine","METIS_PartGraphKway","METIS_PartGraphRecursive","METIS_PartMeshDual","METIS_PartMeshNodal","METIS_SetDefaultOptions","METIS_VER_MAJOR","METIS_VER_MINOR","METIS_VER_SUBMINOR","idx_t","mctype_et","mctype_et_METIS_CTYPE_RM","mctype_et_METIS_CTYPE_SHEM","mdbglvl_et","mdbglvl_et_METIS_DBG_COARSEN","mdbglvl_et_METIS_DBG_CONNINFO","mdbglvl_et_METIS_DBG_CONTIGINFO","mdbglvl_et_METIS_DBG_INFO","mdbglvl_et_METIS_DBG_IPART","mdbglvl_et_METIS_DBG_MEMORY","mdbglvl_et_METIS_DBG_MOVEINFO","mdbglvl_et_METIS_DBG_REFINE","mdbglvl_et_METIS_DBG_SEPINFO","mdbglvl_et_METIS_DBG_TIME","mgtype_et","mgtype_et_METIS_GTYPE_DUAL","mgtype_et_METIS_GTYPE_NODAL","miptype_et","miptype_et_METIS_IPTYPE_EDGE","miptype_et_METIS_IPTYPE_GROW","miptype_et_METIS_IPTYPE_METISRB","miptype_et_METIS_IPTYPE_NODE","miptype_et_METIS_IPTYPE_RANDOM","mobjtype_et","mobjtype_et_METIS_OBJTYPE_CUT","mobjtype_et_METIS_OBJTYPE_NODE","mobjtype_et_METIS_OBJTYPE_VOL","moptions_et","moptions_et_METIS_OPTION_BALANCE","moptions_et_METIS_OPTION_CCORDER","moptions_et_METIS_OPTION_COMPRESS","moptions_et_METIS_OPTION_CONTIG","moptions_et_METIS_OPTION_CTYPE","moptions_et_METIS_OPTION_DBGLVL","moptions_et_METIS_OPTION_DROPEDGES","moptions_et_METIS_OPTION_FAST","moptions_et_METIS_OPTION_GTYPE","moptions_et_METIS_OPTION_HELP","moptions_et_METIS_OPTION_IPTYPE","moptions_et_METIS_OPTION_MINCONN","moptions_et_METIS_OPTION_NCOMMON","moptions_et_METIS_OPTION_NCUTS","moptions_et_METIS_OPTION_NIPARTS","moptions_et_METIS_OPTION_NITER","moptions_et_METIS_OPTION_NO2HOP","moptions_et_METIS_OPTION_NOOUTPUT","moptions_et_METIS_OPTION_NSEPS","moptions_et_METIS_OPTION_NUMBERING","moptions_et_METIS_OPTION_OBJTYPE","moptions_et_METIS_OPTION_ONDISK","moptions_et_METIS_OPTION_PFACTOR","moptions_et_METIS_OPTION_PTYPE","moptions_et_METIS_OPTION_RTYPE","moptions_et_METIS_OPTION_SEED","moptions_et_METIS_OPTION_TPWGTS","moptions_et_METIS_OPTION_TWOHOP","moptions_et_METIS_OPTION_UBVEC","moptions_et_METIS_OPTION_UFACTOR","moptype_et","moptype_et_METIS_OP_KMETIS","moptype_et_METIS_OP_OMETIS","moptype_et_METIS_OP_PMETIS","mptype_et","mptype_et_METIS_PTYPE_KWAY","mptype_et_METIS_PTYPE_RB","mrtype_et","mrtype_et_METIS_RTYPE_FM","mrtype_et_METIS_RTYPE_GREEDY","mrtype_et_METIS_RTYPE_SEP1SIDED","mrtype_et_METIS_RTYPE_SEP2SIDED","real_t","rstatus_et","rstatus_et_METIS_ERROR","rstatus_et_METIS_ERROR_INPUT","rstatus_et_METIS_ERROR_MEMORY","rstatus_et_METIS_OK"],"q":[[0,"metis_sys"]],"d":["","","","","","","","","","","","","","","","","","","Coarsening Schemes","","","Debug Levels","< Show the coarsening progress","< Show info on minimization of subdomain connectivity","< Show info on elimination of connected components","< Shows various diagnostic messages","< Show info on initial partitioning","< Show info related to wspace allocation","< Show info on vertex moves during refinement","< Show the refinement progress","< Show info on vertex moves during sep refinement","< Perform timing analysis","Graph types for meshes","","","Initial partitioning schemes","","","","","","","","","","Options codes (i.e., options[])","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Operation type codes","","","","Partitioning Schemes","","","Refinement schemes","","","","","","Return codes","< Some other errors","< Returned due to erroneous inputs and/or options","< Returned due to insufficient memory","< Returned normally"],"i":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"f":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"c":[],"p":[],"b":[]}]\ +]')); +if (typeof exports !== 'undefined') exports.searchIndex = searchIndex; +else if (window.initSearch) window.initSearch(searchIndex); diff --git a/settings.html b/settings.html new file mode 100644 index 0000000..c5871ba --- /dev/null +++ b/settings.html @@ -0,0 +1,2 @@ +Settings +

Rustdoc settings

Back
\ No newline at end of file diff --git a/src-files.js b/src-files.js new file mode 100644 index 0000000..bb903c1 --- /dev/null +++ b/src-files.js @@ -0,0 +1,5 @@ +var srcIndex = new Map(JSON.parse('[\ +["metis",["",[],["lib.rs","option.rs"]]],\ +["metis_sys",["",[["gen",[],["bindings.rs"]]],["lib.rs"]]]\ +]')); +createSrcSidebar(); diff --git a/src/metis/lib.rs.html b/src/metis/lib.rs.html new file mode 100644 index 0000000..079467e --- /dev/null +++ b/src/metis/lib.rs.html @@ -0,0 +1,2386 @@ +lib.rs - source +
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+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
+644
+645
+646
+647
+648
+649
+650
+651
+652
+653
+654
+655
+656
+657
+658
+659
+660
+661
+662
+663
+664
+665
+666
+667
+668
+669
+670
+671
+672
+673
+674
+675
+676
+677
+678
+679
+680
+681
+682
+683
+684
+685
+686
+687
+688
+689
+690
+691
+692
+693
+694
+695
+696
+697
+698
+699
+700
+701
+702
+703
+704
+705
+706
+707
+708
+709
+710
+711
+712
+713
+714
+715
+716
+717
+718
+719
+720
+721
+722
+723
+724
+725
+726
+727
+728
+729
+730
+731
+732
+733
+734
+735
+736
+737
+738
+739
+740
+741
+742
+743
+744
+745
+746
+747
+748
+749
+750
+751
+752
+753
+754
+755
+756
+757
+758
+759
+760
+761
+762
+763
+764
+765
+766
+767
+768
+769
+770
+771
+772
+773
+774
+775
+776
+777
+778
+779
+780
+781
+782
+783
+784
+785
+786
+787
+788
+789
+790
+791
+792
+793
+794
+795
+796
+797
+798
+799
+800
+801
+802
+803
+804
+805
+806
+807
+808
+809
+810
+811
+812
+813
+814
+815
+816
+817
+818
+819
+820
+821
+822
+823
+824
+825
+826
+827
+828
+829
+830
+831
+832
+833
+834
+835
+836
+837
+838
+839
+840
+841
+842
+843
+844
+845
+846
+847
+848
+849
+850
+851
+852
+853
+854
+855
+856
+857
+858
+859
+860
+861
+862
+863
+864
+865
+866
+867
+868
+869
+870
+871
+872
+873
+874
+875
+876
+877
+878
+879
+880
+881
+882
+883
+884
+885
+886
+887
+888
+889
+890
+891
+892
+893
+894
+895
+896
+897
+898
+899
+900
+901
+902
+903
+904
+905
+906
+907
+908
+909
+910
+911
+912
+913
+914
+915
+916
+917
+918
+919
+920
+921
+922
+923
+924
+925
+926
+927
+928
+929
+930
+931
+932
+933
+934
+935
+936
+937
+938
+939
+940
+941
+942
+943
+944
+945
+946
+947
+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
+1010
+1011
+1012
+1013
+1014
+1015
+1016
+1017
+1018
+1019
+1020
+1021
+1022
+1023
+1024
+1025
+1026
+1027
+1028
+1029
+1030
+1031
+1032
+1033
+1034
+1035
+1036
+1037
+1038
+1039
+1040
+1041
+1042
+1043
+1044
+1045
+1046
+1047
+1048
+1049
+1050
+1051
+1052
+1053
+1054
+1055
+1056
+1057
+1058
+1059
+1060
+1061
+1062
+1063
+1064
+1065
+1066
+1067
+1068
+1069
+1070
+1071
+1072
+1073
+1074
+1075
+1076
+1077
+1078
+1079
+1080
+1081
+1082
+1083
+1084
+1085
+1086
+1087
+1088
+1089
+1090
+1091
+1092
+1093
+1094
+1095
+1096
+1097
+1098
+1099
+1100
+1101
+1102
+1103
+1104
+1105
+1106
+1107
+1108
+1109
+1110
+1111
+1112
+1113
+1114
+1115
+1116
+1117
+1118
+1119
+1120
+1121
+1122
+1123
+1124
+1125
+1126
+1127
+1128
+1129
+1130
+1131
+1132
+1133
+1134
+1135
+1136
+1137
+1138
+1139
+1140
+1141
+1142
+1143
+1144
+1145
+1146
+1147
+1148
+1149
+1150
+1151
+1152
+1153
+1154
+1155
+1156
+1157
+1158
+1159
+1160
+1161
+1162
+1163
+1164
+1165
+1166
+1167
+1168
+1169
+1170
+1171
+1172
+1173
+1174
+1175
+1176
+1177
+1178
+1179
+1180
+1181
+1182
+1183
+1184
+1185
+1186
+1187
+1188
+1189
+1190
+1191
+1192
+
//! This crate provides a thin but idiomatic API around libmetis.
+//!
+//! See [`Graph`] for a usage example.
+
+#![deny(missing_docs)]
+
+use crate::option::Opt;
+use metis_sys as m;
+use std::convert::TryFrom;
+use std::fmt;
+use std::mem;
+use std::os;
+use std::ptr;
+use std::result::Result as StdResult;
+use std::slice;
+
+pub mod option;
+
+#[cfg(target_pointer_width = "16")]
+compile_error!("METIS does not support 16-bit architectures");
+
+/// Integer type used by METIS, can either be an [`i32`] or an [`i64`].
+pub type Idx = m::idx_t;
+
+/// Floating-point type used by METIS, can either be an [`f32`] or an [`f64`].
+pub type Real = m::real_t;
+
+/// The length of the `options` array.
+///
+/// See [`Graph::set_options`] for an example.  It is also used in
+/// [`Mesh::set_options`].
+pub const NOPTIONS: usize = m::METIS_NOPTIONS as usize;
+
+/// Error type returned by METIS.
+#[derive(Debug, PartialEq, Eq)]
+pub enum Error {
+    /// Input is invalid.
+    ///
+    /// These bindings should check for most input errors, if not all.
+    Input,
+
+    /// METIS hit an out-of-memory error.
+    Memory,
+
+    /// METIS returned an error but its meaning is unknown.
+    Other,
+}
+
+impl std::error::Error for Error {}
+
+impl From<NewGraphError> for Error {
+    fn from(_: NewGraphError) -> Self {
+        Self::Input
+    }
+}
+
+impl From<NewMeshError> for Error {
+    fn from(_: NewMeshError) -> Self {
+        Self::Input
+    }
+}
+
+impl fmt::Display for Error {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        match self {
+            Error::Input => write!(f, "invalid input"),
+            Error::Memory => write!(f, "out of memory"),
+            Error::Other => write!(f, "METIS returned an error"),
+        }
+    }
+}
+
+/// The result of a partitioning.
+pub type Result<T> = StdResult<T, Error>;
+
+trait ErrorCode {
+    /// Makes a [`Result`] from a return code (int) from METIS.
+    fn wrap(self) -> Result<()>;
+}
+
+impl ErrorCode for m::rstatus_et {
+    fn wrap(self) -> Result<()> {
+        match self {
+            m::rstatus_et_METIS_OK => Ok(()),
+            m::rstatus_et_METIS_ERROR_INPUT => Err(Error::Input),
+            m::rstatus_et_METIS_ERROR_MEMORY => Err(Error::Memory),
+            m::rstatus_et_METIS_ERROR => Err(Error::Other),
+            other => panic!("unexpected error code ({}) from METIS", other),
+        }
+    }
+}
+
+/// Error raised when the graph data fed to [`Graph::new`] cannot be safely
+/// passed to METIS.
+///
+/// Graph data must follow the format described in [`Graph::new`].
+#[derive(Debug)]
+pub struct InvalidGraphError {
+    msg: &'static str,
+}
+
+impl fmt::Display for InvalidGraphError {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        self.msg.fmt(f)
+    }
+}
+
+/// Error type returned by [`Graph::new`].
+///
+/// Unlike [`Error`], this error originates from the Rust bindings.
+#[derive(Debug)]
+#[non_exhaustive]
+pub enum NewGraphError {
+    /// `ncon` must be greater than 1.
+    NoConstraints,
+
+    /// `nparts` must be greater than 1.
+    NoParts,
+
+    /// Graph is too large. One of the array's length doesn't fit into [`Idx`].
+    TooLarge,
+
+    /// The input arrays are malformed and cannot be safely passed to METIS.
+    ///
+    /// Note that these bindings do not check for all the invariants. Some might
+    /// be raised during [`Graph::part_recursive`] and [`Graph::part_kway`] as
+    /// [`Error::Input`].
+    InvalidGraph(InvalidGraphError),
+}
+
+impl fmt::Display for NewGraphError {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        match self {
+            Self::NoConstraints => write!(f, "there must be at least one constraint"),
+            Self::NoParts => write!(f, "there must be at least one part"),
+            Self::TooLarge => write!(f, "graph is too large"),
+            Self::InvalidGraph(err) => write!(f, "invalid graph structure: {err}"),
+        }
+    }
+}
+
+impl std::error::Error for NewGraphError {}
+
+impl NewGraphError {
+    fn msg(msg: &'static str) -> Self {
+        Self::InvalidGraph(InvalidGraphError { msg })
+    }
+}
+
+/// Helper function to convert an immutable slice ref to a mutable pointer
+unsafe fn slice_to_mut_ptr<T>(slice: &[T]) -> *mut T {
+    slice.as_ptr() as *mut T
+}
+
+/// Builder structure to set up a graph partition computation.
+///
+/// This structure holds the required arguments for METIS to compute a
+/// partition.  It also offers methods to easily set any optional argument.
+///
+/// # Example
+///
+/// ```rust
+/// # fn main() -> Result<(), metis::Error> {
+/// # use metis::Graph;
+/// // Make a graph with two vertices and an edge between the two.
+/// let xadj = &mut [0, 1, 2];
+/// let adjncy = &mut [1, 0];
+///
+/// // Allocate the partition array which stores the partition of each vertex.
+/// let mut part = [0, 0];
+///
+/// // There are one constraint and two parts.  The partitioning algorithm used
+/// // is recursive bisection.  The k-way algorithm can also be used.
+/// Graph::new(1, 2, xadj, adjncy)?
+///     .part_recursive(&mut part)?;
+///
+/// // The two vertices are placed in different parts.
+/// assert_ne!(part[0], part[1]);
+/// # Ok(())
+/// # }
+/// ```
+#[derive(Debug, PartialEq)]
+pub struct Graph<'a> {
+    /// The number of balancing constrains.
+    ncon: Idx,
+
+    /// The number of parts to partition the graph.
+    nparts: Idx,
+
+    /// The adjency structure of the graph (part 1).
+    xadj: &'a [Idx],
+
+    /// The adjency structure of the graph (part 2).
+    ///
+    /// Required size: xadj.last()
+    adjncy: &'a [Idx],
+
+    /// The computational weights of the vertices.
+    ///
+    /// Required size: ncon * (xadj.len()-1)
+    vwgt: Option<&'a [Idx]>,
+
+    /// The communication weights of the vertices.
+    ///
+    /// Required size: xadj.len()-1
+    vsize: Option<&'a [Idx]>,
+
+    /// The weight of the edges.
+    ///
+    /// Required size: xadj.last()
+    adjwgt: Option<&'a [Idx]>,
+
+    /// The target partition weights of the vertices.
+    ///
+    /// If `None` then the graph is equally divided among the partitions.
+    ///
+    /// Required size: ncon * nparts
+    tpwgts: Option<&'a [Real]>,
+
+    /// Imbalance tolerances for each constraint.
+    ///
+    /// Required size: ncon
+    ubvec: Option<&'a [Real]>,
+
+    /// Fine-tuning parameters.
+    options: [Idx; NOPTIONS],
+}
+
+impl<'a> Graph<'a> {
+    /// Creates a new [`Graph`] object to be partitioned.
+    ///
+    /// - `ncon` is the number of constraints on each vertex (at least 1),
+    /// - `nparts` is the number of parts wanted in the graph partition.
+    ///
+    /// # Input format
+    ///
+    /// CSR (Compressed Sparse Row) is a data structure for representing sparse
+    /// matrices and is the primary data structure used by METIS. A CSR
+    /// formatted graph is represented with two slices: an adjacency list
+    /// (`adjcny`) and an index list (`xadj`). The nodes adjacent to node `n`
+    /// are `adjncy[xadj[n]..xadj[n + 1]]`. Additionally, metis requires that
+    /// graphs are undirected: if `(u, v)` is in the graph, then `(v, u)` must
+    /// also be in the graph.
+    ///
+    /// Consider translating this simple graph to CSR format:
+    /// ```rust
+    /// // 5 - 3 - 4 - 0
+    /// //     |   | /
+    /// //     2 - 1
+    /// let adjncy = [1, 4, 0, 2, 4, 1, 3, 2, 4, 5, 0, 1, 3, 3];
+    /// let xadj = [0, 2, 5, 7, 10, 13, 14];
+    ///
+    /// // iterate over adjacent nodes
+    /// let mut it = xadj
+    ///     .windows(2)
+    ///     .map(|x| &adjncy[x[0]..x[1]]);
+    ///
+    /// // node 0 is adjacent to nodes 1 and 4
+    /// assert_eq!(it.next().unwrap(), &[1, 4]);
+    ///
+    /// // node 1 is adjacent to nodes 0, 2, and 4
+    /// assert_eq!(it.next().unwrap(), &[0, 2, 4]);
+    ///
+    /// // node 2 is adjacent to nodes 1 and 3
+    /// assert_eq!(it.next().unwrap(), &[1, 3]);
+    ///
+    /// // node 3 is adjacent to nodes 2, 4, and 5
+    /// assert_eq!(it.next().unwrap(), &[2, 4, 5]);
+    ///
+    /// // node 4 is adjacent to nodes 0, 1, and 3
+    /// assert_eq!(it.next().unwrap(), &[0, 1, 3]);
+    ///
+    /// // node 5 is adjacent to node 3
+    /// assert_eq!(it.next().unwrap(), &[3]);
+    ///
+    /// assert!(it.next().is_none());
+    /// ```
+    ///
+    /// More info can be found at:
+    /// <https://en.wikipedia.org/wiki/Sparse_matrix#Compressed_sparse_row_(CSR,_CRS_or_Yale_format)>
+    ///
+    /// # Errors
+    ///
+    /// The following invariants must be held, otherwise this function returns
+    /// an error:
+    ///
+    /// - all the arrays have a length that can be held by an [`Idx`],
+    /// - `ncon` is strictly greater than zero,
+    /// - `nparts` is strictly greater than zero,
+    /// - `xadj` has at least one element (its length is the one more than the
+    ///   number of vertices),
+    /// - `xadj` is sorted,
+    /// - elements of `xadj` are positive,
+    /// - the last element of `xadj` is the length of `adjncy`,
+    /// - elements of `adjncy` are within zero and the number of vertices.
+    ///
+    /// # Mutability
+    ///
+    /// [`Graph::part_kway`] and [`Graph::part_recursive`] may mutate the
+    /// contents of `xadj` and `adjncy`, but should revert all changes before
+    /// returning.
+    pub fn new(
+        ncon: Idx,
+        nparts: Idx,
+        xadj: &'a [Idx],
+        adjncy: &'a [Idx],
+    ) -> StdResult<Graph<'a>, NewGraphError> {
+        if ncon <= 0 {
+            return Err(NewGraphError::NoConstraints);
+        }
+        if nparts <= 0 {
+            return Err(NewGraphError::NoParts);
+        }
+
+        let last_xadj = *xadj
+            .last()
+            .ok_or(NewGraphError::msg("index list is empty"))?;
+        let adjncy_len = Idx::try_from(adjncy.len()).map_err(|_| NewGraphError::TooLarge)?;
+        if last_xadj != adjncy_len {
+            return Err(NewGraphError::msg(
+                "length mismatch between index and adjacency lists",
+            ));
+        }
+
+        let nvtxs = match Idx::try_from(xadj.len()) {
+            Ok(xadj_len) => xadj_len - 1,
+            Err(_) => {
+                return Err(NewGraphError::TooLarge);
+            }
+        };
+
+        let mut prev = 0;
+        for x in &*xadj {
+            if prev > *x {
+                return Err(NewGraphError::msg("index list is not sorted"));
+            }
+            prev = *x;
+        }
+
+        for a in &*adjncy {
+            if *a < 0 || *a >= nvtxs {
+                return Err(NewGraphError::msg(
+                    "some values in the adjacency list are out of bounds",
+                ));
+            }
+        }
+
+        Ok(unsafe { Graph::new_unchecked(ncon, nparts, xadj, adjncy) })
+    }
+
+    /// Creates a new [`Graph`] object to be partitioned (unchecked version).
+    ///
+    /// - `ncon` is the number of constraints on each vertex (at least 1),
+    /// - `nparts` is the number of parts wanted in the graph partition.
+    ///
+    /// # Input format
+    ///
+    /// `xadj` and `adjncy` are the [CSR encoding][0] of the adjacency matrix
+    /// that represents the graph. `xadj` is the row index and `adjncy` is the
+    /// column index.
+    ///
+    /// [0]: https://en.wikipedia.org/wiki/Sparse_matrix#Compressed_sparse_row_(CSR,_CRS_or_Yale_format)
+    ///
+    /// # Safety
+    ///
+    /// This function still does some checks listed in "Panics" below. However,
+    /// the caller is reponsible for upholding all invariants listed in the
+    /// "Errors" section of [`Graph::new`]. Otherwise, the behavior of this
+    /// function is undefined.
+    ///
+    /// # Panics
+    ///
+    /// This function panics if:
+    /// - any of the arrays have a length that cannot be held by an [`Idx`], or
+    /// - `ncon` is not strictly greater than zero, or
+    /// - `nparts` is not strictly greater than zero, or
+    /// - `xadj` is empty, or
+    /// - the length of `adjncy` is different from the last element of `xadj`.
+    ///
+    /// # Mutability
+    ///
+    /// [`Graph::part_kway`] and [`Graph::part_recursive`] may mutate the
+    /// contents of `xadj` and `adjncy`, but should revert all changes before
+    /// returning.
+    pub unsafe fn new_unchecked(
+        ncon: Idx,
+        nparts: Idx,
+        xadj: &'a [Idx],
+        adjncy: &'a [Idx],
+    ) -> Graph<'a> {
+        assert!(0 < ncon, "ncon must be strictly greater than zero");
+        assert!(0 < nparts, "nparts must be strictly greater than zero");
+        let _ = Idx::try_from(xadj.len()).expect("xadj array larger than Idx::MAX");
+        assert_ne!(xadj.len(), 0);
+        let adjncy_len = Idx::try_from(adjncy.len()).expect("adjncy array larger than Idx::MAX");
+        assert_eq!(adjncy_len, *xadj.last().unwrap());
+
+        Graph {
+            ncon,
+            nparts,
+            xadj,
+            adjncy,
+            vwgt: None,
+            vsize: None,
+            adjwgt: None,
+            tpwgts: None,
+            ubvec: None,
+            options: [-1; NOPTIONS],
+        }
+    }
+
+    /// Sets the computational weights of the vertices.
+    ///
+    /// By default, all vertices have the same weight.
+    ///
+    /// The `ncon` weights of the `i`th vertex must be located in
+    /// `vwgt[i*ncon..(i+1)*ncon]`, and all elements of `vwgt` must be positive.
+    ///
+    /// # Panics
+    ///
+    /// This function panics if the length of `vwgt` is not `ncon` times the
+    /// number of vertices.
+    pub fn set_vwgt(mut self, vwgt: &'a [Idx]) -> Graph<'a> {
+        let vwgt_len = Idx::try_from(vwgt.len()).expect("vwgt array too large");
+        assert_eq!(vwgt_len, self.ncon * (self.xadj.len() as Idx - 1));
+        self.vwgt = Some(vwgt);
+        self
+    }
+
+    /// Sets the communication weights of the vertices.
+    ///
+    /// By default, all vertices have the same communication weight.
+    ///
+    /// Vertices can only have one communication weight. The length of `vsize`
+    /// does not depend on `ncon`.
+    ///
+    /// # Panics
+    ///
+    /// This function panics if the length of `vsize` is not the number of
+    /// vertices.
+    pub fn set_vsize(mut self, vsize: &'a [Idx]) -> Graph<'a> {
+        let vsize_len = Idx::try_from(vsize.len()).expect("vsize array too large");
+        assert_eq!(vsize_len, self.xadj.len() as Idx - 1);
+        self.vsize = Some(vsize);
+        self
+    }
+
+    /// Sets the weights of the edges.
+    ///
+    /// By default, all edges have the same weight.
+    ///
+    /// All elements of `adjwgt` must be positive.
+    ///
+    /// # Panics
+    ///
+    /// This function panics if the length of `adjwgt` is not equal to the
+    /// length of `adjncy`.
+    pub fn set_adjwgt(mut self, adjwgt: &'a [Idx]) -> Graph<'a> {
+        let adjwgt_len = Idx::try_from(adjwgt.len()).expect("adjwgt array too large");
+        assert_eq!(adjwgt_len, *self.xadj.last().unwrap());
+        self.adjwgt = Some(adjwgt);
+        self
+    }
+
+    /// Sets the target partition weights for each part and constraint.
+    ///
+    /// By default, the graph is divided equally.
+    ///
+    /// The target partition weight for the `i`th part and `j`th constraint is
+    /// specified at `tpwgts[i*ncon+j]`. For each constraint `j`, the sum of the
+    /// target partition weights must be 1.0. Meaning
+    /// `(0..nparts).map(|i| tpwgts[i*ncon+j]).sum() == 1.0`.
+    ///
+    /// # Panics
+    ///
+    /// This function panics if the length of `tpwgts` is not equal to `ncon`
+    /// times `nparts`.
+    pub fn set_tpwgts(mut self, tpwgts: &'a [Real]) -> Graph<'a> {
+        let tpwgts_len = Idx::try_from(tpwgts.len()).expect("tpwgts array too large");
+        assert_eq!(tpwgts_len, self.ncon * self.nparts);
+        self.tpwgts = Some(tpwgts);
+        self
+    }
+
+    /// Sets the load imbalance tolerance for each constraint.
+    ///
+    /// By default, it equals to 1.001 if `ncon` equals 1 and 1.01 otherwise.
+    ///
+    /// For the `i`th partition and `j`th constraint the allowed weight is the
+    /// `ubvec[j]*tpwgts[i*ncon+j]` fraction of the `j`th's constraint total
+    /// weight. The load imbalances must be greater than 1.0.
+    ///
+    /// # Panics
+    ///
+    /// This function panics if the length of `ubvec` is not equal to `ncon`.
+    pub fn set_ubvec(mut self, ubvec: &'a [Real]) -> Graph<'a> {
+        let ubvec_len = Idx::try_from(ubvec.len()).expect("ubvec array too large");
+        assert_eq!(ubvec_len, self.ncon);
+        self.ubvec = Some(ubvec);
+        self
+    }
+
+    /// Sets the fine-tuning parameters for this partitioning.
+    ///
+    /// When few options are to be set, [`Graph::set_option`] might be a
+    /// better fit.
+    ///
+    /// See the [option] module for the list of available parameters.  Note that
+    /// not all are applicable to a given partitioning method.  Refer to the
+    /// documentation of METIS ([link]) for more info on this.
+    ///
+    /// [link]: http://glaros.dtc.umn.edu/gkhome/fetch/sw/metis/manual.pdf
+    ///
+    /// # Example
+    ///
+    /// ```rust
+    /// # fn main() -> Result<(), metis::Error> {
+    /// # use metis::Graph;
+    /// use metis::option::Opt as _;
+    ///
+    /// let xadj = &[0, 1, 2];
+    /// let adjncy = &[1, 0];
+    /// let mut part = [0, 0];
+    ///
+    /// // -1 is the default value.
+    /// let mut options = [-1; metis::NOPTIONS];
+    ///
+    /// // four refinement iterations instead of the default 10.
+    /// options[metis::option::NIter::INDEX] = 4;
+    ///
+    /// Graph::new(1, 2, xadj, adjncy)?
+    ///     .set_options(&options)
+    ///     .part_recursive(&mut part)?;
+    ///
+    /// // The two vertices are placed in different parts.
+    /// assert_ne!(part[0], part[1]);
+    /// # Ok(())
+    /// # }
+    /// ```
+    pub fn set_options(mut self, options: &[Idx; NOPTIONS]) -> Graph<'a> {
+        self.options.copy_from_slice(options);
+        self
+    }
+
+    /// Sets a fine-tuning parameter for this partitioning.
+    ///
+    /// When options are to be set in batches, [`Graph::set_options`] might be a
+    /// better fit.
+    ///
+    /// See the [option] module for the list of available parameters.  Note that
+    /// not all are applicable to a given partitioning method.  Refer to the
+    /// documentation of METIS ([link]) for more info on this.
+    ///
+    /// [link]: http://glaros.dtc.umn.edu/gkhome/fetch/sw/metis/manual.pdf
+    ///
+    /// # Example
+    ///
+    /// ```rust
+    /// # fn main() -> Result<(), metis::Error> {
+    /// # use metis::Graph;
+    /// let xadj = &[0, 1, 2];
+    /// let adjncy = &[1, 0];
+    /// let mut part = [0, 0];
+    ///
+    /// Graph::new(1, 2, xadj, adjncy)?
+    ///     .set_option(metis::option::NIter(4))
+    ///     .part_recursive(&mut part)?;
+    ///
+    /// // The two vertices are placed in different parts.
+    /// assert_ne!(part[0], part[1]);
+    /// # Ok(())
+    /// # }
+    /// ```
+    pub fn set_option<O>(mut self, option: O) -> Graph<'a>
+    where
+        O: option::Opt,
+    {
+        self.options[O::INDEX] = option.value();
+        self
+    }
+
+    /// Partition the graph using multilevel recursive bisection.
+    ///
+    /// Returns the edge-cut, the total communication volume of the
+    /// partitioning solution.
+    ///
+    /// Equivalent of `METIS_PartGraphRecursive`.
+    ///
+    /// # Panics
+    ///
+    /// This function panics if the length of `part` is not the number of
+    /// vertices.
+    pub fn part_recursive(mut self, part: &mut [Idx]) -> Result<Idx> {
+        self.options[option::Numbering::INDEX] = option::Numbering::C.value();
+        let part_len = Idx::try_from(part.len()).expect("part array larger than Idx::MAX");
+        assert_eq!(
+            part_len,
+            self.xadj.len() as Idx - 1,
+            "part.len() must be equal to the number of vertices",
+        );
+
+        if self.nparts == 1 {
+            // METIS does not handle this case well.
+            part.fill(0);
+            return Ok(0);
+        }
+
+        let nvtxs = self.xadj.len() as Idx - 1;
+        let mut edgecut = mem::MaybeUninit::uninit();
+        let part = part.as_mut_ptr();
+        unsafe {
+            m::METIS_PartGraphRecursive(
+                &nvtxs as *const Idx as *mut Idx,
+                &self.ncon as *const Idx as *mut Idx,
+                slice_to_mut_ptr(self.xadj),
+                slice_to_mut_ptr(self.adjncy),
+                self.vwgt
+                    .map_or_else(ptr::null_mut, |s| slice_to_mut_ptr(s)),
+                self.vsize
+                    .map_or_else(ptr::null_mut, |s| slice_to_mut_ptr(s)),
+                self.adjwgt
+                    .map_or_else(ptr::null_mut, |s| slice_to_mut_ptr(s)),
+                &self.nparts as *const Idx as *mut Idx,
+                self.tpwgts
+                    .map_or_else(ptr::null_mut, |s| slice_to_mut_ptr(s)),
+                self.ubvec
+                    .map_or_else(ptr::null_mut, |s| slice_to_mut_ptr(s)),
+                slice_to_mut_ptr(&self.options),
+                edgecut.as_mut_ptr(),
+                part,
+            )
+            .wrap()?;
+            Ok(edgecut.assume_init())
+        }
+    }
+
+    /// Partition the graph using multilevel k-way partitioning.
+    ///
+    /// Returns the edge-cut, the total communication volume of the
+    /// partitioning solution.
+    ///
+    /// Equivalent of `METIS_PartGraphKway`.
+    ///
+    /// # Panics
+    ///
+    /// This function panics if the length of `part` is not the number of
+    /// vertices.
+    pub fn part_kway(self, part: &mut [Idx]) -> Result<Idx> {
+        let part_len = Idx::try_from(part.len()).expect("part array larger than Idx::MAX");
+        assert_eq!(
+            part_len,
+            self.xadj.len() as Idx - 1,
+            "part.len() must be equal to the number of vertices",
+        );
+
+        if self.nparts == 1 {
+            // METIS does not handle this case well.
+            part.fill(0);
+            return Ok(0);
+        }
+
+        let nvtxs = self.xadj.len() as Idx - 1;
+        let mut edgecut = mem::MaybeUninit::uninit();
+        let part = part.as_mut_ptr();
+        unsafe {
+            m::METIS_PartGraphKway(
+                &nvtxs as *const Idx as *mut Idx,
+                &self.ncon as *const Idx as *mut Idx,
+                slice_to_mut_ptr(self.xadj),
+                slice_to_mut_ptr(self.adjncy),
+                self.vwgt
+                    .map_or_else(ptr::null_mut, |s| slice_to_mut_ptr(s)),
+                self.vsize
+                    .map_or_else(ptr::null_mut, |s| slice_to_mut_ptr(s)),
+                self.adjwgt
+                    .map_or_else(ptr::null_mut, |s| slice_to_mut_ptr(s)),
+                &self.nparts as *const Idx as *mut Idx,
+                self.tpwgts
+                    .map_or_else(ptr::null_mut, |s| slice_to_mut_ptr(s)),
+                self.ubvec
+                    .map_or_else(ptr::null_mut, |s| slice_to_mut_ptr(s)),
+                slice_to_mut_ptr(&self.options),
+                edgecut.as_mut_ptr(),
+                part,
+            )
+            .wrap()?;
+            Ok(edgecut.assume_init())
+        }
+    }
+}
+
+/// Error raised when the mesh data fed to [`Mesh::new`] cannot be safely passed
+/// to METIS.
+///
+/// Mesh data must follow the format described in [`Mesh::new`].
+#[derive(Debug)]
+pub struct InvalidMeshError {
+    msg: &'static str,
+}
+
+impl fmt::Display for InvalidMeshError {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        self.msg.fmt(f)
+    }
+}
+
+/// Error type returned by [`Mesh::new`].
+///
+/// Unlike [`Error`], this error originates from the Rust bindings.
+#[derive(Debug)]
+#[non_exhaustive]
+pub enum NewMeshError {
+    /// `nparts` must be greater than 1.
+    NoParts,
+
+    /// Mesh is too large. One of the array's length doesn't fit into [`Idx`].
+    TooLarge,
+
+    /// The input arrays are malformed and cannot be safely passed to METIS.
+    ///
+    /// Note that these bindings do not check for all the invariants. Some might
+    /// be raised during [`Mesh::part_dual`] and [`Mesh::part_nodal`] as
+    /// [`Error::Input`].
+    InvalidMesh(InvalidMeshError),
+}
+
+impl fmt::Display for NewMeshError {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        match self {
+            Self::NoParts => write!(f, "there must be at least one part"),
+            Self::TooLarge => write!(f, "mesh is too large"),
+            Self::InvalidMesh(err) => write!(f, "invalid mesh structure: {err}"),
+        }
+    }
+}
+
+impl std::error::Error for NewMeshError {}
+
+impl NewMeshError {
+    fn msg(msg: &'static str) -> Self {
+        Self::InvalidMesh(InvalidMeshError { msg })
+    }
+}
+
+/// Returns the number of elements and the number of nodes in the mesh.
+fn check_mesh_structure(eptr: &[Idx], eind: &[Idx]) -> StdResult<(Idx, Idx), NewMeshError> {
+    let last_eptr = *eptr
+        .last()
+        .ok_or(NewMeshError::msg("element index is empty"))?;
+    let eind_len = Idx::try_from(eind.len()).map_err(|_| NewMeshError::TooLarge)?;
+    if last_eptr != eind_len {
+        return Err(NewMeshError::msg(
+            "length mismatch between element and node indices",
+        ));
+    }
+
+    let ne = Idx::try_from(eptr.len()).map_err(|_| NewMeshError::TooLarge)? - 1;
+
+    let mut prev = 0;
+    for x in eptr {
+        if prev > *x {
+            return Err(NewMeshError::msg("element index is not sorted"));
+        }
+        prev = *x;
+    }
+
+    let mut max_node = 0;
+    for a in eind {
+        if *a < 0 {
+            return Err(NewMeshError::msg(
+                "values in the node index are out of bounds",
+            ));
+        }
+        if *a > max_node {
+            max_node = *a;
+        }
+    }
+
+    Ok((ne, max_node + 1))
+}
+
+/// Builder structure to set up a mesh partition computation.
+///
+/// This structure holds the required arguments for METIS to compute a
+/// partition.  It also offers methods to easily set any optional argument.
+///
+/// # Example
+///
+/// Usage is fairly similar to [`Graph`].  Refer to its documentation for
+/// details.
+#[derive(Debug, PartialEq)]
+pub struct Mesh<'a> {
+    /// The number of nodes in the mesh.
+    nn: Idx,
+
+    /// The number of parts to partition the mesh.
+    nparts: Idx,
+
+    /// The number of nodes two elements must share for an edge to appear in the
+    /// dual graph.
+    ncommon: Idx,
+
+    eptr: &'a [Idx], // mesh representation
+    eind: &'a [Idx], // mesh repr
+
+    /// The computational weights of the elements.
+    ///
+    /// Required size: ne
+    vwgt: Option<&'a [Idx]>,
+
+    /// The communication weights of the elements.
+    ///
+    /// Required size: ne
+    vsize: Option<&'a [Idx]>,
+
+    /// The target partition weights of the elements.
+    ///
+    /// If `None` then the mesh is equally divided among the partitions.
+    ///
+    /// Required size: nparts
+    tpwgts: Option<&'a [Real]>,
+
+    /// Fine-tuning parameters.
+    options: [Idx; NOPTIONS],
+}
+
+impl<'a> Mesh<'a> {
+    /// Creates a new [`Mesh`] object to be partitioned.
+    ///
+    /// `nparts` is the number of parts wanted in the mesh partition.
+    ///
+    /// # Input format
+    ///
+    /// The length of `eptr` is `n + 1`, where `n` is the number of elements in
+    /// the mesh. The length of `eind` is the sum of the number of nodes in all
+    /// the elements of the mesh. The list of nodes belonging to the `i`th
+    /// element of the mesh are stored in consecutive locations of `eind`
+    /// starting at position `eptr[i]` up to (but not including) position
+    /// `eptr[i+1]`.
+    ///
+    /// # Errors
+    ///
+    /// The following invariants must be held, otherwise this function returns
+    /// an error:
+    ///
+    /// - `nparts` is strictly greater than zero,
+    /// - `eptr` has at least one element (its length is the one more than the
+    ///   number of mesh elements),
+    /// - `eptr` is sorted,
+    /// - elements of `eptr` are positive,
+    /// - the last element of `eptr` is the length of `eind`,
+    /// - all the arrays have a length that can be held by an [`Idx`].
+    ///
+    /// # Mutability
+    ///
+    /// [`Mesh::part_dual`] and [`Mesh::part_nodal`] may mutate the contents of
+    /// `eptr` and `eind`, but should revert all changes before returning.
+    pub fn new(nparts: Idx, eptr: &'a [Idx], eind: &'a [Idx]) -> StdResult<Mesh<'a>, NewMeshError> {
+        if nparts <= 0 {
+            return Err(NewMeshError::NoParts);
+        }
+        let (_ne, nn) = check_mesh_structure(&*eptr, &*eind)?;
+        Ok(unsafe { Mesh::new_unchecked(nn, nparts, eptr, eind) })
+    }
+
+    /// Creates a new [`Mesh`] object to be partitioned (unchecked version).
+    ///
+    /// - `nn` is the number of nodes in the mesh,
+    /// - `nparts` is the number of parts wanted in the mesh partition.
+    ///
+    /// # Input format
+    ///
+    /// See [`Mesh::new`].
+    ///
+    /// # Safety
+    ///
+    /// This function still does some checks listed in "Panics" below. However,
+    /// the caller is reponsible for upholding all invariants listed in the
+    /// "Errors" section of [`Mesh::new`]. Otherwise, the behavior of this
+    /// function is undefined.
+    ///
+    /// # Panics
+    ///
+    /// This function panics if:
+    /// - any of the arrays have a length that cannot be hold by an [`Idx`], or
+    /// - `nn` is not strictly greater than zero, or
+    /// - `nparts` is not strictly greater than zero, or
+    /// - `eptr` is empty, or
+    /// - the length of `eind` is different from the last element of `eptr`.
+    ///
+    /// # Mutability
+    ///
+    /// While nothing should be modified by the [`Mesh`] structure, METIS
+    /// doesn't specify any `const` modifier, so everything must be mutable on
+    /// Rust's side.
+    pub unsafe fn new_unchecked(
+        nn: Idx,
+        nparts: Idx,
+        eptr: &'a [Idx],
+        eind: &'a [Idx],
+    ) -> Mesh<'a> {
+        assert!(0 < nn, "nn must be strictly greater than zero");
+        assert!(0 < nparts, "nparts must be strictly greater than zero");
+        let _ = Idx::try_from(eptr.len()).expect("eptr array larger than Idx::MAX");
+        assert_ne!(eptr.len(), 0);
+        let eind_len = Idx::try_from(eind.len()).expect("eind array larger than Idx::MAX");
+        assert_eq!(eind_len, *eptr.last().unwrap());
+
+        Mesh {
+            nn,
+            nparts,
+            ncommon: 1,
+            eptr,
+            eind,
+            vwgt: None,
+            vsize: None,
+            tpwgts: None,
+            options: [-1; NOPTIONS],
+        }
+    }
+
+    /// Sets the computational weights of the elements.
+    ///
+    /// By default, all elements have the same weight.
+    ///
+    /// All elements of `vwgt` must be positive.
+    ///
+    /// # Panics
+    ///
+    /// This function panics if the length of `vwgt` is not the number of
+    /// elements.
+    pub fn set_vwgt(mut self, vwgt: &'a [Idx]) -> Mesh<'a> {
+        let vwgt_len = Idx::try_from(vwgt.len()).expect("vwgt array too large");
+        assert_eq!(vwgt_len, self.eptr.len() as Idx - 1);
+        self.vwgt = Some(vwgt);
+        self
+    }
+
+    /// Sets the communication weights of the elements.
+    ///
+    /// By default, all elements have the same communication weight.
+    ///
+    /// # Panics
+    ///
+    /// This function panics if the length of `vsize` is not the number of
+    /// elements.
+    pub fn set_vsize(mut self, vsize: &'a [Idx]) -> Mesh<'a> {
+        let vsize_len = Idx::try_from(vsize.len()).expect("vsize array too large");
+        assert_eq!(vsize_len, self.eptr.len() as Idx - 1);
+        self.vsize = Some(vsize);
+        self
+    }
+
+    /// Sets the target partition weights for each part.
+    ///
+    /// By default, the mesh is divided equally.
+    ///
+    /// The sum of the target partition weights must be 1.0.
+    ///
+    /// # Panics
+    ///
+    /// This function panics if the length of `tpwgts` is not equal to `nparts`.
+    pub fn set_tpwgts(mut self, tpwgts: &'a [Real]) -> Mesh<'a> {
+        let tpwgts_len = Idx::try_from(tpwgts.len()).expect("tpwgts array too large");
+        assert_eq!(tpwgts_len, self.nparts);
+        self.tpwgts = Some(tpwgts);
+        self
+    }
+
+    /// Sets the fine-tuning parameters for this partitioning.
+    ///
+    /// When few options are to be set, [`Mesh::set_option`] might be a
+    /// better fit.
+    ///
+    /// See the [option] module for the list of available parameters.  Note that
+    /// not all are applicable to a given partitioning method.  Refer to the
+    /// documentation of METIS ([link]) for more info on this.
+    ///
+    /// See [`Graph::set_options`] for a usage example.
+    ///
+    /// [link]: http://glaros.dtc.umn.edu/gkhome/fetch/sw/metis/manual.pdf
+    pub fn set_options(mut self, options: &[Idx; NOPTIONS]) -> Mesh<'a> {
+        self.options.copy_from_slice(options);
+        self
+    }
+
+    /// Sets a fine-tuning parameter for this partitioning.
+    ///
+    /// When options are to be set in batches, [`Mesh::set_options`] might be a
+    /// better fit.
+    ///
+    /// See the [option] module for the list of available parameters.  Note that
+    /// not all are applicable to a given partitioning method.  Refer to the
+    /// documentation of METIS ([link]) for more info on this.
+    ///
+    /// See [`Graph::set_option`] for a usage example.
+    ///
+    /// [link]: http://glaros.dtc.umn.edu/gkhome/fetch/sw/metis/manual.pdf
+    pub fn set_option<O>(mut self, option: O) -> Mesh<'a>
+    where
+        O: option::Opt,
+    {
+        self.options[O::INDEX] = option.value();
+        self
+    }
+
+    /// Partition the mesh using its dual graph.
+    ///
+    /// Returns the edge-cut, the total communication volume of the
+    /// partitioning solution.
+    ///
+    /// Equivalent of `METIS_PartMeshDual`.
+    ///
+    /// # Panics
+    ///
+    /// This function panics if the length of `epart` is not the number of
+    /// elements, or if `nparts`'s is not the number of nodes.
+    pub fn part_dual(mut self, epart: &mut [Idx], npart: &mut [Idx]) -> Result<Idx> {
+        self.options[option::Numbering::INDEX] = option::Numbering::C.value();
+        let epart_len = Idx::try_from(epart.len()).expect("epart array larger than Idx::MAX");
+        assert_eq!(
+            epart_len,
+            self.eptr.len() as Idx - 1,
+            "epart.len() must be equal to the number of elements",
+        );
+        let npart_len = Idx::try_from(npart.len()).expect("npart array larger than Idx::MAX");
+        assert_eq!(
+            npart_len, self.nn,
+            "npart.len() must be equal to the number of nodes",
+        );
+
+        if self.nparts == 1 {
+            // METIS does not handle this case well.
+            epart.fill(0);
+            npart.fill(0);
+            return Ok(0);
+        }
+
+        let ne = self.eptr.len() as Idx - 1;
+        let mut edgecut = mem::MaybeUninit::uninit();
+        unsafe {
+            m::METIS_PartMeshDual(
+                &ne as *const Idx as *mut Idx,
+                &self.nn as *const Idx as *mut Idx,
+                slice_to_mut_ptr(self.eptr),
+                slice_to_mut_ptr(self.eind),
+                self.vwgt
+                    .map_or_else(ptr::null_mut, |s| slice_to_mut_ptr(s)),
+                self.vsize
+                    .map_or_else(ptr::null_mut, |s| slice_to_mut_ptr(s)),
+                &self.ncommon as *const Idx as *mut Idx,
+                &self.nparts as *const Idx as *mut Idx,
+                self.tpwgts
+                    .map_or_else(ptr::null_mut, |s| slice_to_mut_ptr(s)),
+                slice_to_mut_ptr(&self.options),
+                edgecut.as_mut_ptr(),
+                epart.as_mut_ptr(),
+                npart.as_mut_ptr(),
+            )
+            .wrap()?;
+            Ok(edgecut.assume_init())
+        }
+    }
+
+    /// Partition the mesh using its nodal graph.
+    ///
+    /// Returns the edge-cut, the total communication volume of the
+    /// partitioning solution.
+    ///
+    /// Previous settings of `ncommon` are not used by this function.
+    ///
+    /// Equivalent of `METIS_PartMeshNodal`.
+    ///
+    /// # Panics
+    ///
+    /// This function panics if the length of `epart` is not the number of
+    /// elements, or if `nparts`'s is not the number of nodes.
+    pub fn part_nodal(mut self, epart: &mut [Idx], npart: &mut [Idx]) -> Result<Idx> {
+        self.options[option::Numbering::INDEX] = option::Numbering::C.value();
+        let epart_len = Idx::try_from(epart.len()).expect("epart array larger than Idx::MAX");
+        assert_eq!(
+            epart_len,
+            self.eptr.len() as Idx - 1,
+            "epart.len() must be equal to the number of elements",
+        );
+        let npart_len = Idx::try_from(npart.len()).expect("npart array larger than Idx::MAX");
+        assert_eq!(
+            npart_len, self.nn,
+            "npart.len() must be equal to the number of nodes",
+        );
+
+        if self.nparts == 1 {
+            // METIS does not handle this case well.
+            epart.fill(0);
+            npart.fill(0);
+            return Ok(0);
+        }
+
+        let ne = self.eptr.len() as Idx - 1;
+        let mut edgecut = mem::MaybeUninit::uninit();
+        unsafe {
+            m::METIS_PartMeshNodal(
+                &ne as *const Idx as *mut Idx,
+                &self.nn as *const Idx as *mut Idx,
+                slice_to_mut_ptr(self.eptr),
+                slice_to_mut_ptr(self.eind),
+                self.vwgt
+                    .map_or_else(ptr::null_mut, |s| slice_to_mut_ptr(s)),
+                self.vsize
+                    .map_or_else(ptr::null_mut, |s| slice_to_mut_ptr(s)),
+                &self.nparts as *const Idx as *mut Idx,
+                self.tpwgts
+                    .map_or_else(ptr::null_mut, |s| slice_to_mut_ptr(s)),
+                slice_to_mut_ptr(&self.options),
+                edgecut.as_mut_ptr(),
+                epart.as_mut_ptr(),
+                npart.as_mut_ptr(),
+            )
+            .wrap()?;
+            Ok(edgecut.assume_init())
+        }
+    }
+}
+
+/// The dual of a mesh.
+///
+/// Result of [`mesh_to_dual`].
+#[derive(Debug, PartialEq, Eq)]
+pub struct Dual {
+    xadj: &'static mut [Idx],
+    adjncy: &'static mut [Idx],
+}
+
+impl Dual {
+    /// The adjacency index array.
+    pub fn xadj(&self) -> &[Idx] {
+        self.xadj
+    }
+
+    /// The adjacency array.
+    pub fn adjncy(&self) -> &[Idx] {
+        self.adjncy
+    }
+
+    /// The adjacency index array, and the adjacency array as mutable slices.
+    pub fn as_mut(&mut self) -> (&mut [Idx], &mut [Idx]) {
+        (self.xadj, self.adjncy)
+    }
+}
+
+impl Drop for Dual {
+    fn drop(&mut self) {
+        unsafe {
+            m::METIS_Free(self.xadj.as_mut_ptr() as *mut os::raw::c_void);
+            m::METIS_Free(self.adjncy.as_mut_ptr() as *mut os::raw::c_void);
+        }
+    }
+}
+
+/// Generate the dual graph of a mesh.
+///
+/// # Errors
+///
+/// This function returns an error if `eptr` and `eind` don't follow the mesh
+/// format given in [`Mesh::new`].
+pub fn mesh_to_dual(eptr: &[Idx], eind: &[Idx], ncommon: Idx) -> Result<Dual> {
+    let (ne, nn) = check_mesh_structure(&*eptr, &*eind)?;
+    let mut xadj = mem::MaybeUninit::uninit();
+    let mut adjncy = mem::MaybeUninit::uninit();
+    let numbering_flag = 0;
+
+    // SAFETY: METIS_MeshToDual allocates the xadj and adjncy arrays.
+    // SAFETY: hopefully those arrays are of correct length.
+    unsafe {
+        m::METIS_MeshToDual(
+            &ne as *const Idx as *mut Idx,
+            &nn as *const Idx as *mut Idx,
+            slice_to_mut_ptr(eptr),
+            slice_to_mut_ptr(eind),
+            &ncommon as *const Idx as *mut Idx,
+            &numbering_flag as *const Idx as *mut Idx,
+            xadj.as_mut_ptr(),
+            adjncy.as_mut_ptr(),
+        )
+        .wrap()?;
+        let xadj = xadj.assume_init();
+        let xadj = slice::from_raw_parts_mut(xadj, eptr.len());
+        let adjncy = adjncy.assume_init();
+        let adjncy = slice::from_raw_parts_mut(adjncy, xadj[xadj.len() - 1] as usize);
+        Ok(Dual { xadj, adjncy })
+    }
+}
+
\ No newline at end of file diff --git a/src/metis/option.rs.html b/src/metis/option.rs.html new file mode 100644 index 0000000..cada062 --- /dev/null +++ b/src/metis/option.rs.html @@ -0,0 +1,852 @@ +option.rs - source +
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+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
+
//! Fine-tuning parameter types.
+//!
+//! For options that take an integer value, should this value be negative, the
+//! default will be used, if any.
+
+// Idx and Real can be 32 or 64 bits. Make sure to suppress warnings when
+// casts turn out to be trivial.
+#![allow(trivial_numeric_casts)]
+
+use crate::m;
+use crate::Idx;
+
+mod private {
+    pub trait Sealed {}
+}
+
+/// Trait implemented by METIS' options.
+///
+/// See [`crate::Graph::set_options`] for an example.  It is also used in
+/// [`crate::Mesh::set_options`].
+pub trait Opt: private::Sealed {
+    /// Index of the option in the array from [`crate::Graph::set_options`] and
+    /// [`crate::Mesh::set_options`].
+    const INDEX: usize;
+
+    /// Convert the value into metis' format, for use with
+    /// [`crate::Graph::set_options`] and [`crate::Mesh::set_options`].
+    fn value(self) -> Idx;
+}
+
+/// Specifies the partitioning method.
+pub enum PType {
+    /// Multilevel recursive bisection.
+    Rb,
+
+    /// Multilevel k-way partitioning.
+    Kway,
+}
+
+impl private::Sealed for PType {}
+impl Opt for PType {
+    const INDEX: usize = m::moptions_et_METIS_OPTION_PTYPE as usize;
+
+    fn value(self) -> Idx {
+        match self {
+            PType::Rb => m::mptype_et_METIS_PTYPE_RB as Idx,
+            PType::Kway => m::mptype_et_METIS_PTYPE_KWAY as Idx,
+        }
+    }
+}
+
+/// Specifies the type of objective.
+pub enum ObjType {
+    /// Edge-cut minimization.
+    Cut,
+
+    /// Total communication volume minimization.
+    Vol,
+}
+
+impl private::Sealed for ObjType {}
+impl Opt for ObjType {
+    const INDEX: usize = m::moptions_et_METIS_OPTION_OBJTYPE as usize;
+
+    fn value(self) -> Idx {
+        match self {
+            ObjType::Cut => m::mobjtype_et_METIS_OBJTYPE_CUT as Idx,
+            ObjType::Vol => m::mobjtype_et_METIS_OBJTYPE_VOL as Idx,
+        }
+    }
+}
+
+/// Specifies the matching scheme to be used during coarsening.
+pub enum CType {
+    /// Random matching.
+    Rm,
+
+    /// Sorted heavy-edge matching.
+    Shem,
+}
+
+impl private::Sealed for CType {}
+impl Opt for CType {
+    const INDEX: usize = m::moptions_et_METIS_OPTION_CTYPE as usize;
+
+    fn value(self) -> Idx {
+        match self {
+            CType::Rm => m::mctype_et_METIS_CTYPE_RM as Idx,
+            CType::Shem => m::mctype_et_METIS_CTYPE_SHEM as Idx,
+        }
+    }
+}
+
+/// Determines the algorithm used during initial partitioning.
+pub enum IpType {
+    /// Grows a bisection using a greedy strategy.
+    Grow,
+
+    /// Compute a bisection at random followed by a refinement.
+    Random,
+
+    /// Derives a separator from an edge cut.
+    Edge,
+
+    /// Grow a bisection using a greedy node-based strategy.
+    Node,
+}
+
+impl private::Sealed for IpType {}
+impl Opt for IpType {
+    const INDEX: usize = m::moptions_et_METIS_OPTION_IPTYPE as usize;
+
+    fn value(self) -> Idx {
+        match self {
+            IpType::Grow => m::miptype_et_METIS_IPTYPE_GROW as Idx,
+            IpType::Random => m::miptype_et_METIS_IPTYPE_RANDOM as Idx,
+            IpType::Edge => m::miptype_et_METIS_IPTYPE_EDGE as Idx,
+            IpType::Node => m::miptype_et_METIS_IPTYPE_NODE as Idx,
+        }
+    }
+}
+
+/// Determines the algorithm used for refinement.
+pub enum RType {
+    /// FM-based cut refinement.
+    Fm,
+
+    /// Greedy-based cut and volume refinement.
+    Greedy,
+
+    /// Two-sided FM refinement.
+    Sep2Sided,
+
+    /// One-sided FM refinement.
+    Sep1Sided,
+}
+
+impl private::Sealed for RType {}
+impl Opt for RType {
+    const INDEX: usize = m::moptions_et_METIS_OPTION_RTYPE as usize;
+
+    fn value(self) -> Idx {
+        match self {
+            RType::Fm => m::mrtype_et_METIS_RTYPE_FM as Idx,
+            RType::Greedy => m::mrtype_et_METIS_RTYPE_GREEDY as Idx,
+            RType::Sep2Sided => m::mrtype_et_METIS_RTYPE_SEP2SIDED as Idx,
+            RType::Sep1Sided => m::mrtype_et_METIS_RTYPE_SEP1SIDED as Idx,
+        }
+    }
+}
+
+/// Specifies the number of different partitions that it will compute. The
+/// final partition is the one that achieves the best edge cut or
+/// communication volume. Default is 1.
+pub struct NCuts(pub Idx);
+
+impl private::Sealed for NCuts {}
+impl Opt for NCuts {
+    const INDEX: usize = m::moptions_et_METIS_OPTION_NCUTS as usize;
+
+    fn value(self) -> Idx {
+        self.0
+    }
+}
+
+/// Specifies the number of different separators that it will compute at each
+/// level of nested dissection.
+///
+/// The final separator that is used is the smallest one. Default is 1.
+pub struct NSeps(pub Idx);
+
+impl private::Sealed for NSeps {}
+impl Opt for NSeps {
+    const INDEX: usize = m::moptions_et_METIS_OPTION_NSEPS as usize;
+
+    fn value(self) -> Idx {
+        self.0
+    }
+}
+
+/// Used to indicate which numbering scheme is used for the adjacency structure
+/// of a graph or the element-node structure of a mesh.
+#[allow(dead_code)]
+pub(crate) enum Numbering {
+    /// C-style numbering which is assumed to start from 0.
+    C,
+
+    /// Fortran-style numbering which is assumed to start from 1.
+    Fortran,
+}
+
+impl private::Sealed for Numbering {}
+impl Opt for Numbering {
+    const INDEX: usize = m::moptions_et_METIS_OPTION_NUMBERING as usize;
+
+    fn value(self) -> Idx {
+        match self {
+            Numbering::C => 0,
+            Numbering::Fortran => 1,
+        }
+    }
+}
+
+/// Specifies the number of iterations for the refinement algorithms at each
+/// stage of the uncoarsening process.
+///
+/// Default is 10.
+pub struct NIter(pub Idx);
+
+impl private::Sealed for NIter {}
+impl Opt for NIter {
+    const INDEX: usize = m::moptions_et_METIS_OPTION_NITER as usize;
+
+    fn value(self) -> Idx {
+        self.0
+    }
+}
+
+/// Specifies the seed for the random number generator.
+pub struct Seed(pub Idx);
+
+impl private::Sealed for Seed {}
+impl Opt for Seed {
+    const INDEX: usize = m::moptions_et_METIS_OPTION_SEED as usize;
+
+    fn value(self) -> Idx {
+        self.0
+    }
+}
+
+/// Specifies that the partitioning routines should try to minimize the maximum
+/// degree of the subdomain graph.
+///
+/// I.e., the graph in which each partition is a node, and edges connect
+/// subdomains with a shared interface.
+pub struct MinConn(pub bool);
+
+impl private::Sealed for MinConn {}
+impl Opt for MinConn {
+    const INDEX: usize = m::moptions_et_METIS_OPTION_MINCONN as usize;
+
+    fn value(self) -> Idx {
+        self.0 as Idx
+    }
+}
+
+/// Specifies that the coarsening will not perform any 2-hop matching when the
+/// standards matching approach fails to sufficiently coarsen the graph.
+///
+/// The 2-hop matching is very effective for graphs with power-law degree
+/// distributions.
+pub struct No2Hop(pub bool);
+
+impl private::Sealed for No2Hop {}
+impl Opt for No2Hop {
+    const INDEX: usize = m::moptions_et_METIS_OPTION_NO2HOP as usize;
+
+    fn value(self) -> Idx {
+        self.0 as Idx
+    }
+}
+
+/// Specifies that the partitioning routines should try to produce partitions
+/// that are contiguous.
+///
+/// Note that if the input graph is not connected this option is ignored.
+pub struct Contig(pub bool);
+
+impl private::Sealed for Contig {}
+impl Opt for Contig {
+    const INDEX: usize = m::moptions_et_METIS_OPTION_CONTIG as usize;
+
+    fn value(self) -> Idx {
+        self.0 as Idx
+    }
+}
+
+/// Specifies that the graph should be compressed by combining vertices
+/// that have identical adjacency lists.
+pub struct Compress(pub bool);
+
+impl private::Sealed for Compress {}
+impl Opt for Compress {
+    const INDEX: usize = m::moptions_et_METIS_OPTION_COMPRESS as usize;
+
+    fn value(self) -> Idx {
+        self.0 as Idx
+    }
+}
+
+/// Specifies if the connected components of the graph should first be
+/// identified and ordered separately.
+pub struct CCOrder(pub bool);
+
+impl private::Sealed for CCOrder {}
+impl Opt for CCOrder {
+    const INDEX: usize = m::moptions_et_METIS_OPTION_CCORDER as usize;
+
+    fn value(self) -> Idx {
+        self.0 as Idx
+    }
+}
+
+/// Specifies the minimum degree of the vertices that will be ordered last.
+///
+/// If the specified value is `x > 0`, then any vertices with a degree greater
+/// than `0.1*x*(average degree)` are removed from the graph, an ordering of the
+/// rest of the vertices is computed, and an overall ordering is computed by
+/// ordering the removed vertices at the end of the overall ordering.  For
+/// example if `x == 40`, and the average degree is 5, then the algorithm will
+/// remove all vertices with degree greater than 20. The vertices that are
+/// removed are ordered last (i.e., they are automatically placed in the
+/// top-level separator). Good values are often in the range of 60 to 200 (i.e.,
+/// 6 to 20 times more than the average). Default value is 0, indicating that no
+/// vertices are removed.
+///
+/// Used to control whether the ordering algorithm should remove any
+/// vertices with high degree (i.e., dense columns). This is particularly
+/// helpful for certain classes of LP matrices, in which there a few vertices
+/// that are connected to many other vertices. By removing these vertices prior
+/// to ordering, the quality and the amount of time required to do the ordering
+/// improves.
+pub struct PFactor(pub Idx);
+
+impl private::Sealed for PFactor {}
+impl Opt for PFactor {
+    const INDEX: usize = m::moptions_et_METIS_OPTION_PFACTOR as usize;
+
+    fn value(self) -> Idx {
+        self.0
+    }
+}
+
+/// Specifies the maximum allowed load imbalance among the partitions.
+///
+/// A value of `x` indicates that the allowed load imbalance is `(1 + x)/1000`.
+/// The load imbalance for the `j`th constraint is defined to be
+/// `max_i(w[j,i]/t[j,i])`, where `w[j,i]` is the fraction of the overall
+/// weight of the `j`th constraint that is assigned to the`i`th partition and
+/// `t[j,i]` is the desired target weight of the `j`th constraint for the `i`th
+/// partition (i.e., that specified via `-tpwgts`). For `-ptype=rb`, the default
+/// value is 1 (i.e., load imbalance of 1.001) and for `-ptype=kway`, the
+/// default value is 30 (i.e., load imbalance of 1.03).
+pub struct UFactor(pub Idx);
+
+impl private::Sealed for UFactor {}
+impl Opt for UFactor {
+    const INDEX: usize = m::moptions_et_METIS_OPTION_UFACTOR as usize;
+
+    fn value(self) -> Idx {
+        self.0
+    }
+}
+
+/// Specifies the amount of progress/debugging information will be printed
+/// during the execution of the algorithms.
+///
+/// The default value is false for every field (no debugging/progress
+/// information).
+pub struct DbgLvl {
+    /// Prints various diagnostic messages.
+    pub info: bool,
+
+    /// Performs timing analysis.
+    pub time: bool,
+
+    /// Displays various statistics during coarsening.
+    pub coarsen: bool,
+
+    /// Displays various statistics during refinement.
+    pub refine: bool,
+
+    /// Displays various statistics during initial partitioning.
+    pub ipart: bool,
+
+    /// Display detailed information about vertex moves during refinement.
+    pub move_info: bool,
+
+    /// Display detailed information about vertex separators.
+    pub sep_info: bool,
+
+    /// Display information related to the minimization of subdomain
+    /// connectivity.
+    pub conn_info: bool,
+
+    /// Display information related to the elimination of connected components.
+    pub contig_info: bool,
+}
+
+impl private::Sealed for DbgLvl {}
+impl Opt for DbgLvl {
+    const INDEX: usize = m::moptions_et_METIS_OPTION_DBGLVL as usize;
+
+    fn value(self) -> Idx {
+        let mut dbglvl = 0;
+        if self.info {
+            dbglvl |= 1;
+        }
+        if self.time {
+            dbglvl |= 2;
+        }
+        if self.coarsen {
+            dbglvl |= 4;
+        }
+        if self.refine {
+            dbglvl |= 8;
+        }
+        if self.ipart {
+            dbglvl |= 16;
+        }
+        if self.move_info {
+            dbglvl |= 32;
+        }
+        if self.sep_info {
+            dbglvl |= 64;
+        }
+        if self.conn_info {
+            dbglvl |= 128;
+        }
+        if self.contig_info {
+            dbglvl |= 256;
+        }
+        dbglvl
+    }
+}
+
\ No newline at end of file diff --git a/src/metis_sys/gen/bindings.rs.html b/src/metis_sys/gen/bindings.rs.html new file mode 100644 index 0000000..84df7dc --- /dev/null +++ b/src/metis_sys/gen/bindings.rs.html @@ -0,0 +1,516 @@ +bindings.rs - source +
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+
/* automatically generated by rust-bindgen 0.66.1 */
+
+pub const METIS_VER_MAJOR: u32 = 5;
+pub const METIS_VER_MINOR: u32 = 2;
+pub const METIS_VER_SUBMINOR: u32 = 1;
+pub const METIS_NOPTIONS: u32 = 40;
+pub type idx_t = i32;
+pub type real_t = f32;
+extern "C" {
+    pub fn METIS_PartGraphRecursive(
+        nvtxs: *mut idx_t,
+        ncon: *mut idx_t,
+        xadj: *mut idx_t,
+        adjncy: *mut idx_t,
+        vwgt: *mut idx_t,
+        vsize: *mut idx_t,
+        adjwgt: *mut idx_t,
+        nparts: *mut idx_t,
+        tpwgts: *mut real_t,
+        ubvec: *mut real_t,
+        options: *mut idx_t,
+        edgecut: *mut idx_t,
+        part: *mut idx_t,
+    ) -> ::std::os::raw::c_int;
+}
+extern "C" {
+    pub fn METIS_PartGraphKway(
+        nvtxs: *mut idx_t,
+        ncon: *mut idx_t,
+        xadj: *mut idx_t,
+        adjncy: *mut idx_t,
+        vwgt: *mut idx_t,
+        vsize: *mut idx_t,
+        adjwgt: *mut idx_t,
+        nparts: *mut idx_t,
+        tpwgts: *mut real_t,
+        ubvec: *mut real_t,
+        options: *mut idx_t,
+        edgecut: *mut idx_t,
+        part: *mut idx_t,
+    ) -> ::std::os::raw::c_int;
+}
+extern "C" {
+    pub fn METIS_MeshToDual(
+        ne: *mut idx_t,
+        nn: *mut idx_t,
+        eptr: *mut idx_t,
+        eind: *mut idx_t,
+        ncommon: *mut idx_t,
+        numflag: *mut idx_t,
+        r_xadj: *mut *mut idx_t,
+        r_adjncy: *mut *mut idx_t,
+    ) -> ::std::os::raw::c_int;
+}
+extern "C" {
+    pub fn METIS_MeshToNodal(
+        ne: *mut idx_t,
+        nn: *mut idx_t,
+        eptr: *mut idx_t,
+        eind: *mut idx_t,
+        numflag: *mut idx_t,
+        r_xadj: *mut *mut idx_t,
+        r_adjncy: *mut *mut idx_t,
+    ) -> ::std::os::raw::c_int;
+}
+extern "C" {
+    pub fn METIS_PartMeshNodal(
+        ne: *mut idx_t,
+        nn: *mut idx_t,
+        eptr: *mut idx_t,
+        eind: *mut idx_t,
+        vwgt: *mut idx_t,
+        vsize: *mut idx_t,
+        nparts: *mut idx_t,
+        tpwgts: *mut real_t,
+        options: *mut idx_t,
+        objval: *mut idx_t,
+        epart: *mut idx_t,
+        npart: *mut idx_t,
+    ) -> ::std::os::raw::c_int;
+}
+extern "C" {
+    pub fn METIS_PartMeshDual(
+        ne: *mut idx_t,
+        nn: *mut idx_t,
+        eptr: *mut idx_t,
+        eind: *mut idx_t,
+        vwgt: *mut idx_t,
+        vsize: *mut idx_t,
+        ncommon: *mut idx_t,
+        nparts: *mut idx_t,
+        tpwgts: *mut real_t,
+        options: *mut idx_t,
+        objval: *mut idx_t,
+        epart: *mut idx_t,
+        npart: *mut idx_t,
+    ) -> ::std::os::raw::c_int;
+}
+extern "C" {
+    pub fn METIS_NodeND(
+        nvtxs: *mut idx_t,
+        xadj: *mut idx_t,
+        adjncy: *mut idx_t,
+        vwgt: *mut idx_t,
+        options: *mut idx_t,
+        perm: *mut idx_t,
+        iperm: *mut idx_t,
+    ) -> ::std::os::raw::c_int;
+}
+extern "C" {
+    pub fn METIS_Free(ptr: *mut ::std::os::raw::c_void) -> ::std::os::raw::c_int;
+}
+extern "C" {
+    pub fn METIS_SetDefaultOptions(options: *mut idx_t) -> ::std::os::raw::c_int;
+}
+extern "C" {
+    pub fn METIS_NodeNDP(
+        nvtxs: idx_t,
+        xadj: *mut idx_t,
+        adjncy: *mut idx_t,
+        vwgt: *mut idx_t,
+        npes: idx_t,
+        options: *mut idx_t,
+        perm: *mut idx_t,
+        iperm: *mut idx_t,
+        sizes: *mut idx_t,
+    ) -> ::std::os::raw::c_int;
+}
+extern "C" {
+    pub fn METIS_ComputeVertexSeparator(
+        nvtxs: *mut idx_t,
+        xadj: *mut idx_t,
+        adjncy: *mut idx_t,
+        vwgt: *mut idx_t,
+        options: *mut idx_t,
+        sepsize: *mut idx_t,
+        part: *mut idx_t,
+    ) -> ::std::os::raw::c_int;
+}
+extern "C" {
+    pub fn METIS_NodeRefine(
+        nvtxs: idx_t,
+        xadj: *mut idx_t,
+        vwgt: *mut idx_t,
+        adjncy: *mut idx_t,
+        where_: *mut idx_t,
+        hmarker: *mut idx_t,
+        ubfactor: real_t,
+    ) -> ::std::os::raw::c_int;
+}
+extern "C" {
+    pub fn METIS_CacheFriendlyReordering(
+        nvtxs: idx_t,
+        xadj: *mut idx_t,
+        adjncy: *mut idx_t,
+        part: *mut idx_t,
+        old2new: *mut idx_t,
+    ) -> ::std::os::raw::c_int;
+}
+#[doc = "< Returned normally"]
+pub const rstatus_et_METIS_OK: rstatus_et = 1;
+#[doc = "< Returned due to erroneous inputs and/or options"]
+pub const rstatus_et_METIS_ERROR_INPUT: rstatus_et = -2;
+#[doc = "< Returned due to insufficient memory"]
+pub const rstatus_et_METIS_ERROR_MEMORY: rstatus_et = -3;
+#[doc = "< Some other errors"]
+pub const rstatus_et_METIS_ERROR: rstatus_et = -4;
+#[doc = " Return codes"]
+pub type rstatus_et = ::std::os::raw::c_int;
+pub const moptype_et_METIS_OP_PMETIS: moptype_et = 0;
+pub const moptype_et_METIS_OP_KMETIS: moptype_et = 1;
+pub const moptype_et_METIS_OP_OMETIS: moptype_et = 2;
+#[doc = " Operation type codes"]
+pub type moptype_et = ::std::os::raw::c_int;
+pub const moptions_et_METIS_OPTION_PTYPE: moptions_et = 0;
+pub const moptions_et_METIS_OPTION_OBJTYPE: moptions_et = 1;
+pub const moptions_et_METIS_OPTION_CTYPE: moptions_et = 2;
+pub const moptions_et_METIS_OPTION_IPTYPE: moptions_et = 3;
+pub const moptions_et_METIS_OPTION_RTYPE: moptions_et = 4;
+pub const moptions_et_METIS_OPTION_DBGLVL: moptions_et = 5;
+pub const moptions_et_METIS_OPTION_NIPARTS: moptions_et = 6;
+pub const moptions_et_METIS_OPTION_NITER: moptions_et = 7;
+pub const moptions_et_METIS_OPTION_NCUTS: moptions_et = 8;
+pub const moptions_et_METIS_OPTION_SEED: moptions_et = 9;
+pub const moptions_et_METIS_OPTION_ONDISK: moptions_et = 10;
+pub const moptions_et_METIS_OPTION_MINCONN: moptions_et = 11;
+pub const moptions_et_METIS_OPTION_CONTIG: moptions_et = 12;
+pub const moptions_et_METIS_OPTION_COMPRESS: moptions_et = 13;
+pub const moptions_et_METIS_OPTION_CCORDER: moptions_et = 14;
+pub const moptions_et_METIS_OPTION_PFACTOR: moptions_et = 15;
+pub const moptions_et_METIS_OPTION_NSEPS: moptions_et = 16;
+pub const moptions_et_METIS_OPTION_UFACTOR: moptions_et = 17;
+pub const moptions_et_METIS_OPTION_NUMBERING: moptions_et = 18;
+pub const moptions_et_METIS_OPTION_DROPEDGES: moptions_et = 19;
+pub const moptions_et_METIS_OPTION_NO2HOP: moptions_et = 20;
+pub const moptions_et_METIS_OPTION_TWOHOP: moptions_et = 21;
+pub const moptions_et_METIS_OPTION_FAST: moptions_et = 22;
+pub const moptions_et_METIS_OPTION_HELP: moptions_et = 23;
+pub const moptions_et_METIS_OPTION_TPWGTS: moptions_et = 24;
+pub const moptions_et_METIS_OPTION_NCOMMON: moptions_et = 25;
+pub const moptions_et_METIS_OPTION_NOOUTPUT: moptions_et = 26;
+pub const moptions_et_METIS_OPTION_BALANCE: moptions_et = 27;
+pub const moptions_et_METIS_OPTION_GTYPE: moptions_et = 28;
+pub const moptions_et_METIS_OPTION_UBVEC: moptions_et = 29;
+#[doc = " Options codes (i.e., options[])"]
+pub type moptions_et = ::std::os::raw::c_int;
+pub const mptype_et_METIS_PTYPE_RB: mptype_et = 0;
+pub const mptype_et_METIS_PTYPE_KWAY: mptype_et = 1;
+#[doc = " Partitioning Schemes"]
+pub type mptype_et = ::std::os::raw::c_int;
+pub const mgtype_et_METIS_GTYPE_DUAL: mgtype_et = 0;
+pub const mgtype_et_METIS_GTYPE_NODAL: mgtype_et = 1;
+#[doc = " Graph types for meshes"]
+pub type mgtype_et = ::std::os::raw::c_int;
+pub const mctype_et_METIS_CTYPE_RM: mctype_et = 0;
+pub const mctype_et_METIS_CTYPE_SHEM: mctype_et = 1;
+#[doc = " Coarsening Schemes"]
+pub type mctype_et = ::std::os::raw::c_int;
+pub const miptype_et_METIS_IPTYPE_GROW: miptype_et = 0;
+pub const miptype_et_METIS_IPTYPE_RANDOM: miptype_et = 1;
+pub const miptype_et_METIS_IPTYPE_EDGE: miptype_et = 2;
+pub const miptype_et_METIS_IPTYPE_NODE: miptype_et = 3;
+pub const miptype_et_METIS_IPTYPE_METISRB: miptype_et = 4;
+#[doc = " Initial partitioning schemes"]
+pub type miptype_et = ::std::os::raw::c_int;
+pub const mrtype_et_METIS_RTYPE_FM: mrtype_et = 0;
+pub const mrtype_et_METIS_RTYPE_GREEDY: mrtype_et = 1;
+pub const mrtype_et_METIS_RTYPE_SEP2SIDED: mrtype_et = 2;
+pub const mrtype_et_METIS_RTYPE_SEP1SIDED: mrtype_et = 3;
+#[doc = " Refinement schemes"]
+pub type mrtype_et = ::std::os::raw::c_int;
+#[doc = "< Shows various diagnostic messages"]
+pub const mdbglvl_et_METIS_DBG_INFO: mdbglvl_et = 1;
+#[doc = "< Perform timing analysis"]
+pub const mdbglvl_et_METIS_DBG_TIME: mdbglvl_et = 2;
+#[doc = "< Show the coarsening progress"]
+pub const mdbglvl_et_METIS_DBG_COARSEN: mdbglvl_et = 4;
+#[doc = "< Show the refinement progress"]
+pub const mdbglvl_et_METIS_DBG_REFINE: mdbglvl_et = 8;
+#[doc = "< Show info on initial partitioning"]
+pub const mdbglvl_et_METIS_DBG_IPART: mdbglvl_et = 16;
+#[doc = "< Show info on vertex moves during refinement"]
+pub const mdbglvl_et_METIS_DBG_MOVEINFO: mdbglvl_et = 32;
+#[doc = "< Show info on vertex moves during sep refinement"]
+pub const mdbglvl_et_METIS_DBG_SEPINFO: mdbglvl_et = 64;
+#[doc = "< Show info on minimization of subdomain connectivity"]
+pub const mdbglvl_et_METIS_DBG_CONNINFO: mdbglvl_et = 128;
+#[doc = "< Show info on elimination of connected components"]
+pub const mdbglvl_et_METIS_DBG_CONTIGINFO: mdbglvl_et = 256;
+#[doc = "< Show info related to wspace allocation"]
+pub const mdbglvl_et_METIS_DBG_MEMORY: mdbglvl_et = 2048;
+#[doc = " Debug Levels"]
+pub type mdbglvl_et = ::std::os::raw::c_int;
+pub const mobjtype_et_METIS_OBJTYPE_CUT: mobjtype_et = 0;
+pub const mobjtype_et_METIS_OBJTYPE_VOL: mobjtype_et = 1;
+pub const mobjtype_et_METIS_OBJTYPE_NODE: mobjtype_et = 2;
+pub type mobjtype_et = ::std::os::raw::c_int;
+
\ No newline at end of file diff --git a/src/metis_sys/lib.rs.html b/src/metis_sys/lib.rs.html new file mode 100644 index 0000000..58d965e --- /dev/null +++ b/src/metis_sys/lib.rs.html @@ -0,0 +1,20 @@ +lib.rs - source +
1
+2
+3
+4
+5
+6
+7
+8
+9
+
#![allow(non_upper_case_globals)]
+#![allow(non_camel_case_types)]
+#![allow(non_snake_case)]
+
+#[cfg(not(feature = "vendored"))]
+include!(concat!(env!("OUT_DIR"), "/bindings.rs"));
+
+#[cfg(feature = "vendored")]
+include!("../gen/bindings.rs");
+
\ No newline at end of file diff --git a/static.files/COPYRIGHT-23e9bde6c69aea69.txt b/static.files/COPYRIGHT-23e9bde6c69aea69.txt new file mode 100644 index 0000000..1447df7 --- /dev/null +++ b/static.files/COPYRIGHT-23e9bde6c69aea69.txt @@ -0,0 +1,50 @@ +# REUSE-IgnoreStart + +These documentation pages include resources by third parties. This copyright +file applies only to those resources. The following third party resources are +included, and carry their own copyright notices and license terms: + +* Fira Sans (FiraSans-Regular.woff2, FiraSans-Medium.woff2): + + Copyright (c) 2014, Mozilla Foundation https://mozilla.org/ + with Reserved Font Name Fira Sans. + + Copyright (c) 2014, Telefonica S.A. + + Licensed under the SIL Open Font License, Version 1.1. + See FiraSans-LICENSE.txt. + +* rustdoc.css, main.js, and playpen.js: + + Copyright 2015 The Rust Developers. + Licensed under the Apache License, Version 2.0 (see LICENSE-APACHE.txt) or + the MIT license (LICENSE-MIT.txt) at your option. + +* normalize.css: + + Copyright (c) Nicolas Gallagher and Jonathan Neal. + Licensed under the MIT license (see LICENSE-MIT.txt). + +* Source Code Pro (SourceCodePro-Regular.ttf.woff2, + SourceCodePro-Semibold.ttf.woff2, SourceCodePro-It.ttf.woff2): + + Copyright 2010, 2012 Adobe Systems Incorporated (http://www.adobe.com/), + with Reserved Font Name 'Source'. All Rights Reserved. Source is a trademark + of Adobe Systems Incorporated in the United States and/or other countries. + + Licensed under the SIL Open Font License, Version 1.1. + See SourceCodePro-LICENSE.txt. + +* Source Serif 4 (SourceSerif4-Regular.ttf.woff2, SourceSerif4-Bold.ttf.woff2, + SourceSerif4-It.ttf.woff2): + + Copyright 2014-2021 Adobe (http://www.adobe.com/), with Reserved Font Name + 'Source'. All Rights Reserved. Source is a trademark of Adobe in the United + States and/or other countries. + + Licensed under the SIL Open Font License, Version 1.1. + See SourceSerif4-LICENSE.md. + +This copyright file is intended to be distributed with rustdoc output. + +# REUSE-IgnoreEnd diff --git a/static.files/FiraSans-LICENSE-db4b642586e02d97.txt b/static.files/FiraSans-LICENSE-db4b642586e02d97.txt new file mode 100644 index 0000000..d7e9c14 --- /dev/null +++ b/static.files/FiraSans-LICENSE-db4b642586e02d97.txt @@ -0,0 +1,98 @@ +// REUSE-IgnoreStart + +Digitized data copyright (c) 2012-2015, The Mozilla Foundation and Telefonica S.A. +with Reserved Font Name < Fira >, + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. + +// REUSE-IgnoreEnd diff --git a/static.files/FiraSans-Medium-8f9a781e4970d388.woff2 b/static.files/FiraSans-Medium-8f9a781e4970d388.woff2 new file mode 100644 index 0000000..7a1e5fc Binary files /dev/null and b/static.files/FiraSans-Medium-8f9a781e4970d388.woff2 differ diff --git a/static.files/FiraSans-Regular-018c141bf0843ffd.woff2 b/static.files/FiraSans-Regular-018c141bf0843ffd.woff2 new file mode 100644 index 0000000..e766e06 Binary files /dev/null and b/static.files/FiraSans-Regular-018c141bf0843ffd.woff2 differ diff --git a/static.files/LICENSE-APACHE-b91fa81cba47b86a.txt b/static.files/LICENSE-APACHE-b91fa81cba47b86a.txt new file mode 100644 index 0000000..16fe87b --- /dev/null +++ b/static.files/LICENSE-APACHE-b91fa81cba47b86a.txt @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/static.files/LICENSE-MIT-65090b722b3f6c56.txt b/static.files/LICENSE-MIT-65090b722b3f6c56.txt new file mode 100644 index 0000000..31aa793 --- /dev/null +++ b/static.files/LICENSE-MIT-65090b722b3f6c56.txt @@ -0,0 +1,23 @@ +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/static.files/NanumBarunGothic-0f09457c7a19b7c6.ttf.woff2 b/static.files/NanumBarunGothic-0f09457c7a19b7c6.ttf.woff2 new file mode 100644 index 0000000..1866ad4 Binary files /dev/null and b/static.files/NanumBarunGothic-0f09457c7a19b7c6.ttf.woff2 differ diff --git a/static.files/NanumBarunGothic-LICENSE-18c5adf4b52b4041.txt b/static.files/NanumBarunGothic-LICENSE-18c5adf4b52b4041.txt new file mode 100644 index 0000000..4b3edc2 --- /dev/null +++ b/static.files/NanumBarunGothic-LICENSE-18c5adf4b52b4041.txt @@ -0,0 +1,103 @@ +// REUSE-IgnoreStart + +Copyright (c) 2010, NAVER Corporation (https://www.navercorp.com/), + +with Reserved Font Name Nanum, Naver Nanum, NanumGothic, Naver NanumGothic, +NanumMyeongjo, Naver NanumMyeongjo, NanumBrush, Naver NanumBrush, NanumPen, +Naver NanumPen, Naver NanumGothicEco, NanumGothicEco, Naver NanumMyeongjoEco, +NanumMyeongjoEco, Naver NanumGothicLight, NanumGothicLight, NanumBarunGothic, +Naver NanumBarunGothic, NanumSquareRound, NanumBarunPen, MaruBuri + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. + +// REUSE-IgnoreEnd diff --git a/static.files/SourceCodePro-It-1cc31594bf4f1f79.ttf.woff2 b/static.files/SourceCodePro-It-1cc31594bf4f1f79.ttf.woff2 new file mode 100644 index 0000000..462c34e Binary files /dev/null and b/static.files/SourceCodePro-It-1cc31594bf4f1f79.ttf.woff2 differ diff --git a/static.files/SourceCodePro-LICENSE-d180d465a756484a.txt b/static.files/SourceCodePro-LICENSE-d180d465a756484a.txt new file mode 100644 index 0000000..0d2941e --- /dev/null +++ b/static.files/SourceCodePro-LICENSE-d180d465a756484a.txt @@ -0,0 +1,97 @@ +// REUSE-IgnoreStart + +Copyright 2010, 2012 Adobe Systems Incorporated (http://www.adobe.com/), with Reserved Font Name 'Source'. All Rights Reserved. Source is a trademark of Adobe Systems Incorporated in the United States and/or other countries. + +This Font Software is licensed under the SIL Open Font License, Version 1.1. + +This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. + +// REUSE-IgnoreEnd diff --git a/static.files/SourceCodePro-Regular-562dcc5011b6de7d.ttf.woff2 b/static.files/SourceCodePro-Regular-562dcc5011b6de7d.ttf.woff2 new file mode 100644 index 0000000..10b558e Binary files /dev/null and b/static.files/SourceCodePro-Regular-562dcc5011b6de7d.ttf.woff2 differ diff --git a/static.files/SourceCodePro-Semibold-d899c5a5c4aeb14a.ttf.woff2 b/static.files/SourceCodePro-Semibold-d899c5a5c4aeb14a.ttf.woff2 new file mode 100644 index 0000000..5ec64ee Binary files /dev/null and b/static.files/SourceCodePro-Semibold-d899c5a5c4aeb14a.ttf.woff2 differ diff --git a/static.files/SourceSerif4-Bold-a2c9cd1067f8b328.ttf.woff2 b/static.files/SourceSerif4-Bold-a2c9cd1067f8b328.ttf.woff2 new file mode 100644 index 0000000..181a07f Binary files /dev/null and b/static.files/SourceSerif4-Bold-a2c9cd1067f8b328.ttf.woff2 differ diff --git a/static.files/SourceSerif4-It-acdfaf1a8af734b1.ttf.woff2 b/static.files/SourceSerif4-It-acdfaf1a8af734b1.ttf.woff2 new file mode 100644 index 0000000..2ae08a7 Binary files /dev/null and b/static.files/SourceSerif4-It-acdfaf1a8af734b1.ttf.woff2 differ diff --git a/static.files/SourceSerif4-LICENSE-3bb119e13b1258b7.md b/static.files/SourceSerif4-LICENSE-3bb119e13b1258b7.md new file mode 100644 index 0000000..175fa4f --- /dev/null +++ b/static.files/SourceSerif4-LICENSE-3bb119e13b1258b7.md @@ -0,0 +1,98 @@ + + +Copyright 2014-2021 Adobe (http://www.adobe.com/), with Reserved Font Name 'Source'. All Rights Reserved. Source is a trademark of Adobe in the United States and/or other countries. +Copyright 2014 - 2023 Adobe (http://www.adobe.com/), with Reserved Font Name ‘Source’. All Rights Reserved. Source is a trademark of Adobe in the United States and/or other countries. + +This Font Software is licensed under the SIL Open Font License, Version 1.1. + +This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. + + diff --git a/static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2 b/static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2 new file mode 100644 index 0000000..0263fc3 Binary files /dev/null and b/static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2 differ diff --git a/static.files/clipboard-7571035ce49a181d.svg b/static.files/clipboard-7571035ce49a181d.svg new file mode 100644 index 0000000..8adbd99 --- /dev/null +++ b/static.files/clipboard-7571035ce49a181d.svg @@ -0,0 +1 @@ + diff --git a/static.files/favicon-16x16-8b506e7a72182f1c.png b/static.files/favicon-16x16-8b506e7a72182f1c.png new file mode 100644 index 0000000..ea4b45c Binary files /dev/null and b/static.files/favicon-16x16-8b506e7a72182f1c.png differ diff --git a/static.files/favicon-2c020d218678b618.svg b/static.files/favicon-2c020d218678b618.svg new file mode 100644 index 0000000..8b34b51 --- /dev/null +++ b/static.files/favicon-2c020d218678b618.svg @@ -0,0 +1,24 @@ + + + + + diff --git a/static.files/favicon-32x32-422f7d1d52889060.png b/static.files/favicon-32x32-422f7d1d52889060.png new file mode 100644 index 0000000..69b8613 Binary files /dev/null and b/static.files/favicon-32x32-422f7d1d52889060.png differ diff --git a/static.files/main-305769736d49e732.js b/static.files/main-305769736d49e732.js new file mode 100644 index 0000000..b8b91af --- /dev/null +++ b/static.files/main-305769736d49e732.js @@ -0,0 +1,11 @@ +"use strict";window.RUSTDOC_TOOLTIP_HOVER_MS=300;window.RUSTDOC_TOOLTIP_HOVER_EXIT_MS=450;function resourcePath(basename,extension){return getVar("root-path")+basename+getVar("resource-suffix")+extension}function hideMain(){addClass(document.getElementById(MAIN_ID),"hidden")}function showMain(){removeClass(document.getElementById(MAIN_ID),"hidden")}function blurHandler(event,parentElem,hideCallback){if(!parentElem.contains(document.activeElement)&&!parentElem.contains(event.relatedTarget)){hideCallback()}}window.rootPath=getVar("root-path");window.currentCrate=getVar("current-crate");function setMobileTopbar(){const mobileTopbar=document.querySelector(".mobile-topbar");const locationTitle=document.querySelector(".sidebar h2.location");if(mobileTopbar){const mobileTitle=document.createElement("h2");mobileTitle.className="location";if(hasClass(document.querySelector(".rustdoc"),"crate")){mobileTitle.innerText=`Crate ${window.currentCrate}`}else if(locationTitle){mobileTitle.innerHTML=locationTitle.innerHTML}mobileTopbar.appendChild(mobileTitle)}}function getVirtualKey(ev){if("key"in ev&&typeof ev.key!=="undefined"){return ev.key}const c=ev.charCode||ev.keyCode;if(c===27){return"Escape"}return String.fromCharCode(c)}const MAIN_ID="main-content";const SETTINGS_BUTTON_ID="settings-menu";const ALTERNATIVE_DISPLAY_ID="alternative-display";const NOT_DISPLAYED_ID="not-displayed";const HELP_BUTTON_ID="help-button";function getSettingsButton(){return document.getElementById(SETTINGS_BUTTON_ID)}function getHelpButton(){return document.getElementById(HELP_BUTTON_ID)}function getNakedUrl(){return window.location.href.split("?")[0].split("#")[0]}function insertAfter(newNode,referenceNode){referenceNode.parentNode.insertBefore(newNode,referenceNode.nextSibling)}function getOrCreateSection(id,classes){let el=document.getElementById(id);if(!el){el=document.createElement("section");el.id=id;el.className=classes;insertAfter(el,document.getElementById(MAIN_ID))}return el}function getAlternativeDisplayElem(){return getOrCreateSection(ALTERNATIVE_DISPLAY_ID,"content hidden")}function getNotDisplayedElem(){return getOrCreateSection(NOT_DISPLAYED_ID,"hidden")}function switchDisplayedElement(elemToDisplay){const el=getAlternativeDisplayElem();if(el.children.length>0){getNotDisplayedElem().appendChild(el.firstElementChild)}if(elemToDisplay===null){addClass(el,"hidden");showMain();return}el.appendChild(elemToDisplay);hideMain();removeClass(el,"hidden")}function browserSupportsHistoryApi(){return window.history&&typeof window.history.pushState==="function"}function preLoadCss(cssUrl){const link=document.createElement("link");link.href=cssUrl;link.rel="preload";link.as="style";document.getElementsByTagName("head")[0].appendChild(link)}(function(){const isHelpPage=window.location.pathname.endsWith("/help.html");function loadScript(url){const script=document.createElement("script");script.src=url;document.head.append(script)}getSettingsButton().onclick=event=>{if(event.ctrlKey||event.altKey||event.metaKey){return}window.hideAllModals(false);addClass(getSettingsButton(),"rotate");event.preventDefault();loadScript(getVar("static-root-path")+getVar("settings-js"));setTimeout(()=>{const themes=getVar("themes").split(",");for(const theme of themes){if(theme!==""){preLoadCss(getVar("root-path")+theme+".css")}}},0)};window.searchState={loadingText:"Loading search results...",input:document.getElementsByClassName("search-input")[0],outputElement:()=>{let el=document.getElementById("search");if(!el){el=document.createElement("section");el.id="search";getNotDisplayedElem().appendChild(el)}return el},title:document.title,titleBeforeSearch:document.title,timeout:null,currentTab:0,focusedByTab:[null,null,null],clearInputTimeout:()=>{if(searchState.timeout!==null){clearTimeout(searchState.timeout);searchState.timeout=null}},isDisplayed:()=>searchState.outputElement().parentElement.id===ALTERNATIVE_DISPLAY_ID,focus:()=>{searchState.input.focus()},defocus:()=>{searchState.input.blur()},showResults:search=>{if(search===null||typeof search==="undefined"){search=searchState.outputElement()}switchDisplayedElement(search);searchState.mouseMovedAfterSearch=false;document.title=searchState.title},removeQueryParameters:()=>{document.title=searchState.titleBeforeSearch;if(browserSupportsHistoryApi()){history.replaceState(null,"",getNakedUrl()+window.location.hash)}},hideResults:()=>{switchDisplayedElement(null);searchState.removeQueryParameters()},getQueryStringParams:()=>{const params={};window.location.search.substring(1).split("&").map(s=>{const pair=s.split("=");params[decodeURIComponent(pair[0])]=typeof pair[1]==="undefined"?null:decodeURIComponent(pair[1])});return params},setup:()=>{const search_input=searchState.input;if(!searchState.input){return}let searchLoaded=false;function loadSearch(){if(!searchLoaded){searchLoaded=true;loadScript(getVar("static-root-path")+getVar("search-js"));loadScript(resourcePath("search-index",".js"))}}search_input.addEventListener("focus",()=>{search_input.origPlaceholder=search_input.placeholder;search_input.placeholder="Type your search here.";loadSearch()});if(search_input.value!==""){loadSearch()}const params=searchState.getQueryStringParams();if(params.search!==undefined){searchState.setLoadingSearch();loadSearch()}},setLoadingSearch:()=>{const search=searchState.outputElement();search.innerHTML="

"+searchState.loadingText+"

";searchState.showResults(search)},};const toggleAllDocsId="toggle-all-docs";let savedHash="";function handleHashes(ev){if(ev!==null&&searchState.isDisplayed()&&ev.newURL){switchDisplayedElement(null);const hash=ev.newURL.slice(ev.newURL.indexOf("#")+1);if(browserSupportsHistoryApi()){history.replaceState(null,"",getNakedUrl()+window.location.search+"#"+hash)}const elem=document.getElementById(hash);if(elem){elem.scrollIntoView()}}const pageId=window.location.hash.replace(/^#/,"");if(savedHash!==pageId){savedHash=pageId;if(pageId!==""){expandSection(pageId)}}if(savedHash.startsWith("impl-")){const splitAt=savedHash.indexOf("/");if(splitAt!==-1){const implId=savedHash.slice(0,splitAt);const assocId=savedHash.slice(splitAt+1);const implElem=document.getElementById(implId);if(implElem&&implElem.parentElement.tagName==="SUMMARY"&&implElem.parentElement.parentElement.tagName==="DETAILS"){onEachLazy(implElem.parentElement.parentElement.querySelectorAll(`[id^="${assocId}"]`),item=>{const numbered=/([^-]+)-([0-9]+)/.exec(item.id);if(item.id===assocId||(numbered&&numbered[1]===assocId)){openParentDetails(item);item.scrollIntoView();setTimeout(()=>{window.location.replace("#"+item.id)},0)}})}}}}function onHashChange(ev){hideSidebar();handleHashes(ev)}function openParentDetails(elem){while(elem){if(elem.tagName==="DETAILS"){elem.open=true}elem=elem.parentNode}}function expandSection(id){openParentDetails(document.getElementById(id))}function handleEscape(ev){searchState.clearInputTimeout();searchState.hideResults();ev.preventDefault();searchState.defocus();window.hideAllModals(true)}function handleShortcut(ev){const disableShortcuts=getSettingValue("disable-shortcuts")==="true";if(ev.ctrlKey||ev.altKey||ev.metaKey||disableShortcuts){return}if(document.activeElement.tagName==="INPUT"&&document.activeElement.type!=="checkbox"&&document.activeElement.type!=="radio"){switch(getVirtualKey(ev)){case"Escape":handleEscape(ev);break}}else{switch(getVirtualKey(ev)){case"Escape":handleEscape(ev);break;case"s":case"S":ev.preventDefault();searchState.focus();break;case"+":ev.preventDefault();expandAllDocs();break;case"-":ev.preventDefault();collapseAllDocs();break;case"?":showHelp();break;default:break}}}document.addEventListener("keypress",handleShortcut);document.addEventListener("keydown",handleShortcut);function addSidebarItems(){if(!window.SIDEBAR_ITEMS){return}const sidebar=document.getElementsByClassName("sidebar-elems")[0];function block(shortty,id,longty){const filtered=window.SIDEBAR_ITEMS[shortty];if(!filtered){return}const modpath=hasClass(document.querySelector(".rustdoc"),"mod")?"../":"";const h3=document.createElement("h3");h3.innerHTML=`${longty}`;const ul=document.createElement("ul");ul.className="block "+shortty;for(const name of filtered){let path;if(shortty==="mod"){path=`${modpath}${name}/index.html`}else{path=`${modpath}${shortty}.${name}.html`}let current_page=document.location.href.toString();if(current_page.endsWith("/")){current_page+="index.html"}const link=document.createElement("a");link.href=path;if(path===current_page){link.className="current"}link.textContent=name;const li=document.createElement("li");li.appendChild(link);ul.appendChild(li)}sidebar.appendChild(h3);sidebar.appendChild(ul)}if(sidebar){block("primitive","primitives","Primitive Types");block("mod","modules","Modules");block("macro","macros","Macros");block("struct","structs","Structs");block("enum","enums","Enums");block("constant","constants","Constants");block("static","static","Statics");block("trait","traits","Traits");block("fn","functions","Functions");block("type","types","Type Aliases");block("union","unions","Unions");block("foreigntype","foreign-types","Foreign Types");block("keyword","keywords","Keywords");block("opaque","opaque-types","Opaque Types");block("attr","attributes","Attribute Macros");block("derive","derives","Derive Macros");block("traitalias","trait-aliases","Trait Aliases")}}window.register_implementors=imp=>{const implementors=document.getElementById("implementors-list");const synthetic_implementors=document.getElementById("synthetic-implementors-list");const inlined_types=new Set();const TEXT_IDX=0;const SYNTHETIC_IDX=1;const TYPES_IDX=2;if(synthetic_implementors){onEachLazy(synthetic_implementors.getElementsByClassName("impl"),el=>{const aliases=el.getAttribute("data-aliases");if(!aliases){return}aliases.split(",").forEach(alias=>{inlined_types.add(alias)})})}let currentNbImpls=implementors.getElementsByClassName("impl").length;const traitName=document.querySelector(".main-heading h1 > .trait").textContent;const baseIdName="impl-"+traitName+"-";const libs=Object.getOwnPropertyNames(imp);const script=document.querySelector("script[data-ignore-extern-crates]");const ignoreExternCrates=new Set((script?script.getAttribute("data-ignore-extern-crates"):"").split(","));for(const lib of libs){if(lib===window.currentCrate||ignoreExternCrates.has(lib)){continue}const structs=imp[lib];struct_loop:for(const struct of structs){const list=struct[SYNTHETIC_IDX]?synthetic_implementors:implementors;if(struct[SYNTHETIC_IDX]){for(const struct_type of struct[TYPES_IDX]){if(inlined_types.has(struct_type)){continue struct_loop}inlined_types.add(struct_type)}}const code=document.createElement("h3");code.innerHTML=struct[TEXT_IDX];addClass(code,"code-header");onEachLazy(code.getElementsByTagName("a"),elem=>{const href=elem.getAttribute("href");if(href&&!href.startsWith("#")&&!/^(?:[a-z+]+:)?\/\//.test(href)){elem.setAttribute("href",window.rootPath+href)}});const currentId=baseIdName+currentNbImpls;const anchor=document.createElement("a");anchor.href="#"+currentId;addClass(anchor,"anchor");const display=document.createElement("div");display.id=currentId;addClass(display,"impl");display.appendChild(anchor);display.appendChild(code);list.appendChild(display);currentNbImpls+=1}}};if(window.pending_implementors){window.register_implementors(window.pending_implementors)}window.register_type_impls=imp=>{if(!imp||!imp[window.currentCrate]){return}window.pending_type_impls=null;const idMap=new Map();let implementations=document.getElementById("implementations-list");let trait_implementations=document.getElementById("trait-implementations-list");let trait_implementations_header=document.getElementById("trait-implementations");const script=document.querySelector("script[data-self-path]");const selfPath=script?script.getAttribute("data-self-path"):null;const mainContent=document.querySelector("#main-content");const sidebarSection=document.querySelector(".sidebar section");let methods=document.querySelector(".sidebar .block.method");let associatedTypes=document.querySelector(".sidebar .block.associatedtype");let associatedConstants=document.querySelector(".sidebar .block.associatedconstant");let sidebarTraitList=document.querySelector(".sidebar .block.trait-implementation");for(const impList of imp[window.currentCrate]){const types=impList.slice(2);const text=impList[0];const isTrait=impList[1]!==0;const traitName=impList[1];if(types.indexOf(selfPath)===-1){continue}let outputList=isTrait?trait_implementations:implementations;if(outputList===null){const outputListName=isTrait?"Trait Implementations":"Implementations";const outputListId=isTrait?"trait-implementations-list":"implementations-list";const outputListHeaderId=isTrait?"trait-implementations":"implementations";const outputListHeader=document.createElement("h2");outputListHeader.id=outputListHeaderId;outputListHeader.innerText=outputListName;outputList=document.createElement("div");outputList.id=outputListId;if(isTrait){const link=document.createElement("a");link.href=`#${outputListHeaderId}`;link.innerText="Trait Implementations";const h=document.createElement("h3");h.appendChild(link);trait_implementations=outputList;trait_implementations_header=outputListHeader;sidebarSection.appendChild(h);sidebarTraitList=document.createElement("ul");sidebarTraitList.className="block trait-implementation";sidebarSection.appendChild(sidebarTraitList);mainContent.appendChild(outputListHeader);mainContent.appendChild(outputList)}else{implementations=outputList;if(trait_implementations){mainContent.insertBefore(outputListHeader,trait_implementations_header);mainContent.insertBefore(outputList,trait_implementations_header)}else{const mainContent=document.querySelector("#main-content");mainContent.appendChild(outputListHeader);mainContent.appendChild(outputList)}}}const template=document.createElement("template");template.innerHTML=text;onEachLazy(template.content.querySelectorAll("a"),elem=>{const href=elem.getAttribute("href");if(href&&!href.startsWith("#")&&!/^(?:[a-z+]+:)?\/\//.test(href)){elem.setAttribute("href",window.rootPath+href)}});onEachLazy(template.content.querySelectorAll("[id]"),el=>{let i=0;if(idMap.has(el.id)){i=idMap.get(el.id)}else if(document.getElementById(el.id)){i=1;while(document.getElementById(`${el.id}-${2 * i}`)){i=2*i}while(document.getElementById(`${el.id}-${i}`)){i+=1}}if(i!==0){const oldHref=`#${el.id}`;const newHref=`#${el.id}-${i}`;el.id=`${el.id}-${i}`;onEachLazy(template.content.querySelectorAll("a[href]"),link=>{if(link.getAttribute("href")===oldHref){link.href=newHref}})}idMap.set(el.id,i+1)});const templateAssocItems=template.content.querySelectorAll("section.tymethod, "+"section.method, section.associatedtype, section.associatedconstant");if(isTrait){const li=document.createElement("li");const a=document.createElement("a");a.href=`#${template.content.querySelector(".impl").id}`;a.textContent=traitName;li.appendChild(a);sidebarTraitList.append(li)}else{onEachLazy(templateAssocItems,item=>{let block=hasClass(item,"associatedtype")?associatedTypes:(hasClass(item,"associatedconstant")?associatedConstants:(methods));if(!block){const blockTitle=hasClass(item,"associatedtype")?"Associated Types":(hasClass(item,"associatedconstant")?"Associated Constants":("Methods"));const blockClass=hasClass(item,"associatedtype")?"associatedtype":(hasClass(item,"associatedconstant")?"associatedconstant":("method"));const blockHeader=document.createElement("h3");const blockLink=document.createElement("a");blockLink.href="#implementations";blockLink.innerText=blockTitle;blockHeader.appendChild(blockLink);block=document.createElement("ul");block.className=`block ${blockClass}`;const insertionReference=methods||sidebarTraitList;if(insertionReference){const insertionReferenceH=insertionReference.previousElementSibling;sidebarSection.insertBefore(blockHeader,insertionReferenceH);sidebarSection.insertBefore(block,insertionReferenceH)}else{sidebarSection.appendChild(blockHeader);sidebarSection.appendChild(block)}if(hasClass(item,"associatedtype")){associatedTypes=block}else if(hasClass(item,"associatedconstant")){associatedConstants=block}else{methods=block}}const li=document.createElement("li");const a=document.createElement("a");a.innerText=item.id.split("-")[0].split(".")[1];a.href=`#${item.id}`;li.appendChild(a);block.appendChild(li)})}outputList.appendChild(template.content)}for(const list of[methods,associatedTypes,associatedConstants,sidebarTraitList]){if(!list){continue}const newChildren=Array.prototype.slice.call(list.children);newChildren.sort((a,b)=>{const aI=a.innerText;const bI=b.innerText;return aIbI?1:0});list.replaceChildren(...newChildren)}};if(window.pending_type_impls){window.register_type_impls(window.pending_type_impls)}function addSidebarCrates(){if(!window.ALL_CRATES){return}const sidebarElems=document.getElementsByClassName("sidebar-elems")[0];if(!sidebarElems){return}const h3=document.createElement("h3");h3.innerHTML="Crates";const ul=document.createElement("ul");ul.className="block crate";for(const crate of window.ALL_CRATES){const link=document.createElement("a");link.href=window.rootPath+crate+"/index.html";link.textContent=crate;const li=document.createElement("li");if(window.rootPath!=="./"&&crate===window.currentCrate){li.className="current"}li.appendChild(link);ul.appendChild(li)}sidebarElems.appendChild(h3);sidebarElems.appendChild(ul)}function expandAllDocs(){const innerToggle=document.getElementById(toggleAllDocsId);removeClass(innerToggle,"will-expand");onEachLazy(document.getElementsByClassName("toggle"),e=>{if(!hasClass(e,"type-contents-toggle")&&!hasClass(e,"more-examples-toggle")){e.open=true}});innerToggle.title="collapse all docs";innerToggle.children[0].innerText="\u2212"}function collapseAllDocs(){const innerToggle=document.getElementById(toggleAllDocsId);addClass(innerToggle,"will-expand");onEachLazy(document.getElementsByClassName("toggle"),e=>{if(e.parentNode.id!=="implementations-list"||(!hasClass(e,"implementors-toggle")&&!hasClass(e,"type-contents-toggle"))){e.open=false}});innerToggle.title="expand all docs";innerToggle.children[0].innerText="+"}function toggleAllDocs(){const innerToggle=document.getElementById(toggleAllDocsId);if(!innerToggle){return}if(hasClass(innerToggle,"will-expand")){expandAllDocs()}else{collapseAllDocs()}}(function(){const toggles=document.getElementById(toggleAllDocsId);if(toggles){toggles.onclick=toggleAllDocs}const hideMethodDocs=getSettingValue("auto-hide-method-docs")==="true";const hideImplementations=getSettingValue("auto-hide-trait-implementations")==="true";const hideLargeItemContents=getSettingValue("auto-hide-large-items")!=="false";function setImplementorsTogglesOpen(id,open){const list=document.getElementById(id);if(list!==null){onEachLazy(list.getElementsByClassName("implementors-toggle"),e=>{e.open=open})}}if(hideImplementations){setImplementorsTogglesOpen("trait-implementations-list",false);setImplementorsTogglesOpen("blanket-implementations-list",false)}onEachLazy(document.getElementsByClassName("toggle"),e=>{if(!hideLargeItemContents&&hasClass(e,"type-contents-toggle")){e.open=true}if(hideMethodDocs&&hasClass(e,"method-toggle")){e.open=false}})}());window.rustdoc_add_line_numbers_to_examples=()=>{onEachLazy(document.getElementsByClassName("rust-example-rendered"),x=>{const parent=x.parentNode;const line_numbers=parent.querySelectorAll(".example-line-numbers");if(line_numbers.length>0){return}const count=x.textContent.split("\n").length;const elems=[];for(let i=0;i{onEachLazy(document.getElementsByClassName("rust-example-rendered"),x=>{const parent=x.parentNode;const line_numbers=parent.querySelectorAll(".example-line-numbers");for(const node of line_numbers){parent.removeChild(node)}})};if(getSettingValue("line-numbers")==="true"){window.rustdoc_add_line_numbers_to_examples()}function showSidebar(){window.hideAllModals(false);const sidebar=document.getElementsByClassName("sidebar")[0];addClass(sidebar,"shown")}function hideSidebar(){const sidebar=document.getElementsByClassName("sidebar")[0];removeClass(sidebar,"shown")}window.addEventListener("resize",()=>{if(window.CURRENT_TOOLTIP_ELEMENT){const base=window.CURRENT_TOOLTIP_ELEMENT.TOOLTIP_BASE;const force_visible=base.TOOLTIP_FORCE_VISIBLE;hideTooltip(false);if(force_visible){showTooltip(base);base.TOOLTIP_FORCE_VISIBLE=true}}});const mainElem=document.getElementById(MAIN_ID);if(mainElem){mainElem.addEventListener("click",hideSidebar)}onEachLazy(document.querySelectorAll("a[href^='#']"),el=>{el.addEventListener("click",()=>{expandSection(el.hash.slice(1));hideSidebar()})});onEachLazy(document.querySelectorAll(".toggle > summary:not(.hideme)"),el=>{el.addEventListener("click",e=>{if(e.target.tagName!=="SUMMARY"&&e.target.tagName!=="A"){e.preventDefault()}})});function showTooltip(e){const notable_ty=e.getAttribute("data-notable-ty");if(!window.NOTABLE_TRAITS&¬able_ty){const data=document.getElementById("notable-traits-data");if(data){window.NOTABLE_TRAITS=JSON.parse(data.innerText)}else{throw new Error("showTooltip() called with notable without any notable traits!")}}if(window.CURRENT_TOOLTIP_ELEMENT&&window.CURRENT_TOOLTIP_ELEMENT.TOOLTIP_BASE===e){clearTooltipHoverTimeout(window.CURRENT_TOOLTIP_ELEMENT);return}window.hideAllModals(false);const wrapper=document.createElement("div");if(notable_ty){wrapper.innerHTML="
"+window.NOTABLE_TRAITS[notable_ty]+"
"}else{if(e.getAttribute("title")!==null){e.setAttribute("data-title",e.getAttribute("title"));e.removeAttribute("title")}if(e.getAttribute("data-title")!==null){const titleContent=document.createElement("div");titleContent.className="content";titleContent.appendChild(document.createTextNode(e.getAttribute("data-title")));wrapper.appendChild(titleContent)}}wrapper.className="tooltip popover";const focusCatcher=document.createElement("div");focusCatcher.setAttribute("tabindex","0");focusCatcher.onfocus=hideTooltip;wrapper.appendChild(focusCatcher);const pos=e.getBoundingClientRect();wrapper.style.top=(pos.top+window.scrollY+pos.height)+"px";wrapper.style.left=0;wrapper.style.right="auto";wrapper.style.visibility="hidden";const body=document.getElementsByTagName("body")[0];body.appendChild(wrapper);const wrapperPos=wrapper.getBoundingClientRect();const finalPos=pos.left+window.scrollX-wrapperPos.width+24;if(finalPos>0){wrapper.style.left=finalPos+"px"}else{wrapper.style.setProperty("--popover-arrow-offset",(wrapperPos.right-pos.right+4)+"px")}wrapper.style.visibility="";window.CURRENT_TOOLTIP_ELEMENT=wrapper;window.CURRENT_TOOLTIP_ELEMENT.TOOLTIP_BASE=e;clearTooltipHoverTimeout(window.CURRENT_TOOLTIP_ELEMENT);wrapper.onpointerenter=ev=>{if(ev.pointerType!=="mouse"){return}clearTooltipHoverTimeout(e)};wrapper.onpointerleave=ev=>{if(ev.pointerType!=="mouse"){return}if(!e.TOOLTIP_FORCE_VISIBLE&&!e.contains(ev.relatedTarget)){setTooltipHoverTimeout(e,false);addClass(wrapper,"fade-out")}}}function setTooltipHoverTimeout(element,show){clearTooltipHoverTimeout(element);if(!show&&!window.CURRENT_TOOLTIP_ELEMENT){return}if(show&&window.CURRENT_TOOLTIP_ELEMENT){return}if(window.CURRENT_TOOLTIP_ELEMENT&&window.CURRENT_TOOLTIP_ELEMENT.TOOLTIP_BASE!==element){return}element.TOOLTIP_HOVER_TIMEOUT=setTimeout(()=>{if(show){showTooltip(element)}else if(!element.TOOLTIP_FORCE_VISIBLE){hideTooltip(false)}},show?window.RUSTDOC_TOOLTIP_HOVER_MS:window.RUSTDOC_TOOLTIP_HOVER_EXIT_MS)}function clearTooltipHoverTimeout(element){if(element.TOOLTIP_HOVER_TIMEOUT!==undefined){removeClass(window.CURRENT_TOOLTIP_ELEMENT,"fade-out");clearTimeout(element.TOOLTIP_HOVER_TIMEOUT);delete element.TOOLTIP_HOVER_TIMEOUT}}function tooltipBlurHandler(event){if(window.CURRENT_TOOLTIP_ELEMENT&&!window.CURRENT_TOOLTIP_ELEMENT.contains(document.activeElement)&&!window.CURRENT_TOOLTIP_ELEMENT.contains(event.relatedTarget)&&!window.CURRENT_TOOLTIP_ELEMENT.TOOLTIP_BASE.contains(document.activeElement)&&!window.CURRENT_TOOLTIP_ELEMENT.TOOLTIP_BASE.contains(event.relatedTarget)){setTimeout(()=>hideTooltip(false),0)}}function hideTooltip(focus){if(window.CURRENT_TOOLTIP_ELEMENT){if(window.CURRENT_TOOLTIP_ELEMENT.TOOLTIP_BASE.TOOLTIP_FORCE_VISIBLE){if(focus){window.CURRENT_TOOLTIP_ELEMENT.TOOLTIP_BASE.focus()}window.CURRENT_TOOLTIP_ELEMENT.TOOLTIP_BASE.TOOLTIP_FORCE_VISIBLE=false}const body=document.getElementsByTagName("body")[0];body.removeChild(window.CURRENT_TOOLTIP_ELEMENT);clearTooltipHoverTimeout(window.CURRENT_TOOLTIP_ELEMENT);window.CURRENT_TOOLTIP_ELEMENT=null}}onEachLazy(document.getElementsByClassName("tooltip"),e=>{e.onclick=()=>{e.TOOLTIP_FORCE_VISIBLE=e.TOOLTIP_FORCE_VISIBLE?false:true;if(window.CURRENT_TOOLTIP_ELEMENT&&!e.TOOLTIP_FORCE_VISIBLE){hideTooltip(true)}else{showTooltip(e);window.CURRENT_TOOLTIP_ELEMENT.setAttribute("tabindex","0");window.CURRENT_TOOLTIP_ELEMENT.focus();window.CURRENT_TOOLTIP_ELEMENT.onblur=tooltipBlurHandler}return false};e.onpointerenter=ev=>{if(ev.pointerType!=="mouse"){return}setTooltipHoverTimeout(e,true)};e.onpointermove=ev=>{if(ev.pointerType!=="mouse"){return}setTooltipHoverTimeout(e,true)};e.onpointerleave=ev=>{if(ev.pointerType!=="mouse"){return}if(!e.TOOLTIP_FORCE_VISIBLE&&window.CURRENT_TOOLTIP_ELEMENT&&!window.CURRENT_TOOLTIP_ELEMENT.contains(ev.relatedTarget)){setTooltipHoverTimeout(e,false);addClass(window.CURRENT_TOOLTIP_ELEMENT,"fade-out")}}});const sidebar_menu_toggle=document.getElementsByClassName("sidebar-menu-toggle")[0];if(sidebar_menu_toggle){sidebar_menu_toggle.addEventListener("click",()=>{const sidebar=document.getElementsByClassName("sidebar")[0];if(!hasClass(sidebar,"shown")){showSidebar()}else{hideSidebar()}})}function helpBlurHandler(event){blurHandler(event,getHelpButton(),window.hidePopoverMenus)}function buildHelpMenu(){const book_info=document.createElement("span");const channel=getVar("channel");book_info.className="top";book_info.innerHTML=`You can find more information in \ +the rustdoc book.`;const shortcuts=[["?","Show this help dialog"],["S","Focus the search field"],["↑","Move up in search results"],["↓","Move down in search results"],["← / →","Switch result tab (when results focused)"],["⏎","Go to active search result"],["+","Expand all sections"],["-","Collapse all sections"],].map(x=>"
"+x[0].split(" ").map((y,index)=>((index&1)===0?""+y+"":" "+y+" ")).join("")+"
"+x[1]+"
").join("");const div_shortcuts=document.createElement("div");addClass(div_shortcuts,"shortcuts");div_shortcuts.innerHTML="

Keyboard Shortcuts

"+shortcuts+"
";const infos=[`For a full list of all search features, take a look here.`,"Prefix searches with a type followed by a colon (e.g., fn:) to \ + restrict the search to a given item kind.","Accepted kinds are: fn, mod, struct, \ + enum, trait, type, macro, \ + and const.","Search functions by type signature (e.g., vec -> usize or \ + -> vec or String, enum:Cow -> bool)","You can look for items with an exact name by putting double quotes around \ + 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");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-sidebar.offsetLeft-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}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(){let reset_button_timeout=null;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)}});const el=document.createElement("textarea");el.value=path.join("::");el.setAttribute("readonly","");el.style.position="absolute";el.style.left="-9999px";document.body.appendChild(el);el.select();document.execCommand("copy");document.body.removeChild(el);but.children[0].style.display="none";let tmp;if(but.childNodes.length<2){tmp=document.createTextNode("✓");but.appendChild(tmp)}else{onEachLazy(but.childNodes,e=>{if(e.nodeType===Node.TEXT_NODE){tmp=e;return true}});tmp.textContent="✓"}if(reset_button_timeout!==null){window.clearTimeout(reset_button_timeout)}function reset_button(){tmp.textContent="";reset_button_timeout=null;but.children[0].style.display=""}reset_button_timeout=window.setTimeout(reset_button,1000)}}()) \ No newline at end of file diff --git a/static.files/normalize-76eba96aa4d2e634.css b/static.files/normalize-76eba96aa4d2e634.css new file mode 100644 index 0000000..469959f --- /dev/null +++ b/static.files/normalize-76eba96aa4d2e634.css @@ -0,0 +1,2 @@ + /*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */ +html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:0.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type="button"],[type="reset"],[type="submit"],button{-webkit-appearance:button}[type="button"]::-moz-focus-inner,[type="reset"]::-moz-focus-inner,[type="submit"]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type="button"]:-moz-focusring,[type="reset"]:-moz-focusring,[type="submit"]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:0.35em 0.75em 0.625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type="checkbox"],[type="radio"]{box-sizing:border-box;padding:0}[type="number"]::-webkit-inner-spin-button,[type="number"]::-webkit-outer-spin-button{height:auto}[type="search"]{-webkit-appearance:textfield;outline-offset:-2px}[type="search"]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}template{display:none}[hidden]{display:none} \ No newline at end of file diff --git a/static.files/noscript-feafe1bb7466e4bd.css b/static.files/noscript-feafe1bb7466e4bd.css new file mode 100644 index 0000000..7bbe07f --- /dev/null +++ b/static.files/noscript-feafe1bb7466e4bd.css @@ -0,0 +1 @@ + #main-content .attributes{margin-left:0 !important;}#copy-path,#sidebar-button,.sidebar-resizer{display:none;}nav.sub{display:none;}.src .sidebar{display:none;}.notable-traits{display:none;}:root{--main-background-color:white;--main-color:black;--settings-input-color:#2196f3;--settings-input-border-color:#717171;--settings-button-color:#000;--settings-button-border-focus:#717171;--sidebar-background-color:#f5f5f5;--sidebar-background-color-hover:#e0e0e0;--code-block-background-color:#f5f5f5;--scrollbar-track-background-color:#dcdcdc;--scrollbar-thumb-background-color:rgba(36,37,39,0.6);--scrollbar-color:rgba(36,37,39,0.6) #d9d9d9;--headings-border-bottom-color:#ddd;--border-color:#e0e0e0;--button-background-color:#fff;--right-side-color:grey;--code-attribute-color:#999;--toggles-color:#999;--toggle-filter:none;--search-input-focused-border-color:#66afe9;--copy-path-button-color:#999;--copy-path-img-filter:invert(50%);--copy-path-img-hover-filter:invert(35%);--codeblock-error-hover-color:rgb(255,0,0);--codeblock-error-color:rgba(255,0,0,.5);--codeblock-ignore-hover-color:rgb(255,142,0);--codeblock-ignore-color:rgba(255,142,0,.6);--warning-border-color:#ff8e00;--type-link-color:#ad378a;--trait-link-color:#6e4fc9;--assoc-item-link-color:#3873ad;--function-link-color:#ad7c37;--macro-link-color:#068000;--keyword-link-color:#3873ad;--mod-link-color:#3873ad;--link-color:#3873ad;--sidebar-link-color:#356da4;--sidebar-current-link-background-color:#fff;--search-result-link-focus-background-color:#ccc;--search-result-border-color:#aaa3;--search-color:#000;--search-error-code-background-color:#d0cccc;--search-results-alias-color:#000;--search-results-grey-color:#999;--search-tab-title-count-color:#888;--search-tab-button-not-selected-border-top-color:#e6e6e6;--search-tab-button-not-selected-background:#e6e6e6;--search-tab-button-selected-border-top-color:#0089ff;--search-tab-button-selected-background:#fff;--stab-background-color:#fff5d6;--stab-code-color:#000;--code-highlight-kw-color:#8959a8;--code-highlight-kw-2-color:#4271ae;--code-highlight-lifetime-color:#b76514;--code-highlight-prelude-color:#4271ae;--code-highlight-prelude-val-color:#c82829;--code-highlight-number-color:#718c00;--code-highlight-string-color:#718c00;--code-highlight-literal-color:#c82829;--code-highlight-attribute-color:#c82829;--code-highlight-self-color:#c82829;--code-highlight-macro-color:#3e999f;--code-highlight-question-mark-color:#ff9011;--code-highlight-comment-color:#8e908c;--code-highlight-doc-comment-color:#4d4d4c;--src-line-numbers-span-color:#c67e2d;--src-line-number-highlighted-background-color:#fdffd3;--test-arrow-color:#f5f5f5;--test-arrow-background-color:rgba(78,139,202,0.2);--test-arrow-hover-color:#f5f5f5;--test-arrow-hover-background-color:rgb(78,139,202);--target-background-color:#fdffd3;--target-border-color:#ad7c37;--kbd-color:#000;--kbd-background:#fafbfc;--kbd-box-shadow-color:#c6cbd1;--rust-logo-filter:initial;--crate-search-div-filter:invert(100%) sepia(0%) saturate(4223%) hue-rotate(289deg) brightness(114%) contrast(76%);--crate-search-div-hover-filter:invert(44%) sepia(18%) saturate(23%) hue-rotate(317deg) brightness(96%) contrast(93%);--crate-search-hover-border:#717171;--src-sidebar-background-selected:#fff;--src-sidebar-background-hover:#e0e0e0;--table-alt-row-background-color:#f5f5f5;--codeblock-link-background:#eee;--scrape-example-toggle-line-background:#ccc;--scrape-example-toggle-line-hover-background:#999;--scrape-example-code-line-highlight:#fcffd6;--scrape-example-code-line-highlight-focus:#f6fdb0;--scrape-example-help-border-color:#555;--scrape-example-help-color:#333;--scrape-example-help-hover-border-color:#000;--scrape-example-help-hover-color:#000;--scrape-example-code-wrapper-background-start:rgba(255,255,255,1);--scrape-example-code-wrapper-background-end:rgba(255,255,255,0);--sidebar-resizer-hover:hsl(207,90%,66%);--sidebar-resizer-active:hsl(207,90%,54%);}@media (prefers-color-scheme:dark){:root{--main-background-color:#353535;--main-color:#ddd;--settings-input-color:#2196f3;--settings-input-border-color:#999;--settings-button-color:#000;--settings-button-border-focus:#ffb900;--sidebar-background-color:#505050;--sidebar-background-color-hover:#676767;--code-block-background-color:#2A2A2A;--scrollbar-track-background-color:#717171;--scrollbar-thumb-background-color:rgba(32,34,37,.6);--scrollbar-color:rgba(32,34,37,.6) #5a5a5a;--headings-border-bottom-color:#d2d2d2;--border-color:#e0e0e0;--button-background-color:#f0f0f0;--right-side-color:grey;--code-attribute-color:#999;--toggles-color:#999;--toggle-filter:invert(100%);--search-input-focused-border-color:#008dfd;--copy-path-button-color:#999;--copy-path-img-filter:invert(50%);--copy-path-img-hover-filter:invert(65%);--codeblock-error-hover-color:rgb(255,0,0);--codeblock-error-color:rgba(255,0,0,.5);--codeblock-ignore-hover-color:rgb(255,142,0);--codeblock-ignore-color:rgba(255,142,0,.6);--warning-border-color:#ff8e00;--type-link-color:#2dbfb8;--trait-link-color:#b78cf2;--assoc-item-link-color:#d2991d;--function-link-color:#2bab63;--macro-link-color:#09bd00;--keyword-link-color:#d2991d;--mod-link-color:#d2991d;--link-color:#d2991d;--sidebar-link-color:#fdbf35;--sidebar-current-link-background-color:#444;--search-result-link-focus-background-color:#616161;--search-result-border-color:#aaa3;--search-color:#111;--search-error-code-background-color:#484848;--search-results-alias-color:#fff;--search-results-grey-color:#ccc;--search-tab-title-count-color:#888;--search-tab-button-not-selected-border-top-color:#252525;--search-tab-button-not-selected-background:#252525;--search-tab-button-selected-border-top-color:#0089ff;--search-tab-button-selected-background:#353535;--stab-background-color:#314559;--stab-code-color:#e6e1cf;--code-highlight-kw-color:#ab8ac1;--code-highlight-kw-2-color:#769acb;--code-highlight-lifetime-color:#d97f26;--code-highlight-prelude-color:#769acb;--code-highlight-prelude-val-color:#ee6868;--code-highlight-number-color:#83a300;--code-highlight-string-color:#83a300;--code-highlight-literal-color:#ee6868;--code-highlight-attribute-color:#ee6868;--code-highlight-self-color:#ee6868;--code-highlight-macro-color:#3e999f;--code-highlight-question-mark-color:#ff9011;--code-highlight-comment-color:#8d8d8b;--code-highlight-doc-comment-color:#8ca375;--src-line-numbers-span-color:#3b91e2;--src-line-number-highlighted-background-color:#0a042f;--test-arrow-color:#dedede;--test-arrow-background-color:rgba(78,139,202,0.2);--test-arrow-hover-color:#dedede;--test-arrow-hover-background-color:#4e8bca;--target-background-color:#494a3d;--target-border-color:#bb7410;--kbd-color:#000;--kbd-background:#fafbfc;--kbd-box-shadow-color:#c6cbd1;--rust-logo-filter:drop-shadow(1px 0 0px #fff) drop-shadow(0 1px 0 #fff) drop-shadow(-1px 0 0 #fff) drop-shadow(0 -1px 0 #fff);--crate-search-div-filter:invert(94%) sepia(0%) saturate(721%) hue-rotate(255deg) brightness(90%) contrast(90%);--crate-search-div-hover-filter:invert(69%) sepia(60%) saturate(6613%) hue-rotate(184deg) brightness(100%) contrast(91%);--crate-search-hover-border:#2196f3;--src-sidebar-background-selected:#333;--src-sidebar-background-hover:#444;--table-alt-row-background-color:#2a2a2a;--codeblock-link-background:#333;--scrape-example-toggle-line-background:#999;--scrape-example-toggle-line-hover-background:#c5c5c5;--scrape-example-code-line-highlight:#5b3b01;--scrape-example-code-line-highlight-focus:#7c4b0f;--scrape-example-help-border-color:#aaa;--scrape-example-help-color:#eee;--scrape-example-help-hover-border-color:#fff;--scrape-example-help-hover-color:#fff;--scrape-example-code-wrapper-background-start:rgba(53,53,53,1);--scrape-example-code-wrapper-background-end:rgba(53,53,53,0);--sidebar-resizer-hover:hsl(207,30%,54%);--sidebar-resizer-active:hsl(207,90%,54%);}} \ No newline at end of file diff --git a/static.files/rust-logo-151179464ae7ed46.svg b/static.files/rust-logo-151179464ae7ed46.svg new file mode 100644 index 0000000..62424d8 --- /dev/null +++ b/static.files/rust-logo-151179464ae7ed46.svg @@ -0,0 +1,61 @@ + + + diff --git a/static.files/rustdoc-ac92e1bbe349e143.css b/static.files/rustdoc-ac92e1bbe349e143.css new file mode 100644 index 0000000..27e3d9d --- /dev/null +++ b/static.files/rustdoc-ac92e1bbe349e143.css @@ -0,0 +1,18 @@ + :root{--nav-sub-mobile-padding:8px;--search-typename-width:6.75rem;--desktop-sidebar-width:200px;--src-sidebar-width:300px;--desktop-sidebar-z-index:100;}@font-face {font-family:'Fira Sans';font-style:normal;font-weight:400;src:local('Fira Sans'),url("FiraSans-Regular-018c141bf0843ffd.woff2") format("woff2");font-display:swap;}@font-face {font-family:'Fira Sans';font-style:normal;font-weight:500;src:local('Fira Sans Medium'),url("FiraSans-Medium-8f9a781e4970d388.woff2") format("woff2");font-display:swap;}@font-face {font-family:'Source Serif 4';font-style:normal;font-weight:400;src:local('Source Serif 4'),url("SourceSerif4-Regular-46f98efaafac5295.ttf.woff2") format("woff2");font-display:swap;}@font-face {font-family:'Source Serif 4';font-style:italic;font-weight:400;src:local('Source Serif 4 Italic'),url("SourceSerif4-It-acdfaf1a8af734b1.ttf.woff2") format("woff2");font-display:swap;}@font-face {font-family:'Source Serif 4';font-style:normal;font-weight:700;src:local('Source Serif 4 Bold'),url("SourceSerif4-Bold-a2c9cd1067f8b328.ttf.woff2") format("woff2");font-display:swap;}@font-face {font-family:'Source Code Pro';font-style:normal;font-weight:400;src:url("SourceCodePro-Regular-562dcc5011b6de7d.ttf.woff2") format("woff2");font-display:swap;}@font-face {font-family:'Source Code Pro';font-style:italic;font-weight:400;src:url("SourceCodePro-It-1cc31594bf4f1f79.ttf.woff2") format("woff2");font-display:swap;}@font-face {font-family:'Source Code Pro';font-style:normal;font-weight:600;src:url("SourceCodePro-Semibold-d899c5a5c4aeb14a.ttf.woff2") format("woff2");font-display:swap;}@font-face {font-family:'NanumBarunGothic';src:url("NanumBarunGothic-0f09457c7a19b7c6.ttf.woff2") format("woff2");font-display:swap;unicode-range:U+AC00-D7AF,U+1100-11FF,U+3130-318F,U+A960-A97F,U+D7B0-D7FF;}*{box-sizing:border-box;}body{font:1rem/1.5 "Source Serif 4",NanumBarunGothic,serif;margin:0;position:relative;overflow-wrap:break-word;overflow-wrap:anywhere;font-feature-settings:"kern","liga";background-color:var(--main-background-color);color:var(--main-color);}h1{font-size:1.5rem;}h2{font-size:1.375rem;}h3{font-size:1.25rem;}h1,h2,h3,h4,h5,h6{font-weight:500;}h1,h2,h3,h4{margin:25px 0 15px 0;padding-bottom:6px;}.docblock h3,.docblock h4,h5,h6{margin:15px 0 5px 0;}.docblock>h2:first-child,.docblock>h3:first-child,.docblock>h4:first-child,.docblock>h5:first-child,.docblock>h6:first-child{margin-top:0;}.main-heading h1{margin:0;padding:0;flex-grow:1;overflow-wrap:break-word;overflow-wrap:anywhere;}.main-heading{display:flex;flex-wrap:wrap;padding-bottom:6px;margin-bottom:15px;}.content h2,.top-doc .docblock>h3,.top-doc .docblock>h4{border-bottom:1px solid var(--headings-border-bottom-color);}h1,h2{line-height:1.25;padding-top:3px;padding-bottom:9px;}h3.code-header{font-size:1.125rem;}h4.code-header{font-size:1rem;}.code-header{font-weight:600;margin:0;padding:0;white-space:pre-wrap;}#crate-search,h1,h2,h3,h4,h5,h6,.sidebar,.mobile-topbar,.search-input,.search-results .result-name,.item-name>a,.out-of-band,span.since,a.src,#help-button>a,summary.hideme,.scraped-example-list,ul.all-items{font-family:"Fira Sans",Arial,NanumBarunGothic,sans-serif;}#toggle-all-docs,a.anchor,.section-header a,#src-sidebar a,.rust a,.sidebar h2 a,.sidebar h3 a,.mobile-topbar h2 a,h1 a,.search-results a,.stab,.result-name i{color:var(--main-color);}span.enum,a.enum,span.struct,a.struct,span.union,a.union,span.primitive,a.primitive,span.type,a.type,span.foreigntype,a.foreigntype{color:var(--type-link-color);}span.trait,a.trait,span.traitalias,a.traitalias{color:var(--trait-link-color);}span.associatedtype,a.associatedtype,span.constant,a.constant,span.static,a.static{color:var(--assoc-item-link-color);}span.fn,a.fn,span.method,a.method,span.tymethod,a.tymethod{color:var(--function-link-color);}span.attr,a.attr,span.derive,a.derive,span.macro,a.macro{color:var(--macro-link-color);}span.mod,a.mod{color:var(--mod-link-color);}span.keyword,a.keyword{color:var(--keyword-link-color);}a{color:var(--link-color);text-decoration:none;}ol,ul{padding-left:24px;}ul ul,ol ul,ul ol,ol ol{margin-bottom:.625em;}p,.docblock>.warning{margin:0 0 .75em 0;}p:last-child,.docblock>.warning:last-child{margin:0;}button{padding:1px 6px;cursor:pointer;}button#toggle-all-docs{padding:0;background:none;border:none;-webkit-appearance:none;opacity:1;}.rustdoc{display:flex;flex-direction:row;flex-wrap:nowrap;}main{position:relative;flex-grow:1;padding:10px 15px 40px 45px;min-width:0;}.src main{padding:15px;}.width-limiter{max-width:960px;margin-right:auto;}details:not(.toggle) summary{margin-bottom:.6em;}code,pre,a.test-arrow,.code-header{font-family:"Source Code Pro",monospace;}.docblock code,.docblock-short code{border-radius:3px;padding:0 0.125em;}.docblock pre code,.docblock-short pre code{padding:0;}pre{padding:14px;line-height:1.5;}pre.item-decl{overflow-x:auto;}.item-decl .type-contents-toggle{contain:initial;}.src .content pre{padding:20px;}.rustdoc.src .example-wrap pre.src-line-numbers{padding:20px 0 20px 4px;}img{max-width:100%;}.sub-logo-container,.logo-container{line-height:0;display:block;}.sub-logo-container{margin-right:32px;}.sub-logo-container>img{height:60px;width:60px;object-fit:contain;}.rust-logo{filter:var(--rust-logo-filter);}.sidebar{font-size:0.875rem;flex:0 0 var(--desktop-sidebar-width);width:var(--desktop-sidebar-width);overflow-y:scroll;overscroll-behavior:contain;position:sticky;height:100vh;top:0;left:0;z-index:var(--desktop-sidebar-z-index);}.rustdoc.src .sidebar{flex-basis:50px;border-right:1px solid;overflow-x:hidden;overflow-y:hidden;}.hide-sidebar .sidebar,.hide-sidebar .sidebar-resizer{display:none;}.sidebar-resizer{touch-action:none;width:9px;cursor:col-resize;z-index:calc(var(--desktop-sidebar-z-index) + 1);position:fixed;height:100%;left:calc(var(--desktop-sidebar-width) + 1px);}.rustdoc.src .sidebar-resizer{left:49px;}.src-sidebar-expanded .rustdoc.src .sidebar-resizer{left:var(--src-sidebar-width);}.sidebar-resizing{-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none;}.sidebar-resizing*{cursor:col-resize !important;}.sidebar-resizing .sidebar{position:fixed;}.sidebar-resizing>body{padding-left:var(--resizing-sidebar-width);}.sidebar-resizer:hover,.sidebar-resizer:active,.sidebar-resizer:focus,.sidebar-resizer.active{width:10px;margin:0;left:var(--desktop-sidebar-width);border-left:solid 1px var(--sidebar-resizer-hover);}.src-sidebar-expanded .rustdoc.src .sidebar-resizer:hover,.src-sidebar-expanded .rustdoc.src .sidebar-resizer:active,.src-sidebar-expanded .rustdoc.src .sidebar-resizer:focus,.src-sidebar-expanded .rustdoc.src .sidebar-resizer.active{left:calc(var(--src-sidebar-width) - 1px);}@media (pointer:coarse){.sidebar-resizer{display:none !important;}}.sidebar-resizer.active{padding:0 140px;width:2px;margin-left:-140px;border-left:none;}.sidebar-resizer.active:before{border-left:solid 2px var(--sidebar-resizer-active);display:block;height:100%;content:"";}.sidebar,.mobile-topbar,.sidebar-menu-toggle,#src-sidebar-toggle,#src-sidebar{background-color:var(--sidebar-background-color);}#src-sidebar-toggle>button:hover,#src-sidebar-toggle>button:focus{background-color:var(--sidebar-background-color-hover);}.src .sidebar>*:not(#src-sidebar-toggle){visibility:hidden;}.src-sidebar-expanded .src .sidebar{overflow-y:auto;flex-basis:var(--src-sidebar-width);width:var(--src-sidebar-width);}.src-sidebar-expanded .src .sidebar>*:not(#src-sidebar-toggle){visibility:visible;}#all-types{margin-top:1em;}*{scrollbar-width:initial;scrollbar-color:var(--scrollbar-color);}.sidebar{scrollbar-width:thin;scrollbar-color:var(--scrollbar-color);}::-webkit-scrollbar{width:12px;}.sidebar::-webkit-scrollbar{width:8px;}::-webkit-scrollbar-track{-webkit-box-shadow:inset 0;background-color:var(--scrollbar-track-background-color);}.sidebar::-webkit-scrollbar-track{background-color:var(--scrollbar-track-background-color);}::-webkit-scrollbar-thumb,.sidebar::-webkit-scrollbar-thumb{background-color:var(--scrollbar-thumb-background-color);}.hidden{display:none !important;}.logo-container>img{height:48px;width:48px;}ul.block,.block li{padding:0;margin:0;list-style:none;}.sidebar-elems a,.sidebar>h2 a{display:block;padding:0.25rem;margin-left:-0.25rem;margin-right:0.25rem;}.sidebar h2{overflow-wrap:anywhere;padding:0;margin:0.7rem 0;}.sidebar h3{font-size:1.125rem;padding:0;margin:0;}.sidebar-elems,.sidebar>.version,.sidebar>h2{padding-left:24px;}.sidebar a{color:var(--sidebar-link-color);}.sidebar .current,.sidebar .current a,.sidebar-crate a.logo-container:hover+h2 a,.sidebar a:hover:not(.logo-container){background-color:var(--sidebar-current-link-background-color);}.sidebar-elems .block{margin-bottom:2em;}.sidebar-elems .block li a{white-space:nowrap;text-overflow:ellipsis;overflow:hidden;}.sidebar-crate{display:flex;align-items:center;justify-content:center;margin:14px 32px 1rem;row-gap:10px;column-gap:32px;flex-wrap:wrap;}.sidebar-crate h2{flex-grow:1;margin:0 -8px;align-self:start;}.sidebar-crate .logo-container{margin:0 -16px 0 -16px;text-align:center;}.sidebar-crate h2 a{display:block;margin:0 calc(-24px + 0.25rem) 0 -0.5rem;padding:calc((16px - 0.57rem ) / 2 ) 0.25rem;padding-left:0.5rem;}.sidebar-crate h2 .version{display:block;font-weight:normal;font-size:1rem;overflow-wrap:break-word;margin-top:calc((-16px + 0.57rem ) / 2 );}.sidebar-crate+.version{margin-top:-1rem;margin-bottom:1rem;}.mobile-topbar{display:none;}.rustdoc .example-wrap{display:flex;position:relative;margin-bottom:10px;}.rustdoc .example-wrap:last-child{margin-bottom:0px;}.rustdoc .example-wrap pre{margin:0;flex-grow:1;}.rustdoc:not(.src) .example-wrap pre{overflow:auto hidden;}.rustdoc .example-wrap pre.example-line-numbers,.rustdoc .example-wrap pre.src-line-numbers{flex-grow:0;min-width:fit-content;overflow:initial;text-align:right;-webkit-user-select:none;user-select:none;padding:14px 8px;color:var(--src-line-numbers-span-color);}.rustdoc .example-wrap pre.src-line-numbers{padding:14px 0;}.src-line-numbers a,.src-line-numbers span{color:var(--src-line-numbers-span-color);padding:0 8px;}.src-line-numbers :target{background-color:transparent;border-right:none;padding:0 8px;}.src-line-numbers .line-highlighted{background-color:var(--src-line-number-highlighted-background-color);}.search-loading{text-align:center;}.docblock-short{overflow-wrap:break-word;overflow-wrap:anywhere;}.docblock :not(pre)>code,.docblock-short code{white-space:pre-wrap;}.top-doc .docblock h2{font-size:1.375rem;}.top-doc .docblock h3{font-size:1.25rem;}.top-doc .docblock h4,.top-doc .docblock h5{font-size:1.125rem;}.top-doc .docblock h6{font-size:1rem;}.docblock h5{font-size:1rem;}.docblock h6{font-size:0.875rem;}.docblock{margin-left:24px;position:relative;}.docblock>:not(.more-examples-toggle):not(.example-wrap){max-width:100%;overflow-x:auto;}.out-of-band{flex-grow:0;font-size:1.125rem;}.docblock code,.docblock-short code,pre,.rustdoc.src .example-wrap{background-color:var(--code-block-background-color);}#main-content{position:relative;}.docblock table{margin:.5em 0;border-collapse:collapse;}.docblock table td,.docblock table th{padding:.5em;border:1px solid var(--border-color);}.docblock table tbody tr:nth-child(2n){background:var(--table-alt-row-background-color);}div.where{white-space:pre-wrap;font-size:0.875rem;}.item-info{display:block;margin-left:24px;}.item-info code{font-size:0.875rem;}#main-content>.item-info{margin-left:0;}nav.sub{flex-grow:1;flex-flow:row nowrap;margin:4px 0 25px 0;display:flex;align-items:center;}.search-form{position:relative;display:flex;height:34px;flex-grow:1;}.src nav.sub{margin:0 0 15px 0;}.section-header{display:block;position:relative;}.section-header:hover>.anchor,.impl:hover>.anchor,.trait-impl:hover>.anchor,.variant:hover>.anchor{display:initial;}.anchor{display:none;position:absolute;left:-0.5em;background:none !important;}.anchor.field{left:-5px;}.section-header>.anchor{left:-15px;padding-right:8px;}h2.section-header>.anchor{padding-right:6px;}.main-heading a:hover,.example-wrap .rust a:hover,.all-items a:hover,.docblock a:not(.test-arrow):not(.scrape-help):not(.tooltip):hover,.docblock-short a:not(.test-arrow):not(.scrape-help):not(.tooltip):hover,.item-info a{text-decoration:underline;}.crate.block li.current a{font-weight:500;}table,.item-table{overflow-wrap:break-word;}.item-table{display:table;padding:0;margin:0;}.item-table>li{display:table-row;}.item-table>li>div{display:table-cell;}.item-table>li>.item-name{padding-right:1.25rem;}.search-results-title{margin-top:0;white-space:nowrap;display:flex;align-items:baseline;}#crate-search-div{position:relative;min-width:5em;}#crate-search{min-width:115px;padding:0 23px 0 4px;max-width:100%;text-overflow:ellipsis;border:1px solid var(--border-color);border-radius:4px;outline:none;cursor:pointer;-moz-appearance:none;-webkit-appearance:none;text-indent:0.01px;background-color:var(--main-background-color);color:inherit;line-height:1.5;font-weight:500;}#crate-search:hover,#crate-search:focus{border-color:var(--crate-search-hover-border);}#crate-search-div::after{pointer-events:none;width:100%;height:100%;position:absolute;top:0;left:0;content:"";background-repeat:no-repeat;background-size:20px;background-position:calc(100% - 2px) 56%;background-image:url('data:image/svg+xml, \ + ');filter:var(--crate-search-div-filter);}#crate-search-div:hover::after,#crate-search-div:focus-within::after{filter:var(--crate-search-div-hover-filter);}#crate-search>option{font-size:1rem;}.search-input{-webkit-appearance:none;outline:none;border:1px solid var(--border-color);border-radius:2px;padding:8px;font-size:1rem;flex-grow:1;background-color:var(--button-background-color);color:var(--search-color);}.search-input:focus{border-color:var(--search-input-focused-border-color);}.search-results{display:none;}.search-results.active{display:block;}.search-results>a{display:flex;margin-left:2px;margin-right:2px;border-bottom:1px solid var(--search-result-border-color);gap:1em;}.search-results>a>div.desc{white-space:nowrap;text-overflow:ellipsis;overflow:hidden;flex:2;}.search-results a:hover,.search-results a:focus{background-color:var(--search-result-link-focus-background-color);}.search-results .result-name{display:flex;align-items:center;justify-content:start;flex:3;}.search-results .result-name .alias{color:var(--search-results-alias-color);}.search-results .result-name .grey{color:var(--search-results-grey-color);}.search-results .result-name .typename{color:var(--search-results-grey-color);font-size:0.875rem;width:var(--search-typename-width);}.search-results .result-name .path{word-break:break-all;max-width:calc(100% - var(--search-typename-width));display:inline-block;}.search-results .result-name .path>*{display:inline;}.popover{position:absolute;top:100%;right:0;z-index:calc(var(--desktop-sidebar-z-index) + 1);margin-top:7px;border-radius:3px;border:1px solid var(--border-color);background-color:var(--main-background-color);color:var(--main-color);--popover-arrow-offset:11px;}.popover::before{content:'';position:absolute;right:var(--popover-arrow-offset);border:solid var(--border-color);border-width:1px 1px 0 0;background-color:var(--main-background-color);padding:4px;transform:rotate(-45deg);top:-5px;}.setting-line{margin:1.2em 0.6em;}.setting-radio input,.setting-check input{margin-right:0.3em;height:1.2rem;width:1.2rem;border:2px solid var(--settings-input-border-color);outline:none;-webkit-appearance:none;cursor:pointer;}.setting-radio input{border-radius:50%;}.setting-radio span,.setting-check span{padding-bottom:1px;}.setting-radio{margin-top:0.1em;margin-bottom:0.1em;min-width:3.8em;padding:0.3em;display:inline-flex;align-items:center;cursor:pointer;}.setting-radio+.setting-radio{margin-left:0.5em;}.setting-check{margin-right:20px;display:flex;align-items:center;cursor:pointer;}.setting-radio input:checked{box-shadow:inset 0 0 0 3px var(--main-background-color);background-color:var(--settings-input-color);}.setting-check input:checked{background-color:var(--settings-input-color);border-width:1px;content:url('data:image/svg+xml,\ + \ + ');}.setting-radio input:focus,.setting-check input:focus{box-shadow:0 0 1px 1px var(--settings-input-color);}.setting-radio input:checked:focus{box-shadow:inset 0 0 0 3px var(--main-background-color),0 0 2px 2px var(--settings-input-color);}.setting-radio input:hover,.setting-check input:hover{border-color:var(--settings-input-color) !important;}#help.popover{max-width:600px;--popover-arrow-offset:48px;}#help dt{float:left;clear:left;margin-right:0.5rem;}#help span.top,#help span.bottom{text-align:center;display:block;font-size:1.125rem;}#help span.top{margin:10px 0;border-bottom:1px solid var(--border-color);padding-bottom:4px;margin-bottom:6px;}#help span.bottom{clear:both;border-top:1px solid var(--border-color);}.side-by-side>div{width:50%;float:left;padding:0 20px 20px 17px;}.item-info .stab{display:block;padding:3px;margin-bottom:5px;}.item-name .stab{margin-left:0.3125em;}.stab{padding:0 2px;font-size:0.875rem;font-weight:normal;color:var(--main-color);background-color:var(--stab-background-color);width:fit-content;white-space:pre-wrap;border-radius:3px;display:inline;vertical-align:baseline;}.stab.portability>code{background:none;color:var(--stab-code-color);}.stab .emoji,.item-info .stab::before{font-size:1.25rem;}.stab .emoji{margin-right:0.3rem;}.item-info .stab::before{content:"\0";width:0;display:inline-block;color:transparent;}.emoji{text-shadow:1px 0 0 black,-1px 0 0 black,0 1px 0 black,0 -1px 0 black;}.since{font-weight:normal;font-size:initial;}.rightside{padding-left:12px;float:right;}.rightside:not(a),.out-of-band{color:var(--right-side-color);}pre.rust{tab-size:4;-moz-tab-size:4;}pre.rust .kw{color:var(--code-highlight-kw-color);}pre.rust .kw-2{color:var(--code-highlight-kw-2-color);}pre.rust .lifetime{color:var(--code-highlight-lifetime-color);}pre.rust .prelude-ty{color:var(--code-highlight-prelude-color);}pre.rust .prelude-val{color:var(--code-highlight-prelude-val-color);}pre.rust .string{color:var(--code-highlight-string-color);}pre.rust .number{color:var(--code-highlight-number-color);}pre.rust .bool-val{color:var(--code-highlight-literal-color);}pre.rust .self{color:var(--code-highlight-self-color);}pre.rust .attr{color:var(--code-highlight-attribute-color);}pre.rust .macro,pre.rust .macro-nonterminal{color:var(--code-highlight-macro-color);}pre.rust .question-mark{font-weight:bold;color:var(--code-highlight-question-mark-color);}pre.rust .comment{color:var(--code-highlight-comment-color);}pre.rust .doccomment{color:var(--code-highlight-doc-comment-color);}.rustdoc.src .example-wrap pre.rust a{background:var(--codeblock-link-background);}.example-wrap.compile_fail,.example-wrap.should_panic{border-left:2px solid var(--codeblock-error-color);}.ignore.example-wrap{border-left:2px solid var(--codeblock-ignore-color);}.example-wrap.compile_fail:hover,.example-wrap.should_panic:hover{border-left:2px solid var(--codeblock-error-hover-color);}.example-wrap.ignore:hover{border-left:2px solid var(--codeblock-ignore-hover-color);}.example-wrap.compile_fail .tooltip,.example-wrap.should_panic .tooltip{color:var(--codeblock-error-color);}.example-wrap.ignore .tooltip{color:var(--codeblock-ignore-color);}.example-wrap.compile_fail:hover .tooltip,.example-wrap.should_panic:hover .tooltip{color:var(--codeblock-error-hover-color);}.example-wrap.ignore:hover .tooltip{color:var(--codeblock-ignore-hover-color);}.example-wrap .tooltip{position:absolute;display:block;left:-25px;top:5px;margin:0;line-height:1;}.example-wrap.compile_fail .tooltip,.example-wrap.should_panic .tooltip,.example-wrap.ignore .tooltip{font-weight:bold;font-size:1.25rem;}.content .docblock .warning{border-left:2px solid var(--warning-border-color);padding:14px;position:relative;overflow-x:visible !important;}.content .docblock .warning::before{color:var(--warning-border-color);content:"ⓘ";position:absolute;left:-25px;top:5px;font-weight:bold;font-size:1.25rem;}a.test-arrow{visibility:hidden;position:absolute;padding:5px 10px 5px 10px;border-radius:5px;font-size:1.375rem;top:5px;right:5px;z-index:1;color:var(--test-arrow-color);background-color:var(--test-arrow-background-color);}a.test-arrow:hover{color:var(--test-arrow-hover-color);background-color:var(--test-arrow-hover-background-color);}.example-wrap:hover .test-arrow{visibility:visible;}.code-attribute{font-weight:300;color:var(--code-attribute-color);}.item-spacer{width:100%;height:12px;display:block;}.out-of-band>span.since{font-size:1.25rem;}.sub-variant h4{font-size:1rem;font-weight:400;margin-top:0;margin-bottom:0;}.sub-variant{margin-left:24px;margin-bottom:40px;}.sub-variant>.sub-variant-field{margin-left:24px;}:target{padding-right:3px;background-color:var(--target-background-color);border-right:3px solid var(--target-border-color);}.code-header a.tooltip{color:inherit;margin-right:15px;position:relative;}.code-header a.tooltip:hover{color:var(--link-color);}a.tooltip:hover::after{position:absolute;top:calc(100% - 10px);left:-15px;right:-15px;height:20px;content:"\00a0";}.fade-out{opacity:0;transition:opacity 0.45s cubic-bezier(0,0,0.1,1.0);}.popover.tooltip .content{margin:0.25em 0.5em;}.popover.tooltip .content pre,.popover.tooltip .content code{background:transparent;margin:0;padding:0;font-size:1.25rem;white-space:pre-wrap;}.popover.tooltip .content>h3:first-child{margin:0 0 5px 0;}.search-failed{text-align:center;margin-top:20px;display:none;}.search-failed.active{display:block;}.search-failed>ul{text-align:left;max-width:570px;margin-left:auto;margin-right:auto;}#search-tabs{display:flex;flex-direction:row;gap:1px;margin-bottom:4px;}#search-tabs button{text-align:center;font-size:1.125rem;border:0;border-top:2px solid;flex:1;line-height:1.5;color:inherit;}#search-tabs button:not(.selected){background-color:var(--search-tab-button-not-selected-background);border-top-color:var(--search-tab-button-not-selected-border-top-color);}#search-tabs button:hover,#search-tabs button.selected{background-color:var(--search-tab-button-selected-background);border-top-color:var(--search-tab-button-selected-border-top-color);}#search-tabs .count{font-size:1rem;font-variant-numeric:tabular-nums;color:var(--search-tab-title-count-color);}#search .error code{border-radius:3px;background-color:var(--search-error-code-background-color);}.search-corrections{font-weight:normal;}#src-sidebar-toggle{position:sticky;top:0;left:0;font-size:1.25rem;border-bottom:1px solid;display:flex;height:40px;justify-content:stretch;align-items:stretch;z-index:10;}#src-sidebar{width:100%;overflow:auto;}#src-sidebar>.title{font-size:1.5rem;text-align:center;border-bottom:1px solid var(--border-color);margin-bottom:6px;}#src-sidebar div.files>a:hover,details.dir-entry summary:hover,#src-sidebar div.files>a:focus,details.dir-entry summary:focus{background-color:var(--src-sidebar-background-hover);}#src-sidebar div.files>a.selected{background-color:var(--src-sidebar-background-selected);}#src-sidebar-toggle>button{font-size:inherit;font-weight:bold;background:none;color:inherit;text-align:center;border:none;outline:none;flex:1 1;-webkit-appearance:none;opacity:1;}#settings-menu,#help-button{margin-left:4px;display:flex;}#sidebar-button{display:none;}.hide-sidebar #sidebar-button{display:flex;margin-right:4px;position:fixed;left:6px;height:34px;width:34px;background-color:var(--main-background-color);z-index:1;}#settings-menu>a,#help-button>a,#sidebar-button>a{display:flex;align-items:center;justify-content:center;background-color:var(--button-background-color);border:1px solid var(--border-color);border-radius:2px;color:var(--settings-button-color);font-size:20px;width:33px;}#settings-menu>a:hover,#settings-menu>a:focus,#help-button>a:hover,#help-button>a:focus,#sidebar-button>a:hover,#sidebar-button>a:focus{border-color:var(--settings-button-border-focus);}#sidebar-button>a:before{content:url('data:image/svg+xml,\ + \ + \ + ');width:22px;height:22px;}#copy-path{color:var(--copy-path-button-color);background:var(--main-background-color);height:34px;margin-left:10px;padding:0;padding-left:2px;border:0;width:33px;}#copy-path>img{filter:var(--copy-path-img-filter);}#copy-path:hover>img{filter:var(--copy-path-img-hover-filter);}@keyframes rotating{from{transform:rotate(0deg);}to{transform:rotate(360deg);}}#settings-menu.rotate>a img{animation:rotating 2s linear infinite;}kbd{display:inline-block;padding:3px 5px;font:15px monospace;line-height:10px;vertical-align:middle;border:solid 1px var(--border-color);border-radius:3px;color:var(--kbd-color);background-color:var(--kbd-background);box-shadow:inset 0 -1px 0 var(--kbd-box-shadow-color);}ul.all-items>li{list-style:none;}details.dir-entry{padding-left:4px;}details.dir-entry>summary{margin:0 0 0 -4px;padding:0 0 0 4px;cursor:pointer;}details.dir-entry div.folders,details.dir-entry div.files{padding-left:23px;}details.dir-entry a{display:block;}details.toggle{contain:layout;position:relative;}details.toggle>summary.hideme{cursor:pointer;font-size:1rem;}details.toggle>summary{list-style:none;outline:none;}details.toggle>summary::-webkit-details-marker,details.toggle>summary::marker{display:none;}details.toggle>summary.hideme>span{margin-left:9px;}details.toggle>summary::before{background:url('data:image/svg+xml,') no-repeat top left;content:"";cursor:pointer;width:16px;height:16px;display:inline-block;vertical-align:middle;opacity:.5;filter:var(--toggle-filter);}details.toggle>summary.hideme>span,.more-examples-toggle summary,.more-examples-toggle .hide-more{color:var(--toggles-color);}details.toggle>summary::after{content:"Expand";overflow:hidden;width:0;height:0;position:absolute;}details.toggle>summary.hideme::after{content:"";}details.toggle>summary:focus::before,details.toggle>summary:hover::before{opacity:1;}details.toggle>summary:focus-visible::before{outline:1px dotted #000;outline-offset:1px;}details.non-exhaustive{margin-bottom:8px;}details.toggle>summary.hideme::before{position:relative;}details.toggle>summary:not(.hideme)::before{position:absolute;left:-24px;top:4px;}.impl-items>details.toggle>summary:not(.hideme)::before{position:absolute;left:-24px;}details.toggle[open] >summary.hideme{position:absolute;}details.toggle[open] >summary.hideme>span{display:none;}details.toggle[open] >summary::before{background:url('data:image/svg+xml,') no-repeat top left;}details.toggle[open] >summary::after{content:"Collapse";}.docblock summary>*{display:inline-block;}.docblock>.example-wrap:first-child .tooltip{margin-top:16px;}@media (max-width:850px){#search-tabs .count{display:block;}}@media (max-width:700px){*[id]{scroll-margin-top:45px;}.hide-sidebar #sidebar-button{position:static;}.rustdoc{display:block;}main{padding-left:15px;padding-top:0px;}.main-heading{flex-direction:column;}.out-of-band{text-align:left;margin-left:initial;padding:initial;}.out-of-band .since::before{content:"Since ";}.sidebar .logo-container,.sidebar .location,.sidebar-resizer{display:none;}.sidebar{position:fixed;top:45px;left:-1000px;z-index:11;height:calc(100vh - 45px);width:200px;}.src main,.rustdoc.src .sidebar{top:0;padding:0;height:100vh;border:0;}.sidebar.shown,.src-sidebar-expanded .src .sidebar,.rustdoc:not(.src) .sidebar:focus-within{left:0;}.mobile-topbar h2{padding-bottom:0;margin:auto 0.5em auto auto;overflow:hidden;font-size:24px;}.mobile-topbar h2 a{display:block;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;}.mobile-topbar .logo-container>img{max-width:35px;max-height:35px;margin:5px 0 5px 20px;}.mobile-topbar{display:flex;flex-direction:row;position:sticky;z-index:10;font-size:2rem;height:45px;width:100%;left:0;top:0;}.hide-sidebar .mobile-topbar{display:none;}.sidebar-menu-toggle{width:45px;font-size:32px;border:none;color:var(--main-color);}.hide-sidebar .sidebar-menu-toggle{display:none;}.sidebar-elems{margin-top:1em;}.anchor{display:none !important;}#main-content>details.toggle>summary::before,#main-content>div>details.toggle>summary::before{left:-11px;}#src-sidebar-toggle{position:fixed;left:1px;top:100px;width:30px;font-size:1.5rem;padding:0;z-index:10;border-top-right-radius:3px;border-bottom-right-radius:3px;border:1px solid;border-left:0;}.src-sidebar-expanded #src-sidebar-toggle{left:unset;top:unset;width:unset;border-top-right-radius:unset;border-bottom-right-radius:unset;position:sticky;border:0;border-bottom:1px solid;}#copy-path,#help-button{display:none;}#sidebar-button>a:before{content:url('data:image/svg+xml,\ + \ + \ + ');width:22px;height:22px;}.item-table,.item-row,.item-table>li,.item-table>li>div,.search-results>a,.search-results>a>div{display:block;}.search-results>a{padding:5px 0px;}.search-results>a>div.desc,.item-table>li>div.desc{padding-left:2em;}.search-results .result-name{display:block;}.search-results .result-name .typename{width:initial;margin-right:0;}.search-results .result-name .typename,.search-results .result-name .path{display:inline;}.src-sidebar-expanded .src .sidebar{max-width:100vw;width:100vw;}details.toggle:not(.top-doc)>summary{margin-left:10px;}.impl-items>details.toggle>summary:not(.hideme)::before,#main-content>details.toggle:not(.top-doc)>summary::before,#main-content>div>details.toggle>summary::before{left:-11px;}.impl-items>.item-info{margin-left:34px;}.src nav.sub{margin:0;padding:var(--nav-sub-mobile-padding);}}@media (min-width:701px){.scraped-example-title{position:absolute;z-index:10;background:var(--main-background-color);bottom:8px;right:5px;padding:2px 4px;box-shadow:0 0 4px var(--main-background-color);}}@media print{nav.sidebar,nav.sub,.out-of-band,a.src,#copy-path,details.toggle[open] >summary::before,details.toggle>summary::before,details.toggle.top-doc>summary{display:none;}.docblock{margin-left:0;}main{padding:10px;}}@media (max-width:464px){.docblock{margin-left:12px;}.docblock code{overflow-wrap:break-word;overflow-wrap:anywhere;}nav.sub{flex-direction:column;}.search-form{align-self:stretch;}.sub-logo-container>img{height:35px;width:35px;margin-bottom:var(--nav-sub-mobile-padding);}}.variant,.implementors-toggle>summary,.impl,#implementors-list>.docblock,.impl-items>section,.impl-items>.toggle>summary,.methods>section,.methods>.toggle>summary{margin-bottom:0.75em;}.variants>.docblock,.implementors-toggle>.docblock,.impl-items>.toggle[open]:not(:last-child),.methods>.toggle[open]:not(:last-child),.implementors-toggle[open]:not(:last-child){margin-bottom:2em;}#trait-implementations-list .impl-items>.toggle:not(:last-child),#synthetic-implementations-list .impl-items>.toggle:not(:last-child),#blanket-implementations-list .impl-items>.toggle:not(:last-child){margin-bottom:1em;}.scraped-example-list .scrape-help{margin-left:10px;padding:0 4px;font-weight:normal;font-size:12px;position:relative;bottom:1px;border:1px solid var(--scrape-example-help-border-color);border-radius:50px;color:var(--scrape-example-help-color);}.scraped-example-list .scrape-help:hover{border-color:var(--scrape-example-help-hover-border-color);color:var(--scrape-example-help-hover-color);}.scraped-example{position:relative;}.scraped-example .code-wrapper{position:relative;display:flex;flex-direction:row;flex-wrap:wrap;width:100%;}.scraped-example:not(.expanded) .code-wrapper{max-height:calc(1.5em * 5 + 10px);}.scraped-example:not(.expanded) .code-wrapper pre{overflow-y:hidden;padding-bottom:0;max-height:calc(1.5em * 5 + 10px);}.more-scraped-examples .scraped-example:not(.expanded) .code-wrapper,.more-scraped-examples .scraped-example:not(.expanded) .code-wrapper pre{max-height:calc(1.5em * 10 + 10px);}.scraped-example .code-wrapper .next,.scraped-example .code-wrapper .prev,.scraped-example .code-wrapper .expand{color:var(--main-color);position:absolute;top:0.25em;z-index:1;padding:0;background:none;border:none;-webkit-appearance:none;opacity:1;}.scraped-example .code-wrapper .prev{right:2.25em;}.scraped-example .code-wrapper .next{right:1.25em;}.scraped-example .code-wrapper .expand{right:0.25em;}.scraped-example:not(.expanded) .code-wrapper::before,.scraped-example:not(.expanded) .code-wrapper::after{content:" ";width:100%;height:5px;position:absolute;z-index:1;}.scraped-example:not(.expanded) .code-wrapper::before{top:0;background:linear-gradient(to bottom,var(--scrape-example-code-wrapper-background-start),var(--scrape-example-code-wrapper-background-end));}.scraped-example:not(.expanded) .code-wrapper::after{bottom:0;background:linear-gradient(to top,var(--scrape-example-code-wrapper-background-start),var(--scrape-example-code-wrapper-background-end));}.scraped-example .code-wrapper .example-wrap{width:100%;overflow-y:hidden;margin-bottom:0;}.scraped-example:not(.expanded) .code-wrapper .example-wrap{overflow-x:hidden;}.scraped-example .example-wrap .rust span.highlight{background:var(--scrape-example-code-line-highlight);}.scraped-example .example-wrap .rust span.highlight.focus{background:var(--scrape-example-code-line-highlight-focus);}.more-examples-toggle{max-width:calc(100% + 25px);margin-top:10px;margin-left:-25px;}.more-examples-toggle .hide-more{margin-left:25px;cursor:pointer;}.more-scraped-examples{margin-left:25px;position:relative;}.toggle-line{position:absolute;top:5px;bottom:0;right:calc(100% + 10px);padding:0 4px;cursor:pointer;}.toggle-line-inner{min-width:2px;height:100%;background:var(--scrape-example-toggle-line-background);}.toggle-line:hover .toggle-line-inner{background:var(--scrape-example-toggle-line-hover-background);}.more-scraped-examples .scraped-example,.example-links{margin-top:20px;}.more-scraped-examples .scraped-example:first-child{margin-top:5px;}.example-links ul{margin-bottom:0;}:root[data-theme="light"]{--main-background-color:white;--main-color:black;--settings-input-color:#2196f3;--settings-input-border-color:#717171;--settings-button-color:#000;--settings-button-border-focus:#717171;--sidebar-background-color:#f5f5f5;--sidebar-background-color-hover:#e0e0e0;--code-block-background-color:#f5f5f5;--scrollbar-track-background-color:#dcdcdc;--scrollbar-thumb-background-color:rgba(36,37,39,0.6);--scrollbar-color:rgba(36,37,39,0.6) #d9d9d9;--headings-border-bottom-color:#ddd;--border-color:#e0e0e0;--button-background-color:#fff;--right-side-color:grey;--code-attribute-color:#999;--toggles-color:#999;--toggle-filter:none;--search-input-focused-border-color:#66afe9;--copy-path-button-color:#999;--copy-path-img-filter:invert(50%);--copy-path-img-hover-filter:invert(35%);--codeblock-error-hover-color:rgb(255,0,0);--codeblock-error-color:rgba(255,0,0,.5);--codeblock-ignore-hover-color:rgb(255,142,0);--codeblock-ignore-color:rgba(255,142,0,.6);--warning-border-color:#ff8e00;--type-link-color:#ad378a;--trait-link-color:#6e4fc9;--assoc-item-link-color:#3873ad;--function-link-color:#ad7c37;--macro-link-color:#068000;--keyword-link-color:#3873ad;--mod-link-color:#3873ad;--link-color:#3873ad;--sidebar-link-color:#356da4;--sidebar-current-link-background-color:#fff;--search-result-link-focus-background-color:#ccc;--search-result-border-color:#aaa3;--search-color:#000;--search-error-code-background-color:#d0cccc;--search-results-alias-color:#000;--search-results-grey-color:#999;--search-tab-title-count-color:#888;--search-tab-button-not-selected-border-top-color:#e6e6e6;--search-tab-button-not-selected-background:#e6e6e6;--search-tab-button-selected-border-top-color:#0089ff;--search-tab-button-selected-background:#fff;--stab-background-color:#fff5d6;--stab-code-color:#000;--code-highlight-kw-color:#8959a8;--code-highlight-kw-2-color:#4271ae;--code-highlight-lifetime-color:#b76514;--code-highlight-prelude-color:#4271ae;--code-highlight-prelude-val-color:#c82829;--code-highlight-number-color:#718c00;--code-highlight-string-color:#718c00;--code-highlight-literal-color:#c82829;--code-highlight-attribute-color:#c82829;--code-highlight-self-color:#c82829;--code-highlight-macro-color:#3e999f;--code-highlight-question-mark-color:#ff9011;--code-highlight-comment-color:#8e908c;--code-highlight-doc-comment-color:#4d4d4c;--src-line-numbers-span-color:#c67e2d;--src-line-number-highlighted-background-color:#fdffd3;--test-arrow-color:#f5f5f5;--test-arrow-background-color:rgba(78,139,202,0.2);--test-arrow-hover-color:#f5f5f5;--test-arrow-hover-background-color:rgb(78,139,202);--target-background-color:#fdffd3;--target-border-color:#ad7c37;--kbd-color:#000;--kbd-background:#fafbfc;--kbd-box-shadow-color:#c6cbd1;--rust-logo-filter:initial;--crate-search-div-filter:invert(100%) sepia(0%) saturate(4223%) hue-rotate(289deg) brightness(114%) contrast(76%);--crate-search-div-hover-filter:invert(44%) sepia(18%) saturate(23%) hue-rotate(317deg) brightness(96%) contrast(93%);--crate-search-hover-border:#717171;--src-sidebar-background-selected:#fff;--src-sidebar-background-hover:#e0e0e0;--table-alt-row-background-color:#f5f5f5;--codeblock-link-background:#eee;--scrape-example-toggle-line-background:#ccc;--scrape-example-toggle-line-hover-background:#999;--scrape-example-code-line-highlight:#fcffd6;--scrape-example-code-line-highlight-focus:#f6fdb0;--scrape-example-help-border-color:#555;--scrape-example-help-color:#333;--scrape-example-help-hover-border-color:#000;--scrape-example-help-hover-color:#000;--scrape-example-code-wrapper-background-start:rgba(255,255,255,1);--scrape-example-code-wrapper-background-end:rgba(255,255,255,0);--sidebar-resizer-hover:hsl(207,90%,66%);--sidebar-resizer-active:hsl(207,90%,54%);}:root[data-theme="dark"]{--main-background-color:#353535;--main-color:#ddd;--settings-input-color:#2196f3;--settings-input-border-color:#999;--settings-button-color:#000;--settings-button-border-focus:#ffb900;--sidebar-background-color:#505050;--sidebar-background-color-hover:#676767;--code-block-background-color:#2A2A2A;--scrollbar-track-background-color:#717171;--scrollbar-thumb-background-color:rgba(32,34,37,.6);--scrollbar-color:rgba(32,34,37,.6) #5a5a5a;--headings-border-bottom-color:#d2d2d2;--border-color:#e0e0e0;--button-background-color:#f0f0f0;--right-side-color:grey;--code-attribute-color:#999;--toggles-color:#999;--toggle-filter:invert(100%);--search-input-focused-border-color:#008dfd;--copy-path-button-color:#999;--copy-path-img-filter:invert(50%);--copy-path-img-hover-filter:invert(65%);--codeblock-error-hover-color:rgb(255,0,0);--codeblock-error-color:rgba(255,0,0,.5);--codeblock-ignore-hover-color:rgb(255,142,0);--codeblock-ignore-color:rgba(255,142,0,.6);--warning-border-color:#ff8e00;--type-link-color:#2dbfb8;--trait-link-color:#b78cf2;--assoc-item-link-color:#d2991d;--function-link-color:#2bab63;--macro-link-color:#09bd00;--keyword-link-color:#d2991d;--mod-link-color:#d2991d;--link-color:#d2991d;--sidebar-link-color:#fdbf35;--sidebar-current-link-background-color:#444;--search-result-link-focus-background-color:#616161;--search-result-border-color:#aaa3;--search-color:#111;--search-error-code-background-color:#484848;--search-results-alias-color:#fff;--search-results-grey-color:#ccc;--search-tab-title-count-color:#888;--search-tab-button-not-selected-border-top-color:#252525;--search-tab-button-not-selected-background:#252525;--search-tab-button-selected-border-top-color:#0089ff;--search-tab-button-selected-background:#353535;--stab-background-color:#314559;--stab-code-color:#e6e1cf;--code-highlight-kw-color:#ab8ac1;--code-highlight-kw-2-color:#769acb;--code-highlight-lifetime-color:#d97f26;--code-highlight-prelude-color:#769acb;--code-highlight-prelude-val-color:#ee6868;--code-highlight-number-color:#83a300;--code-highlight-string-color:#83a300;--code-highlight-literal-color:#ee6868;--code-highlight-attribute-color:#ee6868;--code-highlight-self-color:#ee6868;--code-highlight-macro-color:#3e999f;--code-highlight-question-mark-color:#ff9011;--code-highlight-comment-color:#8d8d8b;--code-highlight-doc-comment-color:#8ca375;--src-line-numbers-span-color:#3b91e2;--src-line-number-highlighted-background-color:#0a042f;--test-arrow-color:#dedede;--test-arrow-background-color:rgba(78,139,202,0.2);--test-arrow-hover-color:#dedede;--test-arrow-hover-background-color:#4e8bca;--target-background-color:#494a3d;--target-border-color:#bb7410;--kbd-color:#000;--kbd-background:#fafbfc;--kbd-box-shadow-color:#c6cbd1;--rust-logo-filter:drop-shadow(1px 0 0px #fff) drop-shadow(0 1px 0 #fff) drop-shadow(-1px 0 0 #fff) drop-shadow(0 -1px 0 #fff);--crate-search-div-filter:invert(94%) sepia(0%) saturate(721%) hue-rotate(255deg) brightness(90%) contrast(90%);--crate-search-div-hover-filter:invert(69%) sepia(60%) saturate(6613%) hue-rotate(184deg) brightness(100%) contrast(91%);--crate-search-hover-border:#2196f3;--src-sidebar-background-selected:#333;--src-sidebar-background-hover:#444;--table-alt-row-background-color:#2a2a2a;--codeblock-link-background:#333;--scrape-example-toggle-line-background:#999;--scrape-example-toggle-line-hover-background:#c5c5c5;--scrape-example-code-line-highlight:#5b3b01;--scrape-example-code-line-highlight-focus:#7c4b0f;--scrape-example-help-border-color:#aaa;--scrape-example-help-color:#eee;--scrape-example-help-hover-border-color:#fff;--scrape-example-help-hover-color:#fff;--scrape-example-code-wrapper-background-start:rgba(53,53,53,1);--scrape-example-code-wrapper-background-end:rgba(53,53,53,0);--sidebar-resizer-hover:hsl(207,30%,54%);--sidebar-resizer-active:hsl(207,90%,54%);}:root[data-theme="ayu"]{--main-background-color:#0f1419;--main-color:#c5c5c5;--settings-input-color:#ffb454;--settings-input-border-color:#999;--settings-button-color:#fff;--settings-button-border-focus:#e0e0e0;--sidebar-background-color:#14191f;--sidebar-background-color-hover:rgba(70,70,70,0.33);--code-block-background-color:#191f26;--scrollbar-track-background-color:transparent;--scrollbar-thumb-background-color:#5c6773;--scrollbar-color:#5c6773 #24292f;--headings-border-bottom-color:#5c6773;--border-color:#5c6773;--button-background-color:#141920;--right-side-color:grey;--code-attribute-color:#999;--toggles-color:#999;--toggle-filter:invert(100%);--search-input-focused-border-color:#5c6773;--copy-path-button-color:#fff;--copy-path-img-filter:invert(70%);--copy-path-img-hover-filter:invert(100%);--codeblock-error-hover-color:rgb(255,0,0);--codeblock-error-color:rgba(255,0,0,.5);--codeblock-ignore-hover-color:rgb(255,142,0);--codeblock-ignore-color:rgba(255,142,0,.6);--warning-border-color:#ff8e00;--type-link-color:#ffa0a5;--trait-link-color:#39afd7;--assoc-item-link-color:#39afd7;--function-link-color:#fdd687;--macro-link-color:#a37acc;--keyword-link-color:#39afd7;--mod-link-color:#39afd7;--link-color:#39afd7;--sidebar-link-color:#53b1db;--sidebar-current-link-background-color:transparent;--search-result-link-focus-background-color:#3c3c3c;--search-result-border-color:#aaa3;--search-color:#fff;--search-error-code-background-color:#4f4c4c;--search-results-alias-color:#c5c5c5;--search-results-grey-color:#999;--search-tab-title-count-color:#888;--search-tab-button-not-selected-border-top-color:none;--search-tab-button-not-selected-background:transparent !important;--search-tab-button-selected-border-top-color:none;--search-tab-button-selected-background:#141920 !important;--stab-background-color:#314559;--stab-code-color:#e6e1cf;--code-highlight-kw-color:#ff7733;--code-highlight-kw-2-color:#ff7733;--code-highlight-lifetime-color:#ff7733;--code-highlight-prelude-color:#69f2df;--code-highlight-prelude-val-color:#ff7733;--code-highlight-number-color:#b8cc52;--code-highlight-string-color:#b8cc52;--code-highlight-literal-color:#ff7733;--code-highlight-attribute-color:#e6e1cf;--code-highlight-self-color:#36a3d9;--code-highlight-macro-color:#a37acc;--code-highlight-question-mark-color:#ff9011;--code-highlight-comment-color:#788797;--code-highlight-doc-comment-color:#a1ac88;--src-line-numbers-span-color:#5c6773;--src-line-number-highlighted-background-color:rgba(255,236,164,0.06);--test-arrow-color:#788797;--test-arrow-background-color:rgba(57,175,215,0.09);--test-arrow-hover-color:#c5c5c5;--test-arrow-hover-background-color:rgba(57,175,215,0.368);--target-background-color:rgba(255,236,164,0.06);--target-border-color:rgba(255,180,76,0.85);--kbd-color:#c5c5c5;--kbd-background:#314559;--kbd-box-shadow-color:#5c6773;--rust-logo-filter:drop-shadow(1px 0 0px #fff) drop-shadow(0 1px 0 #fff) drop-shadow(-1px 0 0 #fff) drop-shadow(0 -1px 0 #fff);--crate-search-div-filter:invert(41%) sepia(12%) saturate(487%) hue-rotate(171deg) brightness(94%) contrast(94%);--crate-search-div-hover-filter:invert(98%) sepia(12%) saturate(81%) hue-rotate(343deg) brightness(113%) contrast(76%);--crate-search-hover-border:#e0e0e0;--src-sidebar-background-selected:#14191f;--src-sidebar-background-hover:#14191f;--table-alt-row-background-color:#191f26;--codeblock-link-background:#333;--scrape-example-toggle-line-background:#999;--scrape-example-toggle-line-hover-background:#c5c5c5;--scrape-example-code-line-highlight:#5b3b01;--scrape-example-code-line-highlight-focus:#7c4b0f;--scrape-example-help-border-color:#aaa;--scrape-example-help-color:#eee;--scrape-example-help-hover-border-color:#fff;--scrape-example-help-hover-color:#fff;--scrape-example-code-wrapper-background-start:rgba(15,20,25,1);--scrape-example-code-wrapper-background-end:rgba(15,20,25,0);--sidebar-resizer-hover:hsl(34,50%,33%);--sidebar-resizer-active:hsl(34,100%,66%);}:root[data-theme="ayu"] h1,:root[data-theme="ayu"] h2,:root[data-theme="ayu"] h3,:root[data-theme="ayu"] h4,:where(:root[data-theme="ayu"]) h1 a,:root[data-theme="ayu"] .sidebar h2 a,:root[data-theme="ayu"] .sidebar h3 a,:root[data-theme="ayu"] #source-sidebar>.title{color:#fff;}:root[data-theme="ayu"] .docblock code{color:#ffb454;}:root[data-theme="ayu"] .docblock a>code{color:#39AFD7 !important;}:root[data-theme="ayu"] .code-header,:root[data-theme="ayu"] .docblock pre>code,:root[data-theme="ayu"] pre,:root[data-theme="ayu"] pre>code,:root[data-theme="ayu"] .item-info code,:root[data-theme="ayu"] .rustdoc.source .example-wrap{color:#e6e1cf;}:root[data-theme="ayu"] .sidebar .current,:root[data-theme="ayu"] .sidebar .current a,:root[data-theme="ayu"] .sidebar a:hover,:root[data-theme="ayu"] #src-sidebar div.files>a:hover,:root[data-theme="ayu"] details.dir-entry summary:hover,:root[data-theme="ayu"] #src-sidebar div.files>a:focus,:root[data-theme="ayu"] details.dir-entry summary:focus,:root[data-theme="ayu"] #src-sidebar div.files>a.selected{color:#ffb44c;}:root[data-theme="ayu"] .sidebar-elems .location{color:#ff7733;}:root[data-theme="ayu"] .src-line-numbers .line-highlighted{color:#708090;padding-right:7px;border-right:1px solid #ffb44c;}:root[data-theme="ayu"] .search-results a:hover,:root[data-theme="ayu"] .search-results a:focus{color:#fff !important;background-color:#3c3c3c;}:root[data-theme="ayu"] .search-results a{color:#0096cf;}:root[data-theme="ayu"] .search-results a div.desc{color:#c5c5c5;}:root[data-theme="ayu"] .result-name .primitive>i,:root[data-theme="ayu"] .result-name .keyword>i{color:#788797;}:root[data-theme="ayu"] #search-tabs>button.selected{border-bottom:1px solid #ffb44c !important;border-top:none;}:root[data-theme="ayu"] #search-tabs>button:not(.selected){border:none;background-color:transparent !important;}:root[data-theme="ayu"] #search-tabs>button:hover{border-bottom:1px solid rgba(242,151,24,0.3);}:root[data-theme="ayu"] #settings-menu>a img,:root[data-theme="ayu"] #sidebar-button>a:before{filter:invert(100);} \ No newline at end of file diff --git a/static.files/scrape-examples-ef1e698c1d417c0c.js b/static.files/scrape-examples-ef1e698c1d417c0c.js new file mode 100644 index 0000000..ba830e3 --- /dev/null +++ b/static.files/scrape-examples-ef1e698c1d417c0c.js @@ -0,0 +1 @@ +"use strict";(function(){const DEFAULT_MAX_LINES=5;const HIDDEN_MAX_LINES=10;function scrollToLoc(elt,loc,isHidden){const lines=elt.querySelector(".src-line-numbers");let scrollOffset;const maxLines=isHidden?HIDDEN_MAX_LINES:DEFAULT_MAX_LINES;if(loc[1]-loc[0]>maxLines){const line=Math.max(0,loc[0]-1);scrollOffset=lines.children[line].offsetTop}else{const wrapper=elt.querySelector(".code-wrapper");const halfHeight=wrapper.offsetHeight/2;const offsetTop=lines.children[loc[0]].offsetTop;const lastLine=lines.children[loc[1]];const offsetBot=lastLine.offsetTop+lastLine.offsetHeight;const offsetMid=(offsetTop+offsetBot)/2;scrollOffset=offsetMid-halfHeight}lines.scrollTo(0,scrollOffset);elt.querySelector(".rust").scrollTo(0,scrollOffset)}function updateScrapedExample(example,isHidden){const locs=JSON.parse(example.attributes.getNamedItem("data-locs").textContent);let locIndex=0;const highlights=Array.prototype.slice.call(example.querySelectorAll(".highlight"));const link=example.querySelector(".scraped-example-title a");if(locs.length>1){const onChangeLoc=changeIndex=>{removeClass(highlights[locIndex],"focus");changeIndex();scrollToLoc(example,locs[locIndex][0],isHidden);addClass(highlights[locIndex],"focus");const url=locs[locIndex][1];const title=locs[locIndex][2];link.href=url;link.innerHTML=title};example.querySelector(".prev").addEventListener("click",()=>{onChangeLoc(()=>{locIndex=(locIndex-1+locs.length)%locs.length})});example.querySelector(".next").addEventListener("click",()=>{onChangeLoc(()=>{locIndex=(locIndex+1)%locs.length})})}const expandButton=example.querySelector(".expand");if(expandButton){expandButton.addEventListener("click",()=>{if(hasClass(example,"expanded")){removeClass(example,"expanded");scrollToLoc(example,locs[0][0],isHidden)}else{addClass(example,"expanded")}})}scrollToLoc(example,locs[0][0],isHidden)}const firstExamples=document.querySelectorAll(".scraped-example-list > .scraped-example");onEachLazy(firstExamples,el=>updateScrapedExample(el,false));onEachLazy(document.querySelectorAll(".more-examples-toggle"),toggle=>{onEachLazy(toggle.querySelectorAll(".toggle-line, .hide-more"),button=>{button.addEventListener("click",()=>{toggle.open=false})});const moreExamples=toggle.querySelectorAll(".scraped-example");toggle.querySelector("summary").addEventListener("click",()=>{setTimeout(()=>{onEachLazy(moreExamples,el=>updateScrapedExample(el,true))})},{once:true})})})() \ No newline at end of file diff --git a/static.files/search-2b6ce74ff89ae146.js b/static.files/search-2b6ce74ff89ae146.js new file mode 100644 index 0000000..0545970 --- /dev/null +++ b/static.files/search-2b6ce74ff89ae146.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 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 ROOT_PATH=typeof window!=="undefined"?window.rootPath:"../";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 functionTypeFingerprint;let currentResults;let typeNameIdMap;const ALIASES=new Map();let typeNameIdOfArray;let typeNameIdOfSlice;let typeNameIdOfArrayOrSlice;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 isErrorCharacter(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 isIdentCharacter(c){return(c==="_"||(c>="0"&&c<="9")||(c>="a"&&c<="z")||(c>="A"&&c<="Z"))}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{name:"never",id:null,fullPath:["never"],pathWithoutLast:[],pathLast:"never",normalizedPathLast:"never",generics:[],bindings:new Map(),typeFilter:"primitive",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){bindings.set(gen.bindingName.name,[gen,...gen.bindingName.generics]);return false}return true}),bindings,typeFilter,bindingName,}}function getIdentEndPosition(parserState){const start=parserState.pos;let end=parserState.pos;let foundExclamation=-1;while(parserState.pos=end){throw["Found generics without a path"]}parserState.pos+=1;getItemsBefore(query,parserState,generics,">")}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 start=parserState.pos;const oldTypeFilter=parserState.typeFilter;parserState.typeFilter=null;const oldIsInBinding=parserState.isInBinding;parserState.isInBinding=null;let extra="";if(endChar===">"){extra="<"}else if(endChar==="]"){extra="["}else if(endChar===""){extra="->"}else{extra=endChar}while(parserState.pos"]}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;start=parserState.pos;getNextElem(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;parserState.typeFilter=oldTypeFilter;parserState.isInBinding=oldIsInBinding}function checkExtraTypeFilterCharacters(start,parserState){const query=parserState.userQuery.slice(start,parserState.pos).trim();for(const c in query){if(!isIdentCharacter(query[c])){throw["Unexpected ",query[c]," in type filter (before ",":",")",]}}}function parseInput(query,parserState){let foundStopChar=true;let start=parserState.pos;while(parserState.pos"){if(isReturnArrow(parserState)){break}throw["Unexpected ",c," (did you mean ","->","?)"]}throw["Unexpected ",c]}else if(c===":"&&!isPathStart(parserState)){if(parserState.typeFilter!==null){throw["Unexpected ",":"," (expected path after type filter ",parserState.typeFilter+":",")",]}else if(query.elems.length===0){throw["Expected type filter before ",":"]}else if(query.literalSearch){throw["Cannot use quotes on type filter"]}const typeFilterElem=query.elems.pop();checkExtraTypeFilterCharacters(start,parserState);parserState.typeFilter=typeFilterElem.name;parserState.pos+=1;parserState.totalElems-=1;query.literalSearch=false;foundStopChar=true;continue}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;start=parserState.pos;getNextElem(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,}}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=obj.displayPath+obj.name;obj.fullPath+="|"+obj.ty;if(duplicates.has(obj.fullPath)){continue}duplicates.add(obj.fullPath);obj.href=res[1];out.push(obj);if(out.length>=MAX_RESULTS){break}}}return out}function sortResults(results,isType,preferredCrate){if(results.size===0){return[]}const userQuery=parsedQuery.userQuery;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.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=aaa.item.deprecated;b=bbb.item.deprecated;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=(aaa.item.desc==="");b=(bbb.item.desc==="");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){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,whereClause,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)){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)){return true}}else if(unifyFunctionTypes([...fnType.generics,...Array.from(fnType.bindings.values()).flat()],queryElems,whereClause,mgens?new Map(mgens):null,solutionCb)){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,whereClause,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);if(!solution){return false}const simplifiedGenerics=solution.simplifiedGenerics;for(const simplifiedMgens of solution.mgens){const passesUnification=unifyFunctionTypes(simplifiedGenerics,queryElem.generics,whereClause,simplifiedMgens,solutionCb);if(passesUnification){return true}}return false});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)){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);if(passesUnification){return true}}return false}function unifyFunctionTypeIsMatchCandidate(fnType,queryElem,whereClause,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(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});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){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)}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)}return false}function checkIfInList(list,elem,whereClause,mgens){for(const entry of list){if(checkType(entry,elem,whereClause,mgens)){return true}}return false}function checkType(row,elem,whereClause,mgens){if(row.bindings.size===0&&elem.bindings.size===0){if(elem.id<0){return row.id<0||checkIfInList(row.generics,elem,whereClause,mgens)}if(row.id>0&&elem.id>0&&elem.pathWithoutLast.length===0&&typePassesFilter(elem.typeFilter,row.ty)&&elem.generics.length===0&&elem.id!==typeNameIdOfArrayOrSlice){return row.id===elem.id||checkIfInList(row.generics,elem,whereClause,mgens)}}return unifyFunctionTypes([row],[elem],whereClause,mgens)}function checkPath(contains,ty,maxEditDistance){if(contains.length===0){return 0}let ret_dist=maxEditDistance+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;xmaxEditDistance){continue pathiter}dist_total+=dist}ret_dist=Math.min(ret_dist,Math.round(dist_total/clength))}return 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,desc:item.desc,ty:item.ty,parent:item.parent,type:item.type,is_alias:true,deprecated:item.deprecated,implDisambiguator:item.implDisambiguator,}}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{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(pushFunc);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);const returned=row.type&&row.type.output&&checkIfInList(row.type.output,elem,row.type.where_clause);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,maxEditDistance);if(path_dist>maxEditDistance){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+path_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)})){return}results.max_dist=Math.max(results.max_dist||0,tfpDist);addIntoResults(results,row.id,pos,0,tfpDist,0,Number.MAX_VALUE)}function innerRunQuery(){let queryLen=0;for(const elem of parsedQuery.elems){queryLen+=elem.name.length}for(const elem of parsedQuery.returned){queryLen+=elem.name.length}const maxEditDistance=Math.floor(queryLen/3);const genericSymbols=new Map();function convertNameToId(elem,isAssocType){if(typeNameIdMap.has(elem.normalizedPathLast)&&(isAssocType||!typeNameIdMap.get(elem.normalizedPathLast).assocOnly)){elem.id=typeNameIdMap.get(elem.normalizedPathLast).id}else if(!parsedQuery.literalSearch){let match=null;let matchDist=maxEditDistance+1;let matchName="";for(const[name,{id,assocOnly}]of typeNameIdMap){const dist=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");if(tmp.endsWith("")){return tmp.slice(0,tmp.length-6)}return tmp}function addTab(array,query,display){const extraClass=display?" active":"";const output=document.createElement("div");if(array.length>0){output.className="search-results "+extraClass;array.forEach(item=>{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""}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=addTab(results.others,results.query,true);const ret_in_args=addTab(results.in_args,results.query,false);const ret_returned=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)}}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="Results for "+query.original+" - Rust";updateSearchHistory(buildUrl(query.original,filterCrates));showResults(execQuery(query,filterCrates,window.currentCrate),params.go_to_first,filterCrates)}function buildItemSearchTypeAll(types,lowercasePaths){return types.map(type=>buildItemSearchType(type,lowercasePaths))}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=[];bindings=new Map()}else{pathIndex=type[PATH_INDEX_DATA];generics=buildItemSearchTypeAll(type[GENERICS_DATA],lowercasePaths);if(type.length>BINDINGS_DATA){bindings=new Map(type[BINDINGS_DATA].map(binding=>{const[assocType,constraints]=binding;return[buildItemSearchType(assocType,lowercasePaths,true).id,buildItemSearchTypeAll(constraints,lowercasePaths),]}))}else{bindings=new Map()}}if(pathIndex<0){return{id:pathIndex,ty:TY_GENERIC,path:null,generics,bindings,}}if(pathIndex===0){return{id:null,ty:null,path:null,generics,bindings,}}const item=lowercasePaths[pathIndex-1];return{id:buildTypeMapIndex(item.name,isAssocType),ty:item.ty,path:item.path,generics,bindings,}}function buildFunctionSearchType(functionSearchType,lowercasePaths){const INPUTS_DATA=0;const OUTPUT_DATA=1;if(functionSearchType===0){return null}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:[],bindings:new 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]}function buildIndex(rawSearchIndex){searchIndex=[];typeNameIdMap=new Map();const charA="A".charCodeAt(0);let currentIndex=0;let id=0;typeNameIdOfArray=buildTypeMapIndex("array");typeNameIdOfSlice=buildTypeMapIndex("slice");typeNameIdOfArrayOrSlice=buildTypeMapIndex("[]");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 crateRow={crate:crate,ty:3,name:crate,path:"",desc:crateCorpus.doc,parent:undefined,type:null,id:id,word:crate,normalizedName:crate.indexOf("_")===-1?crate:crate.replace(/_/g,""),deprecated:null,implDisambiguator:null,};id+=1;searchIndex.push(crateRow);currentIndex+=1;const itemTypes=crateCorpus.t;const itemNames=crateCorpus.n;const itemPaths=new Map(crateCorpus.q);const itemDescs=crateCorpus.d;const itemParentIdxs=crateCorpus.i;const itemFunctionSearchTypes=crateCorpus.f;const deprecatedItems=new Set(crateCorpus.c);const implDisambiguator=new Map(crateCorpus.b);const paths=crateCorpus.p;const aliases=crateCorpus.a;const 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}lowercasePaths.push({ty:ty,name:name.toLowerCase(),path:path});paths[i]={ty:ty,name:name,path:path}}lastPath="";len=itemTypes.length;for(let i=0;i0?paths[itemParentIdxs[i]-1]:undefined,type,id:id,word,normalizedName:word.indexOf("_")===-1?word:word.replace(/_/g,""),deprecated:deprecatedItems.has(i),implDisambiguator:implDisambiguator.has(i)?implDisambiguator.get(i):null,};id+=1;searchIndex.push(row);lastPath=row.path}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}}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/static.files/settings-4313503d2e1961c2.js b/static.files/settings-4313503d2e1961c2.js new file mode 100644 index 0000000..ab425fe --- /dev/null +++ b/static.files/settings-4313503d2e1961c2.js @@ -0,0 +1,17 @@ +"use strict";(function(){const isSettingsPage=window.location.pathname.endsWith("/settings.html");function changeSetting(settingName,value){if(settingName==="theme"){const useSystem=value==="system preference"?"true":"false";updateLocalStorage("use-system-theme",useSystem)}updateLocalStorage(settingName,value);switch(settingName){case"theme":case"preferred-dark-theme":case"preferred-light-theme":updateTheme();updateLightAndDark();break;case"line-numbers":if(value===true){window.rustdoc_add_line_numbers_to_examples()}else{window.rustdoc_remove_line_numbers_from_examples()}break;case"hide-sidebar":if(value===true){addClass(document.documentElement,"hide-sidebar")}else{removeClass(document.documentElement,"hide-sidebar")}break}}function showLightAndDark(){removeClass(document.getElementById("preferred-light-theme"),"hidden");removeClass(document.getElementById("preferred-dark-theme"),"hidden")}function hideLightAndDark(){addClass(document.getElementById("preferred-light-theme"),"hidden");addClass(document.getElementById("preferred-dark-theme"),"hidden")}function updateLightAndDark(){const useSystem=getSettingValue("use-system-theme");if(useSystem==="true"||(useSystem===null&&getSettingValue("theme")===null)){showLightAndDark()}else{hideLightAndDark()}}function setEvents(settingsElement){updateLightAndDark();onEachLazy(settingsElement.querySelectorAll("input[type=\"checkbox\"]"),toggle=>{const settingId=toggle.id;const settingValue=getSettingValue(settingId);if(settingValue!==null){toggle.checked=settingValue==="true"}toggle.onchange=()=>{changeSetting(toggle.id,toggle.checked)}});onEachLazy(settingsElement.querySelectorAll("input[type=\"radio\"]"),elem=>{const settingId=elem.name;let settingValue=getSettingValue(settingId);if(settingId==="theme"){const useSystem=getSettingValue("use-system-theme");if(useSystem==="true"||settingValue===null){settingValue=useSystem==="false"?"light":"system preference"}}if(settingValue!==null&&settingValue!=="null"){elem.checked=settingValue===elem.value}elem.addEventListener("change",ev=>{changeSetting(ev.target.name,ev.target.value)})})}function buildSettingsPageSections(settings){let output="";for(const setting of settings){const js_data_name=setting["js_name"];const setting_name=setting["name"];if(setting["options"]!==undefined){output+=`\ +
+
${setting_name}
+
`;onEach(setting["options"],option=>{const checked=option===setting["default"]?" checked":"";const full=`${js_data_name}-${option.replace(/ /g,"-")}`;output+=`\ + `});output+=`\ +
+
`}else{const checked=setting["default"]===true?" checked":"";output+=`\ +
\ + \ +
`}}return output}function buildSettingsPage(){const theme_names=getVar("themes").split(",").filter(t=>t);theme_names.push("light","dark","ayu");const settings=[{"name":"Theme","js_name":"theme","default":"system preference","options":theme_names.concat("system preference"),},{"name":"Preferred light theme","js_name":"preferred-light-theme","default":"light","options":theme_names,},{"name":"Preferred dark theme","js_name":"preferred-dark-theme","default":"dark","options":theme_names,},{"name":"Auto-hide item contents for large items","js_name":"auto-hide-large-items","default":true,},{"name":"Auto-hide item methods' documentation","js_name":"auto-hide-method-docs","default":false,},{"name":"Auto-hide trait implementation documentation","js_name":"auto-hide-trait-implementations","default":false,},{"name":"Directly go to item in search if there is only one result","js_name":"go-to-only-result","default":false,},{"name":"Show line numbers on code examples","js_name":"line-numbers","default":false,},{"name":"Hide persistent navigation bar","js_name":"hide-sidebar","default":false,},{"name":"Disable keyboard shortcuts","js_name":"disable-shortcuts","default":false,},];const elementKind=isSettingsPage?"section":"div";const innerHTML=`
${buildSettingsPageSections(settings)}
`;const el=document.createElement(elementKind);el.id="settings";if(!isSettingsPage){el.className="popover"}el.innerHTML=innerHTML;if(isSettingsPage){document.getElementById(MAIN_ID).appendChild(el)}else{el.setAttribute("tabindex","-1");getSettingsButton().appendChild(el)}return el}const settingsMenu=buildSettingsPage();function displaySettings(){settingsMenu.style.display="";onEachLazy(settingsMenu.querySelectorAll("input[type='checkbox']"),el=>{const val=getSettingValue(el.id);const checked=val==="true";if(checked!==el.checked&&val!==null){el.checked=checked}})}function settingsBlurHandler(event){blurHandler(event,getSettingsButton(),window.hidePopoverMenus)}if(isSettingsPage){getSettingsButton().onclick=event=>{event.preventDefault()}}else{const settingsButton=getSettingsButton();const settingsMenu=document.getElementById("settings");settingsButton.onclick=event=>{if(settingsMenu.contains(event.target)){return}event.preventDefault();const shouldDisplaySettings=settingsMenu.style.display==="none";window.hideAllModals();if(shouldDisplaySettings){displaySettings()}};settingsButton.onblur=settingsBlurHandler;settingsButton.querySelector("a").onblur=settingsBlurHandler;onEachLazy(settingsMenu.querySelectorAll("input"),el=>{el.onblur=settingsBlurHandler});settingsMenu.onblur=settingsBlurHandler}setTimeout(()=>{setEvents(settingsMenu);if(!isSettingsPage){displaySettings()}removeClass(getSettingsButton(),"rotate")},0)})() \ No newline at end of file diff --git a/static.files/src-script-39ed315d46fb705f.js b/static.files/src-script-39ed315d46fb705f.js new file mode 100644 index 0000000..ef74f36 --- /dev/null +++ b/static.files/src-script-39ed315d46fb705f.js @@ -0,0 +1 @@ +"use strict";(function(){const rootPath=getVar("root-path");const NAME_OFFSET=0;const DIRS_OFFSET=1;const FILES_OFFSET=2;const RUSTDOC_MOBILE_BREAKPOINT=700;function closeSidebarIfMobile(){if(window.innerWidth{removeClass(document.documentElement,"src-sidebar-expanded");getToggleLabel().innerText=">";updateLocalStorage("source-sidebar-show","false")};window.rustdocShowSourceSidebar=()=>{addClass(document.documentElement,"src-sidebar-expanded");getToggleLabel().innerText="<";updateLocalStorage("source-sidebar-show","true")};function toggleSidebar(){const child=this.parentNode.children[0];if(child.innerText===">"){window.rustdocShowSourceSidebar()}else{window.rustdocCloseSourceSidebar()}}function createSidebarToggle(){const sidebarToggle=document.createElement("div");sidebarToggle.id="src-sidebar-toggle";const inner=document.createElement("button");if(getCurrentValue("source-sidebar-show")==="true"){inner.innerText="<"}else{inner.innerText=">"}inner.onclick=toggleSidebar;sidebarToggle.appendChild(inner);return sidebarToggle}function createSrcSidebar(){const container=document.querySelector("nav.sidebar");const sidebarToggle=createSidebarToggle();container.insertBefore(sidebarToggle,container.firstChild);const sidebar=document.createElement("div");sidebar.id="src-sidebar";let hasFoundFile=false;const title=document.createElement("div");title.className="title";title.innerText="Files";sidebar.appendChild(title);for(const[key,source]of srcIndex){source[NAME_OFFSET]=key;hasFoundFile=createDirEntry(source,sidebar,"",hasFoundFile)}container.appendChild(sidebar);const selected_elem=sidebar.getElementsByClassName("selected")[0];if(typeof selected_elem!=="undefined"){selected_elem.focus()}}function highlightSrcLines(){const match=window.location.hash.match(/^#?(\d+)(?:-(\d+))?$/);if(!match){return}let from=parseInt(match[1],10);let to=from;if(typeof match[2]!=="undefined"){to=parseInt(match[2],10)}if(to{onEachLazy(e.getElementsByTagName("a"),i_e=>{removeClass(i_e,"line-highlighted")})});for(let i=from;i<=to;++i){elem=document.getElementById(i);if(!elem){break}addClass(elem,"line-highlighted")}}const handleSrcHighlight=(function(){let prev_line_id=0;const set_fragment=name=>{const x=window.scrollX,y=window.scrollY;if(browserSupportsHistoryApi()){history.replaceState(null,null,"#"+name);highlightSrcLines()}else{location.replace("#"+name)}window.scrollTo(x,y)};return ev=>{let cur_line_id=parseInt(ev.target.id,10);if(isNaN(cur_line_id)||ev.ctrlKey||ev.altKey||ev.metaKey){return}ev.preventDefault();if(ev.shiftKey&&prev_line_id){if(prev_line_id>cur_line_id){const tmp=prev_line_id;prev_line_id=cur_line_id;cur_line_id=tmp}set_fragment(prev_line_id+"-"+cur_line_id)}else{prev_line_id=cur_line_id;set_fragment(cur_line_id)}}}());window.addEventListener("hashchange",highlightSrcLines);onEachLazy(document.getElementsByClassName("src-line-numbers"),el=>{el.addEventListener("click",handleSrcHighlight)});highlightSrcLines();window.createSrcSidebar=createSrcSidebar})() \ No newline at end of file diff --git a/static.files/storage-f2adc0d6ca4d09fb.js b/static.files/storage-f2adc0d6ca4d09fb.js new file mode 100644 index 0000000..1723360 --- /dev/null +++ b/static.files/storage-f2adc0d6ca4d09fb.js @@ -0,0 +1 @@ +"use strict";const builtinThemes=["light","dark","ayu"];const darkThemes=["dark","ayu"];window.currentTheme=document.getElementById("themeStyle");const settingsDataset=(function(){const settingsElement=document.getElementById("default-settings");return settingsElement&&settingsElement.dataset?settingsElement.dataset:null})();function getSettingValue(settingName){const current=getCurrentValue(settingName);if(current===null&&settingsDataset!==null){const def=settingsDataset[settingName.replace(/-/g,"_")];if(def!==undefined){return def}}return current}const localStoredTheme=getSettingValue("theme");function hasClass(elem,className){return elem&&elem.classList&&elem.classList.contains(className)}function addClass(elem,className){if(elem&&elem.classList){elem.classList.add(className)}}function removeClass(elem,className){if(elem&&elem.classList){elem.classList.remove(className)}}function onEach(arr,func){for(const elem of arr){if(func(elem)){return true}}return false}function onEachLazy(lazyArray,func){return onEach(Array.prototype.slice.call(lazyArray),func)}function updateLocalStorage(name,value){try{window.localStorage.setItem("rustdoc-"+name,value)}catch(e){}}function getCurrentValue(name){try{return window.localStorage.getItem("rustdoc-"+name)}catch(e){return null}}const getVar=(function getVar(name){const el=document.querySelector("head > meta[name='rustdoc-vars']");return el?el.attributes["data-"+name].value:null});function switchTheme(newThemeName,saveTheme){if(saveTheme){updateLocalStorage("theme",newThemeName)}document.documentElement.setAttribute("data-theme",newThemeName);if(builtinThemes.indexOf(newThemeName)!==-1){if(window.currentTheme){window.currentTheme.parentNode.removeChild(window.currentTheme);window.currentTheme=null}}else{const newHref=getVar("root-path")+newThemeName+getVar("resource-suffix")+".css";if(!window.currentTheme){if(document.readyState==="loading"){document.write(``);window.currentTheme=document.getElementById("themeStyle")}else{window.currentTheme=document.createElement("link");window.currentTheme.rel="stylesheet";window.currentTheme.id="themeStyle";window.currentTheme.href=newHref;document.documentElement.appendChild(window.currentTheme)}}else if(newHref!==window.currentTheme.href){window.currentTheme.href=newHref}}}const updateTheme=(function(){const mql=window.matchMedia("(prefers-color-scheme: dark)");function updateTheme(){if(getSettingValue("use-system-theme")!=="false"){const lightTheme=getSettingValue("preferred-light-theme")||"light";const darkTheme=getSettingValue("preferred-dark-theme")||"dark";updateLocalStorage("use-system-theme","true");switchTheme(mql.matches?darkTheme:lightTheme,true)}else{switchTheme(getSettingValue("theme"),false)}}mql.addEventListener("change",updateTheme);return updateTheme})();if(getSettingValue("use-system-theme")!=="false"&&window.matchMedia){if(getSettingValue("use-system-theme")===null&&getSettingValue("preferred-dark-theme")===null&&darkThemes.indexOf(localStoredTheme)>=0){updateLocalStorage("preferred-dark-theme",localStoredTheme)}}updateTheme();if(getSettingValue("source-sidebar-show")==="true"){addClass(document.documentElement,"src-sidebar-expanded")}if(getSettingValue("hide-sidebar")==="true"){addClass(document.documentElement,"hide-sidebar")}function updateSidebarWidth(){const desktopSidebarWidth=getSettingValue("desktop-sidebar-width");if(desktopSidebarWidth&&desktopSidebarWidth!=="null"){document.documentElement.style.setProperty("--desktop-sidebar-width",desktopSidebarWidth+"px")}const srcSidebarWidth=getSettingValue("src-sidebar-width");if(srcSidebarWidth&&srcSidebarWidth!=="null"){document.documentElement.style.setProperty("--src-sidebar-width",srcSidebarWidth+"px")}}updateSidebarWidth();window.addEventListener("pageshow",ev=>{if(ev.persisted){setTimeout(updateTheme,0);setTimeout(updateSidebarWidth,0)}}) \ No newline at end of file diff --git a/static.files/wheel-7b819b6101059cd0.svg b/static.files/wheel-7b819b6101059cd0.svg new file mode 100644 index 0000000..83c07f6 --- /dev/null +++ b/static.files/wheel-7b819b6101059cd0.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/trait.impl/core/cmp/trait.Eq.js b/trait.impl/core/cmp/trait.Eq.js new file mode 100644 index 0000000..ec49c82 --- /dev/null +++ b/trait.impl/core/cmp/trait.Eq.js @@ -0,0 +1,3 @@ +(function() {var implementors = { +"metis":[["impl Eq for Dual"],["impl Eq for Error"]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/trait.impl/core/cmp/trait.PartialEq.js b/trait.impl/core/cmp/trait.PartialEq.js new file mode 100644 index 0000000..b03cb17 --- /dev/null +++ b/trait.impl/core/cmp/trait.PartialEq.js @@ -0,0 +1,3 @@ +(function() {var implementors = { +"metis":[["impl PartialEq for Error"],["impl<'a> PartialEq for Mesh<'a>"],["impl<'a> PartialEq for Graph<'a>"],["impl PartialEq for Dual"]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/trait.impl/core/convert/trait.From.js b/trait.impl/core/convert/trait.From.js new file mode 100644 index 0000000..25dfc6c --- /dev/null +++ b/trait.impl/core/convert/trait.From.js @@ -0,0 +1,3 @@ +(function() {var implementors = { +"metis":[["impl From<NewMeshError> for Error"],["impl From<NewGraphError> for Error"]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/trait.impl/core/error/trait.Error.js b/trait.impl/core/error/trait.Error.js new file mode 100644 index 0000000..9df808c --- /dev/null +++ b/trait.impl/core/error/trait.Error.js @@ -0,0 +1,3 @@ +(function() {var implementors = { +"metis":[["impl Error for NewGraphError"],["impl Error for Error"],["impl Error for NewMeshError"]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/trait.impl/core/fmt/trait.Debug.js b/trait.impl/core/fmt/trait.Debug.js new file mode 100644 index 0000000..4b834b9 --- /dev/null +++ b/trait.impl/core/fmt/trait.Debug.js @@ -0,0 +1,3 @@ +(function() {var implementors = { +"metis":[["impl Debug for NewGraphError"],["impl Debug for InvalidGraphError"],["impl<'a> Debug for Mesh<'a>"],["impl<'a> Debug for Graph<'a>"],["impl Debug for NewMeshError"],["impl Debug for Error"],["impl Debug for Dual"],["impl Debug for InvalidMeshError"]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/trait.impl/core/fmt/trait.Display.js b/trait.impl/core/fmt/trait.Display.js new file mode 100644 index 0000000..314a009 --- /dev/null +++ b/trait.impl/core/fmt/trait.Display.js @@ -0,0 +1,3 @@ +(function() {var implementors = { +"metis":[["impl Display for InvalidMeshError"],["impl Display for NewGraphError"],["impl Display for InvalidGraphError"],["impl Display for Error"],["impl Display for NewMeshError"]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/trait.impl/core/marker/trait.Freeze.js b/trait.impl/core/marker/trait.Freeze.js new file mode 100644 index 0000000..18f797a --- /dev/null +++ b/trait.impl/core/marker/trait.Freeze.js @@ -0,0 +1,3 @@ +(function() {var implementors = { +"metis":[["impl Freeze for PType",1,["metis::option::PType"]],["impl Freeze for ObjType",1,["metis::option::ObjType"]],["impl Freeze for CType",1,["metis::option::CType"]],["impl Freeze for IpType",1,["metis::option::IpType"]],["impl Freeze for RType",1,["metis::option::RType"]],["impl Freeze for NCuts",1,["metis::option::NCuts"]],["impl Freeze for NSeps",1,["metis::option::NSeps"]],["impl Freeze for NIter",1,["metis::option::NIter"]],["impl Freeze for Seed",1,["metis::option::Seed"]],["impl Freeze for MinConn",1,["metis::option::MinConn"]],["impl Freeze for No2Hop",1,["metis::option::No2Hop"]],["impl Freeze for Contig",1,["metis::option::Contig"]],["impl Freeze for Compress",1,["metis::option::Compress"]],["impl Freeze for CCOrder",1,["metis::option::CCOrder"]],["impl Freeze for PFactor",1,["metis::option::PFactor"]],["impl Freeze for UFactor",1,["metis::option::UFactor"]],["impl Freeze for DbgLvl",1,["metis::option::DbgLvl"]],["impl Freeze for Error",1,["metis::Error"]],["impl Freeze for InvalidGraphError",1,["metis::InvalidGraphError"]],["impl Freeze for NewGraphError",1,["metis::NewGraphError"]],["impl<'a> Freeze for Graph<'a>",1,["metis::Graph"]],["impl Freeze for InvalidMeshError",1,["metis::InvalidMeshError"]],["impl Freeze for NewMeshError",1,["metis::NewMeshError"]],["impl<'a> Freeze for Mesh<'a>",1,["metis::Mesh"]],["impl Freeze for Dual",1,["metis::Dual"]]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/trait.impl/core/marker/trait.Send.js b/trait.impl/core/marker/trait.Send.js new file mode 100644 index 0000000..67415dd --- /dev/null +++ b/trait.impl/core/marker/trait.Send.js @@ -0,0 +1,3 @@ +(function() {var implementors = { +"metis":[["impl Send for PType",1,["metis::option::PType"]],["impl Send for ObjType",1,["metis::option::ObjType"]],["impl Send for CType",1,["metis::option::CType"]],["impl Send for IpType",1,["metis::option::IpType"]],["impl Send for RType",1,["metis::option::RType"]],["impl Send for NCuts",1,["metis::option::NCuts"]],["impl Send for NSeps",1,["metis::option::NSeps"]],["impl Send for NIter",1,["metis::option::NIter"]],["impl Send for Seed",1,["metis::option::Seed"]],["impl Send for MinConn",1,["metis::option::MinConn"]],["impl Send for No2Hop",1,["metis::option::No2Hop"]],["impl Send for Contig",1,["metis::option::Contig"]],["impl Send for Compress",1,["metis::option::Compress"]],["impl Send for CCOrder",1,["metis::option::CCOrder"]],["impl Send for PFactor",1,["metis::option::PFactor"]],["impl Send for UFactor",1,["metis::option::UFactor"]],["impl Send for DbgLvl",1,["metis::option::DbgLvl"]],["impl Send for Error",1,["metis::Error"]],["impl Send for InvalidGraphError",1,["metis::InvalidGraphError"]],["impl Send for NewGraphError",1,["metis::NewGraphError"]],["impl<'a> Send for Graph<'a>",1,["metis::Graph"]],["impl Send for InvalidMeshError",1,["metis::InvalidMeshError"]],["impl Send for NewMeshError",1,["metis::NewMeshError"]],["impl<'a> Send for Mesh<'a>",1,["metis::Mesh"]],["impl Send for Dual",1,["metis::Dual"]]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/trait.impl/core/marker/trait.StructuralEq.js b/trait.impl/core/marker/trait.StructuralEq.js new file mode 100644 index 0000000..f02c71d --- /dev/null +++ b/trait.impl/core/marker/trait.StructuralEq.js @@ -0,0 +1,3 @@ +(function() {var implementors = { +"metis":[["impl StructuralEq for Dual"],["impl StructuralEq for Error"]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/trait.impl/core/marker/trait.StructuralPartialEq.js b/trait.impl/core/marker/trait.StructuralPartialEq.js new file mode 100644 index 0000000..19d6e34 --- /dev/null +++ b/trait.impl/core/marker/trait.StructuralPartialEq.js @@ -0,0 +1,3 @@ +(function() {var implementors = { +"metis":[["impl StructuralPartialEq for Dual"],["impl<'a> StructuralPartialEq for Mesh<'a>"],["impl<'a> StructuralPartialEq for Graph<'a>"],["impl StructuralPartialEq for Error"]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/trait.impl/core/marker/trait.Sync.js b/trait.impl/core/marker/trait.Sync.js new file mode 100644 index 0000000..1eb1ef0 --- /dev/null +++ b/trait.impl/core/marker/trait.Sync.js @@ -0,0 +1,3 @@ +(function() {var implementors = { +"metis":[["impl Sync for PType",1,["metis::option::PType"]],["impl Sync for ObjType",1,["metis::option::ObjType"]],["impl Sync for CType",1,["metis::option::CType"]],["impl Sync for IpType",1,["metis::option::IpType"]],["impl Sync for RType",1,["metis::option::RType"]],["impl Sync for NCuts",1,["metis::option::NCuts"]],["impl Sync for NSeps",1,["metis::option::NSeps"]],["impl Sync for NIter",1,["metis::option::NIter"]],["impl Sync for Seed",1,["metis::option::Seed"]],["impl Sync for MinConn",1,["metis::option::MinConn"]],["impl Sync for No2Hop",1,["metis::option::No2Hop"]],["impl Sync for Contig",1,["metis::option::Contig"]],["impl Sync for Compress",1,["metis::option::Compress"]],["impl Sync for CCOrder",1,["metis::option::CCOrder"]],["impl Sync for PFactor",1,["metis::option::PFactor"]],["impl Sync for UFactor",1,["metis::option::UFactor"]],["impl Sync for DbgLvl",1,["metis::option::DbgLvl"]],["impl Sync for Error",1,["metis::Error"]],["impl Sync for InvalidGraphError",1,["metis::InvalidGraphError"]],["impl Sync for NewGraphError",1,["metis::NewGraphError"]],["impl<'a> Sync for Graph<'a>",1,["metis::Graph"]],["impl Sync for InvalidMeshError",1,["metis::InvalidMeshError"]],["impl Sync for NewMeshError",1,["metis::NewMeshError"]],["impl<'a> Sync for Mesh<'a>",1,["metis::Mesh"]],["impl Sync for Dual",1,["metis::Dual"]]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/trait.impl/core/marker/trait.Unpin.js b/trait.impl/core/marker/trait.Unpin.js new file mode 100644 index 0000000..3d230f2 --- /dev/null +++ b/trait.impl/core/marker/trait.Unpin.js @@ -0,0 +1,3 @@ +(function() {var implementors = { +"metis":[["impl Unpin for PType",1,["metis::option::PType"]],["impl Unpin for ObjType",1,["metis::option::ObjType"]],["impl Unpin for CType",1,["metis::option::CType"]],["impl Unpin for IpType",1,["metis::option::IpType"]],["impl Unpin for RType",1,["metis::option::RType"]],["impl Unpin for NCuts",1,["metis::option::NCuts"]],["impl Unpin for NSeps",1,["metis::option::NSeps"]],["impl Unpin for NIter",1,["metis::option::NIter"]],["impl Unpin for Seed",1,["metis::option::Seed"]],["impl Unpin for MinConn",1,["metis::option::MinConn"]],["impl Unpin for No2Hop",1,["metis::option::No2Hop"]],["impl Unpin for Contig",1,["metis::option::Contig"]],["impl Unpin for Compress",1,["metis::option::Compress"]],["impl Unpin for CCOrder",1,["metis::option::CCOrder"]],["impl Unpin for PFactor",1,["metis::option::PFactor"]],["impl Unpin for UFactor",1,["metis::option::UFactor"]],["impl Unpin for DbgLvl",1,["metis::option::DbgLvl"]],["impl Unpin for Error",1,["metis::Error"]],["impl Unpin for InvalidGraphError",1,["metis::InvalidGraphError"]],["impl Unpin for NewGraphError",1,["metis::NewGraphError"]],["impl<'a> Unpin for Graph<'a>",1,["metis::Graph"]],["impl Unpin for InvalidMeshError",1,["metis::InvalidMeshError"]],["impl Unpin for NewMeshError",1,["metis::NewMeshError"]],["impl<'a> Unpin for Mesh<'a>",1,["metis::Mesh"]],["impl Unpin for Dual",1,["metis::Dual"]]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/trait.impl/core/ops/drop/trait.Drop.js b/trait.impl/core/ops/drop/trait.Drop.js new file mode 100644 index 0000000..d9826a1 --- /dev/null +++ b/trait.impl/core/ops/drop/trait.Drop.js @@ -0,0 +1,3 @@ +(function() {var implementors = { +"metis":[["impl Drop for Dual"]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/trait.impl/core/panic/unwind_safe/trait.RefUnwindSafe.js b/trait.impl/core/panic/unwind_safe/trait.RefUnwindSafe.js new file mode 100644 index 0000000..f2dd42f --- /dev/null +++ b/trait.impl/core/panic/unwind_safe/trait.RefUnwindSafe.js @@ -0,0 +1,3 @@ +(function() {var implementors = { +"metis":[["impl RefUnwindSafe for PType",1,["metis::option::PType"]],["impl RefUnwindSafe for ObjType",1,["metis::option::ObjType"]],["impl RefUnwindSafe for CType",1,["metis::option::CType"]],["impl RefUnwindSafe for IpType",1,["metis::option::IpType"]],["impl RefUnwindSafe for RType",1,["metis::option::RType"]],["impl RefUnwindSafe for NCuts",1,["metis::option::NCuts"]],["impl RefUnwindSafe for NSeps",1,["metis::option::NSeps"]],["impl RefUnwindSafe for NIter",1,["metis::option::NIter"]],["impl RefUnwindSafe for Seed",1,["metis::option::Seed"]],["impl RefUnwindSafe for MinConn",1,["metis::option::MinConn"]],["impl RefUnwindSafe for No2Hop",1,["metis::option::No2Hop"]],["impl RefUnwindSafe for Contig",1,["metis::option::Contig"]],["impl RefUnwindSafe for Compress",1,["metis::option::Compress"]],["impl RefUnwindSafe for CCOrder",1,["metis::option::CCOrder"]],["impl RefUnwindSafe for PFactor",1,["metis::option::PFactor"]],["impl RefUnwindSafe for UFactor",1,["metis::option::UFactor"]],["impl RefUnwindSafe for DbgLvl",1,["metis::option::DbgLvl"]],["impl RefUnwindSafe for Error",1,["metis::Error"]],["impl RefUnwindSafe for InvalidGraphError",1,["metis::InvalidGraphError"]],["impl RefUnwindSafe for NewGraphError",1,["metis::NewGraphError"]],["impl<'a> RefUnwindSafe for Graph<'a>",1,["metis::Graph"]],["impl RefUnwindSafe for InvalidMeshError",1,["metis::InvalidMeshError"]],["impl RefUnwindSafe for NewMeshError",1,["metis::NewMeshError"]],["impl<'a> RefUnwindSafe for Mesh<'a>",1,["metis::Mesh"]],["impl RefUnwindSafe for Dual",1,["metis::Dual"]]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/trait.impl/core/panic/unwind_safe/trait.UnwindSafe.js b/trait.impl/core/panic/unwind_safe/trait.UnwindSafe.js new file mode 100644 index 0000000..5213f8c --- /dev/null +++ b/trait.impl/core/panic/unwind_safe/trait.UnwindSafe.js @@ -0,0 +1,3 @@ +(function() {var implementors = { +"metis":[["impl UnwindSafe for PType",1,["metis::option::PType"]],["impl UnwindSafe for ObjType",1,["metis::option::ObjType"]],["impl UnwindSafe for CType",1,["metis::option::CType"]],["impl UnwindSafe for IpType",1,["metis::option::IpType"]],["impl UnwindSafe for RType",1,["metis::option::RType"]],["impl UnwindSafe for NCuts",1,["metis::option::NCuts"]],["impl UnwindSafe for NSeps",1,["metis::option::NSeps"]],["impl UnwindSafe for NIter",1,["metis::option::NIter"]],["impl UnwindSafe for Seed",1,["metis::option::Seed"]],["impl UnwindSafe for MinConn",1,["metis::option::MinConn"]],["impl UnwindSafe for No2Hop",1,["metis::option::No2Hop"]],["impl UnwindSafe for Contig",1,["metis::option::Contig"]],["impl UnwindSafe for Compress",1,["metis::option::Compress"]],["impl UnwindSafe for CCOrder",1,["metis::option::CCOrder"]],["impl UnwindSafe for PFactor",1,["metis::option::PFactor"]],["impl UnwindSafe for UFactor",1,["metis::option::UFactor"]],["impl UnwindSafe for DbgLvl",1,["metis::option::DbgLvl"]],["impl UnwindSafe for Error",1,["metis::Error"]],["impl UnwindSafe for InvalidGraphError",1,["metis::InvalidGraphError"]],["impl UnwindSafe for NewGraphError",1,["metis::NewGraphError"]],["impl<'a> UnwindSafe for Graph<'a>",1,["metis::Graph"]],["impl UnwindSafe for InvalidMeshError",1,["metis::InvalidMeshError"]],["impl UnwindSafe for NewMeshError",1,["metis::NewMeshError"]],["impl<'a> UnwindSafe for Mesh<'a>",1,["metis::Mesh"]],["impl !UnwindSafe for Dual",1,["metis::Dual"]]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/trait.impl/metis/option/trait.Opt.js b/trait.impl/metis/option/trait.Opt.js new file mode 100644 index 0000000..ec2d9c1 --- /dev/null +++ b/trait.impl/metis/option/trait.Opt.js @@ -0,0 +1,3 @@ +(function() {var implementors = { +"metis":[] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/type.impl/core/result/enum.Result.js b/type.impl/core/result/enum.Result.js new file mode 100644 index 0000000..4577334 --- /dev/null +++ b/type.impl/core/result/enum.Result.js @@ -0,0 +1,3 @@ +(function() {var type_impls = { +"metis":[["
source§

impl<T, E> Result<T, E>

1.0.0 (const: 1.48.0) · source

pub const fn is_ok(&self) -> bool

Returns true if the result is Ok.

\n
Examples
\n
let x: Result<i32, &str> = Ok(-3);\nassert_eq!(x.is_ok(), true);\n\nlet x: Result<i32, &str> = Err(\"Some error message\");\nassert_eq!(x.is_ok(), false);
\n
1.70.0 · source

pub fn is_ok_and(self, f: impl FnOnce(T) -> bool) -> bool

Returns true if the result is Ok and the value inside of it matches a predicate.

\n
Examples
\n
let x: Result<u32, &str> = Ok(2);\nassert_eq!(x.is_ok_and(|x| x > 1), true);\n\nlet x: Result<u32, &str> = Ok(0);\nassert_eq!(x.is_ok_and(|x| x > 1), false);\n\nlet x: Result<u32, &str> = Err(\"hey\");\nassert_eq!(x.is_ok_and(|x| x > 1), false);
\n
1.0.0 (const: 1.48.0) · source

pub const fn is_err(&self) -> bool

Returns true if the result is Err.

\n
Examples
\n
let x: Result<i32, &str> = Ok(-3);\nassert_eq!(x.is_err(), false);\n\nlet x: Result<i32, &str> = Err(\"Some error message\");\nassert_eq!(x.is_err(), true);
\n
1.70.0 · source

pub fn is_err_and(self, f: impl FnOnce(E) -> bool) -> bool

Returns true if the result is Err and the value inside of it matches a predicate.

\n
Examples
\n
use std::io::{Error, ErrorKind};\n\nlet x: Result<u32, Error> = Err(Error::new(ErrorKind::NotFound, \"!\"));\nassert_eq!(x.is_err_and(|x| x.kind() == ErrorKind::NotFound), true);\n\nlet x: Result<u32, Error> = Err(Error::new(ErrorKind::PermissionDenied, \"!\"));\nassert_eq!(x.is_err_and(|x| x.kind() == ErrorKind::NotFound), false);\n\nlet x: Result<u32, Error> = Ok(123);\nassert_eq!(x.is_err_and(|x| x.kind() == ErrorKind::NotFound), false);
\n
1.0.0 · source

pub fn ok(self) -> Option<T>

Converts from Result<T, E> to Option<T>.

\n

Converts self into an Option<T>, consuming self,\nand discarding the error, if any.

\n
Examples
\n
let x: Result<u32, &str> = Ok(2);\nassert_eq!(x.ok(), Some(2));\n\nlet x: Result<u32, &str> = Err(\"Nothing here\");\nassert_eq!(x.ok(), None);
\n
1.0.0 · source

pub fn err(self) -> Option<E>

Converts from Result<T, E> to Option<E>.

\n

Converts self into an Option<E>, consuming self,\nand discarding the success value, if any.

\n
Examples
\n
let x: Result<u32, &str> = Ok(2);\nassert_eq!(x.err(), None);\n\nlet x: Result<u32, &str> = Err(\"Nothing here\");\nassert_eq!(x.err(), Some(\"Nothing here\"));
\n
1.0.0 (const: 1.48.0) · source

pub const fn as_ref(&self) -> Result<&T, &E>

Converts from &Result<T, E> to Result<&T, &E>.

\n

Produces a new Result, containing a reference\ninto the original, leaving the original in place.

\n
Examples
\n
let x: Result<u32, &str> = Ok(2);\nassert_eq!(x.as_ref(), Ok(&2));\n\nlet x: Result<u32, &str> = Err(\"Error\");\nassert_eq!(x.as_ref(), Err(&\"Error\"));
\n
1.0.0 (const: unstable) · source

pub fn as_mut(&mut self) -> Result<&mut T, &mut E>

Converts from &mut Result<T, E> to Result<&mut T, &mut E>.

\n
Examples
\n
fn mutate(r: &mut Result<i32, i32>) {\n    match r.as_mut() {\n        Ok(v) => *v = 42,\n        Err(e) => *e = 0,\n    }\n}\n\nlet mut x: Result<i32, i32> = Ok(2);\nmutate(&mut x);\nassert_eq!(x.unwrap(), 42);\n\nlet mut x: Result<i32, i32> = Err(13);\nmutate(&mut x);\nassert_eq!(x.unwrap_err(), 0);
\n
1.0.0 · source

pub fn map<U, F>(self, op: F) -> Result<U, E>
where\n F: FnOnce(T) -> U,

Maps a Result<T, E> to Result<U, E> by applying a function to a\ncontained Ok value, leaving an Err value untouched.

\n

This function can be used to compose the results of two functions.

\n
Examples
\n

Print the numbers on each line of a string multiplied by two.

\n\n
let line = \"1\\n2\\n3\\n4\\n\";\n\nfor num in line.lines() {\n    match num.parse::<i32>().map(|i| i * 2) {\n        Ok(n) => println!(\"{n}\"),\n        Err(..) => {}\n    }\n}
\n
1.41.0 · source

pub fn map_or<U, F>(self, default: U, f: F) -> U
where\n F: FnOnce(T) -> U,

Returns the provided default (if Err), or\napplies a function to the contained value (if Ok).

\n

Arguments passed to map_or are eagerly evaluated; if you are passing\nthe result of a function call, it is recommended to use map_or_else,\nwhich is lazily evaluated.

\n
Examples
\n
let x: Result<_, &str> = Ok(\"foo\");\nassert_eq!(x.map_or(42, |v| v.len()), 3);\n\nlet x: Result<&str, _> = Err(\"bar\");\nassert_eq!(x.map_or(42, |v| v.len()), 42);
\n
1.41.0 · source

pub fn map_or_else<U, D, F>(self, default: D, f: F) -> U
where\n D: FnOnce(E) -> U,\n F: FnOnce(T) -> U,

Maps a Result<T, E> to U by applying fallback function default to\na contained Err value, or function f to a contained Ok value.

\n

This function can be used to unpack a successful result\nwhile handling an error.

\n
Examples
\n
let k = 21;\n\nlet x : Result<_, &str> = Ok(\"foo\");\nassert_eq!(x.map_or_else(|e| k * 2, |v| v.len()), 3);\n\nlet x : Result<&str, _> = Err(\"bar\");\nassert_eq!(x.map_or_else(|e| k * 2, |v| v.len()), 42);
\n
1.0.0 · source

pub fn map_err<F, O>(self, op: O) -> Result<T, F>
where\n O: FnOnce(E) -> F,

Maps a Result<T, E> to Result<T, F> by applying a function to a\ncontained Err value, leaving an Ok value untouched.

\n

This function can be used to pass through a successful result while handling\nan error.

\n
Examples
\n
fn stringify(x: u32) -> String { format!(\"error code: {x}\") }\n\nlet x: Result<u32, u32> = Ok(2);\nassert_eq!(x.map_err(stringify), Ok(2));\n\nlet x: Result<u32, u32> = Err(13);\nassert_eq!(x.map_err(stringify), Err(\"error code: 13\".to_string()));
\n
1.76.0 · source

pub fn inspect<F>(self, f: F) -> Result<T, E>
where\n F: FnOnce(&T),

Calls the provided closure with a reference to the contained value (if Ok).

\n
Examples
\n
let x: u8 = \"4\"\n    .parse::<u8>()\n    .inspect(|x| println!(\"original: {x}\"))\n    .map(|x| x.pow(3))\n    .expect(\"failed to parse number\");
\n
1.76.0 · source

pub fn inspect_err<F>(self, f: F) -> Result<T, E>
where\n F: FnOnce(&E),

Calls the provided closure with a reference to the contained error (if Err).

\n
Examples
\n
use std::{fs, io};\n\nfn read() -> io::Result<String> {\n    fs::read_to_string(\"address.txt\")\n        .inspect_err(|e| eprintln!(\"failed to read file: {e}\"))\n}
\n
1.47.0 · source

pub fn as_deref(&self) -> Result<&<T as Deref>::Target, &E>
where\n T: Deref,

Converts from Result<T, E> (or &Result<T, E>) to Result<&<T as Deref>::Target, &E>.

\n

Coerces the Ok variant of the original Result via Deref\nand returns the new Result.

\n
Examples
\n
let x: Result<String, u32> = Ok(\"hello\".to_string());\nlet y: Result<&str, &u32> = Ok(\"hello\");\nassert_eq!(x.as_deref(), y);\n\nlet x: Result<String, u32> = Err(42);\nlet y: Result<&str, &u32> = Err(&42);\nassert_eq!(x.as_deref(), y);
\n
1.47.0 · source

pub fn as_deref_mut(&mut self) -> Result<&mut <T as Deref>::Target, &mut E>
where\n T: DerefMut,

Converts from Result<T, E> (or &mut Result<T, E>) to Result<&mut <T as DerefMut>::Target, &mut E>.

\n

Coerces the Ok variant of the original Result via DerefMut\nand returns the new Result.

\n
Examples
\n
let mut s = \"HELLO\".to_string();\nlet mut x: Result<String, u32> = Ok(\"hello\".to_string());\nlet y: Result<&mut str, &mut u32> = Ok(&mut s);\nassert_eq!(x.as_deref_mut().map(|x| { x.make_ascii_uppercase(); x }), y);\n\nlet mut i = 42;\nlet mut x: Result<String, u32> = Err(42);\nlet y: Result<&mut str, &mut u32> = Err(&mut i);\nassert_eq!(x.as_deref_mut().map(|x| { x.make_ascii_uppercase(); x }), y);
\n
1.0.0 · source

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

Returns an iterator over the possibly contained value.

\n

The iterator yields one value if the result is Result::Ok, otherwise none.

\n
Examples
\n
let x: Result<u32, &str> = Ok(7);\nassert_eq!(x.iter().next(), Some(&7));\n\nlet x: Result<u32, &str> = Err(\"nothing!\");\nassert_eq!(x.iter().next(), None);
\n
1.0.0 · source

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

Returns a mutable iterator over the possibly contained value.

\n

The iterator yields one value if the result is Result::Ok, otherwise none.

\n
Examples
\n
let mut x: Result<u32, &str> = Ok(7);\nmatch x.iter_mut().next() {\n    Some(v) => *v = 40,\n    None => {},\n}\nassert_eq!(x, Ok(40));\n\nlet mut x: Result<u32, &str> = Err(\"nothing!\");\nassert_eq!(x.iter_mut().next(), None);
\n
1.4.0 · source

pub fn expect(self, msg: &str) -> T
where\n E: Debug,

Returns the contained Ok value, consuming the self value.

\n

Because this function may panic, its use is generally discouraged.\nInstead, prefer to use pattern matching and handle the Err\ncase explicitly, or call unwrap_or, unwrap_or_else, or\nunwrap_or_default.

\n
Panics
\n

Panics if the value is an Err, with a panic message including the\npassed message, and the content of the Err.

\n
Examples
\n
let x: Result<u32, &str> = Err(\"emergency failure\");\nx.expect(\"Testing expect\"); // panics with `Testing expect: emergency failure`
\n
Recommended Message Style
\n

We recommend that expect messages are used to describe the reason you\nexpect the Result should be Ok.

\n\n
let path = std::env::var(\"IMPORTANT_PATH\")\n    .expect(\"env variable `IMPORTANT_PATH` should be set by `wrapper_script.sh`\");
\n

Hint: If you’re having trouble remembering how to phrase expect\nerror messages remember to focus on the word “should” as in “env\nvariable should be set by blah” or “the given binary should be available\nand executable by the current user”.

\n

For more detail on expect message styles and the reasoning behind our recommendation please\nrefer to the section on “Common Message\nStyles” in the\nstd::error module docs.

\n
1.0.0 · source

pub fn unwrap(self) -> T
where\n E: Debug,

Returns the contained Ok value, consuming the self value.

\n

Because this function may panic, its use is generally discouraged.\nInstead, prefer to use pattern matching and handle the Err\ncase explicitly, or call unwrap_or, unwrap_or_else, or\nunwrap_or_default.

\n
Panics
\n

Panics if the value is an Err, with a panic message provided by the\nErr’s value.

\n
Examples
\n

Basic usage:

\n\n
let x: Result<u32, &str> = Ok(2);\nassert_eq!(x.unwrap(), 2);
\n\n
let x: Result<u32, &str> = Err(\"emergency failure\");\nx.unwrap(); // panics with `emergency failure`
\n
1.16.0 · source

pub fn unwrap_or_default(self) -> T
where\n T: Default,

Returns the contained Ok value or a default

\n

Consumes the self argument then, if Ok, returns the contained\nvalue, otherwise if Err, returns the default value for that\ntype.

\n
Examples
\n

Converts a string to an integer, turning poorly-formed strings\ninto 0 (the default value for integers). parse converts\na string to any other type that implements FromStr, returning an\nErr on error.

\n\n
let good_year_from_input = \"1909\";\nlet bad_year_from_input = \"190blarg\";\nlet good_year = good_year_from_input.parse().unwrap_or_default();\nlet bad_year = bad_year_from_input.parse().unwrap_or_default();\n\nassert_eq!(1909, good_year);\nassert_eq!(0, bad_year);
\n
1.17.0 · source

pub fn expect_err(self, msg: &str) -> E
where\n T: Debug,

Returns the contained Err value, consuming the self value.

\n
Panics
\n

Panics if the value is an Ok, with a panic message including the\npassed message, and the content of the Ok.

\n
Examples
\n
let x: Result<u32, &str> = Ok(10);\nx.expect_err(\"Testing expect_err\"); // panics with `Testing expect_err: 10`
\n
1.0.0 · source

pub fn unwrap_err(self) -> E
where\n T: Debug,

Returns the contained Err value, consuming the self value.

\n
Panics
\n

Panics if the value is an Ok, with a custom panic message provided\nby the Ok’s value.

\n
Examples
\n
let x: Result<u32, &str> = Ok(2);\nx.unwrap_err(); // panics with `2`
\n\n
let x: Result<u32, &str> = Err(\"emergency failure\");\nassert_eq!(x.unwrap_err(), \"emergency failure\");
\n
source

pub fn into_ok(self) -> T
where\n E: Into<!>,

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

Returns the contained Ok value, but never panics.

\n

Unlike unwrap, this method is known to never panic on the\nresult types it is implemented for. Therefore, it can be used\ninstead of unwrap as a maintainability safeguard that will fail\nto compile if the error type of the Result is later changed\nto an error that can actually occur.

\n
Examples
\n
\nfn only_good_news() -> Result<String, !> {\n    Ok(\"this is fine\".into())\n}\n\nlet s: String = only_good_news().into_ok();\nprintln!(\"{s}\");
\n
source

pub fn into_err(self) -> E
where\n T: Into<!>,

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

Returns the contained Err value, but never panics.

\n

Unlike unwrap_err, this method is known to never panic on the\nresult types it is implemented for. Therefore, it can be used\ninstead of unwrap_err as a maintainability safeguard that will fail\nto compile if the ok type of the Result is later changed\nto a type that can actually occur.

\n
Examples
\n
\nfn only_bad_news() -> Result<!, String> {\n    Err(\"Oops, it failed\".into())\n}\n\nlet error: String = only_bad_news().into_err();\nprintln!(\"{error}\");
\n
1.0.0 · source

pub fn and<U>(self, res: Result<U, E>) -> Result<U, E>

Returns res if the result is Ok, otherwise returns the Err value of self.

\n

Arguments passed to and are eagerly evaluated; if you are passing the\nresult of a function call, it is recommended to use and_then, which is\nlazily evaluated.

\n
Examples
\n
let x: Result<u32, &str> = Ok(2);\nlet y: Result<&str, &str> = Err(\"late error\");\nassert_eq!(x.and(y), Err(\"late error\"));\n\nlet x: Result<u32, &str> = Err(\"early error\");\nlet y: Result<&str, &str> = Ok(\"foo\");\nassert_eq!(x.and(y), Err(\"early error\"));\n\nlet x: Result<u32, &str> = Err(\"not a 2\");\nlet y: Result<&str, &str> = Err(\"late error\");\nassert_eq!(x.and(y), Err(\"not a 2\"));\n\nlet x: Result<u32, &str> = Ok(2);\nlet y: Result<&str, &str> = Ok(\"different result type\");\nassert_eq!(x.and(y), Ok(\"different result type\"));
\n
1.0.0 · source

pub fn and_then<U, F>(self, op: F) -> Result<U, E>
where\n F: FnOnce(T) -> Result<U, E>,

Calls op if the result is Ok, otherwise returns the Err value of self.

\n

This function can be used for control flow based on Result values.

\n
Examples
\n
fn sq_then_to_string(x: u32) -> Result<String, &'static str> {\n    x.checked_mul(x).map(|sq| sq.to_string()).ok_or(\"overflowed\")\n}\n\nassert_eq!(Ok(2).and_then(sq_then_to_string), Ok(4.to_string()));\nassert_eq!(Ok(1_000_000).and_then(sq_then_to_string), Err(\"overflowed\"));\nassert_eq!(Err(\"not a number\").and_then(sq_then_to_string), Err(\"not a number\"));
\n

Often used to chain fallible operations that may return Err.

\n\n
use std::{io::ErrorKind, path::Path};\n\n// Note: on Windows \"/\" maps to \"C:\\\"\nlet root_modified_time = Path::new(\"/\").metadata().and_then(|md| md.modified());\nassert!(root_modified_time.is_ok());\n\nlet should_fail = Path::new(\"/bad/path\").metadata().and_then(|md| md.modified());\nassert!(should_fail.is_err());\nassert_eq!(should_fail.unwrap_err().kind(), ErrorKind::NotFound);
\n
1.0.0 · source

pub fn or<F>(self, res: Result<T, F>) -> Result<T, F>

Returns res if the result is Err, otherwise returns the Ok value of self.

\n

Arguments passed to or are eagerly evaluated; if you are passing the\nresult of a function call, it is recommended to use or_else, which is\nlazily evaluated.

\n
Examples
\n
let x: Result<u32, &str> = Ok(2);\nlet y: Result<u32, &str> = Err(\"late error\");\nassert_eq!(x.or(y), Ok(2));\n\nlet x: Result<u32, &str> = Err(\"early error\");\nlet y: Result<u32, &str> = Ok(2);\nassert_eq!(x.or(y), Ok(2));\n\nlet x: Result<u32, &str> = Err(\"not a 2\");\nlet y: Result<u32, &str> = Err(\"late error\");\nassert_eq!(x.or(y), Err(\"late error\"));\n\nlet x: Result<u32, &str> = Ok(2);\nlet y: Result<u32, &str> = Ok(100);\nassert_eq!(x.or(y), Ok(2));
\n
1.0.0 · source

pub fn or_else<F, O>(self, op: O) -> Result<T, F>
where\n O: FnOnce(E) -> Result<T, F>,

Calls op if the result is Err, otherwise returns the Ok value of self.

\n

This function can be used for control flow based on result values.

\n
Examples
\n
fn sq(x: u32) -> Result<u32, u32> { Ok(x * x) }\nfn err(x: u32) -> Result<u32, u32> { Err(x) }\n\nassert_eq!(Ok(2).or_else(sq).or_else(sq), Ok(2));\nassert_eq!(Ok(2).or_else(err).or_else(sq), Ok(2));\nassert_eq!(Err(3).or_else(sq).or_else(err), Ok(9));\nassert_eq!(Err(3).or_else(err).or_else(err), Err(3));
\n
1.0.0 · source

pub fn unwrap_or(self, default: T) -> T

Returns the contained Ok value or a provided default.

\n

Arguments passed to unwrap_or are eagerly evaluated; if you are passing\nthe result of a function call, it is recommended to use unwrap_or_else,\nwhich is lazily evaluated.

\n
Examples
\n
let default = 2;\nlet x: Result<u32, &str> = Ok(9);\nassert_eq!(x.unwrap_or(default), 9);\n\nlet x: Result<u32, &str> = Err(\"error\");\nassert_eq!(x.unwrap_or(default), default);
\n
1.0.0 · source

pub fn unwrap_or_else<F>(self, op: F) -> T
where\n F: FnOnce(E) -> T,

Returns the contained Ok value or computes it from a closure.

\n
Examples
\n
fn count(x: &str) -> usize { x.len() }\n\nassert_eq!(Ok(2).unwrap_or_else(count), 2);\nassert_eq!(Err(\"foo\").unwrap_or_else(count), 3);
\n
1.58.0 · source

pub unsafe fn unwrap_unchecked(self) -> T

Returns the contained Ok value, consuming the self value,\nwithout checking that the value is not an Err.

\n
Safety
\n

Calling this method on an Err is undefined behavior.

\n
Examples
\n
let x: Result<u32, &str> = Ok(2);\nassert_eq!(unsafe { x.unwrap_unchecked() }, 2);
\n\n
let x: Result<u32, &str> = Err(\"emergency failure\");\nunsafe { x.unwrap_unchecked(); } // Undefined behavior!
\n
1.58.0 · source

pub unsafe fn unwrap_err_unchecked(self) -> E

Returns the contained Err value, consuming the self value,\nwithout checking that the value is not an Ok.

\n
Safety
\n

Calling this method on an Ok is undefined behavior.

\n
Examples
\n
let x: Result<u32, &str> = Ok(2);\nunsafe { x.unwrap_err_unchecked() }; // Undefined behavior!
\n\n
let x: Result<u32, &str> = Err(\"emergency failure\");\nassert_eq!(unsafe { x.unwrap_err_unchecked() }, \"emergency failure\");
\n
",0,"metis::Result"],["
source§

impl<T, E> Result<&T, E>

1.59.0 · source

pub fn copied(self) -> Result<T, E>
where\n T: Copy,

Maps a Result<&T, E> to a Result<T, E> by copying the contents of the\nOk part.

\n
Examples
\n
let val = 12;\nlet x: Result<&i32, i32> = Ok(&val);\nassert_eq!(x, Ok(&12));\nlet copied = x.copied();\nassert_eq!(copied, Ok(12));
\n
1.59.0 · source

pub fn cloned(self) -> Result<T, E>
where\n T: Clone,

Maps a Result<&T, E> to a Result<T, E> by cloning the contents of the\nOk part.

\n
Examples
\n
let val = 12;\nlet x: Result<&i32, i32> = Ok(&val);\nassert_eq!(x, Ok(&12));\nlet cloned = x.cloned();\nassert_eq!(cloned, Ok(12));
\n
",0,"metis::Result"],["
source§

impl<T, E> Result<&mut T, E>

1.59.0 · source

pub fn copied(self) -> Result<T, E>
where\n T: Copy,

Maps a Result<&mut T, E> to a Result<T, E> by copying the contents of the\nOk part.

\n
Examples
\n
let mut val = 12;\nlet x: Result<&mut i32, i32> = Ok(&mut val);\nassert_eq!(x, Ok(&mut 12));\nlet copied = x.copied();\nassert_eq!(copied, Ok(12));
\n
1.59.0 · source

pub fn cloned(self) -> Result<T, E>
where\n T: Clone,

Maps a Result<&mut T, E> to a Result<T, E> by cloning the contents of the\nOk part.

\n
Examples
\n
let mut val = 12;\nlet x: Result<&mut i32, i32> = Ok(&mut val);\nassert_eq!(x, Ok(&mut 12));\nlet cloned = x.cloned();\nassert_eq!(cloned, Ok(12));
\n
",0,"metis::Result"],["
source§

impl<T, E> Result<Option<T>, E>

1.33.0 (const: unstable) · source

pub fn transpose(self) -> Option<Result<T, E>>

Transposes a Result of an Option into an Option of a Result.

\n

Ok(None) will be mapped to None.\nOk(Some(_)) and Err(_) will be mapped to Some(Ok(_)) and Some(Err(_)).

\n
Examples
\n
#[derive(Debug, Eq, PartialEq)]\nstruct SomeErr;\n\nlet x: Result<Option<i32>, SomeErr> = Ok(Some(5));\nlet y: Option<Result<i32, SomeErr>> = Some(Ok(5));\nassert_eq!(x.transpose(), y);
\n
",0,"metis::Result"],["
source§

impl<T, E> Result<Result<T, E>, E>

source

pub fn flatten(self) -> Result<T, E>

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

Converts from Result<Result<T, E>, E> to Result<T, E>

\n
Examples
\n
#![feature(result_flattening)]\nlet x: Result<Result<&'static str, u32>, u32> = Ok(Ok(\"hello\"));\nassert_eq!(Ok(\"hello\"), x.flatten());\n\nlet x: Result<Result<&'static str, u32>, u32> = Ok(Err(6));\nassert_eq!(Err(6), x.flatten());\n\nlet x: Result<Result<&'static str, u32>, u32> = Err(6);\nassert_eq!(Err(6), x.flatten());
\n

Flattening only removes one level of nesting at a time:

\n\n
#![feature(result_flattening)]\nlet x: Result<Result<Result<&'static str, u32>, u32>, u32> = Ok(Ok(Ok(\"hello\")));\nassert_eq!(Ok(Ok(\"hello\")), x.flatten());\nassert_eq!(Ok(\"hello\"), x.flatten().flatten());
\n
",0,"metis::Result"],["
1.61.0 · source§

impl<T, E> Termination for Result<T, E>
where\n T: Termination,\n E: Debug,

source§

fn report(self) -> ExitCode

Is called to get the representation of the value as status code.\nThis status code is returned to the operating system.
","Termination","metis::Result"],["
1.0.0 · source§

impl<T, E> PartialOrd for Result<T, E>
where\n T: PartialOrd,\n E: PartialOrd,

source§

fn partial_cmp(&self, other: &Result<T, E>) -> 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

This method 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

This method tests less than or equal to (for self and other) and is used by the <=\noperator. Read more
1.0.0 · source§

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

This method 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

This method tests greater than or equal to (for self and other) and is used by the >=\noperator. Read more
","PartialOrd","metis::Result"],["
1.16.0 · source§

impl<T, U, E> Product<Result<U, E>> for Result<T, E>
where\n T: Product<U>,

source§

fn product<I>(iter: I) -> Result<T, E>
where\n I: Iterator<Item = Result<U, E>>,

Takes each element in the Iterator: if it is an Err, no further\nelements are taken, and the Err is returned. Should no Err\noccur, the product of all elements is returned.

\n
Examples
\n

This multiplies each number in a vector of strings,\nif a string could not be parsed the operation returns Err:

\n\n
let nums = vec![\"5\", \"10\", \"1\", \"2\"];\nlet total: Result<usize, _> = nums.iter().map(|w| w.parse::<usize>()).product();\nassert_eq!(total, Ok(100));\nlet nums = vec![\"5\", \"10\", \"one\", \"2\"];\nlet total: Result<usize, _> = nums.iter().map(|w| w.parse::<usize>()).product();\nassert!(total.is_err());
\n
","Product>","metis::Result"],["
source§

impl<T, E, F> FromResidual<Result<Infallible, E>> for Result<T, F>
where\n F: From<E>,

source§

fn from_residual(residual: Result<Infallible, E>) -> Result<T, F>

🔬This is a nightly-only experimental API. (try_trait_v2)
Constructs the type from a compatible Residual type. Read more
","FromResidual>","metis::Result"],["
source§

impl<T, E, F> FromResidual<Yeet<E>> for Result<T, F>
where\n F: From<E>,

source§

fn from_residual(_: Yeet<E>) -> Result<T, F>

🔬This is a nightly-only experimental API. (try_trait_v2)
Constructs the type from a compatible Residual type. Read more
","FromResidual>","metis::Result"],["
source§

impl<T, E> Try for Result<T, E>

§

type Output = T

🔬This is a nightly-only experimental API. (try_trait_v2)
The type of the value produced by ? when not short-circuiting.
§

type Residual = Result<Infallible, E>

🔬This is a nightly-only experimental API. (try_trait_v2)
The type of the value passed to FromResidual::from_residual\nas part of ? when short-circuiting. Read more
source§

fn from_output(output: <Result<T, E> as Try>::Output) -> Result<T, E>

🔬This is a nightly-only experimental API. (try_trait_v2)
Constructs the type from its Output type. Read more
source§

fn branch(\n self\n) -> ControlFlow<<Result<T, E> as Try>::Residual, <Result<T, E> as Try>::Output>

🔬This is a nightly-only experimental API. (try_trait_v2)
Used in ? to decide whether the operator should produce a value\n(because this returned ControlFlow::Continue)\nor propagate a value back to the caller\n(because this returned ControlFlow::Break). Read more
","Try","metis::Result"],["
1.0.0 · source§

impl<T, E> Clone for Result<T, E>
where\n T: Clone,\n E: Clone,

source§

fn clone(&self) -> Result<T, E>

Returns a copy of the value. Read more
source§

fn clone_from(&mut self, source: &Result<T, E>)

Performs copy-assignment from source. Read more
","Clone","metis::Result"],["
1.0.0 · source§

impl<A, E, V> FromIterator<Result<A, E>> for Result<V, E>
where\n V: FromIterator<A>,

source§

fn from_iter<I>(iter: I) -> Result<V, E>
where\n I: IntoIterator<Item = Result<A, E>>,

Takes each element in the Iterator: if it is an Err, no further\nelements are taken, and the Err is returned. Should no Err occur, a\ncontainer with the values of each Result is returned.

\n

Here is an example which increments every integer in a vector,\nchecking for overflow:

\n\n
let v = vec![1, 2];\nlet res: Result<Vec<u32>, &'static str> = v.iter().map(|x: &u32|\n    x.checked_add(1).ok_or(\"Overflow!\")\n).collect();\nassert_eq!(res, Ok(vec![2, 3]));
\n

Here is another example that tries to subtract one from another list\nof integers, this time checking for underflow:

\n\n
let v = vec![1, 2, 0];\nlet res: Result<Vec<u32>, &'static str> = v.iter().map(|x: &u32|\n    x.checked_sub(1).ok_or(\"Underflow!\")\n).collect();\nassert_eq!(res, Err(\"Underflow!\"));
\n

Here is a variation on the previous example, showing that no\nfurther elements are taken from iter after the first Err.

\n\n
let v = vec![3, 2, 1, 10];\nlet mut shared = 0;\nlet res: Result<Vec<u32>, &'static str> = v.iter().map(|x: &u32| {\n    shared += x;\n    x.checked_sub(2).ok_or(\"Underflow!\")\n}).collect();\nassert_eq!(res, Err(\"Underflow!\"));\nassert_eq!(shared, 6);
\n

Since the third element caused an underflow, no further elements were taken,\nso the final value of shared is 6 (= 3 + 2 + 1), not 16.

\n
","FromIterator>","metis::Result"],["
1.0.0 · source§

impl<T, E> StructuralEq for Result<T, E>

","StructuralEq","metis::Result"],["
1.0.0 · source§

impl<T, E> Eq for Result<T, E>
where\n T: Eq,\n E: Eq,

","Eq","metis::Result"],["
1.0.0 · source§

impl<T, E> Hash for Result<T, E>
where\n T: Hash,\n E: Hash,

source§

fn hash<__H>(&self, state: &mut __H)
where\n __H: Hasher,

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where\n H: Hasher,\n Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
","Hash","metis::Result"],["
1.0.0 · source§

impl<T, E> Ord for Result<T, E>
where\n T: Ord,\n E: Ord,

source§

fn cmp(&self, other: &Result<T, E>) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · source§

fn max(self, other: Self) -> Self
where\n Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · source§

fn min(self, other: Self) -> Self
where\n 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\n Self: Sized + PartialOrd,

Restrict a value to a certain interval. Read more
","Ord","metis::Result"],["
source§

impl<T, E> Residual<T> for Result<Infallible, E>

§

type TryType = Result<T, E>

🔬This is a nightly-only experimental API. (try_trait_v2_residual)
The “return” type of this meta-function.
","Residual","metis::Result"],["
1.0.0 · source§

impl<T, E> PartialEq for Result<T, E>
where\n T: PartialEq,\n E: PartialEq,

source§

fn eq(&self, other: &Result<T, E>) -> bool

This method tests for self and other values to be equal, and is used\nby ==.
1.0.0 · source§

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

This method tests for !=. The default implementation is almost always\nsufficient, and should not be overridden without very good reason.
","PartialEq","metis::Result"],["
1.0.0 · source§

impl<T, E> IntoIterator for Result<T, E>

source§

fn into_iter(self) -> IntoIter<T>

Returns a consuming iterator over the possibly contained value.

\n

The iterator yields one value if the result is Result::Ok, otherwise none.

\n
Examples
\n
let x: Result<u32, &str> = Ok(5);\nlet v: Vec<u32> = x.into_iter().collect();\nassert_eq!(v, [5]);\n\nlet x: Result<u32, &str> = Err(\"nothing!\");\nlet v: Vec<u32> = x.into_iter().collect();\nassert_eq!(v, []);
\n
§

type Item = T

The type of the elements being iterated over.
§

type IntoIter = IntoIter<T>

Which kind of iterator are we turning this into?
","IntoIterator","metis::Result"],["
1.16.0 · source§

impl<T, U, E> Sum<Result<U, E>> for Result<T, E>
where\n T: Sum<U>,

source§

fn sum<I>(iter: I) -> Result<T, E>
where\n I: Iterator<Item = Result<U, E>>,

Takes each element in the Iterator: if it is an Err, no further\nelements are taken, and the Err is returned. Should no Err\noccur, the sum of all elements is returned.

\n
Examples
\n

This sums up every integer in a vector, rejecting the sum if a negative\nelement is encountered:

\n\n
let f = |&x: &i32| if x < 0 { Err(\"Negative element found\") } else { Ok(x) };\nlet v = vec![1, 2];\nlet res: Result<i32, _> = v.iter().map(f).sum();\nassert_eq!(res, Ok(3));\nlet v = vec![1, -2];\nlet res: Result<i32, _> = v.iter().map(f).sum();\nassert_eq!(res, Err(\"Negative element found\"));
\n
","Sum>","metis::Result"],["
1.0.0 · source§

impl<T, E> StructuralPartialEq for Result<T, E>

","StructuralPartialEq","metis::Result"],["
1.0.0 · source§

impl<T, E> Debug for Result<T, E>
where\n T: Debug,\n E: Debug,

source§

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

Formats the value using the given formatter. Read more
","Debug","metis::Result"],["
1.0.0 · source§

impl<T, E> Copy for Result<T, E>
where\n T: Copy,\n E: Copy,

","Copy","metis::Result"]] +};if (window.register_type_impls) {window.register_type_impls(type_impls);} else {window.pending_type_impls = type_impls;}})() \ No newline at end of file diff --git a/type.impl/metis_sys/type.idx_t.js b/type.impl/metis_sys/type.idx_t.js new file mode 100644 index 0000000..a73b73c --- /dev/null +++ b/type.impl/metis_sys/type.idx_t.js @@ -0,0 +1,3 @@ +(function() {var type_impls = { +"metis":[] +};if (window.register_type_impls) {window.register_type_impls(type_impls);} else {window.pending_type_impls = type_impls;}})() \ No newline at end of file diff --git a/type.impl/metis_sys/type.real_t.js b/type.impl/metis_sys/type.real_t.js new file mode 100644 index 0000000..a73b73c --- /dev/null +++ b/type.impl/metis_sys/type.real_t.js @@ -0,0 +1,3 @@ +(function() {var type_impls = { +"metis":[] +};if (window.register_type_impls) {window.register_type_impls(type_impls);} else {window.pending_type_impls = type_impls;}})() \ No newline at end of file diff --git a/type.impl/std/os/raw/type.c_int.js b/type.impl/std/os/raw/type.c_int.js new file mode 100644 index 0000000..f9062f6 --- /dev/null +++ b/type.impl/std/os/raw/type.c_int.js @@ -0,0 +1,3 @@ +(function() {var type_impls = { +"metis_sys":[] +};if (window.register_type_impls) {window.register_type_impls(type_impls);} else {window.pending_type_impls = type_impls;}})() \ No newline at end of file diff --git a/type.impl/std/primitive.f32.js b/type.impl/std/primitive.f32.js new file mode 100644 index 0000000..f9062f6 --- /dev/null +++ b/type.impl/std/primitive.f32.js @@ -0,0 +1,3 @@ +(function() {var type_impls = { +"metis_sys":[] +};if (window.register_type_impls) {window.register_type_impls(type_impls);} else {window.pending_type_impls = type_impls;}})() \ No newline at end of file diff --git a/type.impl/std/primitive.i32.js b/type.impl/std/primitive.i32.js new file mode 100644 index 0000000..f9062f6 --- /dev/null +++ b/type.impl/std/primitive.i32.js @@ -0,0 +1,3 @@ +(function() {var type_impls = { +"metis_sys":[] +};if (window.register_type_impls) {window.register_type_impls(type_impls);} else {window.pending_type_impls = type_impls;}})() \ No newline at end of file