use crate::Dummy;
use crate::error::YaoiError;
use crate::TcpStream;
use core::marker::PhantomData;
use nohash_hasher::BuildNoHashHasher;
use hashbrown::HashMap;
use io_uring_bearer::UringBearer;
pub struct TcpPool<Cfun, Cdata>
where
Cfun: Fn(&mut Cdata, &TcpStream) -> ()
{
bearer: UringBearer<Dummy>,
pool: HashMap<u32, TcpStream, BuildNoHashHasher<u32>>,
c_fn: Option<Cfun>,
s_fn: Option<Cfun>,
pool_count: usize,
cd: PhantomData<Cdata>,
}
impl<Cfun: for<'a, 'b> Fn(&'a mut Cdata, &'b TcpStream), Cdata> TcpPool<Cfun, Cdata> {
pub fn with_capacity(pool_cap: usize) -> Result<Self, YaoiError> {
let cap = crate::capacity::TcpPoolCapacity::provide(pool_cap);
let mut bearer = UringBearer::with_capacity(cap)
.map_err(YaoiError::Bearer)?;
let pool: HashMap<u32, TcpStream, BuildNoHashHasher<u32>> =
HashMap::<u32, TcpStream, BuildNoHashHasher<u32>>::with_capacity_and_hasher(
pool_cap,
BuildNoHashHasher::default(),
);
Ok(Self { bearer, pool, c_fn: None, s_fn: None, cd: PhantomData, pool_count: pool_cap })
}
pub fn connect_with_cb(&mut self, d: &mut Cdata, cb: Cfun) -> Result<usize, YaoiError> {
todo!()
}
pub fn serve_with_cb(&mut self, d: &mut Cdata, cb: Cfun) -> Result<usize, YaoiError> {
todo!()
}
}