ClickHouse
50 строк · 1.2 Кб
1#include <Functions/FunctionFactory.h>
2#include <Functions/FunctionBinaryArithmetic.h>
3
4
5namespace DB
6{
7namespace ErrorCodes
8{
9extern const int LOGICAL_ERROR;
10}
11
12namespace
13{
14
15template <typename A, typename B>
16struct BitAndImpl
17{
18using ResultType = typename NumberTraits::ResultOfBit<A, B>::Type;
19static constexpr bool allow_fixed_string = true;
20static constexpr bool allow_string_integer = false;
21
22template <typename Result = ResultType>
23static inline Result apply(A a, B b)
24{
25return static_cast<Result>(a) & static_cast<Result>(b);
26}
27
28#if USE_EMBEDDED_COMPILER
29static constexpr bool compilable = true;
30
31static inline llvm::Value * compile(llvm::IRBuilder<> & b, llvm::Value * left, llvm::Value * right, bool)
32{
33if (!left->getType()->isIntegerTy())
34throw Exception(ErrorCodes::LOGICAL_ERROR, "BitAndImpl expected an integral type");
35return b.CreateAnd(left, right);
36}
37#endif
38};
39
40struct NameBitAnd { static constexpr auto name = "bitAnd"; };
41using FunctionBitAnd = BinaryArithmeticOverloadResolver<BitAndImpl, NameBitAnd, true, false>;
42
43}
44
45REGISTER_FUNCTION(BitAnd)
46{
47factory.registerFunction<FunctionBitAnd>();
48}
49
50}
51