<div dir="ltr">This is my new favorite "tiny but useful" C++11 trick.<div><br></div><div>-- Sean Silva</div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Mon, Mar 3, 2014 at 3:26 PM, Benjamin Kramer <span dir="ltr"><<a href="mailto:benny.kra@googlemail.com" target="_blank">benny.kra@googlemail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: d0k<br>
Date: Mon Mar  3 14:26:46 2014<br>
New Revision: 202755<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=202755&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=202755&view=rev</a><br>
Log:<br>
[C++11] Simplify compare operators with std::tie.<br>
<br>
No functionality change.<br>
<br>
Modified:<br>
    cfe/trunk/include/clang/AST/VTableBuilder.h<br>
    cfe/trunk/include/clang/Basic/VersionTuple.h<br>
    cfe/trunk/include/clang/Edit/FileOffset.h<br>
    cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/APSIntType.h<br>
    cfe/trunk/lib/AST/VTableBuilder.cpp<br>
    cfe/trunk/lib/ASTMatchers/ASTMatchFinder.cpp<br>
    cfe/trunk/lib/CodeGen/CodeGenModule.h<br>
    cfe/trunk/lib/StaticAnalyzer/Core/BlockCounter.cpp<br>
<br>
Modified: cfe/trunk/include/clang/AST/VTableBuilder.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/VTableBuilder.h?rev=202755&r1=202754&r2=202755&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/VTableBuilder.h?rev=202755&r1=202754&r2=202755&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/include/clang/AST/VTableBuilder.h (original)<br>
+++ cfe/trunk/include/clang/AST/VTableBuilder.h Mon Mar  3 14:26:46 2014<br>
@@ -471,11 +471,8 @@ public:<br>
         assert(VBase != other.VBase);<br>
         return VBTableIndex < other.VBTableIndex;<br>
       }<br>
-      if (VFPtrOffset != other.VFPtrOffset)<br>
-        return VFPtrOffset < other.VFPtrOffset;<br>
-      if (Index != other.Index)<br>
-        return Index < other.Index;<br>
-      return false;<br>
+      return std::tie(VFPtrOffset, Index) <<br>
+             std::tie(other.VFPtrOffset, other.Index);<br>
     }<br>
   };<br>
<br>
<br>
Modified: cfe/trunk/include/clang/Basic/VersionTuple.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/VersionTuple.h?rev=202755&r1=202754&r2=202755&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/VersionTuple.h?rev=202755&r1=202754&r2=202755&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/include/clang/Basic/VersionTuple.h (original)<br>
+++ cfe/trunk/include/clang/Basic/VersionTuple.h Mon Mar  3 14:26:46 2014<br>
@@ -87,13 +87,8 @@ public:<br>
   /// If not provided, minor and subminor version numbers are considered to be<br>
   /// zero.<br>
   friend bool operator<(const VersionTuple &X, const VersionTuple &Y) {<br>
-    if (X.Major != Y.Major)<br>
-      return X.Major < Y.Major;<br>
-<br>
-    if (X.Minor != Y.Minor)<br>
-      return X.Minor < Y.Minor;<br>
-<br>
-    return X.Subminor < Y.Subminor;<br>
+    return std::tie(X.Major, X.Minor, X.Subminor) <<br>
+           std::tie(Y.Major, Y.Minor, Y.Subminor);<br>
   }<br>
<br>
   /// \brief Determine whether one version number follows another.<br>
<br>
Modified: cfe/trunk/include/clang/Edit/FileOffset.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Edit/FileOffset.h?rev=202755&r1=202754&r2=202755&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Edit/FileOffset.h?rev=202755&r1=202754&r2=202755&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/include/clang/Edit/FileOffset.h (original)<br>
+++ cfe/trunk/include/clang/Edit/FileOffset.h Mon Mar  3 14:26:46 2014<br>
@@ -41,20 +41,16 @@ public:<br>
     return !(LHS == RHS);<br>
   }<br>
   friend bool operator<(FileOffset LHS, FileOffset RHS) {<br>
-    if (LHS.FID != RHS.FID)<br>
-      return LHS.FID < RHS.FID;<br>
-    return LHS.Offs < RHS.Offs;<br>
+    return std::tie(LHS.FID, LHS.Offs) < std::tie(RHS.FID, RHS.Offs);<br>
   }<br>
   friend bool operator>(FileOffset LHS, FileOffset RHS) {<br>
-    if (LHS.FID != RHS.FID)<br>
-      return LHS.FID > RHS.FID;<br>
-    return LHS.Offs > RHS.Offs;<br>
+    return RHS < LHS;<br>
   }<br>
   friend bool operator>=(FileOffset LHS, FileOffset RHS) {<br>
-    return LHS > RHS || LHS == RHS;<br>
+    return !(LHS < RHS);<br>
   }<br>
   friend bool operator<=(FileOffset LHS, FileOffset RHS) {<br>
-    return LHS < RHS || LHS == RHS;<br>
+    return !(RHS < LHS);<br>
   }<br>
 };<br>
