As Doug pointed out (and I really should know), it is perfectly easy to

make VariadicFunction actually be trivial. Do so, and also make it look
more like your standard trivial functor by making it a struct with no
access specifiers. The unit test is updated to initialize its functors
properly.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@146827 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chandler Carruth 2011-12-17 10:20:15 +00:00
parent 93ca12299f
commit 1243cdda63
2 changed files with 8 additions and 20 deletions

View File

@ -103,10 +103,7 @@ namespace llvm {
/// fixed leading arguments and up-to 32 optional arguments. /// fixed leading arguments and up-to 32 optional arguments.
template <typename ResultT, typename ArgT, template <typename ResultT, typename ArgT,
ResultT (*Func)(ArrayRef<const ArgT *>)> ResultT (*Func)(ArrayRef<const ArgT *>)>
class VariadicFunction { struct VariadicFunction {
public:
VariadicFunction() {}
ResultT operator()() const { ResultT operator()() const {
return Func(ArrayRef<const ArgT *>()); return Func(ArrayRef<const ArgT *>());
} }
@ -153,10 +150,7 @@ class VariadicFunction {
template <typename ResultT, typename Param0T, typename ArgT, template <typename ResultT, typename Param0T, typename ArgT,
ResultT (*Func)(Param0T, ArrayRef<const ArgT *>)> ResultT (*Func)(Param0T, ArrayRef<const ArgT *>)>
class VariadicFunction1 { struct VariadicFunction1 {
public:
VariadicFunction1() {}
ResultT operator()(Param0T P0) const { ResultT operator()(Param0T P0) const {
return Func(P0, ArrayRef<const ArgT *>()); return Func(P0, ArrayRef<const ArgT *>());
} }
@ -203,10 +197,7 @@ class VariadicFunction1 {
template <typename ResultT, typename Param0T, typename Param1T, typename ArgT, template <typename ResultT, typename Param0T, typename Param1T, typename ArgT,
ResultT (*Func)(Param0T, Param1T, ArrayRef<const ArgT *>)> ResultT (*Func)(Param0T, Param1T, ArrayRef<const ArgT *>)>
class VariadicFunction2 { struct VariadicFunction2 {
public:
VariadicFunction2() {}
ResultT operator()(Param0T P0, Param1T P1) const { ResultT operator()(Param0T P0, Param1T P1) const {
return Func(P0, P1, ArrayRef<const ArgT *>()); return Func(P0, P1, ArrayRef<const ArgT *>());
} }
@ -255,10 +246,7 @@ class VariadicFunction2 {
template <typename ResultT, typename Param0T, typename Param1T, template <typename ResultT, typename Param0T, typename Param1T,
typename Param2T, typename ArgT, typename Param2T, typename ArgT,
ResultT (*Func)(Param0T, Param1T, Param2T, ArrayRef<const ArgT *>)> ResultT (*Func)(Param0T, Param1T, Param2T, ArrayRef<const ArgT *>)>
class VariadicFunction3 { struct VariadicFunction3 {
public:
VariadicFunction3() {}
ResultT operator()(Param0T P0, Param1T P1, Param2T P2) const { ResultT operator()(Param0T P0, Param1T P1, Param2T P2) const {
return Func(P0, P1, P2, ArrayRef<const ArgT *>()); return Func(P0, P1, P2, ArrayRef<const ArgT *>());
} }

View File

@ -22,7 +22,7 @@ std::string StringCatImpl(ArrayRef<const std::string *> Args) {
S += *Args[i]; S += *Args[i];
return S; return S;
} }
const VariadicFunction<std::string, std::string, StringCatImpl> StringCat; const VariadicFunction<std::string, std::string, StringCatImpl> StringCat = {};
TEST(VariadicFunctionTest, WorksForClassTypes) { TEST(VariadicFunctionTest, WorksForClassTypes) {
EXPECT_EQ("", StringCat()); EXPECT_EQ("", StringCat());
@ -45,7 +45,7 @@ long SumImpl(ArrayRef<const int *> Args) {
Result += *Args[i]; Result += *Args[i];
return Result; return Result;
} }
const VariadicFunction<long, int, SumImpl> Sum; const VariadicFunction<long, int, SumImpl> Sum = {};
TEST(VariadicFunctionTest, WorksForPrimitiveTypes) { TEST(VariadicFunctionTest, WorksForPrimitiveTypes) {
EXPECT_EQ(0, Sum()); EXPECT_EQ(0, Sum());
@ -65,7 +65,7 @@ int StringAppendImpl(std::string *Dest, ArrayRef<const std::string *> Args) {
return Chars; return Chars;
} }
const VariadicFunction1<int, std::string *, std::string, const VariadicFunction1<int, std::string *, std::string,
StringAppendImpl> StringAppend; StringAppendImpl> StringAppend = {};
TEST(VariadicFunction1Test, Works) { TEST(VariadicFunction1Test, Works) {
std::string S0("hi"); std::string S0("hi");
@ -93,7 +93,7 @@ void CountInRangeImpl(int *NumInRange, int Low, int High,
++(*NumInRange); ++(*NumInRange);
} }
const VariadicFunction3<void, int *, int, int, int, const VariadicFunction3<void, int *, int, int, int,
CountInRangeImpl> CountInRange; CountInRangeImpl> CountInRange = {};
TEST(VariadicFunction3Test, Works) { TEST(VariadicFunction3Test, Works) {
int N = -1; int N = -1;