Avoid direct transmutation

next
Sayan Nandan 6 months ago
parent 10e1f50d78
commit 739b2c8e76
No known key found for this signature in database
GPG Key ID: 0EBD769024B24F0A

@ -47,7 +47,18 @@ pub enum TagClass {
strid! { strid! {
#[repr(u8)] #[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 { pub enum TagSelector {
Bool = 0, Bool = 0,
UInt8 = 1, UInt8 = 1,
@ -70,49 +81,57 @@ impl TagSelector {
pub const fn into_full(self) -> FullTag { pub const fn into_full(self) -> FullTag {
FullTag::new(self.tag_class(), self, self.tag_unique()) 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 { pub const fn tag_unique(&self) -> TagUnique {
[ [
TagUnique::Illegal, TagUnique::Illegal, // bool
TagUnique::UnsignedInt, TagUnique::UnsignedInt, // uint8
TagUnique::UnsignedInt, TagUnique::UnsignedInt, // uint16
TagUnique::UnsignedInt, TagUnique::UnsignedInt, // uint32
TagUnique::UnsignedInt, TagUnique::UnsignedInt, // uint64
TagUnique::SignedInt, TagUnique::SignedInt, // sint8
TagUnique::SignedInt, TagUnique::SignedInt, // sint16
TagUnique::SignedInt, TagUnique::SignedInt, // sint32
TagUnique::SignedInt, TagUnique::SignedInt, // sint64
TagUnique::Illegal, TagUnique::Illegal, // f32
TagUnique::Illegal, TagUnique::Illegal, // f64
TagUnique::Bin, TagUnique::Bin, // bin
TagUnique::Str, TagUnique::Str, // str
TagUnique::Illegal, TagUnique::Illegal, // list
][self.value_word()] ][self.value_word()]
} }
pub const fn tag_class(&self) -> TagClass { pub const fn tag_class(&self) -> TagClass {
[ [
TagClass::Bool, TagClass::Bool, // bool
TagClass::UnsignedInt, TagClass::UnsignedInt, // uint8
TagClass::UnsignedInt, TagClass::UnsignedInt, // uint16
TagClass::UnsignedInt, TagClass::UnsignedInt, // uint32
TagClass::UnsignedInt, TagClass::UnsignedInt, // uint64
TagClass::SignedInt, TagClass::SignedInt, // sint8
TagClass::SignedInt, TagClass::SignedInt, // sint16
TagClass::SignedInt, TagClass::SignedInt, // sint32
TagClass::SignedInt, TagClass::SignedInt, // sint64
TagClass::Float, TagClass::Float, // f32
TagClass::Float, TagClass::Float, // f64
TagClass::Bin, TagClass::Bin, // bin
TagClass::Str, TagClass::Str, // str
TagClass::List, TagClass::List, // recursive list
][self.value_word()] ][self.value_word()]
} }
} }
#[repr(u8)] #[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 { pub enum TagUnique {
UnsignedInt = 0, UnsignedInt = 0,
SignedInt = 1, SignedInt = 1,
@ -125,12 +144,6 @@ impl TagUnique {
pub const fn is_unique(&self) -> bool { pub const fn is_unique(&self) -> bool {
self.value_u8() != Self::Illegal.value_u8() 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 { pub trait DataTag {

@ -26,7 +26,7 @@
use crate::{ use crate::{
engine::mem::scanner::{BufferedScanner, ScannerDecodeResult}, engine::mem::scanner::{BufferedScanner, ScannerDecodeResult},
util::compiler, util::compiler::{self, TaggedEnum},
}; };
#[derive(Debug, PartialEq, Eq, Clone, Copy, sky_macros::EnumMethods)] #[derive(Debug, PartialEq, Eq, Clone, Copy, sky_macros::EnumMethods)]
@ -86,7 +86,7 @@ pub enum QueryMode {
Bql1 = 0, 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)] #[repr(u8)]
/// the authentication mode /// the authentication mode
pub enum AuthMode { pub enum AuthMode {
@ -94,9 +94,6 @@ pub enum AuthMode {
} }
impl AuthMode { 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 /// returns the minimum number of metadata bytes need to parse the payload for this auth mode
const fn min_payload_bytes(&self) -> usize { const fn min_payload_bytes(&self) -> usize {
match self { match self {

@ -44,13 +44,10 @@ use {
storage::common::interface::fs::{FileRead, FileWrite}, storage::common::interface::fs::{FileRead, FileWrite},
RuntimeResult, RuntimeResult,
}, },
util::os, util::{compiler::TaggedEnum, os},
IoResult, IoResult,
}, },
std::{ std::{mem::ManuallyDrop, ops::Range},
mem::{transmute, ManuallyDrop},
ops::Range,
},
}; };
pub const TEST_TIME: u128 = (u64::MAX / sizeof!(u64) as u64) as _; pub const TEST_TIME: u128 = (u64::MAX / sizeof!(u64) as u64) as _;
@ -59,22 +56,13 @@ pub const TEST_TIME: u128 = (u64::MAX / sizeof!(u64) as u64) as _;
header utils 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 /// A trait that enables customizing the SDSS header for a specific version tuple
pub trait HeaderV1Spec { pub trait HeaderV1Spec {
// types // types
/// The file class type /// The file class type
type FileClass: HeaderV1Enumeration + Copy + PartialEq; type FileClass: TaggedEnum<Dscr = u8> + Copy + PartialEq;
/// The file specifier type /// The file specifier type
type FileSpecifier: HeaderV1Enumeration + Copy + PartialEq; type FileSpecifier: TaggedEnum<Dscr = u8> + Copy + PartialEq;
// constants // constants
/// The server version to use during encode /// The server version to use during encode
/// ///
@ -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_PTR_WIDTH] = HostPointerWidth::new().value_u8();
ret[Self::SEG2_REC1_HOST_ENDIAN] = HostEndian::new().value_u8(); ret[Self::SEG2_REC1_HOST_ENDIAN] = HostEndian::new().value_u8();
// 2.1.3 // 2.1.3
ret[Self::SEG2_REC1_FILE_CLASS] = file_class.repr_u8(); ret[Self::SEG2_REC1_FILE_CLASS] = file_class.dscr();
ret[Self::SEG2_REC1_FILE_SPECIFIER] = file_specifier.repr_u8(); ret[Self::SEG2_REC1_FILE_SPECIFIER] = file_specifier.dscr();
ret[Self::SEG2_REC1_FILE_SPECIFIER_VERSION] ret[Self::SEG2_REC1_FILE_SPECIFIER_VERSION]
.copy_from_slice(&file_specifier_version.little_endian()); .copy_from_slice(&file_specifier_version.little_endian());
// 2.2 // 2.2
@ -321,8 +309,8 @@ impl<H: HeaderV1Spec> HeaderV1<H> {
raw_host_ptr_width <= HostPointerWidth::MAX, raw_host_ptr_width <= HostPointerWidth::MAX,
raw_host_endian <= HostEndian::MAX, raw_host_endian <= HostEndian::MAX,
// 2.1.3 // 2.1.3
raw_file_class <= H::FileClass::MAX, raw_file_class <= H::FileClass::MAX_DSCR,
raw_file_specifier <= H::FileSpecifier::MAX, raw_file_specifier <= H::FileSpecifier::MAX_DSCR,
); );
if okay { if okay {
Ok(unsafe { Ok(unsafe {
@ -334,13 +322,13 @@ impl<H: HeaderV1Spec> HeaderV1<H> {
raw_server_version, raw_server_version,
raw_driver_version, raw_driver_version,
// 2.1.2 // 2.1.2
transmute(raw_host_os), HostOS::from_raw(raw_host_os),
transmute(raw_host_arch), HostArch::from_raw(raw_host_arch),
transmute(raw_host_ptr_width), HostPointerWidth::from_raw(raw_host_ptr_width),
transmute(raw_host_endian), HostEndian::from_raw(raw_host_endian),
// 2.1.3 // 2.1.3
H::FileClass::new(raw_file_class), H::FileClass::from_raw(raw_file_class),
H::FileSpecifier::new(raw_file_specifier), H::FileSpecifier::from_raw(raw_file_specifier),
raw_file_specifier_version, raw_file_specifier_version,
// 2.2 // 2.2
raw_runtime_epoch_time, raw_runtime_epoch_time,

@ -33,7 +33,17 @@
pub const SDSS_MAGIC_8B: u64 = 0x4F48534159414E21; pub const SDSS_MAGIC_8B: u64 = 0x4F48534159414E21;
#[repr(u8)] #[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 /// Host architecture enumeration for common platforms
pub enum HostArch { pub enum HostArch {
X86 = 0, X86 = 0,
@ -65,7 +75,17 @@ impl HostArch {
} }
#[repr(u8)] #[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 /// Host OS enumeration for common operating systems
pub enum HostOS { pub enum HostOS {
// T1 // T1
@ -124,7 +144,17 @@ impl HostOS {
} }
#[repr(u8)] #[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 /// Host endian enumeration
pub enum HostEndian { pub enum HostEndian {
Big = 0, Big = 0,
@ -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)] #[repr(u8)]
/// Host pointer width enumeration /// Host pointer width enumeration
pub enum HostPointerWidth { pub enum HostPointerWidth {

@ -40,7 +40,7 @@ use {
idx::{IndexSTSeqCns, STIndexSeq}, idx::{IndexSTSeqCns, STIndexSeq},
mem::{BufferedScanner, StatelessLen}, 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}, std::{collections::HashMap, marker::PhantomData},
}; };

@ -41,7 +41,7 @@ use {
idx::IndexSTSeqCns, idx::IndexSTSeqCns,
mem::{BufferedScanner, VInline}, mem::{BufferedScanner, VInline},
}, },
util::EndianQW, util::{compiler::TaggedEnum, EndianQW},
}, },
}; };
@ -57,10 +57,21 @@ pub mod cell {
cell::Datacell, cell::Datacell,
tag::{DataTag, TagClass, TagSelector}, 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)] #[repr(u8)]
#[allow(dead_code)] #[allow(dead_code)]
pub enum StorageCellTypeID { pub enum StorageCellTypeID {
@ -82,23 +93,13 @@ pub mod cell {
Dict = 0x0F, Dict = 0x0F,
} }
impl StorageCellTypeID { 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)] #[inline(always)]
pub const fn is_valid(d: u8) -> bool { pub const fn is_valid(d: u8) -> bool {
d <= Self::MAX 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()); 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)] #[inline(always)]
pub fn expect_atleast(d: u8) -> usize { pub fn expect_atleast(d: u8) -> usize {

@ -26,20 +26,23 @@
use { use {
super::obj, super::obj,
crate::engine::{ crate::{
core::{ engine::{
model::{Field, Layer, ModelData}, core::{
space::Space, model::{Field, Layer, ModelData},
space::Space,
},
data::{
cell::Datacell,
dict::{DictEntryGeneric, DictGeneric},
tag::{FloatSpec, SIntSpec, TagSelector, UIntSpec},
uuid::Uuid,
},
idx::{IndexBaseSpec, IndexSTSeqCns, STIndex, STIndexSeq},
mem::BufferedScanner,
storage::common_encoding::r1::obj::cell::StorageCellTypeID,
}, },
data::{ util::compiler::TaggedEnum,
cell::Datacell,
dict::{DictEntryGeneric, DictGeneric},
tag::{FloatSpec, SIntSpec, TagSelector, UIntSpec},
uuid::Uuid,
},
idx::{IndexBaseSpec, IndexSTSeqCns, STIndex, STIndexSeq},
mem::BufferedScanner,
storage::common_encoding::r1::obj::cell::StorageCellTypeID,
}, },
}; };

@ -29,22 +29,25 @@ use {
MARKER_ACTUAL_BATCH_EVENT, MARKER_BATCH_CLOSED, MARKER_BATCH_REOPEN, MARKER_END_OF_BATCH, MARKER_ACTUAL_BATCH_EVENT, MARKER_BATCH_CLOSED, MARKER_BATCH_REOPEN, MARKER_END_OF_BATCH,
MARKER_RECOVERY_EVENT, MARKER_RECOVERY_EVENT,
}, },
crate::engine::{ crate::{
core::{ engine::{
index::{DcFieldIndex, PrimaryIndexKey, Row}, core::{
model::{delta::DeltaVersion, ModelData}, index::{DcFieldIndex, PrimaryIndexKey, Row},
}, model::{delta::DeltaVersion, ModelData},
data::{cell::Datacell, tag::TagUnique}, },
error::{RuntimeResult, StorageError}, data::{cell::Datacell, tag::TagUnique},
idx::{MTIndex, STIndex, STIndexSeq}, error::{RuntimeResult, StorageError},
storage::{ idx::{MTIndex, STIndex, STIndexSeq},
common::interface::fs::File, storage::{
common_encoding::r1::{ common::interface::fs::File,
obj::cell::{self, StorageCellTypeID}, common_encoding::r1::{
DataSource, obj::cell::{self, StorageCellTypeID},
DataSource,
},
v1::raw::rw::{SDSSFileIO, TrackedReader},
}, },
v1::raw::rw::{SDSSFileIO, TrackedReader},
}, },
util::compiler::TaggedEnum,
}, },
std::{ std::{
collections::{hash_map::Entry as HMEntry, HashMap}, collections::{hash_map::Entry as HMEntry, HashMap},

@ -39,35 +39,37 @@ impl sdss::sdss_r1::HeaderV1Spec for HeaderImplV1 {
const CURRENT_SERVER_VERSION: ServerVersion = versions::v1::V1_SERVER_VERSION; const CURRENT_SERVER_VERSION: ServerVersion = versions::v1::V1_SERVER_VERSION;
const CURRENT_DRIVER_VERSION: DriverVersion = versions::v1::V1_DRIVER_VERSION; const CURRENT_DRIVER_VERSION: DriverVersion = versions::v1::V1_DRIVER_VERSION;
} }
impl sdss::sdss_r1::HeaderV1Enumeration for FileScope {
const MAX: u8 = FileScope::MAX;
unsafe fn new(x: u8) -> Self {
core::mem::transmute(x)
}
fn repr_u8(&self) -> u8 {
FileScope::value_u8(self)
}
}
impl sdss::sdss_r1::HeaderV1Enumeration for FileSpecifier {
const MAX: u8 = FileSpecifier::MAX;
unsafe fn new(x: u8) -> Self {
core::mem::transmute(x)
}
fn repr_u8(&self) -> u8 {
self.value_u8()
}
}
/// The file scope /// The file scope
#[repr(u8)] #[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,
)]
pub enum FileScope { pub enum FileScope {
Journal = 0, Journal = 0,
DataBatch = 1, DataBatch = 1,
FlatmapData = 2, FlatmapData = 2,
} }
#[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)] #[repr(u8)]
pub enum FileSpecifier { pub enum FileSpecifier {
GNSTxnLog = 0, GNSTxnLog = 0,

@ -616,19 +616,22 @@ impl BatchAdapterSpec for ModelDataAdapter {
mod restore_impls { mod restore_impls {
use { use {
super::BatchMetadata, super::BatchMetadata,
crate::engine::{ crate::{
core::index::PrimaryIndexKey, engine::{
data::{cell::Datacell, tag::TagUnique}, core::index::PrimaryIndexKey,
error::StorageError, data::{cell::Datacell, tag::TagUnique},
storage::{ error::StorageError,
common::sdss::sdss_r1::{rw::TrackedReaderContext, FileSpecV1}, storage::{
common_encoding::r1::{ common::sdss::sdss_r1::{rw::TrackedReaderContext, FileSpecV1},
obj::cell::{self, StorageCellTypeID}, common_encoding::r1::{
DataSource, obj::cell::{self, StorageCellTypeID},
DataSource,
},
v2::raw::spec::ModelDataBatchAofV1,
}, },
v2::raw::spec::ModelDataBatchAofV1, RuntimeResult,
}, },
RuntimeResult, util::compiler::TaggedEnum,
}, },
std::mem::ManuallyDrop, std::mem::ManuallyDrop,
}; };
@ -662,7 +665,7 @@ mod restore_impls {
PrimaryIndexKey::new_from_dual(pk_type, len, md.as_mut_ptr() as usize) PrimaryIndexKey::new_from_dual(pk_type, len, md.as_mut_ptr() as usize)
} }
} }
_ => unsafe { TagUnique::Illegal => unsafe {
// UNSAFE(@ohsayan): TagUnique::try_from_raw rejects an construction with Invalid as the dscr // UNSAFE(@ohsayan): TagUnique::try_from_raw rejects an construction with Invalid as the dscr
impossible!() impossible!()
}, },

@ -28,17 +28,20 @@
mod tests; mod tests;
use { use {
crate::engine::{ crate::{
error::StorageError, engine::{
mem::unsafe_apis::memcpy, error::StorageError,
storage::common::{ mem::unsafe_apis::memcpy,
checksum::SCrc64, storage::common::{
sdss::sdss_r1::{ checksum::SCrc64,
rw::{SdssFile, TrackedReader, TrackedWriter}, sdss::sdss_r1::{
FileSpecV1, rw::{SdssFile, TrackedReader, TrackedWriter},
FileSpecV1,
},
}, },
RuntimeResult,
}, },
RuntimeResult, util::compiler::TaggedEnum,
}, },
core::fmt, core::fmt,
std::ops::Range, std::ops::Range,
@ -434,7 +437,7 @@ impl DriverEvent {
if invalid_ev_dscr | invalid_ck | invalid_pl_size { if invalid_ev_dscr | invalid_ck | invalid_pl_size {
return None; return None;
} }
driver_event = core::mem::transmute(driver_event_ as u8); driver_event = DriverEventKind::from_raw(driver_event_ as u8);
Some(Self::with_checksum( Some(Self::with_checksum(
txn_id, txn_id,
driver_event, driver_event,
@ -447,7 +450,7 @@ impl DriverEvent {
} }
} }
#[derive(Debug, PartialEq, Clone, Copy, sky_macros::EnumMethods)] #[derive(Debug, PartialEq, Clone, Copy, sky_macros::EnumMethods, sky_macros::TaggedEnum)]
#[repr(u8)] #[repr(u8)]
pub(super) enum DriverEventKind { pub(super) enum DriverEventKind {
Reopened = 0, Reopened = 0,

@ -24,12 +24,9 @@
* *
*/ */
use { use crate::engine::storage::common::{
crate::engine::storage::common::{ sdss::{self, sdss_r1::HeaderV1},
sdss::{self, sdss_r1::HeaderV1}, versions::{self, DriverVersion, FileSpecifierVersion, ServerVersion},
versions::{self, DriverVersion, FileSpecifierVersion, ServerVersion},
},
std::mem::transmute,
}; };
#[allow(unused)] #[allow(unused)]
@ -37,39 +34,39 @@ pub type Header = HeaderV1<HeaderImplV2>;
/// The file scope /// The file scope
#[repr(u8)] #[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,
)]
pub enum FileClass { pub enum FileClass {
EventLog = 0, EventLog = 0,
Batch = 1, Batch = 1,
} }
#[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)] #[repr(u8)]
pub enum FileSpecifier { pub enum FileSpecifier {
GlobalNS = 0, GlobalNS = 0,
ModelData = 1, ModelData = 1,
} }
impl sdss::sdss_r1::HeaderV1Enumeration for FileClass {
const MAX: u8 = FileClass::MAX;
unsafe fn new(x: u8) -> Self {
transmute(x)
}
fn repr_u8(&self) -> u8 {
self.value_u8()
}
}
impl sdss::sdss_r1::HeaderV1Enumeration for FileSpecifier {
const MAX: u8 = FileSpecifier::MAX;
unsafe fn new(x: u8) -> Self {
transmute(x)
}
fn repr_u8(&self) -> u8 {
self.value_u8()
}
}
#[derive(Debug)] #[derive(Debug)]
pub struct HeaderImplV2; pub struct HeaderImplV2;
impl sdss::sdss_r1::HeaderV1Spec for HeaderImplV2 { impl sdss::sdss_r1::HeaderV1Spec for HeaderImplV2 {

Loading…
Cancel
Save