This package aims to offer some Option<_>
-like values that allow a
space-optimized representation.
As of now there is a type OptionBool
. It works very much like an
Option<bool>
(and indeed mostly copies its interface). There are only a few
additional methods where Option<bool>
would recieve or return another
Option<bool>
, a _bool
prefix is used to receive/return OptionBool
instead.
Note that due to the internal conversion it is generally impossible to create
iter_mut()
or as_mut_slice()
methods. Therefore those methods cannot be
supported.
Not only does OptionBool
improve space efficiency as opposed to
Option<bool>
, most methods also perform a little faster in my benchmarks. On
nightly, On an Intel(R) Core(TM)2 Quad CPU Q8400 @
2.66GHz running LUbuntu 15.04 with a 3.19.0-23-generic kernel and Rust
1.8.0-nightly as of 2016-01-22, I get the following results:
``` test benchandboolopt ... bench: 1,490 ns/iter (+/- 38) test benchandopt ... bench: 1,667 ns/iter (+/- 37) test benchandstd ... bench: 1,695 ns/iter (+/- 30) test benchassliceiteropt ... bench: 2,211 ns/iter (+/- 16) test benchassliceopt ... bench: 1,507 ns/iter (+/- 23) test benchfromopt ... bench: 1,795 ns/iter (+/- 137) test benchissomeopt ... bench: 1,443 ns/iter (+/- 17) test benchissomestd ... bench: 1,659 ns/iter (+/- 17) test benchiteropt ... bench: 2,212 ns/iter (+/- 39) test benchiterstd ... bench: 1,553 ns/iter (+/- 22) test benchmapinvertopt ... bench: 2,918 ns/iter (+/- 35) test benchmapinvertoptbool ... bench: 2,063 ns/iter (+/- 23) test benchmapinvertstd ... bench: 2,510 ns/iter (+/- 36) test benchmaporelseopt ... bench: 2,268 ns/iter (+/- 35) test benchmaporelsestd ... bench: 2,309 ns/iter (+/- 33) test benchmaporopt ... bench: 1,669 ns/iter (+/- 19) test benchmaporstd ... bench: 1,975 ns/iter (+/- 26) test benchorboolopt ... bench: 1,424 ns/iter (+/- 33) test benchorelseboolopt ... bench: 1,654 ns/iter (+/- 30) test benchorelseopt ... bench: 1,766 ns/iter (+/- 24) test benchorelsestd ... bench: 1,529 ns/iter (+/- 13) test benchoropt ... bench: 1,806 ns/iter (+/- 50) test benchorstd ... bench: 1,729 ns/iter (+/- 28) test benchtoopt ... bench: 1,979 ns/iter (+/- 87) test benchunwrapopt ... bench: 1,700 ns/iter (+/- 29) test benchunwraporelseopt ... bench: 1,666 ns/iter (+/- 19) test benchunwraporelsestd ... bench: 2,149 ns/iter (+/- 31) test benchunwraporopt ... bench: 1,653 ns/iter (+/- 23) test benchunwraporstd ... bench: 2,124 ns/iter (+/- 30) test benchunwrap_std ... bench: 1,645 ns/iter (+/- 20)
[...]
test benchassliceiteroptf32 ... bench: 2,090 ns/iter (+/- 35) test benchassliceiteroptf64 ... bench: 1,870 ns/iter (+/- 33) test benchassliceiteropti16 ... bench: 1,937 ns/iter (+/- 24) test benchassliceiteropti32 ... bench: 2,028 ns/iter (+/- 47) test benchassliceiteropti64 ... bench: 1,680 ns/iter (+/- 32) test benchassliceiteropti8 ... bench: 2,032 ns/iter (+/- 16) test benchassliceiteroptu16 ... bench: 1,937 ns/iter (+/- 28) test benchassliceiteroptu32 ... bench: 2,030 ns/iter (+/- 59) test benchassliceiteroptu64 ... bench: 1,775 ns/iter (+/- 135) test benchassliceiteroptu8 ... bench: 2,031 ns/iter (+/- 23) test benchissomeoptf32 ... bench: 1,721 ns/iter (+/- 17) test benchissomeoptf64 ... bench: 1,721 ns/iter (+/- 24) test benchissomeoptu16 ... bench: 1,711 ns/iter (+/- 26) test benchissomeoptu32 ... bench: 1,677 ns/iter (+/- 25) test benchissomeoptu64 ... bench: 1,664 ns/iter (+/- 31) test benchissomeoptu8 ... bench: 1,724 ns/iter (+/- 22) test benchissomestdf32 ... bench: 1,466 ns/iter (+/- 22) test benchissomestdf64 ... bench: 1,465 ns/iter (+/- 18) test benchissomestdu16 ... bench: 1,470 ns/iter (+/- 29) test benchissomestdu32 ... bench: 1,465 ns/iter (+/- 18) test benchissomestdu64 ... bench: 1,474 ns/iter (+/- 61) test benchissomestdu8 ... bench: 1,850 ns/iter (+/- 35) test benchiteroptf32 ... bench: 1,828 ns/iter (+/- 17) test benchiteroptf64 ... bench: 1,845 ns/iter (+/- 25) test benchiteropti16 ... bench: 1,755 ns/iter (+/- 17) test benchiteropti32 ... bench: 1,755 ns/iter (+/- 18) test benchiteropti64 ... bench: 1,547 ns/iter (+/- 43) test benchiteropti8 ... bench: 1,754 ns/iter (+/- 17) test benchiteroptu16 ... bench: 1,754 ns/iter (+/- 21) test benchiteroptu32 ... bench: 1,563 ns/iter (+/- 16) test benchiteroptu64 ... bench: 1,534 ns/iter (+/- 20) test benchiteroptu8 ... bench: 1,754 ns/iter (+/- 18) test benchiterstdf32 ... bench: 1,563 ns/iter (+/- 39) test benchiterstdf64 ... bench: 1,587 ns/iter (+/- 17) test benchiterstdi16 ... bench: 1,487 ns/iter (+/- 32) test benchiterstdi32 ... bench: 1,587 ns/iter (+/- 20) test benchiterstdi64 ... bench: 1,587 ns/iter (+/- 25) test benchiterstdi8 ... bench: 1,631 ns/iter (+/- 98) test benchiterstdu16 ... bench: 1,488 ns/iter (+/- 23) test benchiterstdu32 ... bench: 1,590 ns/iter (+/- 59) test benchiterstdu64 ... bench: 1,587 ns/iter (+/- 25) test benchiterstdu8 ... bench: 1,623 ns/iter (+/- 72) test benchmapoptf32 ... bench: 1,959 ns/iter (+/- 67) test benchmapoptf64 ... bench: 1,654 ns/iter (+/- 40) test benchmapoptu16 ... bench: 1,789 ns/iter (+/- 31) test benchmapoptu32 ... bench: 2,431 ns/iter (+/- 43) test benchmapoptu64 ... bench: 1,432 ns/iter (+/- 32) test benchmapoptu8 ... bench: 1,813 ns/iter (+/- 18) test benchmaporoptf32 ... bench: 1,623 ns/iter (+/- 17) test benchmaporoptf64 ... bench: 1,669 ns/iter (+/- 22) test benchmaporoptu16 ... bench: 1,717 ns/iter (+/- 18) test benchmaporoptu32 ... bench: 1,640 ns/iter (+/- 19) test benchmaporoptu64 ... bench: 1,579 ns/iter (+/- 40) test benchmaporoptu8 ... bench: 1,814 ns/iter (+/- 20) test benchmaporstdf32 ... bench: 1,537 ns/iter (+/- 28) test benchmaporstdf64 ... bench: 1,777 ns/iter (+/- 28) test benchmaporstdu16 ... bench: 1,931 ns/iter (+/- 37) test benchmaporstdu32 ... bench: 1,807 ns/iter (+/- 22) test benchmaporstdu64 ... bench: 1,786 ns/iter (+/- 15) test benchmaporstdu8 ... bench: 2,010 ns/iter (+/- 19) test benchmapstdf32 ... bench: 1,811 ns/iter (+/- 37) test benchmapstdf64 ... bench: 1,925 ns/iter (+/- 45) test benchmapstdu16 ... bench: 2,357 ns/iter (+/- 23) test benchmapstdu32 ... bench: 2,262 ns/iter (+/- 102) test benchmapstdu64 ... bench: 1,933 ns/iter (+/- 48) test benchmapstdu8 ... bench: 2,545 ns/iter (+/- 65) ```
Apart from OptionBool
, there is a struct Optioned<T>
that is similar to
Option but needs no additional storage, declaring a None value instead. Their
are impls For i8..64
, u8..64
, isize
, usize
, f32
and f64
, and it's
easy enough to Implement it for your own type (have a look at the Noned trait).
The None value for the int types is their MIN
, for the unsigned types is
their MAX
and for floats is NAN
(regardless of sign).
You also may want to have a look at the very well documented Option type, on which this crate is based.
Licensed under either of
at your option.
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.