← Back to context

Comment by Groxx

10 hours ago

"You have 400 megabytes of zeros in <this type>" is probably a pretty easy heuristic to add.

That may be surprisingly difficult in Rust. We generally think of Option<T> using O to represent None. However, it can actually use any invalid value of T

  • For example None of Option<OwnedFd> is the bit pattern for the integer -1, the invalid Unix file descriptor

    And in this particular context None of Option<CompactString> is the bit pattern for a carefully chosen impossible 24 byte slice, all zeroes is of course a completely valid way to spell 24 of the ASCII NUL U+0000 character so we can't use that to signify None, but many 24 byte slices are not valid UTF-8 encodings.

    When some day I get to make my own BalancedI8 in stable Rust (the 8-bit signed integer except without the slightly annoying and rarely needed most negative value -128) then None of Option<BalancedI8> will occupy the bit pattern for -128 which is 0x80

    • I often wish this type existed, but didn't find a way to define the niche value for the compiler to optimize the None-case.

      Do you know a solution to this?

      2 replies →