1#pragma once
2
3#include <Common/memcmpSmall.h>
4#include <Columns/ColumnString.h>
5#include <Functions/FunctionFactory.h>
6
7
8namespace DB
9{
10
11namespace ErrorCodes
12{
13 extern const int LOGICAL_ERROR;
14}
15
16
17template <bool negative = false>
18struct EmptyImpl
19{
20 /// If the function will return constant value for FixedString data type.
21 static constexpr auto is_fixed_to_constant = false;
22
23 static void vector(const ColumnString::Chars & /*data*/, const ColumnString::Offsets & offsets, PaddedPODArray<UInt8> & res)
24 {
25 size_t size = offsets.size();
26 ColumnString::Offset prev_offset = 1;
27 for (size_t i = 0; i < size; ++i)
28 {
29 res[i] = negative ^ (offsets[i] == prev_offset);
30 prev_offset = offsets[i] + 1;
31 }
32 }
33
34 /// Only make sense if is_fixed_to_constant.
35 static void vector_fixed_to_constant(const ColumnString::Chars & /*data*/, size_t /*n*/, UInt8 & /*res*/)
36 {
37 throw Exception("Logical error: 'vector_fixed_to_constant method' is called", ErrorCodes::LOGICAL_ERROR);
38 }
39
40 static void vector_fixed_to_vector(const ColumnString::Chars & data, size_t n, PaddedPODArray<UInt8> & res)
41 {
42 size_t size = data.size() / n;
43 for (size_t i = 0; i < size; ++i)
44 res[i] = negative ^ memoryIsZeroSmallAllowOverflow15(data.data() + i * n, n);
45 }
46
47 static void array(const ColumnString::Offsets & offsets, PaddedPODArray<UInt8> & res)
48 {
49 size_t size = offsets.size();
50 ColumnString::Offset prev_offset = 0;
51 for (size_t i = 0; i < size; ++i)
52 {
53 res[i] = negative ^ (offsets[i] == prev_offset);
54 prev_offset = offsets[i];
55 }
56 }
57};
58
59}
60