Skip to content

Commit 9eaa6eb

Browse files
committed
Use addr_of where applicable
1 parent 4ac7433 commit 9eaa6eb

15 files changed

+56
-48
lines changed

src/class.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use std::fmt;
22
use std::mem;
3-
use std::ptr;
3+
use std::ptr::{self, addr_of};
44

55
use crate::internal_prelude::*;
66

@@ -53,7 +53,7 @@ pub trait ObjectClass: Sized {
5353
unsafe fn cast_unchecked<T: ObjectClass>(self) -> T {
5454
// This method requires you to be 18 years or older to use it
5555
// (note: if it wasn't a trait method, it could be marked as const)
56-
let obj = ptr::read((&self as *const Self).cast());
56+
let obj = ptr::read(addr_of!(self).cast());
5757
mem::forget(self);
5858
obj
5959
}

src/dim.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ macro_rules! impl_tuple {
7272
#[inline]
7373
fn dims(&self) -> Vec<Ix> {
7474
unsafe {
75-
slice::from_raw_parts(self as *const _ as *const _, self.ndim())
75+
slice::from_raw_parts((self as *const Self).cast(), self.ndim())
7676
}.iter().cloned().collect()
7777
}
7878
}

src/error.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use std::error::Error as StdError;
33
use std::fmt;
44
use std::ops::Deref;
55
use std::panic;
6-
use std::ptr;
6+
use std::ptr::{self, addr_of_mut};
77

88
use ndarray::ShapeError;
99

@@ -95,7 +95,7 @@ impl ErrorStack {
9595
}
9696

9797
let mut data = CallbackData { stack: ExpandedErrorStack::new(), err: None };
98-
let data_ptr: *mut c_void = (&mut data as *mut CallbackData).cast::<c_void>();
98+
let data_ptr: *mut c_void = addr_of_mut!(data).cast::<c_void>();
9999

100100
let stack_id = self.handle().id();
101101
h5lock!({

src/hl/attribute.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use std::fmt::{self, Debug};
22
use std::ops::Deref;
3+
use std::ptr::addr_of_mut;
34

45
use hdf5_sys::{
56
h5::{H5_index_t, H5_iter_order_t},
@@ -62,7 +63,7 @@ impl Attribute {
6263
let callback_fn: H5A_operator2_t = Some(attributes_callback);
6364
let iteration_position: *mut hsize_t = &mut { 0_u64 };
6465
let mut result: Vec<String> = Vec::new();
65-
let other_data: *mut c_void = &mut result as *const _ as *mut c_void;
66+
let other_data: *mut c_void = addr_of_mut!(result).cast();
6667

6768
h5call!(H5Aiterate2(
6869
obj.handle().id(),

src/hl/dataset.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -684,7 +684,7 @@ impl DatasetBuilderInner {
684684
///
685685
/// This requires the `lzf` crate feature
686686
pub fn lzf(&mut self) {
687-
self.with_dcpl(|pl| pl.lzf());
687+
self.with_dcpl(DatasetCreateBuilder::lzf);
688688
}
689689

690690
#[cfg(feature = "blosc")]

src/hl/dataspace.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ impl Dataspace {
145145
let mut len: size_t = 0;
146146
h5try!(H5Sencode1(self.id(), ptr::null_mut(), &mut len as *mut _));
147147
let mut buf = vec![0_u8; len];
148-
h5try!(H5Sencode1(self.id(), buf.as_mut_ptr().cast(), &mut len as *mut _));
148+
h5try!(H5Sencode1(self.id(), buf.as_mut_ptr().cast(), ptr::addr_of_mut!(len)));
149149
Ok(buf)
150150
})
151151
}

src/hl/datatype.rs

+11-8
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use std::borrow::Borrow;
22
use std::cmp::{Ordering, PartialEq, PartialOrd};
33
use std::fmt::{self, Debug, Display};
44
use std::ops::Deref;
5+
use std::ptr::{addr_of, addr_of_mut};
56

67
use hdf5_sys::h5t::{
78
H5T_cdata_t, H5T_class_t, H5T_cset_t, H5T_order_t, H5T_sign_t, H5T_str_t, H5Tarray_create2,
@@ -171,8 +172,8 @@ impl Datatype {
171172
let dst = dst.borrow();
172173
let mut cdata = H5T_cdata_t::default();
173174
h5lock!({
174-
let noop = H5Tfind(*H5T_NATIVE_INT, *H5T_NATIVE_INT, &mut (&mut cdata as *mut _));
175-
if H5Tfind(self.id(), dst.id(), &mut (&mut cdata as *mut _)) == noop {
175+
let noop = H5Tfind(*H5T_NATIVE_INT, *H5T_NATIVE_INT, &mut addr_of_mut!(cdata));
176+
if H5Tfind(self.id(), dst.id(), &mut addr_of_mut!(cdata)) == noop {
176177
Some(Conversion::NoOp)
177178
} else {
178179
match H5Tcompiler_conv(self.id(), dst.id()) {
@@ -235,7 +236,7 @@ impl Datatype {
235236
let mut members: Vec<EnumMember> = Vec::new();
236237
for idx in 0..h5try!(H5Tget_nmembers(id)) as _ {
237238
let mut value: u64 = 0;
238-
h5try!(H5Tget_member_value(id, idx, (&mut value as *mut u64).cast()));
239+
h5try!(H5Tget_member_value(id, idx, addr_of_mut!(value).cast()));
239240
let name = H5Tget_member_name(id, idx);
240241
members.push(EnumMember { name: string_from_cstr(name), value });
241242
h5_free_memory(name.cast());
@@ -277,7 +278,7 @@ impl Datatype {
277278
let ndims = h5try!(H5Tget_array_ndims(id));
278279
if ndims == 1 {
279280
let mut len: hsize_t = 0;
280-
h5try!(H5Tget_array_dims2(id, &mut len as *mut _));
281+
h5try!(H5Tget_array_dims2(id, addr_of_mut!(len)));
281282
Ok(TD::FixedArray(Box::new(base_dt.to_descriptor()?), len as _))
282283
} else {
283284
Err("Multi-dimensional array datatypes are not supported".into())
@@ -344,15 +345,17 @@ impl Datatype {
344345
}),
345346
TD::Boolean => {
346347
let bool_id = h5try!(H5Tenum_create(*H5T_NATIVE_INT8));
348+
let zero = 0_i8;
347349
h5try!(H5Tenum_insert(
348350
bool_id,
349351
b"FALSE\0".as_ptr().cast(),
350-
(&0_i8 as *const i8).cast()
352+
addr_of!(zero).cast(),
351353
));
354+
let one = 1_i8;
352355
h5try!(H5Tenum_insert(
353356
bool_id,
354357
b"TRUE\0".as_ptr().cast(),
355-
(&1_i8 as *const i8).cast()
358+
addr_of!(one).cast(),
356359
));
357360
Ok(bool_id)
358361
}
@@ -364,7 +367,7 @@ impl Datatype {
364367
h5try!(H5Tenum_insert(
365368
enum_id,
366369
name.as_ptr(),
367-
(&member.value as *const u64).cast()
370+
addr_of!(member.value).cast()
368371
));
369372
}
370373
Ok(enum_id)
@@ -383,7 +386,7 @@ impl Datatype {
383386
TD::FixedArray(ref ty, len) => {
384387
let elem_dt = Self::from_descriptor(ty)?;
385388
let dims = len as hsize_t;
386-
Ok(h5try!(H5Tarray_create2(elem_dt.id(), 1, &dims as *const _)))
389+
Ok(h5try!(H5Tarray_create2(elem_dt.id(), 1, addr_of!(dims))))
387390
}
388391
TD::FixedAscii(size) => string_type(Some(size), H5T_cset_t::H5T_CSET_ASCII),
389392
TD::FixedUnicode(size) => string_type(Some(size), H5T_cset_t::H5T_CSET_UTF8),

src/hl/filters.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use std::collections::HashMap;
2-
use std::ptr;
2+
use std::ptr::{self, addr_of_mut};
33

44
use hdf5_sys::h5p::{
55
H5Pget_filter2, H5Pget_nfilters, H5Pset_deflate, H5Pset_filter, H5Pset_fletcher32, H5Pset_nbit,
@@ -180,7 +180,7 @@ impl Filter {
180180
return FilterInfo::default();
181181
}
182182
let mut flags: c_uint = 0;
183-
h5lock!(H5Zget_filter_info(filter_id, &mut flags as *mut _));
183+
h5lock!(H5Zget_filter_info(filter_id, addr_of_mut!(flags)));
184184
FilterInfo {
185185
is_available: true,
186186
encode_enabled: flags & H5Z_FILTER_CONFIG_ENCODE_ENABLED != 0,
@@ -503,8 +503,8 @@ impl Filter {
503503
let filter_id = h5try!(H5Pget_filter2(
504504
plist_id,
505505
idx as _,
506-
&mut flags as *mut _,
507-
&mut cd_nelmts as *mut _,
506+
addr_of_mut!(flags),
507+
addr_of_mut!(cd_nelmts),
508508
cd_values.as_mut_ptr(),
509509
name.len() as _,
510510
name.as_mut_ptr(),

src/hl/filters/blosc.rs

+9-9
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use std::ptr;
1+
use std::ptr::{self, addr_of_mut};
22
use std::slice;
33

44
use lazy_static::lazy_static;
@@ -25,7 +25,7 @@ const BLOSC_FILTER_NAME: &[u8] = b"blosc\0";
2525
pub const BLOSC_FILTER_ID: H5Z_filter_t = 32001;
2626
const BLOSC_FILTER_VERSION: c_uint = 2;
2727

28-
const BLOSC_FILTER_INFO: H5Z_class2_t = H5Z_class2_t {
28+
const BLOSC_FILTER_INFO: &H5Z_class2_t = &H5Z_class2_t {
2929
version: H5Z_CLASS_T_VERS as _,
3030
id: BLOSC_FILTER_ID,
3131
encoder_present: 1,
@@ -41,7 +41,7 @@ lazy_static! {
4141
unsafe {
4242
blosc_init();
4343
}
44-
let ret = unsafe { H5Zregister((&BLOSC_FILTER_INFO as *const H5Z_class2_t).cast()) };
44+
let ret = unsafe { H5Zregister((BLOSC_FILTER_INFO as *const H5Z_class2_t).cast()) };
4545
if H5ErrorCode::is_err_code(ret) {
4646
return Err("Can't register Blosc filter");
4747
}
@@ -62,8 +62,8 @@ extern "C" fn set_local_blosc(dcpl_id: hid_t, type_id: hid_t, _space_id: hid_t)
6262
H5Pget_filter_by_id2(
6363
dcpl_id,
6464
BLOSC_FILTER_ID,
65-
&mut flags as *mut _,
66-
&mut nelmts as *mut _,
65+
addr_of_mut!(flags),
66+
addr_of_mut!(nelmts),
6767
values.as_mut_ptr(),
6868
0,
6969
ptr::null_mut(),
@@ -158,7 +158,7 @@ fn parse_blosc_cdata(cd_nelmts: size_t, cd_values: *const c_uint) -> Option<Blos
158158
cfg.doshuffle = cdata[5] as _;
159159
}
160160
if cdata.len() >= 7 {
161-
let r = unsafe { blosc_compcode_to_compname(cdata[6] as _, &mut cfg.compname as *mut _) };
161+
let r = unsafe { blosc_compcode_to_compname(cdata[6] as _, addr_of_mut!(cfg.compname)) };
162162
if r == -1 {
163163
let complist = string_from_cstr(unsafe { blosc_list_compressors() });
164164
let errmsg = format!(
@@ -221,9 +221,9 @@ unsafe fn filter_blosc_decompress(
221221
let (mut cbytes, mut blocksize): (size_t, size_t) = (0, 0);
222222
blosc_cbuffer_sizes(
223223
*buf,
224-
&mut outbuf_size as *mut _,
225-
&mut cbytes as *mut _,
226-
&mut blocksize as *mut _,
224+
addr_of_mut!(outbuf_size),
225+
addr_of_mut!(cbytes),
226+
addr_of_mut!(blocksize),
227227
);
228228
let outbuf = libc::malloc(outbuf_size);
229229
if outbuf.is_null() {

src/hl/filters/lzf.rs

+5-5
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use std::ptr;
1+
use std::ptr::{self, addr_of_mut};
22
use std::slice;
33

44
use lazy_static::lazy_static;
@@ -15,7 +15,7 @@ const LZF_FILTER_NAME: &[u8] = b"lzf\0";
1515
pub const LZF_FILTER_ID: H5Z_filter_t = 32000;
1616
const LZF_FILTER_VERSION: c_uint = 4;
1717

18-
const LZF_FILTER_INFO: H5Z_class2_t = H5Z_class2_t {
18+
const LZF_FILTER_INFO: &H5Z_class2_t = &H5Z_class2_t {
1919
version: H5Z_CLASS_T_VERS as _,
2020
id: LZF_FILTER_ID,
2121
encoder_present: 1,
@@ -28,7 +28,7 @@ const LZF_FILTER_INFO: H5Z_class2_t = H5Z_class2_t {
2828

2929
lazy_static! {
3030
static ref LZF_INIT: Result<(), &'static str> = {
31-
let ret = unsafe { H5Zregister((&LZF_FILTER_INFO as *const H5Z_class2_t).cast()) };
31+
let ret = unsafe { H5Zregister((LZF_FILTER_INFO as *const H5Z_class2_t).cast()) };
3232
if H5ErrorCode::is_err_code(ret) {
3333
return Err("Can't register LZF filter");
3434
}
@@ -49,8 +49,8 @@ extern "C" fn set_local_lzf(dcpl_id: hid_t, type_id: hid_t, _space_id: hid_t) ->
4949
H5Pget_filter_by_id2(
5050
dcpl_id,
5151
LZF_FILTER_ID,
52-
&mut flags as *mut _,
53-
&mut nelmts as *mut _,
52+
addr_of_mut!(flags),
53+
addr_of_mut!(nelmts),
5454
values.as_mut_ptr(),
5555
0,
5656
ptr::null_mut(),

src/hl/group.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use std::fmt::{self, Debug};
22
use std::ops::Deref;
33
use std::panic;
4+
use std::ptr::addr_of_mut;
45

56
use hdf5_sys::{
67
h5::{hsize_t, H5_index_t, H5_iter_order_t},
@@ -339,7 +340,7 @@ impl Group {
339340

340341
// Store our references on the heap
341342
let mut vtable = Vtable { f: &mut op, d: &mut val };
342-
let other_data = (&mut vtable as *mut Vtable<_, _>).cast::<c_void>();
343+
let other_data = addr_of_mut!(vtable).cast::<c_void>();
343344

344345
h5call!(H5Literate(
345346
self.id(),

src/hl/plist.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use std::fmt::{self, Debug, Display};
22
use std::ops::Deref;
33
use std::panic;
4-
use std::ptr;
4+
use std::ptr::{self, addr_of_mut};
55
use std::str::FromStr;
66

77
use hdf5_sys::h5p::{
@@ -184,7 +184,7 @@ impl PropertyList {
184184
}
185185

186186
let mut data = Vec::new();
187-
let data_ptr: *mut c_void = (&mut data as *mut Vec<_>).cast();
187+
let data_ptr: *mut c_void = addr_of_mut!(data).cast();
188188

189189
h5lock!(H5Piterate(self.id(), ptr::null_mut(), Some(callback), data_ptr));
190190
data

src/hl/plist/dataset_create.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
33
use std::fmt::{self, Debug};
44
use std::ops::Deref;
5-
use std::ptr;
5+
use std::ptr::{self, addr_of_mut};
66

77
#[cfg(feature = "1.10.0")]
88
use bitflags::bitflags;
@@ -809,8 +809,8 @@ impl DatasetCreate {
809809
idx as _,
810810
NAME_LEN as _,
811811
name.as_mut_ptr(),
812-
&mut offset as *mut _,
813-
&mut size as *mut _,
812+
addr_of_mut!(offset),
813+
addr_of_mut!(size),
814814
));
815815
#[allow(clippy::absurd_extreme_comparisons)]
816816
external.push(ExternalFile {

src/hl/plist/file_access.rs

+9-7
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ use std::fmt::{self, Debug};
1313
use std::iter;
1414
use std::mem;
1515
use std::ops::Deref;
16-
use std::ptr;
16+
use std::ptr::{self, addr_of, addr_of_mut};
1717

1818
use bitflags::bitflags;
1919

@@ -1449,7 +1449,8 @@ impl FileAccessBuilder {
14491449
h5try!(H5Pset_evict_on_close(id, hbool_t::from(v)));
14501450
}
14511451
if let Some(v) = self.mdc_image_config {
1452-
h5try!(H5Pset_mdc_image_config(id, &v.into() as *const _));
1452+
let v = v.into();
1453+
h5try!(H5Pset_mdc_image_config(id, addr_of!(v)));
14531454
}
14541455
}
14551456
if let Some(v) = self.sieve_buf_size {
@@ -1480,7 +1481,8 @@ impl FileAccessBuilder {
14801481
}
14811482
}
14821483
if let Some(ref v) = self.mdc_config {
1483-
h5try!(H5Pset_mdc_config(id, &v.clone().into() as *const _));
1484+
let v = v.clone().into();
1485+
h5try!(H5Pset_mdc_config(id, addr_of!(v)));
14841486
}
14851487
Ok(())
14861488
}
@@ -1516,7 +1518,7 @@ impl FileAccess {
15161518
let mut drv = CoreDriver::default();
15171519
let mut increment: size_t = 0;
15181520
let mut filebacked: hbool_t = 0;
1519-
h5try!(H5Pget_fapl_core(self.id(), &mut increment as *mut _, &mut filebacked as *mut _));
1521+
h5try!(H5Pget_fapl_core(self.id(), addr_of_mut!(increment), addr_of_mut!(filebacked)));
15201522
drv.increment = increment as _;
15211523
drv.filebacked = filebacked > 0;
15221524
#[cfg(feature = "1.8.13")]
@@ -1525,8 +1527,8 @@ impl FileAccess {
15251527
let mut page_size: size_t = 0;
15261528
h5try!(H5Pget_core_write_tracking(
15271529
self.id(),
1528-
&mut is_enabled as *mut _,
1529-
&mut page_size as *mut _,
1530+
addr_of_mut!(is_enabled),
1531+
addr_of_mut!(page_size),
15301532
));
15311533
if is_enabled > 0 {
15321534
drv.write_tracking = page_size;
@@ -1558,7 +1560,7 @@ impl FileAccess {
15581560
memb_fapl.as_mut_ptr(),
15591561
memb_name.as_mut_ptr(),
15601562
memb_addr.as_mut_ptr(),
1561-
&mut relax as *mut _,
1563+
addr_of_mut!(relax),
15621564
));
15631565
let mut mapping: [u8; N] = unsafe { mem::zeroed() };
15641566
let mut layout = MultiLayout::default();

src/util.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@ pub fn to_cstring<S: Borrow<str>>(string: S) -> Result<CString> {
2121
/// Convert a fixed-length (possibly zero-terminated) char buffer to a string.
2222
pub fn string_from_fixed_bytes(bytes: &[c_char], len: usize) -> String {
2323
let len = bytes.iter().position(|&c| c == 0).unwrap_or(len);
24-
let s = unsafe { str::from_utf8_unchecked(&*(&bytes[..len] as *const _ as *const _)) };
24+
let bytes = &bytes[..len];
25+
let s = unsafe { str::from_utf8_unchecked(&*(bytes as *const [c_char] as *const [u8])) };
2526
s.to_owned()
2627
}
2728

0 commit comments

Comments
 (0)