layout.h 41.4 KB
Newer Older
Kenton Varda's avatar
Kenton Varda committed
1 2
// Copyright (c) 2013-2014 Sandstorm Development Group, Inc. and contributors
// Licensed under the MIT License:
3
//
Kenton Varda's avatar
Kenton Varda committed
4 5 6 7 8 9
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
10
//
Kenton Varda's avatar
Kenton Varda committed
11 12
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
13
//
Kenton Varda's avatar
Kenton Varda committed
14 15 16 17 18 19 20
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
21

Kenton Varda's avatar
Kenton Varda committed
22 23
// This file is NOT intended for use by clients, except in generated code.
//
Kenton Varda's avatar
Kenton Varda committed
24 25 26 27
// This file defines low-level, non-type-safe classes for traversing the Cap'n Proto memory layout
// (which is also its wire format).  Code generated by the Cap'n Proto compiler uses these classes,
// as does other parts of the Cap'n proto library which provide a higher-level interface for
// dynamic introspection.
Kenton Varda's avatar
Kenton Varda committed
28

Kenton Varda's avatar
Kenton Varda committed
29 30
#ifndef CAPNP_LAYOUT_H_
#define CAPNP_LAYOUT_H_
31

32 33 34 35
#if defined(__GNUC__) && !CAPNP_HEADER_WARNINGS
#pragma GCC system_header
#endif

Kenton Varda's avatar
Kenton Varda committed
36
#include <kj/common.h>
37
#include <kj/memory.h>
38
#include "common.h"
Kenton Varda's avatar
Kenton Varda committed
39
#include "blob.h"
40
#include "endian.h"
41

42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
#if __mips__ && !defined(CAPNP_CANONICALIZE_NAN)
#define CAPNP_CANONICALIZE_NAN 1
// Explicitly detect NaNs and canonicalize them to the quiet NaN value as would be returned by
// __builtin_nan("") on systems implementing the IEEE-754 recommended (but not required) NaN
// signalling/quiet differentiation (such as x86).  Unfortunately, some architectures -- in
// particular, MIPS -- represent quiet vs. signalling nans differently than the rest of the world.
// Canonicalizing them makes output consistent (which is important!), but hurts performance
// slightly.
//
// Note that trying to convert MIPS NaNs to standard NaNs without losing data doesn't work.
// Signaling vs. quiet is indicated by a bit, with the meaning being the opposite on MIPS vs.
// everyone else.  It would be great if we could just flip that bit, but we can't, because if the
// significand is all-zero, then the value is infinity rather than NaN.  This means that on most
// machines, where the bit indicates quietness, there is one more quiet NaN value than signalling
// NaN value, whereas on MIPS there is one more sNaN than qNaN, and thus there is no isomorphic
// mapping that properly preserves quietness.  Instead of doing something hacky, we just give up
// and blow away NaN payloads, because no one uses them anyway.
#endif

61
namespace capnp {
62

63
#if !CAPNP_LITE
64
class ClientHook;
65
#endif  // !CAPNP_LITE
66

67
namespace _ {  // private
Kenton Varda's avatar
Kenton Varda committed
68

69 70
class PointerBuilder;
class PointerReader;
71 72 73 74
class StructBuilder;
class StructReader;
class ListBuilder;
class ListReader;
75
class OrphanBuilder;
76
struct WirePointer;
77
struct WireHelpers;
78 79
class SegmentReader;
class SegmentBuilder;
80
class Arena;
81
class BuilderArena;
82

83
// =============================================================================
84 85

typedef decltype(BITS / ELEMENTS) BitsPerElement;
86
typedef decltype(POINTERS / ELEMENTS) PointersPerElement;
87

Kenton Varda's avatar
Kenton Varda committed
88 89 90 91 92 93 94 95 96 97
static constexpr BitsPerElement BITS_PER_ELEMENT_TABLE[8] = {
    0 * BITS / ELEMENTS,
    1 * BITS / ELEMENTS,
    8 * BITS / ELEMENTS,
    16 * BITS / ELEMENTS,
    32 * BITS / ELEMENTS,
    64 * BITS / ELEMENTS,
    0 * BITS / ELEMENTS,
    0 * BITS / ELEMENTS
};
98

99
inline KJ_CONSTEXPR() BitsPerElement dataBitsPerElement(ElementSize size) {
100
  return _::BITS_PER_ELEMENT_TABLE[static_cast<int>(size)];
101 102
}

103 104
inline constexpr PointersPerElement pointersPerElement(ElementSize size) {
  return size == ElementSize::POINTER ? 1 * POINTERS / ELEMENTS : 0 * POINTERS / ELEMENTS;
105 106
}

107
template <size_t size> struct ElementSizeForByteSize;
108 109 110 111
template <> struct ElementSizeForByteSize<1> { static constexpr ElementSize value = ElementSize::BYTE; };
template <> struct ElementSizeForByteSize<2> { static constexpr ElementSize value = ElementSize::TWO_BYTES; };
template <> struct ElementSizeForByteSize<4> { static constexpr ElementSize value = ElementSize::FOUR_BYTES; };
template <> struct ElementSizeForByteSize<8> { static constexpr ElementSize value = ElementSize::EIGHT_BYTES; };
112 113

template <typename T> struct ElementSizeForType {
114
  static constexpr ElementSize value =
115
      // Primitive types that aren't special-cased below can be determined from sizeof().
116
      CAPNP_KIND(T) == Kind::PRIMITIVE ? ElementSizeForByteSize<sizeof(T)>::value :
117 118
      CAPNP_KIND(T) == Kind::ENUM ? ElementSize::TWO_BYTES :
      CAPNP_KIND(T) == Kind::STRUCT ? ElementSize::INLINE_COMPOSITE :
119 120

      // Everything else is a pointer.
121
      ElementSize::POINTER;
122 123
};

124
// Void and bool are special.
125 126
template <> struct ElementSizeForType<Void> { static constexpr ElementSize value = ElementSize::VOID; };
template <> struct ElementSizeForType<bool> { static constexpr ElementSize value = ElementSize::BIT; };
127

128 129
// Lists and blobs are pointers, not structs.
template <typename T, bool b> struct ElementSizeForType<List<T, b>> {
130
  static constexpr ElementSize value = ElementSize::POINTER;
131 132
};
template <> struct ElementSizeForType<Text> {
133
  static constexpr ElementSize value = ElementSize::POINTER;
134 135
};
template <> struct ElementSizeForType<Data> {
136
  static constexpr ElementSize value = ElementSize::POINTER;
137
};
138

139
template <typename T>
140
inline constexpr ElementSize elementSizeForType() {
141 142 143
  return ElementSizeForType<T>::value;
}

144 145 146 147 148 149 150 151 152 153 154 155 156 157
struct MessageSizeCounts {
  WordCount64 wordCount;
  uint capCount;

