@@ -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,26 +270,20 @@ 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
- if total_hints_returned == result_size || hint_index == max_vector_length {
286
+ if hint_index == max_vector_length {
291
287
return None ;
292
288
} ;
293
289
let hint_value = if vecs[ vector_index] . len ( ) != 0 && vecs[ vector_index] . len ( ) > hint_index {
@@ -301,7 +297,6 @@ fn zip_nested_vectors<T: Clone>(vecs: Vec<Vec<T>>, result_size: usize) -> impl I
301
297
hint_index += 1 ;
302
298
} ;
303
299
if !hint_value. is_none ( ) {
304
- total_hints_returned += 1 ;
305
300
return hint_value;
306
301
} ;
307
302
} )
@@ -792,7 +787,7 @@ mod test {
792
787
use lightning:: routing:: router:: { PaymentParameters , RouteParameters } ;
793
788
use lightning:: util:: test_utils;
794
789
use lightning:: util:: config:: UserConfig ;
795
- 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 } ;
796
791
use std:: collections:: HashSet ;
797
792
798
793
#[ test]
@@ -1905,60 +1900,58 @@ mod test {
1905
1900
1906
1901
#[ test]
1907
1902
fn test_zip_nested_vectors ( ) {
1908
- const TEST_RESULT_SIZE : usize = 3 ;
1909
-
1910
1903
// two nested vectors
1911
1904
let a = vec ! [ vec![ "a0" , "b0" , "c0" ] , vec![ "a1" , "b1" ] ] ;
1912
- let result = zip_nested_vectors ( a , TEST_RESULT_SIZE ) . collect :: < Vec < _ > > ( ) ;
1905
+ let result = rotate_nested_vectors ( a ) . collect :: < Vec < _ > > ( ) ;
1913
1906
1914
- let expected = vec ! [ "a0" , "a1" , "b0" ] ;
1907
+ let expected = vec ! [ "a0" , "a1" , "b0" , "b1" , "c0" ] ;
1915
1908
assert_eq ! ( expected, result) ;
1916
1909
1917
1910
// test single nested vector
1918
1911
let a = vec ! [ vec![ "a0" , "b0" , "c0" ] ] ;
1919
- let result = zip_nested_vectors ( a , TEST_RESULT_SIZE ) . collect :: < Vec < _ > > ( ) ;
1912
+ let result = rotate_nested_vectors ( a ) . collect :: < Vec < _ > > ( ) ;
1920
1913
1921
1914
let expected = vec ! [ "a0" , "b0" , "c0" ] ;
1922
1915
assert_eq ! ( expected, result) ;
1923
1916
1924
1917
// test second vector with only one element
1925
1918
let a = vec ! [ vec![ "a0" , "b0" , "c0" ] , vec![ "a1" ] ] ;
1926
- let result = zip_nested_vectors ( a , TEST_RESULT_SIZE ) . collect :: < Vec < _ > > ( ) ;
1919
+ let result = rotate_nested_vectors ( a ) . collect :: < Vec < _ > > ( ) ;
1927
1920
1928
- let expected = vec ! [ "a0" , "a1" , "b0" ] ;
1921
+ let expected = vec ! [ "a0" , "a1" , "b0" , "c0" ] ;
1929
1922
assert_eq ! ( expected, result) ;
1930
1923
1931
1924
// test three nestend vectors
1932
1925
let a = vec ! [ vec![ "a0" ] , vec![ "a1" , "b1" , "c1" ] , vec![ "a2" ] ] ;
1933
- let result = zip_nested_vectors ( a , TEST_RESULT_SIZE ) . collect :: < Vec < _ > > ( ) ;
1926
+ let result = rotate_nested_vectors ( a ) . collect :: < Vec < _ > > ( ) ;
1934
1927
1935
- let expected = vec ! [ "a0" , "a1" , "a2" ] ;
1928
+ let expected = vec ! [ "a0" , "a1" , "a2" , "b1" , "c1" ] ;
1936
1929
assert_eq ! ( expected, result) ;
1937
1930
1938
1931
// test single nested vector with a single value
1939
1932
let a = vec ! [ vec![ "a0" ] ] ;
1940
- let result = zip_nested_vectors ( a , TEST_RESULT_SIZE ) . collect :: < Vec < _ > > ( ) ;
1933
+ let result = rotate_nested_vectors ( a ) . collect :: < Vec < _ > > ( ) ;
1941
1934
1942
1935
let expected = vec ! [ "a0" ] ;
1943
1936
assert_eq ! ( expected, result) ;
1944
1937
1945
1938
// test single empty nested vector
1946
1939
let a: Vec < Vec < & str > > = vec ! [ vec![ ] ] ;
1947
- let result = zip_nested_vectors ( a , TEST_RESULT_SIZE ) . collect :: < Vec < _ > > ( ) ;
1940
+ let result = rotate_nested_vectors ( a ) . collect :: < Vec < _ > > ( ) ;
1948
1941
let expected: Vec < & str > = vec ! [ ] ;
1949
1942
1950
1943
assert_eq ! ( expected, result) ;
1951
1944
1952
1945
// test first nested vector is empty
1953
1946
let a = vec ! [ vec![ ] , vec![ "a1" , "b1" , "c1" ] ] ;
1954
- let result = zip_nested_vectors ( a , TEST_RESULT_SIZE ) . collect :: < Vec < _ > > ( ) ;
1947
+ let result = rotate_nested_vectors ( a ) . collect :: < Vec < _ > > ( ) ;
1955
1948
1956
1949
let expected = vec ! [ "a1" , "b1" , "c1" ] ;
1957
1950
assert_eq ! ( expected, result) ;
1958
1951
1959
1952
// test two empty vectors
1960
1953
let a: Vec < Vec < & str > > = vec ! [ vec![ ] , vec![ ] ] ;
1961
- let result = zip_nested_vectors ( a , TEST_RESULT_SIZE ) . collect :: < Vec < _ > > ( ) ;
1954
+ let result = rotate_nested_vectors ( a ) . collect :: < Vec < _ > > ( ) ;
1962
1955
1963
1956
let expected: Vec < & str > = vec ! [ ] ;
1964
1957
assert_eq ! ( expected, result) ;
@@ -1970,21 +1963,21 @@ mod test {
1970
1963
vec![ "a1" , "b1" , "c1" ] ,
1971
1964
vec![ "a2" , "b2" , "c2" ] ,
1972
1965
] ;
1973
- let result = zip_nested_vectors ( a , TEST_RESULT_SIZE ) . collect :: < Vec < _ > > ( ) ;
1966
+ let result = rotate_nested_vectors ( a ) . collect :: < Vec < _ > > ( ) ;
1974
1967
1975
- let expected = vec ! [ "a0" , "a1" , "a2" ] ;
1968
+ let expected = vec ! [ "a0" , "a1" , "a2" , "b0" , "b1" , "b2" , "c0" , "c1" , "c2" ] ;
1976
1969
assert_eq ! ( expected, result) ;
1977
1970
1978
1971
// test a filled vector between two empty vectors
1979
1972
let a = vec ! [ vec![ ] , vec![ "a1" , "b1" , "c1" ] , vec![ ] ] ;
1980
- let result = zip_nested_vectors ( a , TEST_RESULT_SIZE ) . collect :: < Vec < _ > > ( ) ;
1973
+ let result = rotate_nested_vectors ( a ) . collect :: < Vec < _ > > ( ) ;
1981
1974
1982
1975
let expected = vec ! [ "a1" , "b1" , "c1" ] ;
1983
1976
assert_eq ! ( expected, result) ;
1984
1977
1985
1978
// test an empty vector at the end of the vectors
1986
1979
let a = vec ! [ vec![ "a0" , "b0" , "c0" ] , vec![ ] ] ;
1987
- let result = zip_nested_vectors ( a , TEST_RESULT_SIZE ) . collect :: < Vec < _ > > ( ) ;
1980
+ let result = rotate_nested_vectors ( a ) . collect :: < Vec < _ > > ( ) ;
1988
1981
1989
1982
let expected = vec ! [ "a0" , "b0" , "c0" ] ;
1990
1983
assert_eq ! ( expected, result) ;
@@ -1998,15 +1991,15 @@ mod test {
1998
1991
vec![ ] ,
1999
1992
] ;
2000
1993
2001
- let result = zip_nested_vectors ( a , TEST_RESULT_SIZE ) . collect :: < Vec < _ > > ( ) ;
1994
+ let result = rotate_nested_vectors ( a ) . collect :: < Vec < _ > > ( ) ;
2002
1995
2003
- let expected = vec ! [ "a1" , "a3" , "b1" ] ;
1996
+ let expected = vec ! [ "a1" , "a3" , "b1" , "b3" , "c1" ] ;
2004
1997
assert_eq ! ( expected, result) ;
2005
1998
2006
1999
// test one element in the first nested vectore and two elements in the second nested
2007
2000
// vector
2008
2001
let a = vec ! [ vec![ "a0" ] , vec![ "a1" , "b1" ] ] ;
2009
- let result = zip_nested_vectors ( a , TEST_RESULT_SIZE ) . collect :: < Vec < _ > > ( ) ;
2002
+ let result = rotate_nested_vectors ( a ) . collect :: < Vec < _ > > ( ) ;
2010
2003
2011
2004
let expected = vec ! [ "a0" , "a1" , "b1" ] ;
2012
2005
assert_eq ! ( expected, result) ;
0 commit comments