Repository navigation
FE 0.9.0
FE 0.9.0 is a modernization release focused on C++23, better formatting utilities, cleaner enum-flag ergonomics, and more reliable packaging and documentation workflows.
Highlights
C++23 baseline
- FE now targets C++23 instead of C++20.
- The public docs and examples were updated to reflect the new language level.
Formatting and output improvements
- Added
fe::StreamFnfor wrapping ostream-based formatting so it can be used with bothoperator<<andstd::format. - Added
fe::Join(range, sep)for formatting or streaming ranges without custom boilerplate. - Added
assertf(condition, ...)for richer debug assertions. - Improved
fe::Tabwith safer arithmetic and a convenientTab::spaces()constructor. - Added test coverage for the new formatting helpers.
Better bitflag enums
fe::BitEnumbitwise operators now work as regular global operators.- Bitwise operations now return the enum type instead of its underlying integer type.
- Added
fe::to_underlying(...)for explicit integer conversion. - Added
fe::has_flag(...)plus support for~,|=,&=, and^=.
Robustness, install, and docs
- Fixed the CMake install logic.
- Tightened
fe::termandfe::utf8with broaderconstexpr/noexceptcoverage. - Improved terminal-color handling, including safer Windows console detection.
- Updated Linux and documentation CI to use GCC 14.
- Documentation builds now run with
BUILD_TESTING=OFF, and Doxygen warnings are treated as errors.
Breaking changes and upgrade notes
-
C++23 is now required.
Projects embedding or linking FE should build with a C++23-capable toolchain. -
Bitwise enum expressions stay in the enum domain.
Code that previously comparedMyEnum::A | MyEnum::Bdirectly to an integer should now usefe::to_underlying(...)when it needs the raw bits. -
The old print helpers are gone.
fe::out,fe::outln,fe::err, andfe::errlnhave been removed in favor ofstd::printandstd::println.
Upgrade example
enum class Flags : unsigned {
A = 1 << 0,
B = 1 << 1,
};
template<>
struct fe::is_bit_enum<Flags> : std::true_type {};
Flags flags = Flags::A | Flags::B;
if (fe::has_flag(flags, Flags::A)) {
auto bits = fe::to_underlying(flags);
std::println("flags = {}", bits);
}