  MessageSizeCounts& operator+=(const MessageSizeCounts& other) {
    wordCount += other.wordCount;
    capCount += other.capCount;
    return *this;
  }

  MessageSize asPublic() {
    return MessageSize { wordCount / WORDS, capCount };
  }
};
158 159 160

// =============================================================================

161 162 163 164 165 166 167 168 169
template <int wordCount>
union AlignedData {
  // Useful for declaring static constant data blobs as an array of bytes, but forcing those
  // bytes to be word-aligned.

  uint8_t bytes[wordCount * sizeof(word)];
  word words[wordCount];
};

170 171
struct StructSize {
  WordCount16 data;
172
  WirePointerCount16 pointers;
173

174
  inline constexpr WordCount total() const { return data + pointers * WORDS_PER_POINTER; }
175 176

  StructSize() = default;
177 178
  inline constexpr StructSize(WordCount data, WirePointerCount pointers)
      : data(data), pointers(pointers) {}
179 180
};

181
template <typename T, typename CapnpPrivate = typename T::_capnpPrivate>
182
inline constexpr StructSize structSize() {
183
  return StructSize(CapnpPrivate::dataWordSize * WORDS, CapnpPrivate::pointerCount * POINTERS);
184
}
185

186 187
// -------------------------------------------------------------------
// Masking of default values
188

189
template <typename T, Kind kind = CAPNP_KIND(T)> struct Mask_;
190 191 192 193
template <typename T> struct Mask_<T, Kind::PRIMITIVE> { typedef T Type; };
template <typename T> struct Mask_<T, Kind::ENUM> { typedef uint16_t Type; };
template <> struct Mask_<float, Kind::PRIMITIVE> { typedef uint32_t Type; };
template <> struct Mask_<double, Kind::PRIMITIVE> { typedef uint64_t Type; };
194

195
template <typename T> struct Mask_<T, Kind::OTHER> {
196 197 198
  // Union discriminants end up here.
  static_assert(sizeof(T) == 2, "Don't know how to mask this type.");
  typedef uint16_t Type;
199 200
};

201
template <typename T>
202
using Mask = typename Mask_<T>::Type;
203 204

template <typename T>
205
KJ_ALWAYS_INLINE(Mask<T> mask(T value, Mask<T> mask));
206
template <typename T>
207
KJ_ALWAYS_INLINE(T unmask(Mask<T> value, Mask<T> mask));
208 209

template <typename T>
210 211
inline Mask<T> mask(T value, Mask<T> mask) {
  return static_cast<Mask<T> >(value) ^ mask;
212 213 214 215
}

template <>
inline uint32_t mask<float>(float value, uint32_t mask) {
216 217
#if CAPNP_CANONICALIZE_NAN
  if (value != value) {
218
    return 0x7fc00000u ^ mask;
219 220 221
  }
#endif

222 223 224 225 226 227 228 229
  uint32_t i;
  static_assert(sizeof(i) == sizeof(value), "float is not 32 bits?");
  memcpy(&i, &value, sizeof(value));
  return i ^ mask;
}

template <>
inline uint64_t mask<double>(double value, uint64_t mask) {
230 231
#if CAPNP_CANONICALIZE_NAN
  if (value != value) {
232
    return 0x7ff8000000000000ull ^ mask;
233 234 235
  }
#endif

236 237 238 239 240 241 242
  uint64_t i;
  static_assert(sizeof(i) == sizeof(value), "double is not 64 bits?");
  memcpy(&i, &value, sizeof(value));
  return i ^ mask;
}

template <typename T>
243
inline T unmask(Mask<T> value, Mask<T> mask) {
244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264
  return static_cast<T>(value ^ mask);
}

template <>
inline float unmask<float>(uint32_t value, uint32_t mask) {
  value ^= mask;
  float result;
  static_assert(sizeof(result) == sizeof(value), "float is not 32 bits?");
  memcpy(&result, &value, sizeof(value));
  return result;
}

template <>
inline double unmask<double>(uint64_t value, uint64_t mask) {
  value ^= mask;
  double result;
  static_assert(sizeof(result) == sizeof(value), "double is not 64 bits?");
  memcpy(&result, &value, sizeof(value));
  return result;
}

265 266
// -------------------------------------------------------------------

267 268 269 270 271 272
class PointerBuilder: public kj::DisallowConstCopy {
  // Represents a single pointer, usually embedded in a struct or a list.

public:
  inline PointerBuilder(): segment(nullptr), pointer(nullptr) {}

Kenton Varda's avatar
Kenton Varda committed
273 274 275 276
  static inline PointerBuilder getRoot(SegmentBuilder* segment, word* location);
  // Get a PointerBuilder representing a message root located in the given segment at the given
  // location.

277
  bool isNull();
278 279
  bool isStruct();
  bool isList();
280 281

  StructBuilder getStruct(StructSize size, const word* defaultValue);
282
  ListBuilder getList(ElementSize elementSize, const word* defaultValue);
283
  ListBuilder getStructList(StructSize elementSize, const word* defaultValue);
284
  ListBuilder getListAnySize(const word* defaultValue);
285
  template <typename T> typename T::Builder getBlob(const void* defaultValue,ByteCount defaultSize);
286
#if !CAPNP_LITE
287
  kj::Own<ClientHook> getCapability();
288
#endif  // !CAPNP_LITE
289 290 291 292 293
  // Get methods:  Get the value.  If it is null, initialize it to a copy of the default value.
  // The default value is encoded as an "unchecked message" for structs, lists, and objects, or a
  // simple byte array for blobs.

