Skip to content

Tools: unify ryml-parse-emit and ryml-yaml-events, remove ryml-yaml-events - #645

Merged
biojppm merged 2 commits into
masterfrom
unifytools
Jul 3, 2026
Merged

Tools: unify ryml-parse-emit and ryml-yaml-events, remove ryml-yaml-events#645
biojppm merged 2 commits into
masterfrom
unifytools

Conversation

@biojppm

@biojppm biojppm commented Jul 3, 2026

Copy link
Copy Markdown
Owner

No description provided.

@codecov

codecov Bot commented Jul 3, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 99.52%. Comparing base (71da53c) to head (3e77085).
⚠️ Report is 2 commits behind head on master.

Additional details and impacted files
@@            Coverage Diff             @@
##           master     #645      +/-   ##
==========================================
- Coverage   99.53%   99.52%   -0.01%     
==========================================
  Files          52       51       -1     
  Lines       14628    14456     -172     
==========================================
- Hits        14560    14388     -172     
  Misses         68       68              

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@biojppm
biojppm merged commit 0ab0352 into master Jul 3, 2026
308 of 309 checks passed
@biojppm
biojppm deleted the unifytools branch July 3, 2026 18:25
Hancock33 added a commit to Hancock33/batocera.piboy that referenced this pull request Jul 28, 2026
--------------------------------------------------------------------------------------------------------
batocera-emulationstation.mk 24db6d1510c7ce850d3068dfd54e803ae32cea1e # Version: Commits on Jul 22, 2026
--------------------------------------------------------------------------------------------------------
update po
Signed-off-by: Nicolas Adenis-Lamarre <nicolas.adenis.lamarre@gmail.com>,

------------------------------------------------------------------------------------------------
batocera-es-piboy.mk 24db6d1510c7ce850d3068dfd54e803ae32cea1e # Version: Commits on Jul 22, 2026
------------------------------------------------------------------------------------------------
update po
Signed-off-by: Nicolas Adenis-Lamarre <nicolas.adenis.lamarre@gmail.com>,

