use super::BounceBuffer;
use crate::layout::KvBlockLayout;
use cudarc::driver::CudaStream;
use derive_builder::Builder;
use derive_getters::Dissolve;
use std::ops::Range;
use std::sync::Arc;
#[derive(Clone, Default, Builder, Dissolve)]
#[builder(pattern = "owned", default)]
pub struct TransferOptions {
#[builder(default, setter(strip_option))]
pub layer_range: Option<Range<usize>>,
#[builder(default, setter(strip_option))]
pub nixl_write_notification: Option<u64>,
#[builder(default, setter(strip_option, into))]
pub bounce_buffer: Option<BounceBuffer>,
#[builder(default, setter(strip_option))]
pub cuda_stream: Option<Arc<CudaStream>>,
#[builder(default, setter(strip_option))]
pub src_kv_layout: Option<KvBlockLayout>,
#[builder(default, setter(strip_option))]
pub dst_kv_layout: Option<KvBlockLayout>,
}
impl TransferOptions {
pub fn builder() -> TransferOptionsBuilder {
TransferOptionsBuilder::default()
}
pub fn from_layer_range(layer_range: Option<Range<usize>>) -> Self {
Self {
layer_range,
..Self::default()
}
}
pub fn new() -> Self {
Self::default()
}
}
#[cfg(all(test, feature = "testing-kvbm"))]
mod tests {
use super::*;
#[test]
fn test_default_options() {
let options = TransferOptions::default();
assert!(options.layer_range.is_none());
assert!(options.nixl_write_notification.is_none());
assert!(options.bounce_buffer.is_none());
}
#[test]
fn test_builder_with_notification() {
let options = TransferOptions::builder()
.nixl_write_notification(42)
.build()
.unwrap();
assert_eq!(options.nixl_write_notification, Some(42));
assert!(options.layer_range.is_none());
}
#[test]
fn test_builder_with_layer_range() {
let options = TransferOptions::builder()
.layer_range(0..10)
.build()
.unwrap();
assert_eq!(options.layer_range, Some(0..10));
assert!(options.nixl_write_notification.is_none());
}
#[test]
fn test_builder_with_all_options() {
let options = TransferOptions::builder()
.nixl_write_notification(100)
.layer_range(5..15)
.build()
.unwrap();
assert_eq!(options.nixl_write_notification, Some(100));
assert_eq!(options.layer_range, Some(5..15));
}
}