[PATCH][ADT] Add move-construction and move-assignment from SmallVectorImpl<T> to SmallVector<T,N>.

Duncan P. N. Exon Smith dexonsmith at apple.com
Thu Jan 22 16:17:43 PST 2015


> On 2015-Jan-22, at 16:04, David Blaikie <dblaikie at gmail.com> wrote:
> 
> This looks like it's only adding copy, not move - did I miss something?
> 
> On Thu, Jan 22, 2015 at 3:54 PM, Lang Hames <lhames at gmail.com> wrote:
> Hi All,
> 
> The attached patch adds move-construction and move-assignment from SmallVectorImpl<T> to SmallVector<T, N>. It enables us to move between SmallVectors of different types, which will allow me to fix one of the most commented-upon warts from the new JIT APIs.
> 
> Unit-test included.
> 
> Cheers,
> Lang.
>  

Yeah, the tests don't actually confirm that the thing was moved.  In
particular, you want to check that whenever the source is in big-mode,
the destination points at the same memory that the source used to (well,
assuming that's the behaviour you want, which the naive implementation
will give you IIUC).

There's also a "big mode -> small mode" funny state thing that'll happen
with the naive implementation.  I'm not sure it's *wrong*, but...

Given:

    SmallVector<int, 1> InBigMode(2);
    SmallVector<int, 2> InBigModeToo = std::move(InBigMode);

I think this will pass:

    assert(!InBigModeToo.isSmall());

This a new state -- a SmallVector can be in "big" mode with a heap
allocation, even though its capacity would fit in its "small" mode
stack allocation.

While weird, I don't really have a problem with it (but maybe others
do?).  Might be worth testing a few operations in this untested state
though.



More information about the llvm-commits mailing list