1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
// Copyright (C) 2019-2020 Aleo Systems Inc. // This file is part of the snarkVM library. // The snarkVM library is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // The snarkVM library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with the snarkVM library. If not, see <https://www.gnu.org/licenses/>. #[derive(Debug)] pub struct BitIterator<E> { t: E, n: usize, } #[allow(clippy::len_without_is_empty)] impl<E: AsRef<[u64]>> BitIterator<E> { pub fn new(t: E) -> Self { let n = t.as_ref().len() * 64; BitIterator { t, n } } pub fn len(&self) -> usize { self.n } } impl<E: AsRef<[u64]>> Iterator for BitIterator<E> { type Item = bool; fn next(&mut self) -> Option<bool> { if self.n == 0 { None } else { self.n -= 1; let part = self.n / 64; let bit = self.n - (64 * part); Some(self.t.as_ref()[part] & (1 << bit) > 0) } } }