snarkvm_circuit_program/data/plaintext/
to_bits.rs1use super::*;
17
18use console::PlaintextType;
19
20impl<A: Aleo> ToBits for Plaintext<A> {
21 type Boolean = Boolean<A>;
22
23 fn write_bits_le(&self, vec: &mut Vec<Boolean<A>>) {
25 match self {
26 Self::Literal(literal, bits_le) => {
27 let bits = bits_le.get_or_init(|| {
29 let mut bits_le = Vec::new();
30 bits_le.extend(PlaintextType::<A::Network>::LITERAL_PREFIX_BITS.map(Boolean::constant)); literal.variant().write_bits_le(&mut bits_le);
32 literal.size_in_bits().write_bits_le(&mut bits_le);
33 literal.write_bits_le(&mut bits_le);
34 bits_le.shrink_to_fit();
35 bits_le
36 });
37 vec.extend_from_slice(bits);
39 }
40 Self::Struct(members, bits_le) => {
41 let bits = bits_le.get_or_init(|| {
43 let mut bits_le = Vec::new();
44 bits_le.extend(PlaintextType::<A::Network>::STRUCT_PREFIX_BITS.map(Boolean::constant)); U8::constant(console::U8::new(members.len() as u8)).write_bits_le(&mut bits_le);
46 for (identifier, value) in members {
47 let value_bits = value.to_bits_le();
48 identifier.size_in_bits().write_bits_le(&mut bits_le);
49 identifier.write_bits_le(&mut bits_le);
50 U16::constant(console::U16::new(value_bits.len() as u16)).write_bits_le(&mut bits_le);
51 bits_le.extend(value_bits);
52 }
53 bits_le.shrink_to_fit();
54 bits_le
55 });
56 vec.extend_from_slice(bits);
58 }
59 Self::Array(elements, bits_le) => {
60 let bits = bits_le.get_or_init(|| {
62 let mut bits_le = Vec::new();
63 bits_le.extend(PlaintextType::<A::Network>::ARRAY_PREFIX_BITS.map(Boolean::constant)); U32::constant(console::U32::new(elements.len() as u32)).write_bits_le(&mut bits_le);
65 for value in elements {
66 let value_bits = value.to_bits_le();
67 U16::constant(console::U16::new(value_bits.len() as u16)).write_bits_le(&mut bits_le);
68 bits_le.extend(value_bits);
69 }
70 bits_le.shrink_to_fit();
71 bits_le
72 });
73 vec.extend_from_slice(bits);
75 }
76 }
77 }
78
79 fn write_bits_be(&self, vec: &mut Vec<Boolean<A>>) {
81 match self {
82 Self::Literal(literal, bits_be) => {
83 let bits = bits_be.get_or_init(|| {
85 let mut bits_be = Vec::new();
86 bits_be.extend(PlaintextType::<A::Network>::LITERAL_PREFIX_BITS.map(Boolean::constant)); literal.variant().write_bits_be(&mut bits_be);
88 literal.size_in_bits().write_bits_be(&mut bits_be);
89 literal.write_bits_be(&mut bits_be);
90 bits_be.shrink_to_fit();
91 bits_be
92 });
93 vec.extend_from_slice(bits);
95 }
96 Self::Struct(members, bits_be) => {
97 let bits = bits_be.get_or_init(|| {
99 let mut bits_be = Vec::new();
100 bits_be.extend(PlaintextType::<A::Network>::STRUCT_PREFIX_BITS.map(Boolean::constant)); U8::constant(console::U8::new(members.len() as u8)).write_bits_be(&mut bits_be);
102 for (identifier, value) in members {
103 let value_bits = value.to_bits_be();
104 identifier.size_in_bits().write_bits_be(&mut bits_be);
105 identifier.write_bits_be(&mut bits_be);
106 U16::constant(console::U16::new(value_bits.len() as u16)).write_bits_be(&mut bits_be);
107 bits_be.extend(value_bits);
108 }
109 bits_be.shrink_to_fit();
110 bits_be
111 });
112 vec.extend_from_slice(bits)
114 }
115 Self::Array(elements, bits_be) => {
116 let bits = bits_be.get_or_init(|| {
118 let mut bits_be = Vec::new();
119 bits_be.extend(PlaintextType::<A::Network>::ARRAY_PREFIX_BITS.map(Boolean::constant)); U32::constant(console::U32::new(elements.len() as u32)).write_bits_be(&mut bits_be);
121 for value in elements {
122 let value_bits = value.to_bits_be();
123 U16::constant(console::U16::new(value_bits.len() as u16)).write_bits_be(&mut bits_be);
124 bits_be.extend(value_bits);
125 }
126 bits_be.shrink_to_fit();
127 bits_be
128 });
129 vec.extend_from_slice(bits)
131 }
132 }
133 }
134}