  StructBuilder initStruct(StructSize size);
294
  ListBuilder initList(ElementSize elementSize, ElementCount elementCount);
295 296 297 298 299 300 301 302
  ListBuilder initStructList(ElementCount elementCount, StructSize size);
  template <typename T> typename T::Builder initBlob(ByteCount size);
  // Init methods:  Initialize the pointer to a newly-allocated object, discarding the existing
  // object.

  void setStruct(const StructReader& value);
  void setList(const ListReader& value);
  template <typename T> void setBlob(typename T::Reader value);
303
#if !CAPNP_LITE
304
  void setCapability(kj::Own<ClientHook>&& cap);
305
#endif  // !CAPNP_LITE
306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323
  // Set methods:  Initialize the pointer to a newly-allocated copy of the given value, discarding
  // the existing object.

  void adopt(OrphanBuilder&& orphan);
  // Set the pointer to point at the given orphaned value.

  OrphanBuilder disown();
  // Set the pointer to null and return its previous value as an orphan.

  void clear();
  // Clear the pointer to null, discarding its previous value.

  void transferFrom(PointerBuilder other);
  // Equivalent to `adopt(other.disown())`.

  void copyFrom(PointerReader other);
  // Equivalent to `set(other.get())`.

324 325
  PointerReader asReader() const;

326
  BuilderArena* getArena() const;
327 328
  // Get the arena containing this pointer.

329 330 331 332 333 334 335 336 337 338 339 340 341 342 343
private:
  SegmentBuilder* segment;     // Memory segment in which the pointer resides.
  WirePointer* pointer;        // Pointer to the pointer.

  inline PointerBuilder(SegmentBuilder* segment, WirePointer* pointer)
      : segment(segment), pointer(pointer) {}

  friend class StructBuilder;
  friend class ListBuilder;
};

class PointerReader {
public:
  inline PointerReader(): segment(nullptr), pointer(nullptr), nestingLimit(0x7fffffff) {}

Kenton Varda's avatar
Kenton Varda committed
344 345 346 347 348 349 350
  static PointerReader getRoot(SegmentReader* segment, const word* location, int nestingLimit);
  // Get a PointerReader representing a message root located in the given segment at the given
  // location.

  static inline PointerReader getRootUnchecked(const word* location);
  // Get a PointerReader for an unchecked message.

351
  MessageSizeCounts targetSize() const;
Kenton Varda's avatar
Kenton Varda committed
352 353 354 355 356 357
  // Return the total size of the target object and everything to which it points.  Does not count
  // far pointer overhead.  This is useful for deciding how much space is needed to copy the object
  // into a flat array.  However, the caller is advised NOT to treat this value as secure.  Instead,
  // use the result as a hint for allocating the first segment, do the copy, and then throw an
  // exception if it overruns.

358
  bool isNull() const;
359 360
  bool isStruct() const;
  bool isList() const;
361 362

  StructReader getStruct(const word* defaultValue) const;
363
  ListReader getList(ElementSize expectedElementSize, const word* defaultValue) const;
364
  ListReader getListAnySize(const word* defaultValue) const;
365 366
  template <typename T>
  typename T::Reader getBlob(const void* defaultValue, ByteCount defaultSize) const;
367
#if !CAPNP_LITE
368
  kj::Own<ClientHook> getCapability() const;
369
#endif  // !CAPNP_LITE
370 371 372 373 374 375 376 377 378
  // Get methods:  Get the value.  If it is null, return the default value instead.
  // The default value is encoded as an "unchecked message" for structs, lists, and objects, or a
  // simple byte array for blobs.

  const word* getUnchecked() const;
  // If this is an unchecked message, get a word* pointing at the location of the pointer.  This
  // word* can actually be passed to readUnchecked() to read the designated sub-object later.  If
  // this isn't an unchecked message, throws an exception.

379 380 381
  kj::Maybe<Arena&> getArena() const;
  // Get the arena containing this pointer.

382 383 384 385 386 387 388 389 390 391 392 393 394
private:
  SegmentReader* segment;      // Memory segment in which the pointer resides.
  const WirePointer* pointer;  // Pointer to the pointer.  null = treat as null pointer.

  int nestingLimit;
  // Limits the depth of message structures to guard against stack-overflow-based DoS attacks.
  // Once this reaches zero, further pointers will be pruned.

  inline PointerReader(SegmentReader* segment, const WirePointer* pointer, int nestingLimit)
      : segment(segment), pointer(pointer), nestingLimit(nestingLimit) {}

