Remove virtual destructors for Visitor.

This commit is contained in:
Nikolai Kochetov 2020-09-15 02:05:43 +03:00
parent 65a1057aae
commit 95ae1105d9
5 changed files with 27 additions and 10 deletions

View File

@ -66,7 +66,8 @@ class Visitor<>
public: public:
using List = TypeList<>; using List = TypeList<>;
virtual ~Visitor() = default; protected:
~Visitor() = default;
}; };
template <typename Type> template <typename Type>
@ -76,6 +77,9 @@ public:
using List = TypeList<Type>; using List = TypeList<Type>;
virtual void visit(Type &) = 0; virtual void visit(Type &) = 0;
protected:
~Visitor() = default;
}; };
template <typename Type, typename ... Types> template <typename Type, typename ... Types>
@ -86,6 +90,9 @@ public:
using Visitor<Types ...>::visit; using Visitor<Types ...>::visit;
virtual void visit(Type &) = 0; virtual void visit(Type &) = 0;
protected:
~Visitor() = default;
}; };
@ -95,6 +102,8 @@ class VisitorImplHelper;
template <typename Derived, typename VisitorBase> template <typename Derived, typename VisitorBase>
class VisitorImplHelper<Derived, VisitorBase> : public VisitorBase class VisitorImplHelper<Derived, VisitorBase> : public VisitorBase
{ {
protected:
~VisitorImplHelper() = default;
}; };
template <typename Derived, typename VisitorBase, typename Type> template <typename Derived, typename VisitorBase, typename Type>
@ -111,6 +120,8 @@ protected:
throw Exception("visitImpl(" + demangle(typeid(T).name()) + " &)" + " is not implemented for class" throw Exception("visitImpl(" + demangle(typeid(T).name()) + " &)" + " is not implemented for class"
+ demangle(typeid(Derived).name()), ErrorCodes::LOGICAL_ERROR); + demangle(typeid(Derived).name()), ErrorCodes::LOGICAL_ERROR);
} }
~VisitorImplHelper() = default;
}; };
template <typename Derived, typename VisitorBase, typename Type, typename ... Types> template <typename Derived, typename VisitorBase, typename Type, typename ... Types>
@ -128,6 +139,8 @@ protected:
throw Exception("visitImpl(" + demangle(typeid(T).name()) + " &)" + " is not implemented for class" throw Exception("visitImpl(" + demangle(typeid(T).name()) + " &)" + " is not implemented for class"
+ demangle(typeid(Derived).name()), ErrorCodes::LOGICAL_ERROR); + demangle(typeid(Derived).name()), ErrorCodes::LOGICAL_ERROR);
} }
~VisitorImplHelper() = default;
}; };
template <typename Derived, typename VisitorBase> template <typename Derived, typename VisitorBase>
@ -140,6 +153,8 @@ class VisitorImpl : public
>::Type >::Type
>::Type >::Type
{ {
protected:
~VisitorImpl() = default;
}; };
template <typename Derived, typename Base, typename Visitor> template <typename Derived, typename Base, typename Visitor>
@ -147,6 +162,8 @@ class Visitable : public Base
{ {
public: public:
void accept(Visitor & visitor) override { visitor.visit(*static_cast<Derived *>(this)); } void accept(Visitor & visitor) override { visitor.visit(*static_cast<Derived *>(this)); }
//virtual ~Visitable() = default;
}; };
} }

View File

@ -19,10 +19,10 @@ using BasicArraySinks = typename AppendToTypeList<GenericArraySink, NumericArray
using NullableArraySinks = typename TypeListMap<NullableArraySink, BasicArraySinks>::Type; using NullableArraySinks = typename TypeListMap<NullableArraySink, BasicArraySinks>::Type;
using TypeListArraySinks = typename TypeListConcat<BasicArraySinks, NullableArraySinks>::Type; using TypeListArraySinks = typename TypeListConcat<BasicArraySinks, NullableArraySinks>::Type;
class ArraySinkVisitor : public ApplyTypeListForClass<Visitor, TypeListArraySinks>::Type {}; using ArraySinkVisitor = typename ApplyTypeListForClass<Visitor, TypeListArraySinks>::Type;
template <typename Derived> template <typename Derived>
class ArraySinkVisitorImpl : public VisitorImpl<Derived, ArraySinkVisitor> {}; using ArraySinkVisitorImpl = VisitorImpl<Derived, ArraySinkVisitor>;
#pragma GCC visibility pop #pragma GCC visibility pop
} }

