annotate win32-mingw/include/capnp/any.h @ 79:91c729825bca pa_catalina

Update build for AUDIO_COMPONENT_FIX
author Chris Cannam
date Wed, 30 Oct 2019 12:40:34 +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_