@@ -203,7 +203,9 @@ where
203
203
invoice = invoice. amount_milli_satoshis ( amt) ;
204
204
}
205
205
206
- for route_hint in select_phantom_hints ( amt_msat, phantom_route_hints, logger) {
206
+ const MAX_HINTS : usize = 3 ;
207
+
208
+ for route_hint in select_phantom_hints ( amt_msat, phantom_route_hints, logger) . take ( MAX_HINTS ) {
207
209
invoice = invoice. private_route ( route_hint) ;
208
210
}
209
211
@@ -268,46 +270,35 @@ where
268
270
// the hints across our real nodes we add one hint from each in turn until no node has any hints
269
271
// left (if one node has more hints than any other, these will accumulate at the end of the
270
272
// vector).
271
- const MAX_HINTS : usize = 3 ;
272
-
273
- zip_nested_vectors ( phantom_hints, MAX_HINTS )
273
+ rotate_nested_vectors ( phantom_hints)
274
274
275
275
}
276
276
277
- // Zip multiple nested vectors
278
- // Similar to the zip method on a vector, it combines the vectors by index - zero index comes first
279
- // then second, etc.
280
- // The difference is that this function handles many or just one vector, whereas the builtin method
281
- // works on just two vectors.
282
- fn zip_nested_vectors < T : Clone > ( vecs : Vec < Vec < T > > , result_size : usize ) -> impl Iterator < Item = T > {
277
+ // Draw items iteratively from multiple nested vectors. The items are retrieved by index and
278
+ // rotates through the vectors - first the zero index then the first index then second index, etc.
279
+ fn rotate_nested_vectors < T : Clone > ( vecs : Vec < Vec < T > > ) -> impl Iterator < Item = T > {
283
280
let max_vector_length: usize = vecs. iter ( ) . map ( |x| x. len ( ) ) . max ( ) . unwrap ( ) ;
284
281
let mut hint_index = 0 ;
285
282
let mut vector_index = 0 ;
286
283
let number_inner_vectors: usize = vecs. len ( ) ;
287
- let mut total_hints_returned = 0 ;
288
284
289
285
core:: iter:: from_fn ( move || loop {
290
- let return_value = loop {
291
- if total_hints_returned == result_size || hint_index == max_vector_length {
292
- break None ;
293
- } ;
294
- let hint_value =
295
- if vecs[ vector_index] . len ( ) != 0 && vecs[ vector_index] . len ( ) > hint_index {
296
- Some ( vecs[ vector_index] [ hint_index] . clone ( ) )
297
- } else {
298
- None // no value retrieved - continue looping
299
- } ;
300
- vector_index += 1 ;
301
- if hint_index < max_vector_length && vector_index == number_inner_vectors {
302
- vector_index = 0 ;
303
- hint_index += 1 ;
304
- } ;
305
- if !hint_value. is_none ( ) {
306
- total_hints_returned += 1 ;
307
- break hint_value;
308
- } ;
286
+ if hint_index == max_vector_length {
287
+ return None ;
288
+ } ;
289
+ let hint_value = if vecs[ vector_index] . len ( ) != 0 && vecs[ vector_index] . len ( ) > hint_index {
290
+ Some ( vecs[ vector_index] [ hint_index] . clone ( ) )
291
+ } else {
292
+ None // no value retrieved - continue looping
293
+ } ;
294
+ vector_index += 1 ;
295
+ if hint_index < max_vector_length && vector_index == number_inner_vectors {
296
+ vector_index = 0 ;
297
+ hint_index += 1 ;
298
+ } ;
299
+ if !hint_value. is_none ( ) {
300
+ return hint_value;
309
301
} ;
310
- return return_value;
311
302
} )
312
303
}
313
304
@@ -796,7 +787,7 @@ mod test {
796
787
use lightning:: routing:: router:: { PaymentParameters , RouteParameters } ;
797
788
use lightning:: util:: test_utils;
798
789
use lightning:: util:: config:: UserConfig ;
799
- use crate :: utils:: { create_invoice_from_channelmanager_and_duration_since_epoch, zip_nested_vectors } ;
790
+ use crate :: utils:: { create_invoice_from_channelmanager_and_duration_since_epoch, rotate_nested_vectors } ;
800
791
use std:: collections:: HashSet ;
801
792
802
793
#[ test]
@@ -1909,60 +1900,58 @@ mod test {
1909
1900
1910
1901
#[ test]
1911
1902
fn test_zip_nested_vectors ( ) {
1912
- const TEST_RESULT_SIZE : usize = 3 ;
1913
-
1914
1903
// two nested vectors
1915
1904
let a = vec ! [ vec![ "a0" , "b0" , "c0" ] , vec![ "a1" , "b1" ] ] ;
1916
- let result = zip_nested_vectors ( a , TEST_RESULT_SIZE ) . collect :: < Vec < _ > > ( ) ;
1905
+ let result = rotate_nested_vectors ( a ) . collect :: < Vec < _ > > ( ) ;
1917
1906
1918
- let expected = vec ! [ "a0" , "a1" , "b0" ] ;
1907
+ let expected = vec ! [ "a0" , "a1" , "b0" , "b1" , "c0" ] ;
1919
1908
assert_eq ! ( expected, result) ;
1920
1909
1921
1910
// test single nested vector
1922
1911
let a = vec ! [ vec![ "a0" , "b0" , "c0" ] ] ;
1923
- let result = zip_nested_vectors ( a , TEST_RESULT_SIZE ) . collect :: < Vec < _ > > ( ) ;
1912
+ let result = rotate_nested_vectors ( a ) . collect :: < Vec < _ > > ( ) ;
1924
1913
1925
1914
let expected = vec ! [ "a0" , "b0" , "c0" ] ;
1926
1915
assert_eq ! ( expected, result) ;
1927
1916
1928
1917
// test second vector with only one element
1929
1918
let a = vec ! [ vec![ "a0" , "b0" , "c0" ] , vec![ "a1" ] ] ;
1930
- let result = zip_nested_vectors ( a , TEST_RESULT_SIZE ) . collect :: < Vec < _ > > ( ) ;
1919
+ let result = rotate_nested_vectors ( a ) . collect :: < Vec < _ > > ( ) ;
1931
1920
1932
- let expected = vec ! [ "a0" , "a1" , "b0" ] ;
1921
+ let expected = vec ! [ "a0" , "a1" , "b0" , "c0" ] ;
1933
1922
assert_eq ! ( expected, result) ;
1934
1923
1935
1924
// test three nestend vectors
1936
1925
let a = vec ! [ vec![ "a0" ] , vec![ "a1" , "b1" , "c1" ] , vec![ "a2" ] ] ;
1937
- let result = zip_nested_vectors ( a , TEST_RESULT_SIZE ) . collect :: < Vec < _ > > ( ) ;
1926
+ let result = rotate_nested_vectors ( a ) . collect :: < Vec < _ > > ( ) ;
1938
1927
1939
- let expected = vec ! [ "a0" , "a1" , "a2" ] ;
1928
+ let expected = vec ! [ "a0" , "a1" , "a2" , "b1" , "c1" ] ;
1940
1929
assert_eq ! ( expected, result) ;
1941
1930
1942
1931
// test single nested vector with a single value
1943
1932
let a = vec ! [ vec![ "a0" ] ] ;
1944
- let result = zip_nested_vectors ( a , TEST_RESULT_SIZE ) . collect :: < Vec < _ > > ( ) ;
1933
+ let result = rotate_nested_vectors ( a ) . collect :: < Vec < _ > > ( ) ;
1945
1934
1946
1935
let expected = vec ! [ "a0" ] ;
1947
1936
assert_eq ! ( expected, result) ;
1948
1937
1949
1938
// test single empty nested vector
1950
1939
let a: Vec < Vec < & str > > = vec ! [ vec![ ] ] ;
1951
- let result = zip_nested_vectors ( a , TEST_RESULT_SIZE ) . collect :: < Vec < _ > > ( ) ;
1940
+ let result = rotate_nested_vectors ( a ) . collect :: < Vec < _ > > ( ) ;
1952
1941
let expected: Vec < & str > = vec ! [ ] ;
1953
1942
1954
1943
assert_eq ! ( expected, result) ;
1955
1944
1956
1945
// test first nested vector is empty
1957
1946
let a = vec ! [ vec![ ] , vec![ "a1" , "b1" , "c1" ] ] ;
1958
- let result = zip_nested_vectors ( a , TEST_RESULT_SIZE ) . collect :: < Vec < _ > > ( ) ;
1947
+ let result = rotate_nested_vectors ( a ) . collect :: < Vec < _ > > ( ) ;
1959
1948
1960
1949
let expected = vec ! [ "a1" , "b1" , "c1" ] ;
1961
1950
assert_eq ! ( expected, result) ;
1962
1951
1963
1952
// test two empty vectors
1964
1953
let a: Vec < Vec < & str > > = vec ! [ vec![ ] , vec![ ] ] ;
1965
- let result = zip_nested_vectors ( a , TEST_RESULT_SIZE ) . collect :: < Vec < _ > > ( ) ;
1954
+ let result = rotate_nested_vectors ( a ) . collect :: < Vec < _ > > ( ) ;
1966
1955
1967
1956
let expected: Vec < & str > = vec ! [ ] ;
1968
1957
assert_eq ! ( expected, result) ;
@@ -1974,21 +1963,21 @@ mod test {
1974
1963
vec![ "a1" , "b1" , "c1" ] ,
1975
1964
vec![ "a2" , "b2" , "c2" ] ,
1976
1965
] ;
1977
- let result = zip_nested_vectors ( a , TEST_RESULT_SIZE ) . collect :: < Vec < _ > > ( ) ;
1966
+ let result = rotate_nested_vectors ( a ) . collect :: < Vec < _ > > ( ) ;
1978
1967
1979
- let expected = vec ! [ "a0" , "a1" , "a2" ] ;
1968
+ let expected = vec ! [ "a0" , "a1" , "a2" , "b0" , "b1" , "b2" , "c0" , "c1" , "c2" ] ;
1980
1969
assert_eq ! ( expected, result) ;
1981
1970
1982
1971
// test a filled vector between two empty vectors
1983
1972
let a = vec ! [ vec![ ] , vec![ "a1" , "b1" , "c1" ] , vec![ ] ] ;
1984
- let result = zip_nested_vectors ( a , TEST_RESULT_SIZE ) . collect :: < Vec < _ > > ( ) ;
1973
+ let result = rotate_nested_vectors ( a ) . collect :: < Vec < _ > > ( ) ;
1985
1974
1986
1975
let expected = vec ! [ "a1" , "b1" , "c1" ] ;
1987
1976
assert_eq ! ( expected, result) ;
1988
1977
1989
1978
// test an empty vector at the end of the vectors
1990
1979
let a = vec ! [ vec![ "a0" , "b0" , "c0" ] , vec![ ] ] ;
1991
- let result = zip_nested_vectors ( a , TEST_RESULT_SIZE ) . collect :: < Vec < _ > > ( ) ;
1980
+ let result = rotate_nested_vectors ( a ) . collect :: < Vec < _ > > ( ) ;
1992
1981
1993
1982
let expected = vec ! [ "a0" , "b0" , "c0" ] ;
1994
1983
assert_eq ! ( expected, result) ;
@@ -2002,15 +1991,15 @@ mod test {
2002
1991
vec![ ] ,
2003
1992
] ;
2004
1993
2005
- let result = zip_nested_vectors ( a , TEST_RESULT_SIZE ) . collect :: < Vec < _ > > ( ) ;
1994
+ let result = rotate_nested_vectors ( a ) . collect :: < Vec < _ > > ( ) ;
2006
1995
2007
- let expected = vec ! [ "a1" , "a3" , "b1" ] ;
1996
+ let expected = vec ! [ "a1" , "a3" , "b1" , "b3" , "c1" ] ;
2008
1997
assert_eq ! ( expected, result) ;
2009
1998
2010
1999
// test one element in the first nested vectore and two elements in the second nested
2011
2000
// vector
2012
2001
let a = vec ! [ vec![ "a0" ] , vec![ "a1" , "b1" ] ] ;
2013
- let result = zip_nested_vectors ( a , TEST_RESULT_SIZE ) . collect :: < Vec < _ > > ( ) ;
2002
+ let result = rotate_nested_vectors ( a ) . collect :: < Vec < _ > > ( ) ;
2014
2003
2015
2004
let expected = vec ! [ "a0" , "a1" , "b1" ] ;
2016
2005
assert_eq ! ( expected, result) ;
0 commit comments