1mod algorithm;
2
3use crate::{C3Object, LinearizeError, LinearizeResult};
4use std::{
5 collections::BTreeMap,
6 fmt::Debug,
7 ops::{Add, AddAssign},
8};
9
10#[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#[derive(Clone, Debug)]
40pub struct C3Class {
41 name: String,
42 base: Vec<BaseClass>,
43}
44
45impl C3Class {
46 pub fn new<T>(name: T) -> Self
48 where
49 T: Into<String>,
50 {
51 Self { name: name.into(), base: vec![] }
52 }
53 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 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#[derive(Clone, Debug)]
94pub struct C3ClassMember {
95 name: String,
96 overloads: usize,
97}
98
99pub enum MemberKind {
100 Inherit,
102 Virtual,
104 Override,
106 Final,
108}