Debug help - Programming in D - extending tail slice terminates sharing unexpectedly. Page 69, 70
Brother Bill
brotherbill at mail.com
Tue Oct 21 02:08:41 UTC 2025
On Monday, 20 October 2025 at 10:38:23 UTC, Serg Gini wrote:
> But I'm not sure about slice capacity. it doesn't make any
> sense for me when it is non-zero
> https://dlang.org/spec/arrays.html#capacity-reserve
Here is a radical proposal.
If the base dynamic array has an initial size and neither it, nor
dependent slices can be increased in length, this is a great
simplification, and will maintain sharing.
Dependent slices can be changed again and again, and it all works.
It is when allowing appending elements or increasing length of
any slice, that things get squirrelly. Extending a non-tail
slice forces it to break sharing. Extending a tail slice beyond
(capacity - length) breaks sharing.
Once sharing is broken/terminated, the semantics of assignment
change.
I would imagine that there are few algorithms that handle this
neat and clean.
Consider a class NonBreakingSlices that has this general behavior:
1. Constructor has initial length or initial elements.
For simplification, we have slices of int only. Easy to
extend with Templates.
This creates a dynamic array to be shared by dependent slices.
This foundation dynamic array is the only one allowed to grow.
2. void addSlice(string name, size_t start, size_t after, string
basedOn)
This would establish name as the slice name, based on a parent
slice or base dynamic array.
3. void removeSlice(string name)
Valid only if has no dependencies.
4. int item(string name, size_t index);
Getter
5. void setItem(string name, size_t index, int newValue);
Setter
6. void extend(string name, size_t countItems);
Valid only if name is a tail slice at this point.
Would extend foundation dynamic array by countItems.
Would extend slice "name" by countItems by adjusting internal
length.
The benefit is that this class could enforce non breaking slices
that can increase in length.
IMHO, breaking sharing should result in an exception, instead of
copying the expanding slice to another memory location.
If there are valid cases where breaking sharing is intentional
and useful, kindly share some of those scenarios.
More information about the Digitalmars-d-learn
mailing list