  friend class StructReader;
  friend class ListReader;
395
  friend class PointerBuilder;
396
  friend class OrphanBuilder;
397 398
};

399
// -------------------------------------------------------------------
Kenton Varda's avatar
Kenton Varda committed
400

401
class StructBuilder: public kj::DisallowConstCopy {
402
public:
403
  inline StructBuilder(): segment(nullptr), data(nullptr), pointers(nullptr) {}
404

405 406 407 408
  inline word* getLocation() { return reinterpret_cast<word*>(data); }
  // Get the object's location.  Only valid for independently-allocated objects (i.e. not list
  // elements).

409
  inline BitCount getDataSectionSize() const { return dataSize; }
410
  inline WirePointerCount getPointerSectionSize() const { return pointerCount; }
411
  inline Data::Builder getDataSectionAsBlob();
412
  inline _::ListBuilder getPointerSectionAsList();
413

414 415 416 417
  template <typename T>
  KJ_ALWAYS_INLINE(bool hasDataField(ElementCount offset));
  // Return true if the field is set to something other than its default value.

418
  template <typename T>
419
  KJ_ALWAYS_INLINE(T getDataField(ElementCount offset));
420
  // Gets the data field value of the given type at the given offset.  The offset is measured in
421 422
  // multiples of the field size, determined by the type.

423
  template <typename T>
424
  KJ_ALWAYS_INLINE(T getDataField(ElementCount offset, Mask<T> mask));
425 426 427
  // Like getDataField() but applies the given XOR mask to the data on load.  Used for reading
  // fields with non-zero default values.

428
  template <typename T>
429
  KJ_ALWAYS_INLINE(void setDataField(
430
      ElementCount offset, kj::NoInfer<T> value));
431 432
  // Sets the data field value at the given offset.

433
  template <typename T>
434
  KJ_ALWAYS_INLINE(void setDataField(
435
      ElementCount offset, kj::NoInfer<T> value, Mask<T> mask));
436 437 438
  // Like setDataField() but applies the given XOR mask before storing.  Used for writing fields
  // with non-zero default values.

439 440
  KJ_ALWAYS_INLINE(PointerBuilder getPointerField(WirePointerCount ptrIndex));
  // Get a builder for a pointer field given the index within the pointer section.
441

442 443 444
  void clearAll();
  // Clear all pointers and data.

445 446 447 448 449
  void transferContentFrom(StructBuilder other);
  // Adopt all pointers from `other`, and also copy all data.  If `other`'s sections are larger
  // than this, the extra data is not transferred, meaning there is a risk of data loss when
  // transferring from messages built with future versions of the protocol.

450 451 452 453 454
  void copyContentFrom(StructReader other);
  // Copy content from `other`.  If `other`'s sections are larger than this, the extra data is not
  // copied, meaning there is a risk of data loss when copying from messages built with future
  // versions of the protocol.

455
  StructReader asReader() const;
456
  // Gets a StructReader pointing at the same memory.
457

458 459 460
  BuilderArena* getArena();
  // Gets the arena in which this object is allocated.

461
private:
462
  SegmentBuilder* segment;     // Memory segment in which the struct resides.
Kenton Varda's avatar
Kenton Varda committed
463
  void* data;                  // Pointer to the encoded data.
464
  WirePointer* pointers;   // Pointer to the encoded pointers.
465

466
  BitCount32 dataSize;
467
  // Size of data section.  We use a bit count rather than a word count to more easily handle the
468 469
  // case of struct lists encoded with less than a word per element.

470
  WirePointerCount16 pointerCount;  // Size of the pointer section.
471

472
  inline StructBuilder(SegmentBuilder* segment, void* data, WirePointer* pointers,
473
                       BitCount dataSize, WirePointerCount pointerCount)
474
      : segment(segment), data(data), pointers(pointers),
475
        dataSize(dataSize), pointerCount(pointerCount) {}
476

477
  friend class ListBuilder;
478
  friend struct WireHelpers;
479
  friend class OrphanBuilder;
480 481
};

482
class StructReader {
483
public:
484
  inline StructReader()
485
      : segment(nullptr), data(nullptr), pointers(nullptr), dataSize(0),
486
        pointerCount(0), nestingLimit(0x7fffffff) {}
487

Kenton Varda's avatar
Kenton Varda committed
488 489
  const void* getLocation() const { return data; }

490
  inline BitCount getDataSectionSize() const { return dataSize; }
491
  inline WirePointerCount getPointerSectionSize() const { return pointerCount; }
492
  inline Data::Reader getDataSectionAsBlob();
493
  inline _::ListReader getPointerSectionAsList();
494

495 496 497 498
  template <typename T>
  KJ_ALWAYS_INLINE(bool hasDataField(ElementCount offset) const);
  // Return true if the field is set to something other than its default value.

499
  template <typename T>
500
  KJ_ALWAYS_INLINE(T getDataField(ElementCount offset) const);
501
  // Get the data field value of the given type at the given offset.  The offset is measured in
502
  // multiples of the field size, determined by the type.  Returns zero if the offset is past the
503
  // end of the struct's data section.
504 505

  template <typename T>
506
  KJ_ALWAYS_INLINE(
507
      T getDataField(ElementCount offset, Mask<T> mask) const);
508 509
  // Like getDataField(offset), but applies the given XOR mask to the result.  Used for reading
  // fields with non-zero default values.
510

511 512 513
  KJ_ALWAYS_INLINE(PointerReader getPointerField(WirePointerCount ptrIndex) const);
  // Get a reader for a pointer field given the index within the pointer section.  If the index
  // is out-of-bounds, returns a null pointer.
514

515
  MessageSizeCounts totalSize() const;
516 517 518 519 520 521
  // Return the total size of the struct and everything to which it points.  Does not count far
  // pointer overhead.  This is useful for deciding how much space is needed to copy the struct
  // into a flat array.  However, the caller is advised NOT to treat this value as secure.  Instead,
  // use the result as a hint for allocating the first segment, do the copy, and then throw an
  // exception if it overruns.

522
private:
Kenton Varda's avatar
Kenton Varda committed
523
  SegmentReader* segment;  // Memory segment in which the struct resides.
524

525
  const void* data;
526
  const WirePointer* pointers;
527

528
  BitCount32 dataSize;
529
  // Size of data section.  We use a bit count rather than a word count to more easily handle the
530 531
  // case of struct lists encoded with less than a word per element.

532
  WirePointerCount16 pointerCount;  // Size of the pointer section.
533

534
  int nestingLimit;
535 536
  // Limits the depth of message structures to guard against stack-overflow-based DoS attacks.
  // Once this reaches zero, further pointers will be pruned.
537
  // TODO(perf):  Limit to 16 bits for better packing?
538

539
  inline StructReader(SegmentReader* segment, const void* data, const WirePointer* pointers,
540
                      BitCount dataSize, WirePointerCount pointerCount, int nestingLimit)
541
      : segment(segment), data(data), pointers(pointers),
542
        dataSize(dataSize), pointerCount(pointerCount),
543
        nestingLimit(nestingLimit) {}
544

545 546
  friend class ListReader;
  friend class StructBuilder;
547 548 549 550 551
  friend struct WireHelpers;
};

// -------------------------------------------------------------------

552 553 554 555 556 557 558 559 560 561 562 563
#if _MSC_VER
  // TODO(msvc): MSVC insists List{Reader,Builder}::operator= are deleted unless we
  //   define them explicitly. Don't know why, especially for the readers.
#define MSVC_DEFAULT_ASSIGNMENT_WORKAROUND(const_, type) \
  inline type& operator=(const_ type& other) { \
    memcpy(this, &other, sizeof(*this)); \
    return *this; \
  }
#else
#define MSVC_DEFAULT_ASSIGNMENT_WORKAROUND(const_, type)
#endif

564
class ListBuilder: public kj::DisallowConstCopy {
565
public:
566
  inline ListBuilder()
567
      : segment(nullptr), ptr(nullptr), elementCount(0 * ELEMENTS),
568
        step(0 * BITS / ELEMENTS) {}
569

570
  MSVC_DEFAULT_ASSIGNMENT_WORKAROUND(, ListBuilder)
571

572
  inline word* getLocation() {
573
    // Get the object's location.
574

575
    if (elementSize == ElementSize::INLINE_COMPOSITE) {
576
      return reinterpret_cast<word*>(ptr) - POINTER_SIZE_IN_WORDS;
577 578
    } else {
      return reinterpret_cast<word*>(ptr);
579 580 581
    }
  }

582 583
  inline ElementSize getElementSize() const { return elementSize; }

584
  inline ElementCount size() const;
585 586
  // The number of elements in the list.

587 588 589 590
  Text::Builder asText();
  Data::Builder asData();
  // Reinterpret the list as a blob.  Throws an exception if the elements are not byte-sized.

591
  template <typename T>
592
  KJ_ALWAYS_INLINE(T getDataElement(ElementCount index));
593 594 595
  // Get the element of the given type at the given index.

