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); }
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); } } }
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(); }