Skip to main content

micromegas_tracing/
string_id.rs

1//! StringId serializes the value of the pointer and the size of a UTF8 string.
2//! StaticStringRef should be prefered where wire compatibility with unreal is important.
3use std::sync::Arc;
4
5use micromegas_transit::{
6    InProcSerialize, Member, Reflect, UserDefinedType, Utf8StaticStringDependency,
7};
8
9#[derive(Debug)]
10pub struct StringId {
11    pub ptr: *const u8,
12    pub len: u32,
13}
14
15impl std::convert::From<&'static str> for StringId {
16    fn from(src: &'static str) -> Self {
17        Self {
18            len: src.len() as u32,
19            ptr: src.as_ptr(),
20        }
21    }
22}
23
24impl std::convert::From<&StringId> for Utf8StaticStringDependency {
25    fn from(src: &StringId) -> Self {
26        Self {
27            len: src.len,
28            ptr: src.ptr,
29        }
30    }
31}
32
33// TransitReflect derive macro does not support reference udts, only reference members
34impl Reflect for StringId {
35    fn reflect() -> UserDefinedType {
36        lazy_static::lazy_static! {
37            static ref TYPE_NAME: Arc<String> = Arc::new("StringId".into());
38            static ref ID: Arc<String> = Arc::new("id".into());
39        }
40        UserDefinedType {
41            name: TYPE_NAME.clone(),
42            size: std::mem::size_of::<Self>(),
43            members: vec![Member {
44                name: ID.clone(), // reference udt need a member named id that's 8 bytes
45                type_name: "usize".to_string(),
46                offset: memoffset::offset_of!(Self, ptr),
47                size: std::mem::size_of::<*const u8>(),
48                is_reference: true,
49            }],
50            is_reference: true,
51            secondary_udts: vec![],
52        }
53    }
54}
55
56impl InProcSerialize for StringId {}
57
58impl StringId {
59    pub fn id(&self) -> u64 {
60        self.ptr as u64
61    }
62}
63
64/// Names a string record in the dynamic dependency queue of the block that holds the event.
65#[derive(Debug)]
66pub struct DynStringId {
67    pub id: u64,
68}
69
70// TransitReflect derive macro does not support reference udts, only reference members
71impl Reflect for DynStringId {
72    fn reflect() -> UserDefinedType {
73        lazy_static::lazy_static! {
74            static ref TYPE_NAME: Arc<String> = Arc::new("DynStringId".into());
75            static ref ID: Arc<String> = Arc::new("id".into());
76        }
77        UserDefinedType {
78            name: TYPE_NAME.clone(),
79            size: std::mem::size_of::<Self>(),
80            members: vec![Member {
81                name: ID.clone(),
82                type_name: "u64".to_string(),
83                offset: memoffset::offset_of!(Self, id),
84                size: std::mem::size_of::<u64>(),
85                is_reference: true,
86            }],
87            is_reference: true,
88            secondary_udts: vec![],
89        }
90    }
91}
92
93impl InProcSerialize for DynStringId {}