1
1
/*
2
- * Copyright (c) 2019-2021 , NVIDIA CORPORATION.
2
+ * Copyright (c) 2019-2022 , NVIDIA CORPORATION.
3
3
*
4
4
* Licensed under the Apache License, Version 2.0 (the "License");
5
5
* you may not use this file except in compliance with the License.
@@ -131,6 +131,67 @@ struct Metadata {
131
131
std::vector<StripeStatistics> stripeStats;
132
132
};
133
133
134
+ int inline constexpr encode_field_number (int field_number, ProtofType field_type) noexcept
135
+ {
136
+ return (field_number * 8 ) + static_cast <int >(field_type);
137
+ }
138
+
139
+ namespace {
140
+ template <typename base_t ,
141
+ typename std::enable_if_t <!std::is_arithmetic<base_t >::value and
142
+ !std::is_enum<base_t >::value>* = nullptr >
143
+ int static constexpr encode_field_number_base (int field_number) noexcept
144
+ {
145
+ return encode_field_number (field_number, ProtofType::FIXEDLEN);
146
+ }
147
+
148
+ template <typename base_t ,
149
+ typename std::enable_if_t <std::is_integral<base_t >::value or
150
+ std::is_enum<base_t >::value>* = nullptr >
151
+ int static constexpr encode_field_number_base (int field_number) noexcept
152
+ {
153
+ return encode_field_number (field_number, ProtofType::VARINT);
154
+ }
155
+
156
+ template <typename base_t , typename std::enable_if_t <std::is_same_v<base_t , float >>* = nullptr >
157
+ int static constexpr encode_field_number_base (int field_number) noexcept
158
+ {
159
+ return encode_field_number (field_number, ProtofType::FIXED32);
160
+ }
161
+
162
+ template <typename base_t , typename std::enable_if_t <std::is_same_v<base_t , double >>* = nullptr >
163
+ int static constexpr encode_field_number_base (int field_number) noexcept
164
+ {
165
+ return encode_field_number (field_number, ProtofType::FIXED64);
166
+ }
167
+ }; // namespace
168
+
169
+ template <
170
+ typename T,
171
+ typename std::enable_if_t <!std::is_class<T>::value or std::is_same_v<T, std::string>>* = nullptr >
172
+ int constexpr encode_field_number (int field_number) noexcept
173
+ {
174
+ return encode_field_number_base<T>(field_number);
175
+ }
176
+
177
+ // containters change the field number encoding
178
+ template <
179
+ typename T,
180
+ typename std::enable_if_t <std::is_same<T, std::vector<typename T::value_type>>::value>* = nullptr >
181
+ int constexpr encode_field_number (int field_number) noexcept
182
+ {
183
+ return encode_field_number_base<T>(field_number);
184
+ }
185
+
186
+ // optional fields don't change the field number encoding
187
+ template <typename T,
188
+ typename std::enable_if_t <
189
+ std::is_same<T, std::optional<typename T::value_type>>::value>* = nullptr >
190
+ int constexpr encode_field_number (int field_number) noexcept
191
+ {
192
+ return encode_field_number_base<typename T::value_type>(field_number);
193
+ }
194
+
134
195
/* *
135
196
* @brief Class for parsing Orc's Protocol Buffers encoded metadata
136
197
*/
@@ -181,60 +242,6 @@ class ProtobufReader {
181
242
template <typename T, typename ... Operator>
182
243
void function_builder (T& s, size_t maxlen, std::tuple<Operator...>& op);
183
244
184
- template <typename base_t ,
185
- typename std::enable_if_t <!std::is_arithmetic<base_t >::value and
186
- !std::is_enum<base_t >::value>* = nullptr >
187
- int static constexpr encode_field_number_base (int field_number) noexcept
188
- {
189
- return (field_number * 8 ) + PB_TYPE_FIXEDLEN;
190
- }
191
-
192
- template <typename base_t ,
193
- typename std::enable_if_t <std::is_integral<base_t >::value or
194
- std::is_enum<base_t >::value>* = nullptr >
195
- int static constexpr encode_field_number_base (int field_number) noexcept
196
- {
197
- return (field_number * 8 ) + PB_TYPE_VARINT;
198
- }
199
-
200
- template <typename base_t , typename std::enable_if_t <std::is_same_v<base_t , float >>* = nullptr >
201
- int static constexpr encode_field_number_base (int field_number) noexcept
202
- {
203
- return (field_number * 8 ) + PB_TYPE_FIXED32;
204
- }
205
-
206
- template <typename base_t , typename std::enable_if_t <std::is_same_v<base_t , double >>* = nullptr >
207
- int static constexpr encode_field_number_base (int field_number) noexcept
208
- {
209
- return (field_number * 8 ) + PB_TYPE_FIXED64;
210
- }
211
-
212
- template <typename T,
213
- typename std::enable_if_t <!std::is_class<T>::value or std::is_same_v<T, std::string>>* =
214
- nullptr >
215
- int static constexpr encode_field_number (int field_number) noexcept
216
- {
217
- return encode_field_number_base<T>(field_number);
218
- }
219
-
220
- // containters change the field number encoding
221
- template <typename T,
222
- typename std::enable_if_t <
223
- std::is_same<T, std::vector<typename T::value_type>>::value>* = nullptr >
224
- int static constexpr encode_field_number (int field_number) noexcept
225
- {
226
- return encode_field_number_base<T>(field_number);
227
- }
228
-
229
- // optional fields don't change the field number encoding
230
- template <typename T,
231
- typename std::enable_if_t <
232
- std::is_same<T, std::optional<typename T::value_type>>::value>* = nullptr >
233
- int static constexpr encode_field_number (int field_number) noexcept
234
- {
235
- return encode_field_number_base<typename T::value_type>(field_number);
236
- }
237
-
238
245
uint32_t read_field_size (const uint8_t * end);
239
246
240
247
template <typename T, typename std::enable_if_t <std::is_integral<T>::value>* = nullptr >
@@ -470,16 +477,28 @@ class ProtobufWriter {
470
477
public:
471
478
ProtobufWriter () { m_buf = nullptr ; }
472
479
ProtobufWriter (std::vector<uint8_t >* output) { m_buf = output; }
473
- void putb (uint8_t v) { m_buf->push_back (v); }
480
+ uint32_t put_byte (uint8_t v)
481
+ {
482
+ m_buf->push_back (v);
483
+ return 1 ;
484
+ }
485
+ template <typename T>
486
+ uint32_t put_bytes (host_span<T const > values)
487
+ {
488
+ static_assert (sizeof (T) == 1 );
489
+ m_buf->reserve (m_buf->size () + values.size ());
490
+ m_buf->insert (m_buf->end (), values.begin (), values.end ());
491
+ return values.size ();
492
+ }
474
493
uint32_t put_uint (uint64_t v)
475
494
{
476
495
int l = 1 ;
477
496
while (v > 0x7f ) {
478
- putb (static_cast <uint8_t >(v | 0x80 ));
497
+ put_byte (static_cast <uint8_t >(v | 0x80 ));
479
498
v >>= 7 ;
480
499
l++;
481
500
}
482
- putb (static_cast <uint8_t >(v));
501
+ put_byte (static_cast <uint8_t >(v));
483
502
return l;
484
503
}
485
504
uint32_t put_int (int64_t v)
@@ -493,7 +512,8 @@ class ProtobufWriter {
493
512
int32_t data_ofs,
494
513
int32_t data2_blk,
495
514
int32_t data2_ofs,
496
- TypeKind kind);
515
+ TypeKind kind,
516
+ ColStatsBlob const * stats);
497
517
498
518
public:
499
519
size_t write (const PostScript&);
0 commit comments