Extension: Variable Pointers #191
Draft
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
The current
GetValuePtrroutine is modestly under-specified with regards to the validity of the returned pointer, and what it means if a model does or doesn't return a pointer for a given variable.I propose making the semantics more explicit through the use of variable sets. Specifically, variables in a set
bmi:stable_pointerscan be expected to yield pointers that are valid for the lifetime of the model, and variables in a setbmi:transient_pointerscan be expected to yield pointers that are valid for immediate use, but may be invalidated by calls to any other BMI routine on that model.The example I have in mind for transient pointers are variables backed by a dynamically resizable array or vector, which exist in at least a few models I'm aware of.
Transient pointers would still be useful in model coupling, calling
auto ptr = modelA->GetValuePtr("foo"); modelB->SetValue("foo", ptr);and avoiding an intermediate buffer and copy in the driver.