From 1b6955a72309441ba2eec24082030bdbc70d5d25 Mon Sep 17 00:00:00 2001 From: Benjamin Kramer Date: Sun, 15 Feb 2015 21:11:25 +0000 Subject: [PATCH] CommandLine: Use variadic templates to simplify opt constructors. llvm-svn: 229332 --- llvm/include/llvm/Support/CommandLine.h | 315 ++------------------------------ 1 file changed, 20 insertions(+), 295 deletions(-) diff --git a/llvm/include/llvm/Support/CommandLine.h b/llvm/include/llvm/Support/CommandLine.h index 9910e7d..6f4cd9a 100644 --- a/llvm/include/llvm/Support/CommandLine.h +++ b/llvm/include/llvm/Support/CommandLine.h @@ -1040,8 +1040,14 @@ template <> struct applicator { static void opt(MiscFlags MF, Option &O) { O.setMiscFlag(MF); } }; -// apply method - Apply a modifier to an option in a type safe way. -template void apply(const Mod &M, Opt *O) { +// apply method - Apply modifiers to an option in a type safe way. +template +void apply(Opt *O, const Mod &M, const Mods &... Ms) { + applicator::opt(M, *O); + apply(O, Ms...); +} + +template void apply(Opt *O, const Mod &M) { applicator::opt(M, *O); } @@ -1209,95 +1215,10 @@ public: return this->getValue(); } - // One option... - template - explicit opt(const M0t &M0) - : Option(Optional, NotHidden), Parser(*this) { - apply(M0, this); - done(); - } - - // Two options... - template - opt(const M0t &M0, const M1t &M1) - : Option(Optional, NotHidden), Parser(*this) { - apply(M0, this); - apply(M1, this); - done(); - } - - // Three options... - template - opt(const M0t &M0, const M1t &M1, const M2t &M2) - : Option(Optional, NotHidden), Parser(*this) { - apply(M0, this); - apply(M1, this); - apply(M2, this); - done(); - } - // Four options... - template - opt(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3) - : Option(Optional, NotHidden), Parser(*this) { - apply(M0, this); - apply(M1, this); - apply(M2, this); - apply(M3, this); - done(); - } - // Five options... - template - opt(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3, const M4t &M4) - : Option(Optional, NotHidden), Parser(*this) { - apply(M0, this); - apply(M1, this); - apply(M2, this); - apply(M3, this); - apply(M4, this); - done(); - } - // Six options... - template - opt(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3, const M4t &M4, - const M5t &M5) + template + explicit opt(const Mods &... Ms) : Option(Optional, NotHidden), Parser(*this) { - apply(M0, this); - apply(M1, this); - apply(M2, this); - apply(M3, this); - apply(M4, this); - apply(M5, this); - done(); - } - // Seven options... - template - opt(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3, const M4t &M4, - const M5t &M5, const M6t &M6) - : Option(Optional, NotHidden), Parser(*this) { - apply(M0, this); - apply(M1, this); - apply(M2, this); - apply(M3, this); - apply(M4, this); - apply(M5, this); - apply(M6, this); - done(); - } - // Eight options... - template - opt(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3, const M4t &M4, - const M5t &M5, const M6t &M6, const M7t &M7) - : Option(Optional, NotHidden), Parser(*this) { - apply(M0, this); - apply(M1, this); - apply(M2, this); - apply(M3, this); - apply(M4, this); - apply(M5, this); - apply(M6, this); - apply(M7, this); + apply(this, Ms...); done(); } }; @@ -1407,94 +1328,10 @@ public: void setNumAdditionalVals(unsigned n) { Option::setNumAdditionalVals(n); } - // One option... - template - explicit list(const M0t &M0) + template + explicit list(const Mods &... Ms) : Option(ZeroOrMore, NotHidden), Parser(*this) { - apply(M0, this); - done(); - } - // Two options... - template - list(const M0t &M0, const M1t &M1) - : Option(ZeroOrMore, NotHidden), Parser(*this) { - apply(M0, this); - apply(M1, this); - done(); - } - // Three options... - template - list(const M0t &M0, const M1t &M1, const M2t &M2) - : Option(ZeroOrMore, NotHidden), Parser(*this) { - apply(M0, this); - apply(M1, this); - apply(M2, this); - done(); - } - // Four options... - template - list(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3) - : Option(ZeroOrMore, NotHidden), Parser(*this) { - apply(M0, this); - apply(M1, this); - apply(M2, this); - apply(M3, this); - done(); - } - // Five options... - template - list(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3, - const M4t &M4) - : Option(ZeroOrMore, NotHidden), Parser(*this) { - apply(M0, this); - apply(M1, this); - apply(M2, this); - apply(M3, this); - apply(M4, this); - done(); - } - // Six options... - template - list(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3, - const M4t &M4, const M5t &M5) - : Option(ZeroOrMore, NotHidden), Parser(*this) { - apply(M0, this); - apply(M1, this); - apply(M2, this); - apply(M3, this); - apply(M4, this); - apply(M5, this); - done(); - } - // Seven options... - template - list(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3, - const M4t &M4, const M5t &M5, const M6t &M6) - : Option(ZeroOrMore, NotHidden), Parser(*this) { - apply(M0, this); - apply(M1, this); - apply(M2, this); - apply(M3, this); - apply(M4, this); - apply(M5, this); - apply(M6, this); - done(); - } - // Eight options... - template - list(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3, - const M4t &M4, const M5t &M5, const M6t &M6, const M7t &M7) - : Option(ZeroOrMore, NotHidden), Parser(*this) { - apply(M0, this); - apply(M1, this); - apply(M2, this); - apply(M3, this); - apply(M4, this); - apply(M5, this); - apply(M6, this); - apply(M7, this); + apply(this, Ms...); done(); } }; @@ -1629,94 +1466,10 @@ public: return Positions[optnum]; } - // One option... - template - explicit bits(const M0t &M0) - : Option(ZeroOrMore, NotHidden), Parser(*this) { - apply(M0, this); - done(); - } - // Two options... - template - bits(const M0t &M0, const M1t &M1) - : Option(ZeroOrMore, NotHidden), Parser(*this) { - apply(M0, this); - apply(M1, this); - done(); - } - // Three options... - template - bits(const M0t &M0, const M1t &M1, const M2t &M2) - : Option(ZeroOrMore, NotHidden), Parser(*this) { - apply(M0, this); - apply(M1, this); - apply(M2, this); - done(); - } - // Four options... - template - bits(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3) - : Option(ZeroOrMore, NotHidden), Parser(*this) { - apply(M0, this); - apply(M1, this); - apply(M2, this); - apply(M3, this); - done(); - } - // Five options... - template - bits(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3, - const M4t &M4) - : Option(ZeroOrMore, NotHidden), Parser(*this) { - apply(M0, this); - apply(M1, this); - apply(M2, this); - apply(M3, this); - apply(M4, this); - done(); - } - // Six options... - template - bits(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3, - const M4t &M4, const M5t &M5) - : Option(ZeroOrMore, NotHidden), Parser(*this) { - apply(M0, this); - apply(M1, this); - apply(M2, this); - apply(M3, this); - apply(M4, this); - apply(M5, this); - done(); - } - // Seven options... - template - bits(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3, - const M4t &M4, const M5t &M5, const M6t &M6) - : Option(ZeroOrMore, NotHidden), Parser(*this) { - apply(M0, this); - apply(M1, this); - apply(M2, this); - apply(M3, this); - apply(M4, this); - apply(M5, this); - apply(M6, this); - done(); - } - // Eight options... - template - bits(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3, - const M4t &M4, const M5t &M5, const M6t &M6, const M7t &M7) + template + explicit bits(const Mods &... Ms) : Option(ZeroOrMore, NotHidden), Parser(*this) { - apply(M0, this); - apply(M1, this); - apply(M2, this); - apply(M3, this); - apply(M4, this); - apply(M5, this); - apply(M6, this); - apply(M7, this); + apply(this, Ms...); done(); } }; @@ -1766,38 +1519,10 @@ public: AliasFor = &O; } - // One option... - template - explicit alias(const M0t &M0) - : Option(Optional, Hidden), AliasFor(nullptr) { - apply(M0, this); - done(); - } - // Two options... - template - alias(const M0t &M0, const M1t &M1) - : Option(Optional, Hidden), AliasFor(nullptr) { - apply(M0, this); - apply(M1, this); - done(); - } - // Three options... - template - alias(const M0t &M0, const M1t &M1, const M2t &M2) - : Option(Optional, Hidden), AliasFor(nullptr) { - apply(M0, this); - apply(M1, this); - apply(M2, this); - done(); - } - // Four options... - template - alias(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3) + template + explicit alias(const Mods &... Ms) : Option(Optional, Hidden), AliasFor(nullptr) { - apply(M0, this); - apply(M1, this); - apply(M2, this); - apply(M3, this); + apply(this, Ms...); done(); } }; -- 2.7.4