Skip to main content

RangeMap

Struct RangeMap 

Source
pub struct RangeMap<K, V> {
    map: BTreeMap<(K, K), V>,
}
Expand description

A map to control intervals that have same values.

Fields§

§map: BTreeMap<(K, K), V>

Implementations§

Source§

impl<K, V> RangeMap<K, V>

Source

pub fn new() -> Self
where K: Ord,

Makes a new, empty RangeMap.

Examples found in repository?
crates/competitive/src/data_structure/range_map.rs (line 255)
254    fn from_iter<T: IntoIterator<Item = ((K, K), V)>>(iter: T) -> Self {
255        let mut map = Self::new();
256        map.extend(iter);
257        map
258    }
Source

pub fn clear(&mut self)
where K: Ord,

Clears the map, removing all elements.

Examples found in repository?
crates/competitive/src/data_structure/range_map.rs (line 289)
285    pub fn clear(&mut self)
286    where
287        T: Ord,
288    {
289        self.map.clear();
290    }
Source

pub fn contains_key(&self, key: &K) -> bool
where K: Clone + Ord,

Returns true if the map contains a value for the key.

Source

pub fn get(&self, key: &K) -> Option<&V>
where K: Clone + Ord,

Returns a reference to the value corresponding to the key.

Examples found in repository?
crates/competitive/src/data_structure/range_map.rs (line 41)
37    pub fn contains_key(&self, key: &K) -> bool
38    where
39        K: Clone + Ord,
40    {
41        self.get(key).is_some()
42    }
Source

pub fn get_range_value(&self, key: &K) -> Option<(&(K, K), &V)>
where K: Clone + Ord,

Returns the range-value pair corresponding to the key.

