In regards to the growth scheme, multiplying by 2 everytime seems a bit eager, no? For what it's worth, @schveiguy wrote this scheme for `Appender`: https://github.com/D-Programming-Language/phobos/blob/8f71c4e59ac8878b458f756ed193a1845352b03c/std/array.d#L2573 . It's an amortized growth scheme, which seems to work well enough.

Also, your code is currently asserting that the "suggested" growth does not overflow `uint.max`. How about instead "clamping" the growth to `uint.max`? Then, you only assert when the "needed" capacity overflows `uint`?

In regards to the "added complexity", it should be acceptable compared to the cost of the allocation anyways?

Well, I just wanted to make the comment. I don't think there is anything wrong in the current code, or that would get in the way of being merged in.