snarkvm_console_program/data/record/
to_bits.rs

1// Copyright 2024 Aleo Network Foundation
2// This file is part of the snarkVM library.
3
4// Licensed under the Apache License, Version 2.0 (the "License");
5// you may not use this file except in compliance with the License.
6// You may obtain a copy of the License at:
7
8// http://www.apache.org/licenses/LICENSE-2.0
9
10// Unless required by applicable law or agreed to in writing, software
11// distributed under the License is distributed on an "AS IS" BASIS,
12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13// See the License for the specific language governing permissions and
14// limitations under the License.
15
16use super::*;
17
18impl<N: Network> ToBits for Record<N, Plaintext<N>> {
19    /// Returns this data as a list of **little-endian** bits.
20    fn write_bits_le(&self, vec: &mut Vec<bool>) {
21        // Compute the data bits.
22        let mut data_bits_le = vec![];
23        for (identifier, entry) in &self.data {
24            identifier.write_bits_le(&mut data_bits_le);
25            entry.write_bits_le(&mut data_bits_le);
26        }
27
28        // Construct the record bits.
29        self.owner.write_bits_le(vec);
30        u32::try_from(data_bits_le.len()).or_halt_with::<N>("Record data exceeds u32::MAX bits").write_bits_le(vec);
31        vec.extend_from_slice(&data_bits_le);
32        self.nonce.write_bits_le(vec);
33    }
34
35    /// Returns this data as a list of **big-endian** bits.
36    fn write_bits_be(&self, vec: &mut Vec<bool>) {
37        // Compute the data bits.
38        let mut data_bits_be = vec![];
39        for (identifier, entry) in &self.data {
40            identifier.write_bits_be(&mut data_bits_be);
41            entry.write_bits_be(&mut data_bits_be);
42        }
43
44        // Construct the record bits.
45        self.owner.write_bits_be(vec);
46        u32::try_from(data_bits_be.len()).or_halt_with::<N>("Record data exceeds u32::MAX bits").write_bits_be(vec);
47        vec.extend_from_slice(&data_bits_be);
48        self.nonce.write_bits_be(vec);
49    }
50}
51
52impl<N: Network> ToBits for Record<N, Ciphertext<N>> {
53    /// Returns this data as a list of **little-endian** bits.
54    fn write_bits_le(&self, vec: &mut Vec<bool>) {
55        // Compute the data bits.
56        let mut data_bits_le = vec![];
57        for (identifier, entry) in &self.data {
58            identifier.write_bits_le(&mut data_bits_le);
59            entry.write_bits_le(&mut data_bits_le);
60        }
61
62        // Construct the record bits.
63        self.owner.write_bits_le(vec);
64        u32::try_from(data_bits_le.len()).or_halt_with::<N>("Record data exceeds u32::MAX bits").write_bits_le(vec);
65        vec.extend_from_slice(&data_bits_le);
66        self.nonce.write_bits_le(vec);
67    }
68
69    /// Returns this data as a list of **big-endian** bits.
70    fn write_bits_be(&self, vec: &mut Vec<bool>) {
71        // Compute the data bits.
72        let mut data_bits_be = vec![];
73        for (identifier, entry) in &self.data {
74            identifier.write_bits_be(&mut data_bits_be);
75            entry.write_bits_be(&mut data_bits_be);
76        }
77
78        // Construct the record bits.
79        self.owner.write_bits_be(vec);
80        u32::try_from(data_bits_be.len()).or_halt_with::<N>("Record data exceeds u32::MAX bits").write_bits_be(vec);
81        vec.extend_from_slice(&data_bits_be);
82        self.nonce.write_bits_be(vec);
83    }
84}