use crate::Ordering;
#[doc = crate::_tags!(exec)]
#[doc = crate::_doc_location!("core/ops")]
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
pub struct CallSemantics {
pub bind: CallBindTime,
pub context: CallContext,
pub dispatch: CallDispatch,
pub open: CallOpenness,
pub storage: CallStorage,
}
impl PartialOrd for CallSemantics {
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
use Ordering::{Equal, Greater, Less};
let axes = [
self.bind.cmp(&other.bind),
self.dispatch.cmp(&other.dispatch),
self.context.cmp(&other.context),
self.storage.cmp(&other.storage),
];
let mut less = false;
let mut greater = false;
for ord in axes {
match ord {
Less => less = true,
Greater => greater = true,
Equal => {}
}
}
match (less, greater) {
(true, true) => None, (true, false) => Some(Less),
(false, true) => Some(Greater),
(false, false) => Some(Equal),
}
}
}
#[doc = crate::_tags!(exec)]
#[doc = crate::_doc_location!("core/ops")]
#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub enum CallBindTime {
Compile = 0,
Build = 1,
Run = 2,
}
#[doc = crate::_tags!(exec)]
#[doc = crate::_doc_location!("core/ops")]
#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub enum CallContext {
None = 0,
Receiver = 1,
Captured = 2,
}
#[doc = crate::_tags!(exec)]
#[doc = crate::_doc_location!("core/ops")]
#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub enum CallDispatch {
Direct = 0,
Branch = 1,
Indirect = 2,
Vtable = 3,
}
#[doc = crate::_tags!(exec)]
#[doc = crate::_doc_location!("core/ops")]
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
pub enum CallOpenness {
Closed = 0,
Open = 1,
}
#[doc = crate::_tags!(exec)]
#[doc = crate::_doc_location!("core/ops")]
#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub enum CallStorage {
Static = 0,
Inline = 1,
Arena = 2,
Heap = 3,
}