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:
using List = TypeList<>;
virtual ~Visitor() = default;
protected:
~Visitor() = default;
};
template <typename Type>
@ -76,6 +77,9 @@ public:
using List = TypeList<Type>;
virtual void visit(Type &) = 0;
protected:
~Visitor() = default;
};
template <typename Type, typename ... Types>
@ -86,6 +90,9 @@ public:
using Visitor<Types ...>::visit;
virtual void visit(Type &) = 0;
protected:
~Visitor() = default;
};
@ -95,6 +102,8 @@ class VisitorImplHelper;
template <typename Derived, typename VisitorBase>
class VisitorImplHelper<Derived, VisitorBase> : public VisitorBase
{
protected:
~VisitorImplHelper() = default;
};
template <typename Derived, typename VisitorBase, typename Type>
@ -111,6 +120,8 @@ protected:
throw Exception("visitImpl(" + demangle(typeid(T).name()) + " &)" + " is not implemented for class"
+ demangle(typeid(Derived).name()), ErrorCodes::LOGICAL_ERROR);
}
~VisitorImplHelper() = default;
};
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"
+ demangle(typeid(Derived).name()), ErrorCodes::LOGICAL_ERROR);
}
~VisitorImplHelper() = default;
};
template <typename Derived, typename VisitorBase>
@ -140,6 +153,8 @@ class VisitorImpl : public
>::Type
>::Type
{
protected:
~VisitorImpl() = default;
};
template <typename Derived, typename Base, typename Visitor>
@ -147,6 +162,8 @@ class Visitable : public Base
{
public:
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 TypeListArraySinks = typename TypeListConcat<BasicArraySinks, NullableArraySinks>::Type;
class ArraySinkVisitor : public ApplyTypeListForClass<Visitor, TypeListArraySinks>::Type {};
using ArraySinkVisitor = typename ApplyTypeListForClass<Visitor, TypeListArraySinks>::Type;
template <typename Derived>
class ArraySinkVisitorImpl : public VisitorImpl<Derived, ArraySinkVisitor> {};
using ArraySinkVisitorImpl = VisitorImpl<Derived, ArraySinkVisitor>;
#pragma GCC visibility pop
}

View File

@ -24,10 +24,10 @@ using BasicAndNullableArraySources = typename TypeListConcat<BasicArraySources,
using ConstArraySources = typename TypeListMap<ConstSource, BasicAndNullableArraySources>::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>
class ArraySourceVisitorImpl : public VisitorImpl<Derived, ArraySourceVisitor> {};
using ArraySourceVisitorImpl = VisitorImpl<Derived, ArraySourceVisitor>;
#pragma GCC visibility pop
}

View File

@ -33,7 +33,7 @@ void callSelectMemberFunctionWithTupleArgument(Tuple & tuple, Args && ... 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 ...) {}
@ -61,7 +61,7 @@ struct ArraySourceSelector
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 ...) {}
@ -89,7 +89,7 @@ struct ArraySinkSelector
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 ...) {}

View File

@ -24,10 +24,10 @@ using BasicAndNullableValueSources = typename TypeListConcat<BasicValueSources,
using ConstValueSources = typename TypeListMap<ConstSource, BasicAndNullableValueSources>::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>
class ValueSourceVisitorImpl : public VisitorImpl<Derived, ValueSourceVisitor> {};
using ValueSourceVisitorImpl = VisitorImpl<Derived, ValueSourceVisitor>;
#pragma GCC visibility pop
}