Exemplo n.º 1
0
    void process() override
    {
        std::size_t num_inputs = VariadicInputs::getVariadicInputCount();

        sum = 0;

        for (std::size_t i_inputs = 0; i_inputs < num_inputs; ++i_inputs) {
            addInput(VariadicInputs::getVariadicInput(i_inputs));
        }

        InputPtr in = VariadicInputs::getVariadicInput(0);
        if (msg::isValue<int>(in.get())) {
            int out = (int)sum;
            msg::publish(out_, out);

        } else if (msg::isValue<double>(in.get())) {
            msg::publish(out_, sum);

        } else {
            // must be vector
            GenericVectorMessageConstPtr vec = msg::getMessage<GenericVectorMessage>(in.get());
            if (std::dynamic_pointer_cast<connection_types::GenericValueMessage<int> const>(vec->nestedType())) {
                int out = (int)sum;
                msg::publish(out_, out);
            } else {
                msg::publish(out_, sum);
            }
        }

        msg::publish(out_, sum);
    }
Exemplo n.º 2
0
    void addInput(const InputPtr& in)
    {
        if (msg::isValue<int>(in.get())) {
            sum += msg::getValue<int>(in.get());

        } else if (msg::isValue<double>(in.get())) {
            sum += msg::getValue<double>(in.get());

        } else {
            // must be vector
            GenericVectorMessageConstPtr vec = msg::getMessage<GenericVectorMessage>(in.get());
            if (std::dynamic_pointer_cast<GenericValueMessage<double>>(vec->nestedType())) {
                acc<double>(vec);
            } else if (std::dynamic_pointer_cast<GenericValueMessage<int>>(vec->nestedType())) {
                acc<int>(vec);
            }
        }
    }
Exemplo n.º 3
0
UUID SubgraphNode::addForwardingOutput(const UUID& internal_uuid, const TokenDataConstPtr& type, const std::string& label)
{
    graph_->registerUUID(internal_uuid);

    Output* external_output = VariadicOutputs::createVariadicOutput(type, label);

    InputPtr relay = createInternalInput(type, internal_uuid, label, true);

    crossConnectLabelChange(external_output, relay.get());

    std::weak_ptr<Output> external_output_weak = std::dynamic_pointer_cast<Output>(external_output->shared_from_this());
    relay->message_set.connect([this, external_output_weak, relay](Connectable*) {
        if (auto external_output = external_output_weak.lock()) {
            TokenPtr token = relay->getToken();
            if (is_iterating_) {
                connection_types::GenericVectorMessage::Ptr vector;
                if (!external_output->hasMessage()) {
                    vector = connection_types::GenericVectorMessage::make(token->getTokenData());
                } else {
                    auto collected = external_output->getAddedToken()->getTokenData()->cloneAs<TokenData>();
                    vector = std::dynamic_pointer_cast<connection_types::GenericVectorMessage>(collected);
                }
                apex_assert(vector);
                vector->addNestedValue(token->getTokenData());
                msg::publish(external_output.get(), vector);

                external_output->setType(vector);

            } else {
                msg::publish(external_output.get(), token->getTokenData());
            }
        }
    });

    external_to_internal_inputs_[external_output->getUUID()] = relay;

    relay_to_external_output_[internal_uuid] = external_output->getUUID();

    forwarding_connector_added(relay);

    return external_output->getUUID();
}