You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

292 lines
9.1 KiB
C++

/*=========================================================================
Program: Visualization Toolkit
Module: vtkExecutive.h
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
All rights reserved.
See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notice for more information.
=========================================================================*/
/**
* @class vtkExecutive
* @brief Superclass for all pipeline executives in VTK.
*
* vtkExecutive is the superclass for all pipeline executives in VTK.
* A VTK executive is responsible for controlling one instance of
* vtkAlgorithm. A pipeline consists of one or more executives that
* control data flow. Every reader, source, writer, or data
* processing algorithm in the pipeline is implemented in an instance
* of vtkAlgorithm.
*/
#ifndef vtkExecutive_h
#define vtkExecutive_h
#include "vtkCommonExecutionModelModule.h" // For export macro
#include "vtkObject.h"
class vtkAlgorithm;
class vtkAlgorithmOutput;
class vtkAlgorithmToExecutiveFriendship;
class vtkDataObject;
class vtkExecutiveInternals;
class vtkInformation;
class vtkInformationExecutivePortKey;
class vtkInformationExecutivePortVectorKey;
class vtkInformationIntegerKey;
class vtkInformationRequestKey;
class vtkInformationKeyVectorKey;
class vtkInformationVector;
class VTKCOMMONEXECUTIONMODEL_EXPORT vtkExecutive : public vtkObject
{
public:
vtkTypeMacro(vtkExecutive, vtkObject);
void PrintSelf(ostream& os, vtkIndent indent) override;
/**
* Get the algorithm to which this executive has been assigned.
*/
vtkAlgorithm* GetAlgorithm();
/**
* Generalized interface for asking the executive to fulfill
* pipeline requests.
*/
virtual vtkTypeBool ProcessRequest(
vtkInformation* request, vtkInformationVector** inInfo, vtkInformationVector* outInfo);
/**
* A special version of ProcessRequest meant specifically for the
* pipeline modified time request. This is an optimization since
* the request is called so often and it travels the full length of
* the pipeline. We augment the signature with method arguments
* containing the common information, specifically the output port
* through which the request was made and the resulting modified
* time. Note that unlike ProcessRequest the request information
* object may be nullptr for this method. It also does not contain a
* request identification key because the request is known from the
* method name.
*/
virtual int ComputePipelineMTime(vtkInformation* request, vtkInformationVector** inInfoVec,
vtkInformationVector* outInfoVec, int requestFromOutputPort, vtkMTimeType* mtime);
/**
* Bring the output information up to date.
*/
virtual int UpdateInformation() { return 1; }
//@{
/**
* Bring the algorithm's outputs up-to-date. Returns 1 for success
* and 0 for failure.
*/
virtual vtkTypeBool Update();
virtual vtkTypeBool Update(int port);
//@}
//@{
/**
* Get the number of input/output ports for the algorithm associated
* with this executive. Returns 0 if no algorithm is set.
*/
int GetNumberOfInputPorts();
int GetNumberOfOutputPorts();
//@}
/**
* Get the number of input connections on the given port.
*/
int GetNumberOfInputConnections(int port);
/**
* Get the pipeline information object for the given output port.
*/
virtual vtkInformation* GetOutputInformation(int port);
/**
* Get the pipeline information object for all output ports.
*/
vtkInformationVector* GetOutputInformation();
/**
* Get the pipeline information for the given input connection.
*/
vtkInformation* GetInputInformation(int port, int connection);
/**
* Get the pipeline information vectors for the given input port.
*/
vtkInformationVector* GetInputInformation(int port);
/**
* Get the pipeline information vectors for all inputs
*/
vtkInformationVector** GetInputInformation();
/**
* Get the executive managing the given input connection.
*/
vtkExecutive* GetInputExecutive(int port, int connection);
//@{
/**
* Get/Set the data object for an output port of the algorithm.
*/
virtual vtkDataObject* GetOutputData(int port);
virtual void SetOutputData(int port, vtkDataObject*, vtkInformation* info);
virtual void SetOutputData(int port, vtkDataObject*);
//@}
//@{
/**
* Get the data object for an input port of the algorithm.
*/
virtual vtkDataObject* GetInputData(int port, int connection);
virtual vtkDataObject* GetInputData(int port, int connection, vtkInformationVector** inInfoVec);
//@}
/**
* Get the output port that produces the given data object.
* Works only if the data was producer by this executive's
* algorithm.
* virtual vtkAlgorithmOutput* GetProducerPort(vtkDataObject*);
*/
//@{
/**
* Set a pointer to an outside instance of input or output
* information vectors. No references are held to the given
* vectors, and setting this does not change the executive object
* modification time. This is a preliminary interface to use in
* implementing filters with internal pipelines, and may change
* without notice when a future interface is created.
*/
void SetSharedInputInformation(vtkInformationVector** inInfoVec);
void SetSharedOutputInformation(vtkInformationVector* outInfoVec);
//@}
//@{
/**
* Participate in garbage collection.
*/
void Register(vtkObjectBase* o) override;
void UnRegister(vtkObjectBase* o) override;
//@}
/**
* Information key to store the executive/port number producing an
* information object.
*/
static vtkInformationExecutivePortKey* PRODUCER();
/**
* Information key to store the executive/port number pairs
* consuming an information object.
*/
static vtkInformationExecutivePortVectorKey* CONSUMERS();
/**
* Information key to store the output port number from which a
* request is made.
*/
static vtkInformationIntegerKey* FROM_OUTPUT_PORT();
//@{
/**
* Keys to program vtkExecutive::ProcessRequest with the default
* behavior for unknown requests.
*/
static vtkInformationIntegerKey* ALGORITHM_BEFORE_FORWARD();
static vtkInformationIntegerKey* ALGORITHM_AFTER_FORWARD();
static vtkInformationIntegerKey* ALGORITHM_DIRECTION();
static vtkInformationIntegerKey* FORWARD_DIRECTION();
static vtkInformationKeyVectorKey* KEYS_TO_COPY();
//@}
enum
{
RequestUpstream,
RequestDownstream
};
enum
{
BeforeForward,
AfterForward
};
/**
* An API to CallAlgorithm that allows you to pass in the info objects to
* be used
*/
virtual int CallAlgorithm(vtkInformation* request, int direction, vtkInformationVector** inInfo,
vtkInformationVector* outInfo);
protected:
vtkExecutive();
~vtkExecutive() override;
// Helper methods for subclasses.
int InputPortIndexInRange(int port, const char* action);
int OutputPortIndexInRange(int port, const char* action);
// Called by methods to check for a recursive pipeline update. A
// request should be fulfilled without making another request. This
// is used to help enforce that behavior. Returns 1 if no recursive
// request is occurring, and 0 otherwise. An error message is
// produced automatically if 0 is returned. The first argument is
// the name of the calling method (the one that should not be
// invoked recursively during an update). The second argument is
// the recursive request information object, if any. It is used to
// construct the error message.
int CheckAlgorithm(const char* method, vtkInformation* request);
virtual int ForwardDownstream(vtkInformation* request);
virtual int ForwardUpstream(vtkInformation* request);
virtual void CopyDefaultInformation(vtkInformation* request, int direction,
vtkInformationVector** inInfo, vtkInformationVector* outInfo);
// Reset the pipeline update values in the given output information object.
virtual void ResetPipelineInformation(int port, vtkInformation*) = 0;
// Bring the existence of output data objects up to date.
virtual int UpdateDataObject() = 0;
// Garbage collection support.
void ReportReferences(vtkGarbageCollector*) override;
virtual void SetAlgorithm(vtkAlgorithm* algorithm);
// The algorithm managed by this executive.
vtkAlgorithm* Algorithm;
// Flag set when the algorithm is processing a request.
int InAlgorithm;
// Pointers to an outside instance of input or output information.
// No references are held. These are used to implement internal
// pipelines.
vtkInformationVector** SharedInputInformation;
vtkInformationVector* SharedOutputInformation;
private:
// Store an information object for each output port of the algorithm.
vtkInformationVector* OutputInformation;
// Internal implementation details.
vtkExecutiveInternals* ExecutiveInternal;
friend class vtkAlgorithmToExecutiveFriendship;
private:
vtkExecutive(const vtkExecutive&) = delete;
void operator=(const vtkExecutive&) = delete;
};
#endif