1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
//! A procedural macro for creating compile-time ring buffers (circular buffers).
//!
//! ## Usage
//!
//! ### Standard Mode (default)
//!
//! ```ignore
//! use ring_buffer_macro::ring_buffer;
//!
//! #[ring_buffer(5)]
//! struct IntBuffer(i32);
//!
//! let mut buf = IntBuffer::new();
//! buf.enqueue(1).unwrap();
//! buf.enqueue(2).unwrap();
//! assert_eq!(buf.dequeue(), Some(1));
//! ```
//!
//! ### SPSC Mode (lock-free, thread-safe)
//!
//! ```ignore
//! use ring_buffer_macro::ring_buffer;
//! use std::thread;
//!
//! #[ring_buffer(capacity = 1024, mode = "spsc")]
//! struct SpscBuffer(i32);
//!
//! let buffer = SpscBuffer::new();
//! let (producer, consumer) = buffer.split();
//!
//! // Producer and consumer can be sent to different threads
//! ```
//!
//! ### MPSC Mode (multi-producer, single-consumer)
//!
//! ```ignore
//! use ring_buffer_macro::ring_buffer;
//!
//! #[ring_buffer(capacity = 1024, mode = "mpsc")]
//! struct MpscBuffer(i32);
//!
//! let buffer = MpscBuffer::new();
//! let producer1 = buffer.producer();
//! let producer2 = buffer.producer(); // Can clone for more producers
//! let consumer = buffer.consumer();
//! ```
//!
//! ### Blocking Mode
//!
//! ```ignore
//! #[ring_buffer(capacity = 1024, mode = "mpsc", blocking = true)]
//! struct BlockingQueue(Message);
//!
//! // Use enqueue_blocking() and dequeue_blocking() for blocking operations
//! ```
//!
//! ## Generated Methods
//!
//! ### Standard Mode
//! - `new()` - Create empty buffer
//! - `enqueue(item: T) -> Result<(), T>` - Add item (returns `Err(item)` if full)
//! - `dequeue() -> Option<T>` - Remove oldest item (requires `T: Clone`)
//! - `is_full()`, `is_empty()`, `len()`, `capacity()`, `clear()`
//!
//! ### SPSC Mode
//! - `new()` - Create empty buffer
//! - `split()` - Get producer and consumer handles
//! - `is_full()`, `is_empty()`, `len()`, `capacity()`
//! - Producer: `try_enqueue(item: T) -> Result<(), T>`
//! - Consumer: `try_dequeue() -> Option<T>`
//!
//! ### MPSC Mode
//! - `new()` - Create empty buffer
//! - `producer()` - Get clonable producer handle
//! - `consumer()` - Get consumer handle
//! - Producer: `try_enqueue(item: T) -> Result<(), T>`, `enqueue_blocking(item: T)` (if blocking)
//! - Consumer: `try_dequeue() -> Option<T>`, `dequeue_blocking() -> T` (if blocking)
//!
//! ## Requirements
//!
//! - Tuple struct with one element type, e.g., `struct Buffer(i32);`
//! - Standard mode: Element type `T` must implement `Clone`
//! - SPSC/MPSC modes: Element type `T` must implement `Send`
use TokenStream;
use quote;
use ;
use Result;
use ;
use ;
/// Transforms a tuple struct into a fixed-size FIFO ring buffer.
///
/// # Example
///
/// ```ignore
/// #[ring_buffer(10)]
/// struct MyBuffer(String);
/// ```
///
/// Generates a struct with fields: `data`, `capacity`, `head`, `tail`, `size`
///
/// Generates methods: `new()`, `enqueue()`, `dequeue()`, `is_full()`, `is_empty()`,
/// `len()`, `capacity()`, `clear()`