26 #ifndef __XRD_CL_OPERATIONS_HH__
27 #define __XRD_CL_OPERATIONS_HH__
42 template<
bool HasHndl>
class Operation;
143 std::promise<XRootDStatus>
prms;
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>();
Definition: XrdClAnyObject.hh:33
Definition: XrdClOperations.hh:476
Derived< HasHndl > Recovery(rcvry_func recovery)
Set recovery procedure in case the operation fails.
Definition: XrdClOperations.hh:572
std::tuple< Args... > args
Operation arguments.
Definition: XrdClOperations.hh:698
Derived< to > Transform()
Definition: XrdClOperations.hh:609
ConcreteOperation(ConcreteOperation< Derived, from, HdlrFactory, Args... > &&op)
Definition: XrdClOperations.hh:500
ConcreteOperation(Args &&... args)
Definition: XrdClOperations.hh:487
static Derived< true > PipeImpl(ConcreteOperation< Derived, true, HdlrFactory, Args... > &me, Operation< true > &op)
Definition: XrdClOperations.hh:638
static Derived< true > PipeImpl(ConcreteOperation< Derived, true, HdlrFactory, Args... > &me, Operation< false > &op)
Definition: XrdClOperations.hh:654
static Derived< true > PipeImpl(ConcreteOperation< Derived, false, HdlrFactory, Args... > &me, Operation< true > &op)
Definition: XrdClOperations.hh:670
Operation< HasHndl > * Move()
Definition: XrdClOperations.hh:583
Operation< true > * ToHandled()
Definition: XrdClOperations.hh:594
rcvry_func recovery
The recovery routine for this operation.
Definition: XrdClOperations.hh:704
Derived< true > operator|(Operation< true > &&op)
Definition: XrdClOperations.hh:540
Derived< true > StreamImpl(ResponseHandler *handler)
Definition: XrdClOperations.hh:622
static Derived< true > PipeImpl(ConcreteOperation< Derived, false, HdlrFactory, Args... > &me, Operation< false > &op)
Definition: XrdClOperations.hh:687
Derived< true > operator|(Operation< false > &op)
Definition: XrdClOperations.hh:552
Derived< true > operator|(Operation< true > &op)
Definition: XrdClOperations.hh:528
friend class ConcreteOperation
Definition: XrdClOperations.hh:478
Derived< true > operator>>(Hdlr &&hdlr)
Definition: XrdClOperations.hh:516
Derived< true > operator|(Operation< false > &&op)
Definition: XrdClOperations.hh:564
Definition: XrdClOperations.hh:166
virtual ~Operation()
Destructor.
Definition: XrdClOperations.hh:200
friend std::future< XRootDStatus > Async(Pipeline)
Definition: XrdClOperations.hh:447
virtual XRootDStatus RunImpl()=0
friend class PipelineHandler
Definition: XrdClOperations.hh:174
Operation()
Constructor.
Definition: XrdClOperations.hh:181
void ForceHandler(const XRootDStatus &status)
Definition: XrdClOperations.hh:266
void AddOperation(Operation< true > *op)
Definition: XrdClOperations.hh:279
bool valid
Flag indicating if it is a valid object.
Definition: XrdClOperations.hh:293
virtual std::string ToString()=0
Name of the operation.
std::unique_ptr< PipelineHandler > handler
Operation handler.
Definition: XrdClOperations.hh:288
virtual Operation< true > * ToHandled()=0
void Run(std::promise< XRootDStatus > prms, std::function< void(const XRootDStatus &)> final)
Definition: XrdClOperations.hh:237
virtual Operation< HasHndl > * Move()=0
Operation(Operation< from > &&op)
Move constructor between template instances.
Definition: XrdClOperations.hh:189
Definition: XrdClParallelOperation.hh:73
Definition: XrdClOperations.hh:57
void dealloc(XRootDStatus *status, AnyObject *response, HostList *hostList)
Definition: XrdClOperations.hh:122
void HandleResponseWithHosts(XRootDStatus *status, AnyObject *response, HostList *hostList)
Callback function.
std::unique_ptr< ResponseHandler > responseHandler
The handler of our operation.
Definition: XrdClOperations.hh:133
~PipelineHandler()
Destructor.
Definition: XrdClOperations.hh:92
std::promise< XRootDStatus > prms
The promise that there will be a result (traveling along the pipeline)
Definition: XrdClOperations.hh:143
PipelineHandler(ResponseHandler *handler, rcvry_func &&recovery)
PipelineHandler(rcvry_func &&recovery)
Default Constructor.
Definition: XrdClOperations.hh:74
rcvry_func recovery
The recovery routine for the respective operation.
Definition: XrdClOperations.hh:154
void HandleResponseImpl(XRootDStatus *status, AnyObject *response, HostList *hostList=nullptr)
Callback function implementation;.
void HandleResponse(XRootDStatus *status, AnyObject *response)
Callback function.
void AddOperation(Operation< true > *operation)
void Assign(std::promise< XRootDStatus > prms, std::function< void(const XRootDStatus &)> final)
std::unique_ptr< Operation< true > > nextOperation
Next operation in the pipeline.
Definition: XrdClOperations.hh:138
Definition: XrdClOperations.hh:304
Pipeline(Operation< true > *op)
Constructor.
Definition: XrdClOperations.hh:313
Operation< true > * operator->()
Definition: XrdClOperations.hh:405
std::future< XRootDStatus > ftr
The future result of the pipeline.
Definition: XrdClOperations.hh:436
Pipeline(Operation< true > &&op)
Constructor.
Definition: XrdClOperations.hh:331
friend std::future< XRootDStatus > Async(Pipeline)
Definition: XrdClOperations.hh:447
Pipeline(Operation< true > &op)
Constructor.
Definition: XrdClOperations.hh:322
Pipeline & operator=(Pipeline &&pipe)
Constructor.
Definition: XrdClOperations.hh:370
Pipeline(Pipeline &&pipe)
Definition: XrdClOperations.hh:361
void Run(std::function< void(const XRootDStatus &)> final=nullptr)
Definition: XrdClOperations.hh:417
Pipeline(Operation< false > *op)
Definition: XrdClOperations.hh:337
Pipeline(Operation< false > &&op)
Constructor.
Definition: XrdClOperations.hh:355
std::unique_ptr< Operation< true > > operation
First operation in the pipeline.
Definition: XrdClOperations.hh:431
Pipeline(Operation< false > &op)
Constructor.
Definition: XrdClOperations.hh:346
Handle an async response.
Definition: XrdClXRootDResponses.hh:975
Request status.
Definition: XrdClXRootDResponses.hh:215
Definition: XrdClAnyObject.hh:26
std::future< XRootDStatus > Async(Pipeline pipeline)
Definition: XrdClOperations.hh:447
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
XRootDStatus WaitFor(Pipeline pipeline)
Definition: XrdClOperations.hh:461
bool IsOK() const
We're fine.
Definition: XrdClStatus.hh:120