|
@@ -1,26 +1,35 @@
|
|
|
use core::fmt;
|
|
|
use managed::ManagedSlice;
|
|
|
|
|
|
+use super::socket_meta::Meta;
|
|
|
use crate::socket::{AnySocket, Socket};
|
|
|
|
|
|
-use super::meta::Meta;
|
|
|
+/// Opaque struct with space for storing one socket.
|
|
|
+///
|
|
|
+/// This is public so you can use it to allocate space for storing
|
|
|
+/// sockets when creating an Interface.
|
|
|
+#[derive(Debug, Default)]
|
|
|
+pub struct SocketStorage<'a> {
|
|
|
+ inner: Option<Item<'a>>,
|
|
|
+}
|
|
|
+
|
|
|
+impl<'a> SocketStorage<'a> {
|
|
|
+ pub const EMPTY: Self = Self { inner: None };
|
|
|
+}
|
|
|
|
|
|
/// An item of a socket set.
|
|
|
-///
|
|
|
-/// The only reason this struct is public is to allow the socket set storage
|
|
|
-/// to be allocated externally.
|
|
|
#[derive(Debug)]
|
|
|
-pub struct Item<'a> {
|
|
|
+pub(crate) struct Item<'a> {
|
|
|
pub(crate) meta: Meta,
|
|
|
pub(crate) socket: Socket<'a>,
|
|
|
}
|
|
|
|
|
|
-/// A handle, identifying a socket in a set.
|
|
|
+/// A handle, identifying a socket in an Interface.
|
|
|
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Default, Hash)]
|
|
|
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
|
|
-pub struct Handle(usize);
|
|
|
+pub struct SocketHandle(usize);
|
|
|
|
|
|
-impl fmt::Display for Handle {
|
|
|
+impl fmt::Display for SocketHandle {
|
|
|
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
|
|
write!(f, "#{}", self.0)
|
|
|
}
|
|
@@ -30,38 +39,40 @@ impl fmt::Display for Handle {
|
|
|
///
|
|
|
/// The lifetime `'a` is used when storing a `Socket<'a>`.
|
|
|
#[derive(Debug)]
|
|
|
-pub struct Set<'a> {
|
|
|
- sockets: ManagedSlice<'a, Option<Item<'a>>>,
|
|
|
+pub(crate) struct SocketSet<'a> {
|
|
|
+ sockets: ManagedSlice<'a, SocketStorage<'a>>,
|
|
|
}
|
|
|
|
|
|
-impl<'a> Set<'a> {
|
|
|
+impl<'a> SocketSet<'a> {
|
|
|
/// Create a socket set using the provided storage.
|
|
|
- pub fn new<SocketsT>(sockets: SocketsT) -> Set<'a>
|
|
|
+ pub fn new<SocketsT>(sockets: SocketsT) -> SocketSet<'a>
|
|
|
where
|
|
|
- SocketsT: Into<ManagedSlice<'a, Option<Item<'a>>>>,
|
|
|
+ SocketsT: Into<ManagedSlice<'a, SocketStorage<'a>>>,
|
|
|
{
|
|
|
let sockets = sockets.into();
|
|
|
- Set { sockets }
|
|
|
+ SocketSet { sockets }
|
|
|
}
|
|
|
|
|
|
/// Add a socket to the set, and return its handle.
|
|
|
///
|
|
|
/// # Panics
|
|
|
/// This function panics if the storage is fixed-size (not a `Vec`) and is full.
|
|
|
- pub fn add<T: AnySocket<'a>>(&mut self, socket: T) -> Handle {
|
|
|
- fn put<'a>(index: usize, slot: &mut Option<Item<'a>>, socket: Socket<'a>) -> Handle {
|
|
|
+ pub fn add<T: AnySocket<'a>>(&mut self, socket: T) -> SocketHandle {
|
|
|
+ fn put<'a>(index: usize, slot: &mut SocketStorage<'a>, socket: Socket<'a>) -> SocketHandle {
|
|
|
net_trace!("[{}]: adding", index);
|
|
|
- let handle = Handle(index);
|
|
|
+ let handle = SocketHandle(index);
|
|
|
let mut meta = Meta::default();
|
|
|
meta.handle = handle;
|
|
|
- *slot = Some(Item { socket, meta });
|
|
|
+ *slot = SocketStorage {
|
|
|
+ inner: Some(Item { meta, socket }),
|
|
|
+ };
|
|
|
handle
|
|
|
}
|
|
|
|
|
|
let socket = socket.upcast();
|
|
|
|
|
|
for (index, slot) in self.sockets.iter_mut().enumerate() {
|
|
|
- if slot.is_none() {
|
|
|
+ if slot.inner.is_none() {
|
|
|
return put(index, slot, socket);
|
|
|
}
|
|
|
}
|
|
@@ -70,7 +81,7 @@ impl<'a> Set<'a> {
|
|
|
ManagedSlice::Borrowed(_) => panic!("adding a socket to a full SocketSet"),
|
|
|
#[cfg(any(feature = "std", feature = "alloc"))]
|
|
|
ManagedSlice::Owned(ref mut sockets) => {
|
|
|
- sockets.push(None);
|
|
|
+ sockets.push(SocketStorage { inner: None });
|
|
|
let index = sockets.len() - 1;
|
|
|
put(index, &mut sockets[index], socket)
|
|
|
}
|
|
@@ -82,8 +93,8 @@ impl<'a> Set<'a> {
|
|
|
/// # Panics
|
|
|
/// This function may panic if the handle does not belong to this socket set
|
|
|
/// or the socket has the wrong type.
|
|
|
- pub fn get<T: AnySocket<'a>>(&mut self, handle: Handle) -> &mut T {
|
|
|
- match self.sockets[handle.0].as_mut() {
|
|
|
+ pub fn get<T: AnySocket<'a>>(&mut self, handle: SocketHandle) -> &mut T {
|
|
|
+ match self.sockets[handle.0].inner.as_mut() {
|
|
|
Some(item) => {
|
|
|
T::downcast(&mut item.socket).expect("handle refers to a socket of a wrong type")
|
|
|
}
|
|
@@ -95,9 +106,9 @@ impl<'a> Set<'a> {
|
|
|
///
|
|
|
/// # Panics
|
|
|
/// This function may panic if the handle does not belong to this socket set.
|
|
|
- pub fn remove(&mut self, handle: Handle) -> Socket<'a> {
|
|
|
+ pub fn remove(&mut self, handle: SocketHandle) -> Socket<'a> {
|
|
|
net_trace!("[{}]: removing", handle.0);
|
|
|
- match self.sockets[handle.0].take() {
|
|
|
+ match self.sockets[handle.0].inner.take() {
|
|
|
Some(item) => item.socket,
|
|
|
None => panic!("handle does not refer to a valid socket"),
|
|
|
}
|
|
@@ -105,11 +116,11 @@ impl<'a> Set<'a> {
|
|
|
|
|
|
/// Iterate every socket in this set.
|
|
|
pub fn iter(&self) -> impl Iterator<Item = &Item<'a>> + '_ {
|
|
|
- self.sockets.iter().filter_map(|x| x.as_ref())
|
|
|
+ self.sockets.iter().filter_map(|x| x.inner.as_ref())
|
|
|
}
|
|
|
|
|
|
/// Iterate every socket in this set.
|
|
|
pub fn iter_mut(&mut self) -> impl Iterator<Item = &mut Item<'a>> + '_ {
|
|
|
- self.sockets.iter_mut().filter_map(|x| x.as_mut())
|
|
|
+ self.sockets.iter_mut().filter_map(|x| x.inner.as_mut())
|
|
|
}
|
|
|
}
|