Introduce ConstAllocation
.
Currently some `Allocation`s are interned, some are not, and it's very hard to tell at a use point which is which. This commit introduces `ConstAllocation` for the known-interned ones, which makes the division much clearer. `ConstAllocation::inner()` is used to get the underlying `Allocation`. In some places it's natural to use an `Allocation`, in some it's natural to use a `ConstAllocation`, and in some places there's no clear choice. I've tried to make things look as nice as possible, while generally favouring `ConstAllocation`, which is the type that embodies more information. This does require quite a few calls to `inner()`. The commit also tweaks how `PartialOrd` works for `Interned`. The previous code was too clever by half, building on `T: Ord` to make the code shorter. That caused problems with deriving `PartialOrd` and `Ord` for `ConstAllocation`, so I changed it to build on `T: PartialOrd`, which is slightly more verbose but much more standard and avoided the problems.
This commit is contained in:
parent
c38b8a8c62
commit
4852291417
30 changed files with 166 additions and 119 deletions
|
@ -62,13 +62,17 @@ impl<'a, T> PartialEq for Interned<'a, T> {
|
|||
|
||||
impl<'a, T> Eq for Interned<'a, T> {}
|
||||
|
||||
// In practice you can't intern any `T` that doesn't implement `Eq`, because
|
||||
// that's needed for hashing. Therefore, we won't be interning any `T` that
|
||||
// implements `PartialOrd` without also implementing `Ord`. So we can have the
|
||||
// bound `T: Ord` here and avoid duplication with the `Ord` impl below.
|
||||
impl<'a, T: Ord> PartialOrd for Interned<'a, T> {
|
||||
impl<'a, T: PartialOrd> PartialOrd for Interned<'a, T> {
|
||||
fn partial_cmp(&self, other: &Interned<'a, T>) -> Option<Ordering> {
|
||||
Some(self.cmp(other))
|
||||
// Pointer equality implies equality, due to the uniqueness constraint,
|
||||
// but the contents must be compared otherwise.
|
||||
if ptr::eq(self.0, other.0) {
|
||||
Some(Ordering::Equal)
|
||||
} else {
|
||||
let res = self.0.partial_cmp(&other.0);
|
||||
debug_assert_ne!(res, Some(Ordering::Equal));
|
||||
res
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue