From 2414724d12793d4768bbc4b2743ab983392ab5c2 Mon Sep 17 00:00:00 2001
From: peplxx <91543105+peplxx@users.noreply.github.com>
Date: Sun, 2 Aug 2026 21:44:08 +0300
Subject: [PATCH 1/3] feat: graph model, YAML I/O and builder API (0.1.0)
---
.clangd => .clangd.in | 2 +
.gitignore | 1 +
.pre-commit-config.yaml | 2 +
CMakeLists.txt | 21 +-
README.md | 199 +++++++++++++
assets/libstgx-banner.png | Bin 0 -> 232476 bytes
cmake/ProjectSettings.cmake | 10 +
include/stgx/builder.hpp | 154 ++++++++++
include/stgx/diagnostics.hpp | 133 +++++++++
include/stgx/graph.hpp | 136 +++++++++
include/stgx/model.hpp | 80 ++++++
include/stgx/result.hpp | 45 +++
include/stgx/stgx.hpp | 11 +
include/stgx/yaml.hpp | 43 +++
src/builder.cpp | 24 ++
src/diagnostics.cpp | 157 +++++++++++
src/graph.cpp | 207 +++++++++++++-
src/validate.cpp | 118 ++++++++
src/validate.hpp | 23 ++
src/yaml_load.cpp | 374 +++++++++++++++++++++++++
src/yaml_save.cpp | 127 +++++++++
tests/CMakeLists.txt | 5 +
tests/builder_test.cpp | 138 +++++++++
tests/data/aliases.yaml | 17 ++
tests/data/invalid_bad_int.yaml | 5 +
tests/data/invalid_bad_release.yaml | 5 +
tests/data/invalid_bad_yaml.yaml | 4 +
tests/data/invalid_dangling.yaml | 6 +
tests/data/invalid_duplicate_id.yaml | 4 +
tests/data/invalid_empty_id.yaml | 3 +
tests/data/invalid_empty_nodes.yaml | 2 +
tests/data/invalid_no_initial.yaml | 3 +
tests/data/invalid_no_nodes.yaml | 3 +
tests/data/invalid_schema_version.yaml | 4 +
tests/data/invalid_task_arity.yaml | 9 +
tests/data/invalid_two_initial.yaml | 5 +
tests/data/invalid_wrong_type.yaml | 4 +
tests/data/minimal.yaml | 4 +
tests/data/two-tasks.yaml | 25 ++
tests/data/unsupported.yaml | 16 ++
tests/graph_test.cpp | 205 +++++++++++++-
tests/helpers.hpp | 32 +++
tests/validate_test.cpp | 146 ++++++++++
tests/yaml_load_test.cpp | 206 ++++++++++++++
tests/yaml_roundtrip_test.cpp | 104 +++++++
45 files changed, 2811 insertions(+), 11 deletions(-)
rename .clangd => .clangd.in (89%)
create mode 100644 README.md
create mode 100644 assets/libstgx-banner.png
create mode 100644 include/stgx/builder.hpp
create mode 100644 include/stgx/diagnostics.hpp
create mode 100644 include/stgx/model.hpp
create mode 100644 include/stgx/result.hpp
create mode 100644 include/stgx/stgx.hpp
create mode 100644 include/stgx/yaml.hpp
create mode 100644 src/builder.cpp
create mode 100644 src/diagnostics.cpp
create mode 100644 src/validate.cpp
create mode 100644 src/validate.hpp
create mode 100644 src/yaml_load.cpp
create mode 100644 src/yaml_save.cpp
create mode 100644 tests/builder_test.cpp
create mode 100644 tests/data/aliases.yaml
create mode 100644 tests/data/invalid_bad_int.yaml
create mode 100644 tests/data/invalid_bad_release.yaml
create mode 100644 tests/data/invalid_bad_yaml.yaml
create mode 100644 tests/data/invalid_dangling.yaml
create mode 100644 tests/data/invalid_duplicate_id.yaml
create mode 100644 tests/data/invalid_empty_id.yaml
create mode 100644 tests/data/invalid_empty_nodes.yaml
create mode 100644 tests/data/invalid_no_initial.yaml
create mode 100644 tests/data/invalid_no_nodes.yaml
create mode 100644 tests/data/invalid_schema_version.yaml
create mode 100644 tests/data/invalid_task_arity.yaml
create mode 100644 tests/data/invalid_two_initial.yaml
create mode 100644 tests/data/invalid_wrong_type.yaml
create mode 100644 tests/data/minimal.yaml
create mode 100644 tests/data/two-tasks.yaml
create mode 100644 tests/data/unsupported.yaml
create mode 100644 tests/helpers.hpp
create mode 100644 tests/validate_test.cpp
create mode 100644 tests/yaml_load_test.cpp
create mode 100644 tests/yaml_roundtrip_test.cpp
diff --git a/.clangd b/.clangd.in
similarity index 89%
rename from .clangd
rename to .clangd.in
index f11186d..e675b71 100644
--- a/.clangd
+++ b/.clangd.in
@@ -5,3 +5,5 @@
# Pin clangd to the tree that has both the library and the tests.
CompileFlags:
CompilationDatabase: build
+ Add:
+ - -I@CMAKE_CURRENT_SOURCE_DIR@/include
diff --git a/.gitignore b/.gitignore
index 822c84f..59a97c3 100644
--- a/.gitignore
+++ b/.gitignore
@@ -18,3 +18,4 @@ out/
# clangd
.cache/
+.clangd
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 75a87b8..dc92fe0 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -19,6 +19,8 @@ repos:
- id: trailing-whitespace
- id: end-of-file-fixer
- id: check-yaml
+ exclude: ^tests/data/invalid_bad_yaml\.yaml$
+
- id: check-added-large-files
- id: check-merge-conflict
- id: mixed-line-ending
diff --git a/CMakeLists.txt b/CMakeLists.txt
index e4bc0bc..d5a30d2 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.20)
+cmake_minimum_required(VERSION 3.21)
project(libstgx
VERSION 0.1.0
@@ -6,21 +6,24 @@ project(libstgx
LANGUAGES CXX
)
-include(cmake/ProjectSettings.cmake)
+# Developer conveniences
+if(PROJECT_IS_TOP_LEVEL)
+ include(cmake/ProjectSettings.cmake)
+endif()
set(CMAKE_CXX_STANDARD 23)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
-option(STGX_BUILD_TESTS "Build unit tests" ON)
+option(STGX_BUILD_TESTS "Build unit tests" ${PROJECT_IS_TOP_LEVEL})
option(STGX_BUILD_EXAMPLES "Build examples" OFF)
option(STGX_ENABLE_CLANG_TIDY "Enable clang-tidy on stgx targets" OFF)
-# --- dependencies -----------------------------------------------------------
+# --- dependencies
add_subdirectory(thirdparty)
-# --- library ----------------------------------------------------------------
+# --- library
file(GLOB_RECURSE libstg_sources
CONFIGURE_DEPENDS
@@ -44,6 +47,10 @@ target_link_libraries(stgx
target_compile_features(stgx PUBLIC cxx_std_23)
target_compile_options(stgx PRIVATE -Wall -Wextra -Wpedantic)
+# Carried on the target rather than picked up from ProjectSettings.cmake, so it
+# also holds when a consumer links stgx into a shared library.
+set_target_properties(stgx PROPERTIES POSITION_INDEPENDENT_CODE ON)
+
if(STGX_ENABLE_CLANG_TIDY)
find_program(CLANG_TIDY_EXE
NAMES clang-tidy
@@ -59,14 +66,14 @@ if(STGX_ENABLE_CLANG_TIDY)
endif()
-# --- examples ---------------------------------------------------------------
+# --- examples
if(STGX_BUILD_EXAMPLES)
add_subdirectory(examples)
endif()
-# --- tests ------------------------------------------------------------------
+# --- tests
if(STGX_BUILD_TESTS)
enable_testing()
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..c065fbd
--- /dev/null
+++ b/README.md
@@ -0,0 +1,199 @@
+
+
+

+
+[](https://github.com/peplxx/libstgx/actions/workflows/ci.yml)
+
+
+
+
+
+
+**S**tate **T**ransition **G**raph e**X**tended — a C++ library for building, editing and
+validating state-transition graphs of real-time task systems.
+
+---
+
+libstgx reads and writes the YAML that
+[state-graph-visualizer](https://github.com/peplxx/state-graph-visualizer) renders, and is the
+source of truth for that format — it validates stricter than the viewer does.
+
+
+## Add to project
+
+```cmake
+include(FetchContent)
+
+FetchContent_Declare(
+ libstgx
+ GIT_REPOSITORY https://github.com/peplxx/libstgx.git
+ GIT_TAG v0.1.0
+ GIT_SHALLOW TRUE
+)
+FetchContent_MakeAvailable(libstgx)
+
+target_link_libraries(my_app PRIVATE stgx::stgx)
+```
+
+**As a subdirectory** — submodule or vendored copy:
+
+```cmake
+add_subdirectory(libstgx)
+target_link_libraries(my_app PRIVATE stgx::stgx)
+```
+
+There is no `install()` / `find_package(stgx)` yet — both routes above go through
+`add_subdirectory`.
+
+## Building the library itself
+
+```bash
+cmake -B build -S . -DCMAKE_BUILD_TYPE=Debug
+cmake --build build -j
+ctest --test-dir build --output-on-failure
+```
+
+CMake 3.21+ and a C++23 compiler (Apple Clang 17, GCC 13, Clang 17). Catch2 v3 is used for tests —
+taken from the system if present, otherwise fetched.
+
+| Option | Default | |
+|---|---|---|
+| `STGX_BUILD_TESTS` | on for a top-level build, off as a subproject | build the Catch2 test binary |
+| `STGX_BUILD_EXAMPLES` | `OFF` | build the two example programs |
+| `STGX_ENABLE_CLANG_TIDY` | `OFF` | run clang-tidy over the library sources |
+
+## Graphs and the visualizer format
+
+Everything below is the half of libstgx that faces
+[state-graph-visualizer](https://github.com/peplxx/state-graph-visualizer): a model of the picture
+— states, transitions, styling — and the YAML document the viewer reads.
+
+
+The API and the wire format
+
+
+
+### Usage
+
+```cpp
+#include
+
+#include
+
+int main() {
+ auto graph = stgx::GraphBuilder()
+ .system([](auto& s) { s.description("EDF").m(1).task(2, 5, "τ₁").task(3, 7, "τ₂"); })
+ .node("n00", [](auto& n) { n.initial().task(0, 0).task(0, 0).to("n10").to("n20"); })
+ .node("n10", [](auto& n) { n.task(2, 5, stgx::Release::Up).task(0, 0).to("n20"); })
+ .node("n20", [](auto& n) { n.task(0, 3, stgx::Release::Down).task(0, 0).loop_to("n00"); })
+ .build();
+
+ if (!graph) {
+ std::println("{}", graph.error().to_string());
+ return 1;
+ }
+ if (auto saved = stgx::save_yaml_file(*graph, "graph.yaml"); !saved) {
+ std::println("{}", saved.error().to_string());
+ return 1;
+ }
+}
+```
+> Graph is not checked until `build()`, which then reports everything that is wrong at once
+
+
+```cpp
+stgx::Diagnostics warnings;
+auto graph = stgx::load_yaml_file("graph.yaml", &warnings);
+if (!graph) return std::println("{}", graph.error().to_string()), 1;
+if (!warnings.empty()) std::println("{}", warnings.to_string()); // fields we drop when saving
+```
+> Reading one back. Warnings cannot ride along in `expected`'s success case, so loading takes an
+optional `Diagnostics*` for them
+
+## Model
+
+| Type | Holds |
+|---|---|
+| `System` | `description`, `m` (processor count), `tasks` — the `(c, d)` parameters, one per task |
+| `Node` | `id`, `initial`, `label`, `border_color`, `fill_color`, `tasks` — per-task `(c, d, release)` state |
+| `Edge` | `source`, `target`, `kind`: `Transition` (`children`) or `Release` (`loopback`) |
+
+`Graph` owns nodes and edges and keeps them indexed: `find_node`, `has_node`, `initial_node`, and
+`out_edges(id)` — which returns a `std::span` into the edge storage, no copies. Edges stay grouped
+by source, so every mutation re-groups them in O(V+E); deliberate, and fine at the sizes these
+graphs come in.
+
+
+Mutations — each one keeps the graph referentially sound
+
+`add_node`, `remove_node`, `rename_node`, `add_edge`, `remove_edge`, `set_initial`,
+`set_node_tasks`, `set_node_label`, `set_node_border_color`, `set_node_fill_color`.
+
+Removing a node takes every edge touching it with it; renaming one repoints them. A dangling edge
+cannot be produced through this API.
+
+
+
+
+Diagnostic codes — {code, severity, path, message}
+
+| Code | Meaning |
+|---|---|
+| `yaml_parse` | the bytes are not YAML, or the document is empty |
+| `wrong_type` | a value has the wrong YAML shape (mapping expected, etc.) |
+| `schema_version` | `schemaVersion` is not a version this build reads |
+| `nodes_missing` | `nodes` is absent or empty |
+| `node_id_empty` / `node_id_duplicate` | node ids must be present and unique |
+| `dangling_edge` | an edge names a node that does not exist |
+| `initial_count` | `initial` must be set on exactly one node |
+| `task_arity_mismatch` | a node has a different number of tasks than `system.tasks` |
+| `not_an_int` | `c`, `d`, `m`, `schemaVersion` must be plain integers — `2.0` and `2e1` are not |
+| `bad_release` | `release` is not `up` / `down` / `none` (or `↑` / `↓` / `1` / `-1`) |
+| `unsupported_field` | recognised but not modelled yet; dropped on save *(warning)* |
+| `unknown_field` | not part of the wire format *(warning)* |
+| `io_error` | a file could not be opened, read or written |
+
+One `load_yaml_file` on a badly broken document reports the bad integer *and* the dangling edge
+*and* the missing initial node.
+
+
+
+## Wire format
+
+```yaml
+schemaVersion: 1
+system:
+ description: EDF feasibility graph
+ m: 1
+ tasks:
+ - {c: 2, d: 5, name: τ₁}
+ - {c: 3, d: 7, name: τ₂}
+nodes:
+ - id: n00
+ initial: true
+ tasks:
+ - {c: 0, d: 0}
+ - {c: 0, d: 0}
+ children: [n10, n20]
+ - id: n10
+ tasks:
+ - {c: 2, d: 5, release: up}
+ - {c: 0, d: 0}
+ children: [n20]
+ - id: n20
+ label: "custom: label"
+ borderColor: "#C0392B"
+ fillColor: "#F9D5D3"
+ tasks:
+ - {c: 0, d: 3, release: down}
+ - {c: 0, d: 0}
+ loopback: [n00]
+```
+
+**On read** — `schemaVersion` may be omitted (assumed 1); `isInitial` is accepted as a legacy
+spelling of `initial`; `release` accepts `↑` / `1` for up and `↓` / `-1` for down; absent fields
+take their defaults.
+
+**On write** — key order is as above, and defaults are omitted: `initial: false`, empty `tasks` /
+`children` / `loopback`, `release: none`, absent `label` and colours. Colours are passed through
+verbatim, any CSS value the viewer accepts.
diff --git a/assets/libstgx-banner.png b/assets/libstgx-banner.png
new file mode 100644
index 0000000000000000000000000000000000000000..6034cd38f60a82f3b509bfa25492db6786fd9848
GIT binary patch
literal 232476
zcmcG$byQYw*EPE7n~;!}7DP%~8bOdo8UqQDl14&0q$LDNX#q)sr@ZbImyy&$Tp^E)ZNIKoI1Dit;TT1i}7+
zAXr)`O!x}tC0t?nhuKV7=Qe_Pu_H)8FoGPzmjX5r#El<8zCA<`iB||h?Udf2Ed}4e
zeWa#z3pq#s_qw?t9=>wLRpFkixv8s#gqgDi{DTPc3yNIh7rVwUs3#yMAs`?jAk59r
zFTu~x(wl$s|9FADqq()E=l}i%S_zD@@B)ti^$xDq_7*O#ruI(%``6$-lgWbnM^tXz
z)bp6$o^$u1=%Pk`hzd2jCuhb6U-AkY@qWp!A3?#%_3$P|SvE6Q1oO!)h0f5+;W!x9
zIl_6I44cg%#`5?o%ENOzy93{2RFc%L;1~V)koEUxWLk5xeeG1O$TaJ@&BjZ;IdqJpfTQm-z>)rzx@CEn?FzW
zeOxZ|f8PwY(Eo=g3@25@ZE3$p{ojwX6r#=jKmRy7f)Uo9xQ?wTn*V+u(}16x|0mw(
z7)P<;zxS0uDC)ug{JzG;o!0&!$~Uu%`mb={IDbeH@jo9Lg7jfYR{ZlkT{Qn|(O3dL
z{hwGg=9%Tez5jntq-7aQy4F%6w!W$1?wfql=Eitb;ysjf;Ic}Rns4!omj!!WYJBhC
zCX56{qfE_zaPts^kYXaFa-?!AEhW0687VFrs3#d?>EgMyZ+uzT({*fkS;oC}eZ7h`
zZ~faz5|X^vcM%pnkKR@t+*rZ&z-j{LiyJnBf+B-UOb93E{vaZ`sn8ipZiSQk7oRL5fC_^
zqF8R3o3HH7HD05NEGQ@_EiFw>POh!39ki^x$Ai;6{GY6H#zO1%Oddt)Tr~YPzt1?e
zGG)+x@SUZh;q1;#ZK-jy*WZJk{$xIC?mOE>1(_B1c#5dpcBZQv+_og>iRHq>!onKS
zm-oYmug7h!-7T5@^K+S7zc}GrWiaVg&CDjJrNFQ-JeFXc;$p761k$fNJ4Sh`l&T!M
zueR6Q1ksdvxrXgslB`p-d$AcZW;RXmCtFDRl`D{rl=
z-1D_7QeI9@BkKmkrAwD6Df6}@ATFkB>>C~CB=q&ip1y4M_?csOYFlkEH#cYT*=hqf
zn=Kc`pS#FE=TKX8yxMS3b9=^Z;*hA2Y9M!(bJ_YZ1$sQP1M
z&c3|9iG?^B#Rmrme{VU@bTO{6n|l5Fb%jMgE;e=#`(UVpmg16ev(LXU)iMo&gsu=r
zWN6gVlA3>oot-P<>*i*PjU`LxY`u$83?l<6DJcboUiqUgF8yM?A{~X$r#EljB+xbg
z`guDsRb}dGWetCxu>GHJ1~*lQx-alzEe@DXt6%;SwWdioOxJ*c6veg1bu2xeso6O@
z{fp7cPo%Gpg@yH2uV}Q)v?KHa-P6s{u9jE+4UYeb{}3uDRg@~_<>fD5zML#El62oi
zNBvNSr2E14)YfEa486E>cN8scvw}8-sHmv2u32xC+J(7?1o7vAY7?KYuLZA^#k=s<
z^*kbdRijrSo)(*WqjDb8>cdj*Z;^B)SSbD0Bpbm2ddpOj1sa!y5nTrgQB4__6;>jE+Iht>*^S
zHaK{AGKaG+ZEbBh&72A<>gwvQu2orCCes5o*>tRmFTON+x^?z`wJ9goN$fEDT7Q(pD|Xw~i{;vxpdtwtG-*qtAW6D}wU$^i*H}
zx@*Ux;?ui}EbBWvJFBaS2l#=cfm%AbiqWt_yI;ze;W%O$Cb(%uK#GqsNWN!NmKFIeoJf
z1OI^(tJl#d;Guwkz{eL1GnH1uYlCSdOgHEm869e8=4NLhoPMpPIo>!w**_$D%wmCc
zcYwe$a;ke~)3t%vY|G${>H!tIFz2Qhq$o&m`Xz=_3kxzkn59OIYffTZ38k_eFUJcA
zyvY9rGUL5l;Zc`3EEDc6PNg$thutmiYqsROKN;XM@Jc|)a)3Gb-unsIr)tNAvzJPY
z)^iQjSy@bLhY?hsb@0$FZd((5iQKjDRJYSaV55o+s*8ydEl#<7z6PL^RKf#5M;w}O
zRI^gAgp7&E8^M7{y7oZA?VDbU-|1+c8WtidW+ALkV>m(=yxZpE@nogvr9vc?{cN28
z8(Zg+lhY7{{2nAy*pX`80*&3>-GGl2Xn??x{7^PhYd2p0Qx8?~r%#_6-M^y~>bHsa
zl9mInqI6s;=o5&Xb@YP+d7_3Q2=FJDDXFMxAZbH#bcACC=M++SCS>byGS>fsP6-dn
z`UK?a)rtMRw*Qp>-kLl=JzRi&hnmCy*~uo})h-RtL@
zeE-0GbM(rP=jLeMOttM~sY#0xqbD0bf7$E1Oq9HP>CYn~&;d1GtPc-o47qoze_E=#
zt}UgVA5lbyzA81GdJFmD%@vmoN8*j;gH3*fr9>yitjV;^7WUW;vL8=Pf1wr-)I0
z?>kD0iZ}LpSgnTAm(nNS-YvabYV3Rb3+iA=`t9!8fP(*&6)*Ibc@J3TInz^52EWgy
z!+(ws;RsKplGX%JSt%rPi}q3N3<;xDoekXE+dCQJF1QE;=4V(?sAA*zC0Iy_Li@j8
z7mJ3w6<2w9>|h;h9p=2wj@I?{Z^Nq&veajIX!$!rbp#uA8f(lZg?F~6Ds3m;-T&Zo
z^paJ{PGqL#{A{LBJ2%kyJ{sj_%SF6$pD8k@uX!XJ$w;vGHhZgq=Y|h#3vA-a(Rvn~
z#OINbZ;hLeGo`(yq@`UX{;2Ny#Qd1~^ZKHkVT0=?oTUqwgaH+74l(<;E@hza@E3na
z09CeY&lC4o?Ik8HADmbFLI|mM=bPz}rsifQ*wh=o$5r+-6CXb+C9w}_Ge5()rka&a
z=iGYLXmW6RvZ%AW+qljt8&(>yLwfkN8T85eMGEjAe(RUTffOMqGB2W{c#Il;Eyu{r
z7iea&-%j=L^vsKRDDYaLo+Dm$I)B0M?@s-CCb!9l6QN-#p@*#ju%5DeDv<*JusS0b
zbQ}pcZjW7NWrbZcg2MwfK&~&d{O|&nK|;3ojmr=$$D0LNekVUajumLqg??)GK3wVu
zlR5Ze7Lfx-1-*b_1h`cjrmpU>nnQ#fMIjj18cb62Axdo90&!riz4i3;rYbDLh-mk=
zD~InC>ENU>vBJu4usl0#-pFRnz3+CZ;K^d)&|xy
zy?JFOF9&TxZaritFDq)8Bw*n+tkZgTPk@PuiN_rc4zk0r;pVd|A9Y1QuJ+oRcpn@K
zIke?yEv?z>HvtOOv%sE8Gm?`YkMW+qcf!tyXJ**Ungbm;(t7{tU>OdoZb88rbcg6D2u1Pjf(NY&5rL`WMF&SuVU;!xiDvBN&L~{cBvK5x(_@n`Yi|v
zbtzWMKQhvZJDVr-8dcP;5anBWw^;ljCeqS2uJhbqQ{!t!mwfG9Mg8{%`lxK{)Nz}{
zmceM^T6!Hne_g*^-JV|!onzi=H{PUqMx4jr{jA5WVt7Zgf3jAOE*kxihGG5|k!*eo
zl@?F%dG`+Vmc;MpMNKA->WOYtTnX%0D!f}dpDymgYt&E$3!#xAvAU_qqNl8-nwyjJ
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