<br>
<br>
Modified: cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/APSIntType.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/APSIntType.h?rev=202755&r1=202754&r2=202755&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/APSIntType.h?rev=202755&r1=202754&r2=202755&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/APSIntType.h (original)<br>
+++ cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/APSIntType.h Mon Mar  3 14:26:46 2014<br>
@@ -97,13 +97,8 @@ public:<br>
   /// Unsigned integers are considered to be better conversion types than<br>
   /// signed integers of the same width.<br>
   bool operator<(const APSIntType &Other) const {<br>
-    if (BitWidth < Other.BitWidth)<br>
-      return true;<br>
-    if (BitWidth > Other.BitWidth)<br>
-      return false;<br>
-    if (!IsUnsigned && Other.IsUnsigned)<br>
-      return true;<br>
-    return false;<br>
+    return std::tie(BitWidth, IsUnsigned) <<br>
+           std::tie(Other.BitWidth, Other.IsUnsigned);<br>
   }<br>
 };<br>
<br>
<br>
Modified: cfe/trunk/lib/AST/VTableBuilder.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/VTableBuilder.cpp?rev=202755&r1=202754&r2=202755&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/VTableBuilder.cpp?rev=202755&r1=202754&r2=202755&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/lib/AST/VTableBuilder.cpp (original)<br>
+++ cfe/trunk/lib/AST/VTableBuilder.cpp Mon Mar  3 14:26:46 2014<br>
@@ -2156,10 +2156,7 @@ void ItaniumVTableBuilder::dumpLayout(ra<br>
       std::sort(ThunksVector.begin(), ThunksVector.end(),<br>
                 [](const ThunkInfo &LHS, const ThunkInfo &RHS) {<br>
         assert(LHS.Method == 0 && RHS.Method == 0);<br>
-<br>
-        if (LHS.This != RHS.This)<br>
-          return LHS.This < RHS.This;<br>
-        return LHS.Return < RHS.Return;<br>
+        return std::tie(LHS.This, LHS.Return) < std::tie(RHS.This, RHS.Return);<br>
       });<br>
<br>
       Out << "Thunks for '" << MethodName << "' (" << ThunksVector.size();<br>
@@ -3169,9 +3166,7 @@ void VFTableBuilder::dumpLayout(raw_ostr<br>
                        [](const ThunkInfo &LHS, const ThunkInfo &RHS) {<br>
         // Keep different thunks with the same adjustments in the order they<br>
         // were put into the vector.<br>
-        if (LHS.This != RHS.This)<br>
-          return LHS.This < RHS.This;<br>
-        return LHS.Return < RHS.Return;<br>
+        return std::tie(LHS.This, LHS.Return) < std::tie(RHS.This, RHS.Return);<br>
       });<br>
<br>
       Out << "Thunks for '" << MethodName << "' (" << ThunksVector.size();<br>
<br>
Modified: cfe/trunk/lib/ASTMatchers/ASTMatchFinder.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/ASTMatchers/ASTMatchFinder.cpp?rev=202755&r1=202754&r2=202755&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/ASTMatchers/ASTMatchFinder.cpp?rev=202755&r1=202754&r2=202755&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/lib/ASTMatchers/ASTMatchFinder.cpp (original)<br>
+++ cfe/trunk/lib/ASTMatchers/ASTMatchFinder.cpp Mon Mar  3 14:26:46 2014<br>
@@ -58,11 +58,8 @@ struct MatchKey {<br>
   BoundNodesTreeBuilder BoundNodes;<br>
<br>
   bool operator<(const MatchKey &Other) const {<br>
-    if (MatcherID != Other.MatcherID)<br>
-      return MatcherID < Other.MatcherID;<br>
-    if (Node != Other.Node)<br>
-      return Node < Other.Node;<br>
-    return BoundNodes < Other.BoundNodes;<br>
+    return std::tie(MatcherID, Node, BoundNodes) <<br>
+           std::tie(Other.MatcherID, Other.Node, Other.BoundNodes);<br>
   }<br>
 };<br>
<br>
<br>
Modified: cfe/trunk/lib/CodeGen/CodeGenModule.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenModule.h?rev=202755&r1=202754&r2=202755&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenModule.h?rev=202755&r1=202754&r2=202755&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/lib/CodeGen/CodeGenModule.h (original)<br>
+++ cfe/trunk/lib/CodeGen/CodeGenModule.h Mon Mar  3 14:26:46 2014<br>
@@ -99,10 +99,8 @@ namespace CodeGen {<br>
     }<br>
<br>
     bool operator<(const OrderGlobalInits &RHS) const {<br>
-      if (priority < RHS.priority)<br>
-        return true;<br>
-<br>
-      return priority == RHS.priority && lex_order < RHS.lex_order;<br>
+      return std::tie(priority, lex_order) <<br>
+             std::tie(RHS.priority, RHS.lex_order);<br>
     }<br>
   };<br>
<br>
<br>
Modified: cfe/trunk/lib/StaticAnalyzer/Core/BlockCounter.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/BlockCounter.cpp?rev=202755&r1=202754&r2=202755&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/BlockCounter.cpp?rev=202755&r1=202754&r2=202755&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/lib/StaticAnalyzer/Core/BlockCounter.cpp (original)<br>
+++ cfe/trunk/lib/StaticAnalyzer/Core/BlockCounter.cpp Mon Mar  3 14:26:46 2014<br>
@@ -34,8 +34,7 @@ public:<br>
   }<br>
<br>
   bool operator<(const CountKey &RHS) const {<br>
-    return (CallSite == RHS.CallSite) ? (BlockID < RHS.BlockID)<br>
-                                      : (CallSite < RHS.CallSite);<br>
+    return std::tie(CallSite, BlockID) < std::tie(RHS.CallSite, RHS.BlockID);<br>
   }<br>
<br>
   void Profile(llvm::FoldingSetNodeID &ID) const {<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br></div>