use super::{BeeBuilder, BuilderConfig, ChannelBuilder, Token, WorkstealingBuilder};
use crate::bee::{CloneQueen, DefaultQueen, Queen, QueenCell, QueenMut, Worker};
use crate::hive::Config;
#[derive(Clone, Default, Debug)]
pub struct OpenBuilder(Config);
impl OpenBuilder {
pub fn empty() -> Self {
Self(Config::empty())
}
pub fn with_queen<Q: Queen>(self, queen: Q) -> BeeBuilder<Q> {
BeeBuilder::from_config_and_queen(self.0, queen)
}
pub fn with_queen_default<Q: Queen + Default>(self) -> BeeBuilder<Q> {
BeeBuilder::from_config_and_queen(self.0, Q::default())
}
pub fn with_queen_mut<Q: QueenMut>(self, queen: Q) -> BeeBuilder<QueenCell<Q>> {
BeeBuilder::from_config_and_queen(self.0, QueenCell::new(queen))
}
pub fn with_queen_mut_default<Q: QueenMut + Default>(self) -> BeeBuilder<QueenCell<Q>> {
BeeBuilder::from_config_and_queen(self.0, QueenCell::new(Q::default()))
}
pub fn with_worker<W>(self, worker: W) -> BeeBuilder<CloneQueen<W>>
where
W: Worker + Send + Sync + Clone,
{
BeeBuilder::from_config_and_queen(self.0, CloneQueen::new(worker))
}
pub fn with_worker_default<W>(self) -> BeeBuilder<DefaultQueen<W>>
where
W: Worker + Send + Sync + Default,
{
BeeBuilder::from_config_and_queen(self.0, DefaultQueen::default())
}
pub fn with_channel_queues(self) -> ChannelBuilder {
ChannelBuilder::from(self.0)
}
pub fn with_workstealing_queues(self) -> WorkstealingBuilder {
WorkstealingBuilder::from(self.0)
}
}
impl BuilderConfig for OpenBuilder {
fn config_ref(&mut self, _: Token) -> &mut Config {
&mut self.0
}
}
impl From<Config> for OpenBuilder {
fn from(value: Config) -> Self {
Self(value)
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::bee::stock::EchoWorker;
use crate::bee::{CloneQueen, DefaultQueen, Queen, QueenCell, QueenMut};
use crate::hive::{FullBuilder, TaskQueues, TaskQueuesBuilder};
use rstest::rstest;
#[derive(Clone, Default)]
struct TestQueen;
impl Queen for TestQueen {
type Kind = EchoWorker<usize>;
fn create(&self) -> Self::Kind {
EchoWorker::default()
}
}
impl QueenMut for TestQueen {
type Kind = EchoWorker<usize>;
fn create(&mut self) -> Self::Kind {
EchoWorker::default()
}
}
#[rstest]
fn test_create<F, B, W>(
#[values(OpenBuilder::empty, OpenBuilder::default)] factory: F,
#[values(
OpenBuilder::with_channel_queues,
OpenBuilder::with_workstealing_queues
)]
with_fn: W,
) where
F: Fn() -> OpenBuilder,
B: TaskQueuesBuilder,
W: Fn(OpenBuilder) -> B,
{
let open_builder = factory();
let queue_builder = with_fn(open_builder);
let _hive = queue_builder
.with_worker(EchoWorker::<usize>::default())
.build();
}
#[rstest]
fn test_queen<F, T, W>(
#[values(OpenBuilder::empty, OpenBuilder::default)] factory: F,
#[values(BeeBuilder::with_channel_queues, BeeBuilder::with_workstealing_queues)] with_fn: W,
) where
F: Fn() -> OpenBuilder,
T: TaskQueues<EchoWorker<usize>>,
W: Fn(BeeBuilder<TestQueen>) -> FullBuilder<TestQueen, T>,
{
let open_builder = factory();
let bee_builder = open_builder.with_queen(TestQueen);
let queue_builder = with_fn(bee_builder);
let _hive = queue_builder.build();
}
#[rstest]
fn test_queen_default<F, T, W>(
#[values(OpenBuilder::empty, OpenBuilder::default)] factory: F,
#[values(BeeBuilder::with_channel_queues, BeeBuilder::with_workstealing_queues)] with_fn: W,
) where
F: Fn() -> OpenBuilder,
T: TaskQueues<EchoWorker<usize>>,
W: Fn(BeeBuilder<TestQueen>) -> FullBuilder<TestQueen, T>,
{
let open_builder = factory();
let bee_builder = open_builder.with_queen_default::<TestQueen>();
let queue_builder = with_fn(bee_builder);
let _hive = queue_builder.build();
}
#[rstest]
fn test_queen_mut_default<F, T, W>(
#[values(OpenBuilder::empty, OpenBuilder::default)] factory: F,
#[values(BeeBuilder::with_channel_queues, BeeBuilder::with_workstealing_queues)] with_fn: W,
) where
F: Fn() -> OpenBuilder,
T: TaskQueues<EchoWorker<usize>>,
W: Fn(BeeBuilder<QueenCell<TestQueen>>) -> FullBuilder<QueenCell<TestQueen>, T>,
{
let open_builder = factory();
let bee_builder = open_builder.with_queen_mut_default::<TestQueen>();
let queue_builder = with_fn(bee_builder);
let _hive = queue_builder.build();
}
#[rstest]
fn test_worker<F, T, W>(
#[values(OpenBuilder::empty, OpenBuilder::default)] factory: F,
#[values(BeeBuilder::with_channel_queues, BeeBuilder::with_workstealing_queues)] with_fn: W,
) where
F: Fn() -> OpenBuilder,
T: TaskQueues<EchoWorker<usize>>,
W: Fn(
BeeBuilder<CloneQueen<EchoWorker<usize>>>,
) -> FullBuilder<CloneQueen<EchoWorker<usize>>, T>,
{
let open_builder = factory();
let bee_builder = open_builder.with_worker(EchoWorker::default());
let queue_builder = with_fn(bee_builder);
let _hive = queue_builder.build();
}
#[rstest]
fn test_worker_default<F, T, W>(
#[values(OpenBuilder::empty, OpenBuilder::default)] factory: F,
#[values(BeeBuilder::with_channel_queues, BeeBuilder::with_workstealing_queues)] with_fn: W,
) where
F: Fn() -> OpenBuilder,
T: TaskQueues<EchoWorker<usize>>,
W: Fn(
BeeBuilder<DefaultQueen<EchoWorker<usize>>>,
) -> FullBuilder<DefaultQueen<EchoWorker<usize>>, T>,
{
let open_builder = factory();
let bee_builder = open_builder.with_worker_default::<EchoWorker<usize>>();
let queue_builder = with_fn(bee_builder);
let _hive = queue_builder.build();
}
}