use crate::types::{TypeTrait, Typed, WithMetaData};
pub fn is_cyclomatic_persisted<K: TypeTrait>(t: &K) -> bool {
t.is_type_declaration() || t.is_executable_member()
|| t.is_file()
}
#[derive(Clone, Debug)]
pub struct Mcc {
value: u32,
}
impl Mcc {
pub fn new<K: TypeTrait>(kind: &K) -> Self {
Self {
value: if kind.is_fork() { 1 } else { 0 },
}
}
pub fn acc(self, acc: &mut Self) {
acc.value += self.value
}
pub fn persist<K: TypeTrait>(kind: &K) -> bool {
is_cyclomatic_persisted(kind)
}
}
impl<T: Typed + WithMetaData<Mcc>> MetaData<T> for Mcc
where
T::Type: TypeTrait,
{
type R = u32;
fn retrieve(node: &T) -> Self::R {
let kind = node.get_type();
if Mcc::persist(&kind) {
node.get_metadata()
.map(|x| x.value + 1)
.expect("missing mcc")
} else {
0
}
}
}
pub trait MetaData<T> {
type R;
fn retrieve(node: &T) -> Self::R;
}
pub struct MccJacoco {
value: u32,
}
impl MccJacoco {
pub fn new<K: TypeTrait>(kind: &K) -> Self {
Self {
value: if kind.is_fork() { 1 } else { 0 },
}
}
pub fn acc(self, acc: &mut Self) {
acc.value += self.value
}
}
#[cfg(test)]
pub mod tests {
}