annotate win32-mingw/include/capnp/any.h @ 169:223a55898ab9 tip default

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