r201246 - Attributes: Emit enumerators in td file declaration order
Reid Kleckner
rnk at google.com
Wed Feb 12 11:16:41 PST 2014
On Wed, Feb 12, 2014 at 10:40 AM, Aaron Ballman <aaron at aaronballman.com>wrote:
> Thanks for taking care of this! A suggestion below.
>
> On Wed, Feb 12, 2014 at 1:22 PM, Reid Kleckner <reid at kleckner.net> wrote:
> > Author: rnk
> > Date: Wed Feb 12 12:22:18 2014
> > New Revision: 201246
> >
> > URL: http://llvm.org/viewvc/llvm-project?rev=201246&view=rev
> > Log:
> > Attributes: Emit enumerators in td file declaration order
> >
> > Modified:
> > cfe/trunk/utils/TableGen/ClangAttrEmitter.cpp
> >
> > Modified: cfe/trunk/utils/TableGen/ClangAttrEmitter.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/utils/TableGen/ClangAttrEmitter.cpp?rev=201246&r1=201245&r2=201246&view=diff
> >
> ==============================================================================
> > --- cfe/trunk/utils/TableGen/ClangAttrEmitter.cpp (original)
> > +++ cfe/trunk/utils/TableGen/ClangAttrEmitter.cpp Wed Feb 12 12:22:18
> 2014
> > @@ -606,6 +606,22 @@ namespace {
> > }
> > };
> >
> > + // Unique the enums, but maintain the original declaration ordering.
> > + std::vector<std::string> uniqueEnumsInOrder(std::vector<std::string>
> enums) {
>
> Can this take a const & instead of a value?
Ah, yeah, oversight.
> > + std::vector<std::string> uniques;
> > + std::set<std::string> unique_set(enums.begin(), enums.end());
> > + for (std::vector<std::string>::const_iterator i = enums.begin(),
> > + e = enums.end();
> > + i != e; ++i) {
> > + std::set<std::string>::iterator set_i = unique_set.find(*i);
> > + if (set_i != unique_set.end()) {
> > + uniques.push_back(*i);
> > + unique_set.erase(set_i);
> > + }
> > + }
> > + return uniques;
> > + }
> > +
>
> This is doing more work than it needs to -- the std::set already
> uniques items in its constructor. So this could be written as:
>
> static std::vector<std::string> uniqueEnumsInOrder(const
> std::vector<std::string> &Enums) {
> std::set<std::string> Uniques(Enums.begin(), Enums.end());
> return std::vector<std::string>(Uniques.begin(), Uniques.end());
> }
>
std::set is an rbtree that will implicitly sort the strings, so I don't
think that will work.
The most declarative way I could think to write this was something like:
// decorate strings with an index
vector<pair<string, int>>> decorated(...);
// sort unique in the usual way with a custom comparator
std::sort(decorated, dotFirst);
std::unique(..., dotFirst);
// resort with dotSecond
std::sort(decorated, dotSecond);
// apply dotFirst to extract the strings
... but it didn't seem worth it.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20140212/638d43e2/attachment.html>
More information about the cfe-commits
mailing list