@@ -51,6 +51,13 @@ pub trait FixedLengthEncoding: Copy {
51
51
52
52
fn encode ( self ) -> Self :: Encoded ;
53
53
54
+ fn encode_desc ( self ) -> Self :: Encoded {
55
+ let mut encoded = self . encode ( ) ;
56
+ // Flip bits to reverse order
57
+ encoded. as_mut ( ) . iter_mut ( ) . for_each ( |v| * v = !* v) ;
58
+ encoded
59
+ }
60
+
54
61
fn decode ( encoded : Self :: Encoded ) -> Self ;
55
62
}
56
63
@@ -61,6 +68,10 @@ impl FixedLengthEncoding for bool {
61
68
[ self as u8 ]
62
69
}
63
70
71
+ fn encode_desc ( self ) -> [ u8 ; 1 ] {
72
+ [ !self as u8 ]
73
+ }
74
+
64
75
fn decode ( encoded : Self :: Encoded ) -> Self {
65
76
encoded[ 0 ] != 0
66
77
}
@@ -71,13 +82,24 @@ macro_rules! encode_signed {
71
82
impl FixedLengthEncoding for $t {
72
83
type Encoded = [ u8 ; $n] ;
73
84
85
+ #[ inline]
74
86
fn encode( self ) -> [ u8 ; $n] {
75
87
let mut b = self . to_be_bytes( ) ;
76
88
// Toggle top "sign" bit to ensure consistent sort order
77
89
b[ 0 ] ^= 0x80 ;
78
90
b
79
91
}
80
92
93
+ #[ inline]
94
+ fn encode_desc( self ) -> Self :: Encoded {
95
+ // fast path for descending order
96
+ let b = !self ;
97
+ let mut b = b. to_be_bytes( ) ;
98
+ // Toggle top "sign" bit to ensure consistent sort order
99
+ b[ 0 ] ^= 0x80 ;
100
+ b
101
+ }
102
+
81
103
fn decode( mut encoded: Self :: Encoded ) -> Self {
82
104
// Toggle top "sign" bit
83
105
encoded[ 0 ] ^= 0x80 ;
@@ -99,10 +121,16 @@ macro_rules! encode_unsigned {
99
121
impl FixedLengthEncoding for $t {
100
122
type Encoded = [ u8 ; $n] ;
101
123
124
+ // #[inline]
102
125
fn encode( self ) -> [ u8 ; $n] {
103
126
self . to_be_bytes( )
104
127
}
105
128
129
+ // #[inline]
130
+ fn encode_desc( self ) -> [ u8 ; $n] {
131
+ ( !self ) . to_be_bytes( )
132
+ }
133
+
106
134
fn decode( encoded: Self :: Encoded ) -> Self {
107
135
Self :: from_be_bytes( encoded)
108
136
}
@@ -251,20 +279,27 @@ pub fn encode_not_null<T: FixedLengthEncoding>(
251
279
values : & [ T ] ,
252
280
opts : SortOptions ,
253
281
) {
254
- for ( value_idx, val) in values. iter ( ) . enumerate ( ) {
255
- let offset = & mut offsets[ value_idx + 1 ] ;
256
- let end_offset = * offset + T :: ENCODED_LEN ;
257
-
258
- let to_write = & mut data[ * offset..end_offset] ;
259
- to_write[ 0 ] = 1 ;
260
- let mut encoded = val. encode ( ) ;
261
- if opts. descending {
262
- // Flip bits to reverse order
263
- encoded. as_mut ( ) . iter_mut ( ) . for_each ( |v| * v = !* v)
282
+ #[ inline]
283
+ fn encode < const DESC : bool , T : FixedLengthEncoding > (
284
+ data : & mut [ u8 ] ,
285
+ offsets : & mut [ usize ] ,
286
+ values : & [ T ] ,
287
+ ) {
288
+ for ( val, offset) in values. iter ( ) . zip ( offsets[ 1 ..] . iter_mut ( ) ) {
289
+ let to_write = & mut data[ * offset..* offset + T :: ENCODED_LEN ] ;
290
+ to_write[ 0 ] = 1 ;
291
+ let encoded = if DESC {
292
+ val. encode_desc ( )
293
+ } else {
294
+ val. encode ( )
295
+ } ;
296
+ to_write[ 1 ..] . copy_from_slice ( encoded. as_ref ( ) ) ;
297
+ * offset = * offset + T :: ENCODED_LEN ;
264
298
}
265
- to_write[ 1 ..] . copy_from_slice ( encoded. as_ref ( ) ) ;
266
-
267
- * offset = end_offset;
299
+ }
300
+ match opts. descending {
301
+ true => encode :: < true , T > ( data, offsets, values) ,
302
+ false => encode :: < false , T > ( data, offsets, values) ,
268
303
}
269
304
}
270
305
0 commit comments