Advertisement
Guest User

Untitled

a guest
May 26th, 2019
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.91 KB | None | 0 0
  1. use std::collections::{HashMap, HashSet};
  2. use std::hash::Hash;
  3.  
  4. #[derive(Debug, Default)]
  5. struct DFA<T: Eq + Hash> {
  6. state: isize,
  7. transitions: HashMap<(isize, T), isize>,
  8. goals: HashSet<isize>,
  9. }
  10.  
  11. #[derive(Debug)]
  12. enum DFAResult<T> {
  13. Success,
  14. Failure,
  15. Invalid(isize, T),
  16. }
  17.  
  18. impl<T> DFAResult<T> {
  19. fn from_bool(b: bool) -> Self {
  20. if b {
  21. Success
  22. } else {
  23. Failure
  24. }
  25. }
  26. }
  27.  
  28. use self::DFAResult::*;
  29.  
  30. impl<T: Eq + Hash + Clone> DFA<T> {
  31. fn eval(&mut self, mut iter: impl Iterator<Item = T>) -> DFAResult<T> {
  32. while let Some(transition) = iter.next() {
  33. unsafe {
  34. let raw = &transition as *const T;
  35. match self.transitions.get(&(self.state, transition)) {
  36. Some(&state) => self.state = state,
  37. None => return Invalid(self.state, (*raw).clone()),
  38. }
  39. }
  40. }
  41. DFAResult::from_bool(self.goals.contains(&self.state))
  42. }
  43. }
  44.  
  45. #[derive(Debug, Default)]
  46. struct DFABuilder<T: Eq + Hash> {
  47. dfa: DFA<T>,
  48. }
  49.  
  50. impl<T: Eq + Hash + Clone> DFABuilder<T> {
  51. fn add_transition(mut self, from: isize, on: T, to: isize) -> Self {
  52. self.dfa
  53. .transitions
  54. .entry((from, on))
  55. .and_modify(|state| *state = to)
  56. .or_insert(to);
  57. self
  58. }
  59.  
  60. fn add_goal(mut self, goal: isize) -> Self {
  61. self.dfa.goals.insert(goal);
  62. self
  63. }
  64.  
  65. fn start_state(mut self, start: isize) -> Self {
  66. self.dfa.state = start;
  67. self
  68. }
  69.  
  70. fn build(self) -> DFA<T> {
  71. self.dfa
  72. }
  73. }
  74.  
  75. fn main() {
  76. let mut dfa = DFABuilder::default()
  77. .add_transition(0, 0_u128, 1)
  78. .add_transition(0, 1_u128, 0)
  79. .add_transition(1, 0_u128, 0)
  80. .add_transition(1, 1_u128, 1)
  81. .add_goal(0)
  82. .build();
  83.  
  84. dbg!(dfa.eval([0, 1, 1, 0, 2].into_iter().cloned()));
  85. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement