A Rust macro for defining integer-backed opaque types safely.
Originally inspired by code from Redox OS, this crate provides a convenient way to create new types that are backed by primitive integers (typically usize), providing type safety without compromising performance.
- Create simple opaque types backed by any integer type
- Generate corresponding atomic types with thread-safe operations
- Zero-cost abstraction - the new types have the same size as their backing types
- Full support for common derives (
Debug,Clone,Copy,Hash,Eq,PartialEq,Ord,PartialOrd)
Add this to your Cargo.toml:
[dependencies]
int_like = "0.1.0"Define a simple type backed by usize:
use int_like::int_like;
/// Define an opaque type `Pid` backed by a `usize`.
int_like!(Pid, usize);
const ZERO: Pid = Pid::from(0);
let pid = Pid::from(42);
assert_eq!(pid.into(), 42);Define both a regular type and its atomic counterpart:
use int_like::int_like;
use std::sync::atomic::Ordering;
/// Define opaque types `Pid` and `AtomicPid`, backed respectively by a `usize`
/// and an `AtomicUsize`.
int_like!(Pid, AtomicPid, usize, AtomicUsize);
const ZERO: Pid = Pid::from(0);
let ATOMIC_PID: AtomicPid = AtomicPid::default();
// Atomic operations
ATOMIC_PID.store(Pid::from(100), Ordering::SeqCst);
let value = ATOMIC_PID.load(Ordering::SeqCst);
assert_eq!(value, Pid::from(100));For simple types:
from(x: T) -> Self- Create from the backing typenew(x: T) -> Self- Alternative constructorinto() -> T- Convert back to the backing typedata() -> T- Get the backing value
For atomic types:
new(x: T) -> Self- Create from the non-atomic typedefault() -> Self- Create with zero valueload(ordering) -> T- Atomic loadstore(val, ordering)- Atomic storeswap(val, ordering) -> T- Atomic swapcompare_exchange(current, new, success, failure) -> Result<T, T>- CAS operationcompare_exchange_weak(current, new, success, failure) -> Result<T, T>- Weak CASfetch_add(val, ordering) -> T- Atomic add
This project is licensed under the MIT License - see the LICENSE file for details.