Move impl_array_newtype to bitcoin_internals
`impl_array_newtype` is an internal macro, move it to a new, ever so meaningfully named, `macros` module. Use `#[macro_export]`, no other changes to the macro.
This commit is contained in:
parent
938b61bf66
commit
771cdde282
|
@ -10,9 +10,11 @@ use core::{convert, fmt, mem};
|
||||||
#[cfg(feature = "std")]
|
#[cfg(feature = "std")]
|
||||||
use std::error;
|
use std::error;
|
||||||
|
|
||||||
|
use bitcoin_internals::impl_array_newtype;
|
||||||
|
|
||||||
use crate::consensus::encode::{self, Decodable, Encodable, VarInt};
|
use crate::consensus::encode::{self, Decodable, Encodable, VarInt};
|
||||||
use crate::hashes::{sha256, siphash24, Hash};
|
use crate::hashes::{sha256, siphash24, Hash};
|
||||||
use crate::internal_macros::{impl_array_newtype, impl_bytes_newtype, impl_consensus_encoding};
|
use crate::internal_macros::{impl_bytes_newtype, impl_consensus_encoding};
|
||||||
use crate::prelude::*;
|
use crate::prelude::*;
|
||||||
use crate::util::endian;
|
use crate::util::endian;
|
||||||
use crate::{io, Block, BlockHash, BlockHeader, Transaction};
|
use crate::{io, Block, BlockHash, BlockHeader, Transaction};
|
||||||
|
|
|
@ -12,14 +12,14 @@ use core::fmt;
|
||||||
use core::ops::Index;
|
use core::ops::Index;
|
||||||
use core::str::FromStr;
|
use core::str::FromStr;
|
||||||
|
|
||||||
use bitcoin_internals::write_err;
|
use bitcoin_internals::{impl_array_newtype, write_err};
|
||||||
use secp256k1::{self, Secp256k1, XOnlyPublicKey};
|
use secp256k1::{self, Secp256k1, XOnlyPublicKey};
|
||||||
#[cfg(feature = "serde")]
|
#[cfg(feature = "serde")]
|
||||||
use serde;
|
use serde;
|
||||||
|
|
||||||
use crate::hash_types::XpubIdentifier;
|
use crate::hash_types::XpubIdentifier;
|
||||||
use crate::hashes::{hex, sha512, Hash, HashEngine, Hmac, HmacEngine};
|
use crate::hashes::{hex, sha512, Hash, HashEngine, Hmac, HmacEngine};
|
||||||
use crate::internal_macros::{impl_array_newtype, impl_bytes_newtype, serde_string_impl};
|
use crate::internal_macros::{impl_bytes_newtype, serde_string_impl};
|
||||||
use crate::io::Write;
|
use crate::io::Write;
|
||||||
use crate::network::constants::Network;
|
use crate::network::constants::Network;
|
||||||
use crate::prelude::*;
|
use crate::prelude::*;
|
||||||
|
|
|
@ -12,6 +12,8 @@ use crate::prelude::*;
|
||||||
|
|
||||||
use core::default::Default;
|
use core::default::Default;
|
||||||
|
|
||||||
|
use bitcoin_internals::impl_array_newtype;
|
||||||
|
|
||||||
use crate::hashes::hex::{self, HexIterator};
|
use crate::hashes::hex::{self, HexIterator};
|
||||||
use crate::hashes::{Hash, sha256d};
|
use crate::hashes::{Hash, sha256d};
|
||||||
use crate::blockdata::opcodes;
|
use crate::blockdata::opcodes;
|
||||||
|
@ -22,7 +24,7 @@ use crate::blockdata::block::{Block, BlockHeader, BlockVersion};
|
||||||
use crate::blockdata::witness::Witness;
|
use crate::blockdata::witness::Witness;
|
||||||
use crate::network::constants::Network;
|
use crate::network::constants::Network;
|
||||||
use crate::pow::CompactTarget;
|
use crate::pow::CompactTarget;
|
||||||
use crate::internal_macros::{impl_array_newtype, impl_bytes_newtype};
|
use crate::internal_macros::impl_bytes_newtype;
|
||||||
|
|
||||||
/// How many satoshis are in "one bitcoin"
|
/// How many satoshis are in "one bitcoin"
|
||||||
pub const COIN_VALUE: u64 = 100_000_000;
|
pub const COIN_VALUE: u64 = 100_000_000;
|
||||||
|
|
|
@ -46,67 +46,6 @@ macro_rules! impl_consensus_encoding {
|
||||||
}
|
}
|
||||||
pub(crate) use impl_consensus_encoding;
|
pub(crate) use impl_consensus_encoding;
|
||||||
|
|
||||||
/// Implements standard array methods for a given wrapper type
|
|
||||||
macro_rules! impl_array_newtype {
|
|
||||||
($thing:ident, $ty:ty, $len:literal) => {
|
|
||||||
impl $thing {
|
|
||||||
/// Converts the object to a raw pointer
|
|
||||||
#[inline]
|
|
||||||
pub fn as_ptr(&self) -> *const $ty {
|
|
||||||
let &$thing(ref dat) = self;
|
|
||||||
dat.as_ptr()
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Converts the object to a mutable raw pointer
|
|
||||||
#[inline]
|
|
||||||
pub fn as_mut_ptr(&mut self) -> *mut $ty {
|
|
||||||
let &mut $thing(ref mut dat) = self;
|
|
||||||
dat.as_mut_ptr()
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Returns the length of the object as an array
|
|
||||||
#[inline]
|
|
||||||
pub fn len(&self) -> usize { $len }
|
|
||||||
|
|
||||||
/// Returns whether the object, as an array, is empty. Always false.
|
|
||||||
#[inline]
|
|
||||||
pub fn is_empty(&self) -> bool { false }
|
|
||||||
|
|
||||||
/// Returns the underlying bytes.
|
|
||||||
#[inline]
|
|
||||||
pub fn as_bytes(&self) -> &[$ty; $len] { &self.0 }
|
|
||||||
|
|
||||||
/// Returns the underlying bytes.
|
|
||||||
#[inline]
|
|
||||||
pub fn to_bytes(self) -> [$ty; $len] { self.0.clone() }
|
|
||||||
|
|
||||||
/// Returns the underlying bytes.
|
|
||||||
#[inline]
|
|
||||||
pub fn into_bytes(self) -> [$ty; $len] { self.0 }
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'a> core::convert::From<&'a [$ty]> for $thing {
|
|
||||||
fn from(data: &'a [$ty]) -> $thing {
|
|
||||||
assert_eq!(data.len(), $len);
|
|
||||||
let mut ret = [0; $len];
|
|
||||||
ret.copy_from_slice(&data[..]);
|
|
||||||
$thing(ret)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<I> core::ops::Index<I> for $thing
|
|
||||||
where
|
|
||||||
[$ty]: core::ops::Index<I>,
|
|
||||||
{
|
|
||||||
type Output = <[$ty] as core::ops::Index<I>>::Output;
|
|
||||||
|
|
||||||
#[inline]
|
|
||||||
fn index(&self, index: I) -> &Self::Output { &self.0[index] }
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
pub(crate) use impl_array_newtype;
|
|
||||||
|
|
||||||
macro_rules! debug_from_display {
|
macro_rules! debug_from_display {
|
||||||
($thing:ident) => {
|
($thing:ident) => {
|
||||||
impl core::fmt::Debug for $thing {
|
impl core::fmt::Debug for $thing {
|
||||||
|
|
|
@ -28,6 +28,7 @@ extern crate std;
|
||||||
|
|
||||||
pub mod error;
|
pub mod error;
|
||||||
pub mod hex;
|
pub mod hex;
|
||||||
|
pub mod macros;
|
||||||
|
|
||||||
/// Mainly reexports based on features.
|
/// Mainly reexports based on features.
|
||||||
pub(crate) mod prelude {
|
pub(crate) mod prelude {
|
||||||
|
|
|
@ -0,0 +1,63 @@
|
||||||
|
//! Various macros used by the Rust Bitcoin ecosystem.
|
||||||
|
//!
|
||||||
|
|
||||||
|
/// Implements standard array methods for a given wrapper type
|
||||||
|
#[macro_export]
|
||||||
|
macro_rules! impl_array_newtype {
|
||||||
|
($thing:ident, $ty:ty, $len:literal) => {
|
||||||
|
impl $thing {
|
||||||
|
/// Converts the object to a raw pointer
|
||||||
|
#[inline]
|
||||||
|
pub fn as_ptr(&self) -> *const $ty {
|
||||||
|
let &$thing(ref dat) = self;
|
||||||
|
dat.as_ptr()
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Converts the object to a mutable raw pointer
|
||||||
|
#[inline]
|
||||||
|
pub fn as_mut_ptr(&mut self) -> *mut $ty {
|
||||||
|
let &mut $thing(ref mut dat) = self;
|
||||||
|
dat.as_mut_ptr()
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Returns the length of the object as an array
|
||||||
|
#[inline]
|
||||||
|
pub fn len(&self) -> usize { $len }
|
||||||
|
|
||||||
|
/// Returns whether the object, as an array, is empty. Always false.
|
||||||
|
#[inline]
|
||||||
|
pub fn is_empty(&self) -> bool { false }
|
||||||
|
|
||||||
|
/// Returns the underlying bytes.
|
||||||
|
#[inline]
|
||||||
|
pub fn as_bytes(&self) -> &[$ty; $len] { &self.0 }
|
||||||
|
|
||||||
|
/// Returns the underlying bytes.
|
||||||
|
#[inline]
|
||||||
|
pub fn to_bytes(self) -> [$ty; $len] { self.0.clone() }
|
||||||
|
|
||||||
|
/// Returns the underlying bytes.
|
||||||
|
#[inline]
|
||||||
|
pub fn into_bytes(self) -> [$ty; $len] { self.0 }
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> core::convert::From<&'a [$ty]> for $thing {
|
||||||
|
fn from(data: &'a [$ty]) -> $thing {
|
||||||
|
assert_eq!(data.len(), $len);
|
||||||
|
let mut ret = [0; $len];
|
||||||
|
ret.copy_from_slice(&data[..]);
|
||||||
|
$thing(ret)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<I> core::ops::Index<I> for $thing
|
||||||
|
where
|
||||||
|
[$ty]: core::ops::Index<I>,
|
||||||
|
{
|
||||||
|
type Output = <[$ty] as core::ops::Index<I>>::Output;
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
fn index(&self, index: I) -> &Self::Output { &self.0[index] }
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
Loading…
Reference in New Issue