macro_rules! is_sorted_lt_until_alignment_boundary {
($s:ident, $ty:ident, $boundary:expr) => {{
let n = $s.len();
if n < 2 {
return n as usize;
}
let mut i: usize = 0;
{
let mut a =
$s.as_ptr().align_offset($boundary) / ::mem::size_of::<$ty>();
while a > 0 && i < n - 1 {
if !($s.get_unchecked(i) <= $s.get_unchecked(i + 1)) {
return i;
}
i += 1;
a -= 1;
}
debug_assert!(
i == n - 1
|| $s.as_ptr().offset(i as isize).align_offset($boundary)
== 0
);
}
i
}};
}
macro_rules! is_sorted_lt_tail {
($s:ident, $n:ident, $i:ident) => {{
while $i < $n - 1 {
if !($s.get_unchecked($i) <= $s.get_unchecked($i + 1)) {
return $i;
}
$i += 1;
}
debug_assert!($i == $n - 1);
$i + 1
}};
}
macro_rules! is_sorted_gt_until_alignment_boundary {
($s:ident, $ty:ident, $boundary:expr) => {{
let n = $s.len();
if n < 2 {
return n;
}
let mut i: usize = 0;
{
let mut a =
$s.as_ptr().align_offset($boundary) / ::mem::size_of::<$ty>();
while a > 0 && i < n - 1 {
if !($s.get_unchecked(i) >= $s.get_unchecked(i + 1)) {
return i;
}
i += 1;
a -= 1;
}
debug_assert!(
i == n - 1
|| $s.as_ptr().offset(i as isize).align_offset($boundary)
== 0
);
}
i
}};
}
macro_rules! is_sorted_gt_tail {
($s:ident, $n:ident, $i:ident) => {{
while $i < $n - 1 {
if !($s.get_unchecked($i) >= $s.get_unchecked($i + 1)) {
return $i;
}
$i += 1;
}
debug_assert!($i == $n - 1);
$i + 1
}};
}