1use std::ops::Deref;
2use std::sync::Arc;
3
4use anyhow::Result;
5
6use crate::fst_properties::FstProperties;
7use crate::fst_traits::{CoreFst, ExpandedFst, Fst, FstIntoIterator, FstIterator, StateIterator};
8use crate::semirings::Semiring;
9use crate::{StateId, SymbolTable};
10
11impl<W: Semiring, F: Fst<W>> Fst<W> for Arc<F> {
12 fn input_symbols(&self) -> Option<&Arc<SymbolTable>> {
13 self.deref().input_symbols()
14 }
15
16 fn output_symbols(&self) -> Option<&Arc<SymbolTable>> {
17 self.deref().output_symbols()
18 }
19
20 fn set_input_symbols(&mut self, _symt: Arc<SymbolTable>) {
21 unimplemented!()
22 }
23
24 fn set_output_symbols(&mut self, _symt: Arc<SymbolTable>) {
25 unimplemented!()
26 }
27
28 fn take_input_symbols(&mut self) -> Option<Arc<SymbolTable>> {
29 unimplemented!()
30 }
31
32 fn take_output_symbols(&mut self) -> Option<Arc<SymbolTable>> {
33 unimplemented!()
34 }
35}
36
37impl<W: Semiring, F: ExpandedFst<W>> ExpandedFst<W> for Arc<F> {
38 fn num_states(&self) -> usize {
39 self.deref().num_states()
40 }
41}
42
43impl<W: Semiring, F: CoreFst<W>> CoreFst<W> for Arc<F> {
44 type TRS = F::TRS;
45
46 fn start(&self) -> Option<StateId> {
47 self.deref().start()
48 }
49
50 fn final_weight(&self, state_id: StateId) -> Result<Option<W>> {
51 self.deref().final_weight(state_id)
52 }
53
54 unsafe fn final_weight_unchecked(&self, state_id: StateId) -> Option<W> {
55 self.deref().final_weight_unchecked(state_id)
56 }
57
58 fn num_trs(&self, s: StateId) -> Result<usize> {
59 self.deref().num_trs(s)
60 }
61
62 unsafe fn num_trs_unchecked(&self, s: StateId) -> usize {
63 self.deref().num_trs_unchecked(s)
64 }
65
66 fn get_trs(&self, state_id: StateId) -> Result<Self::TRS> {
67 self.deref().get_trs(state_id)
68 }
69
70 unsafe fn get_trs_unchecked(&self, state_id: StateId) -> Self::TRS {
71 self.deref().get_trs_unchecked(state_id)
72 }
73
74 fn properties(&self) -> FstProperties {
75 self.deref().properties()
76 }
77
78 fn num_input_epsilons(&self, state: StateId) -> Result<usize> {
79 self.deref().num_input_epsilons(state)
80 }
81
82 fn num_output_epsilons(&self, state: StateId) -> Result<usize> {
83 self.deref().num_output_epsilons(state)
84 }
85}
86
87impl<'a, W: Semiring + 'a, F: FstIterator<'a, W>> FstIterator<'a, W> for Arc<F> {
88 type FstIter = F::FstIter;
89
90 fn fst_iter(&'a self) -> Self::FstIter {
91 self.deref().fst_iter()
92 }
93}
94
95impl<'a, F: StateIterator<'a>> StateIterator<'a> for Arc<F> {
96 type Iter = F::Iter;
97
98 fn states_iter(&'a self) -> Self::Iter {
99 self.deref().states_iter()
100 }
101}
102
103impl<W: Semiring, F: FstIntoIterator<W>> FstIntoIterator<W> for Arc<F> {
104 type TrsIter = F::TrsIter;
105 type FstIter = F::FstIter;
106
107 fn fst_into_iter(self) -> Self::FstIter {
108 unimplemented!()
109 }
110}