Groonga
Loading...
Searching...
No Matches
bulk.hpp
Go to the documentation of this file.
1// Copyright (C) 2020-2024 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 <cmath>
20#include <cstring>
21#include <string>
22
23namespace grn {
24 namespace numeric {
25#ifdef GRN_HAVE_BFLOAT16
26 template <typename TYPE>
27 grn_bfloat16
28 to_bfloat16(TYPE value)
29 {
30 if constexpr (std::is_same_v<TYPE, grn_bfloat16>) {
31 return value;
32 } else {
33 grn_bfloat16 value_bfloat16 = 0;
34 float value_float = value;
35 std::memcpy(&value_bfloat16,
36 reinterpret_cast<char *>(&value_float) + sizeof(float) -
37 sizeof(grn_bfloat16),
38 sizeof(grn_bfloat16));
39 return value_bfloat16;
40 }
41 }
42
43 inline float
44 bfloat16_to_float32(grn_bfloat16 value)
45 {
46 float value_float = 0;
47 std::memcpy(reinterpret_cast<char *>(&value_float) + sizeof(float) -
48 sizeof(grn_bfloat16),
49 &value,
50 sizeof(grn_bfloat16));
51 return value_float;
52 }
53#endif
54
55 template <typename TYPE>
56 std::enable_if_t<std::is_integral_v<TYPE>, bool>
57 is_zero(TYPE value)
58 {
59 return value == 0;
60 }
61
62 template <typename TYPE>
63 std::enable_if_t<std::is_floating_point_v<TYPE>, bool>
64 is_zero(TYPE value)
65 {
66 return std::abs(value) < std::numeric_limits<TYPE>::epsilon();
67 }
68
69#ifdef GRN_HAVE_BFLOAT16
70 template <typename TYPE>
71 std::enable_if_t<std::is_same_v<TYPE, grn_bfloat16>, bool>
72 is_zero(TYPE value)
73 {
74 return is_zero(bfloat16_to_float32(value));
75 }
76#endif
77 }; // namespace numeric
78
79 namespace bulk {
80 template <typename TYPE>
81 TYPE
82 get(grn_ctx *ctx, grn_obj *bulk, TYPE default_value)
83 {
84 switch (bulk->header.domain) {
85 case GRN_DB_BOOL:
86 return static_cast<TYPE>(GRN_BOOL_VALUE(bulk));
87 case GRN_DB_INT8:
88 return static_cast<TYPE>(GRN_INT8_VALUE(bulk));
89 case GRN_DB_UINT8:
90 return static_cast<TYPE>(GRN_UINT8_VALUE(bulk));
91 case GRN_DB_INT16:
92 return static_cast<TYPE>(GRN_INT16_VALUE(bulk));
93 case GRN_DB_UINT16:
94 return static_cast<TYPE>(GRN_UINT16_VALUE(bulk));
95 case GRN_DB_INT32:
96 return static_cast<TYPE>(GRN_INT32_VALUE(bulk));
97 case GRN_DB_UINT32:
98 return static_cast<TYPE>(GRN_UINT32_VALUE(bulk));
99 case GRN_DB_INT64:
100 return static_cast<TYPE>(GRN_INT64_VALUE(bulk));
101 case GRN_DB_UINT64:
102 return static_cast<TYPE>(GRN_UINT64_VALUE(bulk));
103#ifdef GRN_HAVE_BFLOAT16
104 case GRN_DB_BFLOAT16:
105 return static_cast<TYPE>(GRN_BFLOAT16_VALUE(bulk));
106#endif
107 case GRN_DB_FLOAT32:
108 return static_cast<TYPE>(GRN_FLOAT32_VALUE(bulk));
109 case GRN_DB_FLOAT:
110 return static_cast<TYPE>(GRN_FLOAT_VALUE(bulk));
111 case GRN_DB_TIME:
112 return static_cast<TYPE>(GRN_TIME_VALUE(bulk));
113 default:
114 return default_value;
115 }
116 }
117
118 template <typename NUMERIC>
119 grn_rc
120 set(grn_ctx *ctx, grn_obj *bulk, NUMERIC value)
121 {
122 switch (bulk->header.domain) {
123 case GRN_DB_BOOL:
124 GRN_BOOL_SET(ctx, bulk, !numeric::is_zero(value));
125 break;
126 case GRN_DB_INT8:
127 GRN_INT8_SET(ctx, bulk, value);
128 break;
129 case GRN_DB_UINT8:
130 GRN_UINT8_SET(ctx, bulk, value);
131 break;
132 case GRN_DB_INT16:
133 GRN_INT16_SET(ctx, bulk, value);
134 break;
135 case GRN_DB_UINT16:
136 GRN_UINT16_SET(ctx, bulk, value);
137 break;
138 case GRN_DB_INT32:
139 GRN_INT32_SET(ctx, bulk, value);
140 break;
141 case GRN_DB_UINT32:
142 GRN_UINT32_SET(ctx, bulk, value);
143 break;
144 case GRN_DB_INT64:
145 GRN_INT64_SET(ctx, bulk, value);
146 break;
147 case GRN_DB_UINT64:
148 GRN_UINT64_SET(ctx, bulk, value);
149 break;
150#ifdef GRN_HAVE_BFLOAT16
151 case GRN_DB_BFLOAT16:
152 GRN_BFLOAT16_SET(ctx, bulk, numeric::to_bfloat16(value));
153 break;
154#endif
155 case GRN_DB_FLOAT32:
156 GRN_FLOAT32_SET(ctx, bulk, value);
157 break;
158 case GRN_DB_FLOAT:
159 GRN_FLOAT_SET(ctx, bulk, value);
160 break;
161 case GRN_DB_TIME:
162 if constexpr (std::is_floating_point_v<NUMERIC>) {
163 GRN_TIME_SET(ctx, bulk, std::llround(value * GRN_TIME_USEC_PER_SEC));
164 } else {
165 GRN_TIME_SET(ctx, bulk, value);
166 }
167 default:
168 break;
169 }
170 return ctx->rc;
171 }
172
173 template <typename NUMERIC>
174 grn_rc
175 put(grn_ctx *ctx, grn_obj *bulk, NUMERIC value)
176 {
177 switch (bulk->header.domain) {
178 case GRN_DB_BOOL:
179 GRN_BOOL_PUT(ctx, bulk, !numeric::is_zero(value));
180 break;
181 case GRN_DB_INT8:
182 GRN_INT8_PUT(ctx, bulk, value);
183 break;
184 case GRN_DB_UINT8:
185 GRN_UINT8_PUT(ctx, bulk, value);
186 break;
187 case GRN_DB_INT16:
188 GRN_INT16_PUT(ctx, bulk, value);
189 break;
190 case GRN_DB_UINT16:
191 GRN_UINT16_PUT(ctx, bulk, value);
192 break;
193 case GRN_DB_INT32:
194 GRN_INT32_PUT(ctx, bulk, value);
195 break;
196 case GRN_DB_UINT32:
197 GRN_UINT32_PUT(ctx, bulk, value);
198 break;
199 case GRN_DB_INT64:
200 GRN_INT64_PUT(ctx, bulk, value);
201 break;
202 case GRN_DB_UINT64:
203 GRN_UINT64_PUT(ctx, bulk, value);
204 break;
205#ifdef GRN_HAVE_BFLOAT16
206 case GRN_DB_BFLOAT16:
207 GRN_BFLOAT16_PUT(ctx, bulk, numeric::to_bfloat16(value));
208 break;
209#endif
210 case GRN_DB_FLOAT32:
211 GRN_FLOAT32_PUT(ctx, bulk, value);
212 break;
213 case GRN_DB_FLOAT:
214 GRN_FLOAT_PUT(ctx, bulk, value);
215 break;
216 case GRN_DB_TIME:
217 if constexpr (std::is_floating_point_v<NUMERIC>) {
218 GRN_TIME_PUT(ctx, bulk, std::llround(value * GRN_TIME_USEC_PER_SEC));
219 } else {
220 GRN_TIME_PUT(ctx, bulk, value);
221 }
222 default:
223 break;
224 }
225 return ctx->rc;
226 }
227 }; // namespace bulk
228
229 class TextBulk {
230 public:
231 TextBulk(grn_ctx *ctx, uint8_t flags = 0) : ctx_(ctx)
232 {
233 GRN_TEXT_INIT(&bulk_, flags);
234 }
235
236 ~TextBulk() { GRN_OBJ_FIN(ctx_, &bulk_); }
237
238 grn_obj *
240 {
241 return &bulk_;
242 }
243
244 std::string
246 {
247 return std::string(GRN_TEXT_VALUE(&bulk_), GRN_TEXT_LEN(&bulk_));
248 };
249
250 private:
251 grn_ctx *ctx_;
252 grn_obj bulk_;
253 };
254} // namespace grn
Definition bulk.hpp:229
~TextBulk()
Definition bulk.hpp:236
TextBulk(grn_ctx *ctx, uint8_t flags=0)
Definition bulk.hpp:231
std::string value()
Definition bulk.hpp:245
grn_obj * operator*()
Definition bulk.hpp:239
#define GRN_FLOAT_VALUE(obj)
Definition groonga.h:3108
#define GRN_INT16_VALUE(obj)
Definition groonga.h:3100
#define GRN_INT32_PUT(ctx, obj, val)
Definition groonga.h:3177
#define GRN_BOOL_SET(ctx, obj, val)
Definition groonga.h:2879
grn_rc
Definition groonga.h:61
#define GRN_INT8_VALUE(obj)
Definition groonga.h:3098
#define GRN_INT16_PUT(ctx, obj, val)
Definition groonga.h:3167
#define GRN_BFLOAT16_VALUE(obj)
Definition groonga.h:3106
#define GRN_TIME_VALUE
Definition groonga.h:3109
#define GRN_UINT16_PUT(ctx, obj, val)
Definition groonga.h:3172
#define GRN_INT8_SET(ctx, obj, val)
Definition groonga.h:2884
#define GRN_FLOAT32_PUT(ctx, obj, val)
Definition groonga.h:3202
#define GRN_UINT8_VALUE(obj)
Definition groonga.h:3099
#define GRN_UINT32_VALUE(obj)
Definition groonga.h:3103
#define GRN_TEXT_VALUE(obj)
Definition groonga.h:2785
#define GRN_UINT64_VALUE(obj)
Definition groonga.h:3105
#define GRN_INT64_VALUE(obj)
Definition groonga.h:3104
#define GRN_UINT8_SET(ctx, obj, val)
Definition groonga.h:2889
#define GRN_FLOAT_SET(ctx, obj, val)
Definition groonga.h:2934
#define GRN_OBJ_FIN(ctx, obj)
Definition groonga.h:958
#define GRN_FLOAT32_SET(ctx, obj, val)
Definition groonga.h:2929
#define GRN_UINT32_SET(ctx, obj, val)
Definition groonga.h:2909
#define GRN_INT32_SET(ctx, obj, val)
Definition groonga.h:2904
#define GRN_UINT64_SET(ctx, obj, val)
Definition groonga.h:2919
#define GRN_TIME_SET
Definition groonga.h:2939
#define GRN_INT8_PUT(ctx, obj, val)
Definition groonga.h:3157
#define GRN_INT16_SET(ctx, obj, val)
Definition groonga.h:2894
#define GRN_UINT64_PUT(ctx, obj, val)
Definition groonga.h:3192
#define GRN_INT32_VALUE(obj)
Definition groonga.h:3102
#define GRN_BFLOAT16_SET(ctx, obj, val)
Definition groonga.h:2924
#define GRN_UINT16_VALUE(obj)
Definition groonga.h:3101
@ GRN_DB_UINT8
Definition groonga.h:1069
@ GRN_DB_INT8
Definition groonga.h:1068
@ GRN_DB_TIME
Definition groonga.h:1077
@ GRN_DB_BFLOAT16
Definition groonga.h:1084
@ GRN_DB_UINT16
Definition groonga.h:1071
@ GRN_DB_INT32
Definition groonga.h:1072
@ GRN_DB_BOOL
Definition groonga.h:1067
@ GRN_DB_INT16
Definition groonga.h:1070
@ GRN_DB_FLOAT32
Definition groonga.h:1083
@ GRN_DB_UINT32
Definition groonga.h:1073
@ GRN_DB_UINT64
Definition groonga.h:1075
@ GRN_DB_INT64
Definition groonga.h:1074
@ GRN_DB_FLOAT
Definition groonga.h:1076
#define GRN_UINT32_PUT(ctx, obj, val)
Definition groonga.h:3182
#define GRN_UINT8_PUT(ctx, obj, val)
Definition groonga.h:3162
#define GRN_BOOL_PUT(ctx, obj, val)
Definition groonga.h:3152
#define GRN_TIME_PUT
Definition groonga.h:3212
#define GRN_BOOL_VALUE(obj)
Definition groonga.h:3097
#define GRN_FLOAT32_VALUE(obj)
Definition groonga.h:3107
#define GRN_TEXT_INIT(obj, flags)
Definition groonga.h:2750
#define GRN_INT64_SET(ctx, obj, val)
Definition groonga.h:2914
#define GRN_BFLOAT16_PUT(ctx, obj, val)
Definition groonga.h:3197
#define GRN_UINT16_SET(ctx, obj, val)
Definition groonga.h:2899
#define GRN_INT64_PUT(ctx, obj, val)
Definition groonga.h:3187
#define GRN_TEXT_LEN(obj)
Definition groonga.h:2786
#define GRN_FLOAT_PUT(ctx, obj, val)
Definition groonga.h:3207
grn_rc set(grn_ctx *ctx, grn_obj *bulk, NUMERIC value)
Definition bulk.hpp:120
grn_rc put(grn_ctx *ctx, grn_obj *bulk, NUMERIC value)
Definition bulk.hpp:175
TYPE get(grn_ctx *ctx, grn_obj *bulk, TYPE default_value)
Definition bulk.hpp:82
std::enable_if_t< std::is_integral_v< TYPE >, bool > is_zero(TYPE value)
Definition bulk.hpp:57
Definition arrow.hpp:25
Definition groonga.h:351
grn_rc rc
Definition groonga.h:352
grn_id domain
Definition groonga.h:916
Definition groonga.h:919
grn_obj_header header
Definition groonga.h:920
#define GRN_TIME_USEC_PER_SEC
Definition time.h:44