annotate win32-mingw/include/capnp/any.h @ 83:ae30d91d2ffe

Replace these with versions built using an older toolset (so as to avoid ABI compatibilities when linking on Ubuntu 14.04 for packaging purposes)
author Chris Cannam
date Fri, 07 Feb 2020 11:51:13 +0000
parents eccd51b72864
children
rev   line source
Chris@64 1 // Copyright (c) 2013-2014 Sandstorm Development Group, Inc. and contributors
Chris@64 2 // Licensed under the MIT License:
Chris@64 3 //
Chris@64 4 // Permission is hereby granted, free of charge, to any person obtaining a copy
Chris@64 5 // of this software and associated documentation files (the "Software"), to deal
Chris@64 6 // in the Software without restriction, including without limitation the rights
Chris@64 7 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
Chris@64 8 // copies of the Software, and to permit persons to whom the Software is
Chris@64 9 // furnished to do so, subject to the following conditions:
Chris@64 10 //
Chris@64 11 // The above copyright notice and this permission notice shall be included in
Chris@64 12 // all copies or substantial portions of the Software.
Chris@64 13 //
Chris@64 14 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
Chris@64 15 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
Chris@64 16 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
Chris@64 17 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
Chris@64 18 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
Chris@64 19 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
Chris@64 20 // THE SOFTWARE.
Chris@64 21
Chris@64 22 #ifndef CAPNP_ANY_H_
Chris@64 23 #define CAPNP_ANY_H_
Chris@64 24
Chris@64 25 #if defined(__GNUC__) && !defined(CAPNP_HEADER_WARNINGS)
Chris@64 26 #pragma GCC system_header
Chris@64 27 #endif
Chris@64 28
Chris@64 29 #include "layout.h"
Chris@64 30 #include "pointer-helpers.h"
Chris@64 31 #include "orphan.h"
Chris@64 32 #include "list.h"
Chris@64 33
Chris@64 34 namespace capnp {
Chris@64 35
Chris@64 36 class StructSchema;
Chris@64 37 class ListSchema;
Chris@64 38 class InterfaceSchema;
Chris@64 39 class Orphanage;
Chris@64 40 class ClientHook;
Chris@64 41 class PipelineHook;
Chris@64 42 struct PipelineOp;
Chris@64 43 struct AnyPointer;
Chris@64 44
Chris@64 45 struct AnyList {
Chris@64 46 AnyList() = delete;
Chris@64 47
Chris@64 48 class Reader;
Chris@64 49 class Builder;
Chris@64 50 };
Chris@64 51
Chris@64 52 struct AnyStruct {
Chris@64 53 AnyStruct() = delete;
Chris@64 54
Chris@64 55 class Reader;
Chris@64 56 class Builder;
Chris@64 57 class Pipeline;
Chris@64 58 };
Chris@64 59
Chris@64 60 template<>
Chris@64 61 struct List<AnyStruct, Kind::OTHER> {
Chris@64 62 List() = delete;
Chris@64 63
Chris@64 64 class Reader;
Chris@64 65 class Builder;
Chris@64 66 };
Chris@64 67
Chris@64 68 namespace _ { // private
Chris@64 69 template <> struct Kind_<AnyPointer> { static constexpr Kind kind = Kind::OTHER; };
Chris@64 70 template <> struct Kind_<AnyStruct> { static constexpr Kind kind = Kind::OTHER; };
Chris@64 71 template <> struct Kind_<AnyList> { static constexpr Kind kind = Kind::OTHER; };
Chris@64 72 } // namespace _ (private)
Chris@64 73
Chris@64 74 // =======================================================================================
Chris@64 75 // AnyPointer!
Chris@64 76
Chris@64 77 enum class Equality {
Chris@64 78 NOT_EQUAL,
Chris@64 79 EQUAL,
Chris@64 80 UNKNOWN_CONTAINS_CAPS
Chris@64 81 };
Chris@64 82
Chris@64 83 kj::StringPtr KJ_STRINGIFY(Equality res);
Chris@64 84
Chris@64 85 struct AnyPointer {
Chris@64 86 // Reader/Builder for the `AnyPointer` field type, i.e. a pointer that can point to an arbitrary
Chris@64 87 // object.
Chris@64 88
Chris@64 89 AnyPointer() = delete;
Chris@64 90
Chris@64 91 class Reader {
Chris@64 92 public:
Chris@64 93 typedef AnyPointer Reads;
Chris@64 94
Chris@64 95 Reader() = default;
Chris@64 96 inline Reader(_::PointerReader reader): reader(reader) {}
Chris@64 97
Chris@64 98 inline MessageSize targetSize() const;
Chris@64 99 // Get the total size of the target object and all its children.
Chris@64 100
Chris@64 101 inline PointerType getPointerType() const;
Chris@64 102
Chris@64 103 inline bool isNull() const { return getPointerType() == PointerType::NULL_; }
Chris@64 104 inline bool isStruct() const { return getPointerType() == PointerType::STRUCT; }
Chris@64 105 inline bool isList() const { return getPointerType() == PointerType::LIST; }
Chris@64 106 inline bool isCapability() const { return getPointerType() == PointerType::CAPABILITY; }
Chris@64 107
Chris@64 108 Equality equals(AnyPointer::Reader right);
Chris@64 109 bool operator==(AnyPointer::Reader right);
Chris@64 110 inline bool operator!=(AnyPointer::Reader right) {
Chris@64 111 return !(*this == right);
Chris@64 112 }
Chris@64 113
Chris@64 114 template <typename T>
Chris@64 115 inline ReaderFor<T> getAs() const;
Chris@64 116 // Valid for T = any generated struct type, interface type, List<U>, Text, or Data.
Chris@64 117
Chris@64 118 template <typename T>
Chris@64 119 inline ReaderFor<T> getAs(StructSchema schema) const;
Chris@64 120 // Only valid for T = DynamicStruct. Requires `#include <capnp/dynamic.h>`.
Chris@64 121
Chris@64 122 template <typename T>
Chris@64 123 inline ReaderFor<T> getAs(ListSchema schema) const;
Chris@64 124 // Only valid for T = DynamicList. Requires `#include <capnp/dynamic.h>`.
Chris@64 125
Chris@64 126 template <typename T>
Chris@64 127 inline ReaderFor<T> getAs(InterfaceSchema schema) const;
Chris@64 128 // Only valid for T = DynamicCapability. Requires `#include <capnp/dynamic.h>`.
Chris@64 129
Chris@64 130 #if !CAPNP_LITE
Chris@64 131 kj::Own<ClientHook> getPipelinedCap(kj::ArrayPtr<const PipelineOp> ops) const;
Chris@64 132 // Used by RPC system to implement pipelining. Applications generally shouldn't use this
Chris@64 133 // directly.
Chris@64 134 #endif // !CAPNP_LITE
Chris@64 135
Chris@64 136 private:
Chris@64 137 _::PointerReader reader;
Chris@64 138 friend struct AnyPointer;
Chris@64 139 friend class Orphanage;
Chris@64 140 friend class CapReaderContext;
Chris@64 141 friend struct _::PointerHelpers<AnyPointer>;
Chris@64 142 };
Chris@64 143
Chris@64 144 class Builder {
Chris@64 145 public:
Chris@64 146 typedef AnyPointer Builds;
Chris@64 147
Chris@64 148 Builder() = delete;
Chris@64 149 inline Builder(decltype(nullptr)) {}
Chris@64 150 inline Builder(_::PointerBuilder builder): builder(builder) {}
Chris@64 151
Chris@64 152 inline MessageSize targetSize() const;
Chris@64 153 // Get the total size of the target object and all its children.
Chris@64 154
Chris@64 155 inline PointerType getPointerType();
Chris@64 156
Chris@64 157 inline bool isNull() { return getPointerType() == PointerType::NULL_; }
Chris@64 158 inline bool isStruct() { return getPointerType() == PointerType::STRUCT; }
Chris@64 159 inline bool isList() { return getPointerType() == PointerType::LIST; }
Chris@64 160 inline bool isCapability() { return getPointerType() == PointerType::CAPABILITY; }
Chris@64 161
Chris@64 162 inline Equality equals(AnyPointer::Reader right) {
Chris@64 163 return asReader().equals(right);
Chris@64 164 }
Chris@64 165 inline bool operator==(AnyPointer::Reader right) {
Chris@64 166 return asReader() == right;
Chris@64 167 }
Chris@64 168 inline bool operator!=(AnyPointer::Reader right) {
Chris@64 169 return !(*this == right);
Chris@64 170 }
Chris@64 171
Chris@64 172 inline void clear();
Chris@64 173 // Set to null.
Chris@64 174
Chris@64 175 template <typename T>
Chris@64 176 inline BuilderFor<T> getAs();
Chris@64 177 // Valid for T = any generated struct type, List<U>, Text, or Data.
Chris@64 178
Chris@64 179 template <typename T>
Chris@64 180 inline BuilderFor<T> getAs(StructSchema schema);
Chris@64 181 // Only valid for T = DynamicStruct. Requires `#include <capnp/dynamic.h>`.
Chris@64 182
Chris@64 183 template <typename T>
Chris@64 184 inline BuilderFor<T> getAs(ListSchema schema);
Chris@64 185 // Only valid for T = DynamicList. Requires `#include <capnp/dynamic.h>`.
Chris@64 186
Chris@64 187 template <typename T>
Chris@64 188 inline BuilderFor<T> getAs(InterfaceSchema schema);
Chris@64 189 // Only valid for T = DynamicCapability. Requires `#include <capnp/dynamic.h>`.
Chris@64 190
Chris@64 191 template <typename T>
Chris@64 192 inline BuilderFor<T> initAs();
Chris@64 193 // Valid for T = any generated struct type.
Chris@64 194
Chris@64 195 template <typename T>
Chris@64 196 inline BuilderFor<T> initAs(uint elementCount);
Chris@64 197 // Valid for T = List<U>, Text, or Data.
Chris@64 198
Chris@64 199 template <typename T>
Chris@64 200 inline BuilderFor<T> initAs(StructSchema schema);
Chris@64 201 // Only valid for T = DynamicStruct. Requires `#include <capnp/dynamic.h>`.
Chris@64 202
Chris@64 203 template <typename T>
Chris@64 204 inline BuilderFor<T> initAs(ListSchema schema, uint elementCount);
Chris@64 205 // Only valid for T = DynamicList. Requires `#include <capnp/dynamic.h>`.
Chris@64 206
Chris@64 207 inline AnyList::Builder initAsAnyList(ElementSize elementSize, uint elementCount);
Chris@64 208 // Note: Does not accept INLINE_COMPOSITE for elementSize.
Chris@64 209
Chris@64 210 inline List<AnyStruct>::Builder initAsListOfAnyStruct(
Chris@64 211 uint16_t dataWordCount, uint16_t pointerCount, uint elementCount);
Chris@64 212
Chris@64 213 inline AnyStruct::Builder initAsAnyStruct(uint16_t dataWordCount, uint16_t pointerCount);
Chris@64 214
Chris@64 215 template <typename T>
Chris@64 216 inline void setAs(ReaderFor<T> value);
Chris@64 217 // Valid for ReaderType = T::Reader for T = any generated struct type, List<U>, Text, Data,
Chris@64 218 // DynamicStruct, or DynamicList (the dynamic types require `#include <capnp/dynamic.h>`).
Chris@64 219
Chris@64 220 template <typename T>
Chris@64 221 inline void setAs(std::initializer_list<ReaderFor<ListElementType<T>>> list);
Chris@64 222 // Valid for T = List<?>.
Chris@64 223
Chris@64 224 template <typename T>
Chris@64 225 inline void setCanonicalAs(ReaderFor<T> value);
Chris@64 226
Chris@64 227 inline void set(Reader value) { builder.copyFrom(value.reader); }
Chris@64 228 // Set to a copy of another AnyPointer.
Chris@64 229
Chris@64 230 inline void setCanonical(Reader value) { builder.copyFrom(value.reader, true); }
Chris@64 231
Chris@64 232 template <typename T>
Chris@64 233 inline void adopt(Orphan<T>&& orphan);
Chris@64 234 // Valid for T = any generated struct type, List<U>, Text, Data, DynamicList, DynamicStruct,
Chris@64 235 // or DynamicValue (the dynamic types require `#include <capnp/dynamic.h>`).
Chris@64 236
Chris@64 237 template <typename T>
Chris@64 238 inline Orphan<T> disownAs();
Chris@64 239 // Valid for T = any generated struct type, List<U>, Text, Data.
Chris@64 240
Chris@64 241 template <typename T>
Chris@64 242 inline Orphan<T> disownAs(StructSchema schema);
Chris@64 243 // Only valid for T = DynamicStruct. Requires `#include <capnp/dynamic.h>`.
Chris@64 244
Chris@64 245 template <typename T>
Chris@64 246 inline Orphan<T> disownAs(ListSchema schema);
Chris@64 247 // Only valid for T = DynamicList. Requires `#include <capnp/dynamic.h>`.
Chris@64 248
Chris@64 249 template <typename T>
Chris@64 250 inline Orphan<T> disownAs(InterfaceSchema schema);
Chris@64 251 // Only valid for T = DynamicCapability. Requires `#include <capnp/dynamic.h>`.
Chris@64 252
Chris@64 253 inline Orphan<AnyPointer> disown();
Chris@64 254 // Disown without a type.
Chris@64 255
Chris@64 256 inline Reader asReader() const { return Reader(builder.asReader()); }
Chris@64 257 inline operator Reader() const { return Reader(builder.asReader()); }
Chris@64 258
Chris@64 259 private:
Chris@64 260 _::PointerBuilder builder;
Chris@64 261 friend class Orphanage;
Chris@64 262 friend class CapBuilderContext;
Chris@64 263 friend struct _::PointerHelpers<AnyPointer>;
Chris@64 264 };
Chris@64 265
Chris@64 266 #if !CAPNP_LITE
Chris@64 267 class Pipeline {
Chris@64 268 public:
Chris@64 269 typedef AnyPointer Pipelines;
Chris@64 270
Chris@64 271 inline Pipeline(decltype(nullptr)) {}
Chris@64 272 inline explicit Pipeline(kj::Own<PipelineHook>&& hook): hook(kj::mv(hook)) {}
Chris@64 273
Chris@64 274 Pipeline noop();
Chris@64 275 // Just make a copy.
Chris@64 276
Chris@64 277 Pipeline getPointerField(uint16_t pointerIndex);
Chris@64 278 // Deprecated. In the future, we should use .asAnyStruct.getPointerField.
Chris@64 279
Chris@64 280 inline AnyStruct::Pipeline asAnyStruct();
Chris@64 281
Chris@64 282 kj::Own<ClientHook> asCap();
Chris@64 283 // Expect that the result is a capability and construct a pipelined version of it now.
Chris@64 284
Chris@64 285 inline kj::Own<PipelineHook> releasePipelineHook() { return kj::mv(hook); }
Chris@64 286 // For use by RPC implementations.
Chris@64 287
Chris@64 288 template <typename T, typename = kj::EnableIf<CAPNP_KIND(FromClient<T>) == Kind::INTERFACE>>
Chris@64 289 inline operator T() { return T(asCap()); }
Chris@64 290
Chris@64 291 private:
Chris@64 292 kj::Own<PipelineHook> hook;
Chris@64 293 kj::Array<PipelineOp> ops;
Chris@64 294
Chris@64 295 inline Pipeline(kj::Own<PipelineHook>&& hook, kj::Array<PipelineOp>&& ops)
Chris@64 296 : hook(kj::mv(hook)), ops(kj::mv(ops)) {}
Chris@64 297
Chris@64 298 friend class LocalClient;
Chris@64 299 friend class PipelineHook;
Chris@64 300 friend class AnyStruct::Pipeline;
Chris@64 301 };
Chris@64 302 #endif // !CAPNP_LITE
Chris@64 303 };
Chris@64 304
Chris@64 305 template <>
Chris@64 306 class Orphan<AnyPointer> {
Chris@64 307 // An orphaned object of unknown type.
Chris@64 308
Chris@64 309 public:
Chris@64 310 Orphan() = default;
Chris@64 311 KJ_DISALLOW_COPY(Orphan);
Chris@64 312 Orphan(Orphan&&) = default;
Chris@64 313 inline Orphan(_::OrphanBuilder&& builder)
Chris@64 314 : builder(kj::mv(builder)) {}
Chris@64 315
Chris@64 316 Orphan& operator=(Orphan&&) = default;
Chris@64 317
Chris@64 318 template <typename T>
Chris@64 319 inline Orphan(Orphan<T>&& other): builder(kj::mv(other.builder)) {}
Chris@64 320 template <typename T>
Chris@64 321 inline Orphan& operator=(Orphan<T>&& other) { builder = kj::mv(other.builder); return *this; }
Chris@64 322 // Cast from typed orphan.
Chris@64 323
Chris@64 324 // It's not possible to get an AnyPointer::{Reader,Builder} directly since there is no
Chris@64 325 // underlying pointer (the pointer would normally live in the parent, but this object is
Chris@64 326 // orphaned). It is possible, however, to request typed readers/builders.
Chris@64 327
Chris@64 328 template <typename T>
Chris@64 329 inline BuilderFor<T> getAs();
Chris@64 330 template <typename T>
Chris@64 331 inline BuilderFor<T> getAs(StructSchema schema);
Chris@64 332 template <typename T>
Chris@64 333 inline BuilderFor<T> getAs(ListSchema schema);
Chris@64 334 template <typename T>
Chris@64 335 inline typename T::Client getAs(InterfaceSchema schema);
Chris@64 336 template <typename T>
Chris@64 337 inline ReaderFor<T> getAsReader() const;
Chris@64 338 template <typename T>
Chris@64 339 inline ReaderFor<T> getAsReader(StructSchema schema) const;
Chris@64 340 template <typename T>
Chris@64 341 inline ReaderFor<T> getAsReader(ListSchema schema) const;
Chris@64 342 template <typename T>
Chris@64 343 inline typename T::Client getAsReader(InterfaceSchema schema) const;
Chris@64 344
Chris@64 345 template <typename T>
Chris@64 346 inline Orphan<T> releaseAs();
Chris@64 347 template <typename T>
Chris@64 348 inline Orphan<T> releaseAs(StructSchema schema);
Chris@64 349 template <typename T>
Chris@64 350 inline Orphan<T> releaseAs(ListSchema schema);
Chris@64 351 template <typename T>
Chris@64 352 inline Orphan<T> releaseAs(InterfaceSchema schema);
Chris@64 353 // Down-cast the orphan to a specific type.
Chris@64 354
Chris@64 355 inline bool operator==(decltype(nullptr)) const { return builder == nullptr; }
Chris@64 356 inline bool operator!=(decltype(nullptr)) const { return builder != nullptr; }
Chris@64 357
Chris@64 358 private:
Chris@64 359 _::OrphanBuilder builder;
Chris@64 360
Chris@64 361 template <typename, Kind>
Chris@64 362 friend struct _::PointerHelpers;
Chris@64 363 friend class Orphanage;
Chris@64 364 template <typename U>
Chris@64 365 friend class Orphan;
Chris@64 366 friend class AnyPointer::Builder;
Chris@64 367 };
Chris@64 368
Chris@64 369 template <Kind k> struct AnyTypeFor_;
Chris@64 370 template <> struct AnyTypeFor_<Kind::STRUCT> { typedef AnyStruct Type; };
Chris@64 371 template <> struct AnyTypeFor_<Kind::LIST> { typedef AnyList Type; };
Chris@64 372
Chris@64 373 template <typename T>
Chris@64 374 using AnyTypeFor = typename AnyTypeFor_<CAPNP_KIND(T)>::Type;
Chris@64 375
Chris@64 376 template <typename T>
Chris@64 377 inline ReaderFor<AnyTypeFor<FromReader<T>>> toAny(T&& value) {
Chris@64 378 return ReaderFor<AnyTypeFor<FromReader<T>>>(
Chris@64 379 _::PointerHelpers<FromReader<T>>::getInternalReader(value));
Chris@64 380 }
Chris@64 381 template <typename T>
Chris@64 382 inline BuilderFor<AnyTypeFor<FromBuilder<T>>> toAny(T&& value) {
Chris@64 383 return BuilderFor<AnyTypeFor<FromBuilder<T>>>(
Chris@64 384 _::PointerHelpers<FromBuilder<T>>::getInternalBuilder(kj::mv(value)));
Chris@64 385 }
Chris@64 386
Chris@64 387 template <>
Chris@64 388 struct List<AnyPointer, Kind::OTHER> {
Chris@64 389 // Note: This cannot be used for a list of structs, since such lists are not encoded as pointer
Chris@64 390 // lists! Use List<AnyStruct>.
Chris@64 391
Chris@64 392 List() = delete;
Chris@64 393
Chris@64 394 class Reader {
Chris@64 395 public:
Chris@64 396 typedef List<AnyPointer> Reads;
Chris@64 397
Chris@64 398 inline Reader(): reader(ElementSize::POINTER) {}
Chris@64 399 inline explicit Reader(_::ListReader reader): reader(reader) {}
Chris@64 400
Chris@64 401 inline uint size() const { return unbound(reader.size() / ELEMENTS); }
Chris@64 402 inline AnyPointer::Reader operator[](uint index) const {
Chris@64 403 KJ_IREQUIRE(index < size());
Chris@64 404 return AnyPointer::Reader(reader.getPointerElement(bounded(index) * ELEMENTS));
Chris@64 405 }
Chris@64 406
Chris@64 407 typedef _::IndexingIterator<const Reader, typename AnyPointer::Reader> Iterator;
Chris@64 408 inline Iterator begin() const { return Iterator(this, 0); }
Chris@64 409 inline Iterator end() const { return Iterator(this, size()); }
Chris@64 410
Chris@64 411 private:
Chris@64 412 _::ListReader reader;
Chris@64 413 template <typename U, Kind K>
Chris@64 414 friend struct _::PointerHelpers;
Chris@64 415 template <typename U, Kind K>
Chris@64 416 friend struct List;
Chris@64 417 friend class Orphanage;
Chris@64 418 template <typename U, Kind K>
Chris@64 419 friend struct ToDynamic_;
Chris@64 420 };
Chris@64 421
Chris@64 422 class Builder {
Chris@64 423 public:
Chris@64 424 typedef List<AnyPointer> Builds;
Chris@64 425
Chris@64 426 Builder() = delete;
Chris@64 427 inline Builder(decltype(nullptr)): builder(ElementSize::POINTER) {}
Chris@64 428 inline explicit Builder(_::ListBuilder builder): builder(builder) {}
Chris@64 429
Chris@64 430 inline operator Reader() const { return Reader(builder.asReader()); }
Chris@64 431 inline Reader asReader() const { return Reader(builder.asReader()); }
Chris@64 432
Chris@64 433 inline uint size() const { return unbound(builder.size() / ELEMENTS); }
Chris@64 434 inline AnyPointer::Builder operator[](uint index) {
Chris@64 435 KJ_IREQUIRE(index < size());
Chris@64 436 return AnyPointer::Builder(builder.getPointerElement(bounded(index) * ELEMENTS));
Chris@64 437 }
Chris@64 438
Chris@64 439 typedef _::IndexingIterator<Builder, typename AnyPointer::Builder> Iterator;
Chris@64 440 inline Iterator begin() { return Iterator(this, 0); }
Chris@64 441 inline Iterator end() { return Iterator(this, size()); }
Chris@64 442
Chris@64 443 private:
Chris@64 444 _::ListBuilder builder;
Chris@64 445 template <typename, Kind>
Chris@64 446 friend struct _::PointerHelpers;
Chris@64 447 friend class Orphanage;
Chris@64 448 template <typename, Kind>
Chris@64 449 friend struct ToDynamic_;
Chris@64 450 };
Chris@64 451 };
Chris@64 452
Chris@64 453 class AnyStruct::Reader {
Chris@64 454 public:
Chris@64 455 typedef AnyStruct Reads;
Chris@64 456
Chris@64 457 Reader() = default;
Chris@64 458 inline Reader(_::StructReader reader): _reader(reader) {}
Chris@64 459
Chris@64 460 template <typename T, typename = kj::EnableIf<CAPNP_KIND(FromReader<T>) == Kind::STRUCT>>
Chris@64 461 inline Reader(T&& value)
Chris@64 462 : _reader(_::PointerHelpers<FromReader<T>>::getInternalReader(kj::fwd<T>(value))) {}
Chris@64 463
Chris@64 464 kj::ArrayPtr<const byte> getDataSection() {
Chris@64 465 return _reader.getDataSectionAsBlob();
Chris@64 466 }
Chris@64 467 List<AnyPointer>::Reader getPointerSection() {
Chris@64 468 return List<AnyPointer>::Reader(_reader.getPointerSectionAsList());
Chris@64 469 }
Chris@64 470
Chris@64 471 kj::Array<word> canonicalize() {
Chris@64 472 return _reader.canonicalize();
Chris@64 473 }
Chris@64 474
Chris@64 475 Equality equals(AnyStruct::Reader right);
Chris@64 476 bool operator==(AnyStruct::Reader right);
Chris@64 477 inline bool operator!=(AnyStruct::Reader right) {
Chris@64 478 return !(*this == right);
Chris@64 479 }
Chris@64 480
Chris@64 481 template <typename T>
Chris@64 482 ReaderFor<T> as() const {
Chris@64 483 // T must be a struct type.
Chris@64 484 return typename T::Reader(_reader);
Chris@64 485 }
Chris@64 486 private:
Chris@64 487 _::StructReader _reader;
Chris@64 488
Chris@64 489 template <typename, Kind>
Chris@64 490 friend struct _::PointerHelpers;
Chris@64 491 friend class Orphanage;
Chris@64 492 };
Chris@64 493
Chris@64 494 class AnyStruct::Builder {
Chris@64 495 public:
Chris@64 496 typedef AnyStruct Builds;
Chris@64 497
Chris@64 498 inline Builder(decltype(nullptr)) {}
Chris@64 499 inline Builder(_::StructBuilder builder): _builder(builder) {}
Chris@64 500
Chris@64 501 #if !_MSC_VER // TODO(msvc): MSVC ICEs on this. Try restoring when compiler improves.
Chris@64 502 template <typename T, typename = kj::EnableIf<CAPNP_KIND(FromBuilder<T>) == Kind::STRUCT>>
Chris@64 503 inline Builder(T&& value)
Chris@64 504 : _builder(_::PointerHelpers<FromBuilder<T>>::getInternalBuilder(kj::fwd<T>(value))) {}
Chris@64 505 #endif
Chris@64 506
Chris@64 507 inline kj::ArrayPtr<byte> getDataSection() {
Chris@64 508 return _builder.getDataSectionAsBlob();
Chris@64 509 }
Chris@64 510 List<AnyPointer>::Builder getPointerSection() {
Chris@64 511 return List<AnyPointer>::Builder(_builder.getPointerSectionAsList());
Chris@64 512 }
Chris@64 513
Chris@64 514 inline Equality equals(AnyStruct::Reader right) {
Chris@64 515 return asReader().equals(right);
Chris@64 516 }
Chris@64 517 inline bool operator==(AnyStruct::Reader right) {
Chris@64 518 return asReader() == right;
Chris@64 519 }
Chris@64 520 inline bool operator!=(AnyStruct::Reader right) {
Chris@64 521 return !(*this == right);
Chris@64 522 }
Chris@64 523
Chris@64 524 inline operator Reader() const { return Reader(_builder.asReader()); }
Chris@64 525 inline Reader asReader() const { return Reader(_builder.asReader()); }
Chris@64 526
Chris@64 527 template <typename T>
Chris@64 528 BuilderFor<T> as() {
Chris@64 529 // T must be a struct type.
Chris@64 530 return typename T::Builder(_builder);
Chris@64 531 }
Chris@64 532 private:
Chris@64 533 _::StructBuilder _builder;
Chris@64 534 friend class Orphanage;
Chris@64 535 friend class CapBuilderContext;
Chris@64 536 };
Chris@64 537
Chris@64 538 #if !CAPNP_LITE
Chris@64 539 class AnyStruct::Pipeline {
Chris@64 540 public:
Chris@64 541 inline Pipeline(decltype(nullptr)): typeless(nullptr) {}
Chris@64 542 inline explicit Pipeline(AnyPointer::Pipeline&& typeless)
Chris@64 543 : typeless(kj::mv(typeless)) {}
Chris@64 544
Chris@64 545 inline AnyPointer::Pipeline getPointerField(uint16_t pointerIndex) {
Chris@64 546 // Return a new Promise representing a sub-object of the result. `pointerIndex` is the index
Chris@64 547 // of the sub-object within the pointer section of the result (the result must be a struct).
Chris@64 548 //
Chris@64 549 // TODO(perf): On GCC 4.8 / Clang 3.3, use rvalue qualifiers to avoid the need for copies.
Chris@64 550 // Also make `ops` into a Vector to optimize this.
Chris@64 551 return typeless.getPointerField(pointerIndex);
Chris@64 552 }
Chris@64 553
Chris@64 554 private:
Chris@64 555 AnyPointer::Pipeline typeless;
Chris@64 556 };
Chris@64 557 #endif // !CAPNP_LITE
Chris@64 558
Chris@64 559 class List<AnyStruct, Kind::OTHER>::Reader {
Chris@64 560 public:
Chris@64 561 typedef List<AnyStruct> Reads;
Chris@64 562
Chris@64 563 inline Reader(): reader(ElementSize::INLINE_COMPOSITE) {}
Chris@64 564 inline explicit Reader(_::ListReader reader): reader(reader) {}
Chris@64 565
Chris@64 566 inline uint size() const { return unbound(reader.size() / ELEMENTS); }
Chris@64 567 inline AnyStruct::Reader operator[](uint index) const {
Chris@64 568 KJ_IREQUIRE(index < size());
Chris@64 569 return AnyStruct::Reader(reader.getStructElement(bounded(index) * ELEMENTS));
Chris@64 570 }
Chris@64 571
Chris@64 572 typedef _::IndexingIterator<const Reader, typename AnyStruct::Reader> Iterator;
Chris@64 573 inline Iterator begin() const { return Iterator(this, 0); }
Chris@64 574 inline Iterator end() const { return Iterator(this, size()); }
Chris@64 575
Chris@64 576 private:
Chris@64 577 _::ListReader reader;
Chris@64 578 template <typename U, Kind K>
Chris@64 579 friend struct _::PointerHelpers;
Chris@64 580 template <typename U, Kind K>
Chris@64 581 friend struct List;
Chris@64 582 friend class Orphanage;
Chris@64 583 template <typename U, Kind K>
Chris@64 584 friend struct ToDynamic_;
Chris@64 585 };
Chris@64 586
Chris@64 587 class List<AnyStruct, Kind::OTHER>::Builder {
Chris@64 588 public:
Chris@64 589 typedef List<AnyStruct> Builds;
Chris@64 590
Chris@64 591 Builder() = delete;
Chris@64 592 inline Builder(decltype(nullptr)): builder(ElementSize::INLINE_COMPOSITE) {}
Chris@64 593 inline explicit Builder(_::ListBuilder builder): builder(builder) {}
Chris@64 594
Chris@64 595 inline operator Reader() const { return Reader(builder.asReader()); }
Chris@64 596 inline Reader asReader() const { return Reader(builder.asReader()); }
Chris@64 597
Chris@64 598 inline uint size() const { return unbound(builder.size() / ELEMENTS); }
Chris@64 599 inline AnyStruct::Builder operator[](uint index) {
Chris@64 600 KJ_IREQUIRE(index < size());
Chris@64 601 return AnyStruct::Builder(builder.getStructElement(bounded(index) * ELEMENTS));
Chris@64 602 }
Chris@64 603
Chris@64 604 typedef _::IndexingIterator<Builder, typename AnyStruct::Builder> Iterator;
Chris@64 605 inline Iterator begin() { return Iterator(this, 0); }
Chris@64 606 inline Iterator end() { return Iterator(this, size()); }
Chris@64 607
Chris@64 608 private:
Chris@64 609 _::ListBuilder builder;
Chris@64 610 template <typename U, Kind K>
Chris@64 611 friend struct _::PointerHelpers;
Chris@64 612 friend class Orphanage;
Chris@64 613 template <typename U, Kind K>
Chris@64 614 friend struct ToDynamic_;
Chris@64 615 };
Chris@64 616
Chris@64 617 class AnyList::Reader {
Chris@64 618 public:
Chris@64 619 typedef AnyList Reads;
Chris@64 620
Chris@64 621 inline Reader(): _reader(ElementSize::VOID) {}
Chris@64 622 inline Reader(_::ListReader reader): _reader(reader) {}
Chris@64 623
Chris@64 624 #if !_MSC_VER // TODO(msvc): MSVC ICEs on this. Try restoring when compiler improves.
Chris@64 625 template <typename T, typename = kj::EnableIf<CAPNP_KIND(FromReader<T>) == Kind::LIST>>
Chris@64 626 inline Reader(T&& value)
Chris@64 627 : _reader(_::PointerHelpers<FromReader<T>>::getInternalReader(kj::fwd<T>(value))) {}
Chris@64 628 #endif
Chris@64 629
Chris@64 630 inline ElementSize getElementSize() { return _reader.getElementSize(); }
Chris@64 631 inline uint size() { return unbound(_reader.size() / ELEMENTS); }
Chris@64 632
Chris@64 633 inline kj::ArrayPtr<const byte> getRawBytes() { return _reader.asRawBytes(); }
Chris@64 634
Chris@64 635 Equality equals(AnyList::Reader right);
Chris@64 636 bool operator==(AnyList::Reader right);
Chris@64 637 inline bool operator!=(AnyList::Reader right) {
Chris@64 638 return !(*this == right);
Chris@64 639 }
Chris@64 640
Chris@64 641 template <typename T> ReaderFor<T> as() {
Chris@64 642 // T must be List<U>.
Chris@64 643 return ReaderFor<T>(_reader);
Chris@64 644 }
Chris@64 645 private:
Chris@64 646 _::ListReader _reader;
Chris@64 647
Chris@64 648 template <typename, Kind>
Chris@64 649 friend struct _::PointerHelpers;
Chris@64 650 friend class Orphanage;
Chris@64 651 };
Chris@64 652
Chris@64 653 class AnyList::Builder {
Chris@64 654 public:
Chris@64 655 typedef AnyList Builds;
Chris@64 656
Chris@64 657 inline Builder(decltype(nullptr)): _builder(ElementSize::VOID) {}
Chris@64 658 inline Builder(_::ListBuilder builder): _builder(builder) {}
Chris@64 659
Chris@64 660 #if !_MSC_VER // TODO(msvc): MSVC ICEs on this. Try restoring when compiler improves.
Chris@64 661 template <typename T, typename = kj::EnableIf<CAPNP_KIND(FromBuilder<T>) == Kind::LIST>>
Chris@64 662 inline Builder(T&& value)
Chris@64 663 : _builder(_::PointerHelpers<FromBuilder<T>>::getInternalBuilder(kj::fwd<T>(value))) {}
Chris@64 664 #endif
Chris@64 665
Chris@64 666 inline ElementSize getElementSize() { return _builder.getElementSize(); }
Chris@64 667 inline uint size() { return unbound(_builder.size() / ELEMENTS); }
Chris@64 668
Chris@64 669 Equality equals(AnyList::Reader right);
Chris@64 670 inline bool operator==(AnyList::Reader right) {
Chris@64 671 return asReader() == right;
Chris@64 672 }
Chris@64 673 inline bool operator!=(AnyList::Reader right) {
Chris@64 674 return !(*this == right);
Chris@64 675 }
Chris@64 676
Chris@64 677 template <typename T> BuilderFor<T> as() {
Chris@64 678 // T must be List<U>.
Chris@64 679 return BuilderFor<T>(_builder);
Chris@64 680 }
Chris@64 681
Chris@64 682 inline operator Reader() const { return Reader(_builder.asReader()); }
Chris@64 683 inline Reader asReader() const { return Reader(_builder.asReader()); }
Chris@64 684
Chris@64 685 private:
Chris@64 686 _::ListBuilder _builder;
Chris@64 687
Chris@64 688 friend class Orphanage;
Chris@64 689 };
Chris@64 690
Chris@64 691 // =======================================================================================
Chris@64 692 // Pipeline helpers
Chris@64 693 //
Chris@64 694 // These relate to capabilities, but we don't declare them in capability.h because generated code
Chris@64 695 // for structs needs to know about these, even in files that contain no interfaces.
Chris@64 696
Chris@64 697 #if !CAPNP_LITE
Chris@64 698
Chris@64 699 struct PipelineOp {
Chris@64 700 // Corresponds to rpc.capnp's PromisedAnswer.Op.
Chris@64 701
Chris@64 702 enum Type {
Chris@64 703 NOOP, // for convenience
Chris@64 704
Chris@64 705 GET_POINTER_FIELD
Chris@64 706
Chris@64 707 // There may be other types in the future...
Chris@64 708 };
Chris@64 709
Chris@64 710 Type type;
Chris@64 711 union {
Chris@64 712 uint16_t pointerIndex; // for GET_POINTER_FIELD
Chris@64 713 };
Chris@64 714 };
Chris@64 715
Chris@64 716 class PipelineHook {
Chris@64 717 // Represents a currently-running call, and implements pipelined requests on its result.
Chris@64 718
Chris@64 719 public:
Chris@64 720 virtual kj::Own<PipelineHook> addRef() = 0;
Chris@64 721 // Increment this object's reference count.
Chris@64 722
Chris@64 723 virtual kj::Own<ClientHook> getPipelinedCap(kj::ArrayPtr<const PipelineOp> ops) = 0;
Chris@64 724 // Extract a promised Capability from the results.
Chris@64 725
Chris@64 726 virtual kj::Own<ClientHook> getPipelinedCap(kj::Array<PipelineOp>&& ops);
Chris@64 727 // Version of getPipelinedCap() passing the array by move. May avoid a copy in some cases.
Chris@64 728 // Default implementation just calls the other version.
Chris@64 729
Chris@64 730 template <typename Pipeline, typename = FromPipeline<Pipeline>>
Chris@64 731 static inline kj::Own<PipelineHook> from(Pipeline&& pipeline);
Chris@64 732
Chris@64 733 private:
Chris@64 734 template <typename T> struct FromImpl;
Chris@64 735 };
Chris@64 736
Chris@64 737 #endif // !CAPNP_LITE
Chris@64 738
Chris@64 739 // =======================================================================================
Chris@64 740 // Inline implementation details
Chris@64 741
Chris@64 742 inline MessageSize AnyPointer::Reader::targetSize() const {
Chris@64 743 return reader.targetSize().asPublic();
Chris@64 744 }
Chris@64 745
Chris@64 746 inline PointerType AnyPointer::Reader::getPointerType() const {
Chris@64 747 return reader.getPointerType();
Chris@64 748 }
Chris@64 749
Chris@64 750 template <typename T>
Chris@64 751 inline ReaderFor<T> AnyPointer::Reader::getAs() const {
Chris@64 752 return _::PointerHelpers<T>::get(reader);
Chris@64 753 }
Chris@64 754
Chris@64 755 inline MessageSize AnyPointer::Builder::targetSize() const {
Chris@64 756 return asReader().targetSize();
Chris@64 757 }
Chris@64 758
Chris@64 759 inline PointerType AnyPointer::Builder::getPointerType() {
Chris@64 760 return builder.getPointerType();
Chris@64 761 }
Chris@64 762
Chris@64 763 inline void AnyPointer::Builder::clear() {
Chris@64 764 return builder.clear();
Chris@64 765 }
Chris@64 766
Chris@64 767 template <typename T>
Chris@64 768 inline BuilderFor<T> AnyPointer::Builder::getAs() {
Chris@64 769 return _::PointerHelpers<T>::get(builder);
Chris@64 770 }
Chris@64 771
Chris@64 772 template <typename T>
Chris@64 773 inline BuilderFor<T> AnyPointer::Builder::initAs() {
Chris@64 774 return _::PointerHelpers<T>::init(builder);
Chris@64 775 }
Chris@64 776
Chris@64 777 template <typename T>
Chris@64 778 inline BuilderFor<T> AnyPointer::Builder::initAs(uint elementCount) {
Chris@64 779 return _::PointerHelpers<T>::init(builder, elementCount);
Chris@64 780 }
Chris@64 781
Chris@64 782 inline AnyList::Builder AnyPointer::Builder::initAsAnyList(
Chris@64 783 ElementSize elementSize, uint elementCount) {
Chris@64 784 return AnyList::Builder(builder.initList(elementSize, bounded(elementCount) * ELEMENTS));
Chris@64 785 }
Chris@64 786
Chris@64 787 inline List<AnyStruct>::Builder AnyPointer::Builder::initAsListOfAnyStruct(
Chris@64 788 uint16_t dataWordCount, uint16_t pointerCount, uint elementCount) {
Chris@64 789 return List<AnyStruct>::Builder(builder.initStructList(bounded(elementCount) * ELEMENTS,
Chris@64 790 _::StructSize(bounded(dataWordCount) * WORDS,
Chris@64 791 bounded(pointerCount) * POINTERS)));
Chris@64 792 }
Chris@64 793
Chris@64 794 inline AnyStruct::Builder AnyPointer::Builder::initAsAnyStruct(
Chris@64 795 uint16_t dataWordCount, uint16_t pointerCount) {
Chris@64 796 return AnyStruct::Builder(builder.initStruct(
Chris@64 797 _::StructSize(bounded(dataWordCount) * WORDS,
Chris@64 798 bounded(pointerCount) * POINTERS)));
Chris@64 799 }
Chris@64 800
Chris@64 801 template <typename T>
Chris@64 802 inline void AnyPointer::Builder::setAs(ReaderFor<T> value) {
Chris@64 803 return _::PointerHelpers<T>::set(builder, value);
Chris@64 804 }
Chris@64 805
Chris@64 806 template <typename T>
Chris@64 807 inline void AnyPointer::Builder::setCanonicalAs(ReaderFor<T> value) {
Chris@64 808 return _::PointerHelpers<T>::setCanonical(builder, value);
Chris@64 809 }
Chris@64 810
Chris@64 811 template <typename T>
Chris@64 812 inline void AnyPointer::Builder::setAs(
Chris@64 813 std::initializer_list<ReaderFor<ListElementType<T>>> list) {
Chris@64 814 return _::PointerHelpers<T>::set(builder, list);
Chris@64 815 }
Chris@64 816
Chris@64 817 template <typename T>
Chris@64 818 inline void AnyPointer::Builder::adopt(Orphan<T>&& orphan) {
Chris@64 819 _::PointerHelpers<T>::adopt(builder, kj::mv(orphan));
Chris@64 820 }
Chris@64 821
Chris@64 822 template <typename T>
Chris@64 823 inline Orphan<T> AnyPointer::Builder::disownAs() {
Chris@64 824 return _::PointerHelpers<T>::disown(builder);
Chris@64 825 }
Chris@64 826
Chris@64 827 inline Orphan<AnyPointer> AnyPointer::Builder::disown() {
Chris@64 828 return Orphan<AnyPointer>(builder.disown());
Chris@64 829 }
Chris@64 830
Chris@64 831 template <> struct ReaderFor_ <AnyPointer, Kind::OTHER> { typedef AnyPointer::Reader Type; };
Chris@64 832 template <> struct BuilderFor_<AnyPointer, Kind::OTHER> { typedef AnyPointer::Builder Type; };
Chris@64 833 template <> struct ReaderFor_ <AnyStruct, Kind::OTHER> { typedef AnyStruct::Reader Type; };
Chris@64 834 template <> struct BuilderFor_<AnyStruct, Kind::OTHER> { typedef AnyStruct::Builder Type; };
Chris@64 835
Chris@64 836 template <>
Chris@64 837 struct Orphanage::GetInnerReader<AnyPointer, Kind::OTHER> {
Chris@64 838 static inline _::PointerReader apply(const AnyPointer::Reader& t) {
Chris@64 839 return t.reader;
Chris@64 840 }
Chris@64 841 };
Chris@64 842
Chris@64 843 template <>
Chris@64 844 struct Orphanage::GetInnerBuilder<AnyPointer, Kind::OTHER> {
Chris@64 845 static inline _::PointerBuilder apply(AnyPointer::Builder& t) {
Chris@64 846 return t.builder;
Chris@64 847 }
Chris@64 848 };
Chris@64 849
Chris@64 850 template <>
Chris@64 851 struct Orphanage::GetInnerReader<AnyStruct, Kind::OTHER> {
Chris@64 852 static inline _::StructReader apply(const AnyStruct::Reader& t) {
Chris@64 853 return t._reader;
Chris@64 854 }
Chris@64 855 };
Chris@64 856
Chris@64 857 template <>
Chris@64 858 struct Orphanage::GetInnerBuilder<AnyStruct, Kind::OTHER> {
Chris@64 859 static inline _::StructBuilder apply(AnyStruct::Builder& t) {
Chris@64 860 return t._builder;
Chris@64 861 }
Chris@64 862 };
Chris@64 863
Chris@64 864 template <>
Chris@64 865 struct Orphanage::GetInnerReader<AnyList, Kind::OTHER> {
Chris@64 866 static inline _::ListReader apply(const AnyList::Reader& t) {
Chris@64 867 return t._reader;
Chris@64 868 }
Chris@64 869 };
Chris@64 870
Chris@64 871 template <>
Chris@64 872 struct Orphanage::GetInnerBuilder<AnyList, Kind::OTHER> {
Chris@64 873 static inline _::ListBuilder apply(AnyList::Builder& t) {
Chris@64 874 return t._builder;
Chris@64 875 }
Chris@64 876 };
Chris@64 877
Chris@64 878 template <typename T>
Chris@64 879 inline BuilderFor<T> Orphan<AnyPointer>::getAs() {
Chris@64 880 return _::OrphanGetImpl<T>::apply(builder);
Chris@64 881 }
Chris@64 882 template <typename T>
Chris@64 883 inline ReaderFor<T> Orphan<AnyPointer>::getAsReader() const {
Chris@64 884 return _::OrphanGetImpl<T>::applyReader(builder);
Chris@64 885 }
Chris@64 886 template <typename T>
Chris@64 887 inline Orphan<T> Orphan<AnyPointer>::releaseAs() {
Chris@64 888 return Orphan<T>(kj::mv(builder));
Chris@64 889 }
Chris@64 890
Chris@64 891 // Using AnyPointer as the template type should work...
Chris@64 892
Chris@64 893 template <>
Chris@64 894 inline typename AnyPointer::Reader AnyPointer::Reader::getAs<AnyPointer>() const {
Chris@64 895 return *this;
Chris@64 896 }
Chris@64 897 template <>
Chris@64 898 inline typename AnyPointer::Builder AnyPointer::Builder::getAs<AnyPointer>() {
Chris@64 899 return *this;
Chris@64 900 }
Chris@64 901 template <>
Chris@64 902 inline typename AnyPointer::Builder AnyPointer::Builder::initAs<AnyPointer>() {
Chris@64 903 clear();
Chris@64 904 return *this;
Chris@64 905 }
Chris@64 906 template <>
Chris@64 907 inline void AnyPointer::Builder::setAs<AnyPointer>(AnyPointer::Reader value) {
Chris@64 908 return builder.copyFrom(value.reader);
Chris@64 909 }
Chris@64 910 template <>
Chris@64 911 inline void AnyPointer::Builder::adopt<AnyPointer>(Orphan<AnyPointer>&& orphan) {
Chris@64 912 builder.adopt(kj::mv(orphan.builder));
Chris@64 913 }
Chris@64 914 template <>
Chris@64 915 inline Orphan<AnyPointer> AnyPointer::Builder::disownAs<AnyPointer>() {
Chris@64 916 return Orphan<AnyPointer>(builder.disown());
Chris@64 917 }
Chris@64 918 template <>
Chris@64 919 inline Orphan<AnyPointer> Orphan<AnyPointer>::releaseAs() {
Chris@64 920 return kj::mv(*this);
Chris@64 921 }
Chris@64 922
Chris@64 923 namespace _ { // private
Chris@64 924
Chris@64 925 // Specialize PointerHelpers for AnyPointer.
Chris@64 926
Chris@64 927 template <>
Chris@64 928 struct PointerHelpers<AnyPointer, Kind::OTHER> {
Chris@64 929 static inline AnyPointer::Reader get(PointerReader reader,
Chris@64 930 const void* defaultValue = nullptr,
Chris@64 931 uint defaultBytes = 0) {
Chris@64 932 return AnyPointer::Reader(reader);
Chris@64 933 }
Chris@64 934 static inline AnyPointer::Builder get(PointerBuilder builder,
Chris@64 935 const void* defaultValue = nullptr,
Chris@64 936 uint defaultBytes = 0) {
Chris@64 937 return AnyPointer::Builder(builder);
Chris@64 938 }
Chris@64 939 static inline void set(PointerBuilder builder, AnyPointer::Reader value) {
Chris@64 940 AnyPointer::Builder(builder).set(value);
Chris@64 941 }
Chris@64 942 static inline void adopt(PointerBuilder builder, Orphan<AnyPointer>&& value) {
Chris@64 943 builder.adopt(kj::mv(value.builder));
Chris@64 944 }
Chris@64 945 static inline Orphan<AnyPointer> disown(PointerBuilder builder) {
Chris@64 946 return Orphan<AnyPointer>(builder.disown());
Chris@64 947 }
Chris@64 948 static inline _::PointerReader getInternalReader(const AnyPointer::Reader& reader) {
Chris@64 949 return reader.reader;
Chris@64 950 }
Chris@64 951 static inline _::PointerBuilder getInternalBuilder(AnyPointer::Builder&& builder) {
Chris@64 952 return builder.builder;
Chris@64 953 }
Chris@64 954 };
Chris@64 955
Chris@64 956 template <>
Chris@64 957 struct PointerHelpers<AnyStruct, Kind::OTHER> {
Chris@64 958 static inline AnyStruct::Reader get(
Chris@64 959 PointerReader reader, const word* defaultValue = nullptr) {
Chris@64 960 return AnyStruct::Reader(reader.getStruct(defaultValue));
Chris@64 961 }
Chris@64 962 static inline AnyStruct::Builder get(
Chris@64 963 PointerBuilder builder, const word* defaultValue = nullptr) {
Chris@64 964 // TODO(someday): Allow specifying the size somehow?
Chris@64 965 return AnyStruct::Builder(builder.getStruct(
Chris@64 966 _::StructSize(ZERO * WORDS, ZERO * POINTERS), defaultValue));
Chris@64 967 }
Chris@64 968 static inline void set(PointerBuilder builder, AnyStruct::Reader value) {
Chris@64 969 builder.setStruct(value._reader);
Chris@64 970 }
Chris@64 971 static inline AnyStruct::Builder init(
Chris@64 972 PointerBuilder builder, uint16_t dataWordCount, uint16_t pointerCount) {
Chris@64 973 return AnyStruct::Builder(builder.initStruct(
Chris@64 974 StructSize(bounded(dataWordCount) * WORDS,
Chris@64 975 bounded(pointerCount) * POINTERS)));
Chris@64 976 }
Chris@64 977
Chris@64 978 static void adopt(PointerBuilder builder, Orphan<AnyStruct>&& value) {
Chris@64 979 builder.adopt(kj::mv(value.builder));
Chris@64 980 }
Chris@64 981 static Orphan<AnyStruct> disown(PointerBuilder builder) {
Chris@64 982 return Orphan<AnyStruct>(builder.disown());
Chris@64 983 }
Chris@64 984 };
Chris@64 985
Chris@64 986 template <>
Chris@64 987 struct PointerHelpers<AnyList, Kind::OTHER> {
Chris@64 988 static inline AnyList::Reader get(
Chris@64 989 PointerReader reader, const word* defaultValue = nullptr) {
Chris@64 990 return AnyList::Reader(reader.getListAnySize(defaultValue));
Chris@64 991 }
Chris@64 992 static inline AnyList::Builder get(
Chris@64 993 PointerBuilder builder, const word* defaultValue = nullptr) {
Chris@64 994 return AnyList::Builder(builder.getListAnySize(defaultValue));
Chris@64 995 }
Chris@64 996 static inline void set(PointerBuilder builder, AnyList::Reader value) {
Chris@64 997 builder.setList(value._reader);
Chris@64 998 }
Chris@64 999 static inline AnyList::Builder init(
Chris@64 1000 PointerBuilder builder, ElementSize elementSize, uint elementCount) {
Chris@64 1001 return AnyList::Builder(builder.initList(
Chris@64 1002 elementSize, bounded(elementCount) * ELEMENTS));
Chris@64 1003 }
Chris@64 1004 static inline AnyList::Builder init(
Chris@64 1005 PointerBuilder builder, uint16_t dataWordCount, uint16_t pointerCount, uint elementCount) {
Chris@64 1006 return AnyList::Builder(builder.initStructList(
Chris@64 1007 bounded(elementCount) * ELEMENTS,
Chris@64 1008 StructSize(bounded(dataWordCount) * WORDS,
Chris@64 1009 bounded(pointerCount) * POINTERS)));
Chris@64 1010 }
Chris@64 1011
Chris@64 1012 static void adopt(PointerBuilder builder, Orphan<AnyList>&& value) {
Chris@64 1013 builder.adopt(kj::mv(value.builder));
Chris@64 1014 }
Chris@64 1015 static Orphan<AnyList> disown(PointerBuilder builder) {
Chris@64 1016 return Orphan<AnyList>(builder.disown());
Chris@64 1017 }
Chris@64 1018 };
Chris@64 1019
Chris@64 1020 template <>
Chris@64 1021 struct OrphanGetImpl<AnyStruct, Kind::OTHER> {
Chris@64 1022 static inline AnyStruct::Builder apply(_::OrphanBuilder& builder) {
Chris@64 1023 return AnyStruct::Builder(builder.asStruct(_::StructSize(ZERO * WORDS, ZERO * POINTERS)));
Chris@64 1024 }
Chris@64 1025 static inline AnyStruct::Reader applyReader(const _::OrphanBuilder& builder) {
Chris@64 1026 return AnyStruct::Reader(builder.asStructReader(_::StructSize(ZERO * WORDS, ZERO * POINTERS)));
Chris@64 1027 }
Chris@64 1028 static inline void truncateListOf(_::OrphanBuilder& builder, ElementCount size) {
Chris@64 1029 builder.truncate(size, _::StructSize(ZERO * WORDS, ZERO * POINTERS));
Chris@64 1030 }
Chris@64 1031 };
Chris@64 1032
Chris@64 1033 template <>
Chris@64 1034 struct OrphanGetImpl<AnyList, Kind::OTHER> {
Chris@64 1035 static inline AnyList::Builder apply(_::OrphanBuilder& builder) {
Chris@64 1036 return AnyList::Builder(builder.asListAnySize());
Chris@64 1037 }
Chris@64 1038 static inline AnyList::Reader applyReader(const _::OrphanBuilder& builder) {
Chris@64 1039 return AnyList::Reader(builder.asListReaderAnySize());
Chris@64 1040 }
Chris@64 1041 static inline void truncateListOf(_::OrphanBuilder& builder, ElementCount size) {
Chris@64 1042 builder.truncate(size, ElementSize::POINTER);
Chris@64 1043 }
Chris@64 1044 };
Chris@64 1045
Chris@64 1046 } // namespace _ (private)
Chris@64 1047
Chris@64 1048 #if !CAPNP_LITE
Chris@64 1049
Chris@64 1050 template <typename T>
Chris@64 1051 struct PipelineHook::FromImpl {
Chris@64 1052 static inline kj::Own<PipelineHook> apply(typename T::Pipeline&& pipeline) {
Chris@64 1053 return from(kj::mv(pipeline._typeless));
Chris@64 1054 }
Chris@64 1055 };
Chris@64 1056
Chris@64 1057 template <>
Chris@64 1058 struct PipelineHook::FromImpl<AnyPointer> {
Chris@64 1059 static inline kj::Own<PipelineHook> apply(AnyPointer::Pipeline&& pipeline) {
Chris@64 1060 return kj::mv(pipeline.hook);
Chris@64 1061 }
Chris@64 1062 };
Chris@64 1063
Chris@64 1064 template <typename Pipeline, typename T>
Chris@64 1065 inline kj::Own<PipelineHook> PipelineHook::from(Pipeline&& pipeline) {
Chris@64 1066 return FromImpl<T>::apply(kj::fwd<Pipeline>(pipeline));
Chris@64 1067 }
Chris@64 1068
Chris@64 1069 #endif // !CAPNP_LITE
Chris@64 1070
Chris@64 1071 } // namespace capnp
Chris@64 1072
Chris@64 1073 #endif // CAPNP_ANY_H_