// Bitcoin secp256k1 bindings // Written in 2014 by // Dawid Ciężarkiewicz // Andrew Poelstra // // To the extent possible under law, the author(s) have dedicated all // copyright and related and neighboring rights to this software to // the public domain worldwide. This software is distributed without // any warranty. // // You should have received a copy of the CC0 Public Domain Dedication // along with this software. // If not, see . // /// Implement methods and traits for types that contain an inner array. #[macro_export] macro_rules! impl_array_newtype { ($thing:ident, $ty:ty, $len:expr) => { impl Copy for $thing {} impl AsRef<[$ty; $len]> for $thing { #[inline] /// Gets a reference to the underlying array fn as_ref(&self) -> &[$ty; $len] { let &$thing(ref dat) = self; dat } } impl PartialEq for $thing { #[inline] fn eq(&self, other: &$thing) -> bool { &self[..] == &other[..] } } impl Eq for $thing {} impl core::hash::Hash for $thing { fn hash(&self, state: &mut H) { (&self[..]).hash(state) } } impl PartialOrd for $thing { #[inline] fn partial_cmp(&self, other: &$thing) -> Option { self[..].partial_cmp(&other[..]) } } impl Ord for $thing { #[inline] fn cmp(&self, other: &$thing) -> core::cmp::Ordering { self[..].cmp(&other[..]) } } impl Clone for $thing { #[inline] fn clone(&self) -> $thing { let &$thing(ref dat) = self; $thing(dat.clone()) } } impl core::ops::Index for $thing where [$ty]: core::ops::Index, { type Output = <[$ty] as core::ops::Index>::Output; #[inline] fn index(&self, index: I) -> &Self::Output { &self.0[index] } } impl $crate::CPtr for $thing { type Target = $ty; fn as_c_ptr(&self) -> *const Self::Target { let &$thing(ref dat) = self; dat.as_ptr() } fn as_mut_c_ptr(&mut self) -> *mut Self::Target { let &mut $thing(ref mut dat) = self; dat.as_mut_ptr() } } } } #[macro_export] macro_rules! impl_raw_debug { ($thing:ident) => { impl core::fmt::Debug for $thing { fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result { for i in self[..].iter().cloned() { write!(f, "{:02x}", i)?; } Ok(()) } } } }