Skip to content

Commit 3c7fcfb

Browse files
authored
Write random_shuffle in terms of iterators (#542)
1 parent 68fa9f4 commit 3c7fcfb

4 files changed

Lines changed: 34 additions & 48 deletions

File tree

‎rules/algorithm/tgt_refcount.rs‎

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -145,15 +145,15 @@ fn f17<T1: PartialOrd + Clone + ByteRepr>(a0: Ptr<T1>, a1: Ptr<T1>) -> Ptr<T1> {
145145
if a0.read() >= a1.read() { a0 } else { a1 }
146146
}
147147

148-
fn f18<T1: Clone + ByteRepr>(a0: Ptr<T1>, a1: Ptr<T1>) {
149-
let count = a1.get_offset() - a0.get_offset();
150-
let random = std::hash::RandomState::new();
151-
for i in (1..count).rev() {
152-
let j = std::hash::BuildHasher::hash_one(&random, i) as usize % (i + 1);
153-
let x = a0.offset(i);
154-
let y = a0.offset(j);
155-
let tmp = x.read();
156-
x.write(y.read());
157-
y.write(tmp);
148+
fn f18<T1: CppRandomAccessIterator<T2>, T2: Clone + ByteRepr>(a0: T1, a1: T1) {
149+
let __n = a1.iter_distance(&a0);
150+
let __random = std::hash::RandomState::new();
151+
for __i in (1..__n).rev() {
152+
let __j = (std::hash::BuildHasher::hash_one(&__random, __i) % (__i + 1) as u64) as isize;
153+
let __x = a0.iter_at(__i);
154+
let __y = a0.iter_at(__j);
155+
let __tmp = __x.read();
156+
__x.write(__y.read());
157+
__y.write(__tmp);
158158
}
159159
}

‎rules/algorithm/tgt_unsafe.rs‎

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -156,10 +156,10 @@ unsafe fn f17<T1: PartialOrd>(a0: *const T1, a1: *const T1) -> *const T1 {
156156
}
157157
}
158158

159-
unsafe fn f18<T1>(a0: *mut T1, a1: *mut T1) {
160-
let len = a1.offset_from(a0) as usize;
161-
let slice = ::std::slice::from_raw_parts_mut(a0, len);
162-
for i in (1..len).rev() {
163-
slice.swap(i, libc::rand() as usize % (i + 1));
159+
unsafe fn f18<T1: UnsafeCppRandomAccessIterator<T2>, T2>(a0: T1, a1: T1) {
160+
let __n = a1.iter_distance(&a0);
161+
for __i in (1..__n).rev() {
162+
let __j = libc::rand() as isize % (__i + 1);
163+
std::ptr::swap(a0.iter_at(__i), a0.iter_at(__j));
164164
}
165165
}

‎tests/unit/out/refcount/elidable_iterator_copy_cxx11.rs‎

Lines changed: 11 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -32,32 +32,17 @@ fn main_0() -> i32 {
3232
assert!((*it.borrow()) != RandomAccessIterator::Vec((v.as_pointer() as Ptr<i32>).to_end()));
3333
assert!((((*it.borrow()).iter_deref().read()) == 7));
3434
{
35-
let count = Rc::new(RefCell::new(RandomAccessIterator::Vec(
36-
(v.as_pointer() as Ptr<i32>).to_end(),
37-
)))
38-
.as_pointer()
39-
.get_offset()
40-
- Rc::new(RefCell::new(RandomAccessIterator::Vec(
41-
(v.as_pointer() as Ptr<i32>),
42-
)))
43-
.as_pointer()
44-
.get_offset();
45-
let random = std::hash::RandomState::new();
46-
for i in (1..count).rev() {
47-
let j = std::hash::BuildHasher::hash_one(&random, i) as usize % (i + 1);
48-
let x = Rc::new(RefCell::new(RandomAccessIterator::Vec(
49-
(v.as_pointer() as Ptr<i32>),
50-
)))
51-
.as_pointer()
52-
.offset(i);
53-
let y = Rc::new(RefCell::new(RandomAccessIterator::Vec(
54-
(v.as_pointer() as Ptr<i32>),
55-
)))
56-
.as_pointer()
57-
.offset(j);
58-
let tmp = x.read();
59-
x.write(y.read());
60-
y.write(tmp);
35+
let __n = RandomAccessIterator::Vec((v.as_pointer() as Ptr<i32>).to_end())
36+
.iter_distance(&RandomAccessIterator::Vec((v.as_pointer() as Ptr<i32>)));
37+
let __random = std::hash::RandomState::new();
38+
for __i in (1..__n).rev() {
39+
let __j =
40+
(std::hash::BuildHasher::hash_one(&__random, __i) % (__i + 1) as u64) as isize;
41+
let __x = RandomAccessIterator::Vec((v.as_pointer() as Ptr<i32>)).iter_at(__i);
42+
let __y = RandomAccessIterator::Vec((v.as_pointer() as Ptr<i32>)).iter_at(__j);
43+
let __tmp = __x.read();
44+
__x.write(__y.read());
45+
__y.write(__tmp);
6146
}
6247
};
6348
{

‎tests/unit/out/unsafe/elidable_iterator_copy_cxx11.rs‎

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,14 @@ unsafe fn main_0() -> i32 {
3434
assert!(it != UnsafeRandomAccessIterator::Vec(v.as_mut_ptr().add(v.len())));
3535
assert!(((*it.iter_deref()) == (7)));
3636
{
37-
let len = UnsafeRandomAccessIterator::Vec(v.as_mut_ptr().add(v.len()))
38-
.offset_from(UnsafeRandomAccessIterator::Vec(v.as_mut_ptr()))
39-
as usize;
40-
let slice =
41-
::std::slice::from_raw_parts_mut(UnsafeRandomAccessIterator::Vec(v.as_mut_ptr()), len);
42-
for i in (1..len).rev() {
43-
slice.swap(i, libc::rand() as usize % (i + 1));
37+
let __n = UnsafeRandomAccessIterator::Vec(v.as_mut_ptr().add(v.len()))
38+
.iter_distance(&UnsafeRandomAccessIterator::Vec(v.as_mut_ptr()));
39+
for __i in (1..__n).rev() {
40+
let __j = libc::rand() as isize % (__i + 1);
41+
std::ptr::swap(
42+
UnsafeRandomAccessIterator::Vec(v.as_mut_ptr()).iter_at(__i),
43+
UnsafeRandomAccessIterator::Vec(v.as_mut_ptr()).iter_at(__j),
44+
);
4445
}
4546
};
4647
{

0 commit comments

Comments
 (0)