-// Tags
-const TAG_INLINE: u32 = 0;
-const TAG_INTERNED: u32 = 1;
-const TAG_MASK: u32 = 1;
-
-// Fields indexes
-const BASE_INDEX: usize = 0;
-const LEN_INDEX: usize = 1;
-const CTXT_INDEX: usize = 2;
-
-// Tag = 0, inline format.
-// -------------------------------------------------------------
-// | base 31:7 | len 6:1 | ctxt (currently 0 bits) | tag 0:0 |
-// -------------------------------------------------------------
-// Since there are zero bits for ctxt, only SpanData with a 0 SyntaxContext
-// can be inline.
-const INLINE_SIZES: [u32; 3] = [25, 6, 0];
-const INLINE_OFFSETS: [u32; 3] = [7, 1, 1];
-
-// Tag = 1, interned format.
-// ------------------------
-// | index 31:1 | tag 0:0 |
-// ------------------------
-const INTERNED_INDEX_SIZE: u32 = 31;
-const INTERNED_INDEX_OFFSET: u32 = 1;
-
-#[inline]
-fn encode(sd: &SpanData) -> Span {
- let (base, len, ctxt) = (sd.lo.0, sd.hi.0 - sd.lo.0, sd.ctxt.as_u32());
-
- let val = if (base >> INLINE_SIZES[BASE_INDEX]) == 0 &&
- (len >> INLINE_SIZES[LEN_INDEX]) == 0 &&
- (ctxt >> INLINE_SIZES[CTXT_INDEX]) == 0 {
- (base << INLINE_OFFSETS[BASE_INDEX]) | (len << INLINE_OFFSETS[LEN_INDEX]) |
- (ctxt << INLINE_OFFSETS[CTXT_INDEX]) | TAG_INLINE
- } else {
- let index = with_span_interner(|interner| interner.intern(sd));
- (index << INTERNED_INDEX_OFFSET) | TAG_INTERNED
- };
- Span(val)
-}
-
-#[inline]
-fn decode(span: Span) -> SpanData {
- let val = span.0;
-
- // Extract a field at position `pos` having size `size`.
- let extract = |pos: u32, size: u32| {
- let mask = ((!0u32) as u64 >> (32 - size)) as u32; // Can't shift u32 by 32
- (val >> pos) & mask
- };
-
- let (base, len, ctxt) = if val & TAG_MASK == TAG_INLINE {(
- extract(INLINE_OFFSETS[BASE_INDEX], INLINE_SIZES[BASE_INDEX]),
- extract(INLINE_OFFSETS[LEN_INDEX], INLINE_SIZES[LEN_INDEX]),
- extract(INLINE_OFFSETS[CTXT_INDEX], INLINE_SIZES[CTXT_INDEX]),
- )} else {
- let index = extract(INTERNED_INDEX_OFFSET, INTERNED_INDEX_SIZE);
- return with_span_interner(|interner| *interner.get(index));
- };
- SpanData { lo: BytePos(base), hi: BytePos(base + len), ctxt: SyntaxContext::from_u32(ctxt) }
-}
-