Groonga
Loading...
Searching...
No Matches
bulk.hpp
Go to the documentation of this file.
1// Copyright (C) 2020-2026 Sutou Kouhei <kou@clear-code.com>
2//
3// This library is free software; you can redistribute it and/or
4// modify it under the terms of the GNU Lesser General Public
5// License as published by the Free Software Foundation; either
6// version 2.1 of the License, or (at your option) any later version.
7//
8// This library is distributed in the hope that it will be useful,
9// but WITHOUT ANY WARRANTY; without even the implied warranty of
10// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11// Lesser General Public License for more details.
12//
13// You should have received a copy of the GNU Lesser General Public
14// License along with this library; if not, write to the Free Software
15// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
17#pragma once
18
19#include "groonga/float.h"
20
21#include <cmath>
22#include <string>
23
24namespace grn {
25 namespace numeric {
26#ifdef GRN_HAVE_BFLOAT16
31 template <typename TYPE>
32 grn_bfloat16
33 to_bfloat16(TYPE value)
34 {
35 if constexpr (std::is_same_v<TYPE, grn_bfloat16>) {
36 return value;
37 } else {
38 return static_cast<grn_bfloat16>(value);
39 }
40 }
41
45 inline float
46 bfloat16_to_float32(grn_bfloat16 value)
47 {
48 return static_cast<float>(value);
49 }
50#endif
51
52 template <typename TYPE>
53 std::enable_if_t<std::is_integral_v<TYPE>, bool>
54 is_zero(TYPE value)
55 {
56 return value == 0;
57 }
58
59 template <typename TYPE>
60 std::enable_if_t<std::is_floating_point_v<TYPE>, bool>
61 is_zero(TYPE value)
62 {
63 return std::abs(value) < std::numeric_limits<TYPE>::epsilon();
64 }
65
66#ifdef GRN_HAVE_BFLOAT16
67 template <typename TYPE>
68 std::enable_if_t<std::is_same_v<TYPE, grn_bfloat16>, bool>
69 is_zero(TYPE value)
70 {
71 return is_zero(static_cast<float>(value));
72 }
73#endif
74 }; // namespace numeric
75
76 namespace bulk {
77 template <typename TYPE>
78 TYPE
79 get(grn_ctx *ctx, grn_obj *bulk, TYPE default_value)
80 {
81 switch (bulk->header.domain) {
82 case GRN_DB_BOOL:
83 return static_cast<TYPE>(GRN_BOOL_VALUE(bulk));
84 case GRN_DB_INT8:
85 return static_cast<TYPE>(GRN_INT8_VALUE(bulk));
86 case GRN_DB_UINT8:
87 return static_cast<TYPE>(GRN_UINT8_VALUE(bulk));
88 case GRN_DB_INT16:
89 return static_cast<TYPE>(GRN_INT16_VALUE(bulk));
90 case GRN_DB_UINT16:
91 return static_cast<TYPE>(GRN_UINT16_VALUE(bulk));
92 case GRN_DB_INT32:
93 return static_cast<TYPE>(GRN_INT32_VALUE(bulk));
94 case GRN_DB_UINT32:
95 return static_cast<TYPE>(GRN_UINT32_VALUE(bulk));
96 case GRN_DB_INT64:
97 return static_cast<TYPE>(GRN_INT64_VALUE(bulk));
98 case GRN_DB_UINT64:
99 return static_cast<TYPE>(GRN_UINT64_VALUE(bulk));
100#ifdef GRN_HAVE_BFLOAT16
101 case GRN_DB_BFLOAT16:
102 return static_cast<TYPE>(GRN_BFLOAT16_VALUE(bulk));
103#endif
104 case GRN_DB_FLOAT32:
105 return static_cast<TYPE>(GRN_FLOAT32_VALUE(bulk));
106 case GRN_DB_FLOAT:
107 return static_cast<TYPE>(GRN_FLOAT_VALUE(bulk));
108 case GRN_DB_TIME:
109 return static_cast<TYPE>(GRN_TIME_VALUE(bulk));
110 default:
111 return default_value;
112 }
113 }
114
115 template <typename NUMERIC>
116 grn_rc
117 set(grn_ctx *ctx, grn_obj *bulk, NUMERIC value)
118 {
119 switch (bulk->header.domain) {
120 case GRN_DB_BOOL:
121 GRN_BOOL_SET(ctx, bulk, !numeric::is_zero(value));
122 break;
123 case GRN_DB_INT8:
124 GRN_INT8_SET(ctx, bulk, value);
125 break;
126 case GRN_DB_UINT8:
127 GRN_UINT8_SET(ctx, bulk, value);
128 break;
129 case GRN_DB_INT16:
130 GRN_INT16_SET(ctx, bulk, value);
131 break;
132 case GRN_DB_UINT16:
133 GRN_UINT16_SET(ctx, bulk, value);
134 break;
135 case GRN_DB_INT32:
136 GRN_INT32_SET(ctx, bulk, value);
137 break;
138 case GRN_DB_UINT32:
139 GRN_UINT32_SET(ctx, bulk, value);
140 break;
141 case GRN_DB_INT64:
142 GRN_INT64_SET(ctx, bulk, value);
143 break;
144 case GRN_DB_UINT64:
145 GRN_UINT64_SET(ctx, bulk, value);
146 break;
147#ifdef GRN_HAVE_BFLOAT16
148 case GRN_DB_BFLOAT16:
149 // Convert an integer via double for the same result with all
150 // compilers. GCC converts an integer to bfloat16 directly but
151 // Clang converts an integer to float then to bfloat16.
152 if constexpr (std::is_integral_v<NUMERIC>) {
153 GRN_BFLOAT16_SET(ctx, bulk, static_cast<double>(value));
154 } else {
155 GRN_BFLOAT16_SET(ctx, bulk, value);
156 }
157 break;
158#endif
159 case GRN_DB_FLOAT32:
160 GRN_FLOAT32_SET(ctx, bulk, value);
161 break;
162 case GRN_DB_FLOAT:
163 GRN_FLOAT_SET(ctx, bulk, value);
164 break;
165 case GRN_DB_TIME:
166 if constexpr (std::is_floating_point_v<NUMERIC>) {
167 GRN_TIME_SET(ctx, bulk, std::llround(value * GRN_TIME_USEC_PER_SEC));
168 } else {
169 GRN_TIME_SET(ctx, bulk, value);
170 }
171 default:
172 break;
173 }
174 return ctx->rc;
175 }
176
177 template <typename NUMERIC>
178 grn_rc
179 put(grn_ctx *ctx, grn_obj *bulk, NUMERIC value)
180 {
181 switch (bulk->header.domain) {
182 case GRN_DB_BOOL:
183 GRN_BOOL_PUT(ctx, bulk, !numeric::is_zero(value));
184 break;
185 case GRN_DB_INT8:
186 GRN_INT8_PUT(ctx, bulk, value);
187 break;
188 case GRN_DB_UINT8:
189 GRN_UINT8_PUT(ctx, bulk, value);
190 break;
191 case GRN_DB_INT16:
192 GRN_INT16_PUT(ctx, bulk, value);
193 break;
194 case GRN_DB_UINT16:
195 GRN_UINT16_PUT(ctx, bulk, value);
196 break;
197 case GRN_DB_INT32:
198 GRN_INT32_PUT(ctx, bulk, value);
199 break;
200 case GRN_DB_UINT32:
201 GRN_UINT32_PUT(ctx, bulk, value);
202 break;
203 case GRN_DB_INT64:
204 GRN_INT64_PUT(ctx, bulk, value);
205 break;
206 case GRN_DB_UINT64:
207 GRN_UINT64_PUT(ctx, bulk, value);
208 break;
209#ifdef GRN_HAVE_BFLOAT16
210 case GRN_DB_BFLOAT16:
211 // See set().
212 if constexpr (std::is_integral_v<NUMERIC>) {
213 GRN_BFLOAT16_PUT(ctx, bulk, static_cast<double>(value));
214 } else {
215 GRN_BFLOAT16_PUT(ctx, bulk, value);
216 }
217 break;
218#endif
219 case GRN_DB_FLOAT32:
220 GRN_FLOAT32_PUT(ctx, bulk, value);
221 break;
222 case GRN_DB_FLOAT:
223 GRN_FLOAT_PUT(ctx, bulk, value);
224 break;
225 case GRN_DB_TIME:
226 if constexpr (std::is_floating_point_v<NUMERIC>) {
227 GRN_TIME_PUT(ctx, bulk, std::llround(value * GRN_TIME_USEC_PER_SEC));
228 } else {
229 GRN_TIME_PUT(ctx, bulk, value);
230 }
231 default:
232 break;
233 }
234 return ctx->rc;
235 }
236 }; // namespace bulk
237
238 class TextBulk {
239 public:
240 TextBulk(grn_ctx *ctx, uint8_t flags = 0) : ctx_(ctx)
241 {
242 GRN_TEXT_INIT(&bulk_, flags);
243 }
244
245 ~TextBulk() { GRN_OBJ_FIN(ctx_, &bulk_); }
246
247 grn_obj *
249 {
250 return &bulk_;
251 }
252
253 std::string
255 {
256 return std::string(GRN_TEXT_VALUE(&bulk_), GRN_TEXT_LEN(&bulk_));
257 };
258
259 private:
260 grn_ctx *ctx_;
261 grn_obj bulk_;
262 };
263} // namespace grn
~TextBulk()
Definition bulk.hpp:245
TextBulk(grn_ctx *ctx, uint8_t flags=0)
Definition bulk.hpp:240
std::string value()
Definition bulk.hpp:254
grn_obj * operator*()
Definition bulk.hpp:248
#define GRN_FLOAT_VALUE(obj)
Definition groonga.h:3213
#define GRN_INT16_VALUE(obj)
Definition groonga.h:3205
#define GRN_INT32_PUT(ctx, obj, val)
Definition groonga.h:3282
#define GRN_BOOL_SET(ctx, obj, val)
Definition groonga.h:2984
grn_rc
Definition groonga.h:61
#define GRN_INT8_VALUE(obj)
Definition groonga.h:3203
#define GRN_INT16_PUT(ctx, obj, val)
Definition groonga.h:3272
#define GRN_BFLOAT16_VALUE(obj)
Definition groonga.h:3211
struct _grn_ctx grn_ctx
grn_ctx is the most important object.
Definition groonga.h:332
#define GRN_TIME_VALUE
Definition groonga.h:3214
#define GRN_UINT16_PUT(ctx, obj, val)
Definition groonga.h:3277
#define GRN_INT8_SET(ctx, obj, val)
Definition groonga.h:2989
#define GRN_FLOAT32_PUT(ctx, obj, val)
Definition groonga.h:3307
#define GRN_UINT8_VALUE(obj)
Definition groonga.h:3204
#define GRN_UINT32_VALUE(obj)
Definition groonga.h:3208
#define GRN_TEXT_VALUE(obj)
Definition groonga.h:2889
#define GRN_UINT64_VALUE(obj)
Definition groonga.h:3210
#define GRN_INT64_VALUE(obj)
Definition groonga.h:3209
#define GRN_UINT8_SET(ctx, obj, val)
Definition groonga.h:2994
#define GRN_FLOAT_SET(ctx, obj, val)
Definition groonga.h:3039
#define GRN_OBJ_FIN(ctx, obj)
Definition groonga.h:999
#define GRN_FLOAT32_SET(ctx, obj, val)
Definition groonga.h:3034
#define GRN_UINT32_SET(ctx, obj, val)
Definition groonga.h:3014
#define GRN_INT32_SET(ctx, obj, val)
Definition groonga.h:3009
#define GRN_UINT64_SET(ctx, obj, val)
Definition groonga.h:3024
#define GRN_TIME_SET
Definition groonga.h:3044
#define GRN_INT8_PUT(ctx, obj, val)
Definition groonga.h:3262
#define GRN_INT16_SET(ctx, obj, val)
Definition groonga.h:2999
#define GRN_UINT64_PUT(ctx, obj, val)
Definition groonga.h:3297
#define GRN_INT32_VALUE(obj)
Definition groonga.h:3207
#define GRN_BFLOAT16_SET(ctx, obj, val)
Definition groonga.h:3029
struct _grn_obj grn_obj
The generic Groonga object type.
Definition groonga.h:310
#define GRN_UINT16_VALUE(obj)
Definition groonga.h:3206
@ GRN_DB_UINT8
Definition groonga.h:1110
@ GRN_DB_INT8
Definition groonga.h:1109
@ GRN_DB_TIME
Definition groonga.h:1118
@ GRN_DB_BFLOAT16
Definition groonga.h:1125
@ GRN_DB_UINT16
Definition groonga.h:1112
@ GRN_DB_INT32
Definition groonga.h:1113
@ GRN_DB_BOOL
Definition groonga.h:1108
@ GRN_DB_INT16
Definition groonga.h:1111
@ GRN_DB_FLOAT32
Definition groonga.h:1124
@ GRN_DB_UINT32
Definition groonga.h:1114
@ GRN_DB_UINT64
Definition groonga.h:1116
@ GRN_DB_INT64
Definition groonga.h:1115
@ GRN_DB_FLOAT
Definition groonga.h:1117
#define GRN_UINT32_PUT(ctx, obj, val)
Definition groonga.h:3287
#define GRN_UINT8_PUT(ctx, obj, val)
Definition groonga.h:3267
#define GRN_BOOL_PUT(ctx, obj, val)
Definition groonga.h:3257
#define GRN_TIME_PUT
Definition groonga.h:3317
#define GRN_BOOL_VALUE(obj)
Definition groonga.h:3202
#define GRN_FLOAT32_VALUE(obj)
Definition groonga.h:3212
#define GRN_TEXT_INIT(obj, flags)
Definition groonga.h:2853
#define GRN_INT64_SET(ctx, obj, val)
Definition groonga.h:3019
#define GRN_BFLOAT16_PUT(ctx, obj, val)
Definition groonga.h:3302
#define GRN_UINT16_SET(ctx, obj, val)
Definition groonga.h:3004
#define GRN_INT64_PUT(ctx, obj, val)
Definition groonga.h:3292
#define GRN_TEXT_LEN(obj)
Definition groonga.h:2890
#define GRN_FLOAT_PUT(ctx, obj, val)
Definition groonga.h:3312
Definition bulk.hpp:76
grn_rc set(grn_ctx *ctx, grn_obj *bulk, NUMERIC value)
Definition bulk.hpp:117
grn_rc put(grn_ctx *ctx, grn_obj *bulk, NUMERIC value)
Definition bulk.hpp:179
TYPE get(grn_ctx *ctx, grn_obj *bulk, TYPE default_value)
Definition bulk.hpp:79
Definition bulk.hpp:25
std::enable_if_t< std::is_integral_v< TYPE >, bool > is_zero(TYPE value)
Definition bulk.hpp:54
Definition arrow.hpp:25
grn_rc rc
Definition groonga.h:352
#define GRN_TIME_USEC_PER_SEC
Definition time.h:44