c3_inheritance/c3/
mod.rs

1mod algorithm;
2
3use crate::{C3Object, LinearizeError, LinearizeResult};
4use std::{
5    collections::BTreeMap,
6    fmt::Debug,
7    ops::{Add, AddAssign},
8};
9
10/// The inheritance graph.
11#[derive(Clone, Debug, Default)]
12pub struct InheritGraph {
13    base: BTreeMap<String, C3Class>,
14}
15
16#[derive(Debug)]
17pub struct InheritLinearized<'a> {
18    graph: &'a InheritGraph,
19    maps: BTreeMap<&'a str, Vec<&'a str>>,
20}
21
22impl<T> AddAssign<T> for InheritGraph
23where
24    T: C3Object,
25{
26    fn add_assign(&mut self, rhs: T) {
27        let class = rhs.as_class();
28        self.base.insert(class.name.clone(), class);
29    }
30}
31
32impl<'a> InheritLinearized<'a> {
33    pub fn get(&self, name: &str) -> LinearizeResult<&[&str]> {
34        self.maps.get(name).map(|v| &v[..]).ok_or_else(|| LinearizeError::NotFound { base: name.to_string() })
35    }
36}
37
38/// A class.
39#[derive(Clone, Debug)]
40pub struct C3Class {
41    name: String,
42    base: Vec<BaseClass>,
43}
44
45impl C3Class {
46    /// Create a new class.
47    pub fn new<T>(name: T) -> Self
48    where
49        T: Into<String>,
50    {
51        Self { name: name.into(), base: vec![] }
52    }
53    /// Add a base class.
54    pub fn with_inherit<T>(mut self, name: T) -> Self
55    where
56        T: Into<String>,
57    {
58        self.base.push(BaseClass { class: name.into(), is_virtual: true });
59        self
60    }
61    /// Add a virtual base class.
62    pub fn with_virtual_inherit<T>(mut self, name: T) -> Self
63    where
64        T: Into<String>,
65    {
66        self.base.push(BaseClass { class: name.into(), is_virtual: true });
67        self
68    }
69}
70
71impl AddAssign<BaseClass> for C3Class {
72    fn add_assign(&mut self, rhs: BaseClass) {
73        self.base.push(rhs);
74    }
75}
76
77impl Add<BaseClass> for C3Class {
78    type Output = Self;
79
80    fn add(mut self, rhs: BaseClass) -> Self::Output {
81        self.base.push(rhs);
82        self
83    }
84}
85
86#[derive(Clone, Debug)]
87pub struct BaseClass {
88    class: String,
89    is_virtual: bool,
90}
91
92/// A trait for objects that can be used in the C3 algorithm.
93#[derive(Clone, Debug)]
94pub struct C3ClassMember {
95    name: String,
96    overloads: usize,
97}
98
99pub enum MemberKind {
100    /// nothing
101    Inherit,
102    /// virtual method,
103    Virtual,
104    /// override method,
105    Override,
106    /// final method
107    Final,
108}