#pragma once #include namespace DB { template class IBinaryAggregateFunction : public IAggregateFunctionHelper { Derived & getDerived() { return static_cast(*this); } const Derived & getDerived() const { return static_cast(*this); } public: void setArguments(const DataTypes & arguments) { if (arguments.size() != 2) throw Exception{ "Passed " + toString(arguments.size()) + " arguments to binary aggregate function " + this->getName(), ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH }; getDerived().setArgumentsImpl(arguments); } void add(AggregateDataPtr place, const IColumn ** columns, const size_t row_num) const { getDerived().addOne(place, *columns[0], *columns[1], row_num); } }; }