View File

@ -24,10 +24,10 @@ using BasicAndNullableArraySources = typename TypeListConcat<BasicArraySources,
using ConstArraySources = typename TypeListMap<ConstSource, BasicAndNullableArraySources>::Type; using ConstArraySources = typename TypeListMap<ConstSource, BasicAndNullableArraySources>::Type;
using TypeListArraySources = typename TypeListConcat<BasicAndNullableArraySources, ConstArraySources>::Type; using TypeListArraySources = typename TypeListConcat<BasicAndNullableArraySources, ConstArraySources>::Type;
class ArraySourceVisitor : public ApplyTypeListForClass<Visitor, TypeListArraySources>::Type {}; using ArraySourceVisitor = typename ApplyTypeListForClass<Visitor, TypeListArraySources>::Type;
template <typename Derived> template <typename Derived>
class ArraySourceVisitorImpl : public VisitorImpl<Derived, ArraySourceVisitor> {}; using ArraySourceVisitorImpl = VisitorImpl<Derived, ArraySourceVisitor>;
#pragma GCC visibility pop #pragma GCC visibility pop
} }

View File

@ -33,7 +33,7 @@ void callSelectMemberFunctionWithTupleArgument(Tuple & tuple, Args && ... args)
} }
template <typename Base, typename ... Args> template <typename Base, typename ... Args>
struct ArraySourceSelectorVisitor : public ArraySourceVisitorImpl<ArraySourceSelectorVisitor<Base, Args ...>> struct ArraySourceSelectorVisitor final : public ArraySourceVisitorImpl<ArraySourceSelectorVisitor<Base, Args ...>>
{ {
explicit ArraySourceSelectorVisitor(Args && ... args) : packed_args(args ...) {} explicit ArraySourceSelectorVisitor(Args && ... args) : packed_args(args ...) {}
@ -61,7 +61,7 @@ struct ArraySourceSelector
template <typename Base, typename ... Args> template <typename Base, typename ... Args>
struct ArraySinkSelectorVisitor : public ArraySinkVisitorImpl<ArraySinkSelectorVisitor<Base, Args ...>> struct ArraySinkSelectorVisitor final : public ArraySinkVisitorImpl<ArraySinkSelectorVisitor<Base, Args ...>>
{ {
explicit ArraySinkSelectorVisitor(Args && ... args) : packed_args(args ...) {} explicit ArraySinkSelectorVisitor(Args && ... args) : packed_args(args ...) {}
@ -89,7 +89,7 @@ struct ArraySinkSelector
template <typename Base, typename ... Args> template <typename Base, typename ... Args>
struct ValueSourceSelectorVisitor : public ValueSourceVisitorImpl<ValueSourceSelectorVisitor<Base, Args ...>> struct ValueSourceSelectorVisitor final : public ValueSourceVisitorImpl<ValueSourceSelectorVisitor<Base, Args ...>>
{ {
explicit ValueSourceSelectorVisitor(Args && ... args) : packed_args(args ...) {} explicit ValueSourceSelectorVisitor(Args && ... args) : packed_args(args ...) {}

View File

@ -24,10 +24,10 @@ using BasicAndNullableValueSources = typename TypeListConcat<BasicValueSources,
using ConstValueSources = typename TypeListMap<ConstSource, BasicAndNullableValueSources>::Type; using ConstValueSources = typename TypeListMap<ConstSource, BasicAndNullableValueSources>::Type;
using TypeListValueSources = typename TypeListConcat<BasicAndNullableValueSources, ConstValueSources>::Type; using TypeListValueSources = typename TypeListConcat<BasicAndNullableValueSources, ConstValueSources>::Type;
class ValueSourceVisitor : public ApplyTypeListForClass<Visitor, TypeListValueSources>::Type {}; using ValueSourceVisitor = typename ApplyTypeListForClass<Visitor, TypeListValueSources>::Type;
template <typename Derived> template <typename Derived>
class ValueSourceVisitorImpl : public VisitorImpl<Derived, ValueSourceVisitor> {}; using ValueSourceVisitorImpl = VisitorImpl<Derived, ValueSourceVisitor>;
#pragma GCC visibility pop #pragma GCC visibility pop
} }