1 | /// Zero-Sized Type (ZST) for internal `BTreeSet` values. |
2 | /// Used instead of `()` to differentiate between: |
3 | /// * `BTreeMap<T, ()>` (possible user-defined map) |
4 | /// * `BTreeMap<T, SetValZST>` (internal set representation) |
5 | #[derive (Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Default)] |
6 | pub struct SetValZST; |
7 | |
8 | /// A trait to differentiate between `BTreeMap` and `BTreeSet` values. |
9 | /// Returns `true` only for type `SetValZST`, `false` for all other types (blanket implementation). |
10 | /// `TypeId` requires a `'static` lifetime, use of this trait avoids that restriction. |
11 | /// |
12 | /// [`TypeId`]: std::any::TypeId |
13 | pub trait IsSetVal { |
14 | fn is_set_val() -> bool; |
15 | } |
16 | |
17 | // Blanket implementation |
18 | impl<V> IsSetVal for V { |
19 | default fn is_set_val() -> bool { |
20 | false |
21 | } |
22 | } |
23 | |
24 | // Specialization |
25 | impl IsSetVal for SetValZST { |
26 | fn is_set_val() -> bool { |
27 | true |
28 | } |
29 | } |
30 | |