1#[cfg(not(test))]
4#[allow(unused)]
5pub(crate) use std::panic::catch_unwind as handle_panic;
6
7#[cfg(test)]
8#[inline]
9#[allow(unused)]
10pub(crate) fn handle_panic<F: FnOnce() -> R, R>(f: F) -> std::thread::Result<R> {
11 Ok(f())
12}
13
14mod fixed_point;
15mod id;
16mod timestamp;
17mod universal_plugin_id;
18mod version;
19
20pub use fixed_point::*;
21pub use id::ClapId;
22pub use timestamp::Timestamp;
23pub use universal_plugin_id::{UniversalPluginAbi, UniversalPluginId};
24pub use version::ClapVersion;
25
26pub type Color = clap_color;
28
29pub const TRANSPARENT_COLOR: Color = Color {
31 alpha: 0,
32 red: 0,
33 green: 0,
34 blue: 0,
35};
36
37use clap_sys::color::clap_color;
38use std::ffi::c_void;
39
40#[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)]
42pub struct Cookie(*mut c_void);
43
44impl Cookie {
45 #[inline]
47 pub const fn empty() -> Self {
48 Self(core::ptr::null_mut())
49 }
50
51 #[inline]
53 pub const fn from_raw(ptr: *mut c_void) -> Self {
54 Self(ptr)
55 }
56
57 #[inline]
59 pub const fn as_raw(&self) -> *mut c_void {
60 self.0
61 }
62}
63
64impl Default for Cookie {
68 #[inline]
69 fn default() -> Self {
70 Self::empty()
71 }
72}
73
74unsafe impl Send for Cookie {}
76unsafe impl Sync for Cookie {}
78
79#[inline]
92pub(crate) const unsafe fn slice_from_external_parts<'a, T>(data: *const T, len: usize) -> &'a [T] {
93 if len == 0 {
94 return &[];
95 }
96
97 core::slice::from_raw_parts(data, len)
98}
99
100#[inline]
107pub(crate) const unsafe fn slice_from_external_parts_mut<'a, T>(
108 data: *mut T,
109 len: usize,
110) -> &'a mut [T] {
111 if len == 0 {
112 return &mut [];
113 }
114
115 core::slice::from_raw_parts_mut(data, len)
116}
117
118#[inline]
119pub(crate) const fn check_clap_size_overflow(value: usize) {
120 #[cold]
121 #[inline(never)]
122 const fn too_big() -> ! {
123 panic!("CLAP size (u32) overflowed")
124 }
125
126 if value > u32::MAX as usize {
127 too_big()
128 }
129}
130
131#[inline]
132pub(crate) const fn usize_to_clap_size(value: usize) -> u32 {
133 check_clap_size_overflow(value);
134
135 #[allow(clippy::cast_possible_truncation)] {
137 value as u32
138 }
139}