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

22
#include "any.h"
23 24

#if !CAPNP_LITE
Kenton Varda's avatar
Kenton Varda committed
25
#include "capability.h"
26
#endif  // !CAPNP_LITE
Kenton Varda's avatar
Kenton Varda committed
27 28 29

namespace capnp {

30 31
#if !CAPNP_LITE

32
kj::Own<ClientHook> PipelineHook::getPipelinedCap(kj::Array<PipelineOp>&& ops) {
33 34 35
  return getPipelinedCap(ops.asPtr());
}

36
kj::Own<ClientHook> AnyPointer::Reader::getPipelinedCap(
37
    kj::ArrayPtr<const PipelineOp> ops) const {
Kenton Varda's avatar
Kenton Varda committed
38 39 40 41
  _::PointerReader pointer = reader;

  for (auto& op: ops) {
    switch (op.type) {
42 43 44
      case PipelineOp::Type::NOOP:
        break;

Kenton Varda's avatar
Kenton Varda committed
45 46 47 48 49 50 51 52 53
      case PipelineOp::Type::GET_POINTER_FIELD:
        pointer = pointer.getStruct(nullptr).getPointerField(op.pointerIndex * POINTERS);
        break;
    }
  }

  return pointer.getCapability();
}

54
AnyPointer::Pipeline AnyPointer::Pipeline::noop() {
55 56 57 58 59 60 61
  auto newOps = kj::heapArray<PipelineOp>(ops.size());
  for (auto i: kj::indices(ops)) {
    newOps[i] = ops[i];
  }
  return Pipeline(hook->addRef(), kj::mv(newOps));
}

62
AnyPointer::Pipeline AnyPointer::Pipeline::getPointerField(uint16_t pointerIndex) {
63 64 65 66 67 68 69 70 71 72 73
  auto newOps = kj::heapArray<PipelineOp>(ops.size() + 1);
  for (auto i: kj::indices(ops)) {
    newOps[i] = ops[i];
  }
  auto& newOp = newOps[ops.size()];
  newOp.type = PipelineOp::GET_POINTER_FIELD;
  newOp.pointerIndex = pointerIndex;

  return Pipeline(hook->addRef(), kj::mv(newOps));
}

74
kj::Own<ClientHook> AnyPointer::Pipeline::asCap() {
75 76 77
  return hook->getPipelinedCap(ops);
}

78 79
#endif  // !CAPNP_LITE

Kenton Varda's avatar
Kenton Varda committed
80
}  // namespace capnp