use crate::span::vec_map::VecMap;
#[derive(Default)]
pub struct Segment<T> {
pub meta: VecMap<T, T>,
pub metrics: VecMap<T, f64>,
pub origin: Option<T>,
pub sampling_rule_decision: Option<f64>,
pub sampling_limit_decision: Option<f64>,
pub sampling_agent_decision: Option<f64>,
pub span_count: usize,
}
pub struct SmallSegmentMap<T> {
inline_key: u64,
inline_val: Option<Segment<T>>,
overflow: Vec<(u64, Segment<T>)>,
}
impl<T> Default for SmallSegmentMap<T> {
fn default() -> Self {
SmallSegmentMap {
inline_key: 0,
inline_val: None,
overflow: Vec::new(),
}
}
}
impl<T> SmallSegmentMap<T> {
pub fn is_empty(&self) -> bool {
self.inline_val.is_none()
}
#[inline]
pub fn get(&self, key: &u64) -> Option<&Segment<T>> {
if let Some(ref val) = self.inline_val {
if self.inline_key == *key {
return Some(val);
}
}
self.overflow
.iter()
.find(|(k, _)| *k == *key)
.map(|(_, v)| v)
}
#[inline]
pub fn get_mut(&mut self, key: &u64) -> Option<&mut Segment<T>> {
if let Some(ref mut val) = self.inline_val {
if self.inline_key == *key {
return Some(val);
}
}
self.overflow
.iter_mut()
.find(|(k, _)| *k == *key)
.map(|(_, v)| v)
}
#[inline]
pub fn get_or_insert_default(&mut self, key: u64) -> &mut Segment<T>
where
T: Default,
{
if self.inline_key == key || self.inline_val.is_none() {
self.inline_key = key;
return self.inline_val.get_or_insert_with(Segment::default);
}
let pos = self.overflow.iter().position(|(k, _)| *k == key);
match pos {
Some(i) => &mut self.overflow[i].1,
None => {
self.overflow.push((key, Segment::default()));
let last = self.overflow.len() - 1;
&mut self.overflow[last].1
}
}
}
pub fn remove(&mut self, key: &u64) -> Option<Segment<T>> {
if self.inline_val.is_some() && self.inline_key == *key {
let val = self.inline_val.take();
if let Some((k, v)) = self.overflow.pop() {
self.inline_key = k;
self.inline_val = Some(v);
}
return val;
}
let pos = self.overflow.iter().position(|(k, _)| *k == *key)?;
Some(self.overflow.swap_remove(pos).1)
}
}