Implemented Default, PartialOrd, and Ord for RocDec

This commit is contained in:
svcxc 2024-10-14 14:50:53 +02:00
parent 2936a37a1c
commit b7ec1f143b
No known key found for this signature in database
GPG key ID: E14BEA79180F7122
2 changed files with 42 additions and 1 deletions

View file

@ -289,7 +289,7 @@ impl<T, E> Drop for RocResult<T, E> {
}
}
#[derive(Copy, Clone, PartialEq, Eq, Hash)]
#[derive(Copy, Clone, PartialEq, Eq, Hash, Default)]
#[repr(C, align(16))]
pub struct RocDec([u8; 16]);
@ -477,6 +477,18 @@ impl fmt::Display for RocDec {
}
}
impl PartialOrd for RocDec {
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
Some(self.cmp(other))
}
}
impl Ord for RocDec {
fn cmp(&self, other: &Self) -> Ordering {
self.as_i128().cmp(&other.as_i128())
}
}
#[repr(C, align(16))]
#[derive(Clone, Copy, Eq, Default)]
pub struct I128([u8; 16]);

View file

@ -307,6 +307,35 @@ mod test_roc_std {
assert_eq!(format!("{example}"), "3.141592653589793238");
}
#[test]
fn roc_dec_sort() {
let neg_one_point_five = RocDec::from_str("-1.5").unwrap();
let mut sorted_by_ord = [
neg_one_point_five,
RocDec::from(35),
RocDec::from(-10057),
RocDec::from(0),
];
sorted_by_ord.sort();
let manually_sorted = [
RocDec::from(-10057),
neg_one_point_five,
RocDec::from(0),
RocDec::from(35),
];
assert_eq!(sorted_by_ord, manually_sorted);
}
#[test]
fn roc_dec_default() {
// check if derived Default still returns zero if the implementation ever changes
assert_eq!(RocDec::from(0), RocDec::default());
}
#[test]
fn safe_send_no_copy() {
let x = RocStr::from("This is a long string but still unique. Yay!!!");