1
1
//! Implementation using ordered keys and exponential search.
2
2
3
- use super :: { Trie , Cursor , Builder , MergeBuilder , TupleBuilder , BatchContainer , advance } ;
3
+ use super :: { Trie , Cursor , Builder , MergeBuilder , TupleBuilder , BatchContainer } ;
4
4
use std:: convert:: { TryFrom , TryInto } ;
5
5
use std:: fmt:: Debug ;
6
- use std:: ops:: { Sub , Add , Deref } ;
6
+ use std:: ops:: { Sub , Add } ;
7
7
8
8
/// Trait for types used as offsets into an ordered layer.
9
9
/// This is usually `usize`, but `u32` can also be used in applications
23
23
pub struct OrderedLayer < K , L , O =usize , C =Vec < K > >
24
24
where
25
25
K : Ord ,
26
- C : BatchContainer < Item =K > + Deref < Target = [ K ] > ,
26
+ C : BatchContainer < Item =K > ,
27
27
O : OrdOffset
28
28
{
29
29
/// The keys of the layer.
40
40
impl < K , L , O , C > Trie for OrderedLayer < K , L , O , C >
41
41
where
42
42
K : Ord ,
43
- C : BatchContainer < Item =K > + Deref < Target = [ K ] > ,
43
+ C : BatchContainer < Item =K > ,
44
44
L : Trie ,
45
45
O : OrdOffset
46
46
{
77
77
pub struct OrderedBuilder < K , L , O =usize , C =Vec < K > >
78
78
where
79
79
K : Ord ,
80
- C : BatchContainer < Item =K > + Deref < Target = [ K ] > ,
80
+ C : BatchContainer < Item =K > ,
81
81
O : OrdOffset
82
82
{
83
83
/// Keys
91
91
impl < K , L , O , C > Builder for OrderedBuilder < K , L , O , C >
92
92
where
93
93
K : Ord ,
94
- C : BatchContainer < Item =K > + Deref < Target = [ K ] > ,
94
+ C : BatchContainer < Item =K > ,
95
95
L : Builder ,
96
96
O : OrdOffset
97
97
{
@@ -115,7 +115,7 @@ where
115
115
impl < K , L , O , C > MergeBuilder for OrderedBuilder < K , L , O , C >
116
116
where
117
117
K : Ord ,
118
- C : BatchContainer < Item =K > + Deref < Target = [ K ] > ,
118
+ C : BatchContainer < Item =K > ,
119
119
L : MergeBuilder ,
120
120
O : OrdOffset
121
121
{
@@ -134,7 +134,7 @@ where
134
134
let other_basis = other. offs [ lower] ;
135
135
let self_basis = self . offs . last ( ) . map ( |& x| x) . unwrap_or ( O :: try_from ( 0 ) . ok ( ) . unwrap ( ) ) ;
136
136
137
- self . keys . copy_slice ( & other. keys [ lower .. upper] ) ;
137
+ self . keys . copy_range ( & other. keys , lower, upper) ;
138
138
for index in lower .. upper {
139
139
self . offs . push ( ( other. offs [ index + 1 ] + self_basis) - other_basis) ;
140
140
}
@@ -162,7 +162,7 @@ where
162
162
impl < K , L , O , C > OrderedBuilder < K , L , O , C >
163
163
where
164
164
K : Ord ,
165
- C : BatchContainer < Item =K > + Deref < Target = [ K ] > ,
165
+ C : BatchContainer < Item =K > ,
166
166
L : MergeBuilder ,
167
167
O : OrdOffset
168
168
{
@@ -173,10 +173,10 @@ where
173
173
let ( trie1, lower1, upper1) = other1;
174
174
let ( trie2, lower2, upper2) = other2;
175
175
176
- match trie1. keys [ * lower1] . cmp ( & trie2. keys [ * lower2] ) {
176
+ match trie1. keys . index ( * lower1) . cmp ( & trie2. keys . index ( * lower2) ) {
177
177
:: std:: cmp:: Ordering :: Less => {
178
178
// determine how far we can advance lower1 until we reach/pass lower2
179
- let step = 1 + advance ( & trie1. keys [ ( 1 + * lower1) .. upper1] , |x| x < & trie2. keys [ * lower2] ) ;
179
+ let step = 1 + trie1. keys . advance ( 1 + * lower1, upper1, |x| x < & trie2. keys . index ( * lower2) ) ;
180
180
let step = std:: cmp:: min ( step, 1_000 ) ;
181
181
self . copy_range ( trie1, * lower1, * lower1 + step) ;
182
182
* lower1 += step;
@@ -189,7 +189,7 @@ where
189
189
( & trie2. vals , trie2. offs [ * lower2] . try_into ( ) . ok ( ) . unwrap ( ) , trie2. offs [ * lower2 + 1 ] . try_into ( ) . ok ( ) . unwrap ( ) )
190
190
) ;
191
191
if upper > lower {
192
- self . keys . copy ( & trie1. keys [ * lower1] ) ;
192
+ self . keys . copy ( & trie1. keys . index ( * lower1) ) ;
193
193
self . offs . push ( O :: try_from ( upper) . ok ( ) . unwrap ( ) ) ;
194
194
}
195
195
@@ -198,7 +198,7 @@ where
198
198
} ,
199
199
:: std:: cmp:: Ordering :: Greater => {
200
200
// determine how far we can advance lower2 until we reach/pass lower1
201
- let step = 1 + advance ( & trie2. keys [ ( 1 + * lower2) .. upper2] , |x| x < & trie1. keys [ * lower1] ) ;
201
+ let step = 1 + trie2. keys . advance ( 1 + * lower2, upper2, |x| x < & trie1. keys . index ( * lower1) ) ;
202
202
let step = std:: cmp:: min ( step, 1_000 ) ;
203
203
self . copy_range ( trie2, * lower2, * lower2 + step) ;
204
204
* lower2 += step;
@@ -210,7 +210,7 @@ where
210
210
impl < K , L , O , C > TupleBuilder for OrderedBuilder < K , L , O , C >
211
211
where
212
212
K : Ord ,
213
- C : BatchContainer < Item =K > + Deref < Target = [ K ] > ,
213
+ C : BatchContainer < Item =K > ,
214
214
L : TupleBuilder ,
215
215
O : OrdOffset
216
216
{
@@ -229,7 +229,7 @@ where
229
229
fn push_tuple ( & mut self , ( key, val) : ( K , L :: Item ) ) {
230
230
231
231
// if first element, prior element finish, or different element, need to push and maybe punctuate.
232
- if self . keys . len ( ) == 0 || self . offs [ self . keys . len ( ) ] . try_into ( ) . ok ( ) . unwrap ( ) != 0 || self . keys [ self . keys . len ( ) -1 ] != key {
232
+ if self . keys . len ( ) == 0 || self . offs [ self . keys . len ( ) ] . try_into ( ) . ok ( ) . unwrap ( ) != 0 || self . keys . index ( self . keys . len ( ) -1 ) != & key {
233
233
if self . keys . len ( ) > 0 && self . offs [ self . keys . len ( ) ] . try_into ( ) . ok ( ) . unwrap ( ) == 0 {
234
234
self . offs [ self . keys . len ( ) ] = O :: try_from ( self . vals . boundary ( ) ) . ok ( ) . unwrap ( ) ;
235
235
}
@@ -252,12 +252,12 @@ pub struct OrderedCursor<L: Trie> {
252
252
impl < K , L , O , C > Cursor < OrderedLayer < K , L , O , C > > for OrderedCursor < L >
253
253
where
254
254
K : Ord ,
255
- C : BatchContainer < Item =K > + Deref < Target = [ K ] > ,
255
+ C : BatchContainer < Item =K > ,
256
256
L : Trie ,
257
257
O : OrdOffset
258
258
{
259
259
type Key = K ;
260
- fn key < ' a > ( & self , storage : & ' a OrderedLayer < K , L , O , C > ) -> & ' a Self :: Key { & storage. keys [ self . pos ] }
260
+ fn key < ' a > ( & self , storage : & ' a OrderedLayer < K , L , O , C > ) -> & ' a Self :: Key { & storage. keys . index ( self . pos ) }
261
261
fn step ( & mut self , storage : & OrderedLayer < K , L , O , C > ) {
262
262
self . pos += 1 ;
263
263
if self . valid ( storage) {
@@ -268,7 +268,7 @@ where
268
268
}
269
269
}
270
270
fn seek ( & mut self , storage : & OrderedLayer < K , L , O , C > , key : & Self :: Key ) {
271
- self . pos += advance ( & storage. keys [ self . pos .. self . bounds . 1 ] , |k| k. lt ( key) ) ;
271
+ self . pos += storage. keys . advance ( self . pos , self . bounds . 1 , |k| k. lt ( key) ) ;
272
272
if self . valid ( storage) {
273
273
self . child . reposition ( & storage. vals , storage. offs [ self . pos ] . try_into ( ) . ok ( ) . unwrap ( ) , storage. offs [ self . pos + 1 ] . try_into ( ) . ok ( ) . unwrap ( ) ) ;
274
274
}
0 commit comments