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}