Skip to content

Commit e9c737d

Browse files
committed
Add extra traits for haiku datatypes
1 parent 9769c03 commit e9c737d

File tree

2 files changed

+110
-4
lines changed

2 files changed

+110
-4
lines changed

src/fuchsia/mod.rs

-1
Original file line numberDiff line numberDiff line change
@@ -976,7 +976,6 @@ s_no_extra_traits! {
976976
}
977977
}
978978

979-
980979
cfg_if! {
981980
if #[cfg(feature = "extra_traits")] {
982981
impl PartialEq for sysinfo {

src/unix/haiku/mod.rs

+110-3
Original file line numberDiff line numberDiff line change
@@ -309,21 +309,18 @@ s! {
309309
}
310310

311311
s_no_extra_traits! {
312-
#[allow(missing_debug_implementations)]
313312
pub struct sockaddr_un {
314313
pub sun_len: u8,
315314
pub sun_family: sa_family_t,
316315
pub sun_path: [::c_char; 126]
317316
}
318-
#[allow(missing_debug_implementations)]
319317
pub struct sockaddr_storage {
320318
pub ss_len: u8,
321319
pub ss_family: sa_family_t,
322320
__ss_pad1: [u8; 6],
323321
__ss_pad2: u64,
324322
__ss_pad3: [u8; 112],
325323
}
326-
#[allow(missing_debug_implementations)]
327324
pub struct dirent {
328325
pub d_dev: dev_t,
329326
pub d_pdev: dev_t,
@@ -334,6 +331,116 @@ s_no_extra_traits! {
334331
}
335332
}
336333

334+
cfg_if! {
335+
if #[cfg(feature = "extra_traits")] {
336+
impl PartialEq for sockaddr_un {
337+
fn eq(&self, other: &sockaddr_un) -> bool {
338+
self.sun_len == other.sun_len
339+
&& self.sun_family == other.sun_family
340+
&& self
341+
.sun_path
342+
.iter()
343+
.zip(other.sun_path.iter())
344+
.all(|(a,b)| a == b)
345+
}
346+
}
347+
impl Eq for sockaddr_un {}
348+
impl ::fmt::Debug for sockaddr_un {
349+
fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result {
350+
f.debug_struct("sockaddr_un")
351+
.field("sun_len", &self.sun_len)
352+
.field("sun_family", &self.sun_family)
353+
// FIXME: .field("sun_path", &self.sun_path)
354+
.finish()
355+
}
356+
}
357+
impl ::hash::Hash for sockaddr_un {
358+
fn hash<H: ::hash::Hasher>(&self, state: &mut H) {
359+
self.sun_len.hash(state);
360+
self.sun_family.hash(state);
361+
self.sun_path.hash(state);
362+
}
363+
}
364+
365+
impl PartialEq for sockaddr_storage {
366+
fn eq(&self, other: &sockaddr_storage) -> bool {
367+
self.ss_len == other.ss_len
368+
&& self.ss_family == other.ss_family
369+
&& self
370+
.__ss_pad1
371+
.iter()
372+
.zip(other.__ss_pad1.iter())
373+
.all(|(a, b)| a == b)
374+
&& self.__ss_pad2 == other.__ss_pad2
375+
&& self
376+
.__ss_pad3
377+
.iter()
378+
.zip(other.__ss_pad3.iter())
379+
.all(|(a, b)| a == b)
380+
}
381+
}
382+
impl Eq for sockaddr_storage {}
383+
impl ::fmt::Debug for sockaddr_storage {
384+
fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result {
385+
f.debug_struct("sockaddr_storage")
386+
.field("ss_len", &self.ss_len)
387+
.field("ss_family", &self.ss_family)
388+
.field("__ss_pad1", &self.__ss_pad1)
389+
.field("__ss_pad2", &self.__ss_pad2)
390+
// FIXME: .field("__ss_pad3", &self.__ss_pad3)
391+
.finish()
392+
}
393+
}
394+
impl ::hash::Hash for sockaddr_storage {
395+
fn hash<H: ::hash::Hasher>(&self, state: &mut H) {
396+
self.ss_len.hash(state);
397+
self.ss_family.hash(state);
398+
self.__ss_pad1.hash(state);
399+
self.__ss_pad2.hash(state);
400+
self.__ss_pad3.hash(state);
401+
}
402+
}
403+
404+
impl PartialEq for dirent {
405+
fn eq(&self, other: &dirent) -> bool {
406+
self.d_dev == other.d_dev
407+
&& self.d_pdev == other.d_pdev
408+
&& self.d_ino == other.d_ino
409+
&& self.d_pino == other.d_pino
410+
&& self.d_reclen == other.d_reclen
411+
&& self
412+
.d_name
413+
.iter()
414+
.zip(other.d_name.iter())
415+
.all(|(a,b)| a == b)
416+
}
417+
}
418+
impl Eq for dirent {}
419+
impl ::fmt::Debug for dirent {
420+
fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result {
421+
f.debug_struct("dirent")
422+
.field("d_dev", &self.d_dev)
423+
.field("d_pdev", &self.d_pdev)
424+
.field("d_ino", &self.d_ino)
425+
.field("d_pino", &self.d_pino)
426+
.field("d_reclen", &self.d_reclen)
427+
// FIXME: .field("d_name", &self.d_name)
428+
.finish()
429+
}
430+
}
431+
impl ::hash::Hash for dirent {
432+
fn hash<H: ::hash::Hasher>(&self, state: &mut H) {
433+
self.d_dev.hash(state);
434+
self.d_pdev.hash(state);
435+
self.d_ino.hash(state);
436+
self.d_pino.hash(state);
437+
self.d_reclen.hash(state);
438+
self.d_name.hash(state);
439+
}
440+
}
441+
}
442+
}
443+
337444
// intentionally not public, only used for fd_set
338445
cfg_if! {
339446
if #[cfg(target_pointer_width = "32")] {

0 commit comments

Comments
 (0)