Initial project import
This commit is contained in:
commit
23f2d29e32
11957 files changed
+1754577
No files matched your search
@@ -0,0 +1,111 @@
|
||||
module sync
|
||||
|
||||
// ThreadLocalStorage provides thread-local storage for values of type T
|
||||
@[noinit]
|
||||
struct ThreadLocalStorage[T] {
|
||||
mut:
|
||||
key u64 // TLS key identifier. Note: While Linux uses unsigned int, Darwin requires unsigned long. u64 accommodates both.
|
||||
in_use bool // Allocation status flag
|
||||
}
|
||||
|
||||
// DataConversion convert voidptr to/from type T
|
||||
union DataConversion {
|
||||
mut:
|
||||
f_u8 u8
|
||||
f_u16 u16
|
||||
f_u32 u32
|
||||
f_u64 u64
|
||||
|
||||
f_i8 i8
|
||||
f_i16 i16
|
||||
f_i32 i32
|
||||
f_i64 i64
|
||||
|
||||
f_voidptr voidptr
|
||||
f_isize isize
|
||||
f_usize usize
|
||||
f_int int
|
||||
f_f32 f32
|
||||
f_f64 f64
|
||||
f_rune rune
|
||||
}
|
||||
|
||||
// convert_t_to_voidptr convert value from type T to voidptr
|
||||
@[inline]
|
||||
fn convert_t_to_voidptr[T](value T) !voidptr {
|
||||
mut f := DataConversion{}
|
||||
$if T is i8 {
|
||||
f.f_i8 = value
|
||||
} $else $if T is i16 {
|
||||
f.f_i16 = value
|
||||
} $else $if T is i32 {
|
||||
f.f_i32 = value
|
||||
} $else $if T is i64 {
|
||||
f.f_i64 = value
|
||||
} $else $if T is u8 {
|
||||
f.f_u8 = value
|
||||
} $else $if T is u16 {
|
||||
f.f_u16 = value
|
||||
} $else $if T is u32 {
|
||||
f.f_u32 = value
|
||||
} $else $if T is u64 {
|
||||
f.f_u64 = value
|
||||
} $else $if T is $pointer {
|
||||
f.f_voidptr = voidptr(value)
|
||||
} $else $if T is isize {
|
||||
f.f_isize = value
|
||||
} $else $if T is usize {
|
||||
f.f_usize = value
|
||||
} $else $if T is int {
|
||||
f.f_int = value
|
||||
} $else $if T is f32 {
|
||||
f.f_f32 = value
|
||||
} $else $if T is f64 {
|
||||
f.f_f64 = value
|
||||
} $else $if T is rune {
|
||||
f.f_rune = value
|
||||
} $else {
|
||||
return error('Unsupported data type `${T.name}` to voidptr')
|
||||
}
|
||||
return unsafe { f.f_voidptr }
|
||||
}
|
||||
|
||||
// convert_voidptr_to_t convert value from voidptr to type T
|
||||
@[inline]
|
||||
fn convert_voidptr_to_t[T](value voidptr) !T {
|
||||
f := DataConversion{
|
||||
f_voidptr: value
|
||||
}
|
||||
$if T is i8 {
|
||||
return unsafe { f.f_i8 }
|
||||
} $else $if T is i16 {
|
||||
return unsafe { f.f_i16 }
|
||||
} $else $if T is i32 {
|
||||
return unsafe { f.f_i32 }
|
||||
} $else $if T is i64 {
|
||||
return unsafe { f.f_i64 }
|
||||
} $else $if T is u8 {
|
||||
return unsafe { f.f_u8 }
|
||||
} $else $if T is u16 {
|
||||
return unsafe { f.f_u16 }
|
||||
} $else $if T is u32 {
|
||||
return unsafe { f.f_u32 }
|
||||
} $else $if T is u64 {
|
||||
return unsafe { f.f_u64 }
|
||||
} $else $if T is $pointer {
|
||||
return unsafe { f.f_voidptr }
|
||||
} $else $if T is isize {
|
||||
return unsafe { f.f_isize }
|
||||
} $else $if T is usize {
|
||||
return unsafe { f.f_usize }
|
||||
} $else $if T is int {
|
||||
return unsafe { f.f_int }
|
||||
} $else $if T is f32 {
|
||||
return unsafe { f.f_f32 }
|
||||
} $else $if T is f64 {
|
||||
return unsafe { f.f_f64 }
|
||||
} $else $if T is rune {
|
||||
return unsafe { f.f_rune }
|
||||
}
|
||||
return error('Unsupported data type `${T.name}` from voidptr')
|
||||
}
|
||||
Reference in new issue
Block a user