Mercurial > public > mercurial-scm > hg-stable
annotate rust/hg-core/src/revlog/node.rs @ 48605:a809f1465a76
filemerge: set default labels a little earlier
By setting the default labels a little earlier, we can rely on them
always being set, as far as I can tell. It may actually even be fine
to rely on that even if we don't set them earlier, but it makes more
sense to me to do it.
Differential Revision: https://phab.mercurial-scm.org/D12015
author | Martin von Zweigbergk <martinvonz@google.com> |
---|---|
date | Thu, 20 Jan 2022 13:43:43 -0800 |
parents | 2097f63575a5 |
children | 34decbaf4da3 |
rev | line source |
---|---|
44228
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
1 // Copyright 2019-2020 Georges Racinet <georges.racinet@octobus.net> |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
2 // |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
3 // This software may be used and distributed according to the terms of the |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
4 // GNU General Public License version 2 or any later version. |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
5 |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
6 //! Definitions and utilities for Revision nodes |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
7 //! |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
8 //! In Mercurial code base, it is customary to call "a node" the binary SHA |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
9 //! of a revision. |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
10 |
46511
43d63979a75e
rust: use HgError in RevlogError and Vfs
Simon Sapin <simon.sapin@octobus.net>
parents:
46503
diff
changeset
|
11 use crate::errors::HgError; |
46463
cfb6c10c08c2
rust: replace an unsafe use of transmute with a safe use of bytes-cast
Simon Sapin <simon.sapin@octobus.net>
parents:
46037
diff
changeset
|
12 use bytes_cast::BytesCast; |
46499
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
13 use std::convert::{TryFrom, TryInto}; |
46495
6380efb82191
rust: replace Node::encode_hex with std::fmt::LowerHex
Simon Sapin <simon.sapin@octobus.net>
parents:
46463
diff
changeset
|
14 use std::fmt; |
44228
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
15 |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
16 /// The length in bytes of a `Node` |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
17 /// |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
18 /// This constant is meant to ease refactors of this module, and |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
19 /// are private so that calling code does not expect all nodes have |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
20 /// the same size, should we support several formats concurrently in |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
21 /// the future. |
45537
b0d6309ff50c
hg-core: check data integrity in `Revlog`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
44998
diff
changeset
|
22 pub const NODE_BYTES_LENGTH: usize = 20; |
b0d6309ff50c
hg-core: check data integrity in `Revlog`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
44998
diff
changeset
|
23 |
b0d6309ff50c
hg-core: check data integrity in `Revlog`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
44998
diff
changeset
|
24 /// Id of the null node. |
b0d6309ff50c
hg-core: check data integrity in `Revlog`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
44998
diff
changeset
|
25 /// |
b0d6309ff50c
hg-core: check data integrity in `Revlog`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
44998
diff
changeset
|
26 /// Used to indicate the absence of node. |
b0d6309ff50c
hg-core: check data integrity in `Revlog`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
44998
diff
changeset
|
27 pub const NULL_NODE_ID: [u8; NODE_BYTES_LENGTH] = [0u8; NODE_BYTES_LENGTH]; |
44228
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
28 |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
29 /// The length in bytes of a `Node` |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
30 /// |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
31 /// see also `NODES_BYTES_LENGTH` about it being private. |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
32 const NODE_NYBBLES_LENGTH: usize = 2 * NODE_BYTES_LENGTH; |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
33 |
46757
b1f2c2b336ec
rhg: `cat` command: print error messages for missing files
Simon Sapin <simon.sapin@octobus.net>
parents:
46634
diff
changeset
|
34 /// Default for UI presentation |
b1f2c2b336ec
rhg: `cat` command: print error messages for missing files
Simon Sapin <simon.sapin@octobus.net>
parents:
46634
diff
changeset
|
35 const SHORT_PREFIX_DEFAULT_NYBBLES_LENGTH: u8 = 12; |
b1f2c2b336ec
rhg: `cat` command: print error messages for missing files
Simon Sapin <simon.sapin@octobus.net>
parents:
46634
diff
changeset
|
36 |
44228
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
37 /// Private alias for readability and to ease future change |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
38 type NodeData = [u8; NODE_BYTES_LENGTH]; |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
39 |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
40 /// Binary revision SHA |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
41 /// |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
42 /// ## Future changes of hash size |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
43 /// |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
44 /// To accomodate future changes of hash size, Rust callers |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
45 /// should use the conversion methods at the boundaries (FFI, actual |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
46 /// computation of hashes and I/O) only, and only if required. |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
47 /// |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
48 /// All other callers outside of unit tests should just handle `Node` values |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
49 /// and never make any assumption on the actual length, using [`nybbles_len`] |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
50 /// if they need a loop boundary. |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
51 /// |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
52 /// All methods that create a `Node` either take a type that enforces |
46496
5893706af3de
rust: Simplify error type for reading hex node IDs
Simon Sapin <simon.sapin@octobus.net>
parents:
46495
diff
changeset
|
53 /// the size or return an error at runtime. |
44228
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
54 /// |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
55 /// [`nybbles_len`]: #method.nybbles_len |
46503
2e2033081274
rust: replace trivial `impl From ?` with `#[derive(derive_more::From)]`
Simon Sapin <simon.sapin@octobus.net>
parents:
46499
diff
changeset
|
56 #[derive(Copy, Clone, Debug, PartialEq, BytesCast, derive_more::From)] |
44512
166349510398
revlog: using two new functions in C capsule from Rust code
Georges Racinet <georges.racinet@octobus.net>
parents:
44419
diff
changeset
|
57 #[repr(transparent)] |
44228
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
58 pub struct Node { |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
59 data: NodeData, |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
60 } |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
61 |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
62 /// The node value for NULL_REVISION |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
63 pub const NULL_NODE: Node = Node { |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
64 data: [0; NODE_BYTES_LENGTH], |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
65 }; |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
66 |
46037
88e741bf2d93
rust: use NodePrefix::from_hex instead of hex::decode directly
Simon Sapin <simon-commits@exyr.org>
parents:
45537
diff
changeset
|
67 /// Return an error if the slice has an unexpected length |
88e741bf2d93
rust: use NodePrefix::from_hex instead of hex::decode directly
Simon Sapin <simon-commits@exyr.org>
parents:
45537
diff
changeset
|
68 impl<'a> TryFrom<&'a [u8]> for &'a Node { |
46463
cfb6c10c08c2
rust: replace an unsafe use of transmute with a safe use of bytes-cast
Simon Sapin <simon.sapin@octobus.net>
parents:
46037
diff
changeset
|
69 type Error = (); |
46037
88e741bf2d93
rust: use NodePrefix::from_hex instead of hex::decode directly
Simon Sapin <simon-commits@exyr.org>
parents:
45537
diff
changeset
|
70 |
88e741bf2d93
rust: use NodePrefix::from_hex instead of hex::decode directly
Simon Sapin <simon-commits@exyr.org>
parents:
45537
diff
changeset
|
71 #[inline] |
46499
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
72 fn try_from(bytes: &'a [u8]) -> Result<Self, Self::Error> { |
46463
cfb6c10c08c2
rust: replace an unsafe use of transmute with a safe use of bytes-cast
Simon Sapin <simon.sapin@octobus.net>
parents:
46037
diff
changeset
|
73 match Node::from_bytes(bytes) { |
cfb6c10c08c2
rust: replace an unsafe use of transmute with a safe use of bytes-cast
Simon Sapin <simon.sapin@octobus.net>
parents:
46037
diff
changeset
|
74 Ok((node, rest)) if rest.is_empty() => Ok(node), |
cfb6c10c08c2
rust: replace an unsafe use of transmute with a safe use of bytes-cast
Simon Sapin <simon.sapin@octobus.net>
parents:
46037
diff
changeset
|
75 _ => Err(()), |
cfb6c10c08c2
rust: replace an unsafe use of transmute with a safe use of bytes-cast
Simon Sapin <simon.sapin@octobus.net>
parents:
46037
diff
changeset
|
76 } |
46037
88e741bf2d93
rust: use NodePrefix::from_hex instead of hex::decode directly
Simon Sapin <simon-commits@exyr.org>
parents:
45537
diff
changeset
|
77 } |
88e741bf2d93
rust: use NodePrefix::from_hex instead of hex::decode directly
Simon Sapin <simon-commits@exyr.org>
parents:
45537
diff
changeset
|
78 } |
88e741bf2d93
rust: use NodePrefix::from_hex instead of hex::decode directly
Simon Sapin <simon-commits@exyr.org>
parents:
45537
diff
changeset
|
79 |
46499
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
80 /// Return an error if the slice has an unexpected length |
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
81 impl TryFrom<&'_ [u8]> for Node { |
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
82 type Error = std::array::TryFromSliceError; |
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
83 |
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
84 #[inline] |
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
85 fn try_from(bytes: &'_ [u8]) -> Result<Self, Self::Error> { |
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
86 let data = bytes.try_into()?; |
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
87 Ok(Self { data }) |
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
88 } |
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
89 } |
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
90 |
46634
98a455a62699
rust: Make `DirstateParents`?s fields typed `Node`s
Simon Sapin <simon.sapin@octobus.net>
parents:
46511
diff
changeset
|
91 impl From<&'_ NodeData> for Node { |
98a455a62699
rust: Make `DirstateParents`?s fields typed `Node`s
Simon Sapin <simon.sapin@octobus.net>
parents:
46511
diff
changeset
|
92 #[inline] |
98a455a62699
rust: Make `DirstateParents`?s fields typed `Node`s
Simon Sapin <simon.sapin@octobus.net>
parents:
46511
diff
changeset
|
93 fn from(data: &'_ NodeData) -> Self { |
98a455a62699
rust: Make `DirstateParents`?s fields typed `Node`s
Simon Sapin <simon.sapin@octobus.net>
parents:
46511
diff
changeset
|
94 Self { data: *data } |
98a455a62699
rust: Make `DirstateParents`?s fields typed `Node`s
Simon Sapin <simon.sapin@octobus.net>
parents:
46511
diff
changeset
|
95 } |
98a455a62699
rust: Make `DirstateParents`?s fields typed `Node`s
Simon Sapin <simon.sapin@octobus.net>
parents:
46511
diff
changeset
|
96 } |
98a455a62699
rust: Make `DirstateParents`?s fields typed `Node`s
Simon Sapin <simon.sapin@octobus.net>
parents:
46511
diff
changeset
|
97 |
46495
6380efb82191
rust: replace Node::encode_hex with std::fmt::LowerHex
Simon Sapin <simon.sapin@octobus.net>
parents:
46463
diff
changeset
|
98 impl fmt::LowerHex for Node { |
6380efb82191
rust: replace Node::encode_hex with std::fmt::LowerHex
Simon Sapin <simon.sapin@octobus.net>
parents:
46463
diff
changeset
|
99 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { |
6380efb82191
rust: replace Node::encode_hex with std::fmt::LowerHex
Simon Sapin <simon.sapin@octobus.net>
parents:
46463
diff
changeset
|
100 for &byte in &self.data { |
6380efb82191
rust: replace Node::encode_hex with std::fmt::LowerHex
Simon Sapin <simon.sapin@octobus.net>
parents:
46463
diff
changeset
|
101 write!(f, "{:02x}", byte)? |
6380efb82191
rust: replace Node::encode_hex with std::fmt::LowerHex
Simon Sapin <simon.sapin@octobus.net>
parents:
46463
diff
changeset
|
102 } |
6380efb82191
rust: replace Node::encode_hex with std::fmt::LowerHex
Simon Sapin <simon.sapin@octobus.net>
parents:
46463
diff
changeset
|
103 Ok(()) |
6380efb82191
rust: replace Node::encode_hex with std::fmt::LowerHex
Simon Sapin <simon.sapin@octobus.net>
parents:
46463
diff
changeset
|
104 } |
6380efb82191
rust: replace Node::encode_hex with std::fmt::LowerHex
Simon Sapin <simon.sapin@octobus.net>
parents:
46463
diff
changeset
|
105 } |
6380efb82191
rust: replace Node::encode_hex with std::fmt::LowerHex
Simon Sapin <simon.sapin@octobus.net>
parents:
46463
diff
changeset
|
106 |
46496
5893706af3de
rust: Simplify error type for reading hex node IDs
Simon Sapin <simon.sapin@octobus.net>
parents:
46495
diff
changeset
|
107 #[derive(Debug)] |
5893706af3de
rust: Simplify error type for reading hex node IDs
Simon Sapin <simon.sapin@octobus.net>
parents:
46495
diff
changeset
|
108 pub struct FromHexError; |
44228
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
109 |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
110 /// Low level utility function, also for prefixes |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
111 fn get_nybble(s: &[u8], i: usize) -> u8 { |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
112 if i % 2 == 0 { |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
113 s[i / 2] >> 4 |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
114 } else { |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
115 s[i / 2] & 0x0f |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
116 } |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
117 } |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
118 |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
119 impl Node { |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
120 /// Retrieve the `i`th half-byte of the binary data. |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
121 /// |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
122 /// This is also the `i`th hexadecimal digit in numeric form, |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
123 /// also called a [nybble](https://en.wikipedia.org/wiki/Nibble). |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
124 pub fn get_nybble(&self, i: usize) -> u8 { |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
125 get_nybble(&self.data, i) |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
126 } |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
127 |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
128 /// Length of the data, in nybbles |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
129 pub fn nybbles_len(&self) -> usize { |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
130 // public exposure as an instance method only, so that we can |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
131 // easily support several sizes of hashes if needed in the future. |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
132 NODE_NYBBLES_LENGTH |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
133 } |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
134 |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
135 /// Convert from hexadecimal string representation |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
136 /// |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
137 /// Exact length is required. |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
138 /// |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
139 /// To be used in FFI and I/O only, in order to facilitate future |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
140 /// changes of hash format. |
46496
5893706af3de
rust: Simplify error type for reading hex node IDs
Simon Sapin <simon.sapin@octobus.net>
parents:
46495
diff
changeset
|
141 pub fn from_hex(hex: impl AsRef<[u8]>) -> Result<Node, FromHexError> { |
46499
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
142 let prefix = NodePrefix::from_hex(hex)?; |
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
143 if prefix.nybbles_len() == NODE_NYBBLES_LENGTH { |
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
144 Ok(Self { data: prefix.data }) |
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
145 } else { |
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
146 Err(FromHexError) |
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
147 } |
44228
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
148 } |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
149 |
46511
43d63979a75e
rust: use HgError in RevlogError and Vfs
Simon Sapin <simon.sapin@octobus.net>
parents:
46503
diff
changeset
|
150 /// `from_hex`, but for input from an internal file of the repository such |
43d63979a75e
rust: use HgError in RevlogError and Vfs
Simon Sapin <simon.sapin@octobus.net>
parents:
46503
diff
changeset
|
151 /// as a changelog or manifest entry. |
43d63979a75e
rust: use HgError in RevlogError and Vfs
Simon Sapin <simon.sapin@octobus.net>
parents:
46503
diff
changeset
|
152 /// |
43d63979a75e
rust: use HgError in RevlogError and Vfs
Simon Sapin <simon.sapin@octobus.net>
parents:
46503
diff
changeset
|
153 /// An error is treated as repository corruption. |
43d63979a75e
rust: use HgError in RevlogError and Vfs
Simon Sapin <simon.sapin@octobus.net>
parents:
46503
diff
changeset
|
154 pub fn from_hex_for_repo(hex: impl AsRef<[u8]>) -> Result<Node, HgError> { |
43d63979a75e
rust: use HgError in RevlogError and Vfs
Simon Sapin <simon.sapin@octobus.net>
parents:
46503
diff
changeset
|
155 Self::from_hex(hex.as_ref()).map_err(|FromHexError| { |
43d63979a75e
rust: use HgError in RevlogError and Vfs
Simon Sapin <simon.sapin@octobus.net>
parents:
46503
diff
changeset
|
156 HgError::CorruptedRepository(format!( |
43d63979a75e
rust: use HgError in RevlogError and Vfs
Simon Sapin <simon.sapin@octobus.net>
parents:
46503
diff
changeset
|
157 "Expected a full hexadecimal node ID, found {}", |
43d63979a75e
rust: use HgError in RevlogError and Vfs
Simon Sapin <simon.sapin@octobus.net>
parents:
46503
diff
changeset
|
158 String::from_utf8_lossy(hex.as_ref()) |
43d63979a75e
rust: use HgError in RevlogError and Vfs
Simon Sapin <simon.sapin@octobus.net>
parents:
46503
diff
changeset
|
159 )) |
43d63979a75e
rust: use HgError in RevlogError and Vfs
Simon Sapin <simon.sapin@octobus.net>
parents:
46503
diff
changeset
|
160 }) |
43d63979a75e
rust: use HgError in RevlogError and Vfs
Simon Sapin <simon.sapin@octobus.net>
parents:
46503
diff
changeset
|
161 } |
43d63979a75e
rust: use HgError in RevlogError and Vfs
Simon Sapin <simon.sapin@octobus.net>
parents:
46503
diff
changeset
|
162 |
44228
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
163 /// Provide access to binary data |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
164 /// |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
165 /// This is needed by FFI layers, for instance to return expected |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
166 /// binary values to Python. |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
167 pub fn as_bytes(&self) -> &[u8] { |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
168 &self.data |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
169 } |
46757
b1f2c2b336ec
rhg: `cat` command: print error messages for missing files
Simon Sapin <simon.sapin@octobus.net>
parents:
46634
diff
changeset
|
170 |
b1f2c2b336ec
rhg: `cat` command: print error messages for missing files
Simon Sapin <simon.sapin@octobus.net>
parents:
46634
diff
changeset
|
171 pub fn short(&self) -> NodePrefix { |
b1f2c2b336ec
rhg: `cat` command: print error messages for missing files
Simon Sapin <simon.sapin@octobus.net>
parents:
46634
diff
changeset
|
172 NodePrefix { |
b1f2c2b336ec
rhg: `cat` command: print error messages for missing files
Simon Sapin <simon.sapin@octobus.net>
parents:
46634
diff
changeset
|
173 nybbles_len: SHORT_PREFIX_DEFAULT_NYBBLES_LENGTH, |
b1f2c2b336ec
rhg: `cat` command: print error messages for missing files
Simon Sapin <simon.sapin@octobus.net>
parents:
46634
diff
changeset
|
174 data: self.data, |
b1f2c2b336ec
rhg: `cat` command: print error messages for missing files
Simon Sapin <simon.sapin@octobus.net>
parents:
46634
diff
changeset
|
175 } |
b1f2c2b336ec
rhg: `cat` command: print error messages for missing files
Simon Sapin <simon.sapin@octobus.net>
parents:
46634
diff
changeset
|
176 } |
48467
2097f63575a5
rhg: Add Repo::write_dirstate
Simon Sapin <simon.sapin@octobus.net>
parents:
46757
diff
changeset
|
177 |
2097f63575a5
rhg: Add Repo::write_dirstate
Simon Sapin <simon.sapin@octobus.net>
parents:
46757
diff
changeset
|
178 pub fn pad_to_256_bits(&self) -> [u8; 32] { |
2097f63575a5
rhg: Add Repo::write_dirstate
Simon Sapin <simon.sapin@octobus.net>
parents:
46757
diff
changeset
|
179 let mut bits = [0; 32]; |
2097f63575a5
rhg: Add Repo::write_dirstate
Simon Sapin <simon.sapin@octobus.net>
parents:
46757
diff
changeset
|
180 bits[..NODE_BYTES_LENGTH].copy_from_slice(&self.data); |
2097f63575a5
rhg: Add Repo::write_dirstate
Simon Sapin <simon.sapin@octobus.net>
parents:
46757
diff
changeset
|
181 bits |
2097f63575a5
rhg: Add Repo::write_dirstate
Simon Sapin <simon.sapin@octobus.net>
parents:
46757
diff
changeset
|
182 } |
44228
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
183 } |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
184 |
44257
9896a8d0d3d2
rust-node: handling binary Node prefix
Georges Racinet <georges.racinet@octobus.net>
parents:
44228
diff
changeset
|
185 /// The beginning of a binary revision SHA. |
9896a8d0d3d2
rust-node: handling binary Node prefix
Georges Racinet <georges.racinet@octobus.net>
parents:
44228
diff
changeset
|
186 /// |
9896a8d0d3d2
rust-node: handling binary Node prefix
Georges Racinet <georges.racinet@octobus.net>
parents:
44228
diff
changeset
|
187 /// Since it can potentially come from an hexadecimal representation with |
9896a8d0d3d2
rust-node: handling binary Node prefix
Georges Racinet <georges.racinet@octobus.net>
parents:
44228
diff
changeset
|
188 /// odd length, it needs to carry around whether the last 4 bits are relevant |
9896a8d0d3d2
rust-node: handling binary Node prefix
Georges Racinet <georges.racinet@octobus.net>
parents:
44228
diff
changeset
|
189 /// or not. |
46499
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
190 #[derive(Debug, PartialEq, Copy, Clone)] |
44257
9896a8d0d3d2
rust-node: handling binary Node prefix
Georges Racinet <georges.racinet@octobus.net>
parents:
44228
diff
changeset
|
191 pub struct NodePrefix { |
46499
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
192 /// In `1..=NODE_NYBBLES_LENGTH` |
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
193 nybbles_len: u8, |
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
194 /// The first `4 * length_in_nybbles` bits are used (considering bits |
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
195 /// within a bytes in big-endian: most significant first), the rest |
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
196 /// are zero. |
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
197 data: NodeData, |
44257
9896a8d0d3d2
rust-node: handling binary Node prefix
Georges Racinet <georges.racinet@octobus.net>
parents:
44228
diff
changeset
|
198 } |
9896a8d0d3d2
rust-node: handling binary Node prefix
Georges Racinet <georges.racinet@octobus.net>
parents:
44228
diff
changeset
|
199 |
9896a8d0d3d2
rust-node: handling binary Node prefix
Georges Racinet <georges.racinet@octobus.net>
parents:
44228
diff
changeset
|
200 impl NodePrefix { |
9896a8d0d3d2
rust-node: handling binary Node prefix
Georges Racinet <georges.racinet@octobus.net>
parents:
44228
diff
changeset
|
201 /// Convert from hexadecimal string representation |
9896a8d0d3d2
rust-node: handling binary Node prefix
Georges Racinet <georges.racinet@octobus.net>
parents:
44228
diff
changeset
|
202 /// |
9896a8d0d3d2
rust-node: handling binary Node prefix
Georges Racinet <georges.racinet@octobus.net>
parents:
44228
diff
changeset
|
203 /// Similarly to `hex::decode`, can be used with Unicode string types |
9896a8d0d3d2
rust-node: handling binary Node prefix
Georges Racinet <georges.racinet@octobus.net>
parents:
44228
diff
changeset
|
204 /// (`String`, `&str`) as well as bytes. |
9896a8d0d3d2
rust-node: handling binary Node prefix
Georges Racinet <georges.racinet@octobus.net>
parents:
44228
diff
changeset
|
205 /// |
9896a8d0d3d2
rust-node: handling binary Node prefix
Georges Racinet <georges.racinet@octobus.net>
parents:
44228
diff
changeset
|
206 /// To be used in FFI and I/O only, in order to facilitate future |
9896a8d0d3d2
rust-node: handling binary Node prefix
Georges Racinet <georges.racinet@octobus.net>
parents:
44228
diff
changeset
|
207 /// changes of hash format. |
46496
5893706af3de
rust: Simplify error type for reading hex node IDs
Simon Sapin <simon.sapin@octobus.net>
parents:
46495
diff
changeset
|
208 pub fn from_hex(hex: impl AsRef<[u8]>) -> Result<Self, FromHexError> { |
44257
9896a8d0d3d2
rust-node: handling binary Node prefix
Georges Racinet <georges.racinet@octobus.net>
parents:
44228
diff
changeset
|
209 let hex = hex.as_ref(); |
9896a8d0d3d2
rust-node: handling binary Node prefix
Georges Racinet <georges.racinet@octobus.net>
parents:
44228
diff
changeset
|
210 let len = hex.len(); |
46497
e61c2dc6e1c2
rust: Exclude empty node prefixes
Simon Sapin <simon.sapin@octobus.net>
parents:
46496
diff
changeset
|
211 if len > NODE_NYBBLES_LENGTH || len == 0 { |
46496
5893706af3de
rust: Simplify error type for reading hex node IDs
Simon Sapin <simon.sapin@octobus.net>
parents:
46495
diff
changeset
|
212 return Err(FromHexError); |
44257
9896a8d0d3d2
rust-node: handling binary Node prefix
Georges Racinet <georges.racinet@octobus.net>
parents:
44228
diff
changeset
|
213 } |
9896a8d0d3d2
rust-node: handling binary Node prefix
Georges Racinet <georges.racinet@octobus.net>
parents:
44228
diff
changeset
|
214 |
46499
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
215 let mut data = [0; NODE_BYTES_LENGTH]; |
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
216 let mut nybbles_len = 0; |
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
217 for &ascii_byte in hex { |
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
218 let nybble = match char::from(ascii_byte).to_digit(16) { |
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
219 Some(digit) => digit as u8, |
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
220 None => return Err(FromHexError), |
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
221 }; |
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
222 // Fill in the upper half of a byte first, then the lower half. |
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
223 let shift = if nybbles_len % 2 == 0 { 4 } else { 0 }; |
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
224 data[nybbles_len as usize / 2] |= nybble << shift; |
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
225 nybbles_len += 1; |
44257
9896a8d0d3d2
rust-node: handling binary Node prefix
Georges Racinet <georges.racinet@octobus.net>
parents:
44228
diff
changeset
|
226 } |
46499
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
227 Ok(Self { data, nybbles_len }) |
44257
9896a8d0d3d2
rust-node: handling binary Node prefix
Georges Racinet <georges.racinet@octobus.net>
parents:
44228
diff
changeset
|
228 } |
9896a8d0d3d2
rust-node: handling binary Node prefix
Georges Racinet <georges.racinet@octobus.net>
parents:
44228
diff
changeset
|
229 |
46499
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
230 pub fn nybbles_len(&self) -> usize { |
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
231 self.nybbles_len as _ |
44257
9896a8d0d3d2
rust-node: handling binary Node prefix
Georges Racinet <georges.racinet@octobus.net>
parents:
44228
diff
changeset
|
232 } |
9896a8d0d3d2
rust-node: handling binary Node prefix
Georges Racinet <georges.racinet@octobus.net>
parents:
44228
diff
changeset
|
233 |
9896a8d0d3d2
rust-node: handling binary Node prefix
Georges Racinet <georges.racinet@octobus.net>
parents:
44228
diff
changeset
|
234 pub fn is_prefix_of(&self, node: &Node) -> bool { |
46499
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
235 let full_bytes = self.nybbles_len() / 2; |
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
236 if self.data[..full_bytes] != node.data[..full_bytes] { |
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
237 return false; |
44257
9896a8d0d3d2
rust-node: handling binary Node prefix
Georges Racinet <georges.racinet@octobus.net>
parents:
44228
diff
changeset
|
238 } |
46499
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
239 if self.nybbles_len() % 2 == 0 { |
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
240 return true; |
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
241 } |
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
242 let last = self.nybbles_len() - 1; |
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
243 self.get_nybble(last) == node.get_nybble(last) |
44257
9896a8d0d3d2
rust-node: handling binary Node prefix
Georges Racinet <georges.racinet@octobus.net>
parents:
44228
diff
changeset
|
244 } |
9896a8d0d3d2
rust-node: handling binary Node prefix
Georges Racinet <georges.racinet@octobus.net>
parents:
44228
diff
changeset
|
245 |
9896a8d0d3d2
rust-node: handling binary Node prefix
Georges Racinet <georges.racinet@octobus.net>
parents:
44228
diff
changeset
|
246 /// Retrieve the `i`th half-byte from the prefix. |
9896a8d0d3d2
rust-node: handling binary Node prefix
Georges Racinet <georges.racinet@octobus.net>
parents:
44228
diff
changeset
|
247 /// |
9896a8d0d3d2
rust-node: handling binary Node prefix
Georges Racinet <georges.racinet@octobus.net>
parents:
44228
diff
changeset
|
248 /// This is also the `i`th hexadecimal digit in numeric form, |
9896a8d0d3d2
rust-node: handling binary Node prefix
Georges Racinet <georges.racinet@octobus.net>
parents:
44228
diff
changeset
|
249 /// also called a [nybble](https://en.wikipedia.org/wiki/Nibble). |
9896a8d0d3d2
rust-node: handling binary Node prefix
Georges Racinet <georges.racinet@octobus.net>
parents:
44228
diff
changeset
|
250 pub fn get_nybble(&self, i: usize) -> u8 { |
46499
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
251 assert!(i < self.nybbles_len()); |
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
252 get_nybble(&self.data, i) |
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
253 } |
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
254 |
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
255 fn iter_nybbles(&self) -> impl Iterator<Item = u8> + '_ { |
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
256 (0..self.nybbles_len()).map(move |i| get_nybble(&self.data, i)) |
44257
9896a8d0d3d2
rust-node: handling binary Node prefix
Georges Racinet <georges.racinet@octobus.net>
parents:
44228
diff
changeset
|
257 } |
44419
5ac1eecc9c64
rust-nodemap: core implementation for shortest
Georges Racinet <georges.racinet@octobus.net>
parents:
44262
diff
changeset
|
258 |
5ac1eecc9c64
rust-nodemap: core implementation for shortest
Georges Racinet <georges.racinet@octobus.net>
parents:
44262
diff
changeset
|
259 /// Return the index first nybble that's different from `node` |
5ac1eecc9c64
rust-nodemap: core implementation for shortest
Georges Racinet <georges.racinet@octobus.net>
parents:
44262
diff
changeset
|
260 /// |
5ac1eecc9c64
rust-nodemap: core implementation for shortest
Georges Racinet <georges.racinet@octobus.net>
parents:
44262
diff
changeset
|
261 /// If the return value is `None` that means that `self` is |
5ac1eecc9c64
rust-nodemap: core implementation for shortest
Georges Racinet <georges.racinet@octobus.net>
parents:
44262
diff
changeset
|
262 /// a prefix of `node`, but the current method is a bit slower |
5ac1eecc9c64
rust-nodemap: core implementation for shortest
Georges Racinet <georges.racinet@octobus.net>
parents:
44262
diff
changeset
|
263 /// than `is_prefix_of`. |
5ac1eecc9c64
rust-nodemap: core implementation for shortest
Georges Racinet <georges.racinet@octobus.net>
parents:
44262
diff
changeset
|
264 /// |
5ac1eecc9c64
rust-nodemap: core implementation for shortest
Georges Racinet <georges.racinet@octobus.net>
parents:
44262
diff
changeset
|
265 /// Returned index is as in `get_nybble`, i.e., starting at 0. |
5ac1eecc9c64
rust-nodemap: core implementation for shortest
Georges Racinet <georges.racinet@octobus.net>
parents:
44262
diff
changeset
|
266 pub fn first_different_nybble(&self, node: &Node) -> Option<usize> { |
46499
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
267 self.iter_nybbles() |
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
268 .zip(NodePrefix::from(*node).iter_nybbles()) |
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
269 .position(|(a, b)| a != b) |
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
270 } |
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
271 } |
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
272 |
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
273 impl fmt::LowerHex for NodePrefix { |
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
274 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { |
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
275 let full_bytes = self.nybbles_len() / 2; |
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
276 for &byte in &self.data[..full_bytes] { |
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
277 write!(f, "{:02x}", byte)? |
44419
5ac1eecc9c64
rust-nodemap: core implementation for shortest
Georges Racinet <georges.racinet@octobus.net>
parents:
44262
diff
changeset
|
278 } |
46499
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
279 if self.nybbles_len() % 2 == 1 { |
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
280 let last = self.nybbles_len() - 1; |
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
281 write!(f, "{:x}", self.get_nybble(last))? |
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
282 } |
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
283 Ok(()) |
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
284 } |
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
285 } |
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
286 |
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
287 /// A shortcut for full `Node` references |
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
288 impl From<&'_ Node> for NodePrefix { |
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
289 fn from(node: &'_ Node) -> Self { |
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
290 NodePrefix { |
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
291 nybbles_len: node.nybbles_len() as _, |
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
292 data: node.data, |
44419
5ac1eecc9c64
rust-nodemap: core implementation for shortest
Georges Racinet <georges.racinet@octobus.net>
parents:
44262
diff
changeset
|
293 } |
5ac1eecc9c64
rust-nodemap: core implementation for shortest
Georges Racinet <georges.racinet@octobus.net>
parents:
44262
diff
changeset
|
294 } |
44257
9896a8d0d3d2
rust-node: handling binary Node prefix
Georges Racinet <georges.racinet@octobus.net>
parents:
44228
diff
changeset
|
295 } |
9896a8d0d3d2
rust-node: handling binary Node prefix
Georges Racinet <georges.racinet@octobus.net>
parents:
44228
diff
changeset
|
296 |
9896a8d0d3d2
rust-node: handling binary Node prefix
Georges Racinet <georges.racinet@octobus.net>
parents:
44228
diff
changeset
|
297 /// A shortcut for full `Node` references |
46499
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
298 impl From<Node> for NodePrefix { |
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
299 fn from(node: Node) -> Self { |
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
300 NodePrefix { |
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
301 nybbles_len: node.nybbles_len() as _, |
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
302 data: node.data, |
44228
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
303 } |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
304 } |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
305 } |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
306 |
46499
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
307 impl PartialEq<Node> for NodePrefix { |
46037
88e741bf2d93
rust: use NodePrefix::from_hex instead of hex::decode directly
Simon Sapin <simon-commits@exyr.org>
parents:
45537
diff
changeset
|
308 fn eq(&self, other: &Node) -> bool { |
46499
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
309 Self::from(*other) == *self |
46037
88e741bf2d93
rust: use NodePrefix::from_hex instead of hex::decode directly
Simon Sapin <simon-commits@exyr.org>
parents:
45537
diff
changeset
|
310 } |
88e741bf2d93
rust: use NodePrefix::from_hex instead of hex::decode directly
Simon Sapin <simon-commits@exyr.org>
parents:
45537
diff
changeset
|
311 } |
88e741bf2d93
rust: use NodePrefix::from_hex instead of hex::decode directly
Simon Sapin <simon-commits@exyr.org>
parents:
45537
diff
changeset
|
312 |
44228
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
313 #[cfg(test)] |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
314 mod tests { |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
315 use super::*; |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
316 |
46499
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
317 const SAMPLE_NODE_HEX: &str = "0123456789abcdeffedcba9876543210deadbeef"; |
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
318 const SAMPLE_NODE: Node = Node { |
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
319 data: [ |
44228
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
320 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0xfe, 0xdc, 0xba, |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
321 0x98, 0x76, 0x54, 0x32, 0x10, 0xde, 0xad, 0xbe, 0xef, |
46499
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
322 ], |
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
323 }; |
44228
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
324 |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
325 /// Pad an hexadecimal string to reach `NODE_NYBBLES_LENGTH` |
46499
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
326 /// The padding is made with zeros. |
44258
e52401a95b94
rust-nodemap: NodeMap trait with simplest implementation
Georges Racinet <georges.racinet@octobus.net>
parents:
44257
diff
changeset
|
327 pub fn hex_pad_right(hex: &str) -> String { |
44228
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
328 let mut res = hex.to_string(); |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
329 while res.len() < NODE_NYBBLES_LENGTH { |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
330 res.push('0'); |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
331 } |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
332 res |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
333 } |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
334 |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
335 #[test] |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
336 fn test_node_from_hex() { |
46499
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
337 let not_hex = "012... oops"; |
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
338 let too_short = "0123"; |
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
339 let too_long = format!("{}0", SAMPLE_NODE_HEX); |
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
340 assert_eq!(Node::from_hex(SAMPLE_NODE_HEX).unwrap(), SAMPLE_NODE); |
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
341 assert!(Node::from_hex(not_hex).is_err()); |
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
342 assert!(Node::from_hex(too_short).is_err()); |
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
343 assert!(Node::from_hex(&too_long).is_err()); |
44228
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
344 } |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
345 |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
346 #[test] |
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
347 fn test_node_encode_hex() { |
46499
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
348 assert_eq!(format!("{:x}", SAMPLE_NODE), SAMPLE_NODE_HEX); |
44228
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
349 } |
44257
9896a8d0d3d2
rust-node: handling binary Node prefix
Georges Racinet <georges.racinet@octobus.net>
parents:
44228
diff
changeset
|
350 |
9896a8d0d3d2
rust-node: handling binary Node prefix
Georges Racinet <georges.racinet@octobus.net>
parents:
44228
diff
changeset
|
351 #[test] |
46499
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
352 fn test_prefix_from_to_hex() -> Result<(), FromHexError> { |
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
353 assert_eq!(format!("{:x}", NodePrefix::from_hex("0e1")?), "0e1"); |
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
354 assert_eq!(format!("{:x}", NodePrefix::from_hex("0e1a")?), "0e1a"); |
44257
9896a8d0d3d2
rust-node: handling binary Node prefix
Georges Racinet <georges.racinet@octobus.net>
parents:
44228
diff
changeset
|
355 assert_eq!( |
46499
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
356 format!("{:x}", NodePrefix::from_hex(SAMPLE_NODE_HEX)?), |
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
357 SAMPLE_NODE_HEX |
44257
9896a8d0d3d2
rust-node: handling binary Node prefix
Georges Racinet <georges.racinet@octobus.net>
parents:
44228
diff
changeset
|
358 ); |
9896a8d0d3d2
rust-node: handling binary Node prefix
Georges Racinet <georges.racinet@octobus.net>
parents:
44228
diff
changeset
|
359 Ok(()) |
9896a8d0d3d2
rust-node: handling binary Node prefix
Georges Racinet <georges.racinet@octobus.net>
parents:
44228
diff
changeset
|
360 } |
9896a8d0d3d2
rust-node: handling binary Node prefix
Georges Racinet <georges.racinet@octobus.net>
parents:
44228
diff
changeset
|
361 |
9896a8d0d3d2
rust-node: handling binary Node prefix
Georges Racinet <georges.racinet@octobus.net>
parents:
44228
diff
changeset
|
362 #[test] |
9896a8d0d3d2
rust-node: handling binary Node prefix
Georges Racinet <georges.racinet@octobus.net>
parents:
44228
diff
changeset
|
363 fn test_prefix_from_hex_errors() { |
46496
5893706af3de
rust: Simplify error type for reading hex node IDs
Simon Sapin <simon.sapin@octobus.net>
parents:
46495
diff
changeset
|
364 assert!(NodePrefix::from_hex("testgr").is_err()); |
46495
6380efb82191
rust: replace Node::encode_hex with std::fmt::LowerHex
Simon Sapin <simon.sapin@octobus.net>
parents:
46463
diff
changeset
|
365 let mut long = format!("{:x}", NULL_NODE); |
44257
9896a8d0d3d2
rust-node: handling binary Node prefix
Georges Racinet <georges.racinet@octobus.net>
parents:
44228
diff
changeset
|
366 long.push('c'); |
46496
5893706af3de
rust: Simplify error type for reading hex node IDs
Simon Sapin <simon.sapin@octobus.net>
parents:
46495
diff
changeset
|
367 assert!(NodePrefix::from_hex(&long).is_err()) |
44257
9896a8d0d3d2
rust-node: handling binary Node prefix
Georges Racinet <georges.racinet@octobus.net>
parents:
44228
diff
changeset
|
368 } |
9896a8d0d3d2
rust-node: handling binary Node prefix
Georges Racinet <georges.racinet@octobus.net>
parents:
44228
diff
changeset
|
369 |
9896a8d0d3d2
rust-node: handling binary Node prefix
Georges Racinet <georges.racinet@octobus.net>
parents:
44228
diff
changeset
|
370 #[test] |
46496
5893706af3de
rust: Simplify error type for reading hex node IDs
Simon Sapin <simon.sapin@octobus.net>
parents:
46495
diff
changeset
|
371 fn test_is_prefix_of() -> Result<(), FromHexError> { |
44257
9896a8d0d3d2
rust-node: handling binary Node prefix
Georges Racinet <georges.racinet@octobus.net>
parents:
44228
diff
changeset
|
372 let mut node_data = [0; NODE_BYTES_LENGTH]; |
9896a8d0d3d2
rust-node: handling binary Node prefix
Georges Racinet <georges.racinet@octobus.net>
parents:
44228
diff
changeset
|
373 node_data[0] = 0x12; |
9896a8d0d3d2
rust-node: handling binary Node prefix
Georges Racinet <georges.racinet@octobus.net>
parents:
44228
diff
changeset
|
374 node_data[1] = 0xca; |
9896a8d0d3d2
rust-node: handling binary Node prefix
Georges Racinet <georges.racinet@octobus.net>
parents:
44228
diff
changeset
|
375 let node = Node::from(node_data); |
46499
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
376 assert!(NodePrefix::from_hex("12")?.is_prefix_of(&node)); |
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
377 assert!(!NodePrefix::from_hex("1a")?.is_prefix_of(&node)); |
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
378 assert!(NodePrefix::from_hex("12c")?.is_prefix_of(&node)); |
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
379 assert!(!NodePrefix::from_hex("12d")?.is_prefix_of(&node)); |
44257
9896a8d0d3d2
rust-node: handling binary Node prefix
Georges Racinet <georges.racinet@octobus.net>
parents:
44228
diff
changeset
|
380 Ok(()) |
9896a8d0d3d2
rust-node: handling binary Node prefix
Georges Racinet <georges.racinet@octobus.net>
parents:
44228
diff
changeset
|
381 } |
9896a8d0d3d2
rust-node: handling binary Node prefix
Georges Racinet <georges.racinet@octobus.net>
parents:
44228
diff
changeset
|
382 |
9896a8d0d3d2
rust-node: handling binary Node prefix
Georges Racinet <georges.racinet@octobus.net>
parents:
44228
diff
changeset
|
383 #[test] |
46496
5893706af3de
rust: Simplify error type for reading hex node IDs
Simon Sapin <simon.sapin@octobus.net>
parents:
46495
diff
changeset
|
384 fn test_get_nybble() -> Result<(), FromHexError> { |
44257
9896a8d0d3d2
rust-node: handling binary Node prefix
Georges Racinet <georges.racinet@octobus.net>
parents:
44228
diff
changeset
|
385 let prefix = NodePrefix::from_hex("dead6789cafe")?; |
46499
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
386 assert_eq!(prefix.get_nybble(0), 13); |
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
387 assert_eq!(prefix.get_nybble(7), 9); |
44257
9896a8d0d3d2
rust-node: handling binary Node prefix
Georges Racinet <georges.racinet@octobus.net>
parents:
44228
diff
changeset
|
388 Ok(()) |
9896a8d0d3d2
rust-node: handling binary Node prefix
Georges Racinet <georges.racinet@octobus.net>
parents:
44228
diff
changeset
|
389 } |
44419
5ac1eecc9c64
rust-nodemap: core implementation for shortest
Georges Racinet <georges.racinet@octobus.net>
parents:
44262
diff
changeset
|
390 |
5ac1eecc9c64
rust-nodemap: core implementation for shortest
Georges Racinet <georges.racinet@octobus.net>
parents:
44262
diff
changeset
|
391 #[test] |
5ac1eecc9c64
rust-nodemap: core implementation for shortest
Georges Racinet <georges.racinet@octobus.net>
parents:
44262
diff
changeset
|
392 fn test_first_different_nybble_even_prefix() { |
5ac1eecc9c64
rust-nodemap: core implementation for shortest
Georges Racinet <georges.racinet@octobus.net>
parents:
44262
diff
changeset
|
393 let prefix = NodePrefix::from_hex("12ca").unwrap(); |
5ac1eecc9c64
rust-nodemap: core implementation for shortest
Georges Racinet <georges.racinet@octobus.net>
parents:
44262
diff
changeset
|
394 let mut node = Node::from([0; NODE_BYTES_LENGTH]); |
46499
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
395 assert_eq!(prefix.first_different_nybble(&node), Some(0)); |
44419
5ac1eecc9c64
rust-nodemap: core implementation for shortest
Georges Racinet <georges.racinet@octobus.net>
parents:
44262
diff
changeset
|
396 node.data[0] = 0x13; |
46499
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
397 assert_eq!(prefix.first_different_nybble(&node), Some(1)); |
44419
5ac1eecc9c64
rust-nodemap: core implementation for shortest
Georges Racinet <georges.racinet@octobus.net>
parents:
44262
diff
changeset
|
398 node.data[0] = 0x12; |
46499
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
399 assert_eq!(prefix.first_different_nybble(&node), Some(2)); |
44419
5ac1eecc9c64
rust-nodemap: core implementation for shortest
Georges Racinet <georges.racinet@octobus.net>
parents:
44262
diff
changeset
|
400 node.data[1] = 0xca; |
5ac1eecc9c64
rust-nodemap: core implementation for shortest
Georges Racinet <georges.racinet@octobus.net>
parents:
44262
diff
changeset
|
401 // now it is a prefix |
46499
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
402 assert_eq!(prefix.first_different_nybble(&node), None); |
44419
5ac1eecc9c64
rust-nodemap: core implementation for shortest
Georges Racinet <georges.racinet@octobus.net>
parents:
44262
diff
changeset
|
403 } |
5ac1eecc9c64
rust-nodemap: core implementation for shortest
Georges Racinet <georges.racinet@octobus.net>
parents:
44262
diff
changeset
|
404 |
5ac1eecc9c64
rust-nodemap: core implementation for shortest
Georges Racinet <georges.racinet@octobus.net>
parents:
44262
diff
changeset
|
405 #[test] |
5ac1eecc9c64
rust-nodemap: core implementation for shortest
Georges Racinet <georges.racinet@octobus.net>
parents:
44262
diff
changeset
|
406 fn test_first_different_nybble_odd_prefix() { |
5ac1eecc9c64
rust-nodemap: core implementation for shortest
Georges Racinet <georges.racinet@octobus.net>
parents:
44262
diff
changeset
|
407 let prefix = NodePrefix::from_hex("12c").unwrap(); |
5ac1eecc9c64
rust-nodemap: core implementation for shortest
Georges Racinet <georges.racinet@octobus.net>
parents:
44262
diff
changeset
|
408 let mut node = Node::from([0; NODE_BYTES_LENGTH]); |
46499
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
409 assert_eq!(prefix.first_different_nybble(&node), Some(0)); |
44419
5ac1eecc9c64
rust-nodemap: core implementation for shortest
Georges Racinet <georges.racinet@octobus.net>
parents:
44262
diff
changeset
|
410 node.data[0] = 0x13; |
46499
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
411 assert_eq!(prefix.first_different_nybble(&node), Some(1)); |
44419
5ac1eecc9c64
rust-nodemap: core implementation for shortest
Georges Racinet <georges.racinet@octobus.net>
parents:
44262
diff
changeset
|
412 node.data[0] = 0x12; |
46499
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
413 assert_eq!(prefix.first_different_nybble(&node), Some(2)); |
44419
5ac1eecc9c64
rust-nodemap: core implementation for shortest
Georges Racinet <georges.racinet@octobus.net>
parents:
44262
diff
changeset
|
414 node.data[1] = 0xca; |
5ac1eecc9c64
rust-nodemap: core implementation for shortest
Georges Racinet <georges.racinet@octobus.net>
parents:
44262
diff
changeset
|
415 // now it is a prefix |
46499
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46497
diff
changeset
|
416 assert_eq!(prefix.first_different_nybble(&node), None); |
44419
5ac1eecc9c64
rust-nodemap: core implementation for shortest
Georges Racinet <georges.racinet@octobus.net>
parents:
44262
diff
changeset
|
417 } |
44228
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
418 } |
44258
e52401a95b94
rust-nodemap: NodeMap trait with simplest implementation
Georges Racinet <georges.racinet@octobus.net>
parents:
44257
diff
changeset
|
419 |
e52401a95b94
rust-nodemap: NodeMap trait with simplest implementation
Georges Racinet <georges.racinet@octobus.net>
parents:
44257
diff
changeset
|
420 #[cfg(test)] |
e52401a95b94
rust-nodemap: NodeMap trait with simplest implementation
Georges Racinet <georges.racinet@octobus.net>
parents:
44257
diff
changeset
|
421 pub use tests::hex_pad_right; |