1pub mod iter;
29
30use crate::iter::{IntoIter, Iter, IterMut};
31
32use std::mem;
33
34#[derive(Debug, Clone)]
36pub struct Lobby<T, const N: usize> {
37 arr: [Option<T>; N],
38
39 head: usize,
40 tail: usize,
41
42 len: usize,
43}
44
45impl<T, const N: usize> Lobby<T, N> {
46 #[inline]
60 pub const fn new(arr: [Option<T>; N]) -> Self {
61 Self {
62 arr,
63 head: 0,
64 tail: 0,
65 len: 0,
66 }
67 }
68
69 #[inline]
84 pub const fn first(&self) -> Option<&T> {
85 self.arr[self.head].as_ref()
86 }
87
88 #[inline]
90 pub fn first_mut(&mut self) -> Option<&mut T> {
91 self.arr[self.head].as_mut()
92 }
93
94 #[inline]
109 pub const fn last(&self) -> Option<&T> {
110 self.arr[self.tail].as_ref()
111 }
112
113 #[inline]
115 pub fn last_mut(&mut self) -> Option<&mut T> {
116 self.arr[self.tail].as_mut()
117 }
118
119 #[inline]
147 pub const fn nth(&self, n: usize) -> Option<&T> {
148 let idx = if n >= N {
149 N
150 } else {
151 Self::mod_incr(self.head, n)
152 };
153
154 self.arr[idx].as_ref()
155 }
156
157 #[inline]
177 pub fn nth_mut(&mut self, n: usize) -> Option<&mut T> {
178 let idx = if n >= N {
179 N
180 } else {
181 Self::mod_incr(self.head, n)
182 };
183
184 self.arr[idx].as_mut()
185 }
186
187 #[inline]
207 pub fn push(&mut self, v: T) -> Option<T> {
208 if self.arr[self.tail].is_some() {
209 self.tail = Self::mod_incr(self.tail, 1);
211 }
212
213 let mut v = Some(v);
215 mem::swap(&mut v, &mut self.arr[self.tail]);
216
217 if v.is_some() {
219 self.head = Self::mod_incr(self.head, 1);
220 } else {
221 self.len += 1;
222 }
223
224 v
225 }
226
227 #[inline]
243 pub fn shift(&mut self) -> Option<T> {
244 let mut v = None;
245 mem::swap(&mut v, &mut self.arr[self.head]);
246
247 let next = Self::mod_incr(self.head, 1);
248 if self.arr[next].is_some() {
249 self.head = next;
250 }
251
252 if v.is_some() {
253 self.len -= 1;
254 }
255
256 v
257 }
258
259 #[inline]
275 pub fn pop(&mut self) -> Option<T> {
276 let mut v = None;
277 mem::swap(&mut v, &mut self.arr[self.tail]);
278
279 let prev = Self::mod_decr(self.tail, 1);
280 if self.arr[prev].is_some() {
281 self.tail = prev;
282 }
283
284 if v.is_some() {
285 self.len -= 1;
286 }
287
288 v
289 }
290
291 #[inline]
306 pub const fn is_empty(&self) -> bool {
307 self.len == 0
308 }
309
310 #[inline]
328 pub const fn is_full(&self) -> bool {
329 Self::mod_incr(self.tail, 1) == self.head
330 }
331
332 #[inline]
334 pub const fn len(&self) -> usize {
335 self.len
336 }
337
338 #[inline]
340 pub const fn capacity(&self) -> usize {
341 N
342 }
343
344 #[inline]
345 const fn mod_incr(counter: usize, d: usize) -> usize {
346 (counter + d) % N
347 }
348
349 #[inline]
350 const fn mod_decr(counter: usize, d: usize) -> usize {
351 let d = d % N;
352 if counter >= d {
353 counter - d
354 } else {
355 counter + N - d
356 }
357 }
358}
359
360impl<T, const N: usize> PartialEq<Lobby<T, N>> for Lobby<T, N>
361where
362 T: PartialEq,
363{
364 #[inline]
365 fn eq(&self, other: &Lobby<T, N>) -> bool {
366 self.iter().eq(other.iter())
367 }
368}
369
370impl<T, const N: usize> PartialEq<[Option<T>; N]> for Lobby<T, N>
371where
372 T: PartialEq,
373{
374 #[inline]
375 fn eq(&self, other: &[Option<T>; N]) -> bool {
376 self.iter().with_full().eq(other.iter().map(|v| v.as_ref()))
377 }
378}
379
380impl<T, const N: usize> Lobby<T, N> {
381 #[inline]
383 pub fn iter(&self) -> Iter<'_, T, N> {
384 Iter::new(self)
385 }
386
387 #[inline]
389 pub fn iter_mut(&mut self) -> IterMut<'_, T, N> {
390 IterMut::new(self)
391 }
392}
393
394impl<T, const N: usize> IntoIterator for Lobby<T, N> {
395 type Item = T;
396 type IntoIter = IntoIter<T, N>;
397
398 #[inline]
399 fn into_iter(self) -> IntoIter<T, N> {
400 IntoIter::new(self)
401 }
402}
403
404#[cfg(test)]
405mod test {
406 use super::*;
407
408 #[test]
409 fn test_push() {
410 let mut x = Lobby::new([None, None, None]);
411
412 x.push(0);
413 assert_eq!([Some(0), None, None], x.arr);
414 assert_eq!((0, 0), (x.head, x.tail));
415 assert_eq!(1, x.len());
416
417 x.push(1);
418 assert_eq!([Some(0), Some(1), None], x.arr);
419 assert_eq!((0, 1), (x.head, x.tail));
420 assert_eq!(2, x.len());
421
422 x.push(2);
423 assert_eq!([Some(0), Some(1), Some(2)], x.arr);
424 assert_eq!((0, 2), (x.head, x.tail));
425 assert_eq!(3, x.len());
426
427 let v0 = x.push(3);
428 assert_eq!(Some(0), v0);
429 assert_eq!([Some(3), Some(1), Some(2)], x.arr);
430 assert_eq!((1, 0), (x.head, x.tail));
431 assert_eq!(3, x.len());
432
433 let v1 = x.push(4);
434 assert_eq!(Some(1), v1);
435 assert_eq!([Some(3), Some(4), Some(2)], x.arr);
436 assert_eq!((2, 1), (x.head, x.tail));
437 assert_eq!(3, x.len());
438 }
439
440 #[test]
441 fn test_shift() {
442 let mut x = Lobby::new([None, None, None]);
443 x.push(0);
444 x.push(1);
445 x.push(2);
446
447 assert_eq!([Some(0), Some(1), Some(2)], x.arr);
448 assert_eq!((0, 2), (x.head, x.tail));
449 assert_eq!(3, x.len());
450
451 let v0 = x.shift();
452 assert_eq!(Some(0), v0);
453 assert_eq!([None, Some(1), Some(2)], x.arr);
454 assert_eq!((1, 2), (x.head, x.tail));
455 assert_eq!(2, x.len());
456
457 let v1 = x.shift();
458 assert_eq!(Some(1), v1);
459 assert_eq!([None, None, Some(2)], x.arr);
460 assert_eq!((2, 2), (x.head, x.tail));
461 assert_eq!(1, x.len());
462
463 let v2 = x.shift();
464 assert_eq!(Some(2), v2);
465 assert_eq!([None, None, None], x.arr);
466 assert_eq!((2, 2), (x.head, x.tail));
467 assert_eq!(0, x.len());
468
469 let ve = x.shift();
470 assert_eq!(None, ve);
471 assert_eq!([None, None, None], x.arr);
472 assert_eq!((2, 2), (x.head, x.tail));
473 assert_eq!(0, x.len());
474 }
475
476 #[test]
477 fn test_pop() {
478 let mut x = Lobby::new([None, None, None]);
479 x.push(0);
480 x.push(1);
481 x.push(2);
482
483 assert_eq!([Some(0), Some(1), Some(2)], x.arr);
484 assert_eq!((0, 2), (x.head, x.tail));
485 assert_eq!(3, x.len());
486
487 let v2 = x.pop();
488 assert_eq!(Some(2), v2);
489 assert_eq!([Some(0), Some(1), None], x.arr);
490 assert_eq!((0, 1), (x.head, x.tail));
491 assert_eq!(2, x.len());
492
493 let v1 = x.pop();
494 assert_eq!(Some(1), v1);
495 assert_eq!([Some(0), None, None], x.arr);
496 assert_eq!((0, 0), (x.head, x.tail));
497 assert_eq!(1, x.len());
498
499 let v0 = x.pop();
500 assert_eq!(Some(0), v0);
501 assert_eq!([None, None, None], x.arr);
502 assert_eq!((0, 0), (x.head, x.tail));
503 assert_eq!(0, x.len());
504
505 let ve = x.pop();
506 assert_eq!(None, ve);
507 assert_eq!([None, None, None], x.arr);
508 assert_eq!((0, 0), (x.head, x.tail));
509 assert_eq!(0, x.len());
510 }
511
512 #[test]
513 fn test_is_empty() {
514 let mut x = Lobby::new([None, None, None]);
515 assert!(x.is_empty());
516
517 x.push(0);
519 assert!(!x.is_empty());
520
521 x.push(1);
523 assert!(!x.is_empty());
524
525 x.push(2);
527 assert!(!x.is_empty());
528
529 x.push(3);
531 assert!(!x.is_empty());
532
533 x.shift();
535 assert!(!x.is_empty());
536
537 x.shift();
539 assert!(!x.is_empty());
540
541 x.shift();
543 assert!(x.is_empty());
544 }
545
546 #[test]
547 fn test_is_full() {
548 let mut x = Lobby::new([None, None, None]);
549 assert!(!x.is_full());
550
551 x.push(0);
553 assert!(!x.is_full());
554
555 x.push(1);
557 assert!(!x.is_full());
558
559 x.push(2);
561 assert!(x.is_full());
562
563 x.push(3);
565 assert!(x.is_full());
566
567 x.shift();
569 assert!(!x.is_full());
570
571 x.shift();
573 assert!(!x.is_full());
574
575 x.shift();
577 assert!(!x.is_full());
578 }
579
580 #[test]
581 fn test_increase_counter() {
582 type L = Lobby<usize, 4>;
583
584 let x = 0;
585 assert_eq!(1, L::mod_incr(x, 1));
586 assert_eq!(2, L::mod_incr(x, 2));
587 assert_eq!(3, L::mod_incr(x, 3));
588 assert_eq!(0, L::mod_incr(x, 4));
589 assert_eq!(1, L::mod_incr(x, 5));
590 assert_eq!(0, L::mod_incr(x, 8));
591 assert_eq!(1, L::mod_incr(x, 9));
592 }
593
594 #[test]
595 fn test_decrease_counter() {
596 type L = Lobby<usize, 4>;
597
598 let x = 2;
599 assert_eq!(1, L::mod_decr(x, 1));
600 assert_eq!(0, L::mod_decr(x, 2));
601 assert_eq!(3, L::mod_decr(x, 3));
602 assert_eq!(2, L::mod_decr(x, 4));
603 assert_eq!(1, L::mod_decr(x, 5));
604 assert_eq!(0, L::mod_decr(x, 6));
605 assert_eq!(2, L::mod_decr(x, 8));
606 assert_eq!(1, L::mod_decr(x, 9));
607 }
608
609 #[test]
610 fn test_partial_eq() {
611 let mut x = Lobby::new([None, None, None]);
612 let mut y = Lobby::new([None, None, None]);
613
614 x.push(0);
615 x.push(1);
616
617 y.push(0);
618 y.push(1);
619
620 assert_eq!(x, y);
621
622 y.pop();
623 x.push(0);
624 x.shift();
625 x.shift();
626
627 assert_eq!(x, y);
628 assert_eq!(x, [Some(0), None, None]);
629 }
630
631 #[test]
632 fn test_iter() {
633 let mut x = Lobby::new([None, None, None]);
634
635 x.push(0);
636 assert_eq!(vec![&0], x.iter().collect::<Vec<_>>());
637 assert_eq!(vec![0], x.clone().into_iter().collect::<Vec<_>>());
638
639 x.push(1);
640 x.push(2);
641 assert_eq!(vec![&0, &1, &2], x.iter().collect::<Vec<_>>());
642 assert_eq!(vec![0, 1, 2], x.clone().into_iter().collect::<Vec<_>>());
643
644 x.push(3);
645 assert_eq!(vec![&1, &2, &3], x.iter().collect::<Vec<_>>());
646 assert_eq!(vec![1, 2, 3], x.clone().into_iter().collect::<Vec<_>>());
647
648 x.shift();
649 assert_eq!(vec![&2, &3], x.iter().collect::<Vec<_>>());
650 assert_eq!(vec![2, 3], x.into_iter().collect::<Vec<_>>());
651 }
652
653 #[test]
654 fn test_iter_mut() {
655 let mut x = Lobby::new([None, None, None, None]);
656 x.push(1);
657 x.push(2);
658 x.push(3);
659 x.push(4);
660
661 for v in x.iter_mut() {
662 *v *= 2;
663 }
664
665 assert_eq!(x, [Some(2), Some(4), Some(6), Some(8)]);
666 }
667}