use core::fmt::{Debug, Formatter};
use core::hash::{Hash, Hasher};
use core::ops::*;
-use serde2 as serde;
use num_traits::*;
/// A reexport of serde so there is no requirement to depend on serde.
#[cfg(feature = "serde")] pub use serde2 as serde;
+
+ /// The actual members of EnumSetType. Put here to avoid polluting global namespaces.
+ pub unsafe trait EnumSetTypePrivate {
+ type Repr: EnumSetTypeRepr;
+ const ALL_BITS: Self::Repr;
+ fn enum_into_u8(self) -> u8;
+ unsafe fn enum_from_u8(val: u8) -> Self;
+
+ #[cfg(feature = "serde")]
+ fn serialize<S: serde::Serializer>(set: EnumSet<Self>, ser: S) -> Result<S::Ok, S::Error>
+ where Self: EnumSetType;
+ #[cfg(feature = "serde")]
+ fn deserialize<'de, D: serde::Deserializer<'de>>(de: D) -> Result<EnumSet<Self>, D::Error>
+ where Self: EnumSetType;
+ }
}
+use internal::EnumSetTypePrivate;
mod private {
use super::*;
/// A, B, C, D, E, F, G,
/// }
/// ```
-pub unsafe trait EnumSetType: Copy + Eq {
- #[doc(hidden)] type Repr: EnumSetTypeRepr;
- #[doc(hidden)] const ALL_BITS: Self::Repr;
- #[doc(hidden)] fn enum_into_u8(self) -> u8;
- #[doc(hidden)] unsafe fn enum_from_u8(val: u8) -> Self;
-
- #[cfg(feature = "serde")] #[doc(hidden)]
- fn serialize<S: serde::Serializer>(set: EnumSet<Self>, ser: S) -> Result<S::Ok, S::Error>;
- #[cfg(feature = "serde")] #[doc(hidden)]
- fn deserialize<'de, D: serde::Deserializer<'de>>(de: D) -> Result<EnumSet<Self>, D::Error>;
-}
+pub unsafe trait EnumSetType: Copy + Eq + EnumSetTypePrivate { }
/// An efficient set type for enums.
///
}
macro_rules! test_enum {
- ($e:ident, $mem_size:expr, $ser_size:expr) => {
- const CONST_SET: EnumSet<$e> = enum_set!($e, $e::A | $e::C);
+ ($e:ident, $mem_size:expr) => {
+ const CONST_SET: EnumSet<$e> = enum_set!($e::A | $e::C);
const EMPTY_SET: EnumSet<$e> = enum_set!();
#[test]
fn const_set() {
($m:ident, $($tt:tt)*) => { mod $m { use super::*; $($tt)*; } }
}
-tests!(small_enum, test_enum!(SmallEnum, 4, 4));
-tests!(large_enum, test_enum!(LargeEnum, 16, 16));
-tests!(enum8, test_enum!(Enum8, 1, 1));
-tests!(enum128, test_enum!(Enum128, 16, 16));
-tests!(sparse_enum, test_enum!(SparseEnum, 16, 16));
\ No newline at end of file
+tests!(small_enum, test_enum!(SmallEnum, 4));
+tests!(large_enum, test_enum!(LargeEnum, 16));
+tests!(enum8, test_enum!(Enum8, 1));
+tests!(enum128, test_enum!(Enum128, 16));
+tests!(sparse_enum, test_enum!(SparseEnum, 16));
\ No newline at end of file
let serde_ops = quote! { };
quote! {
- unsafe impl ::enumset::EnumSetType for #name {
+ unsafe impl ::enumset::internal::EnumSetTypePrivate for #name {
type Repr = #repr;
const ALL_BITS: Self::Repr = #all_variants;
#serde_ops
}
+ unsafe impl ::enumset::EnumSetType for #name { }
+
impl #core::cmp::PartialEq for #name {
fn eq(&self, other: &Self) -> bool {
(*self as u8) == (*other as u8)