31namespace RobotRaconteur
67template <
typename Return,
typename Param>
80 virtual Return
Next(
const Param& v) = 0;
92 virtual bool TryNext(
const Param& v, Return& ret)
115 const Param& v, boost::function<
void(
const Return&,
const RR_SHARED_PTR<RobotRaconteurException>& err)> handler,
133 virtual void AsyncAbort(boost::function<
void(
const RR_SHARED_PTR<RobotRaconteurException>& err)> handler,
152 virtual void AsyncClose(boost::function<
void(
const RR_SHARED_PTR<RobotRaconteurException>& err)> handler,
163template <
typename Return>
164class Generator<Return, void> :
private boost::noncopyable
208 boost::function<
void(
const Return&,
const RR_SHARED_PTR<RobotRaconteurException>& err)> handler,
213 virtual void AsyncAbort(boost::function<
void(
const RR_SHARED_PTR<RobotRaconteurException>& err)> handler,
218 virtual void AsyncClose(boost::function<
void(
const RR_SHARED_PTR<RobotRaconteurException>& err)> handler,
227 std::vector<Return> ret;
232 ret.push_back(
Next());
248template <
typename Param>
249class Generator<void, Param> :
private boost::noncopyable
260 virtual void Next(
const Param& v) = 0;
294 boost::function<
void(
const RR_SHARED_PTR<RobotRaconteurException>& err)> handler,
299 virtual void AsyncAbort(boost::function<
void(
const RR_SHARED_PTR<RobotRaconteurException>& err)> handler,
304 virtual void AsyncClose(boost::function<
void(
const RR_SHARED_PTR<RobotRaconteurException>&)> handler,
309class ROBOTRACONTEUR_CORE_API GeneratorClientBase
314 RR_WEAK_PTR<ServiceStub> stub;
315 RR_WEAK_PTR<RobotRaconteurNode> node;
317 std::string service_path;
319 GeneratorClientBase(boost::string_ref name, int32_t
id,
const RR_SHARED_PTR<ServiceStub>& stub);
321 virtual RR_INTRUSIVE_PTR<MessageElement> NextBase(
const RR_INTRUSIVE_PTR<MessageElement>& v);
322 virtual void AsyncNextBase(
323 const RR_INTRUSIVE_PTR<MessageElement>& v,
324 boost::function<
void(
const RR_INTRUSIVE_PTR<MessageElement>&,
const RR_SHARED_PTR<RobotRaconteurException>&,
325 const RR_SHARED_PTR<RobotRaconteurNode>&)>
329 static void AsyncNextBase1(
330 const RR_INTRUSIVE_PTR<MessageEntry>& ret,
const RR_SHARED_PTR<RobotRaconteurException>& err,
331 boost::function<
void(
const RR_INTRUSIVE_PTR<MessageElement>&,
const RR_SHARED_PTR<RobotRaconteurException>&,
332 const RR_SHARED_PTR<RobotRaconteurNode>&)>
334 const RR_WEAK_PTR<RobotRaconteurNode>& node);
337 RR_SHARED_PTR<ServiceStub> GetStub();
339 virtual void Abort();
340 virtual void AsyncAbort(boost::function<
void(
const RR_SHARED_PTR<RobotRaconteurException>&)> handler,
342 virtual void Close();
343 virtual void AsyncClose(boost::function<
void(
const RR_SHARED_PTR<RobotRaconteurException>&)> handler,
345 std::string GetMemberName();
347 virtual ~GeneratorClientBase() {}
352template <
typename Return>
353static void GeneratorClient_AsyncNext1(
354 const RR_INTRUSIVE_PTR<MessageElement>& v2,
const RR_SHARED_PTR<RobotRaconteurException>& err,
355 const RR_SHARED_PTR<RobotRaconteurNode>& node,
356 boost::function<
void(
const Return&,
const RR_SHARED_PTR<RobotRaconteurException>&)> handler)
360 detail::InvokeHandlerWithException(node, handler, err);
366 ret = RRPrimUtil<Return>::PreUnpack(node->UnpackAnyType<
typename RRPrimUtil<Return>::BoxedType>(v2));
368 catch (std::exception& e)
370 detail::InvokeHandlerWithException(node, handler, e);
373 detail::InvokeHandler<Return>(node, handler, ret);
376ROBOTRACONTEUR_CORE_API
void GeneratorClient_AsyncNext2(
377 const RR_INTRUSIVE_PTR<MessageElement>& v2,
const RR_SHARED_PTR<RobotRaconteurException>& err,
378 const RR_SHARED_PTR<RobotRaconteurNode>& node,
379 boost::function<
void(
const RR_SHARED_PTR<RobotRaconteurException>&)> handler);
382template <
typename Return,
typename Param>
383class GeneratorClient :
public Generator<Return, Param>,
public GeneratorClientBase
386 GeneratorClient(boost::string_ref name, int32_t
id,
const RR_SHARED_PTR<ServiceStub>& stub)
387 : GeneratorClientBase(name, id, stub)
390 RR_OVIRTUAL Return Next(
const Param& v) RR_OVERRIDE
392 RR_INTRUSIVE_PTR<MessageElement> v1 = CreateMessageElement(
393 "", GetStub()->RRGetNode()->
template PackAnyType<
typename RRPrimUtil<Param>::BoxedType>(
394 RRPrimUtil<Param>::PrePack(v)));
395 RR_INTRUSIVE_PTR<MessageElement> v2 = NextBase(v1);
396 return RRPrimUtil<Return>::PreUnpack(
397 GetStub()->RRGetNode()->
template UnpackAnyType<
typename RRPrimUtil<Return>::BoxedType>(v2));
399 RR_OVIRTUAL
void AsyncNext(
400 const Param& v, boost::function<
void(
const Return&,
const RR_SHARED_PTR<RobotRaconteurException>&)> handler,
403 RR_INTRUSIVE_PTR<MessageElement> v1 = CreateMessageElement(
404 "", GetStub()->RRGetNode()->
template PackAnyType<
typename RRPrimUtil<Param>::BoxedType>(
405 RRPrimUtil<Param>::PrePack(v)));
407 boost::bind<void>(&detail::GeneratorClient_AsyncNext1<Return>, RR_BOOST_PLACEHOLDERS(_1),
408 RR_BOOST_PLACEHOLDERS(_2), RR_BOOST_PLACEHOLDERS(_3), handler),
411 RR_OVIRTUAL
void Abort() RR_OVERRIDE { GeneratorClientBase::Abort(); }
412 RR_OVIRTUAL
void AsyncAbort(boost::function<
void(
const RR_SHARED_PTR<RobotRaconteurException>&)> handler,
415 GeneratorClientBase::AsyncAbort(handler, timeout);
417 RR_OVIRTUAL
void Close() RR_OVERRIDE { GeneratorClientBase::Close(); }
418 RR_OVIRTUAL
void AsyncClose(boost::function<
void(
const RR_SHARED_PTR<RobotRaconteurException>&)> handler,
421 GeneratorClientBase::AsyncAbort(handler, timeout);
425template <
typename Return>
426class GeneratorClient<Return, void> :
public Generator<Return, void>,
public GeneratorClientBase
429 GeneratorClient(boost::string_ref name, int32_t
id,
const RR_SHARED_PTR<ServiceStub>& stub)
430 : GeneratorClientBase(name, id, stub)
433 RR_OVIRTUAL Return Next() RR_OVERRIDE
435 RR_INTRUSIVE_PTR<MessageElement> v2 = NextBase(RR_INTRUSIVE_PTR<MessageElement>());
436 return RRPrimUtil<Return>::PreUnpack(
437 GetStub()->RRGetNode()->
template UnpackAnyType<
typename RRPrimUtil<Return>::BoxedType>(v2));
439 RR_OVIRTUAL
void AsyncNext(
440 boost::function<
void(
const Return&,
const RR_SHARED_PTR<RobotRaconteurException>&)> handler,
443 AsyncNextBase(RR_INTRUSIVE_PTR<MessageElement>(),
444 boost::bind<void>(&detail::GeneratorClient_AsyncNext1<Return>, RR_BOOST_PLACEHOLDERS(_1),
445 RR_BOOST_PLACEHOLDERS(_2), RR_BOOST_PLACEHOLDERS(_3), handler),
448 RR_OVIRTUAL
void Abort() RR_OVERRIDE { GeneratorClientBase::Abort(); }
449 RR_OVIRTUAL
void AsyncAbort(boost::function<
void(
const RR_SHARED_PTR<RobotRaconteurException>&)> handler,
452 GeneratorClientBase::AsyncAbort(handler, timeout);
454 RR_OVIRTUAL
void Close() RR_OVERRIDE { GeneratorClientBase::Close(); }
455 RR_OVIRTUAL
void AsyncClose(boost::function<
void(
const RR_SHARED_PTR<RobotRaconteurException>&)> handler,
458 GeneratorClientBase::AsyncAbort(handler, timeout);
462template <
typename Param>
463class GeneratorClient<void, Param> :
public Generator<void, Param>,
public GeneratorClientBase
466 GeneratorClient(boost::string_ref name, int32_t
id,
const RR_SHARED_PTR<ServiceStub>& stub)
467 : GeneratorClientBase(name, id, stub)
470 RR_OVIRTUAL
void Next(
const Param& v) RR_OVERRIDE
472 RR_INTRUSIVE_PTR<MessageElement> v1 = CreateMessageElement(
473 "", GetStub()->RRGetNode()->
template PackAnyType<
typename RRPrimUtil<Param>::BoxedType>(
474 RRPrimUtil<Param>::PrePack(v)));
477 RR_OVIRTUAL
void AsyncNext(
const Param& v,
478 boost::function<
void(
const RR_SHARED_PTR<RobotRaconteurException>&)> handler,
481 RR_INTRUSIVE_PTR<MessageElement> v1 = CreateMessageElement(
482 "", GetStub()->RRGetNode()->
template PackAnyType<
typename RRPrimUtil<Param>::BoxedType>(
483 RRPrimUtil<Param>::PrePack(v)));
485 boost::bind<void>(&detail::GeneratorClient_AsyncNext2, RR_BOOST_PLACEHOLDERS(_1),
486 RR_BOOST_PLACEHOLDERS(_2), RR_BOOST_PLACEHOLDERS(_3), RR_MOVE(handler)),
489 RR_OVIRTUAL
void Abort() RR_OVERRIDE { GeneratorClientBase::Abort(); }
490 RR_OVIRTUAL
void AsyncAbort(boost::function<
void(
const RR_SHARED_PTR<RobotRaconteurException>&)> handler,
493 GeneratorClientBase::AsyncAbort(handler, timeout);
495 RR_OVIRTUAL
void Close() RR_OVERRIDE { GeneratorClientBase::Close(); }
496 RR_OVIRTUAL
void AsyncClose(boost::function<
void(
const RR_SHARED_PTR<RobotRaconteurException>&)> handler,
499 GeneratorClientBase::AsyncAbort(handler, timeout);
505class ROBOTRACONTEUR_CORE_API GeneratorServerBase :
private boost::noncopyable
510 RR_WEAK_PTR<ServiceSkel> skel;
511 RR_INTRUSIVE_PTR<MessageElement> m;
512 RR_SHARED_PTR<ServerEndpoint> ep;
513 RR_WEAK_PTR<RobotRaconteurNode> node;
514 std::string service_path;
516 boost::posix_time::ptime last_access_time;
518 GeneratorServerBase(boost::string_ref name, int32_t index,
const RR_SHARED_PTR<ServiceSkel>& skel,
519 const RR_SHARED_PTR<ServerEndpoint>& ep);
522 friend class ServiceSkel;
524 virtual void CallNext(
const RR_INTRUSIVE_PTR<MessageEntry>& m) = 0;
526 virtual uint32_t GetEndpoint();
528 virtual ~GeneratorServerBase() {}
531 static void EndAsyncCallNext(
const RR_WEAK_PTR<ServiceSkel>& skel,
const RR_INTRUSIVE_PTR<MessageElement>& ret,
532 const RR_SHARED_PTR<RobotRaconteurException>& err, int32_t index,
533 const RR_INTRUSIVE_PTR<MessageEntry>& m,
const RR_SHARED_PTR<ServerEndpoint>& ep);
535 template <
typename Return>
536 static void CallNext1(Return v2,
const RR_SHARED_PTR<RobotRaconteurException>& err, int32_t index,
537 const RR_WEAK_PTR<ServiceSkel>& skel,
const RR_INTRUSIVE_PTR<MessageEntry>& m,
538 const RR_SHARED_PTR<ServerEndpoint>& ep)
540 RR_SHARED_PTR<ServiceSkel> skel1 = skel.lock();
541 RR_SHARED_PTR<RobotRaconteurException> err2 = err;
545 err2 = RR_MAKE_SHARED<InvalidOperationException>(
"Service skel released");
549 GeneratorServerBase::EndAsyncCallNext(skel, RR_INTRUSIVE_PTR<MessageElement>(), err2, index, m, ep);
553 RR_INTRUSIVE_PTR<MessageElement> v3 =
554 CreateMessageElement(
"", skel1->RRGetNode()->template PackAnyType<
typename RRPrimUtil<Return>::BoxedType>(
555 RRPrimUtil<Return>::PrePack(v2)));
556 GeneratorServerBase::EndAsyncCallNext(skel, v3, err, index, m, ep);
559 static void CallNext2(
const RR_SHARED_PTR<RobotRaconteurException>& err, int32_t index,
560 const RR_WEAK_PTR<ServiceSkel>& skel,
const RR_INTRUSIVE_PTR<MessageEntry>& m,
561 const RR_SHARED_PTR<ServerEndpoint>& ep)
563 RR_SHARED_PTR<ServiceSkel> skel1 = skel.lock();
564 RR_SHARED_PTR<RobotRaconteurException> err2 = err;
568 err2 = RR_MAKE_SHARED<InvalidOperationException>(
"Service skel released");
572 GeneratorServerBase::EndAsyncCallNext(skel, RR_INTRUSIVE_PTR<MessageElement>(), err2, index, m, ep);
576 RR_INTRUSIVE_PTR<MessageElement> v3;
577 GeneratorServerBase::EndAsyncCallNext(skel, v3, err2, index, m, ep);
581template <
typename Return,
typename Param>
582class GeneratorServer :
public GeneratorServerBase
585 RR_SHARED_PTR<Generator<Return, Param> > generator;
588 GeneratorServer(
const RR_SHARED_PTR<Generator<Return, Param> >& generator, boost::string_ref name, int32_t
id,
589 const RR_SHARED_PTR<ServiceSkel>& skel,
const RR_SHARED_PTR<ServerEndpoint>& ep)
590 : GeneratorServerBase(name, id, skel, ep)
594 this->generator = generator;
597 RR_OVIRTUAL
void CallNext(
const RR_INTRUSIVE_PTR<MessageEntry>& m) RR_OVERRIDE
599 ROBOTRACONTEUR_LOG_TRACE_COMPONENT_PATH(node, Service, ep->GetLocalEndpoint(), service_path, name,
600 "Generator CallNext with id " << index);
601 RR_SHARED_PTR<ServiceSkel> skel1 = skel.lock();
607 if (m->Error != MessageErrorType_None)
609 if (m->Error == MessageErrorType_StopIteration)
611 generator->AsyncClose(boost::bind<void>(&GeneratorServerBase::CallNext1<int32_t>, 0,
612 RR_BOOST_PLACEHOLDERS(_1), index, skel, m, ep));
616 generator->AsyncAbort(boost::bind<void>(&GeneratorServerBase::CallNext1<int32_t>, 0,
617 RR_BOOST_PLACEHOLDERS(_1), index, skel, m, ep));
622 Param v = RRPrimUtil<Param>::PreUnpack(
623 skel1->RRGetNode()->template UnpackAnyType<
typename RRPrimUtil<Param>::BoxedType>(
624 m->FindElement(
"parameter")));
625 generator->AsyncNext(v,
626 boost::bind<void>(&GeneratorServerBase::CallNext1<Return>, RR_BOOST_PLACEHOLDERS(_1),
627 RR_BOOST_PLACEHOLDERS(_2), index, skel, m, ep));
631 RR_OVIRTUAL ~GeneratorServer() RR_OVERRIDE {}
634template <
typename Return>
635class GeneratorServer<Return, void> :
public GeneratorServerBase
638 RR_SHARED_PTR<Generator<Return, void> > generator;
641 GeneratorServer(RR_SHARED_PTR<Generator<Return, void> > generator, boost::string_ref name, int32_t
id,
642 const RR_SHARED_PTR<ServiceSkel>& skel,
const RR_SHARED_PTR<ServerEndpoint>& ep)
643 : GeneratorServerBase(name, id, skel, ep)
647 this->generator = generator;
650 RR_OVIRTUAL
void CallNext(
const RR_INTRUSIVE_PTR<MessageEntry>& m) RR_OVERRIDE
652 RR_SHARED_PTR<ServiceSkel> skel1 = skel.lock();
658 if (m->Error != MessageErrorType_None)
660 if (m->Error == MessageErrorType_StopIteration)
662 generator->AsyncClose(boost::bind<void>(&GeneratorServerBase::CallNext1<int32_t>, 0,
663 RR_BOOST_PLACEHOLDERS(_1), index, skel, m, ep));
667 generator->AsyncAbort(boost::bind<void>(&GeneratorServerBase::CallNext1<int32_t>, 0,
668 RR_BOOST_PLACEHOLDERS(_1), index, skel, m, ep));
673 generator->AsyncNext(boost::bind<void>(&GeneratorServerBase::CallNext1<Return>, RR_BOOST_PLACEHOLDERS(_1),
674 RR_BOOST_PLACEHOLDERS(_2), index, skel, m, ep));
677 RR_OVIRTUAL ~GeneratorServer() RR_OVERRIDE {}
680template <
typename Param>
681class GeneratorServer<void, Param> :
public GeneratorServerBase
684 RR_SHARED_PTR<Generator<void, Param> > generator;
687 GeneratorServer(RR_SHARED_PTR<Generator<void, Param> > generator, boost::string_ref name, int32_t
id,
688 const RR_SHARED_PTR<ServiceSkel>& skel,
const RR_SHARED_PTR<ServerEndpoint>& ep)
689 : GeneratorServerBase(name, id, skel, ep)
693 this->generator = generator;
696 RR_OVIRTUAL
void CallNext(
const RR_INTRUSIVE_PTR<MessageEntry>& m) RR_OVERRIDE
698 RR_SHARED_PTR<ServiceSkel> skel1 = skel.lock();
704 if (m->Error != MessageErrorType_None)
706 if (m->Error == MessageErrorType_StopIteration)
708 generator->AsyncClose(boost::bind<void>(&GeneratorServerBase::CallNext1<int32_t>, 0,
709 RR_BOOST_PLACEHOLDERS(_1), index, skel, m, ep));
713 generator->AsyncAbort(boost::bind<void>(&GeneratorServerBase::CallNext1<int32_t>, 0,
714 RR_BOOST_PLACEHOLDERS(_1), index, skel, m, ep));
719 Param v = RRPrimUtil<Param>::PreUnpack(
720 skel1->RRGetNode()->template UnpackAnyType<
typename RRPrimUtil<Param>::BoxedType>(
721 m->FindElement(
"parameter")));
722 generator->AsyncNext(
723 v, boost::bind<void>(&GeneratorServerBase::CallNext2, RR_BOOST_PLACEHOLDERS(_1), index, skel, m, ep));
726 RR_OVIRTUAL ~GeneratorServer() RR_OVERRIDE {}
739template <
typename Return,
typename Param>
744 RR_OVIRTUAL Return
Next(
const Param& v) RR_OVERRIDE = 0;
747 const Param& v, boost::function<
void(
const Return&,
const RR_SHARED_PTR<RobotRaconteurException>& err)> handler,
752 RR_WEAK_PTR<RobotRaconteurNode> node;
757 catch (std::exception& exp)
759 detail::InvokeHandlerWithException(node, handler, exp);
762 detail::InvokeHandler(node, handler, r);
765 RR_OVIRTUAL
void Abort() RR_OVERRIDE = 0;
771 RR_WEAK_PTR<RobotRaconteurNode> node;
776 catch (std::exception& exp)
778 detail::InvokeHandlerWithException(node, handler, exp);
781 detail::InvokeHandler(node, handler);
784 RR_OVIRTUAL
void Close() RR_OVERRIDE = 0;
790 RR_WEAK_PTR<RobotRaconteurNode> node;
795 catch (std::exception& exp)
797 detail::InvokeHandlerWithException(node, handler, exp);
800 detail::InvokeHandler(node, handler);
806template <
typename Return>
811 RR_OVIRTUAL Return
Next() RR_OVERRIDE = 0;
819 RR_WEAK_PTR<RobotRaconteurNode> node;
824 catch (std::exception& exp)
826 detail::InvokeHandlerWithException(node, handler, exp);
829 detail::InvokeHandler(node, handler, r);
832 RR_OVIRTUAL
void Abort() RR_OVERRIDE = 0;
838 RR_WEAK_PTR<RobotRaconteurNode> node;
843 catch (std::exception& exp)
845 detail::InvokeHandlerWithException(node, handler, exp);
848 detail::InvokeHandler(node, handler);
851 RR_OVIRTUAL
void Close() RR_OVERRIDE = 0;
857 RR_WEAK_PTR<RobotRaconteurNode> node;
862 catch (std::exception& exp)
864 detail::InvokeHandlerWithException(node, handler, exp);
867 detail::InvokeHandler(node, handler);
873template <
typename Param>
878 RR_OVIRTUAL
void Next(
const Param& v) RR_OVERRIDE = 0;
881 boost::function<
void(
const RR_SHARED_PTR<RobotRaconteurException>&)> handler,
885 RR_WEAK_PTR<RobotRaconteurNode> node;
890 catch (std::exception& exp)
892 detail::InvokeHandlerWithException(node, handler, exp);
895 detail::InvokeHandler(node, handler);
898 RR_OVIRTUAL
void Abort() RR_OVERRIDE = 0;
904 RR_WEAK_PTR<RobotRaconteurNode> node;
909 catch (std::exception& exp)
911 detail::InvokeHandlerWithException(node, handler, exp);
914 detail::InvokeHandler(node, handler);
917 RR_OVIRTUAL
void Close() RR_OVERRIDE = 0;
923 RR_WEAK_PTR<RobotRaconteurNode> node;
928 catch (std::exception& exp)
930 detail::InvokeHandlerWithException(node, handler, exp);
933 detail::InvokeHandler(node, handler);
954 typename T::iterator iter;
955 boost::mutex range_lock;
959 RangeGenerator(
const T& range)
963 this->iter = this->range.begin();
967 RR_OVIRTUAL
typename T::value_type
Next() RR_OVERRIDE
969 boost::mutex::scoped_lock lock(range_lock);
976 if (iter == range.end())
984 RR_OVIRTUAL
void Abort() RR_OVERRIDE
986 boost::mutex::scoped_lock lock(range_lock);
991 RR_OVIRTUAL
void Close() RR_OVERRIDE
993 boost::mutex::scoped_lock lock(range_lock);
1006template <
typename T>
1009 return RR_MAKE_SHARED<RangeGenerator<T> >(range);
1012#ifndef ROBOTRACONTEUR_NO_CXX11_TEMPLATE_ALIASES
1013template <
typename Return,
typename Param>
1014using GeneratorPtr = RR_SHARED_PTR<Generator<Return, Param> >;
1015template <
typename Return,
typename Param>
1016using GeneratorConstPtr = RR_SHARED_PTR<const Generator<Return, Param> >;
1017template <
typename T>
1018using RangeGeneratorPtr = RR_SHARED_PTR<RangeGenerator<T> >;
1019template <
typename T>
1020using RangeGeneratorConstPtr = RR_SHARED_PTR<const RangeGenerator<T> >;
boost::shared_ptr< RangeGenerator< T > > CreateRangeGenerator(const T &range)
Create a RangeGenerator from a range.
Definition Generator.h:1007
#define RR_TIMEOUT_INFINITE
Disable timeout for asynchronous operations.
Definition RobotRaconteurConstants.h:566
virtual bool TryNext(Return &ret)
Try to advance the generator. Return false if no more values are available.
Definition Generator.h:187
virtual void AsyncClose(boost::function< void(const boost::shared_ptr< RobotRaconteurException > &err)> handler, int32_t timeout=RR_TIMEOUT_INFINITE)=0
Asynchronously closes the generator.
virtual void Close()=0
Close the generator.
virtual void AsyncNext(boost::function< void(const Return &, const boost::shared_ptr< RobotRaconteurException > &err)> handler, int32_t timeout=RR_TIMEOUT_INFINITE)=0
Asynchronously advance the generator.
virtual void AsyncAbort(boost::function< void(const boost::shared_ptr< RobotRaconteurException > &err)> handler, int32_t timeout=RR_TIMEOUT_INFINITE)=0
Asynchronously abort the generator.
virtual Return Next()=0
Advance the generator.
virtual std::vector< Return > NextAll()
Automatically call Next() repeatedly and return std::vector of results.
Definition Generator.h:225
virtual void Abort()=0
Abort the generator.
virtual void AsyncClose(boost::function< void(const boost::shared_ptr< RobotRaconteurException > &)> handler, int32_t timeout=RR_TIMEOUT_INFINITE)=0
Asynchronously closes the generator.
virtual void AsyncNext(const Param &v, boost::function< void(const boost::shared_ptr< RobotRaconteurException > &err)> handler, int32_t timeout=RR_TIMEOUT_INFINITE)=0
Asynchronously advance the generator.
virtual void Close()=0
Close the generator.
virtual void AsyncAbort(boost::function< void(const boost::shared_ptr< RobotRaconteurException > &err)> handler, int32_t timeout=RR_TIMEOUT_INFINITE)=0
Asynchronously abort the generator.
virtual void Next(const Param &v)=0
Advance the generator.
virtual void Abort()=0
Abort the generator.
virtual bool TryNext(const Param &v)
Try to advance the generator. Return false if no more values are available.
Definition Generator.h:272
Generator type for use with generator functions, with parameter and return.
Definition Generator.h:69
virtual void Abort()=0
Abort the generator.
virtual void Close()=0
Close the generator.
virtual bool TryNext(const Param &v, Return &ret)
Try to advance the generator. Return false if no more values are available.
Definition Generator.h:92
virtual void AsyncAbort(boost::function< void(const boost::shared_ptr< RobotRaconteurException > &err)> handler, int32_t timeout=RR_TIMEOUT_INFINITE)=0
Asynchronously abort the generator.
virtual void AsyncNext(const Param &v, boost::function< void(const Return &, const boost::shared_ptr< RobotRaconteurException > &err)> handler, int32_t timeout=RR_TIMEOUT_INFINITE)=0
Asynchronously advance the generator.
virtual void AsyncClose(boost::function< void(const boost::shared_ptr< RobotRaconteurException > &err)> handler, int32_t timeout=RR_TIMEOUT_INFINITE)=0
Asynchronously closes the generator.
virtual Return Next(const Param &v)=0
Advance the generator.
InvalidOperationException(const std::string &message, std::string sub_name="", const boost::intrusive_ptr< RRValue > ¶m_=boost::intrusive_ptr< RRValue >())
Construct an InvalidOperationException.
OperationAbortedException(const std::string &message, std::string sub_name="", const boost::intrusive_ptr< RRValue > ¶m_=boost::intrusive_ptr< RRValue >())
Construct a OperationAbortedException.
Utility class to use a C++ range with Generator<Return,void>.
Definition Generator.h:951
RR_OVIRTUAL void Close() RR_OVERRIDE
Close the generator.
Definition Generator.h:991
RR_OVIRTUAL T::value_type Next() RR_OVERRIDE
Advance the generator.
Definition Generator.h:967
RR_OVIRTUAL void Abort() RR_OVERRIDE
Abort the generator.
Definition Generator.h:984
Base class for Robot Raconteur exceptions.
Definition Error.h:53
Server endpoint representing a client connection.
Definition Service.h:728
Exception thrown when a generator has finished sending results.
Definition Error.h:1224
StopIterationException(const std::string &message, std::string sub_name="", const boost::intrusive_ptr< RRValue > ¶m_=boost::intrusive_ptr< RRValue >())
Construct a StopIterationException.
RR_OVIRTUAL void Abort() RR_OVERRIDE=0
Abort the generator.
RR_OVIRTUAL void AsyncNext(boost::function< void(const Return &, const boost::shared_ptr< RobotRaconteurException > &err)> handler, int32_t timeout=RR_TIMEOUT_INFINITE) RR_OVERRIDE
Asynchronously advance the generator.
Definition Generator.h:813
RR_OVIRTUAL void Close() RR_OVERRIDE=0
Close the generator.
RR_OVIRTUAL Return Next() RR_OVERRIDE=0
Advance the generator.
RR_OVIRTUAL void AsyncAbort(boost::function< void(const boost::shared_ptr< RobotRaconteurException > &)> handler, int32_t timeout=RR_TIMEOUT_INFINITE) RR_OVERRIDE
Asynchronously abort the generator.
Definition Generator.h:834
RR_OVIRTUAL void AsyncClose(boost::function< void(const boost::shared_ptr< RobotRaconteurException > &)> handler, int32_t timeout=RR_TIMEOUT_INFINITE) RR_OVERRIDE
Asynchronously closes the generator.
Definition Generator.h:853
RR_OVIRTUAL void Close() RR_OVERRIDE=0
Close the generator.
RR_OVIRTUAL void Next(const Param &v) RR_OVERRIDE=0
Advance the generator.
RR_OVIRTUAL void AsyncAbort(boost::function< void(const boost::shared_ptr< RobotRaconteurException > &)> handler, int32_t timeout=RR_TIMEOUT_INFINITE) RR_OVERRIDE
Asynchronously abort the generator.
Definition Generator.h:900
RR_OVIRTUAL void Abort() RR_OVERRIDE=0
Abort the generator.
RR_OVIRTUAL void AsyncNext(const Param &v, boost::function< void(const boost::shared_ptr< RobotRaconteurException > &)> handler, int32_t timeout=RR_TIMEOUT_INFINITE) RR_OVERRIDE
Asynchronously advance the generator.
Definition Generator.h:880
RR_OVIRTUAL void AsyncClose(boost::function< void(const boost::shared_ptr< RobotRaconteurException > &)> handler, int32_t timeout=RR_TIMEOUT_INFINITE) RR_OVERRIDE
Asynchronously closes the generator.
Definition Generator.h:919
Helper class for synchronous service generators.
Definition Generator.h:741
RR_OVIRTUAL void AsyncClose(boost::function< void(const boost::shared_ptr< RobotRaconteurException > &)> handler, int32_t timeout=RR_TIMEOUT_INFINITE) RR_OVERRIDE
Asynchronously closes the generator.
Definition Generator.h:786
RR_OVIRTUAL void Close() RR_OVERRIDE=0
Close the generator.
RR_OVIRTUAL void AsyncNext(const Param &v, boost::function< void(const Return &, const boost::shared_ptr< RobotRaconteurException > &err)> handler, int32_t timeout=RR_TIMEOUT_INFINITE) RR_OVERRIDE
Asynchronously advance the generator.
Definition Generator.h:746
RR_OVIRTUAL Return Next(const Param &v) RR_OVERRIDE=0
Advance the generator.
RR_OVIRTUAL void Abort() RR_OVERRIDE=0
Abort the generator.
RR_OVIRTUAL void AsyncAbort(boost::function< void(const boost::shared_ptr< RobotRaconteurException > &)> handler, int32_t timeout=RR_TIMEOUT_INFINITE) RR_OVERRIDE
Asynchronously abort the generator.
Definition Generator.h:767