diff options
author | Jade Lovelace <lix@jade.fyi> | 2024-08-22 21:02:52 -0700 |
---|---|---|
committer | Rebecca Turner <rbt@sent.as> | 2024-08-28 09:52:05 -0700 |
commit | 4d8984420788d6253d2fd9bfa3ada92be8bfd73b (patch) | |
tree | d5db726ff1b87672c01f04e27064d5188d27d45a /src/libutil/serialise.cc | |
parent | 422550fd68a5877534b1ca577fc3c7d89b6706dd (diff) |
build: remove about 30 cpu-sec of compile time by explicit instantiation
Apparently the fmt contraption has some extremely popular overloads, and
the boost stuff in there gets built approximately infinite times in
every compilation unit.
Change-Id: Ideba2db7d6bf8559e4d91974bab636f5ed106198
Diffstat (limited to 'src/libutil/serialise.cc')
-rw-r--r-- | src/libutil/serialise.cc | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/src/libutil/serialise.cc b/src/libutil/serialise.cc index a6dd7e200..4eda1b7e7 100644 --- a/src/libutil/serialise.cc +++ b/src/libutil/serialise.cc @@ -9,6 +9,31 @@ namespace nix { +template<typename T> +T readNum(Source & source) +{ + unsigned char buf[8]; + source(charptr_cast<char *>(buf), sizeof(buf)); + + auto n = readLittleEndian<uint64_t>(buf); + + if (n > (uint64_t) std::numeric_limits<T>::max()) + throw SerialisationError("serialised integer %d is too large for type '%s'", n, typeid(T).name()); + + return (T) n; +} + +template bool readNum<bool>(Source & source); + +template unsigned char readNum<unsigned char>(Source & source); + +template unsigned int readNum<unsigned int>(Source & source); + +template unsigned long readNum<unsigned long>(Source & source); +template long readNum<long>(Source & source); + +template unsigned long long readNum<unsigned long long>(Source & source); +template long long readNum<long long>(Source & source); void BufferedSink::operator () (std::string_view data) { |