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
//! `static` friendly data structures that don't require dynamic memory //! allocation //! //! # Examples //! //! ## `Vec` //! //! ``` //! use heapless::Vec; //! //! let mut xs: Vec<u8, [u8; 4]> = Vec::new(); //! //! assert!(xs.push(0).is_ok()); //! assert!(xs.push(1).is_ok()); //! assert!(xs.push(2).is_ok()); //! assert!(xs.push(3).is_ok()); //! assert!(xs.push(4).is_err()); // full //! //! assert_eq!(xs.pop(), Some(3)); //! ``` //! //! ## `RingBuffer` //! //! ``` //! use heapless::RingBuffer; //! //! let mut rb: RingBuffer<u8, [u8; 4]> = RingBuffer::new(); //! //! assert!(rb.enqueue(0).is_ok()); //! assert!(rb.enqueue(1).is_ok()); //! assert!(rb.enqueue(2).is_ok()); //! assert!(rb.enqueue(3).is_err()); // full //! //! assert_eq!(rb.dequeue(), Some(0)); //! ``` //! //! ### Single producer single consumer mode //! //! ``` //! use heapless::RingBuffer; //! //! static mut RB: RingBuffer<Event, [Event; 4]> = RingBuffer::new(); //! //! enum Event { A, B } //! //! fn main() { //! // NOTE(unsafe) beware of aliasing the `consumer` end point //! let mut consumer = unsafe { RB.split().1 }; //! //! loop { //! // `dequeue` is a lockless operation //! match consumer.dequeue() { //! Some(Event::A) => { /* .. */ }, //! Some(Event::B) => { /* .. */ }, //! None => { /* sleep */}, //! } //! # break //! } //! } //! //! // this is a different execution context that can preempt `main` //! fn interrupt_handler() { //! // NOTE(unsafe) beware of aliasing the `producer` end point //! let mut producer = unsafe { RB.split().0 }; //! # let condition = true; //! //! // .. //! //! if condition { //! producer.enqueue(Event::A).unwrap(); //! } else { //! producer.enqueue(Event::B).unwrap(); //! } //! //! // .. //! } //! ``` #![deny(missing_docs)] #![feature(const_fn)] #![feature(const_unsafe_cell_new)] #![feature(core_intrinsics)] #![feature(shared)] #![feature(unsize)] #![no_std] extern crate untagged_option; pub use vec::Vec; pub use ring_buffer::RingBuffer; mod cfail; mod vec; pub mod ring_buffer; /// Error raised when the buffer is full #[derive(Clone, Copy, Debug, Eq, PartialEq)] pub struct BufferFullError;