  template <typename T>
596
  KJ_ALWAYS_INLINE(void setDataElement(
597
      ElementCount index, kj::NoInfer<T> value));
598
  // Set the element at the given index.
599

600
  KJ_ALWAYS_INLINE(PointerBuilder getPointerElement(ElementCount index));
Kenton Varda's avatar
Kenton Varda committed
601

602
  StructBuilder getStructElement(ElementCount index);
603

604 605
  ListReader asReader() const;
  // Get a ListReader pointing at the same memory.
606

607 608 609
  BuilderArena* getArena();
  // Gets the arena in which this object is allocated.

610
private:
Kenton Varda's avatar
Kenton Varda committed
611
  SegmentBuilder* segment;  // Memory segment in which the list resides.
612

613
  byte* ptr;  // Pointer to list content.
614

615
  ElementCount elementCount;  // Number of elements in the list.
616

617
  decltype(BITS / ELEMENTS) step;
618
  // The distance between elements.
619 620

  BitCount32 structDataSize;
621
  WirePointerCount16 structPointerCount;
622 623
  // The struct properties to use when interpreting the elements as structs.  All lists can be
  // interpreted as struct lists, so these are always filled in.
624

625 626
  ElementSize elementSize;
  // The element size as a ElementSize. This is only really needed to disambiguate INLINE_COMPOSITE
627 628
  // from other types when the overall size is exactly zero or one words.

629
  inline ListBuilder(SegmentBuilder* segment, void* ptr,
630
                     decltype(BITS / ELEMENTS) step, ElementCount size,
631
                     BitCount structDataSize, WirePointerCount structPointerCount,
632
                     ElementSize elementSize)
633
      : segment(segment), ptr(reinterpret_cast<byte*>(ptr)),
634
        elementCount(size), step(step), structDataSize(structDataSize),
635
        structPointerCount(structPointerCount), elementSize(elementSize) {}
636

637
  friend class StructBuilder;
638
  friend struct WireHelpers;
639
  friend class OrphanBuilder;
640 641
};

642
class ListReader {
643
public:
644
  inline ListReader()
645
      : segment(nullptr), ptr(nullptr), elementCount(0), step(0 * BITS / ELEMENTS),
646
        structDataSize(0), structPointerCount(0), nestingLimit(0x7fffffff) {}
647

648
  MSVC_DEFAULT_ASSIGNMENT_WORKAROUND(const, ListReader)
649

650
  inline ElementCount size() const;
651 652
  // The number of elements in the list.

653 654
  inline ElementSize getElementSize() const { return elementSize; }

655 656 657 658
  Text::Reader asText();
  Data::Reader asData();
  // Reinterpret the list as a blob.  Throws an exception if the elements are not byte-sized.

659
  template <typename T>
660
  KJ_ALWAYS_INLINE(T getDataElement(ElementCount index) const);
661 662
  // Get the element of the given type at the given index.

663
  KJ_ALWAYS_INLINE(PointerReader getPointerElement(ElementCount index) const);
664

665
  StructReader getStructElement(ElementCount index) const;
666

667
private:
Kenton Varda's avatar
Kenton Varda committed
668
  SegmentReader* segment;  // Memory segment in which the list resides.
669

670
  const byte* ptr;  // Pointer to list content.
671

672
  ElementCount elementCount;  // Number of elements in the list.
673

674
  decltype(BITS / ELEMENTS) step;
675
  // The distance between elements.
676

677
  BitCount32 structDataSize;
678
  WirePointerCount16 structPointerCount;
679 680
  // The struct properties to use when interpreting the elements as structs.  All lists can be
  // interpreted as struct lists, so these are always filled in.
681

682 683
  ElementSize elementSize;
  // The element size as a ElementSize. This is only really needed to disambiguate INLINE_COMPOSITE
684 685
  // from other types when the overall size is exactly zero or one words.

686
  int nestingLimit;
687 688 689
  // Limits the depth of message structures to guard against stack-overflow-based DoS attacks.
  // Once this reaches zero, further pointers will be pruned.

690
  inline ListReader(SegmentReader* segment, const void* ptr,
691
                    ElementCount elementCount, decltype(BITS / ELEMENTS) step,
692
                    BitCount structDataSize, WirePointerCount structPointerCount,
693
                    ElementSize elementSize, int nestingLimit)
694
      : segment(segment), ptr(reinterpret_cast<const byte*>(ptr)), elementCount(elementCount),
695
        step(step), structDataSize(structDataSize),
696 697
        structPointerCount(structPointerCount), elementSize(elementSize),
        nestingLimit(nestingLimit) {}
698

699 700
  friend class StructReader;
  friend class ListBuilder;
701
  friend struct WireHelpers;
702
  friend class OrphanBuilder;
703 704
};

705 706
// -------------------------------------------------------------------

707 708 709 710
class OrphanBuilder {
public:
  inline OrphanBuilder(): segment(nullptr), location(nullptr) { memset(&tag, 0, sizeof(tag)); }
  OrphanBuilder(const OrphanBuilder& other) = delete;
711
  inline OrphanBuilder(OrphanBuilder&& other) noexcept;
712
  inline ~OrphanBuilder() noexcept(false);
713 714 715

