Skip to main content

binius_core/constraint_system/
value_index.rs

1// Copyright 2025 Irreducible Inc.
2use binius_utils::serialization::{DeserializeBytes, SerializationError, SerializeBytes};
3use bytes::{Buf, BufMut};
4
5/// A type safe wrapper over an index into the [`ValueVec`](super::ValueVec).
6#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Debug)]
7pub struct ValueIndex(pub u32);
8
9impl ValueIndex {
10	/// The value index that is not considered to be valid.
11	pub const INVALID: ValueIndex = ValueIndex(u32::MAX);
12}
13
14/// The most sensible default for a value index is invalid.
15impl Default for ValueIndex {
16	fn default() -> Self {
17		Self::INVALID
18	}
19}
20
21impl SerializeBytes for ValueIndex {
22	fn serialize(&self, write_buf: impl BufMut) -> Result<(), SerializationError> {
23		self.0.serialize(write_buf)
24	}
25}
26
27impl DeserializeBytes for ValueIndex {
28	fn deserialize(read_buf: impl Buf) -> Result<Self, SerializationError>
29	where
30		Self: Sized,
31	{
32		Ok(ValueIndex(u32::deserialize(read_buf)?))
33	}
34}
35
36#[cfg(test)]
37mod tests {
38	use super::*;
39
40	#[test]
41	fn test_value_index_serialization_round_trip() {
42		let value_index = ValueIndex(12345);
43
44		let mut buf = Vec::new();
45		value_index.serialize(&mut buf).unwrap();
46
47		let deserialized = ValueIndex::deserialize(&mut buf.as_slice()).unwrap();
48		assert_eq!(value_index, deserialized);
49	}
50}