26 releases (6 stable)
Uses old Rust 2015
new 1.3.2 | Apr 17, 2021 |
---|---|
0.1.20 | Jan 8, 2021 |
0.1.18 | Oct 22, 2020 |
0.1.17 | Jun 3, 2020 |
0.1.4 | Oct 6, 2018 |
#9 in No standard library
433 downloads per month
Used in 17 crates
(11 directly)
365KB
6K
SLoC
Extension traits for many standard/core library types/traits. and other miscelaneuous types / traits / functions / macros.
Adding as dependency
This crate requires cargo features for enabling items, to get all of them you can use:
[dependencies.core_extensions]
version = "1.0"
features = ["std", "all_items"]
The "std" feature is required to enable impls and items that use std
types,
otherwise only the core
library is supported.
For enabling features individually, look here.
This crate currently requires cargo features to use newer language features,
Examples
Showcasing some features from this crate.
quasiconst
, generic constants.
The quasiconst
macro allows emulating generic constants by generating a
zero-sized generic type that implements the ConstVal
trait,
the preferred way to get its value is the getconst
macro.
This example demonstrates how you can use them to declare a generic VTABLE constant.
use core_extensions::{getconst, quasiconst};
use std::fmt::{self, Debug};
quasiconst!{
pub const VTABLE<T: Debug>: &'static Vtable = &Vtable {
size: std::mem::size_of::<T>(),
align: std::mem::align_of::<T>(),
drop: drop_erased::<T>,
fmt: debug_fmt_erased::<T>,
};
}
fn main() {
const VTABLE_U8: &'static Vtable = getconst!(VTABLE<u8>);
assert_eq!(VTABLE_U8.size, 1);
assert_eq!(VTABLE_U8.align, 1);
const VTABLE_USIZE: &'static Vtable = getconst!(VTABLE<usize>);
assert_eq!(VTABLE_USIZE.size, std::mem::size_of::<usize>());
assert_eq!(VTABLE_USIZE.align, std::mem::align_of::<usize>());
const VTABLE_STRING: &'static Vtable = getconst!(VTABLE<&str>);
assert_eq!(VTABLE_STRING.size, std::mem::size_of::<usize>() * 2);
assert_eq!(VTABLE_STRING.align, std::mem::align_of::<usize>());
}
pub struct Vtable {
pub size: usize,
pub align: usize,
pub drop: unsafe fn(*mut ()),
pub fmt: unsafe fn(*const (), &mut fmt::Formatter<'_>) -> fmt::Result,
}
unsafe fn drop_erased<T>(ptr: *mut ()) {
std::ptr::drop_in_place(ptr as *mut T)
}
unsafe fn debug_fmt_erased<T>(ptr: *const (), f: &mut fmt::Formatter<'_>) -> fmt::Result
where
T: Debug,
{
let this = unsafe{ &*(ptr as *const T) };
Debug::fmt(this, f)
}
no-std support
This crate works in #![no_std]
contexts by default.
Supported Rust versions
This crate support Rust back to 1.41.0, requiring cargo features to use language features from newer versions.
Cargo Features
crate features
The "all_items"
feature enables all of these features,
you can use it instead of the ones below if you don't mind longer compile-times:
-
"bools"
: Enables theBoolExt
trait, extension trait forbool
. -
"callable"
: Enables thecallable
module, with stably implementable equivalents of theFn*
traits. -
"collections"
: Enables thecollections
module, with traits for collection types. -
"const_default"
: Enables theConstDefault
trait, andconst_default
macro, for aconst
equivalent of theDefault
trait. -
"const_val"
: Enables theConstVal
trait (for types that represent constants),getconst
macro (for getting theConstVal::VAL
associated constant), andquasiconst
macro (for declaring types that emulate generic constants). Enables the"generics_parsing"
feature. -
"macro_utils
: Enables therewrap_macro_parameters
,count_tts
, andgen_ident_range
macro. -
"generics_parsing"
: Enables theparse_generics
,parse_generics_and_where
,split_generics_and_where
,parse_split_generics
, andparse_split_generics_and_where
macros. These allow macros to parse items with generic parameters. -
"item_parsing"
: Enables the"macro_utils
and"generics_parsing"
features. Enables theimpl_parse_generics
andimpl_split
macros. -
"integers"
: Enables theintegers
module, with extension traits for integer types. -
"iterators"
: Enables theiterators
module, with theIteratorExt
extension trait for iterators, and a few iterator types. -
"marker_type"
: Enables theMarkerType
trait, for trivially constructible, zero-sized, and aligned-to-1 types. -
"on_drop"
: Enables theRunOnDrop
type, a wrapper type that runs a closure at the end of the scope. -
"option_result"
: Enables theoption_result_ext
module, with traits forOption
andResult
-like types. -
"phantom"
: Enables thephantom
module(withPhantomData
-related items),expr_as_phantom
macro,map_phantomdata
macro, andreturn_type_phantom
macro. -
"self_ops"
: Enables theSelfOps
trait, an extension trait for all types. It primarily has methods for calling free functions as methods. -
"slices"
: Enables theslices
module, with extension traits for[T]
andstr
slices. -
"strings"
: Enables thestrings
module, with theStringExt
extension trait for strings. -
"transparent_newtype"
: Enables thetransparent_newtype
module, with extension traits and functions for#[repr(transparent)]
newtypes with public fields. -
"type_asserts"
: Enables thetype_asserts
module, with type-level assertiosn, most useful in tests. -
"type_identity"
: Enables theTypeIdentity
trait, for proving that two types are equal, and converting between them in a generic context. -
"type_level_bool"
: Enables thetype_level_bool
module, which encodesbool
s on the type-level. -
"void"
: Enables theVoid
type, a type that can't be constructed, for encodign impossible situations.
Rust Version numbers
These features enable code that require some Rust version past the minimum supported one:
-
"rust_1_46": Makes
TransparentNewtype
andTypeIdentity
associated functions that takeRc<Self>
orArc<Self>
callable as methods. -
"rust_1_51": Enables the "rust_1_46" feature, and impls of traits for all array lengths.
Support for other crates
All of these are disabled by default:
-
"std"
: Enablesstd
library support. Implies the"alloc"
feature. -
"alloc"
: Enablesalloc
library support. -
"serde_"
: Enables serde support.
Miscelaneous features
"track_caller"
:
Enables the "rust_1_46" feature.
Changes ResultLike
to allow getting the caller location in ResultLike::into_result_
,
and makes IsNoneError
store where it was constructed.
"docsrs"
: Used to document the required features in docs.rs, requires Rust nightly.
Doesn't enable any items itself.
License
core_extensions is licensed under either of
Apache License, Version 2.0, (LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0)
MIT license (LICENSE-MIT or http://opensource.org/licenses/MIT)
at your option.
Contribution
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in core_extensions by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.