  static OrphanBuilder initStruct(BuilderArena* arena, StructSize size);
  static OrphanBuilder initList(BuilderArena* arena, ElementCount elementCount,
716
                                ElementSize elementSize);
717 718 719 720 721 722 723
  static OrphanBuilder initStructList(BuilderArena* arena, ElementCount elementCount,
                                      StructSize elementSize);
  static OrphanBuilder initText(BuilderArena* arena, ByteCount size);
  static OrphanBuilder initData(BuilderArena* arena, ByteCount size);

  static OrphanBuilder copy(BuilderArena* arena, StructReader copyFrom);
  static OrphanBuilder copy(BuilderArena* arena, ListReader copyFrom);
724
  static OrphanBuilder copy(BuilderArena* arena, PointerReader copyFrom);
725 726
  static OrphanBuilder copy(BuilderArena* arena, Text::Reader copyFrom);
  static OrphanBuilder copy(BuilderArena* arena, Data::Reader copyFrom);
727
#if !CAPNP_LITE
728
  static OrphanBuilder copy(BuilderArena* arena, kj::Own<ClientHook> copyFrom);
729
#endif  // !CAPNP_LITE
730

731 732
  static OrphanBuilder referenceExternalData(BuilderArena* arena, Data::Reader data);

733 734 735
  OrphanBuilder& operator=(const OrphanBuilder& other) = delete;
  inline OrphanBuilder& operator=(OrphanBuilder&& other);

736 737
  inline bool operator==(decltype(nullptr)) const { return location == nullptr; }
  inline bool operator!=(decltype(nullptr)) const { return location != nullptr; }
738 739 740 741

  StructBuilder asStruct(StructSize size);
  // Interpret as a struct, or throw an exception if not a struct.

742
  ListBuilder asList(ElementSize elementSize);
743 744 745 746 747 748 749 750 751 752
  // Interpret as a list, or throw an exception if not a list.  elementSize cannot be
  // INLINE_COMPOSITE -- use asStructList() instead.

  ListBuilder asStructList(StructSize elementSize);
  // Interpret as a struct list, or throw an exception if not a list.

  Text::Builder asText();
  Data::Builder asData();
  // Interpret as a blob, or throw an exception if not a blob.

753
  StructReader asStructReader(StructSize size) const;
754
  ListReader asListReader(ElementSize elementSize) const;
755
#if !CAPNP_LITE
756
  kj::Own<ClientHook> asCapability() const;
757
#endif  // !CAPNP_LITE
758 759 760
  Text::Reader asTextReader() const;
  Data::Reader asDataReader() const;

761 762
  void truncate(ElementCount size, bool isText);

763 764 765 766 767 768 769
private:
  static_assert(1 * POINTERS * WORDS_PER_POINTER == 1 * WORDS,
                "This struct assumes a pointer is one word.");
  word tag;
  // Contains an encoded WirePointer representing this object.  WirePointer is defined in
  // layout.c++, but fits in a word.
  //
770 771 772 773 774 775 776
  // This may be a FAR pointer.  Even in that case, `location` points to the eventual destination
  // of that far pointer.  The reason we keep the far pointer around rather than just making `tag`
  // represent the final destination is because if the eventual adopter of the pointer is not in
  // the target's segment then it may be useful to reuse the far pointer landing pad.
  //
  // If `tag` is not a far pointer, its offset is garbage; only `location` points to the actual
  // target.
777 778

  SegmentBuilder* segment;
779
  // Segment in which the object resides.
780 781

  word* location;
782 783
  // Pointer to the object, or nullptr if the pointer is null.  For capabilities, we make this
  // point at `tag` just so that it is non-null for operator==, but it is never used.
784 785 786 787 788 789 790

  inline OrphanBuilder(const void* tagPtr, SegmentBuilder* segment, word* location)
      : segment(segment), location(location) {
    memcpy(&tag, tagPtr, sizeof(tag));
  }

  inline WirePointer* tagAsPtr() { return reinterpret_cast<WirePointer*>(&tag); }
791
  inline const WirePointer* tagAsPtr() const { return reinterpret_cast<const WirePointer*>(&tag); }
792 793 794 795 796 797 798 799

  void euthanize();
  // Erase the target object, zeroing it out and possibly reclaiming the memory.  Called when
  // the OrphanBuilder is being destroyed or overwritten and it is non-null.

