2 releases
0.1.1 | Dec 25, 2023 |
---|---|
0.1.0 | Aug 22, 2023 |
#7 in #c-like
Used in hirun
7KB
95 lines
hioff
The original name is hun_offsetof
. Provides C-like macros: offset_of
and container_of
interfaces
offset_of!(type, member) -> usize;
container_of!(&obj, type, member) -> &type;
container_of_mut!(&obj, type, member) -> &mut type;
Examples
extern crate hun_offsetof as hun;
#[repr(C)]
struct Bar {
key: i32,
value: i32,
}
#[repr(C)]
struct Foo {
key: i32,
value: [Bar; 2],
}
assert_eq!(hun::offset_of!(Bar, value), 4);
assert_eq!(hun::offset_of!(Foo, value[1].key), 12);
let foo = Foo {
key: 1,
value: [ Bar { key: 2, value: 2}, Bar { key: 3, value: 3 }],
};
let value = &foo.value[1].value;
let obj = unsafe { hun::container_of!(value, Foo, value[1].value) };
assert_eq!(obj as *const _, &foo as *const _);
lib.rs
:
Provides C-like macros: offset_of and container_of
Examples
extern crate hioff as hun;
#[repr(C)]
struct Bar {
key: i32,
value: i32,
}
#[repr(C)]
struct Foo {
key: i32,
value: [Bar; 2],
}
assert_eq!(hun::offset_of!(Bar, value), 4);
assert_eq!(hun::offset_of!(Foo, value[1].key), 12);
let foo = Foo {
key: 1,
value: [ Bar { key: 2, value: 2}, Bar { key: 3, value: 3 }],
};
let value = &foo.value[1].value;
let obj = unsafe { hun::container_of!(value, Foo, value[1].value) };
assert_eq!(obj as *const _, &foo as *const _);
Dependencies
~1.5MB
~37K SLoC