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