26 #ifndef __XRD_CL_OPERATIONS_HH__
27 #define __XRD_CL_OPERATIONS_HH__
143 std::promise<XRootDStatus>
prms;
149 std::function<void(const XRootDStatus&)>
final;
164 template<
bool HasHndl>
192 if( !op.valid )
throw std::invalid_argument(
"Cannot construct "
193 "Operation from an invalid Operation!" );
237 void Run( std::promise<XRootDStatus> prms,
240 static_assert(HasHndl,
"Only an operation that has a handler can be assigned to workflow");
241 handler->Assign( std::move( prms ), std::move(
final ) );
383 if( !
bool(
operation ) )
throw std::logic_error(
"Invalid pipeline." );
420 throw std::logic_error(
"Pipeline is already running" );
423 std::promise<XRootDStatus> prms;
424 ftr = prms.get_future();
425 operation->Run( std::move( prms ), std::move(
final ) );
436 std::future<XRootDStatus>
ftr;
450 return std::move( pipeline.
ftr );
463 return Async( std::move( pipeline ) ).get();
474 template<
template<
bool>
class Derived,
bool HasHndl,
typename HdlrFactory,
typename ... Args>
477 template<
template<
bool>
class, bool,
typename,
typename ...>
489 static_assert( !HasHndl,
"It is only possible to construct operation without handler" );
515 template<
typename Hdlr>
518 return this->
StreamImpl( HdlrFactory::Create( hdlr ) );
574 this->recovery = std::move( recovery );
575 return Transform<HasHndl>();
585 Derived<HasHndl> *me =
static_cast<Derived<HasHndl>*
>( this );
586 return new Derived<HasHndl>( std::move( *me ) );
597 Derived<HasHndl> *me =
static_cast<Derived<HasHndl>*
>( this );
598 return new Derived<true>( std::move( *me ) );
611 Derived<HasHndl> *me =
static_cast<Derived<HasHndl>*
>( this );
612 return Derived<to>( std::move( *me ) );
624 static_assert( !HasHndl,
"Operator >> is available only for operation without handler" );
626 return Transform<true>();
641 me.AddOperation( op.
Move() );
642 return me.template Transform<true>();
658 return me.template Transform<true>();
674 me.AddOperation( op.
Move() );
675 return me.template Transform<true>();
692 return me.template Transform<true>();
708 #endif // __XRD_CL_OPERATIONS_HH__
std::unique_ptr< Operation< true > > operation
First operation in the pipeline.
Definition: XrdClOperations.hh:431
Definition: XrdClAnyObject.hh:32
static Derived< true > PipeImpl(ConcreteOperation< Derived, true, HdlrFactory, Args...> &me, Operation< false > &op)
Definition: XrdClOperations.hh:654
Operation(Operation< from > &&op)
Move constructor between template instances.
Definition: XrdClOperations.hh:189
bool valid
Flag indicating if it is a valid object.
Definition: XrdClOperations.hh:293
std::future< XRootDStatus > ftr
The future result of the pipeline.
Definition: XrdClOperations.hh:436
static Derived< true > PipeImpl(ConcreteOperation< Derived, true, HdlrFactory, Args...> &me, Operation< true > &op)
Definition: XrdClOperations.hh:638
Pipeline(Operation< false > &&op)
Constructor.
Definition: XrdClOperations.hh:355
rcvry_func recovery
The recovery routine for the respective operation.
Definition: XrdClOperations.hh:154
Derived< true > operator|(Operation< true > &&op)
Definition: XrdClOperations.hh:540
Pipeline & operator=(Pipeline &&pipe)
Constructor.
Definition: XrdClOperations.hh:370
Derived< true > operator|(Operation< true > &op)
Definition: XrdClOperations.hh:528
Derived< true > operator>>(Hdlr &&hdlr)
Definition: XrdClOperations.hh:516
static Derived< true > PipeImpl(ConcreteOperation< Derived, false, HdlrFactory, Args...> &me, Operation< true > &op)
Definition: XrdClOperations.hh:670
void HandleResponseImpl(XRootDStatus *status, AnyObject *response, HostList *hostList=nullptr)
Callback function implementation;.
void dealloc(XRootDStatus *status, AnyObject *response, HostList *hostList)
Definition: XrdClOperations.hh:122
void AddOperation(Operation< true > *op)
Definition: XrdClOperations.hh:279
ConcreteOperation(ConcreteOperation< Derived, from, HdlrFactory, Args...> &&op)
Definition: XrdClOperations.hh:500
Derived< true > StreamImpl(ResponseHandler *handler)
Definition: XrdClOperations.hh:622
~PipelineHandler()
Destructor.
Definition: XrdClOperations.hh:92
Derived< true > operator|(Operation< false > &op)
Definition: XrdClOperations.hh:552
virtual ~Operation()
Destructor.
Definition: XrdClOperations.hh:200
void Assign(std::promise< XRootDStatus > prms, std::function< void(const XRootDStatus &)> final)
Pipeline(Operation< true > &&op)
Constructor.
Definition: XrdClOperations.hh:331
std::function< Operation< true > *(const XRootDStatus &)> rcvry_func
Type of the recovery function to be provided by the user.
Definition: XrdClOperations.hh:44
std::vector< HostInfo > HostList
Definition: XrdClXRootDResponses.hh:969
rcvry_func recovery
The recovery routine for this operation.
Definition: XrdClOperations.hh:704
void HandleResponseWithHosts(XRootDStatus *status, AnyObject *response, HostList *hostList)
Callback function.
XRootDStatus WaitFor(Pipeline pipeline)
Definition: XrdClOperations.hh:461
friend class ConcreteOperation
Definition: XrdClOperations.hh:478
std::tuple< Args...> args
Operation arguments.
Definition: XrdClOperations.hh:698
Pipeline(Pipeline &&pipe)
Definition: XrdClOperations.hh:361
friend std::future< XRootDStatus > Async(Pipeline)
Definition: XrdClOperations.hh:447
virtual std::string ToString()=0
Name of the operation.
std::unique_ptr< Operation< true > > nextOperation
Next operation in the pipeline.
Definition: XrdClOperations.hh:138
Pipeline(Operation< false > &op)
Constructor.
Definition: XrdClOperations.hh:346
Request status.
Definition: XrdClXRootDResponses.hh:214
Definition: XrdClOperations.hh:42
Operation()
Constructor.
Definition: XrdClOperations.hh:181
Definition: XrdClOperations.hh:56
Operation< HasHndl > * Move()
Definition: XrdClOperations.hh:583
void HandleResponse(XRootDStatus *status, AnyObject *response)
Callback function.
virtual XRootDStatus RunImpl()=0
Pipeline(Operation< true > &op)
Constructor.
Definition: XrdClOperations.hh:322
std::promise< XRootDStatus > prms
The promise that there will be a result (traveling along the pipeline)
Definition: XrdClOperations.hh:143
Handle an async response.
Definition: XrdClXRootDResponses.hh:974
Operation< true > * operator->()
Definition: XrdClOperations.hh:405
Derived< to > Transform()
Definition: XrdClOperations.hh:609
static Derived< true > PipeImpl(ConcreteOperation< Derived, false, HdlrFactory, Args...> &me, Operation< false > &op)
Definition: XrdClOperations.hh:687
void AddOperation(Operation< true > *operation)
Pipeline(Operation< false > *op)
Definition: XrdClOperations.hh:337
void ForceHandler(const XRootDStatus &status)
Definition: XrdClOperations.hh:266
virtual Operation< true > * ToHandled()=0
friend class PipelineHandler
Definition: XrdClOperations.hh:174
Derived< HasHndl > Recovery(rcvry_func recovery)
Set recovery procedure in case the operation fails.
Definition: XrdClOperations.hh:572
Operation< true > * ToHandled()
Definition: XrdClOperations.hh:594
PipelineHandler(rcvry_func &&recovery)
Default Constructor.
Definition: XrdClOperations.hh:74
void Run(std::function< void(const XRootDStatus &)> final=nullptr)
Definition: XrdClOperations.hh:417
ConcreteOperation(Args &&...args)
Definition: XrdClOperations.hh:487
void Run(std::promise< XRootDStatus > prms, std::function< void(const XRootDStatus &)> final)
Definition: XrdClOperations.hh:237
Pipeline(Operation< true > *op)
Constructor.
Definition: XrdClOperations.hh:313
std::unique_ptr< ResponseHandler > responseHandler
The handler of our operation.
Definition: XrdClOperations.hh:133
bool IsOK() const
We're fine.
Definition: XrdClStatus.hh:120
Derived< true > operator|(Operation< false > &&op)
Definition: XrdClOperations.hh:564
std::future< XRootDStatus > Async(Pipeline pipeline)
Definition: XrdClOperations.hh:447
Definition: XrdClOperations.hh:303
Definition: XrdClParallelOperation.hh:72
PipelineHandler(ResponseHandler *handler, rcvry_func &&recovery)
virtual Operation< HasHndl > * Move()=0
friend std::future< XRootDStatus > Async(Pipeline)
Definition: XrdClOperations.hh:447
std::unique_ptr< PipelineHandler > handler
Operation handler.
Definition: XrdClOperations.hh:288
Definition: XrdClOperations.hh:475