use super::*;
use console::PlaintextType;
impl<A: Aleo> ToBits for Plaintext<A> {
type Boolean = Boolean<A>;
fn write_bits_le(&self, vec: &mut Vec<Boolean<A>>) {
match self {
Self::Literal(literal, bits_le) => {
let bits = bits_le.get_or_init(|| {
let mut bits_le = Vec::new();
bits_le.extend(PlaintextType::<A::Network>::LITERAL_PREFIX_BITS.map(Boolean::constant)); literal.variant().write_bits_le(&mut bits_le);
literal.size_in_bits().write_bits_le(&mut bits_le);
literal.write_bits_le(&mut bits_le);
bits_le.shrink_to_fit();
bits_le
});
vec.extend_from_slice(bits);
}
Self::Struct(members, bits_le) => {
let bits = bits_le.get_or_init(|| {
let mut bits_le = Vec::new();
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);
for (identifier, value) in members {
let value_bits = value.to_bits_le();
identifier.size_in_bits().write_bits_le(&mut bits_le);
identifier.write_bits_le(&mut bits_le);
U16::constant(console::U16::new(value_bits.len() as u16)).write_bits_le(&mut bits_le);
bits_le.extend(value_bits);
}
bits_le.shrink_to_fit();
bits_le
});
vec.extend_from_slice(bits);
}
Self::Array(elements, bits_le) => {
let bits = bits_le.get_or_init(|| {
let mut bits_le = Vec::new();
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);
for value in elements {
let value_bits = value.to_bits_le();
U16::constant(console::U16::new(value_bits.len() as u16)).write_bits_le(&mut bits_le);
bits_le.extend(value_bits);
}
bits_le.shrink_to_fit();
bits_le
});
vec.extend_from_slice(bits);
}
}
}
fn write_bits_be(&self, vec: &mut Vec<Boolean<A>>) {
match self {
Self::Literal(literal, bits_be) => {
let bits = bits_be.get_or_init(|| {
let mut bits_be = Vec::new();
bits_be.extend(PlaintextType::<A::Network>::LITERAL_PREFIX_BITS.map(Boolean::constant)); literal.variant().write_bits_be(&mut bits_be);
literal.size_in_bits().write_bits_be(&mut bits_be);
literal.write_bits_be(&mut bits_be);
bits_be.shrink_to_fit();
bits_be
});
vec.extend_from_slice(bits);
}
Self::Struct(members, bits_be) => {
let bits = bits_be.get_or_init(|| {
let mut bits_be = Vec::new();
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);
for (identifier, value) in members {
let value_bits = value.to_bits_be();
identifier.size_in_bits().write_bits_be(&mut bits_be);
identifier.write_bits_be(&mut bits_be);
U16::constant(console::U16::new(value_bits.len() as u16)).write_bits_be(&mut bits_be);
bits_be.extend(value_bits);
}
bits_be.shrink_to_fit();
bits_be
});
vec.extend_from_slice(bits)
}
Self::Array(elements, bits_be) => {
let bits = bits_be.get_or_init(|| {
let mut bits_be = Vec::new();
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);
for value in elements {
let value_bits = value.to_bits_be();
U16::constant(console::U16::new(value_bits.len() as u16)).write_bits_be(&mut bits_be);
bits_be.extend(value_bits);
}
bits_be.shrink_to_fit();
bits_be
});
vec.extend_from_slice(bits)
}
}
}
}