Frozen library - 0-cost initialisation, immutable, fixed-size containers

Tomaž Vajngerl quikee at
Sat Jun 17 10:31:30 UTC 2023


With [1] I have added header-only Frozen library [2] (version 1.1.1)
to LibreOffice. Frozen is a library that provides 0-cost init, fixed
size and immutable containers (unordered_map, map, unordered_set,
set). See [2] for a better explanation.

This means that we can now use in the code a "constexpr
froze::unordered_map" for cases where we have compile-time static data
(for example strings that map to enum values or the other way around)
that will not take any cost to initialize (unlike populating an static
std::unorderd_map) and should be faster to look up because of perfect
hashes (just like gperf). For example see [4] [5] where I converted
some code to use frozen::unordered_map and frozen::unordered_set.
I haven't done much performance measurements to see if we are gaining
some (start-up) speed  as just this couple of cases in [4] and [5]
don't make much difference overall.

You can use frozen containers with most basic int/float types as "key"
and for string you have to use either std::string_view or

To use a frozen container you have to include:
#include <frozen/bits/defines.h> (sets up defines that are used later
in the container to decide what impl. to use)
#include <frozen/bits/elsa_std.h> (needed for {u16}string_view support)
#include <frozen/unordered_map.h> (for unorderred_map support - can
also use frozen/unordered_set.h, frozen/map.h, frozen/set.h)

Maybe we can do something to make this easier.

After this you can just declare:

constexpr frozen::unordere_map<std::u16string_view, sal_Int32, 3> constData {
   { u"one" , 1 },
   { u"two", 2 },
   { u"three", 3 }
or alternatively (didn't try it) with no need to state the number of elements:
constexpr auto constData =
frozen::make_unordered_map<std::u16string_view, sal_Int32, 3>({

Lookup is the same as in std::unordered_map:
auto iterator = constData.find(u"one");
if (iterator != constData.end())
   ... found
   type value = iterator->second;
  ... not found


auto element ="one");

However I think constData[u"one"] doesn't work

Any thoughts appreciated. I hope this will not cause problems and make
the code in the long run better readable, and also faster.


Best Regards, Tomaž

More information about the LibreOffice mailing list