Skip to content
  • Chandler Carruth's avatar
    [C++11] Add range based accessors for the Use-Def chain of a Value. · cdf47884
    Chandler Carruth authored
    This requires a number of steps.
    1) Move value_use_iterator into the Value class as an implementation
       detail
    2) Change it to actually be a *Use* iterator rather than a *User*
       iterator.
    3) Add an adaptor which is a User iterator that always looks through the
       Use to the User.
    4) Wrap these in Value::use_iterator and Value::user_iterator typedefs.
    5) Add the range adaptors as Value::uses() and Value::users().
    6) Update *all* of the callers to correctly distinguish between whether
       they wanted a use_iterator (and to explicitly dig out the User when
       needed), or a user_iterator which makes the Use itself totally
       opaque.
    
    Because #6 requires churning essentially everything that walked the
    Use-Def chains, I went ahead and added all of the range adaptors and
    switched them to range-based loops where appropriate. Also because the
    renaming requires at least churning every line of code, it didn't make
    any sense to split these up into multiple commits -- all of which would
    touch all of the same lies of code.
    
    The result is still not quite optimal. The Value::use_iterator is a nice
    regular iterator, but Value::user_iterator is an iterator over User*s
    rather than over the User objects themselves. As a consequence, it fits
    a bit awkwardly into the range-based world and it has the weird
    extra-dereferencing 'operator->' that so many of our iterators have.
    I think this could be fixed by providing something which transforms
    a range of T&s into a range of T*s, but that *can* be separated into
    another patch, and it isn't yet 100% clear whether this is the right
    move.
    
    However, this change gets us most of the benefit and cleans up
    a substantial amount of code around Use and User. =]
    
    llvm-svn: 203364
    cdf47884
Loading