Skip to main content

rnacos/sequence/
model.rs

1use actix::Message;
2use serde::{Deserialize, Serialize};
3use std::sync::Arc;
4
5#[derive(Clone, Debug, Serialize, Deserialize)]
6pub struct SeqGroup {
7    range_a: SeqRange,
8    range_b: SeqRange,
9    use_a: bool,
10    step: u64,
11    // 是否正在添加,用户防止多次申请缓存
12    next_adding: bool,
13}
14
15impl SeqGroup {
16    pub fn new(step: u64) -> Self {
17        Self {
18            range_a: SeqRange::new(0, 0),
19            range_b: SeqRange::new(0, 0),
20            step,
21            use_a: false,
22            next_adding: false,
23        }
24    }
25    pub fn next_id(&mut self) -> Option<u64> {
26        let v = self.do_next_id();
27        if v.is_none() {
28            self.switch_state();
29            self.do_next_id()
30        } else {
31            v
32        }
33    }
34
35    pub fn apply_range(&mut self, start: u64, len: u64) {
36        if self.use_a && !self.range_a.has_next() || !self.use_a && self.range_b.has_next() {
37            self.range_a.renew(start, len);
38        } else {
39            self.range_b.renew(start, len);
40        }
41    }
42
43    pub fn mark_apply(&mut self) {
44        self.next_adding = true;
45    }
46
47    pub fn clear_apply_mark(&mut self) {
48        self.next_adding = false;
49    }
50
51    pub fn need_apply(&self) -> bool {
52        if self.next_adding {
53            return false;
54        }
55        if !self.range_a.has_next() || !self.range_b.has_next() {
56            true
57        } else {
58            false
59        }
60    }
61
62    /*
63    fn current_range(&self) -> &SeqRange {
64        if self.use_a {
65            &self.range_a
66        }
67        else{
68            &self.range_b
69        }
70    }
71
72    fn next_range(&self) -> &SeqRange {
73        if self.use_a {
74            &self.range_b
75        }
76        else{
77            &self.range_a
78        }
79    }
80     */
81
82    fn do_next_id(&mut self) -> Option<u64> {
83        if self.use_a {
84            self.range_a.next_id()
85        } else {
86            self.range_b.next_id()
87        }
88    }
89
90    fn switch_state(&mut self) {
91        self.use_a = !self.use_a;
92    }
93}
94
95#[derive(Clone, Debug, Serialize, Deserialize, Default)]
96pub struct SeqRange {
97    pub(crate) start: u64,
98    pub(crate) len: u64,
99    current_index: u64,
100}
101
102impl SeqRange {
103    pub fn new(start: u64, len: u64) -> Self {
104        Self {
105            start,
106            len,
107            current_index: 0,
108        }
109    }
110
111    pub fn renew(&mut self, start: u64, len: u64) {
112        self.start = start;
113        self.len = len;
114        self.current_index = 0;
115    }
116
117    pub fn next_id(&mut self) -> Option<u64> {
118        if self.current_index >= self.len {
119            return None;
120        }
121        let v = self.start + self.current_index;
122        self.current_index += 1;
123        Some(v)
124    }
125
126    pub fn has_next(&self) -> bool {
127        self.current_index < self.len
128    }
129}
130
131#[derive(Message, Clone, Debug, Serialize, Deserialize)]
132#[rtype(result = "anyhow::Result<SequenceRaftResult>")]
133pub enum SequenceRaftReq {
134    NextId(Arc<String>),
135    NextRange(Arc<String>, u64),
136    SetId(Arc<String>, u64),
137    RemoveId(Arc<String>),
138}
139
140#[derive(Clone, Debug, Serialize, Deserialize)]
141pub enum SequenceRaftResult {
142    NextId(u64),
143    NextRange { start: u64, len: u64 },
144    None,
145}