Skip to content

Commit

Permalink
Avoid direct transmutation
Browse files Browse the repository at this point in the history
  • Loading branch information
ohsayan committed Mar 11, 2024
1 parent 10e1f50 commit 739b2c8
Show file tree
Hide file tree
Showing 12 changed files with 238 additions and 188 deletions.
91 changes: 52 additions & 39 deletions server/src/engine/data/tag.rs
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,18 @@ pub enum TagClass {

strid! {
#[repr(u8)]
#[derive(Debug, PartialEq, Eq, Clone, Copy, Hash, PartialOrd, Ord, sky_macros::EnumMethods)]
#[derive(
Debug,
PartialEq,
Eq,
Clone,
Copy,
Hash,
PartialOrd,
Ord,
sky_macros::EnumMethods,
sky_macros::TaggedEnum,
)]
pub enum TagSelector {
Bool = 0,
UInt8 = 1,
Expand All @@ -70,49 +81,57 @@ impl TagSelector {
pub const fn into_full(self) -> FullTag {
FullTag::new(self.tag_class(), self, self.tag_unique())
}
pub const unsafe fn from_raw(v: u8) -> Self {
core::mem::transmute(v)
}
pub const fn tag_unique(&self) -> TagUnique {
[
TagUnique::Illegal,
TagUnique::UnsignedInt,
TagUnique::UnsignedInt,
TagUnique::UnsignedInt,
TagUnique::UnsignedInt,
TagUnique::SignedInt,
TagUnique::SignedInt,
TagUnique::SignedInt,
TagUnique::SignedInt,
TagUnique::Illegal,
TagUnique::Illegal,
TagUnique::Bin,
TagUnique::Str,
TagUnique::Illegal,
TagUnique::Illegal, // bool
TagUnique::UnsignedInt, // uint8
TagUnique::UnsignedInt, // uint16
TagUnique::UnsignedInt, // uint32
TagUnique::UnsignedInt, // uint64
TagUnique::SignedInt, // sint8
TagUnique::SignedInt, // sint16
TagUnique::SignedInt, // sint32
TagUnique::SignedInt, // sint64
TagUnique::Illegal, // f32
TagUnique::Illegal, // f64
TagUnique::Bin, // bin
TagUnique::Str, // str
TagUnique::Illegal, // list
][self.value_word()]
}
pub const fn tag_class(&self) -> TagClass {
[
TagClass::Bool,
TagClass::UnsignedInt,
TagClass::UnsignedInt,
TagClass::UnsignedInt,
TagClass::UnsignedInt,
TagClass::SignedInt,
TagClass::SignedInt,
TagClass::SignedInt,
TagClass::SignedInt,
TagClass::Float,
TagClass::Float,
TagClass::Bin,
TagClass::Str,
TagClass::List,
TagClass::Bool, // bool
TagClass::UnsignedInt, // uint8
TagClass::UnsignedInt, // uint16
TagClass::UnsignedInt, // uint32
TagClass::UnsignedInt, // uint64
TagClass::SignedInt, // sint8
TagClass::SignedInt, // sint16
TagClass::SignedInt, // sint32
TagClass::SignedInt, // sint64
TagClass::Float, // f32
TagClass::Float, // f64
TagClass::Bin, // bin
TagClass::Str, // str
TagClass::List, // recursive list
][self.value_word()]
}
}

#[repr(u8)]
#[derive(Debug, PartialEq, Eq, Clone, Copy, Hash, PartialOrd, Ord, sky_macros::EnumMethods)]
#[derive(
Debug,
PartialEq,
Eq,
Clone,
Copy,
Hash,
PartialOrd,
Ord,
sky_macros::EnumMethods,
sky_macros::TaggedEnum,
)]
pub enum TagUnique {
UnsignedInt = 0,
SignedInt = 1,
Expand All @@ -125,12 +144,6 @@ impl TagUnique {
pub const fn is_unique(&self) -> bool {
self.value_u8() != Self::Illegal.value_u8()
}
pub const fn try_from_raw(raw: u8) -> Option<Self> {
if raw > 3 {
return None;
}
Some(unsafe { core::mem::transmute(raw) })
}
}

pub trait DataTag {
Expand Down
7 changes: 2 additions & 5 deletions server/src/engine/net/protocol/handshake.rs
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@

use crate::{
engine::mem::scanner::{BufferedScanner, ScannerDecodeResult},
util::compiler,
util::compiler::{self, TaggedEnum},
};

#[derive(Debug, PartialEq, Eq, Clone, Copy, sky_macros::EnumMethods)]
Expand Down Expand Up @@ -86,17 +86,14 @@ pub enum QueryMode {
Bql1 = 0,
}

#[derive(Debug, PartialEq, Eq, Clone, Copy, sky_macros::EnumMethods)]
#[derive(Debug, PartialEq, Eq, Clone, Copy, sky_macros::EnumMethods, sky_macros::TaggedEnum)]
#[repr(u8)]
/// the authentication mode
pub enum AuthMode {
Password = 0,
}

impl AuthMode {
unsafe fn from_raw(v: u8) -> Self {
core::mem::transmute(v)
}
/// returns the minimum number of metadata bytes need to parse the payload for this auth mode
const fn min_payload_bytes(&self) -> usize {
match self {
Expand Down
40 changes: 14 additions & 26 deletions server/src/engine/storage/common/sdss/impls/sdss_r1/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -44,13 +44,10 @@ use {
storage::common::interface::fs::{FileRead, FileWrite},
RuntimeResult,
},
util::os,
util::{compiler::TaggedEnum, os},
IoResult,
},
std::{
mem::{transmute, ManuallyDrop},
ops::Range,
},
std::{mem::ManuallyDrop, ops::Range},
};

pub const TEST_TIME: u128 = (u64::MAX / sizeof!(u64) as u64) as _;
Expand All @@ -59,22 +56,13 @@ pub const TEST_TIME: u128 = (u64::MAX / sizeof!(u64) as u64) as _;
header utils
*/

pub trait HeaderV1Enumeration {
/// the maximum value of this enumeration
const MAX: u8;
/// Create a new enumeration, given that the maximum is validated
unsafe fn new(x: u8) -> Self;
/// Return the 1B repr of the enumeration
fn repr_u8(&self) -> u8;
}

/// A trait that enables customizing the SDSS header for a specific version tuple
pub trait HeaderV1Spec {
// types
/// The file class type
type FileClass: HeaderV1Enumeration + Copy + PartialEq;
type FileClass: TaggedEnum<Dscr = u8> + Copy + PartialEq;
/// The file specifier type
type FileSpecifier: HeaderV1Enumeration + Copy + PartialEq;
type FileSpecifier: TaggedEnum<Dscr = u8> + Copy + PartialEq;
// constants
/// The server version to use during encode
///
Expand Down Expand Up @@ -232,8 +220,8 @@ impl<H: HeaderV1Spec> HeaderV1<H> {
ret[Self::SEG2_REC1_HOST_PTR_WIDTH] = HostPointerWidth::new().value_u8();
ret[Self::SEG2_REC1_HOST_ENDIAN] = HostEndian::new().value_u8();
// 2.1.3
ret[Self::SEG2_REC1_FILE_CLASS] = file_class.repr_u8();
ret[Self::SEG2_REC1_FILE_SPECIFIER] = file_specifier.repr_u8();
ret[Self::SEG2_REC1_FILE_CLASS] = file_class.dscr();
ret[Self::SEG2_REC1_FILE_SPECIFIER] = file_specifier.dscr();
ret[Self::SEG2_REC1_FILE_SPECIFIER_VERSION]
.copy_from_slice(&file_specifier_version.little_endian());
// 2.2
Expand Down Expand Up @@ -321,8 +309,8 @@ impl<H: HeaderV1Spec> HeaderV1<H> {
raw_host_ptr_width <= HostPointerWidth::MAX,
raw_host_endian <= HostEndian::MAX,
// 2.1.3
raw_file_class <= H::FileClass::MAX,
raw_file_specifier <= H::FileSpecifier::MAX,
raw_file_class <= H::FileClass::MAX_DSCR,
raw_file_specifier <= H::FileSpecifier::MAX_DSCR,
);
if okay {
Ok(unsafe {
Expand All @@ -334,13 +322,13 @@ impl<H: HeaderV1Spec> HeaderV1<H> {
raw_server_version,
raw_driver_version,
// 2.1.2
transmute(raw_host_os),
transmute(raw_host_arch),
transmute(raw_host_ptr_width),
transmute(raw_host_endian),
HostOS::from_raw(raw_host_os),
HostArch::from_raw(raw_host_arch),
HostPointerWidth::from_raw(raw_host_ptr_width),
HostEndian::from_raw(raw_host_endian),
// 2.1.3
H::FileClass::new(raw_file_class),
H::FileSpecifier::new(raw_file_specifier),
H::FileClass::from_raw(raw_file_class),
H::FileSpecifier::from_raw(raw_file_specifier),
raw_file_specifier_version,
// 2.2
raw_runtime_epoch_time,
Expand Down
48 changes: 44 additions & 4 deletions server/src/engine/storage/common/static_meta.rs
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,17 @@
pub const SDSS_MAGIC_8B: u64 = 0x4F48534159414E21;

#[repr(u8)]
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, sky_macros::EnumMethods)]
#[derive(
Debug,
Clone,
Copy,
PartialEq,
Eq,
PartialOrd,
Ord,
sky_macros::EnumMethods,
sky_macros::TaggedEnum,
)]
/// Host architecture enumeration for common platforms
pub enum HostArch {
X86 = 0,
Expand Down Expand Up @@ -65,7 +75,17 @@ impl HostArch {
}

#[repr(u8)]
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, sky_macros::EnumMethods)]
#[derive(
Debug,
Clone,
Copy,
PartialEq,
Eq,
PartialOrd,
Ord,
sky_macros::EnumMethods,
sky_macros::TaggedEnum,
)]
/// Host OS enumeration for common operating systems
pub enum HostOS {
// T1
Expand Down Expand Up @@ -124,7 +144,17 @@ impl HostOS {
}

#[repr(u8)]
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, sky_macros::EnumMethods)]
#[derive(
Debug,
Clone,
Copy,
PartialEq,
Eq,
PartialOrd,
Ord,
sky_macros::EnumMethods,
sky_macros::TaggedEnum,
)]
/// Host endian enumeration
pub enum HostEndian {
Big = 0,
Expand All @@ -141,7 +171,17 @@ impl HostEndian {
}
}

#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, sky_macros::EnumMethods)]
#[derive(
Debug,
Clone,
Copy,
PartialEq,
Eq,
PartialOrd,
Ord,
sky_macros::EnumMethods,
sky_macros::TaggedEnum,
)]
#[repr(u8)]
/// Host pointer width enumeration
pub enum HostPointerWidth {
Expand Down
2 changes: 1 addition & 1 deletion server/src/engine/storage/common_encoding/r1/map.rs
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ use {
idx::{IndexSTSeqCns, STIndexSeq},
mem::{BufferedScanner, StatelessLen},
},
util::{copy_slice_to_array as memcpy, EndianQW},
util::{compiler::TaggedEnum, copy_slice_to_array as memcpy, EndianQW},
},
std::{collections::HashMap, marker::PhantomData},
};
Expand Down
31 changes: 16 additions & 15 deletions server/src/engine/storage/common_encoding/r1/obj.rs
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ use {
idx::IndexSTSeqCns,
mem::{BufferedScanner, VInline},
},
util::EndianQW,
util::{compiler::TaggedEnum, EndianQW},
},
};

Expand All @@ -57,10 +57,21 @@ pub mod cell {
cell::Datacell,
tag::{DataTag, TagClass, TagSelector},
},
util::EndianQW,
util::{compiler::TaggedEnum, EndianQW},
},
};
#[derive(Debug, PartialEq, Eq, Clone, Copy, PartialOrd, Ord, Hash, sky_macros::EnumMethods)]
#[derive(
Debug,
PartialEq,
Eq,
Clone,
Copy,
PartialOrd,
Ord,
Hash,
sky_macros::EnumMethods,
sky_macros::TaggedEnum,
)]
#[repr(u8)]
#[allow(dead_code)]
pub enum StorageCellTypeID {
Expand All @@ -82,23 +93,13 @@ pub mod cell {
Dict = 0x0F,
}
impl StorageCellTypeID {
pub const unsafe fn from_raw(v: u8) -> Self {
core::mem::transmute(v)
}
pub const fn try_from_raw(v: u8) -> Option<Self> {
if Self::is_valid(v) {
Some(unsafe { Self::from_raw(v) })
} else {
None
}
}
#[inline(always)]
pub const fn is_valid(d: u8) -> bool {
d <= Self::MAX
}
const unsafe fn into_selector(self) -> TagSelector {
unsafe fn into_selector(self) -> TagSelector {
debug_assert!(self.value_u8() != Self::Null.value_u8());
core::mem::transmute(self.value_u8() - 1)
TagSelector::from_raw(self.value_u8() - 1)
}
#[inline(always)]
pub fn expect_atleast(d: u8) -> usize {
Expand Down

0 comments on commit 739b2c8

Please sign in to comment.