From 0b8d907799cfb8fb9705d7abae7aad1cb47b3f1b Mon Sep 17 00:00:00 2001 From: Samuel Benzaquen Date: Tue, 19 Nov 2013 14:17:28 +0000 Subject: [PATCH] Change VariadicOperatorMatcherInterface<> to take an ArrayRef. Summary: Change VariadicOperatorMatcherInterface<> to take an ArrayRef. This simplifies its implementation and use. Also reduces the number of symbols in Registry.cpp.o, which we are always in need. Reviewers: klimek CC: cfe-commits, revane, klimek Differential Revision: http://llvm-reviews.chandlerc.com/D2216 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@195127 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../clang/ASTMatchers/ASTMatchersInternal.h | 75 +++++++------------ .../clang/ASTMatchers/Dynamic/VariantValue.h | 23 ++---- 2 files changed, 35 insertions(+), 63 deletions(-) diff --git a/include/clang/ASTMatchers/ASTMatchersInternal.h b/include/clang/ASTMatchers/ASTMatchersInternal.h index 69cee2eb5d..e1f30151fd 100644 --- a/include/clang/ASTMatchers/ASTMatchersInternal.h +++ b/include/clang/ASTMatchers/ASTMatchersInternal.h @@ -379,9 +379,7 @@ public: /// matcher can handle a value of T. /// /// If it is not compatible, then this matcher will never match anything. - template Matcher unconditionalConvertTo() const { - return Matcher(new WrappedMatcher(*this)); - } + template Matcher unconditionalConvertTo() const; private: class MatcherStorage : public RefCountedBaseVPTR { @@ -410,9 +408,6 @@ private: /// \brief Typed implementation of \c MatcherStorage. template class TypedMatcherStorage; - /// \brief Simple MatcherInterface wrapper around a DynTypedMatcher. - template class WrappedMatcher; - IntrusiveRefCntPtr Storage; }; @@ -452,22 +447,6 @@ template inline DynTypedMatcher::DynTypedMatcher(const BindableMatcher &M) : Storage(new TypedMatcherStorage(M, true)) {} -template -class DynTypedMatcher::WrappedMatcher : public MatcherInterface { -public: - explicit WrappedMatcher(const DynTypedMatcher &Matcher) : Inner(Matcher) {} - virtual ~WrappedMatcher() {} - - bool matches(const T &Node, ASTMatchFinder *Finder, - BoundNodesTreeBuilder *Builder) const { - return Inner.matches(ast_type_traits::DynTypedNode::create(Node), Finder, - Builder); - } - -private: - const DynTypedMatcher Inner; -}; - /// \brief Specialization of the conversion functions for QualType. /// /// These specializations provide the Matcher->Matcher @@ -1165,12 +1144,8 @@ template class VariadicOperatorMatcherInterface : public MatcherInterface { public: VariadicOperatorMatcherInterface(VariadicOperatorFunction Func, - ArrayRef *> InputMatchers) - : Func(Func) { - for (size_t i = 0, e = InputMatchers.size(); i != e; ++i) { - InnerMatchers.push_back(*InputMatchers[i]); - } - } + ArrayRef InnerMatchers) + : Func(Func), InnerMatchers(InnerMatchers) {} virtual bool matches(const T &Node, ASTMatchFinder *Finder, BoundNodesTreeBuilder *Builder) const { @@ -1180,7 +1155,7 @@ public: private: const VariadicOperatorFunction Func; - std::vector InnerMatchers; + const std::vector InnerMatchers; }; /// \brief "No argument" placeholder to use as template paratemers. @@ -1207,31 +1182,27 @@ public: Param4(Param4), Param5(Param5) {} template operator Matcher() const { - Matcher *Array[5]; - size_t Size = 0; - - addMatcher(Param1, Array, Size); - addMatcher(Param2, Array, Size); - addMatcher(Param3, Array, Size); - addMatcher(Param4, Array, Size); - addMatcher(Param5, Array, Size); - Matcher Result(new VariadicOperatorMatcherInterface( - Func, ArrayRef *>(Array, Size))); - for (size_t i = 0, e = Size; i != e; ++i) delete Array[i]; - return Result; + std::vector Matchers; + + addMatcher(Param1, Matchers); + addMatcher(Param2, Matchers); + addMatcher(Param3, Matchers); + addMatcher(Param4, Matchers); + addMatcher(Param5, Matchers); + return Matcher(new VariadicOperatorMatcherInterface(Func, Matchers)); } private: template - static void addMatcher(const Matcher &M, Matcher **Array, - size_t &Size) { - Array[Size++] = new Matcher(M); + static void addMatcher(const Matcher &M, + std::vector &Matchers) { + Matchers.push_back(M); } /// \brief Overload to ignore \c VariadicOperatorNoArg arguments. template - static void addMatcher(VariadicOperatorNoArg, Matcher **Array, - size_t &Size) {} + static void addMatcher(VariadicOperatorNoArg, + std::vector &Matchers) {} const VariadicOperatorFunction Func; const P1 Param1; @@ -1293,12 +1264,22 @@ bool AnyOfVariadicOperator(const ast_type_traits::DynTypedNode DynNode, BoundNodesTreeBuilder *Builder, ArrayRef InnerMatchers); +template +inline Matcher DynTypedMatcher::unconditionalConvertTo() const { + return Matcher( + new VariadicOperatorMatcherInterface(AllOfVariadicOperator, *this)); +} + /// \brief Creates a Matcher that matches if all inner matchers match. template BindableMatcher makeAllOfComposite( ArrayRef *> InnerMatchers) { + std::vector DynMatchers; + for (size_t i = 0, e = InnerMatchers.size(); i != e; ++i) { + DynMatchers.push_back(*InnerMatchers[i]); + } return BindableMatcher(new VariadicOperatorMatcherInterface( - AllOfVariadicOperator, InnerMatchers)); + AllOfVariadicOperator, DynMatchers)); } /// \brief Creates a Matcher that matches if diff --git a/include/clang/ASTMatchers/Dynamic/VariantValue.h b/include/clang/ASTMatchers/Dynamic/VariantValue.h index b9bc017a48..ff8c00e3e1 100644 --- a/include/clang/ASTMatchers/Dynamic/VariantValue.h +++ b/include/clang/ASTMatchers/Dynamic/VariantValue.h @@ -156,27 +156,18 @@ private: virtual void constructVariadicOperator( ast_matchers::internal::VariadicOperatorFunction Func, ArrayRef InnerMatchers) { - const size_t NumArgs = InnerMatchers.size(); - MatcherT **InnerArgs = new MatcherT *[NumArgs](); - bool HasError = false; - for (size_t i = 0; i != NumArgs; ++i) { + std::vector DynMatchers; + for (size_t i = 0, e = InnerMatchers.size(); i != e; ++i) { // Abort if any of the inner matchers can't be converted to // Matcher. if (!InnerMatchers[i].hasTypedMatcher()) { - HasError = true; - break; + return; } - InnerArgs[i] = new MatcherT(InnerMatchers[i].getTypedMatcher()); + DynMatchers.push_back(InnerMatchers[i].getTypedMatcher()); } - if (!HasError) { - Out.reset(new MatcherT( - new ast_matchers::internal::VariadicOperatorMatcherInterface( - Func, ArrayRef(InnerArgs, NumArgs)))); - } - for (size_t i = 0; i != NumArgs; ++i) { - delete InnerArgs[i]; - } - delete[] InnerArgs; + Out.reset(new MatcherT( + new ast_matchers::internal::VariadicOperatorMatcherInterface( + Func, DynMatchers))); } bool hasMatcher() const { return Out.get() != NULL; } -- 2.49.0