Examples found in repository?
crates/competitive/src/data_structure/range_map.rs (line 48)
44    pub fn get(&self, key: &K) -> Option<&V>
45    where
46        K: Clone + Ord,
47    {
48        self.get_range_value(key).map(|(_, v)| v)
49    }
50    /// Returns the range-value pair corresponding to the key.
51    pub fn get_range_value(&self, key: &K) -> Option<(&(K, K), &V)>
52    where
53        K: Clone + Ord,
54    {
55        self.get_right_if(key, |r, _| key == &r.0)
56            .or_else(|| self.get_left_if(key, |r, _| key < &r.1))
57    }
58    /// Inserts values into the specified range.
59    pub fn insert(&mut self, range: (K, K), value: V)
60    where
61        K: Clone + Ord,
62        V: Clone + Eq,
63    {
64        self.insert_with(range, value, |_, _| {});
65    }
66    /// Insert values and operate old range-value pairs.
67    pub fn insert_with<F>(&mut self, range: (K, K), value: V, mut f: F)
68    where
69        K: Clone + Ord,
70        V: Clone + Eq,
71        F: FnMut((K, K), V),
72    {
73        if range.0 >= range.1 {
74            return;
75        }
76        let mut ins_range = range.clone();
77        if let Some((r, v)) = self.pop_left_if(&range.0, |r, v| {
78            range.0 < r.1 || range.0 == r.1 && &value == v
79        }) {
80            if range.1 < r.1 {
81                if value == v {
82                    ins_range = r;
83                } else {
84                    self.map.insert((r.0, range.0.clone()), v.clone());
85                    self.map.insert((range.1.clone(), r.1), v.clone());
86                }
87                f(range.clone(), v);
88            } else {
89                if value == v {
90                    ins_range.0 = r.0;
91                } else {
92                    self.map.insert((r.0, range.0.clone()), v.clone());
93                }
94                if range.0 < r.1 {
95                    f((range.0.clone(), r.1), v);
96                }
97            }
98        }
99        let mut wait = None;
100        if let Some((r, _)) = self.pop_right_if(&range.1, |r, v| range.1 == r.0 && &value == v) {
101            ins_range.1 = r.1;
102        } else if let Some((r, v)) = self.pop_left_if(&range.1, |r, _| range.1 < r.1) {
103            if value == v {
104                ins_range.1 = r.1;
105            } else {
106                self.map.insert((range.1.clone(), r.1), v.clone());
107            }
108            wait = Some(((r.0, range.1.clone()), v));
109        }
110        let mut f = self.drain_with_inner(range, f);
111        if let Some((r, v)) = wait {
112            f(r, v);
113        }
114        self.map.insert(ins_range, value);
115    }
116    /// Remove values contained in the range.
117    pub fn remove(&mut self, range: (K, K))
118    where
119        K: Clone + Ord,
120        V: Clone,
121    {
122        self.drain_with(range, |_, _| {});
123    }
124    /// Get a left neighboring range of `[key, key)` if the predicate is satisfied.
125    pub fn get_left_if<F>(&self, key: &K, mut pred: F) -> Option<(&(K, K), &V)>
126    where
127        K: Clone + Ord,
128        F: FnMut(&(K, K), &V) -> bool,
129    {
130        self.map
131            .range(..(key.clone(), key.clone()))
132            .next_back()
133            .filter(|(r, v)| pred(r, v))
134    }
135    /// Get a right neighboring range of `[key, key)` if the predicate is satisfied.
136    pub fn get_right_if<F>(&self, key: &K, mut pred: F) -> Option<(&(K, K), &V)>
137    where
138        K: Clone + Ord,
139        F: FnMut(&(K, K), &V) -> bool,
140    {
141        self.map
142            .range((key.clone(), key.clone())..)
143            .next()
144            .filter(|(r, v)| pred(r, v))
145    }
146    /// Pop a left neighboring range of `[key, key)` if the predicate is satisfied.
147    pub fn pop_left_if<F>(&mut self, key: &K, pred: F) -> Option<((K, K), V)>
148    where
149        K: Clone + Ord,
150        F: FnMut(&(K, K), &V) -> bool,
151    {
152        match self.get_left_if(key, pred) {
153            Some((r, _)) => {
154                let r = r.clone();
155                let v = self.map.remove(&r).unwrap();
156                Some((r, v))
157            }
158            None => None,
159        }
160    }
161    /// Pop a right neighboring range of `[key, key)` if the predicate is satisfied.
162    pub fn pop_right_if<F>(&mut self, key: &K, pred: F) -> Option<((K, K), V)>
163    where
164        K: Clone + Ord,
165        F: FnMut(&(K, K), &V) -> bool,
166    {
167        match self.get_right_if(key, pred) {
168            Some((r, _)) => {
169                let r = r.clone();
170                let v = self.map.remove(&r).unwrap();
171                Some((r, v))
172            }
173            None => None,
174        }
175    }
176    /// Operate and consume range-value pairs in range when no overlapping.
177    fn drain_with_inner<F>(&mut self, range: (K, K), mut f: F) -> F
178    where
179        K: Clone + Ord,
180        F: FnMut((K, K), V),
181    {
182        while let Some((r, _)) = self
183            .map
184            .range((range.0.clone(), range.0.clone())..(range.1.clone(), range.1.clone()))
185            .next()
186        {
187            let r = r.clone();
188            let v = self.map.remove(&r).unwrap();
189            f(r, v);
190        }
191        f
192    }
193    /// Operate and consume range-value pairs in range.
194    pub fn drain_with<F>(&mut self, range: (K, K), mut f: F)
195    where
196        K: Clone + Ord,
197        V: Clone,
198        F: FnMut((K, K), V),
199    {
200        if range.0 >= range.1 {
201            return;
202        }
203        if let Some((r, v)) = self.pop_left_if(&range.0, |r, _| range.0 < r.1) {
204            if range.1 < r.1 {
205                f(range.clone(), v.clone());
206                self.map.insert((range.1.clone(), r.1), v.clone());
207            } else {
208                f((range.0.clone(), r.1), v.clone());
209            }
210            self.map.insert((r.0, range.0.clone()), v);
211        }
212        let mut wait = None;
213        if let Some((r, v)) = self.pop_left_if(&range.1, |r, _| range.1 < r.1) {
214            wait = Some(((r.0, range.1.clone()), v.clone()));
215            self.map.insert((range.1.clone(), r.1), v);
216        }
217        let mut f = self.drain_with_inner(range, f);
218        if let Some((r, v)) = wait {
219            f(r, v);
220        }
221    }
222    pub fn iter(&self) -> btree_map::Iter<'_, (K, K), V> {
223        self.map.iter()
224    }
225    pub fn iter_mut(&mut self) -> btree_map::IterMut<'_, (K, K), V> {
226        self.map.iter_mut()
227    }
228    pub fn keys(&self) -> btree_map::Keys<'_, (K, K), V> {
229        self.map.keys()
230    }
231    pub fn values(&self) -> btree_map::Values<'_, (K, K), V> {
232        self.map.values()
233    }
234    pub fn values_mut(&mut self) -> btree_map::ValuesMut<'_, (K, K), V> {
235        self.map.values_mut()
236    }
237}
238impl<K, V> Extend<((K, K), V)> for RangeMap<K, V>
239where
240    K: Clone + Ord,
241    V: Clone + Eq,
242{
243    fn extend<T: IntoIterator<Item = ((K, K), V)>>(&mut self, iter: T) {
244        for (range, value) in iter {
245            self.insert(range, value);
246        }
247    }
248}
249impl<K, V> FromIterator<((K, K), V)> for RangeMap<K, V>
250where
251    K: Clone + Ord,
252    V: Clone + Eq,
253{
254    fn from_iter<T: IntoIterator<Item = ((K, K), V)>>(iter: T) -> Self {
255        let mut map = Self::new();
256        map.extend(iter);
257        map
258    }
259}
260
261/// A set to control intervals.
262#[derive(Debug, Clone)]
263pub struct RangeSet<T> {
264    map: RangeMap<T, ()>,
265}
266impl<T> Default for RangeSet<T>
267where
268    T: Ord,
269{
270    fn default() -> Self {
271        Self {
272            map: Default::default(),
273        }
274    }
275}
276impl<T> RangeSet<T> {
277    /// Makes a new, empty `RangeSet`.
278    pub fn new() -> Self
279    where
280        T: Ord,
281    {
282        Default::default()
283    }
284    /// Clears the set, removing all elements.
285    pub fn clear(&mut self)
286    where
287        T: Ord,
288    {
289        self.map.clear();
290    }
291    /// Returns true if the set contains a key.
292    pub fn contains(&self, key: &T) -> bool
293    where
294        T: Clone + Ord,
295    {
296        self.get_range(key).is_some()
297    }
298    /// Returns the range corresponding to the key.
299    pub fn get_range(&self, key: &T) -> Option<&(T, T)>
300    where
301        T: Clone + Ord,
302    {
303        self.map.get_range_value(key).map(|(r, _)| r)
304    }
Source

pub fn insert(&mut self, range: (K, K), value: V)
where K: Clone + Ord, V: Clone + Eq,

Inserts values into the specified range.

Examples found in repository?
crates/competitive/src/data_structure/range_map.rs (line 245)
243    fn extend<T: IntoIterator<Item = ((K, K), V)>>(&mut self, iter: T) {
244        for (range, value) in iter {
245            self.insert(range, value);
246        }
247    }
Source

pub fn insert_with<F>(&mut self, range: (K, K), value: V, f: F)
where K: Clone + Ord, V: Clone + Eq, F: FnMut((K, K), V),

Insert values and operate old range-value pairs.

Examples found in repository?
crates/competitive/src/data_structure/range_map.rs (line 64)
59    pub fn insert(&mut self, range: (K, K), value: V)
60    where
61        K: Clone + Ord,
62        V: Clone + Eq,
63    {
64        self.insert_with(range, value, |_, _| {});
65    }
66    /// Insert values and operate old range-value pairs.
67    pub fn insert_with<F>(&mut self, range: (K, K), value: V, mut f: F)
68    where
69        K: Clone + Ord,
70        V: Clone + Eq,
71        F: FnMut((K, K), V),
72    {
73        if range.0 >= range.1 {
74            return;
75        }
76        let mut ins_range = range.clone();
77        if let Some((r, v)) = self.pop_left_if(&range.0, |r, v| {
78            range.0 < r.1 || range.0 == r.1 && &value == v
79        }) {
80            if range.1 < r.1 {
81                if value == v {
82                    ins_range = r;
83                } else {
84                    self.map.insert((r.0, range.0.clone()), v.clone());
85                    self.map.insert((range.1.clone(), r.1), v.clone());
86                }
87                f(range.clone(), v);
88            } else {
89                if value == v {
90                    ins_range.0 = r.0;
91                } else {
92                    self.map.insert((r.0, range.0.clone()), v.clone());
93                }
94                if range.0 < r.1 {
95                    f((range.0.clone(), r.1), v);
96                }
97            }
98        }
99        let mut wait = None;
100        if let Some((r, _)) = self.pop_right_if(&range.1, |r, v| range.1 == r.0 && &value == v) {
101            ins_range.1 = r.1;
102        } else if let Some((r, v)) = self.pop_left_if(&range.1, |r, _| range.1 < r.1) {
103            if value == v {
104                ins_range.1 = r.1;
105            } else {
106                self.map.insert((range.1.clone(), r.1), v.clone());
107            }
108            wait = Some(((r.0, range.1.clone()), v));
109        }
110        let mut f = self.drain_with_inner(range, f);
111        if let Some((r, v)) = wait {
112            f(r, v);
113        }
114        self.map.insert(ins_range, value);
115    }
116    /// Remove values contained in the range.
117    pub fn remove(&mut self, range: (K, K))
118    where
119        K: Clone + Ord,
120        V: Clone,
121    {
122        self.drain_with(range, |_, _| {});
123    }
124    /// Get a left neighboring range of `[key, key)` if the predicate is satisfied.
125    pub fn get_left_if<F>(&self, key: &K, mut pred: F) -> Option<(&(K, K), &V)>
126    where
127        K: Clone + Ord,
128        F: FnMut(&(K, K), &V) -> bool,
129    {
130        self.map
131            .range(..(key.clone(), key.clone()))
132            .next_back()
133            .filter(|(r, v)| pred(r, v))
134    }
135    /// Get a right neighboring range of `[key, key)` if the predicate is satisfied.
136    pub fn get_right_if<F>(&self, key: &K, mut pred: F) -> Option<(&(K, K), &V)>
137    where
138        K: Clone + Ord,
139        F: FnMut(&(K, K), &V) -> bool,
140    {
141        self.map
142            .range((key.clone(), key.clone())..)
143            .next()
144            .filter(|(r, v)| pred(r, v))
145    }
146    /// Pop a left neighboring range of `[key, key)` if the predicate is satisfied.
147    pub fn pop_left_if<F>(&mut self, key: &K, pred: F) -> Option<((K, K), V)>
148    where
149        K: Clone + Ord,
150        F: FnMut(&(K, K), &V) -> bool,
151    {
152        match self.get_left_if(key, pred) {
153            Some((r, _)) => {
154                let r = r.clone();
155                let v = self.map.remove(&r).unwrap();
156                Some((r, v))
157            }
158            None => None,
159        }
160    }
161    /// Pop a right neighboring range of `[key, key)` if the predicate is satisfied.
162    pub fn pop_right_if<F>(&mut self, key: &K, pred: F) -> Option<((K, K), V)>
163    where
164        K: Clone + Ord,
165        F: FnMut(&(K, K), &V) -> bool,
166    {
167        match self.get_right_if(key, pred) {
168            Some((r, _)) => {
169                let r = r.clone();
170                let v = self.map.remove(&r).unwrap();
171                Some((r, v))
172            }
173            None => None,
174        }
175    }
176    /// Operate and consume range-value pairs in range when no overlapping.
177    fn drain_with_inner<F>(&mut self, range: (K, K), mut f: F) -> F
178    where
179        K: Clone + Ord,
180        F: FnMut((K, K), V),
181    {
182        while let Some((r, _)) = self
183            .map
184            .range((range.0.clone(), range.0.clone())..(range.1.clone(), range.1.clone()))
185            .next()
186        {
187            let r = r.clone();
188            let v = self.map.remove(&r).unwrap();
189            f(r, v);
190        }
191        f
192    }
193    /// Operate and consume range-value pairs in range.
194    pub fn drain_with<F>(&mut self, range: (K, K), mut f: F)
195    where
196        K: Clone + Ord,
197        V: Clone,
198        F: FnMut((K, K), V),
199    {
200        if range.0 >= range.1 {
201            return;
202        }
203        if let Some((r, v)) = self.pop_left_if(&range.0, |r, _| range.0 < r.1) {
204            if range.1 < r.1 {
205                f(range.clone(), v.clone());
206                self.map.insert((range.1.clone(), r.1), v.clone());
207            } else {
208                f((range.0.clone(), r.1), v.clone());
209            }
210            self.map.insert((r.0, range.0.clone()), v);
211        }
212        let mut wait = None;
213        if let Some((r, v)) = self.pop_left_if(&range.1, |r, _| range.1 < r.1) {
214            wait = Some(((r.0, range.1.clone()), v.clone()));
215            self.map.insert((range.1.clone(), r.1), v);
216        }
217        let mut f = self.drain_with_inner(range, f);
218        if let Some((r, v)) = wait {
219            f(r, v);
220        }
221    }
222    pub fn iter(&self) -> btree_map::Iter<'_, (K, K), V> {
223        self.map.iter()
224    }
225    pub fn iter_mut(&mut self) -> btree_map::IterMut<'_, (K, K), V> {
226        self.map.iter_mut()
227    }
228    pub fn keys(&self) -> btree_map::Keys<'_, (K, K), V> {
229        self.map.keys()
230    }
231    pub fn values(&self) -> btree_map::Values<'_, (K, K), V> {
232        self.map.values()
233    }
234    pub fn values_mut(&mut self) -> btree_map::ValuesMut<'_, (K, K), V> {
235        self.map.values_mut()
236    }
237}
238impl<K, V> Extend<((K, K), V)> for RangeMap<K, V>
239where
240    K: Clone + Ord,
241    V: Clone + Eq,
242{
243    fn extend<T: IntoIterator<Item = ((K, K), V)>>(&mut self, iter: T) {
244        for (range, value) in iter {
245            self.insert(range, value);
246        }
247    }
248}
249impl<K, V> FromIterator<((K, K), V)> for RangeMap<K, V>
250where
251    K: Clone + Ord,
252    V: Clone + Eq,
253{
254    fn from_iter<T: IntoIterator<Item = ((K, K), V)>>(iter: T) -> Self {
255        let mut map = Self::new();
256        map.extend(iter);
257        map
258    }
259}
260
261/// A set to control intervals.
262#[derive(Debug, Clone)]
263pub struct RangeSet<T> {
264    map: RangeMap<T, ()>,
265}
266impl<T> Default for RangeSet<T>
267where
268    T: Ord,
269{
270    fn default() -> Self {
271        Self {
272            map: Default::default(),
273        }
274    }
275}
276impl<T> RangeSet<T> {
277    /// Makes a new, empty `RangeSet`.
278    pub fn new() -> Self
279    where
280        T: Ord,
281    {
282        Default::default()
283    }
284    /// Clears the set, removing all elements.
285    pub fn clear(&mut self)
286    where
287        T: Ord,
288    {
289        self.map.clear();
290    }
291    /// Returns true if the set contains a key.
292    pub fn contains(&self, key: &T) -> bool
293    where
294        T: Clone + Ord,
295    {
296        self.get_range(key).is_some()
297    }
298    /// Returns the range corresponding to the key.
299    pub fn get_range(&self, key: &T) -> Option<&(T, T)>
300    where
301        T: Clone + Ord,
302    {
303        self.map.get_range_value(key).map(|(r, _)| r)
304    }
305    /// Inserts into the specified range.
306    pub fn insert(&mut self, range: (T, T))
307    where
308        T: Clone + Ord,
309    {
310        self.insert_with(range, |_| {});
311    }
312    /// Insert and operate old range.
313    pub fn insert_with<F>(&mut self, range: (T, T), mut f: F)
314    where
315        T: Clone + Ord,
316        F: FnMut((T, T)),
317    {
318        self.map.insert_with(range, (), |r, _| f(r))
319    }
Source

pub fn remove(&mut self, range: (K, K))
where K: Clone + Ord, V: Clone,

Remove values contained in the range.

Source

pub fn get_left_if<F>(&self, key: &K, pred: F) -> Option<(&(K, K), &V)>
where K: Clone + Ord, F: FnMut(&(K, K), &V) -> bool,

Get a left neighboring range of [key, key) if the predicate is satisfied.

Examples found in repository?
crates/competitive/src/data_structure/range_map.rs (line 56)
51    pub fn get_range_value(&self, key: &K) -> Option<(&(K, K), &V)>
52    where
53        K: Clone + Ord,
54    {
55        self.get_right_if(key, |r, _| key == &r.0)
56            .or_else(|| self.get_left_if(key, |r, _| key < &r.1))
57    }
58    /// Inserts values into the specified range.
59    pub fn insert(&mut self, range: (K, K), value: V)
60    where
61        K: Clone + Ord,
62        V: Clone + Eq,
63    {
64        self.insert_with(range, value, |_, _| {});
65    }
66    /// Insert values and operate old range-value pairs.
67    pub fn insert_with<F>(&mut self, range: (K, K), value: V, mut f: F)
68    where
69        K: Clone + Ord,
70        V: Clone + Eq,
71        F: FnMut((K, K), V),
72    {
73        if range.0 >= range.1 {
74            return;
75        }
76        let mut ins_range = range.clone();
77        if let Some((r, v)) = self.pop_left_if(&range.0, |r, v| {
78            range.0 < r.1 || range.0 == r.1 && &value == v
79        }) {
80            if range.1 < r.1 {
81                if value == v {
82                    ins_range = r;
83                } else {
84                    self.map.insert((r.0, range.0.clone()), v.clone());
85                    self.map.insert((range.1.clone(), r.1), v.clone());
86                }
87                f(range.clone(), v);
88            } else {
89                if value == v {
90                    ins_range.0 = r.0;
91                } else {
92                    self.map.insert((r.0, range.0.clone()), v.clone());
93                }
94                if range.0 < r.1 {
95                    f((range.0.clone(), r.1), v);
96                }
97            }
98        }
99        let mut wait = None;
100        if let Some((r, _)) = self.pop_right_if(&range.1, |r, v| range.1 == r.0 && &value == v) {
101            ins_range.1 = r.1;
102        } else if let Some((r, v)) = self.pop_left_if(&range.1, |r, _| range.1 < r.1) {
103            if value == v {
104                ins_range.1 = r.1;
105            } else {
106                self.map.insert((range.1.clone(), r.1), v.clone());
107            }
108            wait = Some(((r.0, range.1.clone()), v));
109        }
110        let mut f = self.drain_with_inner(range, f);
111        if let Some((r, v)) = wait {
112            f(r, v);
113        }
114        self.map.insert(ins_range, value);
115    }
116    /// Remove values contained in the range.
117    pub fn remove(&mut self, range: (K, K))
118    where
119        K: Clone + Ord,
120        V: Clone,
121    {
122        self.drain_with(range, |_, _| {});
123    }
124    /// Get a left neighboring range of `[key, key)` if the predicate is satisfied.
125    pub fn get_left_if<F>(&self, key: &K, mut pred: F) -> Option<(&(K, K), &V)>
126    where
127        K: Clone + Ord,
128        F: FnMut(&(K, K), &V) -> bool,
129    {
130        self.map
131            .range(..(key.clone(), key.clone()))
132            .next_back()
133            .filter(|(r, v)| pred(r, v))
134    }
135    /// Get a right neighboring range of `[key, key)` if the predicate is satisfied.
136    pub fn get_right_if<F>(&self, key: &K, mut pred: F) -> Option<(&(K, K), &V)>
137    where
138        K: Clone + Ord,
139        F: FnMut(&(K, K), &V) -> bool,
140    {
141        self.map
142            .range((key.clone(), key.clone())..)
143            .next()
144            .filter(|(r, v)| pred(r, v))
145    }
146    /// Pop a left neighboring range of `[key, key)` if the predicate is satisfied.
147    pub fn pop_left_if<F>(&mut self, key: &K, pred: F) -> Option<((K, K), V)>
148    where
149        K: Clone + Ord,
150        F: FnMut(&(K, K), &V) -> bool,
151    {
152        match self.get_left_if(key, pred) {
153            Some((r, _)) => {
154                let r = r.clone();
155                let v = self.map.remove(&r).unwrap();
156                Some((r, v))
157            }
158            None => None,
159        }
160    }
161    /// Pop a right neighboring range of `[key, key)` if the predicate is satisfied.
162    pub fn pop_right_if<F>(&mut self, key: &K, pred: F) -> Option<((K, K), V)>
163    where
164        K: Clone + Ord,
165        F: FnMut(&(K, K), &V) -> bool,
166    {
167        match self.get_right_if(key, pred) {
168            Some((r, _)) => {
169                let r = r.clone();
170                let v = self.map.remove(&r).unwrap();
171                Some((r, v))
172            }
173            None => None,
174        }
175    }
176    /// Operate and consume range-value pairs in range when no overlapping.
177    fn drain_with_inner<F>(&mut self, range: (K, K), mut f: F) -> F
178    where
179        K: Clone + Ord,
180        F: FnMut((K, K), V),
181    {
182        while let Some((r, _)) = self
183            .map
184            .range((range.0.clone(), range.0.clone())..(range.1.clone(), range.1.clone()))
185            .next()
186        {
187            let r = r.clone();
188            let v = self.map.remove(&r).unwrap();
189            f(r, v);
190        }
191        f
192    }
193    /// Operate and consume range-value pairs in range.
194    pub fn drain_with<F>(&mut self, range: (K, K), mut f: F)
195    where
196        K: Clone + Ord,
197        V: Clone,
198        F: FnMut((K, K), V),
199    {
200        if range.0 >= range.1 {
201            return;
202        }
203        if let Some((r, v)) = self.pop_left_if(&range.0, |r, _| range.0 < r.1) {
204            if range.1 < r.1 {
205                f(range.clone(), v.clone());
206                self.map.insert((range.1.clone(), r.1), v.clone());
207            } else {
208                f((range.0.clone(), r.1), v.clone());
209            }
210            self.map.insert((r.0, range.0.clone()), v);
211        }
212        let mut wait = None;
213        if let Some((r, v)) = self.pop_left_if(&range.1, |r, _| range.1 < r.1) {
214            wait = Some(((r.0, range.1.clone()), v.clone()));
215            self.map.insert((range.1.clone(), r.1), v);
216        }
217        let mut f = self.drain_with_inner(range, f);
218        if let Some((r, v)) = wait {
219            f(r, v);
220        }
221    }
222    pub fn iter(&self) -> btree_map::Iter<'_, (K, K), V> {
223        self.map.iter()
224    }
225    pub fn iter_mut(&mut self) -> btree_map::IterMut<'_, (K, K), V> {
226        self.map.iter_mut()
227    }
228    pub fn keys(&self) -> btree_map::Keys<'_, (K, K), V> {
229        self.map.keys()
230    }
231    pub fn values(&self) -> btree_map::Values<'_, (K, K), V> {
232        self.map.values()
233    }
234    pub fn values_mut(&mut self) -> btree_map::ValuesMut<'_, (K, K), V> {
235        self.map.values_mut()
236    }
237}
238impl<K, V> Extend<((K, K), V)> for RangeMap<K, V>
239where
240    K: Clone + Ord,
241    V: Clone + Eq,
242{
243    fn extend<T: IntoIterator<Item = ((K, K), V)>>(&mut self, iter: T) {
244        for (range, value) in iter {
245            self.insert(range, value);
246        }
247    }
248}
249impl<K, V> FromIterator<((K, K), V)> for RangeMap<K, V>
250where
251    K: Clone + Ord,
252    V: Clone + Eq,
253{
254    fn from_iter<T: IntoIterator<Item = ((K, K), V)>>(iter: T) -> Self {
255        let mut map = Self::new();
256        map.extend(iter);
257        map
258    }
259}
260
261/// A set to control intervals.
262#[derive(Debug, Clone)]
263pub struct RangeSet<T> {
264    map: RangeMap<T, ()>,
265}
266impl<T> Default for RangeSet<T>
267where
268    T: Ord,
269{
270    fn default() -> Self {
271        Self {
272            map: Default::default(),
273        }
274    }
275}
276impl<T> RangeSet<T> {
277    /// Makes a new, empty `RangeSet`.
278    pub fn new() -> Self
279    where
280        T: Ord,
281    {
282        Default::default()
283    }
284    /// Clears the set, removing all elements.
285    pub fn clear(&mut self)
286    where
287        T: Ord,
288    {
289        self.map.clear();
290    }
291    /// Returns true if the set contains a key.
292    pub fn contains(&self, key: &T) -> bool
293    where
294        T: Clone + Ord,
295    {
296        self.get_range(key).is_some()
297    }
298    /// Returns the range corresponding to the key.
299    pub fn get_range(&self, key: &T) -> Option<&(T, T)>
300    where
301        T: Clone + Ord,
302    {
303        self.map.get_range_value(key).map(|(r, _)| r)
304    }
305    /// Inserts into the specified range.
306    pub fn insert(&mut self, range: (T, T))
307    where
308        T: Clone + Ord,
309    {
310        self.insert_with(range, |_| {});
311    }
312    /// Insert and operate old range.
313    pub fn insert_with<F>(&mut self, range: (T, T), mut f: F)
314    where
315        T: Clone + Ord,
316        F: FnMut((T, T)),
317    {
318        self.map.insert_with(range, (), |r, _| f(r))
319    }
320    /// Remove items contained in the range.
321    pub fn remove(&mut self, range: (T, T))
322    where
323        T: Clone + Ord,
324    {
325        self.drain_with(range, |_| {});
326    }
327    /// Get a left neighboring range of `[key, key)` if the predicate is satisfied.
328    pub fn get_left_if<F>(&self, key: &T, mut pred: F) -> Option<&(T, T)>
329    where
330        T: Clone + Ord,
331        F: FnMut(&(T, T)) -> bool,
332    {
333        self.map.get_left_if(key, |r, _| pred(r)).map(|(r, _)| r)
334    }
Source

pub fn get_right_if<F>(&self, key: &K, pred: F) -> Option<(&(K, K), &V)>
where K: Clone + Ord, F: FnMut(&(K, K), &V) -> bool,

Get a right neighboring range of [key, key) if the predicate is satisfied.

Examples found in repository?
crates/competitive/src/data_structure/range_map.rs (line 55)
51    pub fn get_range_value(&self, key: &K) -> Option<(&(K, K), &V)>
52    where
53        K: Clone + Ord,
54    {
55        self.get_right_if(key, |r, _| key == &r.0)
56            .or_else(|| self.get_left_if(key, |r, _| key < &r.1))
57    }
58    /// Inserts values into the specified range.
59    pub fn insert(&mut self, range: (K, K), value: V)
60    where
61        K: Clone + Ord,
62        V: Clone + Eq,
63    {
64        self.insert_with(range, value, |_, _| {});
65    }
66    /// Insert values and operate old range-value pairs.
67    pub fn insert_with<F>(&mut self, range: (K, K), value: V, mut f: F)
68    where
69        K: Clone + Ord,
70        V: Clone + Eq,
71        F: FnMut((K, K), V),
72    {
73        if range.0 >= range.1 {
74            return;
75        }
76        let mut ins_range = range.clone();
77        if let Some((r, v)) = self.pop_left_if(&range.0, |r, v| {
78            range.0 < r.1 || range.0 == r.1 && &value == v
79        }) {
80            if range.1 < r.1 {
81                if value == v {
82                    ins_range = r;
83                } else {
84                    self.map.insert((r.0, range.0.clone()), v.clone());
85                    self.map.insert((range.1.clone(), r.1), v.clone());
86                }
87                f(range.clone(), v);
88            } else {
89                if value == v {
90                    ins_range.0 = r.0;
91                } else {
92                    self.map.insert((r.0, range.0.clone()), v.clone());
93                }
94                if range.0 < r.1 {
95                    f((range.0.clone(), r.1), v);
96                }
97            }
98        }
99        let mut wait = None;
100        if let Some((r, _)) = self.pop_right_if(&range.1, |r, v| range.1 == r.0 && &value == v) {
101            ins_range.1 = r.1;
102        } else if let Some((r, v)) = self.pop_left_if(&range.1, |r, _| range.1 < r.1) {
103            if value == v {
104                ins_range.1 = r.1;
105            } else {
106                self.map.insert((range.1.clone(), r.1), v.clone());
107            }
108            wait = Some(((r.0, range.1.clone()), v));
109        }
110        let mut f = self.drain_with_inner(range, f);
111        if let Some((r, v)) = wait {
112            f(r, v);
113        }
114        self.map.insert(ins_range, value);
115    }
116    /// Remove values contained in the range.
117    pub fn remove(&mut self, range: (K, K))
118    where
119        K: Clone + Ord,
120        V: Clone,
121    {
122        self.drain_with(range, |_, _| {});
123    }
124    /// Get a left neighboring range of `[key, key)` if the predicate is satisfied.
125    pub fn get_left_if<F>(&self, key: &K, mut pred: F) -> Option<(&(K, K), &V)>
126    where
127        K: Clone + Ord,
128        F: FnMut(&(K, K), &V) -> bool,
129    {
130        self.map
131            .range(..(key.clone(), key.clone()))
132            .next_back()
133            .filter(|(r, v)| pred(r, v))
134    }
135    /// Get a right neighboring range of `[key, key)` if the predicate is satisfied.
136    pub fn get_right_if<F>(&self, key: &K, mut pred: F) -> Option<(&(K, K), &V)>
137    where
138        K: Clone + Ord,
139        F: FnMut(&(K, K), &V) -> bool,
140    {
141        self.map
142            .range((key.clone(), key.clone())..)
143            .next()
144            .filter(|(r, v)| pred(r, v))
145    }
146    /// Pop a left neighboring range of `[key, key)` if the predicate is satisfied.
147    pub fn pop_left_if<F>(&mut self, key: &K, pred: F) -> Option<((K, K), V)>
148    where
149        K: Clone + Ord,
150        F: FnMut(&(K, K), &V) -> bool,
151    {
152        match self.get_left_if(key, pred) {
153            Some((r, _)) => {
154                let r = r.clone();
155                let v = self.map.remove(&r).unwrap();
156                Some((r, v))
157            }
158            None => None,
159        }
160    }
161    /// Pop a right neighboring range of `[key, key)` if the predicate is satisfied.
162    pub fn pop_right_if<F>(&mut self, key: &K, pred: F) -> Option<((K, K), V)>
163    where
164        K: Clone + Ord,
165        F: FnMut(&(K, K), &V) -> bool,
166    {
167        match self.get_right_if(key, pred) {
168            Some((r, _)) => {
169                let r = r.clone();
170                let v = self.map.remove(&r).unwrap();
171                Some((r, v))
172            }
173            None => None,
174        }
175    }
176    /// Operate and consume range-value pairs in range when no overlapping.
177    fn drain_with_inner<F>(&mut self, range: (K, K), mut f: F) -> F
178    where
179        K: Clone + Ord,
180        F: FnMut((K, K), V),
181    {
182        while let Some((r, _)) = self
183            .map
184            .range((range.0.clone(), range.0.clone())..(range.1.clone(), range.1.clone()))
185            .next()
186        {
187            let r = r.clone();
188            let v = self.map.remove(&r).unwrap();
189            f(r, v);
190        }
191        f
192    }
193    /// Operate and consume range-value pairs in range.
194    pub fn drain_with<F>(&mut self, range: (K, K), mut f: F)
195    where
196        K: Clone + Ord,
197        V: Clone,
198        F: FnMut((K, K), V),
199    {
200        if range.0 >= range.1 {
201            return;
202        }
203        if let Some((r, v)) = self.pop_left_if(&range.0, |r, _| range.0 < r.1) {
204            if range.1 < r.1 {
205                f(range.clone(), v.clone());
206                self.map.insert((range.1.clone(), r.1), v.clone());
207            } else {
208                f((range.0.clone(), r.1), v.clone());
209            }
210            self.map.insert((r.0, range.0.clone()), v);
211        }
212        let mut wait = None;
213        if let Some((r, v)) = self.pop_left_if(&range.1, |r, _| range.1 < r.1) {
214            wait = Some(((r.0, range.1.clone()), v.clone()));
215            self.map.insert((range.1.clone(), r.1), v);
216        }
217        let mut f = self.drain_with_inner(range, f);
218        if let Some((r, v)) = wait {
219            f(r, v);
220        }
221    }
222    pub fn iter(&self) -> btree_map::Iter<'_, (K, K), V> {
223        self.map.iter()
224    }
225    pub fn iter_mut(&mut self) -> btree_map::IterMut<'_, (K, K), V> {
226        self.map.iter_mut()
227    }
228    pub fn keys(&self) -> btree_map::Keys<'_, (K, K), V> {
229        self.map.keys()
230    }
231    pub fn values(&self) -> btree_map::Values<'_, (K, K), V> {
232        self.map.values()
233    }
234    pub fn values_mut(&mut self) -> btree_map::ValuesMut<'_, (K, K), V> {
235        self.map.values_mut()
236    }
237}
238impl<K, V> Extend<((K, K), V)> for RangeMap<K, V>
239where
240    K: Clone + Ord,
241    V: Clone + Eq,
242{
243    fn extend<T: IntoIterator<Item = ((K, K), V)>>(&mut self, iter: T) {
244        for (range, value) in iter {
245            self.insert(range, value);
246        }
247    }
248}
249impl<K, V> FromIterator<((K, K), V)> for RangeMap<K, V>
250where
251    K: Clone + Ord,
252    V: Clone + Eq,
253{
254    fn from_iter<T: IntoIterator<Item = ((K, K), V)>>(iter: T) -> Self {
255        let mut map = Self::new();
256        map.extend(iter);
257        map
258    }
259}
260
261/// A set to control intervals.
262#[derive(Debug, Clone)]
263pub struct RangeSet<T> {
264    map: RangeMap<T, ()>,
265}
266impl<T> Default for RangeSet<T>
267where
268    T: Ord,
269{
270    fn default() -> Self {
271        Self {
272            map: Default::default(),
273        }
274    }
275}
276impl<T> RangeSet<T> {
277    /// Makes a new, empty `RangeSet`.
278    pub fn new() -> Self
279    where
280        T: Ord,
281    {
282        Default::default()
283    }
284    /// Clears the set, removing all elements.
285    pub fn clear(&mut self)
286    where
287        T: Ord,
288    {
289        self.map.clear();
290    }
291    /// Returns true if the set contains a key.
292    pub fn contains(&self, key: &T) -> bool
293    where
294        T: Clone + Ord,
295    {
296        self.get_range(key).is_some()
297    }
298    /// Returns the range corresponding to the key.
299    pub fn get_range(&self, key: &T) -> Option<&(T, T)>
300    where
301        T: Clone + Ord,
302    {
303        self.map.get_range_value(key).map(|(r, _)| r)
304    }
305    /// Inserts into the specified range.
306    pub fn insert(&mut self, range: (T, T))
307    where
308        T: Clone + Ord,
309    {
310        self.insert_with(range, |_| {});
311    }
312    /// Insert and operate old range.
313    pub fn insert_with<F>(&mut self, range: (T, T), mut f: F)
314    where
315        T: Clone + Ord,
316        F: FnMut((T, T)),
317    {
318        self.map.insert_with(range, (), |r, _| f(r))
319    }
320    /// Remove items contained in the range.
321    pub fn remove(&mut self, range: (T, T))
322    where
323        T: Clone + Ord,
324    {
325        self.drain_with(range, |_| {});
326    }
327    /// Get a left neighboring range of `[key, key)` if the predicate is satisfied.
328    pub fn get_left_if<F>(&self, key: &T, mut pred: F) -> Option<&(T, T)>
329    where
330        T: Clone + Ord,
331        F: FnMut(&(T, T)) -> bool,
332    {
333        self.map.get_left_if(key, |r, _| pred(r)).map(|(r, _)| r)
334    }
335    /// Get a right neighboring range of `[key, key)` if the predicate is satisfied.
336    pub fn get_right_if<F>(&self, key: &T, mut pred: F) -> Option<&(T, T)>
337    where
338        T: Clone + Ord,
339        F: FnMut(&(T, T)) -> bool,
340    {
341        self.map.get_right_if(key, |r, _| pred(r)).map(|(r, _)| r)
342    }
Source

pub fn pop_left_if<F>(&mut self, key: &K, pred: F) -> Option<((K, K), V)>
where K: Clone + Ord, F: FnMut(&(K, K), &V) -> bool,

Pop a left neighboring range of [key, key) if the predicate is satisfied.

Examples found in repository?
crates/competitive/src/data_structure/range_map.rs (lines 77-79)
67    pub fn insert_with<F>(&mut self, range: (K, K), value: V, mut f: F)
68    where
69        K: Clone + Ord,
70        V: Clone + Eq,
71        F: FnMut((K, K), V),
72    {
73        if range.0 >= range.1 {
74            return;
75        }
76        let mut ins_range = range.clone();
77        if let Some((r, v)) = self.pop_left_if(&range.0, |r, v| {
78            range.0 < r.1 || range.0 == r.1 && &value == v
79        }) {
80            if range.1 < r.1 {
81                if value == v {
82                    ins_range = r;
83                } else {
84                    self.map.insert((r.0, range.0.clone()), v.clone());
85                    self.map.insert((range.1.clone(), r.1), v.clone());
86                }
87                f(range.clone(), v);
88            } else {
89                if value == v {
90                    ins_range.0 = r.0;
91                } else {
92                    self.map.insert((r.0, range.0.clone()), v.clone());
93                }
94                if range.0 < r.1 {
95                    f((range.0.clone(), r.1), v);
96                }
97            }
98        }
99        let mut wait = None;
100        if let Some((r, _)) = self.pop_right_if(&range.1, |r, v| range.1 == r.0 && &value == v) {
101            ins_range.1 = r.1;
102        } else if let Some((r, v)) = self.pop_left_if(&range.1, |r, _| range.1 < r.1) {
103            if value == v {
104                ins_range.1 = r.1;
105            } else {
106                self.map.insert((range.1.clone(), r.1), v.clone());
107            }
108            wait = Some(((r.0, range.1.clone()), v));
109        }
110        let mut f = self.drain_with_inner(range, f);
111        if let Some((r, v)) = wait {
112            f(r, v);
113        }
114        self.map.insert(ins_range, value);
115    }
116    /// Remove values contained in the range.
117    pub fn remove(&mut self, range: (K, K))
118    where
119        K: Clone + Ord,
120        V: Clone,
121    {
122        self.drain_with(range, |_, _| {});
123    }
124    /// Get a left neighboring range of `[key, key)` if the predicate is satisfied.
125    pub fn get_left_if<F>(&self, key: &K, mut pred: F) -> Option<(&(K, K), &V)>
126    where
127        K: Clone + Ord,
128        F: FnMut(&(K, K), &V) -> bool,
129    {
130        self.map
131            .range(..(key.clone(), key.clone()))
132            .next_back()
133            .filter(|(r, v)| pred(r, v))
134    }
135    /// Get a right neighboring range of `[key, key)` if the predicate is satisfied.
136    pub fn get_right_if<F>(&self, key: &K, mut pred: F) -> Option<(&(K, K), &V)>
137    where
138        K: Clone + Ord,
139        F: FnMut(&(K, K), &V) -> bool,
140    {
141        self.map
142            .range((key.clone(), key.clone())..)
143            .next()
144            .filter(|(r, v)| pred(r, v))
145    }
146    /// Pop a left neighboring range of `[key, key)` if the predicate is satisfied.
147    pub fn pop_left_if<F>(&mut self, key: &K, pred: F) -> Option<((K, K), V)>
148    where
149        K: Clone + Ord,
150        F: FnMut(&(K, K), &V) -> bool,
151    {
152        match self.get_left_if(key, pred) {
153            Some((r, _)) => {
154                let r = r.clone();
155                let v = self.map.remove(&r).unwrap();
156                Some((r, v))
157            }
158            None => None,
159        }
160    }
161    /// Pop a right neighboring range of `[key, key)` if the predicate is satisfied.
162    pub fn pop_right_if<F>(&mut self, key: &K, pred: F) -> Option<((K, K), V)>
163    where
164        K: Clone + Ord,
165        F: FnMut(&(K, K), &V) -> bool,
166    {
167        match self.get_right_if(key, pred) {
168            Some((r, _)) => {
169                let r = r.clone();
170                let v = self.map.remove(&r).unwrap();
171                Some((r, v))
172            }
173            None => None,
174        }
175    }
176    /// Operate and consume range-value pairs in range when no overlapping.
177    fn drain_with_inner<F>(&mut self, range: (K, K), mut f: F) -> F
178    where
179        K: Clone + Ord,
180        F: FnMut((K, K), V),
181    {
182        while let Some((r, _)) = self
183            .map
184            .range((range.0.clone(), range.0.clone())..(range.1.clone(), range.1.clone()))
185            .next()
186        {
187            let r = r.clone();
188            let v = self.map.remove(&r).unwrap();
189            f(r, v);
190        }
191        f
192    }
193    /// Operate and consume range-value pairs in range.
194    pub fn drain_with<F>(&mut self, range: (K, K), mut f: F)
195    where
196        K: Clone + Ord,
197        V: Clone,
198        F: FnMut((K, K), V),
199    {
200        if range.0 >= range.1 {
201            return;
202        }
203        if let Some((r, v)) = self.pop_left_if(&range.0, |r, _| range.0 < r.1) {
204            if range.1 < r.1 {
205                f(range.clone(), v.clone());
206                self.map.insert((range.1.clone(), r.1), v.clone());
207            } else {
208                f((range.0.clone(), r.1), v.clone());
209            }
210            self.map.insert((r.0, range.0.clone()), v);
211        }
212        let mut wait = None;
213        if let Some((r, v)) = self.pop_left_if(&range.1, |r, _| range.1 < r.1) {
214            wait = Some(((r.0, range.1.clone()), v.clone()));
215            self.map.insert((range.1.clone(), r.1), v);
216        }
217        let mut f = self.drain_with_inner(range, f);
218        if let Some((r, v)) = wait {
219            f(r, v);
220        }
221    }
222    pub fn iter(&self) -> btree_map::Iter<'_, (K, K), V> {
223        self.map.iter()
224    }
225    pub fn iter_mut(&mut self) -> btree_map::IterMut<'_, (K, K), V> {
226        self.map.iter_mut()
227    }
228    pub fn keys(&self) -> btree_map::Keys<'_, (K, K), V> {
229        self.map.keys()
230    }
231    pub fn values(&self) -> btree_map::Values<'_, (K, K), V> {
232        self.map.values()
233    }
234    pub fn values_mut(&mut self) -> btree_map::ValuesMut<'_, (K, K), V> {
235        self.map.values_mut()
236    }
237}
238impl<K, V> Extend<((K, K), V)> for RangeMap<K, V>
239where
240    K: Clone + Ord,
241    V: Clone + Eq,
242{
243    fn extend<T: IntoIterator<Item = ((K, K), V)>>(&mut self, iter: T) {
244        for (range, value) in iter {
245            self.insert(range, value);
246        }
247    }
248}
249impl<K, V> FromIterator<((K, K), V)> for RangeMap<K, V>
250where
251    K: Clone + Ord,
252    V: Clone + Eq,
253{
254    fn from_iter<T: IntoIterator<Item = ((K, K), V)>>(iter: T) -> Self {
255        let mut map = Self::new();
256        map.extend(iter);
257        map
258    }
259}
260
261/// A set to control intervals.
262#[derive(Debug, Clone)]
263pub struct RangeSet<T> {
264    map: RangeMap<T, ()>,
265}
266impl<T> Default for RangeSet<T>
267where
268    T: Ord,
269{
270    fn default() -> Self {
271        Self {
272            map: Default::default(),
273        }
274    }
275}
276impl<T> RangeSet<T> {
277    /// Makes a new, empty `RangeSet`.
278    pub fn new() -> Self
279    where
280        T: Ord,
281    {
282        Default::default()
283    }
284    /// Clears the set, removing all elements.
285    pub fn clear(&mut self)
286    where
287        T: Ord,
288    {
289        self.map.clear();
290    }
291    /// Returns true if the set contains a key.
292    pub fn contains(&self, key: &T) -> bool
293    where
294        T: Clone + Ord,
295    {
296        self.get_range(key).is_some()
297    }
298    /// Returns the range corresponding to the key.
299    pub fn get_range(&self, key: &T) -> Option<&(T, T)>
300    where
301        T: Clone + Ord,
302    {
303        self.map.get_range_value(key).map(|(r, _)| r)
304    }
305    /// Inserts into the specified range.
306    pub fn insert(&mut self, range: (T, T))
307    where
308        T: Clone + Ord,
309    {
310        self.insert_with(range, |_| {});
311    }
312    /// Insert and operate old range.
313    pub fn insert_with<F>(&mut self, range: (T, T), mut f: F)
314    where
315        T: Clone + Ord,
316        F: FnMut((T, T)),
317    {
318        self.map.insert_with(range, (), |r, _| f(r))
319    }
320    /// Remove items contained in the range.
321    pub fn remove(&mut self, range: (T, T))
322    where
323        T: Clone + Ord,
324    {
325        self.drain_with(range, |_| {});
326    }
327    /// Get a left neighboring range of `[key, key)` if the predicate is satisfied.
328    pub fn get_left_if<F>(&self, key: &T, mut pred: F) -> Option<&(T, T)>
329    where
330        T: Clone + Ord,
331        F: FnMut(&(T, T)) -> bool,
332    {
333        self.map.get_left_if(key, |r, _| pred(r)).map(|(r, _)| r)
334    }
335    /// Get a right neighboring range of `[key, key)` if the predicate is satisfied.
336    pub fn get_right_if<F>(&self, key: &T, mut pred: F) -> Option<&(T, T)>
337    where
338        T: Clone + Ord,
339        F: FnMut(&(T, T)) -> bool,
340    {
341        self.map.get_right_if(key, |r, _| pred(r)).map(|(r, _)| r)
342    }
343    /// Pop a left neighboring range of `[key, key)` if the predicate is satisfied.
344    pub fn pop_left_if<F>(&mut self, key: &T, mut pred: F) -> Option<(T, T)>
345    where
346        T: Clone + Ord,
347        F: FnMut(&(T, T)) -> bool,
348    {
349        self.map.pop_left_if(key, |r, _| pred(r)).map(|(r, _)| r)
350    }
Source

pub fn pop_right_if<F>(&mut self, key: &K, pred: F) -> Option<((K, K), V)>
where K: Clone + Ord, F: FnMut(&(K, K), &V) -> bool,

Pop a right neighboring range of [key, key) if the predicate is satisfied.

Examples found in repository?
crates/competitive/src/data_structure/range_map.rs (line 100)
67    pub fn insert_with<F>(&mut self, range: (K, K), value: V, mut f: F)
68    where
69        K: Clone + Ord,
70        V: Clone + Eq,
71        F: FnMut((K, K), V),
72    {
73        if range.0 >= range.1 {
74            return;
75        }
76        let mut ins_range = range.clone();
77        if let Some((r, v)) = self.pop_left_if(&range.0, |r, v| {
78            range.0 < r.1 || range.0 == r.1 && &value == v
79        }) {
80            if range.1 < r.1 {
81                if value == v {
82                    ins_range = r;
83                } else {
84                    self.map.insert((r.0, range.0.clone()), v.clone());
85                    self.map.insert((range.1.clone(), r.1), v.clone());
86                }
87                f(range.clone(), v);
88            } else {
89                if value == v {
90                    ins_range.0 = r.0;
91                } else {
92                    self.map.insert((r.0, range.0.clone()), v.clone());
93                }
94                if range.0 < r.1 {
95                    f((range.0.clone(), r.1), v);
96                }
97            }
98        }
99        let mut wait = None;
100        if let Some((r, _)) = self.pop_right_if(&range.1, |r, v| range.1 == r.0 && &value == v) {
101            ins_range.1 = r.1;
102        } else if let Some((r, v)) = self.pop_left_if(&range.1, |r, _| range.1 < r.1) {
103            if value == v {
104                ins_range.1 = r.1;
105            } else {
106                self.map.insert((range.1.clone(), r.1), v.clone());
107            }
108            wait = Some(((r.0, range.1.clone()), v));
109        }
110        let mut f = self.drain_with_inner(range, f);
111        if let Some((r, v)) = wait {
112            f(r, v);
113        }
114        self.map.insert(ins_range, value);
115    }
116    /// Remove values contained in the range.
117    pub fn remove(&mut self, range: (K, K))
118    where
119        K: Clone + Ord,
120        V: Clone,
121    {
122        self.drain_with(range, |_, _| {});
123    }
124    /// Get a left neighboring range of `[key, key)` if the predicate is satisfied.
125    pub fn get_left_if<F>(&self, key: &K, mut pred: F) -> Option<(&(K, K), &V)>
126    where
127        K: Clone + Ord,
128        F: FnMut(&(K, K), &V) -> bool,
129    {
130        self.map
131            .range(..(key.clone(), key.clone()))
132            .next_back()
133            .filter(|(r, v)| pred(r, v))
134    }
135    /// Get a right neighboring range of `[key, key)` if the predicate is satisfied.
136    pub fn get_right_if<F>(&self, key: &K, mut pred: F) -> Option<(&(K, K), &V)>
137    where
138        K: Clone + Ord,
139        F: FnMut(&(K, K), &V) -> bool,
140    {
141        self.map
142            .range((key.clone(), key.clone())..)
143            .next()
144            .filter(|(r, v)| pred(r, v))
145    }
146    /// Pop a left neighboring range of `[key, key)` if the predicate is satisfied.
147    pub fn pop_left_if<F>(&mut self, key: &K, pred: F) -> Option<((K, K), V)>
148    where
149        K: Clone + Ord,
150        F: FnMut(&(K, K), &V) -> bool,
151    {
152        match self.get_left_if(key, pred) {
153            Some((r, _)) => {
154                let r = r.clone();
155                let v = self.map.remove(&r).unwrap();
156                Some((r, v))
157            }
158            None => None,
159        }
160    }
161    /// Pop a right neighboring range of `[key, key)` if the predicate is satisfied.
162    pub fn pop_right_if<F>(&mut self, key: &K, pred: F) -> Option<((K, K), V)>
163    where
164        K: Clone + Ord,
165        F: FnMut(&(K, K), &V) -> bool,
166    {
167        match self.get_right_if(key, pred) {
168            Some((r, _)) => {
169                let r = r.clone();
170                let v = self.map.remove(&r).unwrap();
171                Some((r, v))
172            }
173            None => None,
174        }
175    }
176    /// Operate and consume range-value pairs in range when no overlapping.
177    fn drain_with_inner<F>(&mut self, range: (K, K), mut f: F) -> F
178    where
179        K: Clone + Ord,
180        F: FnMut((K, K), V),
181    {
182        while let Some((r, _)) = self
183            .map
184            .range((range.0.clone(), range.0.clone())..(range.1.clone(), range.1.clone()))
185            .next()
186        {
187            let r = r.clone();
188            let v = self.map.remove(&r).unwrap();
189            f(r, v);
190        }
191        f
192    }
193    /// Operate and consume range-value pairs in range.
194    pub fn drain_with<F>(&mut self, range: (K, K), mut f: F)
195    where
196        K: Clone + Ord,
197        V: Clone,
198        F: FnMut((K, K), V),
199    {
200        if range.0 >= range.1 {
201            return;
202        }
203        if let Some((r, v)) = self.pop_left_if(&range.0, |r, _| range.0 < r.1) {
204            if range.1 < r.1 {
205                f(range.clone(), v.clone());
206                self.map.insert((range.1.clone(), r.1), v.clone());
207            } else {
208                f((range.0.clone(), r.1), v.clone());
209            }
210            self.map.insert((r.0, range.0.clone()), v);
211        }
212        let mut wait = None;
213        if let Some((r, v)) = self.pop_left_if(&range.1, |r, _| range.1 < r.1) {
214            wait = Some(((r.0, range.1.clone()), v.clone()));
215            self.map.insert((range.1.clone(), r.1), v);
216        }
217        let mut f = self.drain_with_inner(range, f);
218        if let Some((r, v)) = wait {
219            f(r, v);
220        }
221    }
222    pub fn iter(&self) -> btree_map::Iter<'_, (K, K), V> {
223        self.map.iter()
224    }
225    pub fn iter_mut(&mut self) -> btree_map::IterMut<'_, (K, K), V> {
226        self.map.iter_mut()
227    }
228    pub fn keys(&self) -> btree_map::Keys<'_, (K, K), V> {
229        self.map.keys()
230    }
231    pub fn values(&self) -> btree_map::Values<'_, (K, K), V> {
232        self.map.values()
233    }
234    pub fn values_mut(&mut self) -> btree_map::ValuesMut<'_, (K, K), V> {
235        self.map.values_mut()
236    }
237}
238impl<K, V> Extend<((K, K), V)> for RangeMap<K, V>
239where
240    K: Clone + Ord,
241    V: Clone + Eq,
242{
243    fn extend<T: IntoIterator<Item = ((K, K), V)>>(&mut self, iter: T) {
244        for (range, value) in iter {
245            self.insert(range, value);
246        }
247    }
248}
249impl<K, V> FromIterator<((K, K), V)> for RangeMap<K, V>
250where
251    K: Clone + Ord,
252    V: Clone + Eq,
253{
254    fn from_iter<T: IntoIterator<Item = ((K, K), V)>>(iter: T) -> Self {
255        let mut map = Self::new();
256        map.extend(iter);
257        map
258    }
259}
260
261/// A set to control intervals.
262#[derive(Debug, Clone)]
263pub struct RangeSet<T> {
264    map: RangeMap<T, ()>,
265}
266impl<T> Default for RangeSet<T>
267where
268    T: Ord,
269{
270    fn default() -> Self {
271        Self {
272            map: Default::default(),
273        }
274    }
275}
276impl<T> RangeSet<T> {
277    /// Makes a new, empty `RangeSet`.
278    pub fn new() -> Self
279    where
280        T: Ord,
281    {
282        Default::default()
283    }
284    /// Clears the set, removing all elements.
285    pub fn clear(&mut self)
286    where
287        T: Ord,
288    {
289        self.map.clear();
290    }
291    /// Returns true if the set contains a key.
292    pub fn contains(&self, key: &T) -> bool
293    where
294        T: Clone + Ord,
295    {
296        self.get_range(key).is_some()
297    }
298    /// Returns the range corresponding to the key.
299    pub fn get_range(&self, key: &T) -> Option<&(T, T)>
300    where
301        T: Clone + Ord,
302    {
303        self.map.get_range_value(key).map(|(r, _)| r)
304    }
305    /// Inserts into the specified range.
306    pub fn insert(&mut self, range: (T, T))
307    where
308        T: Clone + Ord,
309    {
310        self.insert_with(range, |_| {});
311    }
312    /// Insert and operate old range.
313    pub fn insert_with<F>(&mut self, range: (T, T), mut f: F)
314    where
315        T: Clone + Ord,
316        F: FnMut((T, T)),
317    {
318        self.map.insert_with(range, (), |r, _| f(r))
319    }
320    /// Remove items contained in the range.
321    pub fn remove(&mut self, range: (T, T))
322    where
323        T: Clone + Ord,
324    {
325        self.drain_with(range, |_| {});
326    }
327    /// Get a left neighboring range of `[key, key)` if the predicate is satisfied.
328    pub fn get_left_if<F>(&self, key: &T, mut pred: F) -> Option<&(T, T)>
329    where
330        T: Clone + Ord,
331        F: FnMut(&(T, T)) -> bool,
332    {
333        self.map.get_left_if(key, |r, _| pred(r)).map(|(r, _)| r)
334    }
335    /// Get a right neighboring range of `[key, key)` if the predicate is satisfied.
336    pub fn get_right_if<F>(&self, key: &T, mut pred: F) -> Option<&(T, T)>
337    where
338        T: Clone + Ord,
339        F: FnMut(&(T, T)) -> bool,
340    {
341        self.map.get_right_if(key, |r, _| pred(r)).map(|(r, _)| r)
342    }
343    /// Pop a left neighboring range of `[key, key)` if the predicate is satisfied.
344    pub fn pop_left_if<F>(&mut self, key: &T, mut pred: F) -> Option<(T, T)>
345    where
346        T: Clone + Ord,
347        F: FnMut(&(T, T)) -> bool,
348    {
349        self.map.pop_left_if(key, |r, _| pred(r)).map(|(r, _)| r)
350    }
351    /// Pop a right neighboring range of `[key, key)` if the predicate is satisfied.
352    pub fn pop_right_if<F>(&mut self, key: &T, mut pred: F) -> Option<(T, T)>
353    where
354        T: Clone + Ord,
355        F: FnMut(&(T, T)) -> bool,
356    {
357        self.map.pop_right_if(key, |r, _| pred(r)).map(|(r, _)| r)
358    }
Source

fn drain_with_inner<F>(&mut self, range: (K, K), f: F) -> F
where K: Clone + Ord, F: FnMut((K, K), V),

Operate and consume range-value pairs in range when no overlapping.

Examples found in repository?
crates/competitive/src/data_structure/range_map.rs (line 110)
67    pub fn insert_with<F>(&mut self, range: (K, K), value: V, mut f: F)
68    where
69        K: Clone + Ord,
70        V: Clone + Eq,
71        F: FnMut((K, K), V),
72    {
73        if range.0 >= range.1 {
74            return;
75        }
76        let mut ins_range = range.clone();
77        if let Some((r, v)) = self.pop_left_if(&range.0, |r, v| {
78            range.0 < r.1 || range.0 == r.1 && &value == v
79        }) {
80            if range.1 < r.1 {
81                if value == v {
82                    ins_range = r;
83                } else {
84                    self.map.insert((r.0, range.0.clone()), v.clone());
85                    self.map.insert((range.1.clone(), r.1), v.clone());
86                }
87                f(range.clone(), v);
88            } else {
89                if value == v {
90                    ins_range.0 = r.0;
91                } else {
92                    self.map.insert((r.0, range.0.clone()), v.clone());
93                }
94                if range.0 < r.1 {
95                    f((range.0.clone(), r.1), v);
96                }
97            }
98        }
99        let mut wait = None;
100        if let Some((r, _)) = self.pop_right_if(&range.1, |r, v| range.1 == r.0 && &value == v) {
101            ins_range.1 = r.1;
102        } else if let Some((r, v)) = self.pop_left_if(&range.1, |r, _| range.1 < r.1) {
103            if value == v {
104                ins_range.1 = r.1;
105            } else {
106                self.map.insert((range.1.clone(), r.1), v.clone());
107            }
108            wait = Some(((r.0, range.1.clone()), v));
109        }
110        let mut f = self.drain_with_inner(range, f);
111        if let Some((r, v)) = wait {
112            f(r, v);
113        }
114        self.map.insert(ins_range, value);
115    }
116    /// Remove values contained in the range.
117    pub fn remove(&mut self, range: (K, K))
118    where
119        K: Clone + Ord,
120        V: Clone,
121    {
122        self.drain_with(range, |_, _| {});
123    }
124    /// Get a left neighboring range of `[key, key)` if the predicate is satisfied.
125    pub fn get_left_if<F>(&self, key: &K, mut pred: F) -> Option<(&(K, K), &V)>
126    where
127        K: Clone + Ord,
128        F: FnMut(&(K, K), &V) -> bool,
129    {
130        self.map
131            .range(..(key.clone(), key.clone()))
132            .next_back()
133            .filter(|(r, v)| pred(r, v))
134    }
135    /// Get a right neighboring range of `[key, key)` if the predicate is satisfied.
136    pub fn get_right_if<F>(&self, key: &K, mut pred: F) -> Option<(&(K, K), &V)>
137    where
138        K: Clone + Ord,
139        F: FnMut(&(K, K), &V) -> bool,
140    {
141        self.map
142            .range((key.clone(), key.clone())..)
143            .next()
144            .filter(|(r, v)| pred(r, v))
145    }
146    /// Pop a left neighboring range of `[key, key)` if the predicate is satisfied.
147    pub fn pop_left_if<F>(&mut self, key: &K, pred: F) -> Option<((K, K), V)>
148    where
149        K: Clone + Ord,
150        F: FnMut(&(K, K), &V) -> bool,
151    {
152        match self.get_left_if(key, pred) {
153            Some((r, _)) => {
154                let r = r.clone();
155                let v = self.map.remove(&r).unwrap();
156                Some((r, v))
157            }
158            None => None,
159        }
160    }
161    /// Pop a right neighboring range of `[key, key)` if the predicate is satisfied.
162    pub fn pop_right_if<F>(&mut self, key: &K, pred: F) -> Option<((K, K), V)>
163    where
164        K: Clone + Ord,
165        F: FnMut(&(K, K), &V) -> bool,
166    {
167        match self.get_right_if(key, pred) {
168            Some((r, _)) => {
169                let r = r.clone();
170                let v = self.map.remove(&r).unwrap();
171                Some((r, v))
172            }
173            None => None,
174        }
175    }
176    /// Operate and consume range-value pairs in range when no overlapping.
177    fn drain_with_inner<F>(&mut self, range: (K, K), mut f: F) -> F
178    where
179        K: Clone + Ord,
180        F: FnMut((K, K), V),
181    {
182        while let Some((r, _)) = self
183            .map
184            .range((range.0.clone(), range.0.clone())..(range.1.clone(), range.1.clone()))
185            .next()
186        {
187            let r = r.clone();
188            let v = self.map.remove(&r).unwrap();
189            f(r, v);
190        }
191        f
192    }
193    /// Operate and consume range-value pairs in range.
194    pub fn drain_with<F>(&mut self, range: (K, K), mut f: F)
195    where
196        K: Clone + Ord,
197        V: Clone,
198        F: FnMut((K, K), V),
199    {
200        if range.0 >= range.1 {
201            return;
202        }
203        if let Some((r, v)) = self.pop_left_if(&range.0, |r, _| range.0 < r.1) {
204            if range.1 < r.1 {
205                f(range.clone(), v.clone());
206                self.map.insert((range.1.clone(), r.1), v.clone());
207            } else {
208                f((range.0.clone(), r.1), v.clone());
209            }
210            self.map.insert((r.0, range.0.clone()), v);
211        }
212        let mut wait = None;
213        if let Some((r, v)) = self.pop_left_if(&range.1, |r, _| range.1 < r.1) {
214            wait = Some(((r.0, range.1.clone()), v.clone()));
215            self.map.insert((range.1.clone(), r.1), v);
216        }
217        let mut f = self.drain_with_inner(range, f);
218        if let Some((r, v)) = wait {
219            f(r, v);
220        }
221    }
Source

pub fn drain_with<F>(&mut self, range: (K, K), f: F)
where K: Clone + Ord, V: Clone, F: FnMut((K, K), V),

Operate and consume range-value pairs in range.

Examples found in repository?
crates/competitive/src/data_structure/range_map.rs (line 122)
117    pub fn remove(&mut self, range: (K, K))
118    where
119        K: Clone + Ord,
120        V: Clone,
121    {
122        self.drain_with(range, |_, _| {});
123    }
124    /// Get a left neighboring range of `[key, key)` if the predicate is satisfied.
125    pub fn get_left_if<F>(&self, key: &K, mut pred: F) -> Option<(&(K, K), &V)>
126    where
127        K: Clone + Ord,
128        F: FnMut(&(K, K), &V) -> bool,
129    {
130        self.map
131            .range(..(key.clone(), key.clone()))
132            .next_back()
133            .filter(|(r, v)| pred(r, v))
134    }
135    /// Get a right neighboring range of `[key, key)` if the predicate is satisfied.
136    pub fn get_right_if<F>(&self, key: &K, mut pred: F) -> Option<(&(K, K), &V)>
137    where
138        K: Clone + Ord,
139        F: FnMut(&(K, K), &V) -> bool,
140    {
141        self.map
142            .range((key.clone(), key.clone())..)
143            .next()
144            .filter(|(r, v)| pred(r, v))
145    }
146    /// Pop a left neighboring range of `[key, key)` if the predicate is satisfied.
147    pub fn pop_left_if<F>(&mut self, key: &K, pred: F) -> Option<((K, K), V)>
148    where
149        K: Clone + Ord,
150        F: FnMut(&(K, K), &V) -> bool,
151    {
152        match self.get_left_if(key, pred) {
153            Some((r, _)) => {
154                let r = r.clone();
155                let v = self.map.remove(&r).unwrap();
156                Some((r, v))
157            }
158            None => None,
159        }
160    }
161    /// Pop a right neighboring range of `[key, key)` if the predicate is satisfied.
162    pub fn pop_right_if<F>(&mut self, key: &K, pred: F) -> Option<((K, K), V)>
163    where
164        K: Clone + Ord,
165        F: FnMut(&(K, K), &V) -> bool,
166    {
167        match self.get_right_if(key, pred) {
168            Some((r, _)) => {
169                let r = r.clone();
170                let v = self.map.remove(&r).unwrap();
171                Some((r, v))
172            }
173            None => None,
174        }
175    }
176    /// Operate and consume range-value pairs in range when no overlapping.
177    fn drain_with_inner<F>(&mut self, range: (K, K), mut f: F) -> F
178    where
179        K: Clone + Ord,
180        F: FnMut((K, K), V),
181    {
182        while let Some((r, _)) = self
183            .map
184            .range((range.0.clone(), range.0.clone())..(range.1.clone(), range.1.clone()))
185            .next()
186        {
187            let r = r.clone();
188            let v = self.map.remove(&r).unwrap();
189            f(r, v);
190        }
191        f
192    }
193    /// Operate and consume range-value pairs in range.
194    pub fn drain_with<F>(&mut self, range: (K, K), mut f: F)
195    where
196        K: Clone + Ord,
197        V: Clone,
198        F: FnMut((K, K), V),
199    {
200        if range.0 >= range.1 {
201            return;
202        }
203        if let Some((r, v)) = self.pop_left_if(&range.0, |r, _| range.0 < r.1) {
204            if range.1 < r.1 {
205                f(range.clone(), v.clone());
206                self.map.insert((range.1.clone(), r.1), v.clone());
207            } else {
208                f((range.0.clone(), r.1), v.clone());
209            }
210            self.map.insert((r.0, range.0.clone()), v);
211        }
212        let mut wait = None;
213        if let Some((r, v)) = self.pop_left_if(&range.1, |r, _| range.1 < r.1) {
214            wait = Some(((r.0, range.1.clone()), v.clone()));
215            self.map.insert((range.1.clone(), r.1), v);
216        }
217        let mut f = self.drain_with_inner(range, f);
218        if let Some((r, v)) = wait {
219            f(r, v);
220        }
221    }
222    pub fn iter(&self) -> btree_map::Iter<'_, (K, K), V> {
223        self.map.iter()
224    }
225    pub fn iter_mut(&mut self) -> btree_map::IterMut<'_, (K, K), V> {
226        self.map.iter_mut()
227    }
228    pub fn keys(&self) -> btree_map::Keys<'_, (K, K), V> {
229        self.map.keys()
230    }
231    pub fn values(&self) -> btree_map::Values<'_, (K, K), V> {
232        self.map.values()
233    }
234    pub fn values_mut(&mut self) -> btree_map::ValuesMut<'_, (K, K), V> {
235        self.map.values_mut()
236    }
237}
238impl<K, V> Extend<((K, K), V)> for RangeMap<K, V>
239where
240    K: Clone + Ord,
241    V: Clone + Eq,
242{
243    fn extend<T: IntoIterator<Item = ((K, K), V)>>(&mut self, iter: T) {
244        for (range, value) in iter {
245            self.insert(range, value);
246        }
247    }
248}
249impl<K, V> FromIterator<((K, K), V)> for RangeMap<K, V>
250where
251    K: Clone + Ord,
252    V: Clone + Eq,
253{
254    fn from_iter<T: IntoIterator<Item = ((K, K), V)>>(iter: T) -> Self {
255        let mut map = Self::new();
256        map.extend(iter);
257        map
258    }
259}
260
261/// A set to control intervals.
262#[derive(Debug, Clone)]
263pub struct RangeSet<T> {
264    map: RangeMap<T, ()>,
265}
266impl<T> Default for RangeSet<T>
267where
268    T: Ord,
269{
270    fn default() -> Self {
271        Self {
272            map: Default::default(),
273        }
274    }
275}
276impl<T> RangeSet<T> {
277    /// Makes a new, empty `RangeSet`.
278    pub fn new() -> Self
279    where
280        T: Ord,
281    {
282        Default::default()
283    }
284    /// Clears the set, removing all elements.
285    pub fn clear(&mut self)
286    where
287        T: Ord,
288    {
289        self.map.clear();
290    }
291    /// Returns true if the set contains a key.
292    pub fn contains(&self, key: &T) -> bool
293    where
294        T: Clone + Ord,
295    {
296        self.get_range(key).is_some()
297    }
298    /// Returns the range corresponding to the key.
299    pub fn get_range(&self, key: &T) -> Option<&(T, T)>
300    where
301        T: Clone + Ord,
302    {
303        self.map.get_range_value(key).map(|(r, _)| r)
304    }
305    /// Inserts into the specified range.
306    pub fn insert(&mut self, range: (T, T))
307    where
308        T: Clone + Ord,
309    {
310        self.insert_with(range, |_| {});
311    }
312    /// Insert and operate old range.
313    pub fn insert_with<F>(&mut self, range: (T, T), mut f: F)
314    where
315        T: Clone + Ord,
316        F: FnMut((T, T)),
317    {
318        self.map.insert_with(range, (), |r, _| f(r))
319    }
320    /// Remove items contained in the range.
321    pub fn remove(&mut self, range: (T, T))
322    where
323        T: Clone + Ord,
324    {
325        self.drain_with(range, |_| {});
326    }
327    /// Get a left neighboring range of `[key, key)` if the predicate is satisfied.
328    pub fn get_left_if<F>(&self, key: &T, mut pred: F) -> Option<&(T, T)>
329    where
330        T: Clone + Ord,
331        F: FnMut(&(T, T)) -> bool,
332    {
333        self.map.get_left_if(key, |r, _| pred(r)).map(|(r, _)| r)
334    }
335    /// Get a right neighboring range of `[key, key)` if the predicate is satisfied.
336    pub fn get_right_if<F>(&self, key: &T, mut pred: F) -> Option<&(T, T)>
337    where
338        T: Clone + Ord,
339        F: FnMut(&(T, T)) -> bool,
340    {
341        self.map.get_right_if(key, |r, _| pred(r)).map(|(r, _)| r)
342    }
343    /// Pop a left neighboring range of `[key, key)` if the predicate is satisfied.
344    pub fn pop_left_if<F>(&mut self, key: &T, mut pred: F) -> Option<(T, T)>
345    where
346        T: Clone + Ord,
347        F: FnMut(&(T, T)) -> bool,
348    {
349        self.map.pop_left_if(key, |r, _| pred(r)).map(|(r, _)| r)
350    }
351    /// Pop a right neighboring range of `[key, key)` if the predicate is satisfied.
352    pub fn pop_right_if<F>(&mut self, key: &T, mut pred: F) -> Option<(T, T)>
353    where
354        T: Clone + Ord,
355        F: FnMut(&(T, T)) -> bool,
356    {
357        self.map.pop_right_if(key, |r, _| pred(r)).map(|(r, _)| r)
358    }
359    /// Operate and consume in range.
360    pub fn drain_with<F>(&mut self, range: (T, T), mut f: F)
361    where
362        T: Clone + Ord,
363        F: FnMut((T, T)),
364    {
365        self.map.drain_with(range, |r, _| f(r));
366    }
Source

pub fn iter(&self) -> Iter<'_, (K, K), V> ⓘ

Source

pub fn iter_mut(&mut self) -> IterMut<'_, (K, K), V> ⓘ

Source

pub fn keys(&self) -> Keys<'_, (K, K), V> ⓘ

Examples found in repository?
crates/competitive/src/data_structure/range_map.rs (line 368)
367    pub fn iter(&self) -> btree_map::Keys<'_, (T, T), ()> {
368        self.map.keys()
369    }
Source

