hurry/lib.rs
1/// Macro for creating a `Box<T>` from a value
2///
3/// # Example
4/// ```
5/// use hurry::boxx;
6/// let x = boxx!(5);
7/// assert_eq!(*x, 5);
8/// ```
9#[macro_export]
10macro_rules! boxx {
11 ($val:expr) => {
12 Box::new($val)
13 };
14}
15
16/// Macro for creating an `Rc<T>` from a value
17///
18/// # Example
19/// ```
20/// use hurry::rc;
21/// let x = rc!(5);
22/// assert_eq!(*x, 5);
23/// ```
24#[macro_export]
25macro_rules! rc {
26 ($val:expr) => {
27 std::rc::Rc::new($val)
28 };
29}
30
31/// Macro for creating an `Arc<T>` from a value
32///
33/// # Example
34/// ```
35/// use hurry::arc;
36/// let x = arc!(5);
37/// assert_eq!(*x, 5);
38/// ```
39#[macro_export]
40macro_rules! arc {
41 ($val:expr) => {
42 std::sync::Arc::new($val)
43 };
44}
45
46/// Macro for creating a `Rc<RefCell<T>>` from a value
47///
48/// # Example
49/// ```
50/// use hurry::rc_refcell;
51/// let x = rc_refcell!(5);
52/// *x.borrow_mut() = 10;
53/// assert_eq!(*x.borrow(), 10);
54/// ```
55#[macro_export]
56macro_rules! rc_refcell {
57 ($val:expr) => {
58 std::rc::Rc::new(std::cell::RefCell::new($val))
59 };
60}
61
62/// Macro for creating an `Arc<Mutex<T>>` from a value
63///
64/// # Example
65/// ```
66/// use hurry::arc_mutex;
67/// let x = arc_mutex!(5);
68/// *x.lock().unwrap() = 10;
69/// assert_eq!(*x.lock().unwrap(), 10);
70/// ```
71#[macro_export]
72macro_rules! arc_mutex {
73 ($val:expr) => {
74 std::sync::Arc::new(std::sync::Mutex::new($val))
75 };
76}
77
78/// Macro for creating an `Arc<RwLock<T>>` from a value
79///
80/// # Example
81/// ```
82/// use hurry::arc_rwlock;
83/// let x = arc_rwlock!(5);
84/// *x.write().unwrap() = 10;
85/// assert_eq!(*x.read().unwrap(), 10);
86/// ```
87#[macro_export]
88macro_rules! arc_rwlock {
89 ($val:expr) => {
90 std::sync::Arc::new(std::sync::RwLock::new($val))
91 };
92}
93
94/// Macro for creating a `Mutex<T>` from a value
95///
96/// # Example
97/// ```
98/// use hurry::mutex;
99/// let x = mutex!(5);
100/// *x.lock().unwrap() = 10;
101/// assert_eq!(*x.lock().unwrap(), 10);
102/// ```
103#[macro_export]
104macro_rules! mutex {
105 ($val:expr) => {
106 std::sync::Mutex::new($val)
107 };
108}
109
110/// Macro for creating a `RwLock<T>` from a value
111///
112/// # Example
113/// ```
114/// use hurry::rwlock;
115/// let x = rwlock!(5);
116/// *x.write().unwrap() = 10;
117/// assert_eq!(*x.read().unwrap(), 10);
118/// ```
119#[macro_export]
120macro_rules! rwlock {
121 ($val:expr) => {
122 std::sync::RwLock::new($val)
123 };
124}
125
126/// Macro for creating a `Cell<T>` from a value
127///
128/// # Example
129/// ```
130/// use hurry::cell;
131/// let x = cell!(5);
132/// x.set(10);
133/// assert_eq!(x.get(), 10);
134/// ```
135#[macro_export]
136macro_rules! cell {
137 ($val:expr) => {
138 std::cell::Cell::new($val)
139 };
140}
141
142/// Macro for creating a `RefCell<T>` from a value
143///
144/// # Example
145/// ```
146/// use hurry::refcell;
147/// let x = refcell!(5);
148/// *x.borrow_mut() = 10;
149/// assert_eq!(*x.borrow(), 10);
150/// ```
151#[macro_export]
152macro_rules! refcell {
153 ($val:expr) => {
154 std::cell::RefCell::new($val)
155 };
156}
157
158/// Macro for creating a `Pin<Box<T>>` from a value
159///
160/// # Example
161/// ```
162/// use hurry::pin_box;
163/// let x = pin_box!(5);
164/// assert_eq!(*x, 5);
165/// ```
166#[macro_export]
167macro_rules! pin_box {
168 ($val:expr) => {
169 Box::pin($val)
170 };
171}
172
173/// Macro for creating a `Vec<Box<T>>` from multiple values
174///
175/// # Example
176/// ```
177/// use hurry::vec_box;
178/// let v = vec_box![1, 2, 3];
179/// assert_eq!(*v[0], 1);
180/// assert_eq!(*v[1], 2);
181/// assert_eq!(*v[2], 3);
182/// ```
183#[macro_export]
184macro_rules! vec_box {
185 ($($val:expr),* $(,)?) => {
186 vec![$(Box::new($val)),*]
187 };
188}
189
190/// Macro for creating a `Vec<Rc<T>>` from multiple values
191///
192/// # Example
193/// ```
194/// use hurry::vec_rc;
195/// let v = vec_rc![1, 2, 3];
196/// assert_eq!(*v[0], 1);
197/// assert_eq!(*v[1], 2);
198/// assert_eq!(*v[2], 3);
199/// ```
200#[macro_export]
201macro_rules! vec_rc {
202 ($($val:expr),* $(,)?) => {
203 vec![$(std::rc::Rc::new($val)),*]
204 };
205}
206
207/// Macro for creating a `Vec<Arc<T>>` from multiple values
208///
209/// # Example
210/// ```
211/// use hurry::vec_arc;
212/// let v = vec_arc![1, 2, 3];
213/// assert_eq!(*v[0], 1);
214/// assert_eq!(*v[1], 2);
215/// assert_eq!(*v[2], 3);
216/// ```
217#[macro_export]
218macro_rules! vec_arc {
219 ($($val:expr),* $(,)?) => {
220 vec![$(std::sync::Arc::new($val)),*]
221 };
222}
223
224/// Macro for creating an owned `Cow<T>` from a value
225///
226/// # Example
227/// ```
228/// use hurry::cow_owned;
229/// let x: std::borrow::Cow<'_, str> = cow_owned!("hello".to_string());
230/// assert_eq!(&*x, "hello");
231/// ```
232#[macro_export]
233macro_rules! cow_owned {
234 ($val:expr) => {
235 std::borrow::Cow::Owned($val)
236 };
237}
238
239/// Macro for creating a borrowed `Cow<T>` from a reference
240///
241/// # Example
242/// ```
243/// use hurry::cow_borrowed;
244/// let x = cow_borrowed!("hello");
245/// assert_eq!(&*x, "hello");
246/// ```
247#[macro_export]
248macro_rules! cow_borrowed {
249 ($val:expr) => {
250 std::borrow::Cow::Borrowed($val)
251 };
252}
253
254#[cfg(test)]
255mod tests {
256 #[test]
257 fn test_boxx_macro() {
258 let x = boxx!(42);
259 assert_eq!(*x, 42);
260 }
261
262 #[test]
263 fn test_rc_macro() {
264 let x = rc!(42);
265 let y = x.clone();
266 assert_eq!(*x, 42);
267 assert_eq!(*y, 42);
268 }
269
270 #[test]
271 fn test_arc_macro() {
272 let x = arc!(42);
273 let y = x.clone();
274 assert_eq!(*x, 42);
275 assert_eq!(*y, 42);
276 }
277
278 #[test]
279 fn test_rc_refcell_macro() {
280 let x = rc_refcell!(42);
281 *x.borrow_mut() = 100;
282 assert_eq!(*x.borrow(), 100);
283 }
284
285 #[test]
286 fn test_arc_mutex_macro() {
287 let x = arc_mutex!(42);
288 *x.lock().unwrap() = 100;
289 assert_eq!(*x.lock().unwrap(), 100);
290 }
291
292 #[test]
293 fn test_arc_rwlock_macro() {
294 let x = arc_rwlock!(42);
295 *x.write().unwrap() = 100;
296 assert_eq!(*x.read().unwrap(), 100);
297 }
298
299 #[test]
300 fn test_mutex_macro() {
301 let x = mutex!(42);
302 *x.lock().unwrap() = 100;
303 assert_eq!(*x.lock().unwrap(), 100);
304 }
305
306 #[test]
307 fn test_rwlock_macro() {
308 let x = rwlock!(42);
309 *x.write().unwrap() = 100;
310 assert_eq!(*x.read().unwrap(), 100);
311 }
312
313 #[test]
314 fn test_cell_macro() {
315 let x = cell!(42);
316 x.set(100);
317 assert_eq!(x.get(), 100);
318 }
319
320 #[test]
321 fn test_refcell_macro() {
322 let x = refcell!(42);
323 *x.borrow_mut() = 100;
324 assert_eq!(*x.borrow(), 100);
325 }
326
327 #[test]
328 fn test_pin_box_macro() {
329 let x = pin_box!(42);
330 assert_eq!(*x, 42);
331 }
332
333 #[test]
334 fn test_vec_box_macro() {
335 let v = vec_box![1, 2, 3];
336 assert_eq!(*v[0], 1);
337 assert_eq!(*v[1], 2);
338 assert_eq!(*v[2], 3);
339 }
340
341 #[test]
342 fn test_vec_rc_macro() {
343 let v = vec_rc![1, 2, 3];
344 assert_eq!(*v[0], 1);
345 assert_eq!(*v[1], 2);
346 assert_eq!(*v[2], 3);
347 }
348
349 #[test]
350 fn test_vec_arc_macro() {
351 let v = vec_arc![1, 2, 3];
352 assert_eq!(*v[0], 1);
353 assert_eq!(*v[1], 2);
354 assert_eq!(*v[2], 3);
355 }
356
357 #[test]
358 fn test_cow_owned_macro() {
359 let x: std::borrow::Cow<'_, str> = cow_owned!("hello".to_string());
360 assert_eq!(&*x, "hello");
361 }
362
363 #[test]
364 fn test_cow_borrowed_macro() {
365 let x = cow_borrowed!("hello");
366 assert_eq!(&*x, "hello");
367 }
368}