)]}'
{
  "log": [
    {
      "commit": "ad7c2338440c8820232fb0d2b96c4a665cd38292",
      "tree": "e05c7953fae1825f8452872ea7f6fb46788cfbbb",
      "parents": [
        "8501dfb3001fc8b1b89a06c865a31ed432d72a8c"
      ],
      "author": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Wed Oct 28 02:37:45 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Oct 28 02:38:47 2026 -0700"
      },
      "message": "Bump abseil version to fix the build with ubuntu-latest.\n\nPiperOrigin-RevId: 1008753615\n"
    },
    {
      "commit": "8501dfb3001fc8b1b89a06c865a31ed432d72a8c",
      "tree": "3f15aee11db951e07591f9002f677020dda7a78b",
      "parents": [
        "3566760243a5fb799659928bc000b6a062e33cbb"
      ],
      "author": {
        "name": "Sam Stoelinga",
        "email": "stoelinga@google.com",
        "time": "Mon Oct 26 12:49:50 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Oct 27 04:24:34 2026 -0700"
      },
      "message": "Add GitHub Actions CI workflow to build and test Riegeli targets with Bazel.\n\nPiperOrigin-RevId: 1007479219\n"
    },
    {
      "commit": "3566760243a5fb799659928bc000b6a062e33cbb",
      "tree": "f499965340454360f512bb4d72e5b818a0fc4278",
      "parents": [
        "520bd5d52d6c90f72533359f4da2ae6eaa5de95b"
      ],
      "author": {
        "name": "Compression Team",
        "email": "noreply@google.com",
        "time": "Mon Oct 26 16:08:34 2026 +0100"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Mon Oct 26 17:46:39 2026 +0100"
      },
      "message": "Fix a data race between tp_init and tp_traverse of RecordWriter/RecordReader under free-threaded Python.\n\nPiperOrigin-RevId: 1007285945\n"
    },
    {
      "commit": "520bd5d52d6c90f72533359f4da2ae6eaa5de95b",
      "tree": "14863f605662ee62d88941446e5dc0aaa27141c2",
      "parents": [
        "e1fdd70ac1c3c00f45c8d40c324abe151000bd9e"
      ],
      "author": {
        "name": "Compression Team",
        "email": "noreply@google.com",
        "time": "Fri Oct 23 12:09:04 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Fri Oct 23 13:01:59 2026 +0200"
      },
      "message": "Fix a data race in lazily initialized static variables under free-threaded Python.\n\nPiperOrigin-RevId: 1005452674\n"
    },
    {
      "commit": "e1fdd70ac1c3c00f45c8d40c324abe151000bd9e",
      "tree": "2cda5698df41fec4469b2423e9c1d67dbe85621c",
      "parents": [
        "d143a575459cbc5f541fb30638de97d5ddc2ea13"
      ],
      "author": {
        "name": "Compression Team",
        "email": "noreply@google.com",
        "time": "Wed Oct 21 17:59:42 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Wed Oct 21 18:52:05 2026 +0200"
      },
      "message": "Update google_cloud_cpp to 3.12.0 and align direct Bzlmod dependencies.\n\nPiperOrigin-RevId: 1003981316\n"
    },
    {
      "commit": "d143a575459cbc5f541fb30638de97d5ddc2ea13",
      "tree": "c5f5db911cdd3dbd47f1860bc7a78f79626e5e1f",
      "parents": [
        "c691a11d4d9905f5ebfa03173fefffc39a94c062"
      ],
      "author": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Wed Oct 14 09:12:26 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Wed Oct 14 09:15:20 2026 +0200"
      },
      "message": "Remove the interning library. It will not be developed in Riegeli.\n\nPiperOrigin-RevId: 999165807\n"
    },
    {
      "commit": "c691a11d4d9905f5ebfa03173fefffc39a94c062",
      "tree": "80a7adbedc15068bfb49f7bfe2be134ac1a8d79c",
      "parents": [
        "3f91f96d7d3cb6d9f0b8bb80164cbf34b5443c37"
      ],
      "author": {
        "name": "Compression Team",
        "email": "noreply@google.com",
        "time": "Tue Oct 13 21:59:12 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Tue Oct 13 22:25:15 2026 +0200"
      },
      "message": "Cut dependency on \"tensorflow/core/public/version.h\".\n\nNo longer has any meaning because this file has migrated to `absl::Status`.\n\nPiperOrigin-RevId: 998835261\n"
    },
    {
      "commit": "3f91f96d7d3cb6d9f0b8bb80164cbf34b5443c37",
      "tree": "b76e329db212a48650edb7fdaf154bbe9aced8a2",
      "parents": [
        "416321f755832732ff6ceea44576d886c8bcc549"
      ],
      "author": {
        "name": "Compression Team",
        "email": "noreply@google.com",
        "time": "Sun Oct 11 12:37:37 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Sun Oct 11 12:44:08 2026 +0200"
      },
      "message": "Cosmetics.\n\nPiperOrigin-RevId: 997400431\n"
    },
    {
      "commit": "416321f755832732ff6ceea44576d886c8bcc549",
      "tree": "a4e426a3212127dca68e1c3eaa62c1dd143d6eff",
      "parents": [
        "195e30332e2336591c2326c12bf7b4bca0021c4d"
      ],
      "author": {
        "name": "Compression Team",
        "email": "noreply@google.com",
        "time": "Sun Oct 11 12:36:50 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Sun Oct 11 12:43:51 2026 +0200"
      },
      "message": "Cosmetics.\n\nPiperOrigin-RevId: 997400231\n"
    },
    {
      "commit": "195e30332e2336591c2326c12bf7b4bca0021c4d",
      "tree": "3ed903fe869b9b64ac573c32088fca98cd53ce1e",
      "parents": [
        "ebdf3b5e20e5ddd6b74ba2058a09de6c202c7642"
      ],
      "author": {
        "name": "Compression Team",
        "email": "noreply@google.com",
        "time": "Sun Oct 11 12:35:46 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Sun Oct 11 12:43:36 2026 +0200"
      },
      "message": "Cosmetics.\n\nPiperOrigin-RevId: 997399918\n"
    },
    {
      "commit": "ebdf3b5e20e5ddd6b74ba2058a09de6c202c7642",
      "tree": "6fd074dccc3344661d7dd904a6cff8a4334b72c9",
      "parents": [
        "ade010abaf61516b04b8b96e548bef48ed3c8014"
      ],
      "author": {
        "name": "Compression Team",
        "email": "noreply@google.com",
        "time": "Sun Oct 11 12:35:39 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Sun Oct 11 12:43:19 2026 +0200"
      },
      "message": "Cosmetics.\n\nPiperOrigin-RevId: 997399894\n"
    },
    {
      "commit": "ade010abaf61516b04b8b96e548bef48ed3c8014",
      "tree": "caf41f05f7135d2cd5657d819b116b418a2e14fe",
      "parents": [
        "a544fc76eaa0044ca475d328e28bfe3a7b1099c9"
      ],
      "author": {
        "name": "Compression Team",
        "email": "noreply@google.com",
        "time": "Tue Sep 29 16:39:00 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Tue Oct 06 17:45:41 2026 +0200"
      },
      "message": "Internal change.\n\nPiperOrigin-RevId: 990298716\n"
    },
    {
      "commit": "a544fc76eaa0044ca475d328e28bfe3a7b1099c9",
      "tree": "3c4ddc21cc075b891b33eefdf3c20e31c76a32d5",
      "parents": [
        "2de8c84fac08c2345a6c59349caaea2905659c67"
      ],
      "author": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Fri Sep 25 18:22:23 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Fri Sep 25 18:23:45 2026 +0200"
      },
      "message": "Fix open source build:\n\n- `static_assert(false)` with a literal `false` inside `if constexpr`\n  is supported since clang 17 and gcc 13. It got valid through a defect report:\n  https://cplusplus.github.io/CWG/issues/2039.html\n\n  Before that, the expression must be dependent on template parameters,\n  otherwise it is processed unconditionally even if the `if constexpr` branch\n  is not chosen.\n\n- Update versions of dependencies.\n\nPiperOrigin-RevId: 988321875\n"
    },
    {
      "commit": "2de8c84fac08c2345a6c59349caaea2905659c67",
      "tree": "8c8a9daf7edb2403c20a691590277cea115db559",
      "parents": [
        "b3f2ff5fa4977e9aa5a7215006c6e8d355ee0513"
      ],
      "author": {
        "name": "Compression Team",
        "email": "noreply@google.com",
        "time": "Thu Sep 24 18:54:58 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Thu Sep 24 19:32:45 2026 +0200"
      },
      "message": "Shrink riegeli::TransposeEncoder::EncodedTagInfo from 56 to 48 bytes by member reordering.\n\nPiperOrigin-RevId: 987575229\n"
    },
    {
      "commit": "b3f2ff5fa4977e9aa5a7215006c6e8d355ee0513",
      "tree": "8b67559969e974f0d1450e6c8a83da5d7310117e",
      "parents": [
        "bddd9d40f6801a926bd9cd823e1698c0deb6c568"
      ],
      "author": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Tue Sep 15 14:32:37 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Tue Sep 15 14:34:39 2026 +0200"
      },
      "message": "Introduce `IndexObjectArena`, exposing the existing\n`interned_internal::Directory` logic which used to be internal.\n\nThis is a more efficient alternative to `std::deque` or `absl::chunked_queue`,\nwith the API restricted to be append-only, supporting random access by index,\noptionally thread-safe with lock-free indexing.\n\nPiperOrigin-RevId: 981759495\n"
    },
    {
      "commit": "bddd9d40f6801a926bd9cd823e1698c0deb6c568",
      "tree": "6cc4dbd91d3442ed7a7e230d8b758dae5ab5c79f",
      "parents": [
        "d461a1043d7578d41904085aed88b1ba3d6c65b8"
      ],
      "author": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Tue Sep 15 14:19:56 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Tue Sep 15 14:21:03 2026 +0200"
      },
      "message": "For arena-encoding small strings, check the size once instead of twice.\nThe cost is emitting a call to `AllocateImpl()` twice.\n\nPiperOrigin-RevId: 981754854\n"
    },
    {
      "commit": "d461a1043d7578d41904085aed88b1ba3d6c65b8",
      "tree": "8fb9a90047bd840961f49028b4545233e238deb8",
      "parents": [
        "57fb869ce0d70e697f090736ff7f23ab67556a8d"
      ],
      "author": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Sun Sep 13 10:09:47 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Sun Sep 13 10:17:35 2026 +0200"
      },
      "message": "Optimize `RIEGELI_CHECK_LT` etc. by passing simple objects by value, for better\ncode generated by a call to non-inlined `CheckOpResult()`.\n\nThis avoids forming a reference, which requires the argument to be on the stack.\n\nPiperOrigin-RevId: 980601992\n"
    },
    {
      "commit": "57fb869ce0d70e697f090736ff7f23ab67556a8d",
      "tree": "f29cba2c04127a4f5412762848964bbe3d995573",
      "parents": [
        "0d41bd6f8c48b0dd78e57df06c375352b73c86c6"
      ],
      "author": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Thu Sep 10 14:27:53 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Thu Sep 10 14:29:48 2026 +0200"
      },
      "message": "Store arena block sizes and `ConcurrentVector` size \u0026 capacity as `uint32_t`\nto reduce object size.\n\nMake arena and `ConcurrentVector` allocation robust wrt. size overflow.\n\nClean up comments at `{Object,String}Arena`.\n\nObject size changes:\n- `ObjectArena`: 48 bytes instead of 64 bytes (saving 16 bytes).\n- `StringArena`: 56 bytes instead of 72 bytes (saving 16 bytes).\n\nPiperOrigin-RevId: 979125989\n"
    },
    {
      "commit": "0d41bd6f8c48b0dd78e57df06c375352b73c86c6",
      "tree": "4ac657fa34880e0b09779e870ce53648479c62bd",
      "parents": [
        "34728f37e1426a8666db48fd5e75f2bde5966c7d"
      ],
      "author": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Thu Sep 10 14:26:25 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Thu Sep 10 14:29:29 2026 +0200"
      },
      "message": "Let `ConcurrentVector` support holding an unowned single element.\n\nUse that in `StringArena` and `Directory`, avoiding allocating the vector of\nblocks if a single block is in use. The state of the current block is stored\ninline in the arena, whether or not it is the only block (stored only there)\nor not (duplicated from heap-allocated array of block for fast access during\nallocation). In either case, the vector of all blocks is available uniformly.\n\nThis is encoded as `size \u003d\u003d 1 \u0026\u0026 capacity \u003d\u003d 0`. That has a surprisingly small\nimpact on the code. This prompted to change the representation of\n`StringArenaBlock` to store data \u0026 limit instead of data \u0026 size.\n\nIn `ObjectArena`, `previous_blocks_` is switched from `std::vector` to\n`ConcurrentVector`. It continues to exclude `last_block_`; there is no need for\nuniform access the vector of all blocks.\n\nFix `initial_capacity` of the vector of blocks of `StringArena`. It was supposed\nto be 4, not 16.\n\nPiperOrigin-RevId: 979125519\n"
    },
    {
      "commit": "34728f37e1426a8666db48fd5e75f2bde5966c7d",
      "tree": "6fcb063af9ed2b542f736b528ecb1254c8fa269f",
      "parents": [
        "5eb4c6614ecad83fd5f510b86f1567fcf0d84a65"
      ],
      "author": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Thu Sep 10 14:23:37 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Thu Sep 10 14:29:09 2026 +0200"
      },
      "message": "Fix a bug in `UndoAllocateBytes()` where the allocation was in another block,\nadjacent in memory to the current empty block.\n\nAdd a missing `friend` declaration.\n\nClean up `friend` comments: they state what is accessed, not who accesses.\n\nPiperOrigin-RevId: 979124669\n"
    },
    {
      "commit": "5eb4c6614ecad83fd5f510b86f1567fcf0d84a65",
      "tree": "871ad38af10392326d0fa1d16444711be86bca5d",
      "parents": [
        "4028fa1679511582937cce01aad4adf6f208269a"
      ],
      "author": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Sat Sep 05 22:04:12 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Sat Sep 05 22:06:13 2026 +0200"
      },
      "message": "In `IndexInterned\u003cT\u003e`, ensure that the block capacity measured in objects is\na power of 2.\n\nThis makes indexing more efficient if `sizeof(T)` is not a power of 2.\nThe cost is a less round allocation size.\n\nPiperOrigin-RevId: 976849907\n"
    },
    {
      "commit": "4028fa1679511582937cce01aad4adf6f208269a",
      "tree": "1b6342fb70b29cbd27ccb3d7b70b64086419081c",
      "parents": [
        "fb73cc9611d5751c1150b6c7a1751eab41727c51"
      ],
      "author": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Fri Sep 04 22:52:25 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Sat Sep 05 04:35:45 2026 +0200"
      },
      "message": "Optimize `{Object,String}Arena` and `Directory` allocations by maintaining\ncursor \u0026 limit pointers instead of data \u0026 used \u0026 size.\n\nPiperOrigin-RevId: 976480406\n"
    },
    {
      "commit": "fb73cc9611d5751c1150b6c7a1751eab41727c51",
      "tree": "078f8d7442af42b242face48985b0f2c169d02b8",
      "parents": [
        "b65c12103349bf2bd6caf27e5d811210f22fff1b"
      ],
      "author": {
        "name": "Compression Team",
        "email": "noreply@google.com",
        "time": "Fri Sep 04 08:34:58 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Fri Sep 04 08:56:52 2026 +0200"
      },
      "message": "Use absl::DefaultHashContainerHash for CompactString::absl_container_hash.\n\nThis replaces the custom implementation of CompactString::absl_container_hash with the standard absl::DefaultHashContainerHash template, reducing boilerplate. This also make absl containers to be faster by using hidden internal details of Hash implementation.\n\nPiperOrigin-RevId: 976131145\n"
    },
    {
      "commit": "b65c12103349bf2bd6caf27e5d811210f22fff1b",
      "tree": "a511340cdbd1fe2c4b1d5f4aeb81485bf3917b4c",
      "parents": [
        "d69a0da37ddce9dafec75b335b2f1578101776c5"
      ],
      "author": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Thu Sep 03 11:22:14 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Fri Sep 04 08:56:33 2026 +0200"
      },
      "message": "Reduce the default number of shards for concurrent interners from 64 to 16.\n\nThe 64 was somewhat excessive, especially for local interners: 64 times 64\ncacheline is 4 KiB. Will be 16 times 64 \u003d 1 KiB.\n\nPiperOrigin-RevId: 975605202\n"
    },
    {
      "commit": "d69a0da37ddce9dafec75b335b2f1578101776c5",
      "tree": "baca400d548888dfb985d5393faeed3953629716",
      "parents": [
        "b160d51655a541f94f21c41910644c0bddac14b7"
      ],
      "author": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Thu Sep 03 11:05:35 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Thu Sep 03 11:06:35 2026 +0200"
      },
      "message": "Align shards to cacheline only if concurrency is enabled, otherwise this was\npure waste.\n\nPiperOrigin-RevId: 975598214\n"
    },
    {
      "commit": "b160d51655a541f94f21c41910644c0bddac14b7",
      "tree": "f7da558b96df32fdc99ae86142dc9e5c1d21c6f6",
      "parents": [
        "76be1fb1e8d28e6d98ba47d2c4f2ad51b14515fd"
      ],
      "author": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Thu Sep 03 10:23:28 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Thu Sep 03 10:24:20 2026 +0200"
      },
      "message": "Cosmetics: when reallocating 1.5x, use the formula old + (old + 1) / 2\ninstead of old + max(old / 2, 1).\n\nBoth are safe if old \u003d\u003d 0 is handled separately; it is always handled separately\nor the result is maxed with another constant, because using 1 on the first\nallocation is generally poor for performance.\n\nThe new formula is effectively old + ceil(old / 2) rather than\nold + floor(old / 2), which feels more natural and leads to simpler code.\n\nPiperOrigin-RevId: 975580776\n"
    },
    {
      "commit": "76be1fb1e8d28e6d98ba47d2c4f2ad51b14515fd",
      "tree": "368aac496476b5d3339bdc0a9c755d8b17289263",
      "parents": [
        "441936aa1c1360f7e39a556cc88d47151dd15175"
      ],
      "author": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Wed Sep 02 13:02:06 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Wed Sep 02 13:20:12 2026 +0200"
      },
      "message": "Allow `IndexInternedString::InternerWithAddress::WithBlockSize\u003cmin_block_size,\nmax_block_size\u003e` with `min_block_size \u003c max_block_size`.\n\nWhile this wastes some address space, it saves overall memory, so it might be a\nsensible tradeoff.\n\nThis also simplifies the code a bit, avoiding treating a fixed block size as a\nspecial case.\n\nThe default is still a fixed block size.\n\nPiperOrigin-RevId: 975041358\n"
    },
    {
      "commit": "441936aa1c1360f7e39a556cc88d47151dd15175",
      "tree": "9597b5485c077bdcfd36d7f0ca2276e8b0377dfc",
      "parents": [
        "dafde3162857461f3552f480270aa5e084fbb1b4"
      ],
      "author": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Wed Sep 02 12:59:59 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Wed Sep 02 13:19:48 2026 +0200"
      },
      "message": "Let `Interned{,String}::value()` check against `valueless_after_move()` and\ncrash if so, instead of having undefined behavior. As usual, `operator*` is\nunchecked.\n\nEven though `valueless_after_move()` is not a legitimate marker for an absent\nvalue like `nullptr` or `std::nullopt`, but indicates an artifact of the design\nwhen regular invariants cannot be restored, the checking behavior should be less\nsurprising.\n\n`std::indirect`, after which the `valueless_after_move()` state was modelled,\ndoes not have `value()`. We necessarily have it because in the base class,\nnamely `Optional`, it checks against `nullptr`.\n\nPiperOrigin-RevId: 975040514\n"
    },
    {
      "commit": "dafde3162857461f3552f480270aa5e084fbb1b4",
      "tree": "69882ebd3f96a0cd037c3dd0f8ec84b4b1cec1db",
      "parents": [
        "6bca0f2e5139973d64b8aa318403bb86b224c27a"
      ],
      "author": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Tue Sep 01 20:07:53 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Tue Sep 01 20:08:44 2026 +0200"
      },
      "message": "Make not only `SharedPtr::IsUnique()` but also `SharedPtr::GetRefCount()` safe\nfor checking if the object may be safely modified: if the result is equal to the\nnumber of references managed by the calling thread, then there are no references\nelsewhere.\n\nThis is done by changing the memory order from relaxed to acquire.\n\nAnalogously in some other classes.\n\nNote that `std::shared_ptr` cannot support this if weak pointers are possible.\n`riegeli::SharedPtr` does not support weak pointers.\n\n`Interned::GetRefCount()` remains unsafe for this purpose, because references\ncan appear asynchronously due to other threads interning equal objects, without\nthose threads having access to a previously interned handle.\n\nPiperOrigin-RevId: 974597642\n"
    },
    {
      "commit": "6bca0f2e5139973d64b8aa318403bb86b224c27a",
      "tree": "08e868cfeaef9d53f736cc18c34d987879923e78",
      "parents": [
        "154eda78faf439f6d2280186fe77828e075a3bc8"
      ],
      "author": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Tue Sep 01 14:30:13 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Tue Sep 01 14:33:58 2026 +0200"
      },
      "message": "Optionally parameterize `IndexInternedString::Interner` with an `Address` type\nfor a more compact representation of an internal directory.\n\nPiperOrigin-RevId: 974439742\n"
    },
    {
      "commit": "154eda78faf439f6d2280186fe77828e075a3bc8",
      "tree": "5a1f0f3a58a828f82f1fa9ded9684d7a05ada119",
      "parents": [
        "c249cacf50cb61b4d08d9be9fdb1466c2161b705"
      ],
      "author": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Tue Sep 01 14:29:23 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Tue Sep 01 14:33:40 2026 +0200"
      },
      "message": "Add `IndexInternedString\u003cNumeric\u003e`, an optimized variant of\n`IndexInterned\u003cNumeric, std::string\u003e`.\n\nPiperOrigin-RevId: 974439457\n"
    },
    {
      "commit": "c249cacf50cb61b4d08d9be9fdb1466c2161b705",
      "tree": "7bc8ad57ce8fe389bfd9c6ac3d0f3ec5924f245a",
      "parents": [
        "a803e08eabb926c32c1c795078fc932a4d529998"
      ],
      "author": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Tue Sep 01 14:28:00 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Tue Sep 01 14:33:21 2026 +0200"
      },
      "message": "Add `IndexInterned\u003cNumeric, T\u003e`, a variant of `ArenaInterned\u003cT\u003e` where objects\nare represented by indices rather than pointer-like handles.\n\nThis saves memory for the handles. The cost is that the interner or archive is\nneeded to resolve the handle to the object.\n\nPiperOrigin-RevId: 974439071\n"
    },
    {
      "commit": "a803e08eabb926c32c1c795078fc932a4d529998",
      "tree": "29268e739d24a3cb58ce89b6ebeb76df7724a064",
      "parents": [
        "7e0fa532f8127a3a804ae019364647bf0394ddb9"
      ],
      "author": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Tue Sep 01 14:27:07 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Tue Sep 01 14:33:03 2026 +0200"
      },
      "message": "Add `ConcurrentVector` internal type. It will be needed for interners soon.\n\nPiperOrigin-RevId: 974438832\n"
    },
    {
      "commit": "7e0fa532f8127a3a804ae019364647bf0394ddb9",
      "tree": "fce1b24ee96d9d10e160b1a1c5092488b976fc57",
      "parents": [
        "bacb763cbb3ea8142270b16087b7e840cb948418"
      ],
      "author": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Tue Sep 01 14:26:20 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Tue Sep 01 14:32:44 2026 +0200"
      },
      "message": "Add `ArenaInternedString`, an optimized variant of `ArenaInterned\u003cstd::string\u003e`.\n\nAdd `StringArena`, used by `ArenaInternedString` but useful separately too.\n\nPiperOrigin-RevId: 974438597\n"
    },
    {
      "commit": "bacb763cbb3ea8142270b16087b7e840cb948418",
      "tree": "4302b5b45ab2339cf76ddff9604408f01df50f97",
      "parents": [
        "ec126645fd297e67ccb3b5e639a2722d12188c59"
      ],
      "author": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Tue Sep 01 14:25:31 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Tue Sep 01 14:32:25 2026 +0200"
      },
      "message": "Add `ArenaInterned\u003cT\u003e`, a variant of `Interned\u003cT\u003e` where objects are\narena-allocated and owned by the interner.\n\nAdd `ObjectArena\u003cT\u003e`, used by `ArenaInterned\u003cT\u003e` but useful separately too.\n\nPiperOrigin-RevId: 974438373\n"
    },
    {
      "commit": "ec126645fd297e67ccb3b5e639a2722d12188c59",
      "tree": "059d5f3937acb68c9fbac707cd7524e67e0a3add",
      "parents": [
        "c6807f9f4fdc2e38f3a7ea709a3fbcd6357742b2"
      ],
      "author": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Tue Sep 01 14:24:04 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Tue Sep 01 14:32:07 2026 +0200"
      },
      "message": "Let `InternedString` support custom data alignment.\n\nPiperOrigin-RevId: 974437957\n"
    },
    {
      "commit": "c6807f9f4fdc2e38f3a7ea709a3fbcd6357742b2",
      "tree": "b2c3c93d86deb790fcea6d044b4ef070b5e92b95",
      "parents": [
        "2d6f8b061165fb20e1f3d43dc5d06327ecfbd437"
      ],
      "author": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Tue Sep 01 14:23:24 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Tue Sep 01 14:31:48 2026 +0200"
      },
      "message": "Parameterize `Interned` and `InternedString` by the Mutex class instead of\nhardcoding `absl::Mutex`.\n\nPiperOrigin-RevId: 974437768\n"
    },
    {
      "commit": "2d6f8b061165fb20e1f3d43dc5d06327ecfbd437",
      "tree": "7a733d58cbd126d9bde7d663300190d13d9e10f7",
      "parents": [
        "ed657b37e37b1c938341af1faa7cf26b7a583d84"
      ],
      "author": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Tue Sep 01 14:22:39 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Tue Sep 01 14:31:28 2026 +0200"
      },
      "message": "Add `InternedString`, an optimized variant of `Interned\u003cstd::string\u003e`.\n\nPiperOrigin-RevId: 974437540\n"
    },
    {
      "commit": "ed657b37e37b1c938341af1faa7cf26b7a583d84",
      "tree": "5b94ca57b17c7d95f13d1723a28fc56f866144c0",
      "parents": [
        "b739af7e30c31bed4d47615375bf8cd9f72368b0"
      ],
      "author": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Tue Sep 01 14:21:57 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Tue Sep 01 14:31:08 2026 +0200"
      },
      "message": "Add `Interned\u003cT\u003e`, a class for ensuring that equal objects are shared,\nto minimize memory usage.\n\nPiperOrigin-RevId: 974437321\n"
    },
    {
      "commit": "b739af7e30c31bed4d47615375bf8cd9f72368b0",
      "tree": "a9700049cfbefe871e286a3529221f076a25c67c",
      "parents": [
        "0336f913f4e77f03ee009bc8f3bc0d5e25d48ea1"
      ],
      "author": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Wed Aug 26 10:18:48 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Wed Aug 26 10:20:00 2026 +0200"
      },
      "message": "Make `RIEGELI_CHECK` constexpr as long as the condition holds.\n\nThis makes e.g. `SaturatingSub()` constexpr (`RIEGELI_ASSERT` is `RIEGELI_CHECK`\nin debug mode).\n\nPiperOrigin-RevId: 971099836\n"
    },
    {
      "commit": "0336f913f4e77f03ee009bc8f3bc0d5e25d48ea1",
      "tree": "858f321b2e97d817133a8806f0476fa225213d07",
      "parents": [
        "69174b887f15e5af6fea74957da2ca811736218d"
      ],
      "author": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Tue Aug 11 12:37:18 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Tue Aug 11 12:37:57 2026 +0200"
      },
      "message": "Let `OptionalCompactString` support heterogeneous hashing against `nullptr`,\n`CompactString`, and `absl::string_view`.\n\nPiperOrigin-RevId: 962684879\n"
    },
    {
      "commit": "69174b887f15e5af6fea74957da2ca811736218d",
      "tree": "68a78be7b259ec108f3ba9ee43318003c990e7f1",
      "parents": [
        "9184e8c8d892d429d0eee827fe2ec4322d708b90"
      ],
      "author": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Wed Jul 22 12:17:11 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Wed Jul 22 12:18:15 2026 +0200"
      },
      "message": "Remove deprecated varint reading functions returning\n`std::optional\u003cconst char*\u003e`, no longer used.\n\nPiperOrigin-RevId: 952001777\n"
    },
    {
      "commit": "9184e8c8d892d429d0eee827fe2ec4322d708b90",
      "tree": "674d537799e8e337b39227df74228ae468caa0f3",
      "parents": [
        "b213fb5d42a951148a00f1b2f53d99bba061e67e"
      ],
      "author": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Fri Jul 10 13:37:15 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Fri Jul 10 13:37:55 2026 +0200"
      },
      "message": "Fix build in C++17 mode: some references to `WithCompareMarker` were left\naddressing the old namespace.\n\nPiperOrigin-RevId: 945639767\n"
    },
    {
      "commit": "b213fb5d42a951148a00f1b2f53d99bba061e67e",
      "tree": "b223e0b7957f360a7f356a448a188aa77934b205",
      "parents": [
        "c3ffd69ed157d92b6cd860c6d60aa1f47cd0d3fe"
      ],
      "author": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Fri Jul 10 11:10:16 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Fri Jul 10 11:13:41 2026 +0200"
      },
      "message": "Make `Has{Equal,Compare,LessThan}` and `With{Equal,Compare}Marker` public.\n\nThey are going to be used in other libraries.\n\nPiperOrigin-RevId: 945582542\n"
    },
    {
      "commit": "c3ffd69ed157d92b6cd860c6d60aa1f47cd0d3fe",
      "tree": "f47d41b7659afba1a869bddfd87a4a6604362563",
      "parents": [
        "bc17eea7d1a3a0eacb31dee2cac4a086ba5a6ceb"
      ],
      "author": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Thu Jul 02 14:51:08 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Fri Jul 10 08:23:25 2026 +0200"
      },
      "message": "Prepare for changing the Python type checker.\n\nPiperOrigin-RevId: 941653046\n"
    },
    {
      "commit": "bc17eea7d1a3a0eacb31dee2cac4a086ba5a6ceb",
      "tree": "762158e2654132fc43ac0e7368abb99d768b3046",
      "parents": [
        "8199bc17a007494bd0da0c053d07dfdcf57437f4"
      ],
      "author": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Wed Jun 24 10:09:46 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Wed Jun 24 10:10:54 2026 +0200"
      },
      "message": "Change the `RiegeliHasMovableElements()` extension protocol to improve\ncompatibility with MSVC.\n\nInstead of a constexpr function returning `bool`, it is a function retuning\n`std::true_type`, `std::false_type`, or `std::bool_constant\u003cvalue\u003e`. It is\nnever called, only its result type is checked.\n\nPiperOrigin-RevId: 937164857\n"
    },
    {
      "commit": "8199bc17a007494bd0da0c053d07dfdcf57437f4",
      "tree": "7bcb72dd43b50cae1e2ca4f4151a53d3f310f1f9",
      "parents": [
        "f584d5548e38a6000d86bf2f6f035e40c6322233"
      ],
      "author": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Tue Jun 23 09:01:21 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Tue Jun 23 09:15:55 2026 +0200"
      },
      "message": "Add `OptionalCompactString::value()`, like `operator*` but with a runtime check\nagainst nullptr.\n\nPiperOrigin-RevId: 936468053\n"
    },
    {
      "commit": "f584d5548e38a6000d86bf2f6f035e40c6322233",
      "tree": "e881547a0b554c3261c8f0728974535f2f949abe",
      "parents": [
        "520d96eb4e1dfbe7d06a06555e9d9b8b0aa79588"
      ],
      "author": {
        "name": "Compression Team",
        "email": "noreply@google.com",
        "time": "Mon Jun 22 17:24:25 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Mon Jun 22 17:37:28 2026 +0200"
      },
      "message": "Relax the static assertion regarding\n`ZstdWriterBase::Options::kMinTargetCBlockSize` and\n`ZSTD_TARGETCBLOCKSIZE_MIN`.\n\nThis allows building with an older zstd where `ZSTD_TARGETCBLOCKSIZE_MIN`\nwas 64.\n\nPiperOrigin-RevId: 936069594\n"
    },
    {
      "commit": "520d96eb4e1dfbe7d06a06555e9d9b8b0aa79588",
      "tree": "8ce17e5bbb3291743b023a0258e7a1014e3bb84c",
      "parents": [
        "ebeaac98124d11ea359b9da2a0f12a30d2409f08"
      ],
      "author": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Wed Jun 17 12:17:28 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Wed Jun 17 12:19:04 2026 +0200"
      },
      "message": "BEGIN_PUBLIC\n\nMake `DeleteAligned\u003c...\u003e(nullptr)` correct, doing nothing.\n\nPiperOrigin-RevId: 933614980\n"
    },
    {
      "commit": "ebeaac98124d11ea359b9da2a0f12a30d2409f08",
      "tree": "49368edce2f41355d8623142345d5f15be26b1ec",
      "parents": [
        "16a5703acfef66d26f90af57418295c6995b84ee"
      ],
      "author": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Wed Jun 17 12:16:53 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Wed Jun 17 12:18:48 2026 +0200"
      },
      "message": "Make `EstimateMemory()` etc. variadic.\n\nPiperOrigin-RevId: 933614731\n"
    },
    {
      "commit": "16a5703acfef66d26f90af57418295c6995b84ee",
      "tree": "c05a24fc3e133fd930dc1a727a04086cf0f22a0f",
      "parents": [
        "384c8dee5ecfc6993a01eb6f37254b50cbd5cd84"
      ],
      "author": {
        "name": "Compression Team",
        "email": "noreply@google.com",
        "time": "Tue Jun 09 11:28:34 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Tue Jun 09 11:31:38 2026 +0200"
      },
      "message": "Fix memory bloat in `CordWriter` caused by unused `buffer_` capacity\n\nWhen writing highly compressible data to an `absl::Cord` via a compression\nwriter (e.g. `ZstdWriter`) wrapping a `CordWriter`, the massive size hint\nis forwarded to the `CordWriter` causing it to over-allocate a 64KB\n`buffer_`.\n\nWhen `CordWriterBase::SyncBuffer()` is called, this 64KB `buffer_` was\nunconditionally wrapped in an `ExternalRef` and appended to the cord,\neven if it only contained a few bytes of compressed output. This caused\nthe entire 64KB allocation to be permanently owned by the Cord.\n\nPiperOrigin-RevId: 929062004\n"
    },
    {
      "commit": "384c8dee5ecfc6993a01eb6f37254b50cbd5cd84",
      "tree": "b7b5b802a38a343e25162c4090be5daa17a09f7e",
      "parents": [
        "4604c50c33b486bd7bd19abe2212175dca3a8c24"
      ],
      "author": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Fri Jun 05 12:24:37 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Fri Jun 05 13:27:35 2026 +0200"
      },
      "message": "Let `CompactString` support heterogeneous lookup against `absl::string_view`\nby default, using the `absl_container_{hash,eq}` protocol.\n\nPiperOrigin-RevId: 927191960\n"
    },
    {
      "commit": "4604c50c33b486bd7bd19abe2212175dca3a8c24",
      "tree": "e94d9cfa58e9c6d433c8296a2c76e2ad3c6c8215",
      "parents": [
        "faa69f2df2e7b747aa6d149e05312bf1c19d009a"
      ],
      "author": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Wed May 27 17:27:00 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Wed May 27 17:28:52 2026 +0200"
      },
      "message": "Make it easier to define comparisons available conditionally.\n\nWhen concrete types are specified at `WithEqual` or `WithCompare`, define\nprimary comparisons with swapped parameters only if unswapped ones are defined.\nAlso, do not define secondary comparisons with swapped parameters for concrete\nparameter types; they are provided generically.\n\nPiperOrigin-RevId: 922146940\n"
    },
    {
      "commit": "faa69f2df2e7b747aa6d149e05312bf1c19d009a",
      "tree": "6e430e3cd70b3bc9e1c1cbf0c471e566e344a1f4",
      "parents": [
        "8f6ae8c0ac29f0a6c575532f6a11cad1d7ae74a9"
      ],
      "author": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Fri May 22 12:28:11 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Fri May 22 12:28:56 2026 +0200"
      },
      "message": "Tighten CTAD rules: `SharedPtr(nullptr)` and `IntrusiveSharedPtr(nullptr)`\nwithout an explicit template parameter are invalid rather than being shared\npointers pointing to `std::nullptr_t`.\n\nPiperOrigin-RevId: 919575654\n"
    },
    {
      "commit": "8f6ae8c0ac29f0a6c575532f6a11cad1d7ae74a9",
      "tree": "ee78a818cd6f4b532aeb11e8e342a73caca4fa06",
      "parents": [
        "448d1a291c8d3924be57506a73ba9d01c6100e51"
      ],
      "author": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Fri May 22 12:22:14 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Fri May 22 12:23:42 2026 +0200"
      },
      "message": "Remove braces in `if` statements which now fit in a single line.\n\nPiperOrigin-RevId: 919573231\n"
    },
    {
      "commit": "448d1a291c8d3924be57506a73ba9d01c6100e51",
      "tree": "e6ece6b64dad4173d7f3182eacb77575964a8e8e",
      "parents": [
        "0fe5094a1973c71541b44a3466ff15c1341717dd"
      ],
      "author": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Thu May 21 09:03:29 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Fri May 22 12:23:26 2026 +0200"
      },
      "message": "Include more details in comments.\n\nPiperOrigin-RevId: 918869861\n"
    },
    {
      "commit": "0fe5094a1973c71541b44a3466ff15c1341717dd",
      "tree": "d240ae6317a309ba6963f6f9bd00a3026b77c607",
      "parents": [
        "a4b7630e1184dc58c89c3e7e6207f431b5d11f08"
      ],
      "author": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Wed May 20 15:52:38 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Fri May 22 12:23:08 2026 +0200"
      },
      "message": "Internal change.\n\nPiperOrigin-RevId: 918420655\n"
    },
    {
      "commit": "a4b7630e1184dc58c89c3e7e6207f431b5d11f08",
      "tree": "06cc6e73c9b57b25e50fd6782a04203f1325db8f",
      "parents": [
        "d52cf51859e1b9a6a26ec7b2ad8fec7bea665590"
      ],
      "author": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Wed May 20 15:24:23 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Wed May 20 15:26:06 2026 +0200"
      },
      "message": "Fix `riegeli::Compare()` emulating `\u003c\u003d\u003e` before C++20 for pointers:\n* Use `std::less\u003cT*\u003e` semantics rather than `\u003c`.\n* Allow heterogeneous comparisons of compatible pointer types.\n\nAdd support for ordering `SharedPtr` and `IntrusiveSharedPtr`. They follow\n`std::shared_ptr` and `std::unique_ptr`: like for raw pointers, but also\nallowing comparisons against `nullptr` of type `std::nullptr_t`. This means that\nordering is supported, while all heterogeneous comparisons require compatible\npointer types.\n\nAdd support for hashing `SharedPtr` and `IntrusiveSharedPtr`.\n\nPiperOrigin-RevId: 918408947\n"
    },
    {
      "commit": "d52cf51859e1b9a6a26ec7b2ad8fec7bea665590",
      "tree": "115e079966837ad335f651a69ce8368a9e3c1386",
      "parents": [
        "6d34c81dc2beb67bee0ac89535e8ecba623db89a"
      ],
      "author": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Wed May 20 15:05:10 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Wed May 20 15:06:12 2026 +0200"
      },
      "message": "Fix `NewAligned\u003cconst T\u003e(...)` by keeping the internal pointer as `void*`\nlonger, and converting it to `T*` later. This allows to call placement new\nwhile the type is not const yet.\n\nPiperOrigin-RevId: 918401435\n"
    },
    {
      "commit": "6d34c81dc2beb67bee0ac89535e8ecba623db89a",
      "tree": "a24c1361a5e615da8f853b2159d124a3efe9e3f3",
      "parents": [
        "7cfa9e3741c9606a392e2c708b69436a9b81f671"
      ],
      "author": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Wed May 20 14:59:12 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Wed May 20 15:03:12 2026 +0200"
      },
      "message": "Fix `MakerType::arg()` and `MakerTypeFor::arg()` for rvalue references to return\nan rvalue reference. Otherwise they did not even compile.\n\nPiperOrigin-RevId: 918398939\n"
    },
    {
      "commit": "7cfa9e3741c9606a392e2c708b69436a9b81f671",
      "tree": "46f5549c6fc0515913b71f3574e2c16c0e9ad405",
      "parents": [
        "7b94b64e6bca7edf773ec934865378aad82eb88c"
      ],
      "author": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Wed May 20 14:56:42 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Wed May 20 14:59:30 2026 +0200"
      },
      "message": "Fix typo in `IntrusiveSharedPtr\u003cT\u003e::GetRefCount()`: the member function of `T`\nis supposed to be called `GetCount()`, not `GetRefCount()`.\n\nThe name differs because it does not apply to the count of the target of this\nobject (if the object was itself a reference counting type), but to the count\nof references to this object from elsewhere, which is stored intrusively.\n\nPiperOrigin-RevId: 918397990\n"
    },
    {
      "commit": "7b94b64e6bca7edf773ec934865378aad82eb88c",
      "tree": "c3c607055a58077de1be8b8d9ee6fc7ddcd6906a",
      "parents": [
        "8d2a623b19550cceb92db4cceae981f4fa0267f7"
      ],
      "author": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Wed May 20 14:53:02 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Wed May 20 14:59:10 2026 +0200"
      },
      "message": "Tighten a private tagged constructor: make the tag type explicitly\ndefault-constructible, so that public code cannot pass `{}` to bypass\naccess control.\n\nPiperOrigin-RevId: 918396493\n"
    },
    {
      "commit": "8d2a623b19550cceb92db4cceae981f4fa0267f7",
      "tree": "a9e42d8eb08f87437cca7194df3461a0a9bd31a8",
      "parents": [
        "0eaf150ab9a487bd0d360297979e5060781bd979"
      ],
      "author": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Mon May 18 10:34:18 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Mon May 18 10:35:06 2026 +0200"
      },
      "message": "Introduce private `kMaxPosition` constants instead of repeating an expression\nfor the limit.\n\nSpecial cases:\n\n* In `SnappyWriterBase::PushSlow()`, continue to use a higher limit than\n  `kMaxPosition` to allow creating a larger buffer near the end of the supported\n  range and filling it partially.\n\n* Fix `riegeli::tensorflow::FileWriter`: the position is limited by `int64_t`,\n  as evidenced by `tsl::WritableFile::Tell()`.\n\nPiperOrigin-RevId: 917084196\n"
    },
    {
      "commit": "0eaf150ab9a487bd0d360297979e5060781bd979",
      "tree": "35f905f7682370c565c8da976893bdc0ca957f05",
      "parents": [
        "543fa1c50a9052e47f546b46f79572bf5db4efc8"
      ],
      "author": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Mon May 18 09:22:30 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Mon May 18 09:31:17 2026 +0200"
      },
      "message": "Make estimating memory of `absl::InlinedVector\u003cT, N\u003e` more accurate: use\n`absl::InlinedVector\u003cT, N\u003e().capacity()` rather than `N` as the inline capacity.\n\n`InlinedVector` implicitly enlarges `N` to fill the whole space which would be\nallocated inline anyway.\n\nAlso, make estimating minimal capacities more accurate wrt. allocators and\nrobust wrt. non-default-constructible allocators. Take the allocator into\naccount as long as it is default-constructible, otherwise ignore it.\n\nPiperOrigin-RevId: 917058566\n"
    },
    {
      "commit": "543fa1c50a9052e47f546b46f79572bf5db4efc8",
      "tree": "624e901a3b1040c225e20568cb720907232eea6a",
      "parents": [
        "05321e8e0f67e1067e140f72a3331d94dc1df8b5"
      ],
      "author": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Mon May 18 09:19:44 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Mon May 18 09:30:58 2026 +0200"
      },
      "message": "Add missing support for `riegeli::EstimateMemory()` and `riegeli::Debug()`\nto `OptionalCompactString`.\n\nPiperOrigin-RevId: 917057597\n"
    },
    {
      "commit": "05321e8e0f67e1067e140f72a3331d94dc1df8b5",
      "tree": "4a0b12f4a602c88b4cd4e17ffe5638eb3ef1eb9f",
      "parents": [
        "14059fa48fc32ba22f2da4d0351826eea22f7dc3"
      ],
      "author": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Fri May 15 13:54:57 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Fri May 15 13:55:46 2026 +0200"
      },
      "message": "Optimize memory orders for weakly ordered architectures.\n\nIn `RefCount::Unref()`, `fetch_sub()` with `memory_order_release` rather than\n`memory_order_acq_rel`. Then, only in the unexpected path when this was the last\ndecrement (due to `IsUnique()` called before, this can happen only if another\nthread calls `Unref()` at the same time), `atomic_thread_fence()` with\n`memory_order_acquire`.\n\nThis removes the unnecessary acquire semantics from the expected path.\n\nIn `StableDependencyDefault::EnsureAllocatedSlow()`, `compare_exchange_strong()`\nwith a separate `memory_order_release` for the expected success path and\n`memory_order_acquire` for the unexpected failure path (which can happen only\nanother thread calls `EnsureAllocatd()` at the same time), instead of using\n`memory_order_acq_rel` for both.\n\nIn the unexpected path there is no change because `compare_exchange_strong()`\nimplicitly demotes `memory_order_acq_rel` to `memory_order_acquire` there.\nThis removes the unnecessary acquire semantics from the expected path.\n\nCosmetics: in `RefCount::{Ref,Unref}()`, replace `if` with `if constexpr`,\nand split a complex conditional into separate statements.\nPiperOrigin-RevId: 915941386\n"
    },
    {
      "commit": "14059fa48fc32ba22f2da4d0351826eea22f7dc3",
      "tree": "957e436417a16f8add6cf1ff15ba7131602eb313",
      "parents": [
        "ec84194dcba031a78089f23bc941e72c24d47d18"
      ],
      "author": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Thu May 14 08:52:44 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Thu May 14 08:57:07 2026 +0200"
      },
      "message": "Apply nullability annotations to shared pointer libraries.\n\nAdd an assertion to `TypeErasedRef::Cast()` to comply with nullability rules.\n\nPiperOrigin-RevId: 915259881\n"
    },
    {
      "commit": "ec84194dcba031a78089f23bc941e72c24d47d18",
      "tree": "f7be7951e42e072182d5f76810e7c5c025fb7e9a",
      "parents": [
        "ce3fdac74069253ebcffd732eceffa49268630b0"
      ],
      "author": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Wed May 13 11:57:58 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Wed May 13 12:06:37 2026 +0200"
      },
      "message": "Rename misleading type parameters.\n\nIn `absl::{flat,node}_hash_{set,map}`, the order of parameters is `Hash, Eq`,\nnot `Eq, Hash`.\n\nSince they are just propagated, it was correct with their meanings swapped.\n\nPiperOrigin-RevId: 914750787\n"
    },
    {
      "commit": "ce3fdac74069253ebcffd732eceffa49268630b0",
      "tree": "17f1ddd7425b1979bc43f2637c9ff4a8c25d5aa1",
      "parents": [
        "de5f86e4ff0c7a27481625772390d561fed413d1"
      ],
      "author": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Wed May 13 10:45:29 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Wed May 13 10:46:06 2026 +0200"
      },
      "message": "Cosmetic changes:\n* Pass compression dictionaries by value. They are represented as `SharedPtr`\n  or `std::vector` at the toplevel.\n* Fix `ZlibDictionary::set_data()`: do not convert through NUL-terminated\n  `const char*`.\n* Fix typos.\n\nPiperOrigin-RevId: 914720638\n"
    },
    {
      "commit": "de5f86e4ff0c7a27481625772390d561fed413d1",
      "tree": "0a5424de0bb7502b3701a30833af1dd7fea0fa44",
      "parents": [
        "81ebea9a2bdbc8401cfd107d59aed7c957448e06"
      ],
      "author": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Tue May 12 19:41:39 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Tue May 12 20:05:42 2026 +0200"
      },
      "message": "Add defaulted copy/move constructors/assignment in `Options` classes.\nClean up how `Options` are passed.\n\nAs for other types, add copy constructor/assignment except for\n`Text{Parse,Print}MessageOptions` which are uncopyable, and add move\nconstructor/assignment except when copying is equivalent to moving.\nThis indicates when it is worth using `std::move()` for passing a parameter.\n\nTake `Options` parameters by value in most public functions. Exceptions:\n\n* `CFile{Reader,Writer}Base::Options`: they are movable more efficiently than\n  copyable due to a `std::string` member, but the relevant classes do not move\n  anything from them, so it is better to accept them by reference.\n\n* `{Fd,riegeli::tensorflow::File}{Reader,Writer}Base::Options`: for consistency.\n\nIn private functions, take `Options` parameters by value if they are cheap to\ncopy or move, otherwise by reference.\n\nPiperOrigin-RevId: 914362870\n"
    },
    {
      "commit": "81ebea9a2bdbc8401cfd107d59aed7c957448e06",
      "tree": "e7ee50de6cfda5540abbd5754a6db74e3b6273ee",
      "parents": [
        "12db77a887a06ca7c0ef14368ece09b9badf1081"
      ],
      "author": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Tue May 12 16:04:31 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Tue May 12 16:05:09 2026 +0200"
      },
      "message": "Add `{,Dynamic,Unbound}FieldSkipper()`.\n\nIt becomes increasingly common to do nothing in a field handler besides tracking\nfield presence. It is annoying to write lambdas which takes the value, context\nparameters, and just returns `absl::OkStatus()`, and it feels uncertain whether\ntaking and ignoring the value is as efficient as it could (it almost is;\narranging for this to perform varint skipping instead of varint parsing is not\nworth complicating the field handler protocol).\n\nIn contrast to `DynamicFieldCopier()`, `DynamicFieldSkipper()` field predicate\nreturns `bool` instead of `std::optional\u003cint\u003e`, because returning a destination\nfield number is not applicable.\n\nIn contrast to `AnyFieldCopier()`, `AnyFieldSkipper()` is not provided because\nskipping remaining fields is the implicit default.\n\nIn contrast to `UnboundFieldCopier()`, `UnboundFieldSkipper()` can reuse the\nimplementation of `FieldSkipper()`, because it does not need a destination field\nnumber.\n\nAlso, make public `FieldAccepted` and `FieldAcceptedIf` for dynamic field\nhandlers which carry no extra information about the field being accepted. The\nfield handler protocol requires an API which fits `std::unique_ptr` and\n`std::optional` but not `bool`. These types are extracted from a private\nimplementation detail of `DynamicFieldHandler()`. They are used by\n`DynamicFieldSkipper()` too.\n\nAlso, fix embarrassing compile errors in `FieldHandlerWrapper()` for dynamic\nfield handlers.\n\nPiperOrigin-RevId: 914263217\n"
    },
    {
      "commit": "12db77a887a06ca7c0ef14368ece09b9badf1081",
      "tree": "dae7acaf2057a08e069597ab419ee8d6a830dc00",
      "parents": [
        "ebbfb8ac96b844cf73e83d8492bf9f7d1f8671aa"
      ],
      "author": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Tue May 12 15:23:47 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Tue May 12 15:34:31 2026 +0200"
      },
      "message": "Do not hardcode the assumption that `ZSTD_CLEVEL_DEFAULT` is 3.\n\nWhile redefining the default compression level on the preprocessor level is not\na great idea and possibly nobody does this, respect that.\n\nPiperOrigin-RevId: 914248051\n"
    },
    {
      "commit": "ebbfb8ac96b844cf73e83d8492bf9f7d1f8671aa",
      "tree": "4bc3ad048bdd4cb6aa2d5226b1ec9f95ae6b3254",
      "parents": [
        "cf978da4b3719218a76899ec8d5a57defb477ca2"
      ],
      "author": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Fri May 08 22:44:06 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Fri May 08 22:45:02 2026 +0200"
      },
      "message": "Replace `ABSL_ATTRIBUTE_UNUSED`:\n\n* With commented-out parameter name if it applies to a function parameter which\n  is never used. This is more idiomatic and shorter.\n\n* With `[[maybe_unused]]` otherwise, i.e. the parameter is used conditionally\n  (due to `if constexpr`, possibly empty variadic expansion, or `#if`) or the\n  name is something other than a function parameter.\n\nThe parameter name is still skipped altogether when the parameter is never used\nto pass a value but e.g. disambiguates overloads (`operator++(int)`,\n`std::in_place_t`), specifies a type where an explicit template parameter\nwould not work, or introduces template parameters through\n`std::index_sequence\u003cindices...\u003e`.\n\nReplace `ABSL_ATTRIBUTE_NORETURN` with `[[noreturn]]`. It is available since\nC++11.\n\nReplace `ABSL_FALLTHROUGH_INTENDED` with `[[fallthrough]]`. It is available\nsince C++17.\n\nAttribute macros for non-standard and thus non-portable attributes remain.\n\nPiperOrigin-RevId: 912676701\n"
    },
    {
      "commit": "cf978da4b3719218a76899ec8d5a57defb477ca2",
      "tree": "30061d56ad871b0747e974c705e379420fe43420",
      "parents": [
        "252a73a901f527db8714fdd47f805792be85fff6"
      ],
      "author": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Thu May 07 15:49:39 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Thu May 07 15:50:45 2026 +0200"
      },
      "message": "Remove unused `serialized_message_internal.h` which was left after the old\nversion of `SerializedMessageReader`.\n\nPiperOrigin-RevId: 911936819\n"
    },
    {
      "commit": "252a73a901f527db8714fdd47f805792be85fff6",
      "tree": "59a0893db18098623ef8e1e2961b4e8680abbcae",
      "parents": [
        "58d6d0fd37deb5fe0b0b4c3a6aa8f00eaaf99000"
      ],
      "author": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Thu May 07 09:18:20 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Thu May 07 09:20:00 2026 +0200"
      },
      "message": "In `ZstdWriterBase::Reset()`, reorder statements and fix the comment:\nit is `compression_dictionary_` which must be destroyed after `compressor_`,\nnot `dictionary_`.\n\nIn `ZstdWriterBase::Done()` reset `compression_dictionary_` to save memory.\n\nFix include ordering.\n\nClean up TensorFlow macros.\n\nPiperOrigin-RevId: 911784963\n"
    },
    {
      "commit": "58d6d0fd37deb5fe0b0b4c3a6aa8f00eaaf99000",
      "tree": "2ab9a93784d2d722539a2f5bfcb993665657c412",
      "parents": [
        "8caf038fe50bb21881e39522577e2a76ef75d04d"
      ],
      "author": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Thu Apr 30 15:54:16 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Thu Apr 30 15:56:15 2026 +0200"
      },
      "message": "Add optimized conversions between `LinearSortedStringSet` and\n`ChunkedSortedStringSet`.\n\nPiperOrigin-RevId: 908146178\n"
    },
    {
      "commit": "8caf038fe50bb21881e39522577e2a76ef75d04d",
      "tree": "0b991f870845b34a47c8eeee89e28ca0f47a53db",
      "parents": [
        "7e51af3f89117a4934b678745291b677547b74b6"
      ],
      "author": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Thu Apr 30 08:38:43 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Thu Apr 30 08:39:27 2026 +0200"
      },
      "message": "Let varint fields parse even if their value overflows the target integer or enum\ntype. The overflow might happen if the field used to have a wider type.\n\nThis aligns the semantics with native proto parsing. The cost is replacing a\nfailure with silent data loss. Native proto parsing accepts that, so we can too.\n\nPiperOrigin-RevId: 907980660\n"
    },
    {
      "commit": "7e51af3f89117a4934b678745291b677547b74b6",
      "tree": "7b9e2f9b6b98923e75a0010800a0ff14913cfacb",
      "parents": [
        "a6dc26b78e652c985cf8e174cd3074cc0f130413"
      ],
      "author": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Wed Apr 29 11:29:27 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Wed Apr 29 11:31:11 2026 +0200"
      },
      "message": "Add support for tracking presence of fields, in the form of wrappers of field\nhandlers:\n* `FieldTracker()`\n* `UntilFieldFound()`\n* `UntilFieldFoundThenCancel()`\n* `OnlyFirstField()`\n* `OnlyFirstFieldThenCancel()`\n\nPiperOrigin-RevId: 907461623\n"
    },
    {
      "commit": "a6dc26b78e652c985cf8e174cd3074cc0f130413",
      "tree": "1a8fc550228954cbcde14867b3f77325ec63c7b8",
      "parents": [
        "487f389777e39dbbf7e45a02364d06f636505c54"
      ],
      "author": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Tue Apr 28 18:33:10 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Tue Apr 28 18:39:48 2026 +0200"
      },
      "message": "Reword a comment. \"Each other element\" was a leftover from times where the first\nelement was represented differently.\n\nPiperOrigin-RevId: 907023293\n"
    },
    {
      "commit": "487f389777e39dbbf7e45a02364d06f636505c54",
      "tree": "fa07ae73b1211be0f2cc8de8ea5bf0cd310572db",
      "parents": [
        "641142865fdacf84e144d1635b6466213256ffc5"
      ],
      "author": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Tue Apr 28 16:13:35 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Tue Apr 28 16:15:07 2026 +0200"
      },
      "message": "Add `{Linear,Chunked}SortedStringSet::last()`.\n\nDuring iteration, promise that the last element remains valid while the iterator\nmoves to `end()`. This is useful to implement `last()`.\n\nPiperOrigin-RevId: 906960653\n"
    },
    {
      "commit": "641142865fdacf84e144d1635b6466213256ffc5",
      "tree": "9c3ac2b381a4689cd6d215245b6d24cbe29debbc",
      "parents": [
        "46bda0e3680a5b00ccc270d0d3e19f93d5948355"
      ],
      "author": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Tue Apr 28 16:12:41 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Tue Apr 28 16:14:49 2026 +0200"
      },
      "message": "Fix `riegeli::EstimateMemory()` of a `ChunkedSortedStringSet`: follow through\nthe internal `Chunk` struct.\n\nPiperOrigin-RevId: 906960359\n"
    },
    {
      "commit": "46bda0e3680a5b00ccc270d0d3e19f93d5948355",
      "tree": "efeeae135825d9fca2752411167a01875deaaa79",
      "parents": [
        "86ff59bfec52a05efda32d3b0820781b6aa6146d"
      ],
      "author": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Tue Apr 28 08:58:00 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Tue Apr 28 08:58:54 2026 +0200"
      },
      "message": "Add support for writing packed repeated fields to a preallocated array rather\nthan to a `Writer`. This avoids a bounds check for each element.\n\nCosmetics: write bools with specialized code instead of as varints. This avoids\nrelying on the compiler to statically compute lengths of these varints, which is\nonly possible due to their limited range of [0..1].\nPiperOrigin-RevId: 906770507\n"
    },
    {
      "commit": "86ff59bfec52a05efda32d3b0820781b6aa6146d",
      "tree": "32d8afbe2068bea3da804db57ba2a553c827a897",
      "parents": [
        "bb1618a4a81321fd72429b0d56b7ad885d80e8a9"
      ],
      "author": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Wed Apr 22 20:00:29 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Wed Apr 22 20:41:30 2026 +0200"
      },
      "message": "Fix bazel 9 compatibility:\n\n* Update google_cloud_cpp to 3.3.0 to avoid an incompatible version of\n  rules_foreign_cc which uses removed `--incompatible_use_toolchain_transition`\n\n* Force rules_go@0.60.0: even google_cloud_cpp@3.3.0 brings rules_go@0.58.3\n  which is still incompatible with bazel 9.\n\n* Update xz to 5.4.5.bcr.8 to avoid having to specify\n  `--incompatible_disallow_empty_glob\u003dfalse` (in bazel 8 and 9).\n\n* Update brotli, bzip2, and snappy, because old versions use `cc_library` or\n  `cc_binary` as builtins which are no longer supported.\n\n* Actually update all other dependencies to their current versions.\n  Some of them were already newer due to indirect dependencies, with warnings.\n\n  Except for abseil-py: on my machine 2.4.0 is broken (cannot find \"\u003cPython.h\u003e\",\n  in bazel 8 and 9).\n\n* Add 3.13 to supported Python versions.\n\nBuilding with `--copt\u003d-Wa,--gsframe\u003dno --host_copt\u003d-Wa,--gsframe\u003dno` might still\nbe needed (in bazel 8 and 9) because of issues in Abseil which were not fixed\nyet.\n\nPiperOrigin-RevId: 903936571\n"
    },
    {
      "commit": "bb1618a4a81321fd72429b0d56b7ad885d80e8a9",
      "tree": "4c34bc70bd0cb80d5236e0f9f029ea5918786c3e",
      "parents": [
        "f61405711ee8e7fefd6b518e1f67f52d26c9dd32"
      ],
      "author": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Sat Apr 18 20:01:35 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Sat Apr 18 20:27:24 2026 +0200"
      },
      "message": "Add `ChunkedSortedStringSet::first()`.\n\n`LinearSortedStringSet::first()` already exists. The first element is stored\ncontiguously, so a simple accessor returning `absl::string_view` is possible.\n\nPiperOrigin-RevId: 901838348\n"
    },
    {
      "commit": "f61405711ee8e7fefd6b518e1f67f52d26c9dd32",
      "tree": "360686d4c9130ebe6f3753069b6d15cdb2e0eab1",
      "parents": [
        "b5f440780b424b9ce68d0dbf32b83e854207ea25"
      ],
      "author": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Thu Apr 16 12:26:46 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Fri Apr 17 11:50:45 2026 +0200"
      },
      "message": "Optimize `OptionalCompactString \u003d\u003d CompactString` like\n`CompactString \u003d\u003d CompactString` is optimized: check the whole representation\nfirst, so that short strings are compared as one word comparison, without\nextracting a variable length `absl::string_view` and comparing that.\n\nPiperOrigin-RevId: 900627004\n"
    },
    {
      "commit": "b5f440780b424b9ce68d0dbf32b83e854207ea25",
      "tree": "8788a0a8289fc682b17b878704afaa1b3f3a7190",
      "parents": [
        "5d154d1eac1044b01f31b6422b8a9551e10bb1e4"
      ],
      "author": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Thu Apr 16 12:25:50 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Fri Apr 17 11:50:28 2026 +0200"
      },
      "message": "Fix `With{Equal,Compare}` in C++17 for corner cases:\n\n1. Heterogeneous secondary comparisons (`!\u003d`, `\u003c`, `\u003e`, `\u003c\u003d`, and `\u003e\u003d`)\n   are not defined if the other type is also implemented using `WithEqual`\n   or `WithCompare`.\n\n2. Heterogeneous primary comparisons with swapped parameters (`\u003d\u003d` and\n   `RIEGELI_COMPARE`) are added only for types explicitly specified by\n   additional template parameters of `WithEqual` and `WithCompare`.\n\nThis avoids ambiguous overloads and cyclic template instantiations:\n\n1. If both parameter types consider swapping the parameters, but the types are\n   not comparable, then each definition is rewritten from the other one, and\n   their SFINAE constraints depend on each other.\n\n   This does not happen only if the code tries to compare incomparable values.\n   Due to how ADL works, a call to an unqualified function name with an argument\n   of type `A\u003cT\u003e` brings not only functions related to `A`, but also functions\n   related to `T`. The argument of type `A\u003cT\u003e` will not match the parameter\n   of type `T`, but the function template is instantiated earlier, trying to\n   compare `T` against `A\u003cT\u003e`.\n\n2. Automatic parameter swapping could only generate a constrained template\n   rather than overloads with concrete parameter types.\n\n   That converts parameters in the callee rather than in the caller, which leads\n   to different overload resolution.\n\n   That would create ambiguities in cases like `CompactString \u003d\u003d Chain`.\n   The parameters are not swapped because both types use `WithEqual`.\n   Intended `Chain \u003d\u003d absl::string_view` is not found because it requires\n   parameter swapping after all, since the converted parameter does not use\n   `WithEqual`.\n\nPiperOrigin-RevId: 900626664\n"
    },
    {
      "commit": "5d154d1eac1044b01f31b6422b8a9551e10bb1e4",
      "tree": "a7561c257c1bb747c9164f19857db592b6875a17",
      "parents": [
        "eb29aa6a92ff38818873c89f08c704037f6a4bf2"
      ],
      "author": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Thu Apr 16 12:23:58 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Fri Apr 17 11:50:09 2026 +0200"
      },
      "message": "Make conversion from `{String,Bytes,Path}Ref` to `absl::string_view` explicit.\nSame for conversion from `{Bytes,Path}Ref` to `StringRef`. Conversions in the\nother direction remain implicit.\n\nMutual implicit conversions are prone to ambiguities, e.g. in heterogeneous\ncalls to `\u003d\u003d`.\n\nComparisons are especially problematic, as subtleties of overload resolution\ndepend on whether secondary comparison operators are derived automatically\nin C++20 or emulated in C++17 with `WithEqual` and `WithCompare`. If primary\ncomparison operators have concrete parameter types, then C++20 provides\nsecondary comparison operators with the same parameter types, for which argument\nconversions happen in the caller, while C++17 emulataion provides templates for\nwhich argument conversions happen in the callee.\n\nTypes `StringRef` etc. are designed for function parameters. It is important\nthat they accept any suitable argument, i.e. conversions to them are important\nto be implicit. OTOH consuming these parameters can be less convenient, and\nconversions from them can be explicit.\n\nLet `BytesRef` and `PathRef` derive from `StringRefBase` extracted from\n`StringRef` rather than from `StringRef` itself. The latter would make\n`BytesRef` implicitly convertible to `StringRef`, while we prefer\nthe other direction: `BytesRef` accepts more types than `StringRef`, e.g.\n`Span\u003cconst char\u003e`, so `BytesRef` should accept `StringRef` instead of\nthe other way around.\n\nMake `CStringRef` convertible from types convertible to `std::string`, e.g.\n`StringInitializer`. This improves compatibility with `StringRef`.\n\nPolish constructors of `StringRef` etc.:\n\n* Accept view types by value. This lets `ABSL_ATTRIBUTE_LIFETIME_BOUND` apply\n  only to what the view is constructed from, but not to the view object itself.\n  The view can safely be a temporary. Also, this reduces template instantiations\n  in common usages.\n\n* Remove `ABSL_ATTRIBUTE_LIFETIME_BOUND` where the parameter reference is not\n  actually retained because its data have been just copied to `std::string`.\n\n* Constrain templates by types being convertible to `absl::string_view` rather\n  than to `StringRef` etc. The latter conversions may keep data in defaulted\n  arguments, which do not survive forwarding, so they should not be used inside\n  implementations of other conversions to view types.\n\nCoalesce comments about the constructors. A single comment states the goal of\nmultiple constructors, rather than details of the order of conversions and\nmaterialization by each constructor. The details are not that important,\nand the expectations about arguments are already stated in class comments.\n\nMake `BytesRef` comparable only against itself, and make `CompactString`\nand `OptionalCompactString` comparable against `absl::string_view` but not\n`BytesRef`. While this disallows direct comparisons between e.g. `CompactString`\nand `std::array\u003cchar, length\u003e`, this reduces ambiguities in cases like\n`CompactString \u003d\u003d StringRef`. Arbitrary types convertible to `BytesRef`\nare not necessarily comparable anyway, e.g. `std::string` against\n`std::array\u003cchar, length\u003e`, so `CompactString` does not need to cover that.\n\n`BytesRef` remains implicitly convertible both from and to\n`absl::Span\u003cconst char\u003e`. This is hard to avoid because `absl::Span\u003cconst char\u003e`\nis convertible from any type providing suitable `data()` and `size()`,\nwhich includes `BytesRef`.\n\n`BytesRef` cannot be reliably compared against `absl::Span\u003cconst char\u003e` in C++17\nmode. This is so because `absl::Span` provides a comparison against any type\nconvertible to `absl::Span`, which is ambiguous wrt. comparisons provided by\n`WithCompare\u003cBytesRef\u003e`. It is comparable in C++20 mode though, because overload\nresolution prefers templated operators provided by `Span` over converting `Span`\nto `BytesRef` on the caller side.\n\nPiperOrigin-RevId: 900626152\n"
    },
    {
      "commit": "eb29aa6a92ff38818873c89f08c704037f6a4bf2",
      "tree": "56b78dc68cca8ff0379c433e1e70c2f12f416c95",
      "parents": [
        "a0a8dac780d1e46224045ae2ddc9d81e1def83ca"
      ],
      "author": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Thu Apr 16 11:45:02 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Fri Apr 17 11:49:51 2026 +0200"
      },
      "message": "Make `riegeli::Reset(dest, args...)` an effective optimization of\n`dest \u003d T(args...)` for more types and patterns:\n\n* `riegeli::Reset(dest, std::in_place, args...)` → `dest.emplace(args...)`\n* `riegeli::Reset(dest, std::in_place_type\u003cType\u003e, args...)` →\n  `dest.emplace\u003cType\u003e(args...)`\n* `riegeli::Reset(dest, std::in_place_index\u003cindex\u003e, args...)` →\n  `dest.emplace\u003cindex\u003e(args...)`\n* `riegeli::Reset(dest)` → `dest.clear()` (`begin()` and `end()` must be\n  defined because this pattern would be risky for non-containers)\n* `riegeli::Reset(dest, args...)` → `dest.assign(args...)`\n  (`begin()` and `end()` must be defined)\n\nThis covers in particular `std::optional`, `std::variant`, `std::any`,\n`absl::InlinedVector`...\n\nDescribe some caveats when resetting may differ from assignment from a newly\nconstructed object.\n\nRemove overrides of `RiegeliReset()` which became redundant.\n\nPiperOrigin-RevId: 900610370\n"
    },
    {
      "commit": "a0a8dac780d1e46224045ae2ddc9d81e1def83ca",
      "tree": "b135ab89d3ed2d3611ba10590da5d8d778e5cdea",
      "parents": [
        "401f6cb01b48f18541e32618ca2e80666948057f"
      ],
      "author": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Tue Apr 14 10:57:11 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Tue Apr 14 10:58:02 2026 +0200"
      },
      "message": "Qualify private `{Linear,Chunked}SortedStringSet::HashValue()` as const.\nIt is called from const `AbslHashValue()`.\n\nPiperOrigin-RevId: 899442381\n"
    },
    {
      "commit": "401f6cb01b48f18541e32618ca2e80666948057f",
      "tree": "a9e00f58eebdef82706d7c08d9a1b7f2273d0815",
      "parents": [
        "f0a5005c50947df9a0ce005b83dc767871941354"
      ],
      "author": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Tue Apr 14 09:44:39 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Tue Apr 14 10:04:00 2026 +0200"
      },
      "message": "Derive from `With{Equal,Compare}` publicly, even though technically this does\nnot matter because they bring only friend functions.\n\nSkip explicit `public` in a struct.\n\nIn `HybridDirectMap::IteratorImpl`, make `operator\u003d\u003d` homogeneous for\nsimplicity. Heterogeneous comparison of iterators of different constness work\nby converting the arguments to a common type, which is simple enough to be\noptimizable.\n\nPiperOrigin-RevId: 899412745\n"
    },
    {
      "commit": "f0a5005c50947df9a0ce005b83dc767871941354",
      "tree": "e7bfcea5d0072ec598d7d4c07cea4196a25b0694",
      "parents": [
        "23b12cd2cfccfd5271ec56f5590053c88e4320f0"
      ],
      "author": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Fri Apr 10 15:33:38 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Tue Apr 14 10:03:41 2026 +0200"
      },
      "message": "Use more idiomatic `riegeli::Maker\u003cType\u003e(args...)` instead of\n`Initializer\u003cType\u003e(arg)` for specifying an initializer which constructs\nan object from the given arguments.\n\nPiperOrigin-RevId: 897661672\n"
    },
    {
      "commit": "23b12cd2cfccfd5271ec56f5590053c88e4320f0",
      "tree": "b46ce372d6efcb7e86596d23429f3fb602047496",
      "parents": [
        "cceff87ea7a7703e540eff1b185c9eaff8858203"
      ],
      "author": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Thu Apr 09 19:05:49 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Thu Apr 09 19:06:26 2026 +0200"
      },
      "message": "Add `UnboundFieldCopier()` for registering field copiers with a\n`FieldHandlerMap`.\n\nPiperOrigin-RevId: 897171160\n"
    },
    {
      "commit": "cceff87ea7a7703e540eff1b185c9eaff8858203",
      "tree": "468078f6efc2b333acf61bc32caaeca8bc2bb21c",
      "parents": [
        "0d51945bce37e68c22afc7f35b8ffacba0b1d5b4"
      ],
      "author": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Thu Apr 09 08:02:32 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Thu Apr 09 08:12:02 2026 +0200"
      },
      "message": "Simplify code by relying on the fact that `ABSL_USES_STD_STRING_VIEW` is always\ntrue nowadays: remove conditional handling of `std::string_view` as a separate\ntype, and assume that e.g. `std::string::append(std::string_view)` works.\n\n`string_view` continues to be spelled `absl::string_view` rather than\n`std::string_view` for compatibility with Google style.\n\nRemove an outdated comment at `StringRef`. It cannot be simply replaced with\n`absl::string_view` without breaking materializing a temporary `std::string`\nfrom e.g. `StringInitializer`.\n\nPiperOrigin-RevId: 896895786\n"
    },
    {
      "commit": "0d51945bce37e68c22afc7f35b8ffacba0b1d5b4",
      "tree": "6b977ceb36826c5b4933bf34f153226be4e51d43",
      "parents": [
        "a283a583a654a60b89f9f30e46649408a140ae5f"
      ],
      "author": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Wed Apr 08 14:19:25 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Wed Apr 08 14:20:52 2026 +0200"
      },
      "message": "Reword a comment.\n\nPiperOrigin-RevId: 896436509\n"
    },
    {
      "commit": "a283a583a654a60b89f9f30e46649408a140ae5f",
      "tree": "702a67fbe186fe0f5d8ce6a371d7ec4618fb0a5a",
      "parents": [
        "b6cebdc128758e6127bf51e46eae35f945d97baa"
      ],
      "author": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Wed Apr 08 12:21:34 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Wed Apr 08 12:45:56 2026 +0200"
      },
      "message": "Remove deprecated `RIEGELI_ASSERT_NOTNULL` and `RIEGELI_ASSERT_UNREACHABLE`\nmacros, no longer used.\n\nPiperOrigin-RevId: 896388278\n"
    },
    {
      "commit": "b6cebdc128758e6127bf51e46eae35f945d97baa",
      "tree": "f89d129fb0fef59163a62bf54ca5a64376255892",
      "parents": [
        "2567e5247b9ca04bf0a360dceb7f08ec1c6db788"
      ],
      "author": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Wed Apr 08 12:09:34 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Wed Apr 08 12:45:41 2026 +0200"
      },
      "message": "Fix `SerializedMessage{,Backward}Writer` build `#if !__cpp_concepts`:\nremove defaulted template parameter from definition which was already present\nin the declaration.\n\nPiperOrigin-RevId: 896383147\n"
    },
    {
      "commit": "2567e5247b9ca04bf0a360dceb7f08ec1c6db788",
      "tree": "9ef4964c1535bd8ffc342c98e89edcc3827c9003",
      "parents": [
        "e2f818adb1f2ff4fdf98a97f46331998ed25fec5"
      ],
      "author": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Wed Apr 08 09:51:45 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Wed Apr 08 12:45:25 2026 +0200"
      },
      "message": "Between `BZ2_bzDecompressEnd()` and `BZ2_bzDecompressInit()`, set `bzalloc`,\n`bzfree`, and `opaque` to `nullptr`.\n\nThis is not needed for `libbz2` but needed for `libbz2_rs_sys`.\n\nThe documentation implies that this might be needed. While there are no\nallowable actions after `BZ2_bzDecompressEnd()`, `BZ2_bzDecompressInit()`\naccepts an arbitrary `bz_stream`, as long as `bzalloc`, `bzfree`, and `opaque`\nare set, possibly to `nullptr`.\n\nPiperOrigin-RevId: 896323110\n"
    },
    {
      "commit": "e2f818adb1f2ff4fdf98a97f46331998ed25fec5",
      "tree": "1be271da18ff728ae92fae19a4a7338a0369d539",
      "parents": [
        "b51b787ee39470084df5a4327862abfcdd19cc82"
      ],
      "author": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Wed Apr 08 07:12:46 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Wed Apr 08 12:45:09 2026 +0200"
      },
      "message": "Add support for optimizing reading packed repeated fields.\n\nThis is not used automatically for now.\n\nPiperOrigin-RevId: 896261060\n"
    },
    {
      "commit": "b51b787ee39470084df5a4327862abfcdd19cc82",
      "tree": "2dcb243238c1bbb52d20e27ddd4cd3e82fb73ac1",
      "parents": [
        "387f369d7dd59b6924d9ab6727cafb6c3960bf83"
      ],
      "author": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Tue Apr 07 09:46:20 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Tue Apr 07 09:47:01 2026 +0200"
      },
      "message": "Allow overriding the default `HybridDirectTraits` for the given `Key` type by\ndefining a free function `friend RawKey RiegeliHybridDirectToRawKey(Key key)`,\nand optionally also\n`friend Key RiegeliHybridDirectFromRawKey(RawKey raw_key, Key*)`.\n\nThis avoids having to explicitly specify the traits each time a\n`HybridDirectMap` with that key type is used.\n\nAlso, change `expected_min_key` type from `Key` to `auto`. This allows to define\n`RiegeliHybridDirectToRawKey()` for key types which are not suitable as a\nnon-type template parameter.\n\nPiperOrigin-RevId: 895726185\n"
    },
    {
      "commit": "387f369d7dd59b6924d9ab6727cafb6c3960bf83",
      "tree": "7e5cd85f85ae07f82d14860729c22833b8c42a33",
      "parents": [
        "0dede994833aa5a992db91a79dd9c7a4ea33044e"
      ],
      "author": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Tue Apr 07 09:39:40 2026 +0200"
      },
      "committer": {
        "name": "Marcin Kowalczyk",
        "email": "qrczak@google.com",
        "time": "Tue Apr 07 09:40:41 2026 +0200"
      },
      "message": "Optimize `StringWriter` and `ResizableWriter` to avoid resizing to the whole\ncapacity if it is much larger than currently needed.\n\nResizing proceeds at most to twice the current size each time.\n\nChange the traits protocol of `ResizableWriter`: replace `GrowToCapacity()`\nwith `GrowUnderCapacity()`. It takes the new size as a parameter, and indicates\nwhether growing without reallocation was possible.\n\nInvariants of `StringWriter` are changed to match `ResizableWriter` more\nclosely: even if the secondary buffer is used, the string can have uninitialized\nspace appended.\n\nA difference between invariants of `StringWriter` and `ResizableWriter` remains:\n`StringWriter` has functions which resize the string as a side effect of\nappending a `Chain` (including the secondary buffer), `Cord`, `ExternalRef`, or\n`ByteFill`. `ResizableWriter` is simpler but less efficient by not having these\ncombined functions, because otherwise traits would need to have several new\nfunctions, one for each type being appended.\n\nAs before, if the initial string is not empty but `set_append(true)` is not\nrequested, then the original contents are utilized as the new space without\nclearing, avoiding filling them with zeros. This means that it is more efficient\nto let `StringWriter` clear the string than to clear it explicitly before\ncreating the `StringWriter`.\n\nMinor changes:\n\n* Override `WriteSlow(absl::string_view)`. In the case of `StringWriter`,\n  this can be more efficient than the default implementation in terms of\n  `PushSlow()`, by resizing as a side effect of appending. In the case of\n  `{String,Resizable}Writer`, this avoids forced resizing if data follow the\n  current position, because there is no need to make them available for partial\n  overwriting, because the whole buffer will be overwritten immediately.\n\n* Call `ResizableTraits::Grow()` only if the existing size is insufficient.\n  Move the responsibility of that check from implementations of this function\n  to their caller.\n\n* During `ResizableWriter` initialization, set buffer pointers to existing\n  contents eagerly, instead of leaving buffer pointers unset and waiting for\n  an operation like `ResizableWriterGrowDestAndMakeBuffer()` to set them.\n\nPiperOrigin-RevId: 895723423\n"
    }
  ],
  "next": "0dede994833aa5a992db91a79dd9c7a4ea33044e"
}