  friend struct WireHelpers;
};

800 801 802
// =======================================================================================
// Internal implementation details...

803 804 805 806 807 808 809 810 811 812 813
// These are defined in the source file.
template <> typename Text::Builder PointerBuilder::initBlob<Text>(ByteCount size);
template <> void PointerBuilder::setBlob<Text>(typename Text::Reader value);
template <> typename Text::Builder PointerBuilder::getBlob<Text>(const void* defaultValue, ByteCount defaultSize);
template <> typename Text::Reader PointerReader::getBlob<Text>(const void* defaultValue, ByteCount defaultSize) const;

template <> typename Data::Builder PointerBuilder::initBlob<Data>(ByteCount size);
template <> void PointerBuilder::setBlob<Data>(typename Data::Reader value);
template <> typename Data::Builder PointerBuilder::getBlob<Data>(const void* defaultValue, ByteCount defaultSize);
template <> typename Data::Reader PointerReader::getBlob<Data>(const void* defaultValue, ByteCount defaultSize) const;

Kenton Varda's avatar
Kenton Varda committed
814 815 816 817 818 819 820 821
inline PointerBuilder PointerBuilder::getRoot(SegmentBuilder* segment, word* location) {
  return PointerBuilder(segment, reinterpret_cast<WirePointer*>(location));
}

inline PointerReader PointerReader::getRootUnchecked(const word* location) {
  return PointerReader(nullptr, reinterpret_cast<const WirePointer*>(location), 0x7fffffff);
}

822 823
// -------------------------------------------------------------------

824
inline Data::Builder StructBuilder::getDataSectionAsBlob() {
825
  return Data::Builder(reinterpret_cast<byte*>(data), dataSize / BITS_PER_BYTE / BYTES);
826 827
}

828
inline _::ListBuilder StructBuilder::getPointerSectionAsList() {
829 830
  return _::ListBuilder(segment, pointers, pointerCount * BITS_PER_POINTER / ELEMENTS,
                        pointerCount * (1 * ELEMENTS / POINTERS),
831
                        0 * BITS, 1 * POINTERS, ElementSize::POINTER);
832 833
}

834 835 836 837 838 839 840 841 842 843
template <typename T>
inline bool StructBuilder::hasDataField(ElementCount offset) {
  return getDataField<Mask<T>>(offset) != 0;
}

template <>
inline bool StructBuilder::hasDataField<Void>(ElementCount offset) {
  return false;
}

844
template <typename T>
845
inline T StructBuilder::getDataField(ElementCount offset) {
846
  return reinterpret_cast<WireValue<T>*>(data)[offset / ELEMENTS].get();
847 848 849
}

template <>
850
inline bool StructBuilder::getDataField<bool>(ElementCount offset) {
851
  BitCount boffset = offset * (1 * BITS / ELEMENTS);
852
  byte* b = reinterpret_cast<byte*>(data) + boffset / BITS_PER_BYTE;
853
  return (*reinterpret_cast<uint8_t*>(b) & (1 << (boffset % BITS_PER_BYTE / BITS))) != 0;
854 855
}

856
template <>
857
inline Void StructBuilder::getDataField<Void>(ElementCount offset) {
858
  return VOID;
859 860
}

861
template <typename T>
862
inline T StructBuilder::getDataField(ElementCount offset, Mask<T> mask) {
863
  return unmask<T>(getDataField<Mask<T> >(offset), mask);
864 865
}

866
template <typename T>
867
inline void StructBuilder::setDataField(ElementCount offset, kj::NoInfer<T> value) {
868
  reinterpret_cast<WireValue<T>*>(data)[offset / ELEMENTS].set(value);
869 870
}

871 872 873 874 875 876 877 878 879 880 881 882
#if CAPNP_CANONICALIZE_NAN
// Use mask() on floats and doubles to make sure we canonicalize NaNs.
template <>
inline void StructBuilder::setDataField<float>(ElementCount offset, float value) {
  setDataField<uint32_t>(offset, mask<float>(value, 0));
}
template <>
inline void StructBuilder::setDataField<double>(ElementCount offset, double value) {
  setDataField<uint64_t>(offset, mask<double>(value, 0));
}
#endif

883
template <>
884
inline void StructBuilder::setDataField<bool>(ElementCount offset, bool value) {
885
  BitCount boffset = offset * (1 * BITS / ELEMENTS);
886
  byte* b = reinterpret_cast<byte*>(data) + boffset / BITS_PER_BYTE;
887 888 889
  uint bitnum = boffset % BITS_PER_BYTE / BITS;
  *reinterpret_cast<uint8_t*>(b) = (*reinterpret_cast<uint8_t*>(b) & ~(1 << bitnum))
                                 | (static_cast<uint8_t>(value) << bitnum);
890 891
}

892
template <>
893
inline void StructBuilder::setDataField<Void>(ElementCount offset, Void value) {}
894

895
template <typename T>
896
inline void StructBuilder::setDataField(ElementCount offset, kj::NoInfer<T> value, Mask<T> m) {
897
  setDataField<Mask<T> >(offset, mask<T>(value, m));
898 899
}

900 901 902 903 904 905
inline PointerBuilder StructBuilder::getPointerField(WirePointerCount ptrIndex) {
  // Hacky because WirePointer is defined in the .c++ file (so is incomplete here).
  return PointerBuilder(segment, reinterpret_cast<WirePointer*>(
      reinterpret_cast<word*>(pointers) + ptrIndex * WORDS_PER_POINTER));
}

906 907
// -------------------------------------------------------------------

908
inline Data::Reader StructReader::getDataSectionAsBlob() {
909
  return Data::Reader(reinterpret_cast<const byte*>(data), dataSize / BITS_PER_BYTE / BYTES);
910 911
}

912
inline _::ListReader StructReader::getPointerSectionAsList() {
913 914
  return _::ListReader(segment, pointers, pointerCount * (1 * ELEMENTS / POINTERS),
                       pointerCount * BITS_PER_POINTER / ELEMENTS,
915
                       0 * BITS, 1 * POINTERS, ElementSize::POINTER, nestingLimit);
916 917
}

918
template <typename T>
919 920 921 922 923 924 925 926 927 928 929
inline bool StructReader::hasDataField(ElementCount offset) const {
  return getDataField<Mask<T>>(offset) != 0;
}

template <>
inline bool StructReader::hasDataField<Void>(ElementCount offset) const {
  return false;
}

template <typename T>
inline T StructReader::getDataField(ElementCount offset) const {
930
  if ((offset + 1 * ELEMENTS) * capnp::bitsPerElement<T>() <= dataSize) {
931
    return reinterpret_cast<const WireValue<T>*>(data)[offset / ELEMENTS].get();
932
  } else {
933
    return static_cast<T>(0);
934
  }
935 936 937
}

template <>
938
inline bool StructReader::getDataField<bool>(ElementCount offset) const {
939
  BitCount boffset = offset * (1 * BITS / ELEMENTS);
940
  if (boffset < dataSize) {
941
    const byte* b = reinterpret_cast<const byte*>(data) + boffset / BITS_PER_BYTE;
942 943
    return (*reinterpret_cast<const uint8_t*>(b) & (1 << (boffset % BITS_PER_BYTE / BITS))) != 0;
  } else {
944
    return false;
945
  }
946 947
}

948
template <>
949
inline Void StructReader::getDataField<Void>(ElementCount offset) const {
950
  return VOID;
951 952
}

953
template <typename T>
954 955
T StructReader::getDataField(ElementCount offset, Mask<T> mask) const {
  return unmask<T>(getDataField<Mask<T> >(offset), mask);
956 957
}

958 959 960 961 962 963 964 965 966 967
inline PointerReader StructReader::getPointerField(WirePointerCount ptrIndex) const {
  if (ptrIndex < pointerCount) {
    // Hacky because WirePointer is defined in the .c++ file (so is incomplete here).
    return PointerReader(segment, reinterpret_cast<const WirePointer*>(
        reinterpret_cast<const word*>(pointers) + ptrIndex * WORDS_PER_POINTER), nestingLimit);
  } else{
    return PointerReader();
  }
}

968 969
// -------------------------------------------------------------------

970
inline ElementCount ListBuilder::size() const { return elementCount; }
971 972

template <typename T>
973
inline T ListBuilder::getDataElement(ElementCount index) {
974 975
  return reinterpret_cast<WireValue<T>*>(ptr + index * step / BITS_PER_BYTE)->get();

Kenton Varda's avatar
Kenton Varda committed
976
  // TODO(perf):  Benchmark this alternate implementation, which I suspect may make better use of
977 978 979 980
  //   the x86 SIB byte.  Also use it for all the other getData/setData implementations below, and
  //   the various non-inline methods that look up pointers.
  //   Also if using this, consider changing ptr back to void* instead of byte*.
//  return reinterpret_cast<WireValue<T>*>(ptr)[
981
//      index / ELEMENTS * (step / capnp::bitsPerElement<T>())].get();
982 983 984
}

template <>
985
inline bool ListBuilder::getDataElement<bool>(ElementCount index) {
986 987
  // Ignore step for bit lists because bit lists cannot be upgraded to struct lists.
  BitCount bindex = index * (1 * BITS / ELEMENTS);
988
  byte* b = ptr + bindex / BITS_PER_BYTE;
989
  return (*reinterpret_cast<uint8_t*>(b) & (1 << (bindex % BITS_PER_BYTE / BITS))) != 0;
990 991
}

992
template <>
993
inline Void ListBuilder::getDataElement<Void>(ElementCount index) {
994
  return VOID;
995 996
}

997
template <typename T>
998
inline void ListBuilder::setDataElement(ElementCount index, kj::NoInfer<T> value) {
999
  reinterpret_cast<WireValue<T>*>(ptr + index * step / BITS_PER_BYTE)->set(value);
1000 1001
}

1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013
#if CAPNP_CANONICALIZE_NAN
// Use mask() on floats and doubles to make sure we canonicalize NaNs.
template <>
inline void ListBuilder::setDataElement<float>(ElementCount index, float value) {
  setDataElement<uint32_t>(index, mask<float>(value, 0));
}
template <>
inline void ListBuilder::setDataElement<double>(ElementCount index, double value) {
  setDataElement<uint64_t>(index, mask<double>(value, 0));
}
#endif

1014
template <>
1015
inline void ListBuilder::setDataElement<bool>(ElementCount index, bool value) {
1016 1017
  // Ignore stepBytes for bit lists because bit lists cannot be upgraded to struct lists.
  BitCount bindex = index * (1 * BITS / ELEMENTS);
1018
  byte* b = ptr + bindex / BITS_PER_BYTE;
1019 1020 1021
  uint bitnum = bindex % BITS_PER_BYTE / BITS;
  *reinterpret_cast<uint8_t*>(b) = (*reinterpret_cast<uint8_t*>(b) & ~(1 << bitnum))
                                 | (static_cast<uint8_t>(value) << bitnum);
1022 1023
}

1024
template <>
1025
inline void ListBuilder::setDataElement<Void>(ElementCount index, Void value) {}
1026

1027 1028 1029 1030 1031
inline PointerBuilder ListBuilder::getPointerElement(ElementCount index) {
  return PointerBuilder(segment,
      reinterpret_cast<WirePointer*>(ptr + index * step / BITS_PER_BYTE));
}

1032 1033
// -------------------------------------------------------------------

1034
inline ElementCount ListReader::size() const { return elementCount; }
1035 1036

template <typename T>
1037
inline T ListReader::getDataElement(ElementCount index) const {
1038
  return reinterpret_cast<const WireValue<T>*>(ptr + index * step / BITS_PER_BYTE)->get();
1039 1040 1041
}

template <>
1042
inline bool ListReader::getDataElement<bool>(ElementCount index) const {
1043 1044
  // Ignore step for bit lists because bit lists cannot be upgraded to struct lists.
  BitCount bindex = index * (1 * BITS / ELEMENTS);
1045
  const byte* b = ptr + bindex / BITS_PER_BYTE;
1046
  return (*reinterpret_cast<const uint8_t*>(b) & (1 << (bindex % BITS_PER_BYTE / BITS))) != 0;
1047 1048
}

1049 1050
template <>
inline Void ListReader::getDataElement<Void>(ElementCount index) const {
1051
  return VOID;
1052 1053
}

1054 1055 1056 1057
inline PointerReader ListReader::getPointerElement(ElementCount index) const {
  return PointerReader(segment,
      reinterpret_cast<const WirePointer*>(ptr + index * step / BITS_PER_BYTE), nestingLimit);
}
1058

1059 1060
// -------------------------------------------------------------------

1061
inline OrphanBuilder::OrphanBuilder(OrphanBuilder&& other) noexcept
1062 1063 1064 1065 1066 1067
    : segment(other.segment), location(other.location) {
  memcpy(&tag, &other.tag, sizeof(tag));  // Needs memcpy to comply with aliasing rules.
  other.segment = nullptr;
  other.location = nullptr;
}

1068
inline OrphanBuilder::~OrphanBuilder() noexcept(false) {
1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087
  if (segment != nullptr) euthanize();
}

inline OrphanBuilder& OrphanBuilder::operator=(OrphanBuilder&& other) {
  // With normal smart pointers, it's important to handle the case where the incoming pointer
  // is actually transitively owned by this one.  In this case, euthanize() would destroy `other`
  // before we copied it.  This isn't possible in the case of `OrphanBuilder` because it only
  // owns message objects, and `other` is not itself a message object, therefore cannot possibly
  // be transitively owned by `this`.

  if (segment != nullptr) euthanize();
  segment = other.segment;
  location = other.location;
  memcpy(&tag, &other.tag, sizeof(tag));  // Needs memcpy to comply with aliasing rules.
  other.segment = nullptr;
  other.location = nullptr;
  return *this;
}

1088
}  // namespace _ (private)
1089
}  // namespace capnp
1090

Kenton Varda's avatar
Kenton Varda committed
1091
#endif  // CAPNP_LAYOUT_H_