comparison win64-msvc/include/capnp/list.h @ 148:b4bfdf10c4b3

Update Win64 capnp builds to v0.6
author Chris Cannam <cannam@all-day-breakfast.com>
date Mon, 22 May 2017 18:56:49 +0100
parents 42a73082be24
children
comparison
equal deleted inserted replaced
147:45360b968bf4 148:b4bfdf10c4b3
112 typedef List<T> Reads; 112 typedef List<T> Reads;
113 113
114 inline Reader(): reader(_::elementSizeForType<T>()) {} 114 inline Reader(): reader(_::elementSizeForType<T>()) {}
115 inline explicit Reader(_::ListReader reader): reader(reader) {} 115 inline explicit Reader(_::ListReader reader): reader(reader) {}
116 116
117 inline uint size() const { return reader.size() / ELEMENTS; } 117 inline uint size() const { return unbound(reader.size() / ELEMENTS); }
118 inline T operator[](uint index) const { 118 inline T operator[](uint index) const {
119 KJ_IREQUIRE(index < size()); 119 KJ_IREQUIRE(index < size());
120 return reader.template getDataElement<T>(index * ELEMENTS); 120 return reader.template getDataElement<T>(bounded(index) * ELEMENTS);
121 } 121 }
122 122
123 typedef _::IndexingIterator<const Reader, T> Iterator; 123 typedef _::IndexingIterator<const Reader, T> Iterator;
124 inline Iterator begin() const { return Iterator(this, 0); } 124 inline Iterator begin() const { return Iterator(this, 0); }
125 inline Iterator end() const { return Iterator(this, size()); } 125 inline Iterator end() const { return Iterator(this, size()); }
138 class Builder { 138 class Builder {
139 public: 139 public:
140 typedef List<T> Builds; 140 typedef List<T> Builds;
141 141
142 inline Builder(): builder(_::elementSizeForType<T>()) {} 142 inline Builder(): builder(_::elementSizeForType<T>()) {}
143 inline Builder(decltype(nullptr)) {} 143 inline Builder(decltype(nullptr)): Builder() {}
144 inline explicit Builder(_::ListBuilder builder): builder(builder) {} 144 inline explicit Builder(_::ListBuilder builder): builder(builder) {}
145 145
146 inline operator Reader() const { return Reader(builder.asReader()); } 146 inline operator Reader() const { return Reader(builder.asReader()); }
147 inline Reader asReader() const { return Reader(builder.asReader()); } 147 inline Reader asReader() const { return Reader(builder.asReader()); }
148 148
149 inline uint size() const { return builder.size() / ELEMENTS; } 149 inline uint size() const { return unbound(builder.size() / ELEMENTS); }
150 inline T operator[](uint index) { 150 inline T operator[](uint index) {
151 KJ_IREQUIRE(index < size()); 151 KJ_IREQUIRE(index < size());
152 return builder.template getDataElement<T>(index * ELEMENTS); 152 return builder.template getDataElement<T>(bounded(index) * ELEMENTS);
153 } 153 }
154 inline void set(uint index, T value) { 154 inline void set(uint index, T value) {
155 // Alas, it is not possible to make operator[] return a reference to which you can assign, 155 // Alas, it is not possible to make operator[] return a reference to which you can assign,
156 // since the encoded representation does not necessarily match the compiler's representation 156 // since the encoded representation does not necessarily match the compiler's representation
157 // of the type. We can't even return a clever class that implements operator T() and 157 // of the type. We can't even return a clever class that implements operator T() and
158 // operator=() because it will lead to surprising behavior when using type inference (e.g. 158 // operator=() because it will lead to surprising behavior when using type inference (e.g.
159 // calling a template function with inferred argument types, or using "auto" or "decltype"). 159 // calling a template function with inferred argument types, or using "auto" or "decltype").
160 160
161 builder.template setDataElement<T>(index * ELEMENTS, value); 161 builder.template setDataElement<T>(bounded(index) * ELEMENTS, value);
162 } 162 }
163 163
164 typedef _::IndexingIterator<Builder, T> Iterator; 164 typedef _::IndexingIterator<Builder, T> Iterator;
165 inline Iterator begin() { return Iterator(this, 0); } 165 inline Iterator begin() { return Iterator(this, 0); }
166 inline Iterator end() { return Iterator(this, size()); } 166 inline Iterator end() { return Iterator(this, size()); }
176 176
177 class Pipeline {}; 177 class Pipeline {};
178 178
179 private: 179 private:
180 inline static _::ListBuilder initPointer(_::PointerBuilder builder, uint size) { 180 inline static _::ListBuilder initPointer(_::PointerBuilder builder, uint size) {
181 return builder.initList(_::elementSizeForType<T>(), size * ELEMENTS); 181 return builder.initList(_::elementSizeForType<T>(), bounded(size) * ELEMENTS);
182 } 182 }
183 inline static _::ListBuilder getFromPointer(_::PointerBuilder builder, const word* defaultValue) { 183 inline static _::ListBuilder getFromPointer(_::PointerBuilder builder, const word* defaultValue) {
184 return builder.getList(_::elementSizeForType<T>(), defaultValue); 184 return builder.getList(_::elementSizeForType<T>(), defaultValue);
185 } 185 }
186 inline static _::ListReader getFromPointer( 186 inline static _::ListReader getFromPointer(
208 typedef List<T> Reads; 208 typedef List<T> Reads;
209 209
210 inline Reader(): reader(ElementSize::INLINE_COMPOSITE) {} 210 inline Reader(): reader(ElementSize::INLINE_COMPOSITE) {}
211 inline explicit Reader(_::ListReader reader): reader(reader) {} 211 inline explicit Reader(_::ListReader reader): reader(reader) {}
212 212
213 inline uint size() const { return reader.size() / ELEMENTS; } 213 inline uint size() const { return unbound(reader.size() / ELEMENTS); }
214 inline typename T::Reader operator[](uint index) const { 214 inline typename T::Reader operator[](uint index) const {
215 KJ_IREQUIRE(index < size()); 215 KJ_IREQUIRE(index < size());
216 return typename T::Reader(reader.getStructElement(index * ELEMENTS)); 216 return typename T::Reader(reader.getStructElement(bounded(index) * ELEMENTS));
217 } 217 }
218 218
219 typedef _::IndexingIterator<const Reader, typename T::Reader> Iterator; 219 typedef _::IndexingIterator<const Reader, typename T::Reader> Iterator;
220 inline Iterator begin() const { return Iterator(this, 0); } 220 inline Iterator begin() const { return Iterator(this, 0); }
221 inline Iterator end() const { return Iterator(this, size()); } 221 inline Iterator end() const { return Iterator(this, size()); }
234 class Builder { 234 class Builder {
235 public: 235 public:
236 typedef List<T> Builds; 236 typedef List<T> Builds;
237 237
238 inline Builder(): builder(ElementSize::INLINE_COMPOSITE) {} 238 inline Builder(): builder(ElementSize::INLINE_COMPOSITE) {}
239 inline Builder(decltype(nullptr)) {} 239 inline Builder(decltype(nullptr)): Builder() {}
240 inline explicit Builder(_::ListBuilder builder): builder(builder) {} 240 inline explicit Builder(_::ListBuilder builder): builder(builder) {}
241 241
242 inline operator Reader() const { return Reader(builder.asReader()); } 242 inline operator Reader() const { return Reader(builder.asReader()); }
243 inline Reader asReader() const { return Reader(builder.asReader()); } 243 inline Reader asReader() const { return Reader(builder.asReader()); }
244 244
245 inline uint size() const { return builder.size() / ELEMENTS; } 245 inline uint size() const { return unbound(builder.size() / ELEMENTS); }
246 inline typename T::Builder operator[](uint index) { 246 inline typename T::Builder operator[](uint index) {
247 KJ_IREQUIRE(index < size()); 247 KJ_IREQUIRE(index < size());
248 return typename T::Builder(builder.getStructElement(index * ELEMENTS)); 248 return typename T::Builder(builder.getStructElement(bounded(index) * ELEMENTS));
249 } 249 }
250 250
251 inline void adoptWithCaveats(uint index, Orphan<T>&& orphan) { 251 inline void adoptWithCaveats(uint index, Orphan<T>&& orphan) {
252 // Mostly behaves like you'd expect `adopt` to behave, but with two caveats originating from 252 // Mostly behaves like you'd expect `adopt` to behave, but with two caveats originating from
253 // the fact that structs in a struct list are allocated inline rather than by pointer: 253 // the fact that structs in a struct list are allocated inline rather than by pointer:
261 KJ_IREQUIRE(index < size()); 261 KJ_IREQUIRE(index < size());
262 262
263 // We pass a zero-valued StructSize to asStruct() because we do not want the struct to be 263 // We pass a zero-valued StructSize to asStruct() because we do not want the struct to be
264 // expanded under any circumstances. We're just going to throw it away anyway, and 264 // expanded under any circumstances. We're just going to throw it away anyway, and
265 // transferContentFrom() already carefully compares the struct sizes before transferring. 265 // transferContentFrom() already carefully compares the struct sizes before transferring.
266 builder.getStructElement(index * ELEMENTS).transferContentFrom( 266 builder.getStructElement(bounded(index) * ELEMENTS).transferContentFrom(
267 orphan.builder.asStruct(_::StructSize(0 * WORDS, 0 * POINTERS))); 267 orphan.builder.asStruct(_::StructSize(ZERO * WORDS, ZERO * POINTERS)));
268 } 268 }
269 inline void setWithCaveats(uint index, const typename T::Reader& reader) { 269 inline void setWithCaveats(uint index, const typename T::Reader& reader) {
270 // Mostly behaves like you'd expect `set` to behave, but with a caveat originating from 270 // Mostly behaves like you'd expect `set` to behave, but with a caveat originating from
271 // the fact that structs in a struct list are allocated inline rather than by pointer: 271 // the fact that structs in a struct list are allocated inline rather than by pointer:
272 // If the source struct is larger than the target struct -- say, because the source was built 272 // If the source struct is larger than the target struct -- say, because the source was built
276 // Note: If you are trying to concatenate some lists, use Orphanage::newOrphanConcat() to 276 // Note: If you are trying to concatenate some lists, use Orphanage::newOrphanConcat() to
277 // do it without losing any data in case the source lists come from a newer version of the 277 // do it without losing any data in case the source lists come from a newer version of the
278 // protocol. (Plus, it's easier to use anyhow.) 278 // protocol. (Plus, it's easier to use anyhow.)
279 279
280 KJ_IREQUIRE(index < size()); 280 KJ_IREQUIRE(index < size());
281 builder.getStructElement(index * ELEMENTS).copyContentFrom(reader._reader); 281 builder.getStructElement(bounded(index) * ELEMENTS).copyContentFrom(reader._reader);
282 } 282 }
283 283
284 // There are no init(), set(), adopt(), or disown() methods for lists of structs because the 284 // There are no init(), set(), adopt(), or disown() methods for lists of structs because the
285 // elements of the list are inlined and are initialized when the list is initialized. This 285 // elements of the list are inlined and are initialized when the list is initialized. This
286 // means that init() would be redundant, and set() would risk data loss if the input struct 286 // means that init() would be redundant, and set() would risk data loss if the input struct
301 301
302 class Pipeline {}; 302 class Pipeline {};
303 303
304 private: 304 private:
305 inline static _::ListBuilder initPointer(_::PointerBuilder builder, uint size) { 305 inline static _::ListBuilder initPointer(_::PointerBuilder builder, uint size) {
306 return builder.initStructList(size * ELEMENTS, _::structSize<T>()); 306 return builder.initStructList(bounded(size) * ELEMENTS, _::structSize<T>());
307 } 307 }
308 inline static _::ListBuilder getFromPointer(_::PointerBuilder builder, const word* defaultValue) { 308 inline static _::ListBuilder getFromPointer(_::PointerBuilder builder, const word* defaultValue) {
309 return builder.getStructList(_::structSize<T>(), defaultValue); 309 return builder.getStructList(_::structSize<T>(), defaultValue);
310 } 310 }
311 inline static _::ListReader getFromPointer( 311 inline static _::ListReader getFromPointer(
330 typedef List<List<T>> Reads; 330 typedef List<List<T>> Reads;
331 331
332 inline Reader(): reader(ElementSize::POINTER) {} 332 inline Reader(): reader(ElementSize::POINTER) {}
333 inline explicit Reader(_::ListReader reader): reader(reader) {} 333 inline explicit Reader(_::ListReader reader): reader(reader) {}
334 334
335 inline uint size() const { return reader.size() / ELEMENTS; } 335 inline uint size() const { return unbound(reader.size() / ELEMENTS); }
336 inline typename List<T>::Reader operator[](uint index) const { 336 inline typename List<T>::Reader operator[](uint index) const {
337 KJ_IREQUIRE(index < size()); 337 KJ_IREQUIRE(index < size());
338 return typename List<T>::Reader( 338 return typename List<T>::Reader(_::PointerHelpers<List<T>>::get(
339 _::PointerHelpers<List<T>>::get(reader.getPointerElement(index * ELEMENTS))); 339 reader.getPointerElement(bounded(index) * ELEMENTS)));
340 } 340 }
341 341
342 typedef _::IndexingIterator<const Reader, typename List<T>::Reader> Iterator; 342 typedef _::IndexingIterator<const Reader, typename List<T>::Reader> Iterator;
343 inline Iterator begin() const { return Iterator(this, 0); } 343 inline Iterator begin() const { return Iterator(this, 0); }
344 inline Iterator end() const { return Iterator(this, size()); } 344 inline Iterator end() const { return Iterator(this, size()); }
357 class Builder { 357 class Builder {
358 public: 358 public:
359 typedef List<List<T>> Builds; 359 typedef List<List<T>> Builds;
360 360
361 inline Builder(): builder(ElementSize::POINTER) {} 361 inline Builder(): builder(ElementSize::POINTER) {}
362 inline Builder(decltype(nullptr)) {} 362 inline Builder(decltype(nullptr)): Builder() {}
363 inline explicit Builder(_::ListBuilder builder): builder(builder) {} 363 inline explicit Builder(_::ListBuilder builder): builder(builder) {}
364 364
365 inline operator Reader() const { return Reader(builder.asReader()); } 365 inline operator Reader() const { return Reader(builder.asReader()); }
366 inline Reader asReader() const { return Reader(builder.asReader()); } 366 inline Reader asReader() const { return Reader(builder.asReader()); }
367 367
368 inline uint size() const { return builder.size() / ELEMENTS; } 368 inline uint size() const { return unbound(builder.size() / ELEMENTS); }
369 inline typename List<T>::Builder operator[](uint index) { 369 inline typename List<T>::Builder operator[](uint index) {
370 KJ_IREQUIRE(index < size()); 370 KJ_IREQUIRE(index < size());
371 return typename List<T>::Builder( 371 return typename List<T>::Builder(_::PointerHelpers<List<T>>::get(
372 _::PointerHelpers<List<T>>::get(builder.getPointerElement(index * ELEMENTS))); 372 builder.getPointerElement(bounded(index) * ELEMENTS)));
373 } 373 }
374 inline typename List<T>::Builder init(uint index, uint size) { 374 inline typename List<T>::Builder init(uint index, uint size) {
375 KJ_IREQUIRE(index < this->size()); 375 KJ_IREQUIRE(index < this->size());
376 return typename List<T>::Builder( 376 return typename List<T>::Builder(_::PointerHelpers<List<T>>::init(
377 _::PointerHelpers<List<T>>::init(builder.getPointerElement(index * ELEMENTS), size)); 377 builder.getPointerElement(bounded(index) * ELEMENTS), size));
378 } 378 }
379 inline void set(uint index, typename List<T>::Reader value) { 379 inline void set(uint index, typename List<T>::Reader value) {
380 KJ_IREQUIRE(index < size()); 380 KJ_IREQUIRE(index < size());
381 builder.getPointerElement(index * ELEMENTS).setList(value.reader); 381 builder.getPointerElement(bounded(index) * ELEMENTS).setList(value.reader);
382 } 382 }
383 void set(uint index, std::initializer_list<ReaderFor<T>> value) { 383 void set(uint index, std::initializer_list<ReaderFor<T>> value) {
384 KJ_IREQUIRE(index < size()); 384 KJ_IREQUIRE(index < size());
385 auto l = init(index, value.size()); 385 auto l = init(index, value.size());
386 uint i = 0; 386 uint i = 0;
388 l.set(i++, element); 388 l.set(i++, element);
389 } 389 }
390 } 390 }
391 inline void adopt(uint index, Orphan<T>&& value) { 391 inline void adopt(uint index, Orphan<T>&& value) {
392 KJ_IREQUIRE(index < size()); 392 KJ_IREQUIRE(index < size());
393 builder.getPointerElement(index * ELEMENTS).adopt(kj::mv(value.builder)); 393 builder.getPointerElement(bounded(index) * ELEMENTS).adopt(kj::mv(value.builder));
394 } 394 }
395 inline Orphan<T> disown(uint index) { 395 inline Orphan<T> disown(uint index) {
396 KJ_IREQUIRE(index < size()); 396 KJ_IREQUIRE(index < size());
397 return Orphan<T>(builder.getPointerElement(index * ELEMENTS).disown()); 397 return Orphan<T>(builder.getPointerElement(bounded(index) * ELEMENTS).disown());
398 } 398 }
399 399
400 typedef _::IndexingIterator<Builder, typename List<T>::Builder> Iterator; 400 typedef _::IndexingIterator<Builder, typename List<T>::Builder> Iterator;
401 inline Iterator begin() { return Iterator(this, 0); } 401 inline Iterator begin() { return Iterator(this, 0); }
402 inline Iterator end() { return Iterator(this, size()); } 402 inline Iterator end() { return Iterator(this, size()); }
412 412
413 class Pipeline {}; 413 class Pipeline {};
414 414
415 private: 415 private:
416 inline static _::ListBuilder initPointer(_::PointerBuilder builder, uint size) { 416 inline static _::ListBuilder initPointer(_::PointerBuilder builder, uint size) {
417 return builder.initList(ElementSize::POINTER, size * ELEMENTS); 417 return builder.initList(ElementSize::POINTER, bounded(size) * ELEMENTS);
418 } 418 }
419 inline static _::ListBuilder getFromPointer(_::PointerBuilder builder, const word* defaultValue) { 419 inline static _::ListBuilder getFromPointer(_::PointerBuilder builder, const word* defaultValue) {
420 return builder.getList(ElementSize::POINTER, defaultValue); 420 return builder.getList(ElementSize::POINTER, defaultValue);
421 } 421 }
422 inline static _::ListReader getFromPointer( 422 inline static _::ListReader getFromPointer(
439 typedef List<T> Reads; 439 typedef List<T> Reads;
440 440
441 inline Reader(): reader(ElementSize::POINTER) {} 441 inline Reader(): reader(ElementSize::POINTER) {}
442 inline explicit Reader(_::ListReader reader): reader(reader) {} 442 inline explicit Reader(_::ListReader reader): reader(reader) {}
443 443
444 inline uint size() const { return reader.size() / ELEMENTS; } 444 inline uint size() const { return unbound(reader.size() / ELEMENTS); }
445 inline typename T::Reader operator[](uint index) const { 445 inline typename T::Reader operator[](uint index) const {
446 KJ_IREQUIRE(index < size()); 446 KJ_IREQUIRE(index < size());
447 return reader.getPointerElement(index * ELEMENTS).template getBlob<T>(nullptr, 0 * BYTES); 447 return reader.getPointerElement(bounded(index) * ELEMENTS)
448 .template getBlob<T>(nullptr, ZERO * BYTES);
448 } 449 }
449 450
450 typedef _::IndexingIterator<const Reader, typename T::Reader> Iterator; 451 typedef _::IndexingIterator<const Reader, typename T::Reader> Iterator;
451 inline Iterator begin() const { return Iterator(this, 0); } 452 inline Iterator begin() const { return Iterator(this, 0); }
452 inline Iterator end() const { return Iterator(this, size()); } 453 inline Iterator end() const { return Iterator(this, size()); }
465 class Builder { 466 class Builder {
466 public: 467 public:
467 typedef List<T> Builds; 468 typedef List<T> Builds;
468 469
469 inline Builder(): builder(ElementSize::POINTER) {} 470 inline Builder(): builder(ElementSize::POINTER) {}
470 inline Builder(decltype(nullptr)) {} 471 inline Builder(decltype(nullptr)): Builder() {}
471 inline explicit Builder(_::ListBuilder builder): builder(builder) {} 472 inline explicit Builder(_::ListBuilder builder): builder(builder) {}
472 473
473 inline operator Reader() const { return Reader(builder.asReader()); } 474 inline operator Reader() const { return Reader(builder.asReader()); }
474 inline Reader asReader() const { return Reader(builder.asReader()); } 475 inline Reader asReader() const { return Reader(builder.asReader()); }
475 476
476 inline uint size() const { return builder.size() / ELEMENTS; } 477 inline uint size() const { return unbound(builder.size() / ELEMENTS); }
477 inline typename T::Builder operator[](uint index) { 478 inline typename T::Builder operator[](uint index) {
478 KJ_IREQUIRE(index < size()); 479 KJ_IREQUIRE(index < size());
479 return builder.getPointerElement(index * ELEMENTS).template getBlob<T>(nullptr, 0 * BYTES); 480 return builder.getPointerElement(bounded(index) * ELEMENTS)
481 .template getBlob<T>(nullptr, ZERO * BYTES);
480 } 482 }
481 inline void set(uint index, typename T::Reader value) { 483 inline void set(uint index, typename T::Reader value) {
482 KJ_IREQUIRE(index < size()); 484 KJ_IREQUIRE(index < size());
483 builder.getPointerElement(index * ELEMENTS).template setBlob<T>(value); 485 builder.getPointerElement(bounded(index) * ELEMENTS).template setBlob<T>(value);
484 } 486 }
485 inline typename T::Builder init(uint index, uint size) { 487 inline typename T::Builder init(uint index, uint size) {
486 KJ_IREQUIRE(index < this->size()); 488 KJ_IREQUIRE(index < this->size());
487 return builder.getPointerElement(index * ELEMENTS).template initBlob<T>(size * BYTES); 489 return builder.getPointerElement(bounded(index) * ELEMENTS)
490 .template initBlob<T>(bounded(size) * BYTES);
488 } 491 }
489 inline void adopt(uint index, Orphan<T>&& value) { 492 inline void adopt(uint index, Orphan<T>&& value) {
490 KJ_IREQUIRE(index < size()); 493 KJ_IREQUIRE(index < size());
491 builder.getPointerElement(index * ELEMENTS).adopt(kj::mv(value.builder)); 494 builder.getPointerElement(bounded(index) * ELEMENTS).adopt(kj::mv(value.builder));
492 } 495 }
493 inline Orphan<T> disown(uint index) { 496 inline Orphan<T> disown(uint index) {
494 KJ_IREQUIRE(index < size()); 497 KJ_IREQUIRE(index < size());
495 return Orphan<T>(builder.getPointerElement(index * ELEMENTS).disown()); 498 return Orphan<T>(builder.getPointerElement(bounded(index) * ELEMENTS).disown());
496 } 499 }
497 500
498 typedef _::IndexingIterator<Builder, typename T::Builder> Iterator; 501 typedef _::IndexingIterator<Builder, typename T::Builder> Iterator;
499 inline Iterator begin() { return Iterator(this, 0); } 502 inline Iterator begin() { return Iterator(this, 0); }
500 inline Iterator end() { return Iterator(this, size()); } 503 inline Iterator end() { return Iterator(this, size()); }
510 513
511 class Pipeline {}; 514 class Pipeline {};
512 515
513 private: 516 private:
514 inline static _::ListBuilder initPointer(_::PointerBuilder builder, uint size) { 517 inline static _::ListBuilder initPointer(_::PointerBuilder builder, uint size) {
515 return builder.initList(ElementSize::POINTER, size * ELEMENTS); 518 return builder.initList(ElementSize::POINTER, bounded(size) * ELEMENTS);
516 } 519 }
517 inline static _::ListBuilder getFromPointer(_::PointerBuilder builder, const word* defaultValue) { 520 inline static _::ListBuilder getFromPointer(_::PointerBuilder builder, const word* defaultValue) {
518 return builder.getList(ElementSize::POINTER, defaultValue); 521 return builder.getList(ElementSize::POINTER, defaultValue);
519 } 522 }
520 inline static _::ListReader getFromPointer( 523 inline static _::ListReader getFromPointer(