summaryrefslogtreecommitdiffstats
path: root/clang/lib/ASTMatchers/Dynamic/VariantValue.cpp
diff options
context:
space:
mode:
authorSamuel Benzaquen <sbenza@google.com>2013-10-21 18:40:51 +0000
committerSamuel Benzaquen <sbenza@google.com>2013-10-21 18:40:51 +0000
commitf46e5f1c9a75fa22d13c50e51c6b2e6158f9e825 (patch)
tree3a185a76bbaa1bec51f39f934c272558084a1007 /clang/lib/ASTMatchers/Dynamic/VariantValue.cpp
parent4517d598803dcac0e26363d5f3e32d0488ec799e (diff)
downloadbcm5719-llvm-f46e5f1c9a75fa22d13c50e51c6b2e6158f9e825.tar.gz
bcm5719-llvm-f46e5f1c9a75fa22d13c50e51c6b2e6158f9e825.zip
Refactor DynTypedMatcher into a value type class, just like Matcher<T>.
Summary: Refactor DynTypedMatcher into a value type class, just like Matcher<T>. This simplifies its usage and removes the virtual hierarchy from Matcher<T>. It also enables planned changes to replace MatcherInteface<T>. Too many instantiaions of this class hierarchy has been causing Registry.cpp.o to bloat in size and number of symbols. Reviewers: klimek CC: cfe-commits, revane Differential Revision: http://llvm-reviews.chandlerc.com/D1661 llvm-svn: 193100
Diffstat (limited to 'clang/lib/ASTMatchers/Dynamic/VariantValue.cpp')
-rw-r--r--clang/lib/ASTMatchers/Dynamic/VariantValue.cpp52
1 files changed, 22 insertions, 30 deletions
diff --git a/clang/lib/ASTMatchers/Dynamic/VariantValue.cpp b/clang/lib/ASTMatchers/Dynamic/VariantValue.cpp
index c350d78aa14..3e49e1b8ef0 100644
--- a/clang/lib/ASTMatchers/Dynamic/VariantValue.cpp
+++ b/clang/lib/ASTMatchers/Dynamic/VariantValue.cpp
@@ -26,44 +26,37 @@ VariantMatcher::Payload::~Payload() {}
class VariantMatcher::SinglePayload : public VariantMatcher::Payload {
public:
- SinglePayload(const DynTypedMatcher &Matcher) : Matcher(Matcher.clone()) {}
+ SinglePayload(const DynTypedMatcher &Matcher) : Matcher(Matcher) {}
- virtual bool getSingleMatcher(const DynTypedMatcher *&Out) const {
- Out = Matcher.get();
- return true;
+ virtual llvm::Optional<DynTypedMatcher> getSingleMatcher() const {
+ return Matcher;
}
virtual std::string getTypeAsString() const {
- return (Twine("Matcher<") + Matcher->getSupportedKind().asStringRef() + ">")
+ return (Twine("Matcher<") + Matcher.getSupportedKind().asStringRef() + ">")
.str();
}
virtual void makeTypedMatcher(MatcherOps &Ops) const {
- if (Ops.canConstructFrom(*Matcher))
- Ops.constructFrom(*Matcher);
+ if (Ops.canConstructFrom(Matcher))
+ Ops.constructFrom(Matcher);
}
private:
- OwningPtr<const DynTypedMatcher> Matcher;
+ const DynTypedMatcher Matcher;
};
class VariantMatcher::PolymorphicPayload : public VariantMatcher::Payload {
public:
- PolymorphicPayload(ArrayRef<const DynTypedMatcher *> MatchersIn) {
- for (size_t i = 0, e = MatchersIn.size(); i != e; ++i) {
- Matchers.push_back(MatchersIn[i]->clone());
- }
- }
+ PolymorphicPayload(ArrayRef<DynTypedMatcher> MatchersIn)
+ : Matchers(MatchersIn) {}
- virtual ~PolymorphicPayload() {
- llvm::DeleteContainerPointers(Matchers);
- }
+ virtual ~PolymorphicPayload() {}
- virtual bool getSingleMatcher(const DynTypedMatcher *&Out) const {
+ virtual llvm::Optional<DynTypedMatcher> getSingleMatcher() const {
if (Matchers.size() != 1)
- return false;
- Out = Matchers[0];
- return true;
+ return llvm::Optional<DynTypedMatcher>();
+ return Matchers[0];
}
virtual std::string getTypeAsString() const {
@@ -71,7 +64,7 @@ public:
for (size_t i = 0, e = Matchers.size(); i != e; ++i) {
if (i != 0)
Inner += "|";
- Inner += Matchers[i]->getSupportedKind().asStringRef();
+ Inner += Matchers[i].getSupportedKind().asStringRef();
}
return (Twine("Matcher<") + Inner + ">").str();
}
@@ -79,17 +72,17 @@ public:
virtual void makeTypedMatcher(MatcherOps &Ops) const {
const DynTypedMatcher *Found = NULL;
for (size_t i = 0, e = Matchers.size(); i != e; ++i) {
- if (Ops.canConstructFrom(*Matchers[i])) {
+ if (Ops.canConstructFrom(Matchers[i])) {
if (Found)
return;
- Found = Matchers[i];
+ Found = &Matchers[i];
}
}
if (Found)
Ops.constructFrom(*Found);
}
- std::vector<const DynTypedMatcher *> Matchers;
+ const std::vector<DynTypedMatcher> Matchers;
};
class VariantMatcher::VariadicOpPayload : public VariantMatcher::Payload {
@@ -98,8 +91,8 @@ public:
ArrayRef<VariantMatcher> Args)
: Func(Func), Args(Args) {}
- virtual bool getSingleMatcher(const DynTypedMatcher *&Out) const {
- return false;
+ virtual llvm::Optional<DynTypedMatcher> getSingleMatcher() const {
+ return llvm::Optional<DynTypedMatcher>();
}
virtual std::string getTypeAsString() const {
@@ -128,7 +121,7 @@ VariantMatcher VariantMatcher::SingleMatcher(const DynTypedMatcher &Matcher) {
}
VariantMatcher
-VariantMatcher::PolymorphicMatcher(ArrayRef<const DynTypedMatcher *> Matchers) {
+VariantMatcher::PolymorphicMatcher(ArrayRef<DynTypedMatcher> Matchers) {
return VariantMatcher(new PolymorphicPayload(Matchers));
}
@@ -138,9 +131,8 @@ VariantMatcher VariantMatcher::VariadicOperatorMatcher(
return VariantMatcher(new VariadicOpPayload(Func, Args));
}
-bool VariantMatcher::getSingleMatcher(const DynTypedMatcher *&Out) const {
- if (Value) return Value->getSingleMatcher(Out);
- return false;
+llvm::Optional<DynTypedMatcher> VariantMatcher::getSingleMatcher() const {
+ return Value ? Value->getSingleMatcher() : llvm::Optional<DynTypedMatcher>();
}
void VariantMatcher::reset() { Value.reset(); }
OpenPOWER on IntegriCloud