general_sam/utils/
rope.rs1use std::borrow::Cow;
4use std::ops::Deref;
5
6use super::treap::{NeedSwap, SplitTo, TreapNodeData, TreapTree};
7
8pub trait RopeData: Clone {
9 type TagType: Default;
10
11 fn get_tag(&self) -> Option<Self::TagType>;
12 fn reset_tag(&mut self);
13 fn add_tag(&mut self, tag: Self::TagType) -> NeedSwap;
14
15 fn update(&mut self, left: Option<&Self>, right: Option<&Self>);
16}
17
18#[derive(Clone, Debug)]
19pub struct RopeTreapData<Inner: RopeData> {
20 inner: Inner,
21 num: usize,
22 rev_tag: bool,
23}
24
25impl<Inner: RopeData> RopeTreapData<Inner> {
26 fn new(data: Inner) -> Self {
27 Self {
28 inner: data,
29 num: 1,
30 rev_tag: false,
31 }
32 }
33}
34
35impl<Inner: RopeData> Deref for RopeTreapData<Inner> {
36 type Target = Inner;
37
38 fn deref(&self) -> &Self::Target {
39 &self.inner
40 }
41}
42
43impl<Inner: RopeData> TreapNodeData for RopeTreapData<Inner> {
44 type TagType = (bool, Option<Inner::TagType>);
45
46 fn get_tag(&self) -> Option<Self::TagType> {
47 match (self.rev_tag, self.inner.get_tag()) {
48 (false, None) => None,
49 other => Some(other),
50 }
51 }
52
53 fn reset_tag(&mut self) {
54 self.rev_tag = false;
55 self.inner.reset_tag();
56 }
57
58 fn add_tag(&mut self, tag: Self::TagType) -> NeedSwap {
59 self.rev_tag ^= tag.0;
60 if let Some(inner_tag) = tag.1 {
61 self.inner.add_tag(inner_tag) ^ tag.0
62 } else {
63 tag.0
64 }
65 }
66
67 fn update(&mut self, left: Option<&Self>, right: Option<&Self>) {
68 self.inner
69 .update(left.map(|x| &x.inner), right.map(|x| &x.inner));
70 self.num = left.map_or(0, |x| x.num) + right.map_or(0, |x| x.num) + 1;
71 }
72}
73
74pub trait RopeBase: Sized + Clone {
75 type InnerRopeData: RopeData;
76
77 #[must_use]
78 fn new(data: Self::InnerRopeData) -> Self;
79 #[must_use]
80 fn reverse(&self) -> Self;
81 #[must_use]
82 fn split(&self, num: usize) -> (Self, Self);
83 #[must_use]
84 fn merge(&self, other: &Self) -> Self;
85 #[must_use]
86 fn add_tag(&self, tag: <Self::InnerRopeData as RopeData>::TagType) -> Self;
87
88 fn root_data_ref(&self) -> Option<&Self::InnerRopeData>;
89 fn is_empty(&self) -> bool;
90 fn len(&self) -> usize;
91 fn for_each<F: FnMut(Self::InnerRopeData)>(&self, f: F);
92
93 #[must_use]
94 fn insert(&self, pos: usize, data: Self::InnerRopeData) -> Self {
95 let (left, right) = self.split(pos);
96 left.merge(&Self::new(data)).merge(&right)
97 }
98
99 #[must_use]
100 fn remove(&self, pos: usize) -> (Self, Option<Self::InnerRopeData>) {
101 if pos >= self.len() {
102 return (self.clone(), None);
103 }
104 let (left, right) = self.split(pos);
105 let (middle, right) = right.split(1);
106 (left.merge(&right), middle.get(0))
107 }
108
109 #[must_use]
110 fn push_back(&self, data: Self::InnerRopeData) -> Self {
111 self.insert(self.len(), data)
112 }
113
114 #[must_use]
115 fn push_front(&self, data: Self::InnerRopeData) -> Self {
116 self.insert(0, data)
117 }
118
119 fn get(&self, pos: usize) -> Option<Self::InnerRopeData> {
120 self.split(pos).1.split(1).0.root_data_ref().cloned()
121 }
122}
123
124pub trait TreapBasedRopeBase:
125 RopeBase
126 + Deref<Target = TreapTree<RopeTreapData<Self::InnerRopeData>>>
127 + From<TreapTree<RopeTreapData<Self::InnerRopeData>>>
128{
129 fn new_from_rng<R: FnMut() -> u64>(data: Self::InnerRopeData, rng: R) -> Self {
130 TreapTree::new_from_rng(RopeTreapData::new(data), rng).into()
131 }
132
133 fn insert_from_rng<R: FnMut() -> u64>(
134 &self,
135 pos: usize,
136 data: Self::InnerRopeData,
137 rng: R,
138 ) -> Self {
139 let (left, right) = self.split(pos);
140 left.merge(&Self::new_from_rng(data, rng)).merge(&right)
141 }
142
143 fn push_back_from_rng<R: FnMut() -> u64>(&self, data: Self::InnerRopeData, rng: R) -> Self {
144 self.insert_from_rng(self.len(), data, rng)
145 }
146
147 fn push_front_from_rng<R: FnMut() -> u64>(&self, data: Self::InnerRopeData, rng: R) -> Self {
148 self.insert_from_rng(0, data, rng)
149 }
150
151 fn query(&self, mut pos: usize) -> Option<Cow<'_, RopeTreapData<Self::InnerRopeData>>> {
152 self.deref().query(|node| {
153 let left_size = node
154 .get_left()
155 .deref()
156 .as_ref()
157 .map_or(0, |left| left.data.num);
158 let res = pos.cmp(&left_size);
159 if pos > left_size {
160 pos -= left_size + 1;
161 }
162 res
163 })
164 }
165}
166
167impl<
168 InnerRopeData: RopeData,
169 TreapBasedRope: From<TreapTree<RopeTreapData<InnerRopeData>>>
170 + Deref<Target = TreapTree<RopeTreapData<InnerRopeData>>>
171 + Clone,
172> TreapBasedRopeBase for TreapBasedRope
173{
174}
175impl<
176 InnerRopeData: RopeData,
177 TreapBasedRope: From<TreapTree<RopeTreapData<InnerRopeData>>>
178 + Deref<Target = TreapTree<RopeTreapData<InnerRopeData>>>
179 + Clone,
180> RopeBase for TreapBasedRope
181{
182 type InnerRopeData = InnerRopeData;
183
184 fn new(data: Self::InnerRopeData) -> Self {
185 TreapTree::new(RopeTreapData::new(data)).into()
186 }
187
188 fn is_empty(&self) -> bool {
189 self.is_none()
190 }
191
192 fn len(&self) -> usize {
193 self.deref().root_data_ref().map_or(0, |x| x.num)
194 }
195
196 fn for_each<F: FnMut(Self::InnerRopeData)>(&self, mut f: F) {
197 self.deref().for_each(&mut |x| f(x.inner))
198 }
199
200 fn reverse(&self) -> Self {
201 self.deref().add_tag((true, None)).into()
202 }
203
204 fn split(&self, mut num: usize) -> (Self, Self) {
205 let (u, v) = self.deref().split(|node| {
206 let to_left_num = node.get_left().deref().as_ref().map_or(0, |x| x.data.num) + 1;
207 if num >= to_left_num {
208 num -= to_left_num;
209 SplitTo::Left
210 } else {
211 SplitTo::Right
212 }
213 });
214 (u.into(), v.into())
215 }
216
217 fn merge(&self, other: &Self) -> Self {
218 self.deref().merge(other.deref()).into()
219 }
220
221 fn root_data_ref(&self) -> Option<&Self::InnerRopeData> {
222 self.deref().root_data_ref().map(|x| &x.inner)
223 }
224
225 fn add_tag(&self, tag: <Self::InnerRopeData as RopeData>::TagType) -> Self {
226 self.deref().add_tag((false, Some(tag))).into()
227 }
228}
229
230#[derive(Clone, Debug)]
231pub struct Rope<Inner: RopeData>(TreapTree<RopeTreapData<Inner>>);
232
233impl<Inner: RopeData> From<TreapTree<RopeTreapData<Inner>>> for Rope<Inner> {
234 fn from(value: TreapTree<RopeTreapData<Inner>>) -> Self {
235 Self(value)
236 }
237}
238
239impl<Inner: RopeData> Deref for Rope<Inner> {
240 type Target = TreapTree<RopeTreapData<Inner>>;
241
242 fn deref(&self) -> &Self::Target {
243 &self.0
244 }
245}
246
247impl<Inner: RopeData> Default for Rope<Inner> {
248 fn default() -> Self {
249 Self(Default::default())
250 }
251}
252
253#[derive(Clone, Debug, Default)]
254pub struct RopeUntaggedInner<T: Clone>(T);
255
256impl<T: Clone> RopeUntaggedInner<T> {
257 pub fn into_inner(self) -> T {
258 self.0
259 }
260}
261
262impl<T: Clone> Deref for RopeUntaggedInner<T> {
263 type Target = T;
264
265 fn deref(&self) -> &Self::Target {
266 &self.0
267 }
268}
269
270impl<T: Clone> From<T> for RopeUntaggedInner<T> {
271 fn from(value: T) -> Self {
272 Self(value)
273 }
274}
275
276impl<T: Clone> RopeData for RopeUntaggedInner<T> {
277 type TagType = ();
278 fn get_tag(&self) -> Option<Self::TagType> {
279 None
280 }
281 fn reset_tag(&mut self) {}
282 fn update(&mut self, _: Option<&Self>, _: Option<&Self>) {}
283 fn add_tag(&mut self, _: Self::TagType) -> NeedSwap {
284 false
285 }
286}
287
288pub type UntaggedRope<T> = Rope<RopeUntaggedInner<T>>;