#interval #adapter #range #general-purpose #fundamental #closed #range-inclusive

no-std interval_adapter

适用于区间(范围)的开放/封闭实现之间的适配器

20次重大发布

0.23.0 2024年7月13日
0.21.0 2024年5月18日
0.18.0 2024年3月22日
0.3.0 2023年10月28日

#175 in 算法

Download history 71/week @ 2024-04-29 1154/week @ 2024-05-06 2854/week @ 2024-05-13 1215/week @ 2024-05-20 2990/week @ 2024-05-27 1183/week @ 2024-06-03 850/week @ 2024-06-10 388/week @ 2024-06-17 761/week @ 2024-06-24 615/week @ 2024-07-01 439/week @ 2024-07-08 1373/week @ 2024-07-15 507/week @ 2024-07-22 831/week @ 2024-07-29 275/week @ 2024-08-05 1244/week @ 2024-08-12

2,922 每月下载量
用于 63 个crate(3 直接使用)

MIT 协议

22KB
508

模块 :: interval_adapter

experimental rust-status docs.rs Open in Gitpod discord

整数区间适配器,适用于Range和RangeInclusive。

假设你有一个应该接受Interval的函数。但是你不想限制函数的调用者只能使用半开区间 core::ops::Range 或封闭区间 core::ops::RangeInclusive,你想允许使用任意的可迭代区间。为了使这顺利工作,请使用IterableIntervalcore::ops::Rangecore::ops::RangeInclusive 都实现了该特性,还可以与非可迭代的区间一起工作,如(-无穷大 .. +无穷大)。

基本用例


use interval_adapter::IterableInterval;

fn f1( interval : impl IterableInterval )
{
  for i in interval
  {
    println!( "{i}" );
  }
}

// Calling the function either with
// half-open interval `core::ops::Range`.
f1( 0..=3 );
// Or closed one `core::ops::RangeInclusive`.
f1( 0..4 );

更多灵活性

如果你需要更灵活地定义区间,可以将端点的元组转换为区间。


use interval_adapter::{ IterableInterval, IntoInterval, Bound };

fn f1( interval : impl IterableInterval )
{
  for i in interval
  {
    println!( "{i}" );
  }
}

// Calling the function either with
// half-open interval `core::ops::Range`.
f1( 0..=3 );
// Or closed one `core::ops::RangeInclusive`.
f1( 0..4 );
// Alternatively you construct your custom interval from a tuple.
f1( ( 0, 3 ).into_interval() );
f1( ( Bound::Included( 0 ), Bound::Included( 3 ) ).into_interval() );
// All the calls to the function `f1`` perform the same task,
// and the output is exactly identical.

非可迭代区间

你也可以使用该crate来指定非可迭代的区间。非可迭代区间有一个或多个未界定的端点。例如,区间 core::ops::RangeFull 没有界限,表示从负无穷大到正无穷大的范围。


use interval_adapter::{ NonIterableInterval, IntoInterval, Bound };

fn f1( interval : impl NonIterableInterval )
{
  println!( "Do something with this {:?} .. {:?} interval", interval.left(), interval.right() );
}

// Iterable/bound interval from tuple.
f1( ( Bound::Included( 0 ), Bound::Included( 3 ) ).into_interval() );
// Non-iterable/unbound interval from tuple.
f1( ( Bound::Included( 0 ), Bound::Unbounded ).into_interval() );
// Non-iterable/unbound interval from `core::ops::RangeFrom`.
f1( 0.. );
// Non-iterable/unbound interval from `core::ops::RangeFull`
// what is ( -Infinity .. +Infinity ).
f1( .. );

将此添加到你的项目中

cargo add interval_adaptor

从仓库尝试

git clone https://github.com/Wandalen/wTools
cd wTools
cargo run --example interval_adapter_trivial

无运行时依赖