pub fn values(&self) -> Values<'_, (K, K), V> ⓘ

Source

pub fn values_mut(&mut self) -> ValuesMut<'_, (K, K), V> ⓘ

Trait Implementations§

Source§

impl<K: Clone, V: Clone> Clone for RangeMap<K, V>

Source§

fn clone(&self) -> Self

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl<K: Debug, V: Debug> Debug for RangeMap<K, V>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<K, V> Default for RangeMap<K, V>
where K: Ord,

Source§

fn default() -> Self

Returns the “default value” for a type. Read more
Source§

impl<K, V> Extend<((K, K), V)> for RangeMap<K, V>
where K: Clone + Ord, V: Clone + Eq,

Source§

fn extend<T: IntoIterator<Item = ((K, K), V)>>(&mut self, iter: T)

Extends a collection with the contents of an iterator. Read more
Source§

fn extend_one(&mut self, item: T)

🔬This is a nightly-only experimental API. (extend_one)
Extends a collection with exactly one element.
Source§

fn extend_reserve(&mut self, additional: usize)

🔬This is a nightly-only experimental API. (extend_one)
Reserves capacity in a collection for the given number of additional elements. Read more
Source§

impl<K, V> FromIterator<((K, K), V)> for RangeMap<K, V>
where K: Clone + Ord, V: Clone + Eq,

Source§

fn from_iter<T: IntoIterator<Item = ((K, K), V)>>(iter: T) -> Self

Creates a value from an iterator. Read more

Auto Trait Implementations§

§

impl<K, V> Freeze for RangeMap<K, V>
where BTreeMap<(K, K), V>: Freeze,

§

impl<K, V> RefUnwindSafe for RangeMap<K, V>

§

impl<K, V> Send for RangeMap<K, V>
where BTreeMap<(K, K), V>: Send,

§

impl<K, V> Sync for RangeMap<K, V>
where BTreeMap<(K, K), V>: Sync,

§

impl<K, V> Unpin for RangeMap<K, V>
where BTreeMap<(K, K), V>: Unpin,

§

impl<K, V> UnsafeUnpin for RangeMap<K, V>

§

impl<K, V> UnwindSafe for RangeMap<K, V>

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToArrayVecScalar for T

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.