diff options
author | swarmer <swarmer@yandex-team.com> | 2024-04-14 14:26:05 +0300 |
---|---|---|
committer | swarmer <swarmer@yandex-team.com> | 2024-04-14 14:39:47 +0300 |
commit | e646c0d6f331d5baf752fa3dd60e2cde92ffc966 (patch) | |
tree | 0f754da5d4a9ce4dbf716a99eb5ffd7faf603529 /util/system/file.cpp | |
parent | 89f2322ff646da7f9719ae9f7145368da9ee79d4 (diff) | |
download | ydb-e646c0d6f331d5baf752fa3dd60e2cde92ffc966.tar.gz |
reduce code bloat in the DecodeOpenMode function
The loop version works as fast as unrolled one. But the binary code size is about 7 times smaller.
9c014c6ba2ab744670f9ac2fe3bf57942e01b0a1
Diffstat (limited to 'util/system/file.cpp')
-rw-r--r-- | util/system/file.cpp | 100 |
1 files changed, 56 insertions, 44 deletions
diff --git a/util/system/file.cpp b/util/system/file.cpp index 349e2a667e..d9acde845d 100644 --- a/util/system/file.cpp +++ b/util/system/file.cpp @@ -832,52 +832,64 @@ TString DecodeOpenMode(ui32 mode0) { TStringBuilder r; -#define F(flag) \ - if ((mode & flag) == flag) { \ - mode &= ~flag; \ - if (r) { \ - r << TStringBuf("|"); \ - } \ - r << TStringBuf(#flag); \ - } - - F(RdWr) - F(RdOnly) - F(WrOnly) - - F(CreateAlways) - F(CreateNew) - F(OpenAlways) - F(TruncExisting) - F(ForAppend) - F(Transient) - F(CloseOnExec) - - F(Temp) - F(Sync) - F(Direct) - F(DirectAligned) - F(Seq) - F(NoReuse) - F(NoReadAhead) - - F(AX) - F(AR) - F(AW) - F(ARW) - - F(AXOther) - F(AWOther) - F(AROther) - F(AXGroup) - F(AWGroup) - F(ARGroup) - F(AXUser) - F(AWUser) - F(ARUser) + struct TFlagCombo { + ui32 Value; + TStringBuf Name; + }; + + static constexpr TFlagCombo knownFlagCombos[]{ + +#define F(flag) {flag, #flag} + + F(RdWr), + F(RdOnly), + F(WrOnly), + + F(CreateAlways), + F(CreateNew), + F(OpenAlways), + F(TruncExisting), + F(ForAppend), + F(Transient), + F(CloseOnExec), + + F(Temp), + F(Sync), + F(Direct), + F(DirectAligned), + F(Seq), + F(NoReuse), + F(NoReadAhead), + + F(AX), + F(AR), + F(AW), + F(ARW), + + F(AXOther), + F(AWOther), + F(AROther), + F(AXGroup), + F(AWGroup), + F(ARGroup), + F(AXUser), + F(AWUser), + F(ARUser), #undef F + }; + + for (const auto& [flag, name] : knownFlagCombos) { + if ((mode & flag) == flag) { + mode &= ~flag; + if (r) { + r << '|'; + } + r << name; + } + } + if (mode != 0) { if (r) { r << TStringBuf("|"); @@ -890,7 +902,7 @@ TString DecodeOpenMode(ui32 mode0) { return "0"; } - return r; + return std::move(r); } class TFile::TImpl: public TAtomicRefCount<TImpl> { |