`Named<X>` in parameter position declares where a placeholder's name is
wired, and the macro gives that input constant text; `Attr<Named<X, V>>`
in the return writes under it. The kernel is handed the bare placeholder,
since the name is spent resolving the layout and a folded offset is all
the write needs, so the hot path matches a marker node's exactly.
A name-generic write names its value type through the wired generic,
which only an implementations row resolves, so those nodes emit their
layout meta per row rather than sharing one across rows.
`write_attribute` is the catalog's set half, restoring the identifier
master's documents carry with its input positions. Its name input is a
constant, so those documents resolve without migration, and the reset
marker that stood in for the missing node retires with it.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* Revamp the syntax to #[hard(a..b)] and #[soft(a..b)] bounds on node definitions
* Address review feedback: error on empty bounds ranges and remove redundant count clamps
* Fix NaN transform from Repeat Array with a count of 1
* Remove redundant manual clamps already enforced by #[hard(...)] bounds
* Macro support
* Preprocessor support
* Allow Cow str as scope name
* Use Passthrough node to work around compiler auto wrapping the producer node and invalidating the node id
* Stable NodeIds
* Less hacky but with bad performace
* Remove Cow from RegistryValueSource::Scope
* Connect scope injections to the inner network export
---------
Co-authored-by: Dennis Kobert <dennis@kobert.dev>
* Add #[data] and #[serialize] attributes to node macro
- Add #[data] attribute for struct fields that aren't node parameters
- Data fields are initialized with Default::default()
- Passed as references to the underlying function
- Excluded from registry metadata (internal state)
- Generic types in data fields allowed without #[implementations]
- Add #[serialize] attribute for custom Node::serialize() implementation
- Receives references to all data fields
- Generates serialize() method in Node trait impl
- Conditional derives based on data field presence
- With data fields: Debug, Clone only
- Without data fields: Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash
* Refactor Memo and Monitor Node to use node macro
* Move Complex type into type alias
* Fix format
* Update node-graph/nodes/gcore/src/memo.rs
Co-authored-by: Keavon Chambers <keavon@keavon.com>
* Update node-graph/nodes/gcore/src/memo.rs
Co-authored-by: Keavon Chambers <keavon@keavon.com>
---------
Co-authored-by: Keavon Chambers <keavon@keavon.com>