Skip to content
19 changes: 14 additions & 5 deletions crates/storage/src/merkle/column.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ use alloc::{
Eq,
Hash,
enum_iterator::Sequence,
strum_macros::EnumCount,
strum_macros::IntoStaticStr,
)]
pub enum MerkleizedColumn<TC> {
Expand All @@ -31,6 +30,16 @@ pub enum MerkleizedColumn<TC> {
MerkleMetadataColumn,
}

impl<TC> strum::EnumCount for MerkleizedColumn<TC>
where
TC: strum::EnumCount + AsU32,
{
/// The total count of variants in the enum.
/// Since we have two columns for each table column and one for the merkle data,
/// we have to multiply the count of the table columns by 2 and add one for the merkle metadata.
const COUNT: usize = TC::COUNT * 2 + 1;
}

/// The trait to convert the column to the `u32`.
pub trait AsU32 {
/// Returns the `u32` representation of the `Column`.
Expand All @@ -42,9 +51,7 @@ where
TC: strum::EnumCount + AsU32,
{
/// The total count of variants in the enum.
/// Since we have two columns for each table column and one for the merkle data,
/// we have to multiply the count of the table columns by 2 and add one for the merkle metadata.
pub const COUNT: usize = TC::COUNT * 2 + 1;
pub const COUNT: usize = <Self as strum::EnumCount>::COUNT;

/// The start of the merkle data columns.
pub const MERKLE_DATA_COLUMNS_START: u32 = u16::MAX as u32;
Expand All @@ -56,7 +63,9 @@ where
Self::MerkleDataColumn(column) => {
Self::MERKLE_DATA_COLUMNS_START.wrapping_add(column.as_u32())
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we need to fix this one as well. Seems like the in-memory database implementation assumes these values are contiguous.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nop, we don't need to fix these. the in memory db creates the columns based on the total count. anything in between is fine

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

But u16::MAX isn't in-between though, or am I missing something here? Self::MERKLE_DATA_COLUMNS_START is a constant set to u16::MAX from what I see.

Self::MerkleMetadataColumn => u32::MAX,
Self::MerkleMetadataColumn => {
Self::COUNT.checked_sub(1).unwrap().try_into().unwrap()
}
}
}
}
Expand Down
Loading