Repository navigation
Releases: LBNL-ETA/FileParse
Release list
Version_1.1.6
What's New
- The node adapter contract is now a C++20 concept (
NodeAdapterLike) instead of a virtualINodeAdapterbase class. Serializers were already duck-typed templates, so consumer code compiles unchanged; custom mock/test adapters no longer derive from a base and can validate themselves with astatic_assertagainst the concept. - The JSON adapter holds its state inline instead of behind a shared pimpl.
- JSON files are written tab-indented instead of four-space, making them more compact to store and faster to write.
Version_1.1.5
FileParse Version_1.1.5
Build / tooling
- Added local development mode: the
localCMake preset setsLBNL_LOCAL_SIBLINGS, preferring sibling working copies (../<Name>) of dependencies when checked out, with independent fallback to each declared remote. - Cross-platform presets / Ninja-on-Unix groundwork and MSVC
/MP(multi-processor compilation). - Regenerated the dependency chart (
doc/FileParse.md) from the template.
Dependencies
- nlohmann_json bumped v3.11.3 -> v3.12.0 (consolidated across the Windows-Tools dependency graph).
- xmlParser pinned at v1.0.5 (unchanged).
- googletest (test only) bumped to v1.17.0.
No public API changes.
Version_1.1.3
Bug fix
operator>> for std::optional<T> now treats empty XML elements as nullopt.
Previously, an empty self-closing element like <X/> (or its equivalent <X></X>) would populate the optional with a default-constructed T{} because the predicate guarding deserialization was just !node.isEmpty() — and a parsed empty element is "non-empty" in the XML-node sense (the node exists, just has no children or text).
That caused round-trips of schema-equivalent-to-missing elements to come back as optional{T{}} instead of nullopt. Downstream consumers comparing an authored record (no element written) against a loaded record (empty wrapper deserialized to default-constructed T) saw spurious differences.
The predicate is now !node.isEmpty() && (!node.getChildNodes().empty() || !node.getText().empty()) — the optional is populated only when the node both exists and carries content. Empty wrappers stay nullopt, matching the typical XML convention.
Behavior
XML form | before 1.1.3 | from 1.1.3 -- | -- | -- element absent | nullopt | nullopt 91 (text content) | optional{91} | optional{91} ... (children) | optional{T{...}} | optional{T{...}} or (empty wrapper) | optional{T{}} | nulloptTrade-offs
The new predicate has lossy round-trips for two edge cases:
optional<std::string>{""}written as<X></X>deserializes asnullopt. If your schema uses empty-string-as-value distinctly from "no string", supply a custom serializer at the call site.- Optional types whose payload lives entirely in attributes (
Version 1.1.2
What's Changed
Build
- Removed forced static CRT () on MSVC — consumers now control runtime library selection
- Added auto-generated dependency diagram via CMake
CI
- Updated CI matrix: Windows 2022/2025, macOS 14/15/26, Ubuntu 24.04
- Replaced Ninja/Clang setup with standard CMake builds
Version_1.1.1
Changes
- Updated XMLParser dependency to v1.0.4 (char-only, wide-char support removed)
- Added
if(NOT TARGET)guards to FetchContent declarations to avoid duplicate targets - Removed MSVC runtime library override — consuming projects should control this setting
- Added dependency chart documentation
Dependencies
- xmlParser: v1.0.4
- nlohmann_json: v3.11.3
Version_1.0.5
Version_1.0.4
- General function for converting case-insensitive enumerator strings are added
Version_1.0.3
- Warnings level for different compiler lifted (W4 MSVC and Wall for others)
Version_1.0.2
- Using version of XMLParser that contain fix for build issues in pyWinCalc manylinux wheels
Version_1.0.1
- Conversion to double from string is now pure function
- xmlParser branch version variable introduced