-------------------------------------------------------------------------------------
azahar.mk c711b0ab324d2ec116292b0db7c04a5733b8e559 # Version: Commits on Jul 21, 2026
-------------------------------------------------------------------------------------
BUGFIX: Legacy joystick triggers on linux (#2328)
* re-add centering detection to joystick api triggers
* patch SDLJoystick to calibrate center at launch,

-----------------------------------------------------------------------------------
cemu.mk 50b9e4ba1d4d7cf9821a9cd416378bb94e1ba0ca # Version: Commits on Jul 21, 2026
-----------------------------------------------------------------------------------
vulkan: crash on fence errors instead of possibly spamming the log,

------------------------------------------------------------------------------------------
dolphin-emu.mk b008142f72a099a9bcb971776209504f085ae0be # Version: Commits on Jul 21, 2026
------------------------------------------------------------------------------------------
Merge pull request #14436 from cbartondock/master
Loading custom textures using combination of elf/dol game ids and iso game ids.,

----------------------------------------------------
pcsx2.mk v2.7.492 # Version: Commits on Jul 21, 2026
----------------------------------------------------
- [Qt: Fix Optimal Frame Pacing not inheriting from global](PCSX2/pcsx2#14744)

--------------------------------------------------------------------------------------
pcsx2x6.mk 6c2339b647be62b1e26adf9a0ee0a291d0e4df67 # Version: Commits on Jul 22, 2026
--------------------------------------------------------------------------------------
Merge pull request #128 from PS2Homebrew-arcade/fixes-2
Several fixes,

------------------------------------------------------------------------------------
rpcs3.mk 8604f1c5d83fbd256e3e29fdccee4ead805c2689 # Version: Commits on Jul 21, 2026
------------------------------------------------------------------------------------
cli: allow to boot last savestate of a game,

-----------------------------------------------------------------------------------------
xenia-edge.mk b2c8fc8fc338cd0e88dd3007f5bad0db4f8cbbd3 # Version: Commits on Jul 22, 2026
-----------------------------------------------------------------------------------------
[D3D12] Bind shared memory as SRV+UAV on memexport draws
This ensures their vertex fetch works fixing Split/Second sky rendering,

-----------------------------------------------------------------------------------------
rpi-eeprom.mk bade0f69d5e5add2610fc57db9ca42694443c98b # Version: Commits on Jun 23, 2026
-----------------------------------------------------------------------------------------
rpi-eeprom-digest: Add metadata label for the target-soc
Add a metadata field to pieeprom.sig indicating the target-soc. This
will allow future versions of the bootloader to skip an incompatible
firmware update without reading the contents of the EEPROM image
file.,

----------------------------------------------------------------------------------------
rpi-utils.mk 6dedfe7cfbe3374aee1aba95ef49b169ee28a9ce # Version: Commits on Jul 09, 2026
----------------------------------------------------------------------------------------
overlaycheck: Avoid a Perl warning
Don't leave an undefined value when a bad compatible string is detected.
Signed-off-by: Phil Elwell <phil@raspberrypi.com>,

------------------------------------------------------
appstream.mk v1.1.4 # Version: Commits on Jul 22, 2026
------------------------------------------------------
Release version 1.1.4,

-------------------------------------------------------
rapidyaml.mk v0.16.0 # Version: Commits on Jul 22, 2026
-------------------------------------------------------
## TL;DR
This release focuses on API cleaning and tidying, **in preparation of release 1.0**:
  - improves tracking of nodes causing deserialization errors
  - adds serialization to/from `Tree` (not just `NodeRef`/`ConstNodeRef`)
  - deprecates a good number of functions, mostly around serialization and tree/node building
  - **brings code coverage to 100%** (rounded from >99.5%)
  - remove the c4core submodule, vendoring-in just the required c4core source code.
The API cleanup introduces a number of deprecations, and some other opt-in but recommended changes: see the migration guide in the next section.
Finally there are other fixes and improvements: see the [full changelog](#v016changelogsection), below the migration guide.
## Migration guide
This is the list of migration changes, linking to the relevant section below:
 - [Deprecated `.to_val()` method family for tree building](#toval)
 - Deprecated operators (but define `RYML_WITH_LEGACY_OPERATORS` to avoid the deprecation):
    - tree building: [deprecate operators `|=` or `=`](#notequal)
    - serialization: [deprecate operators `<<` or `>>`](#notshift)
 - Optional but **recommended**:
   - [user-implemented `read()` should now return `ReadResult`](#readresult)
   - [user-implemented `read()`/`write()` should now receive `Tree` and id](#treeid)
   - [do not use `.load()` (former `>>`) inside `read()`](#noloadinread)
   - [use `.deserialize_child()` inside `read()`](#deserializechild)
Be sure to also read through the quickstart diff for the full overview on how the new features work.
> [!TIP]
> Hint to see what changed in the quickstart: run `git diff v0.15.2...v0.16.0 samples/quickstart.cpp` on an up-to-date repo clone.
<a id=\toval\></a>
### Deprecate `.to_val()` family
For tree building, methods `.to_*()` were deprecated in favour of the newly-added `.set_*()` methods. See next section.
<a id=
otequal\></a>
### Deprecate operators |= and =
For tree building, `operator|=` and `operator=` were deprecated in favour of the newly-added `.set_*()` methods:
```c++
c4::yml::Tree tree = ...;
c4::yml::id_type node_id = ...;
c4::yml::NodeRef node = ...;
// before (deprecated)
node |= MAP|BLOCK;
node[\key\] = \val\;
node[\key\] |= VAL_SQUO;
node[\seq\] |= SEQ|FLOW;
node[\seq2\] |= SEQ;
node.append_child().to_seq(\map\);
// now, same as above:
node.set_map(BLOCK);
node[\key\].set_val(\val\, VAL_SQUO);
node[\seq\].set_seq(FLOW);
node[\seq2\].set_seq();
c4::yml::NodeRef child = node.append_child();
child.set_seq(\map\);
// or now, same as above, but from the tree:
// more code, but also more efficient
tree.set_map(node_id, BLOCK);
c4::yml::id_type id_key  = tree.append_child(node_id),
                 id_seq  = tree.append_child(node_id),
                 id_seq2 = tree.append_child(node_id),
                 id_map  = tree.append_child(node_id);
tree.set_key(id_key, \key\);
tree.set_val(id_key, \val\, VAL_SQUO);
tree.set_key(id_seq, \seq\);
tree.set_seq(id_seq, FLOW);
tree.set_key(id_seq2, \seq2\);
tree.set_seq(id_seq2);
tree.set_key(id_map, \map\);
tree.set_map(id_map);
```
If you prefer to keep on using the legacy operators `=`, `|=`, `<<`, `>>`, you can enable the cmake symbol (or define the macro) `RYML_WITH_LEGACY_OPERATORS`.
<a id=
otshift\></a>
### Deprecate operators << and >>
For serialization, `operator<<` and `operator>>` were deprecated in favour of `.set_serialized()` and `.deserialize()` (which introduce return on error) or `.save()` and `.load()` (which trigger error callback on error):
```c++
c4::yml::Tree tree = ...;
c4::yml::id_type node_id = ...;
c4::yml::NodeRef node = ...;
const T var1 = ...;
T var2 = ...;
// before (deprecated)
node << var1;
node >> var2;
node << key(var1);
node >> key(var2);
// now - save() and load() do checks and call error on failure
node.save(var1);
node.load(&var2);
node.save_key(var1);
node.load_key(&var2);
// or now, without exceptional flow: use .set_serialized() and .deserialize()
node.set_serialized(var1);
if( ! node.deserialize(&var2))
  ...
node.set_key_serialized(var1);
if( ! node.deserialize_key(&var2))
  ...
// also now possible from tree!
tree.save(node_id, var1);
tree.load(node_id, &var2);
tree.save_key(node_id, var1);
tree.load_key(node_id, &var2);
tree.set_serialized(node_id, var1);
if( ! tree.deserialize(node_id, &var2))
  ...
tree.set_key_serialized(node_id, var1);
if( ! tree.deserialize_key(node_id, &var2))
  ...
```
If you prefer to keep on using the legacy operators `=`, `|=`, `<<`, `>>`, you can enable the cmake variable (or define the macro) `RYML_WITH_LEGACY_OPERATORS`.
The rest of the changes are **optional, but recommended**. If you don't do these changes, your code will go on working as before, but the new features and improved behavior will not be available.
<a id=
eadresult\></a>
### Optional: user-implemented `read()` should now return `ReadResult`
Your `read()` functions should now return a `c4::yml::ReadResult`. This enables reporting the exact node on which a deserialization error happens, even if it is nested deep in the tree, which in turn helps tremendously pinpointing problems in YAML source (especially with location tracking):
```c++
// optional: your implementation of read() should be changed from...
bool read(c4::yml::ConstNodeRef const& node, T *var)
{
    bool success = ...;
    return success;
}
// optional: change to this:
c4::yml::ReadResult read(c4::yml::ConstNodeRef const& node, T *var)
{
    bool success = ...;
    return c4::yml::ReadResult(success, node.id());
}
```
If you don't change, rapidyaml will still report the error, but on the node of the outer-most function returning false, instead of the node at the inner-most function.
<a id=\treeid\></a>
### Optional: user-implemented `read()`/`write()` should now receive `Tree` and id
If you want to use deserialization from `Tree`, your `read()` and `write()` implementations should now be rewritten for `Tree`, instead of `NodeRef`. This will enable using your `read()`/`write()` functions **with both the `Tree` and `NodeRef` methods**:
```c++
// optional: your implementation of write()/read() should be changed from...
void write(c4::yml::NodeRef *node, T const& var)
{
    ...
}
c4::yml::ReadResult read(c4::yml::ConstNodeRef const& node, T *var)
{
    bool success = ...;
    return c4::yml::ReadResult(success, node.id());
}
// optional: change to this to enable serialization from/to both Tree and NodeRef:
void write(c4::yml::Tree* tree, c4::yml::id_type id, T const& var)
{
    ...
}
c4::yml::ReadResult read(c4::yml::Tree const* tree, c4::yml::id_type id, T *var)
{
    bool success = ...;
    return c4::yml::ReadResult(success, id);
}
```
If you don't change, you will not be able to serialize to/from `Tree`. That is, **having only the node implementation will not work with the `Tree` methods**. You can also provide both functions, and they would be picked up correctly, but that is pointless. In short, **prefer the Tree** version.
Note also that **inside the tree version, you can still use the node API**. For example:
```c++
c4::yml::ReadResult read(c4::yml::Tree const* tree, c4::yml::id_type id, T *var)
{
    c4::yml::ConstNodeRef n(tree, id);
    ... // this way you can keep the function body as before
        // BUT read next note
}
```
<a id=
oloadinread\></a>
### Optional: do not use `.load()` (former `>>`) inside `read()`
Inside your `write()/read()` implementation **you should now use the new `.deserialize()` calls**. On error, these methods will play nice when they are called from `.deserialize()` on upper-level objects. On the contrary, `.load()` (formerly `>>`) will interrupt execution immediately, and this will prevent those upper-level calls from successfully receiving the actual `ReadResult` and reporting it upwards.
If you want to avoid exceptional flow and write code such as
```c++
struct Inner { int foo, bar; };
struct Outer { Inner inner1, inner2; }
Outer outer;
if( ! node.deserialize(&outer))
    ... // we want to enter this branch without triggering an error
```
... then your `read(tree,id,Inner*)` implementation should not use `.load()`:
```c++
c4::yml::ReadResult read(c4::yml::Tree const* tree, c4::yml::id_type id, Inner *inner)
{
    c4::yml::ReadResult result(tree->is_map(id), id);
    if(result) result = tree->deserialize_child(id, \foo\, &inner->foo);
    if(result) result = tree->deserialize_child(id, \bar\, &inner->foo);
    return result;
}
// Likewise for the outer type. Note how an Inner error will be
// transparently returned:
c4::yml::ReadResult read(c4::yml::Tree const* tree, c4::yml::id_type id, Outer *outer)
{
    c4::yml::ReadResult result(tree->is_map(id), id);
    if(result) result = tree->deserialize_child(id, \inner1\, &outer->inner1);
    if(result) result = tree->deserialize_child(id, \inner2\, &outer->inner2);
    return result;
}
```
In short, implementing `read()` with `.deserialize()` plays nice with both upper `.deserialize()` and `.load()` calls, whereas implementing `read()` with `.load()` will only work with upper `.load()` calls.
<a id=\deserializechild\></a>
### Recommended: use new methods `.deserialize_child()` in `read()`
Inside your `read()` implementation, **you should now use the new methods `.deserialize_child()`**.
This release also adds a family of methods to simplify `read()` implementations. Each of these returns a `ReadResult` object that is ready to return on error. Consider the following node-based `read()`, already using `.deserialize()`:
```c++
ryml::ReadResult read(ryml::ConstNodeRef const& n, my_type *val)
{
    ryml::ReadResult r(n.is_map(), n.id());
    if(r) r = n[\v2\].deserialize(&val->v2); // don't. using [] will throw error if \v2\ is not a child
    if(r) r = n[\v3\].deserialize(&val->v3);
    if(r) r = n[\v4\].deserialize(&val->v4);
    if(r) r = n[\seq\].deserialize(&val->seq);
    if(r) r = n[\map\].deserialize(&val->map);
    return r;
}
```
Any of the `operator[]` calls (or more precisely the `.deserialize()` calls on its result) may trigger a visit error when no such node exists. To avoid exceptional flow in case of error, you should now use `.deserialize_child()` which simplifies a graceful return with an appropriate error status when the child node does not exist:
```c++
ryml::ReadResult read(ryml::ConstNodeRef const& n, my_type *val)
{
    ryml::ReadResult r(n.is_map(), n.id());
    if(r) r = n.deserialize_child(n, \v2\, &val->v2); // there is also a fall-back overload
                                                      // receiving a default value when
                                                      // no such child exists
    if(r) r = n.deserialize_child(n, \v3\, &val->v3);
    if(r) r = n.deserialize_child(n, \v4\, &val->v4);
    if(r) r = n.deserialize_child(n, \seq\, &val->seq);
    if(r) r = n.deserialize_child(n, \map\, &val->map);
    return r;
}
```
Here's the list of new `ReadResult`-returning methods that may be of use in similar scenarios:
  - `Tree::deserialize_child()`, `ConstNodeRef::deserialize_child()`, `ConstNodeRef::deserialize_child()`: both for keys and indices (on seqs)
  - `Tree::child_r()`, `ConstNodeRef::child_r()`, `ConstNodeRef::child_r()`
  - `Tree::find_child_r()`, `ConstNodeRef::find_child_r()`, `ConstNodeRef::find_child_r()`
  - likewise for sibling: added `sibling_r` and `find_sibling_r()`
  - The `.get_if()` methods were deprecated in favour of `.deserialize_child()`.
<a id=\v016changelogsection\></a>
## Full changelog
- Update c4core to [v0.6.0](https://github.com/biojppm/c4core/releases/tag/v0.6.0)
- [PR#649](biojppm/rapidyaml#649) commit to ABI stability on patch releases before 0.x, then on minor releases after 1.x
- [PR#648](biojppm/rapidyaml#648) improve documentation, add benchmark results
- [PR#647](biojppm/rapidyaml#647) remove support for UTF16 and UTF32 encoded files
- [PR#646](biojppm/rapidyaml#646) improve Doxygen docs, update yamlscript version
- [PR#645](biojppm/rapidyaml#645) tools: unify ryml-parse-emit and ryml-yaml-events, remove ryml-yaml-events
- [PR#644](biojppm/rapidyaml#644) amalgamate: add `--fastfloat_sys` to use fastfloat from system
- [PR#643](biojppm/rapidyaml#643) reduce source archive size: move large data files used in benchmarks to  [rapidyaml-data](https://github.com/biojppm/rapidyaml-data) repo.
- [PR#642](biojppm/rapidyaml#642) amalgamate: add option to create single source+header.
- [PR#641](biojppm/rapidyaml#641): change uses of `C4_LIKELY()` / `C4_UNLIKELY()` to turn into `[[likely]]` / `[[unlikely]]`. No logic changes.
- [PR#640](biojppm/rapidyaml#640): add `.deserialize_child()` methods to simplify `read()` implementations
- [PR#639](biojppm/rapidyaml#639): fix names using leading/double underscore (renames only, no logic changes).
- [PR#638](biojppm/rapidyaml#638): improve quickstart-ints.
- [PR#637](biojppm/rapidyaml#637): add cmake option `RYML_SYSTEM_C4CORE` to consume c4core from `find_package()`. Thanks @uilianries!
- [PR#636](biojppm/rapidyaml#636) **remove c4core submodule**, and copy c4core files to rapidyaml (and manage sync):
  - `ext/c4core.src/`: c4core code used in the rapidyaml library
  - `ext/c4core.dev/`: c4core code used by tests/benchmarks
  - `proj/`: project files like cmake files and toolchains
  - `RYML_STANDALONE` can still be set to `OFF` to compile against an out-of-source c4core (see also the newly added `RYML_SYSTEM_C4CORE`)
  - the amalgamation tool now adds only the files in `c4core.src` files, and has new option `--c4core-dev` to include the `c4core.dev` files
  - adds (internal) tools to manage c4core synchronization scenarios. See [ext/README.md](https://github.com/biojppm/rapidyaml/tree/master/ext) for details with this.
- [PR#635](biojppm/rapidyaml#635) API cleanup: `NodeType` and `extra::ievt::EventFlags`:
  - On `Tree` and `NodeRef`, overloads taking `NodeType_e` are now receiving `type_bits`.
  - This saves operator calls on type queries.
  - Remove bitwise operators, no longer needed.
  - Rename `NodeType_e` to `NodeTypeBits` (deprecate `NodeType_e`)
  - Low impact, no changes should be needed on user code, other than renaming unlikely uses of `NodeType_e`.
  - Also, for int events: rename `extra::ievt::EventFlags` to `extra::ievt::EventBits`
- [PR#620](biojppm/rapidyaml#620) API cleanup: `Tree` and `NodeRef`:
  - Deprecate `NodeInit`
  - `Tree` and `NodeRef`:
    - deprecate `.to_val()` and friends -- add `.set_val()` and friends.
    - deprecate `operator=(csubstr)` and friends -- use `.set_val()` instead.
    - deprecate `operator|=(NodeType)` and `operator=(NodeType)` -- use appropriate overload `.set_*(T, NodeType)`.
    - You can disable compiler deprecation warnings from use of these operators: by enabling the cmake variable (or defining the macro) `RYML_WITH_LEGACY_OPERATORS`.
    - deprecate `NodeInit` and `NodeScalar` methods in `Tree` and `NodeRef` (use `.set_*()`)
    - deprecate single-arg `NodeRef::{duplicate,move}(ConstNodeRef)`
    - deprecate `NodeRef::visit()` and `NodeRef::visit_stacked()`
    - add `Tree::arena_rem()`
    - add `RYML_DEFAULT_TREE_ARENA_CAPACITY_START` with default value of 256
  - `parse_*()`: internal simplification, no semantic changes
- [PR#589](biojppm/rapidyaml#589) API cleanup: serialization and tree building
  - Refactor serialization code:
    - Deprecate `operator<<`, use `.load()` / `.load_key()` or `.deserialize()` / `.deserialize_key()`
    - Deprecate `operator>>`, use `.save()` / `.save_key()` or `.set_serialized()` / `.set_key_serialized()`
    - Deprecate `key()` tag function and `Key` tag type (needed only for the operators above)
    - Migration of code triggering serialization:
    - If you don't want to migrate yet, use `RYML_WITH_LEGACY_OPERATORS` to disable compiler deprecation warnings from use of these operators.
    - Serialization with `Tree` API is now fully implemented, working exactly the same as `NodeRef`
      - serialization:
        - `NodeRef` serialized with `write(NodeRef *, T const&)` and `write_key()`
        - `Tree` serialized with `write(Tree *, id_type, T const&)` and `write_key()`
        - No changes in types using `to_chars()` serialization
      - deserialization:
        - `ConstNodeRef` deserialized with `read(ConstNodeRef const&, T *)` and `read_key()`
        - `Tree` deserialized with `read(Tree const*, id_type, T *)` and `read_key()` (removed old `readkey()` approach.)
        - No changes in types using `from_chars()` serialization
      - Enables bypass of `NodeRef` serialization to use the tree API, which is faster to compile.
      - Organize serialization in layers, ensuring use of free functions to enable the user to override at all levels with ADL, for total control of type behavior (explained in the doxygen documentation).
      - Added many more unit tests to ensure all scenarios are working.
  - Move scalar specific code to new top-level headers `c4/yml/scalar_charconv.hpp` and `c4/yml/scalar_style.hpp`
  - Relax deserialization of nodes with `VALNIL` or `KEYNIL`, such that non-fundamental types can now be null-initialized (eg initialize a string from a null scalar). Fundamental types such as ints or floats will still report an error.
    ```c++
    Tree tree = parse_in_arena(\{empty: }\);
    std::string str;
    tree[\empty\].load(&str); // relaxed: no longer a deserialization error
    assert(s.empty());
    int val;
    tree[\empty\].load(&val); // ERROR! as before.
    ```
- [PR#626](biojppm/rapidyaml#626): ensure accurate reporting of nodes causing deeply nested serialization error. This enables reporting the inner-most node causing the error! To profit from this, `read()` user functions should now return `ReadResult` instead of `bool`. This change is backwards-compatible with legacy `read()` functions returning `bool`, but the legacy version will remain less precise: it will report an inner error on the upmost node returning false, possibly the root if all levels are returning bool. See the new `sample_deserialize_error()` on the quickstart, and the [latest doxygen documentation](https://rapidyaml.readthedocs.io/latest/doxygen/group__doc__serialization__user__types.html). The user functions should change (but not mandatory):
  ```c++
  // before
  bool read(ryml::ConstNodeRef n, T *var) { ... }
  // now (should be changed, but not mandatory)
  ryml::ReadResult read(ryml::ConstNodeRef n, T *var) { ... }
  ```
- [PR#625](biojppm/rapidyaml#625): Set plain scalar style when serializing arithmetic scalars: improves emit speed of numeric-heavy data payloads.
- [PR#616](biojppm/rapidyaml#616) API cleanup: emit
  - `WriterFile` and `WriterOStream` no longer track the number of emitted bytes.
  - `error_on_excess` is now used in the emit-to-buffer overloads, and no longer in the main `Emitter::emit_as()` driver function.
- [PR#617](biojppm/rapidyaml#617) API cleanup: emit, part 2
    - Tidy emit classes among new top-level header files:
      - `c4/yml/emit_container.hpp`: emit to resizeable contiguous char container (eg `std::string`, `std::vector<char>`)
      - `c4/yml/emit_buf.hpp`: emit to char buffer (`substr`)
      - `c4/yml/emit_file.hpp`: emit to C `FILE*`
      - `c4/yml/emit_ostream.hpp`: emit to STL-like ostreams
    - The old `c4/yml/emit.hpp` is now a pure umbrella header, including all of the above. For better compilation speed, avoid the umbrella header, and prefer including the concrete header (container, buf, file or stream).
    - The rest of the emit code was split over these new implementation headers:
      - `c4/yml/emit_options.hpp`: options to control emitting
      - `c4/yml/emitter.hpp`: main emitter class
      - `c4/yml/emitter.def.hpp`: definitions of main emitter class.
      - `c4/yml/writer_buf.hpp`: policy class to emit to char buffer (`substr`)
      - `c4/yml/writer_file.hpp`: policy class to emit to C `FILE*`
      - `c4/yml/writer_ostream.hpp`: policy class to emit to STL-like ostreams
    - There are no semantic changes: all the `emit_*()` functions remain the same.
    - Other changes in this PR:
      - Added `Tree::root_id_maybe()` which is safe to call on an empty tree.
      - Deprecate `Emitter::max_depth()`
      - Deprecate `Emitter::options()` setter
- [PR#618](biojppm/rapidyaml#618): API cleanup: emit, part 3
  - Improve handling of `NaN` and `Inf` in json emitting.
  - Expose scalar style helpers for json emitting:
    ```c++
    bool scalar_is_plain_number_json();
    bool scalar_is_special_json();
    bool scalar_is_inf3();
    bool scalar_is_nan3();
    bool scalar_is_inf_or_nan3();
    ```
  - Writers: add `C4_ALWAYS_INLINE`. Results in ~10-20% emit improvements.
  - `file_put_contents()`: add `FILE*` overloads
- [PR#621](biojppm/rapidyaml#621) API cleanup: `NodeRef`:
  - Simplify internal implementation of `{Const}NodeRef::{iterator,children_view}`.
  - Stop using SFINAE on Node CRTP to distinguish const vs non const, by duplicating the functions in `NodeRef` vs `ConstNodeRef`. No semantic changes. This should improve compilation speed of code containing many node calls.
- [PR#622](biojppm/rapidyaml#622) API cleanup: remove preprocess utilities.
- [PR#623](biojppm/rapidyaml#623): YAML fuzzing fixes, and close to 1 billion fuzz runs without any errors. These were the only two problems found:
  - Ensure parse error on multiline keys opening YAML:
    ```yaml
    multiline
      key: value
    ```
  - Fix parse error on Byte Order Mark opening containers:
    ```yaml
    <BOM>-
      - a
    -
    ```
- [PR#628](biojppm/rapidyaml#628): Add serialization fuzzing. Relax `c4::atof()` / `c4::atod()`, disable redundant assertions that prevent returning false on bad strings.
- [PR#629](biojppm/rapidyaml#629): int events:
  - Rename `to_chars(substr,DataType)` to `to_str()` (the existing c4 overload would always win because it's an int)
  - Do not use c4/bitmask.hpp
- [PR#633](biojppm/rapidyaml#633): improve coverage to ~99.5%:
  - Add tests to cover missed lines
  - Change some errors to assertions; those errors are caught before calling.
  - `Tree` and `NodeRef`: deprecate `.type_str()`. Use `.type().type_str()`
  - Tools: add ints parsing to ryml-emit-parse
- [PR#634](biojppm/rapidyaml#634): int events: add sample containing ints-only library
- [PR#590](biojppm/rapidyaml#590): minor: prefer calling some predicates from `NodeType`
## Thanks
- @uilianries
,

--------------------------------------------------------------------------------------
uwe5622.mk 7bfaaf46ea6834a964672b91b4bf7fd9f0a834e7 # Version: Commits on Jul 22, 2026
--------------------------------------------------------------------------------------
satisfy FORTIFY_SOURCE when enabled by declaring flex arrays,

----------------------------------------------------
box64.mk v0.4.3-4 # Version: Commits on Jul 22, 2026
----------------------------------------------------
[DYNAREC] Ported the alternate fix from Arm to others (#4091),

------------------------------------------------------------------------------------------
devilutionx.mk ac2d7fc731bc37bc3547eddd2d4c395c868c439f # Version: Commits on Jul 13, 2026
------------------------------------------------------------------------------------------
Replace libfmt with std::format
- `fmt::format` with literal format strings -> `std::format`.
- `fmt::format(fmt::runtime(...))` -> `FormatRuntime` in the new
  `utils/format.hpp`, a std::vformat wrapper that is also safe under the
  P2905 lvalue requirement of `std::make_format_args`.
- `fmt::dynamic_format_arg_store` (Lua logging) -> a small hand-rolled
  per-field formatter over `std::variant`, returning `std::expected`.
- `fmt::format_int` -> `std::to_chars`.
- `fmt::join` -> manual joins at the two call sites.
- SDL_audiolib: new patch that rewrites aulib_log.h to use std::format
  and drops the fmt dependency from its CMakeLists.
- The `-static-libstdc++` guard now keys off
  `DEVILUTIONX_STATIC_SDL_AUDIOLIB` instead of `DEVILUTIONX_STATIC_LIBFMT`.
- libfmt removed from CMake, vcpkg, Brewfile, CI workflows,
  Dockerfiles, packaging scripts, UWP project, and docs.
- macOS bumped to 13.3+, iOS to 16.3+ (required for `<format>`)
- Amiga m68k: provide `__cmpdf2`, which is missing from the hard-float
  libgcc multilib but referenced via libstdc++'s long double paths.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>,

-------------------------------------------------------------------------------------------
jazz2-native.mk f825533bab95a75d5aa7e1ab21cbd067e8c34fb2 # Version: Commits on Jul 21, 2026
-------------------------------------------------------------------------------------------
Fixed build,

----------------------------------------------------------------------------------------------------
sdl2-gamecontrollerdb.mk 15aff6d40aecd704c051aa69132d982eaa39e3b0 # Version: Commits on Jul 22, 2026
----------------------------------------------------------------------------------------------------
Add mapping for \BigBen Interactive Usb Gamepad\ under Linux (#967)
* Add mapping for \BigBen Interactive Usb Gamepad\ under Linux
Add mapping for \BigBen Interactive Usb Gamepad\ under Linux created via SDL2 Gamepad tool.
Output from lsusb:
```
Bus 002 Device 004: ID 146b:5500 BigBen Interactive Usb Gamepad
```
* Cleanup CRC, name
---------
Co-authored-by: Alynne <alviscera@gmail.com>,

-------------------------------------------------------
retroarch.mk v1.22.2 # Version: Commits on Nov 20, 2025
-------------------------------------------------------
,

-----------------------------------------------------------------------------------------------
retroarch-assets.mk 0959892093bdf85d96206993685a7450b26a1732 # Version: Commits on Jul 21, 2026
-----------------------------------------------------------------------------------------------
Merge pull request #499 from baxysquare/master
New & Revised Icons for Automatic & Systematic,

----------------------------------------------------------------------------------------
doomretro.mk db87c60e99b2789a2b21faad929859b552b91914 # Version: Commits on Jul 22, 2026
----------------------------------------------------------------------------------------
Improve parsing of `toggle` CCMD,

--------------------------------------------------------------------------------------
vkquake.mk 36592d4e3629817afe7d31bb1feef4a14ea2955f # Version: Commits on Jul 22, 2026
--------------------------------------------------------------------------------------
Added Quit Prompt option, removed -fitz option (from Ironwail),

---------------------------------------------------------------------------------------
vkquake2.mk 0672af0e29a89aead01b09230f27198da435162e # Version: Commits on Jul 22, 2026
---------------------------------------------------------------------------------------
Update README.md,

--------------------------------------------------------------------------------------
yquake2.mk 65a8299cad553cedb10b89e8b17c4d34a45ea5e2 # Version: Commits on Jul 21, 2026
--------------------------------------------------------------------------------------
GL3: Significantly reduce draw calls with batching
Merge commit '7376ea51'
Part of rebase:
 yquake2/yquake2#1339,

------------------------------------------------------------------------------------------
xash3d-fwgs.mk 2cf8c6363178e58bf22db89a870c49fb763212da # Version: Commits on Jul 22, 2026
------------------------------------------------------------------------------------------
engine: server: fix a typo, we should set pmove frametime before calling server pmove, instead of server global pmove, like GoldSrc
Thanks to @dkenw for drawing attention to this issue.,

----------------------------------------------------------------------------------------------
libretro-azahar.mk c711b0ab324d2ec116292b0db7c04a5733b8e559 # Version: Commits on Jul 21, 2026
----------------------------------------------------------------------------------------------
BUGFIX: Legacy joystick triggers on linux (#2328)
* re-add centering detection to joystick api triggers
* patch SDLJoystick to calibrate center at launch,

--------------------------------------------------------------------------------------------------
libretro-beetle-psx.mk 59e43186cacee4c656a56a4c505b8c16ade90506 # Version: Commits on Jul 22, 2026
--------------------------------------------------------------------------------------------------
psx: honor the cached-code check in the PGXP store handlers
The DMA-only invalidation fix added a per-word cached-code bitmap test
to lightrec's default store handlers: in that mode, ordinary stores
skip invalidation unless they land inside a cached block. The PGXP
non-HW handlers in cpu.c were missed - they still skip invalidation
unconditionally when DMA-only mode is active:
\tif (!psx_dynarec_invalidate)
\t\tlightrec_invalidate(state, mem, n);
When any PGXP mode is enabled, the RAM/BIOS/scratchpad maps get these
ops, and every store routed through the C wrapper resolves to them
instead of the checked defaults. The emitted cached-code check does not
cover this population either: it is only emitted on the direct-RAM
store paths, and guarded, direct and untagged stores all route through
the generic wrapper with no emitted check - the measured ~94% of the
store mix. Net effect: with PGXP on, DMA-only mode never invalidates on
CPU stores at all, and any CPU-side copy of code over cached blocks
(e.g. Symphony of the Night streaming a map overlay at a loading door)
leaves stale compiled blocks installed. The staleness surfaces as jumps
into the previous overlay's code and, eventually, wild accesses into
the 0x00800000+ bus hole, which the dynarec treats as fatal.
Export lightrec_store_hits_code() and give the four PGXP non-HW store
handlers the exact skip condition of their lightrec_default_*
counterparts. The unaligned-store handler also inherits the default's
8-byte two-word treatment; it previously invalidated only 4 bytes at
the unaligned address, under-invalidating in Full mode as well.
Full-mode behavior is otherwise unchanged: the added check only runs
when psx_dynarec_invalidate is set.,

--------------------------------------------------------------------------------------------------
libretro-cannonball.mk 65cb1f5f227db45abcd9d2006efe7687a0d9cb72 # Version: Commits on Jul 21, 2026
--------------------------------------------------------------------------------------------------
engine: lower file-scope integer constants to macros
The C++ engine used file-scope \static const\ integer objects as data.
In C those are not constant expressions, so any that feed a data table,
array size or case label break with \initializer element is not constant\
on the toolchains that don't fold const reads (gcw0/dingux, miyoo, wiiu).
The lookup tables were the widest offender: ozoom_lookup.h's ZOOM_LOOKUP[]
is built from SIZE1..SIZE5/UNUSED, and many sprite/sound tables likewise.
Rather than chase them per-table, lower every file-scope ALL-CAPS scalar
integer 'static const' to an object-like macro so it is a genuine integer
constant expression everywhere. Exceptions left as objects because they
are only ever read at runtime (never in a constant-expression context):
CHAN_SIZE (shadowed by a local of the same name in osound.c), VERBOSE,
frame_reset, rom_size. omusic.h's multi-declarator HAND_* group becomes a
plain enum.
No constant among these is address-taken, so none relied on having storage.
Verified: full build links with -Wl,--no-undefined, and no file-scope
named scalar 'static const' remains in a constant-expression position.,

--------------------------------------------------------------------------------------------
libretro-gpsp.mk 5b6e751f4abf368509146cd143c949c1946ac1ae # Version: Commits on Jul 21, 2026
--------------------------------------------------------------------------------------------
Delete apply-sound-rate-option.sh,

--------------------------------------------------------------------------------------------
libretro-o2em.mk 679d6fec04963f6e70a7ec217e3d0ebb1fe472fc # Version: Commits on Jul 21, 2026
--------------------------------------------------------------------------------------------
libretro-common: restore compat/msvc/stdint.h
The libretro-common prune in 82000ac computed its keep-set from the
Linux build's textual include closure, which cannot see this file:
the pre-2010 MSVC lanes resolve the ordinary '#include <stdint.h>'
in every source file through it by appending
libretro-common/include/compat/msvc to the INCLUDE path, since those
compilers ship no stdint.h of their own. Its deletion broke the
windows_msvc2005_x86 build at the first file:
  src/audio.c(18) : fatal error C1083: Cannot open include file:
  'stdint.h': No such file or directory
Restored byte-identical from RetroArch @ 45246ce (the same revision
the resync came from; upstream's compat/msvc contains only this
file). The other five prune deletions were re-audited for the same
cross-platform failure mode and are genuinely unreferenced: the
string_list.h reference sits behind the unused cdrom path, and
audio_resampler.c's stdstring.h uses only header-inline definitions,
which the Linux link's --no-undefined already proves. A C90 syntax
sweep of the recently touched sources found nothing else the MSVC
2005 frontend would reject beyond its accepted extensions.,

--------------------------------------------------------------------------------------------
libretro-pc88.mk b5a0e044a914c9a6b8d7b2dd2ddd152f93d35687 # Version: Commits on Jul 22, 2026
--------------------------------------------------------------------------------------------
Merge pull request #79 from cscd98/webos-fix,

----------------------------------------------------------------------------------------------
libretro-prboom.mk c5b09532fa633e015ac75c0a2acfec049f65ded3 # Version: Commits on Jul 21, 2026
----------------------------------------------------------------------------------------------
README: document the sound system
Expand the thin Audio & music highlights and add a dedicated Sound
system section covering the reworked pipeline:
- output: float32 negotiation with int16 fallback, quantize-once
  discipline, runtime-selectable 32/44.1/48/96 kHz with in-place SFX
  retune and song-position resume, deterministic 16.16 frame pacing
- music backends: OPL2 at the true 49716 Hz hardware rate through the
  polyphase Kaiser-windowed-sinc resampler (raw chip sum in, single
  quantization out), FluidSynth, libmad MP3 at full 28-bit synthesis
  precision, float-native Ogg, the deliberately integer-only pocketmod
  MOD decoder, and raw MIDI out; MIDI synth selection vs autodetect
- SFX: DMX/WAV/Ogg sources, native-rate storage, 15-bit lerp weight
  (within 1 LSB of exact), chunked 32-channel mixer, libm-free pitch
  table
- per-backend music position serialize for runahead/rewind, with the
  render-replay fallback
Also corrects the old highlights bullet: dbopl is DOSBox-derived and
driven as OPL2 here, not OPL3/Nuked.,

----------------------------------------------------------------------------------------------------
libretro-reminiscence.mk e6c0b0039258004f8bc377ddb88c0e931db131ce # Version: Commits on Jul 21, 2026
----------------------------------------------------------------------------------------------------
ci: revert the ngc dependency override (it broke the whole pipeline)
The previous change added 'needs'/'dependencies: build-static-retroarch-ngc' to
libretro-build-ngc. That job name is not part of a core's pipeline, so GitLab
rejected it with 'undefined dependency: build-static-retroarch-ngc' and refused
to run the pipeline at all -- worse than the original failure, which at least
let every other platform build.
Restore the job to the standard bare form used by every other core (verified
identical to libretro-prboom's libretro-build-ngc): just extends
.libretro-ngc-static-retroarch-master + .core-defs, with no needs/dependencies.
The retroarch-precompiled artifact wiring is the template's responsibility, not
the core's; a core must never reference the prepare job by name. Any remaining
ngc packaging issue belongs in libretro-infrastructure/ci-templates, not here.,

----------------------------------------------------------------------------------------------
libretro-stella.mk 8b36244391a9ba5efe4489b044df39b6edf55738 # Version: Commits on Jul 22, 2026
----------------------------------------------------------------------------------------------
Fixed a few more AnalogPin::Five/Nine swaps missed in the last commit.,

-------------------------------------------------------------------------------------------------
libretro-supafaust.mk d6187e5337e6c2646d003db3ab1936727ca75301 # Version: Commits on Jul 22, 2026
-------------------------------------------------------------------------------------------------
Merge pull request #32 from cscd98/android-fix,

----------------------------------------------------------------------------------------------------
libretro-superbroswar.mk 54c6c19e2ed938a072c962359566aa93a7244b88 # Version: Commits on Jul 22, 2026
----------------------------------------------------------------------------------------------------
Merge pull request #15 from cscd98/android-fix,

---------------------------------------------------------------------------------------------
libretro-vba-m.mk e734ed9e6d5813b34d83c6719fe327099f376737 # Version: Commits on Jul 22, 2026
---------------------------------------------------------------------------------------------
translations: transifex pull
Signed-off-by: Rafael Kitover <rkitover@gmail.com>,

---------------------------------------------------------------------------------------------
libretro-wasm4.mk 4e749b06c3bf75c7511138b2ac4c30a35074f696 # Version: Commits on Jul 22, 2026
---------------------------------------------------------------------------------------------
Merge pull request #870 from cscd98/android-fix
vendor - update wasm3,
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant