diff --git a/tools/kv_typed/src/from_bytes.rs b/tools/kv_typed/src/from_bytes.rs
index 5ae7245145392833eff049abd148b0fe5fb8c025..6cade2d4b8b7c78d51545ea9efb20e188682ad49 100644
--- a/tools/kv_typed/src/from_bytes.rs
+++ b/tools/kv_typed/src/from_bytes.rs
@@ -55,23 +55,19 @@ impl FromBytes for String {
     }
 }
 
-macro_rules! impl_from_bytes_for_smallvec {
-    ($($N:literal),*) => {$(
-        impl<T> FromBytes for SmallVec<[T; $N]>
-        where
-            T: Copy + zerocopy::FromBytes,
-        {
-            type Err = LayoutVerifiedErr;
+impl<T, const N: usize> FromBytes for SmallVec<[T; N]>
+where
+    T: Copy + zerocopy::FromBytes,
+    [T; N]: smallvec::Array<Item = T>,
+{
+    type Err = LayoutVerifiedErr;
 
-            fn from_bytes(bytes: &[u8]) -> Result<Self, Self::Err> {
-                let layout_verified = zerocopy::LayoutVerified::<_, [T]>::new_slice(bytes)
-                    .ok_or_else(|| LayoutVerifiedErr(stringify!(T)).into())?;
-                Ok(SmallVec::from_slice(layout_verified.into_slice()))
-            }
-        }
-    )*};
+    fn from_bytes(bytes: &[u8]) -> Result<Self, Self::Err> {
+        let layout_verified = zerocopy::LayoutVerified::<_, [T]>::new_slice(bytes)
+            .ok_or(LayoutVerifiedErr(stringify!(T)))?;
+        Ok(SmallVec::from_slice(layout_verified.into_slice()))
+    }
 }
-impl_from_bytes_for_smallvec!(1, 2, 4, 8, 16, 32, 64);
 
 impl<T> FromBytes for Vec<T>
 where