Full Changelog: https://github.com/bitflags/bitflags/compare/2.5.0...2.6.0
Debug
for Flag<B>
by @tgross35 in https://github.com/bitflags/bitflags/pull/398Full Changelog: https://github.com/bitflags/bitflags/compare/2.4.2...2.5.0
unused_tuple_struct_fields
lint by @dtolnay in https://github.com/bitflags/bitflags/pull/393local_inner_macros
by @dtolnay in https://github.com/bitflags/bitflags/pull/392Full Changelog: https://github.com/bitflags/bitflags/compare/2.4.1...2.4.2
Full Changelog: https://github.com/bitflags/bitflags/compare/2.4.0...2.4.1
Full Changelog: https://github.com/bitflags/bitflags/compare/2.3.3...2.4.0
-=
The -=
operator was incorrectly changed to truncate bits that didn't correspond to valid flags in 2.3.0
. This has been fixed up so it once again behaves the same as -
and difference
.
!
The !
operator previously called Self::from_bits_truncate
, which would truncate any bits that only partially overlapped with a valid flag. It will now use bits & Self::all().bits()
, so any bits that overlap any bits specified by any flag will be respected. This is unlikely to have any practical implications, but enables defining a flag like const ALL = !0
as a way to signal that any bit pattern is a known set of flags.
Zero-valued flags will never be printed. You'll either get 0x0
for empty flags using debug formatting, or the set of flags with zero-valued flags omitted for others.
Composite flags will no longer be redundantly printed if there are extra bits to print at the end that don't correspond to a valid flag.
Full Changelog: https://github.com/bitflags/bitflags/compare/2.3.2...2.3.3
Full Changelog: https://github.com/bitflags/bitflags/compare/2.3.1...2.3.2
Full Changelog: https://github.com/bitflags/bitflags/compare/2.3.0...2.3.1
BitFlags
trait deprecated in favor of Flags
traitThis release introduces the Flags
trait and deprecates the BitFlags
trait. These two traits are semver compatible so if you have public API code depending on BitFlags
you can move to Flags
without breaking end-users. This is possible because the BitFlags
trait was never publicly implementable, so it now carries Flags
as a supertrait. All implementations of Flags
additionally implement BitFlags
.
The Flags
trait is a publicly implementable version of the old BitFlags
trait. The original BitFlags
trait carried some macro baggage that made it difficult to implement, so a new Flags
trait has been introduced as the One True Trait for interacting with flags types generically. See the the macro_free
and custom_derive
examples for more details.
Bits
trait publicly exposedThe Bits
trait for the underlying storage of flags values is also now publicly implementable. This lets you define your own exotic backing storage for flags. See the custom_bits_type
example for more details.
Full Changelog: https://github.com/bitflags/bitflags/compare/2.2.1...2.3.0
Full Changelog: https://github.com/bitflags/bitflags/compare/2.2.0...2.2.1
Full Changelog: https://github.com/bitflags/bitflags/compare/2.1.0...2.2.0
Full Changelog: https://github.com/bitflags/bitflags/compare/2.0.2...2.1.0
Full Changelog: https://github.com/bitflags/bitflags/compare/2.0.1...2.0.2
Full Changelog: https://github.com/bitflags/bitflags/compare/2.0.0...2.0.1
This release includes some major changes over 1.x
. If you use bitflags!
types in your public API then upgrading this library may cause breakage in your downstream users.
You'll need to add the serde
Cargo feature in order to #[derive(Serialize, Deserialize)]
on your generated flags types:
bitflags! { #[derive(Serialize, Deserialize)] #[serde(transparent)] pub struct Flags: T { .. } }
where T
is the underlying bits type you're using, such as u32
.
The default serialization format with serde
has changed if you #[derive(Serialize, Deserialize)]
on your generated flags types. It will now use a formatted string for human-readable formats and the underlying bits type for compact formats.
To keep the old format, see the https://github.com/KodrAus/bitflags-serde-legacy library.
Generated flags types now derive fewer traits. If you need to maintain backwards compatibility, you can derive the following yourself:
#[derive(PartialEq, Eq, PartialOrd, Ord, Hash, Debug, Clone, Copy)]
The unsafe from_bits_unchecked
method is now a safe from_bits_retain
method.
You can add the following method to your generated types to keep them compatible:
#[deprecated = "use the safe `from_bits_retain` method instead"] pub unsafe fn from_bits_unchecked(bits: T) -> Self { Self::from_bits_retain(bits) }
where T
is the underlying bits type you're using, such as u32
.
.bits
fieldYou can now use the .bits()
method instead of the old .bits
.
The representation of generated flags types has changed from a struct with the single field bits
to a newtype.
Ok
by @konsumlamm in https://github.com/bitflags/bitflags/pull/266Debug
implementation by @konsumlamm in https://github.com/bitflags/bitflags/pull/268Full Changelog: https://github.com/bitflags/bitflags/compare/1.3.2...2.0.0
Full Changelog: https://github.com/bitflags/bitflags/compare/2.0.0-rc.2...2.0.0-rc.3
serde
serialization⚠️ NOTE ⚠️ This release changes the default serialization you'll get if you #[derive(Serialize, Deserialize)]
on your generated flags types. It will now use a formatted string for human-readable formats and the underlying bits type for compact formats.
To keep the old behavior, see the bitflags-serde-legacy
library.
Full Changelog: https://github.com/bitflags/bitflags/compare/2.0.0-rc.1...2.0.0-rc.2
This is a big release including a few years worth of work on a new BitFlags
trait, iteration, and better macro organization for future extensibility.
Ok
by @konsumlamm in https://github.com/bitflags/bitflags/pull/266Debug
implementation by @konsumlamm in https://github.com/bitflags/bitflags/pull/268Full Changelog: https://github.com/bitflags/bitflags/compare/1.3.2...2.0.0-rc.1
non_snake_case
in generated flags types (#256)#[repr(transparent)]
(#252)This release bumps the Minimum Supported Rust Version to 1.46.0
Add #[repr(transparent)]
(#187)
End empty
doc comment with full stop (#202)
Fix typo in crate root docs (#206)
Document from_bits_unchecked unsafety (#207)
Let is_all
ignore extra bits (#211)
Allows empty flag definition (#225)
Making crate accessible from std (#227)
Make from_bits
a const fn (#229)
Allow multiple bitflags structs in one macro invocation (#235)
Add named functions to perform set operations (#244)
Fix typos in method docs (#245)
Modernization of the bitflags
macro to take advantage of newer features and 2018 idioms (#246)
Fix regression (in an unreleased feature) and simplify tests (#247)
Use Self
and fix bug when overriding stringify!
(#249)
#[inline]
attributes (#194)This is a re-release of 1.0.5
, which was yanked due to a bug in the RLS.
Use compiletest_rs flags supported by stable toolchain (#171)
Put the user provided attributes first (#173)
Make bitflags methods const
on newer compilers (#175)
Support Rust 2018 style macro imports (#165)
use bitflags::bitflags;
30% improvement in compile time of bitflags crate (#156)
Documentation improvements (#153)
Implementation cleanup (#149)
pub(restricted)
specifier on the bitflags struct (#135)all()
when called from a separate crate (#136)[breaking change] Macro now generates associated constants (#24)
[breaking change] Minimum supported version is Rust 1.20, due to usage of associated constants
After being broken in 0.9, the #[deprecated]
attribute is now supported again (#112)
Other improvements to unit tests and documentation (#106 and #115)
Assuming the following structure definition:
bitflags! { struct Something: u8 { const FOO = 0b01, const BAR = 0b10 } }
In 0.9 and older you could do:
let x = FOO.bits | BAR.bits;
Now you must use:
let x = Something::FOO.bits | Something::BAR.bits;
Formatting
traits when other formatting traits were present in scope (#105)[breaking change] Use struct keyword instead of flags to define bitflag types (#84)
[breaking change] Terminate const items with semicolons instead of commas (#87)
Implement the Hex
, Octal
, and Binary
formatting traits (#86)
Printing an empty flag value with the Debug
trait now prints “(empty)” instead of nothing (#85)
The bitflags!
macro can now be used inside of a fn body, to define a type local to that function (#74)
i128
and u128
integer types (#57)flags.set(SOME_FLAG, true)
or flags.set(SOME_FLAG, false)
(#55) This may break code that defines its own set method(yanked)
bitflags!
macro to refer to items imported from other modules (#51)no_std
feature was removed as it is now the defaultassignment_operators
feature was remove as it is now enabled by default