[PATCH] Refactor MacroInfo for easier access in for-loops

Justin Bogner mail at justinbogner.com
Tue May 26 20:53:31 PDT 2015


Alexander Kornienko <alexfh at google.com> writes:
> On Fri, May 22, 2015 at 10:23 PM, Justin Bogner <mail at justinbogner.com> wrote:
>> Sebastian Edman <sebastian.edman at evidente.se> writes:
>>> Hi alexfh, danielmarjamaki,
>>>
>>> Added possibilty to extract the arguments in a MacroInfo as a
>>> container in order to use C++11 style for loops.
>>>
>>> http://reviews.llvm.org/D9934
>>>
>>> Files:
>>>   include/clang/Lex/MacroInfo.h
>>>   lib/Lex/PPMacroExpansion.cpp
>>>   lib/Serialization/ASTWriter.cpp
>>>
>>> Index: include/clang/Lex/MacroInfo.h
>>> ===================================================================
>>> --- include/clang/Lex/MacroInfo.h
>>> +++ include/clang/Lex/MacroInfo.h
>>> @@ -182,6 +182,9 @@
>>>    bool arg_empty() const { return NumArguments == 0; }
>>>    arg_iterator arg_begin() const { return ArgumentList; }
>>>    arg_iterator arg_end() const { return ArgumentList+NumArguments; }
>>> +  ArrayRef<IdentifierInfo*> args() const {
>>> +       return ArrayRef<IdentifierInfo*>(ArgumentList, NumArguments);
>>> +  }
>>
>> It's probably better to use iterator_range from llvm/ADT/iterator_range.h.
>
> Can you explain why you think it's better than ArrayRef here?

Primarily consistency, familiarity, and information hiding.

- As long as this is only used for range-for, it'll likely be identical
  code generated and whoever's using this shouldn't know the difference.

- Using iterator_range prevents uses such as random access, which limit
  how the API can change without needing to change clients.

- If we do want random access, llvm and clang would generally spell it
  getArg(i) rather than args()[i], based on existing code.



More information about the cfe-commits mailing list