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.

237 lines
7.8 KiB
C++

/*=========================================================================
Program: Visualization Toolkit
Module: vtkDemandDrivenPipeline.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 vtkDemandDrivenPipeline
* @brief Executive supporting on-demand execution.
*
* vtkDemandDrivenPipeline is an executive that will execute an
* algorithm only when its outputs are out-of-date with respect to its
* inputs.
*/
#ifndef vtkDemandDrivenPipeline_h
#define vtkDemandDrivenPipeline_h
#include "vtkCommonExecutionModelModule.h" // For export macro
#include "vtkExecutive.h"
class vtkAbstractArray;
class vtkDataArray;
class vtkDataSetAttributes;
class vtkDemandDrivenPipelineInternals;
class vtkFieldData;
class vtkInformation;
class vtkInformationIntegerKey;
class vtkInformationVector;
class vtkInformationKeyVectorKey;
class vtkInformationUnsignedLongKey;
///\defgroup InformationKeys Information Keys
/// The VTK pipeline relies on algorithms providing information about their
/// input and output and responding to requests. The information objects used
/// to perform these actions map known keys to values. This is a list of keys
/// that information objects use and what each key should be used for.
///
class VTKCOMMONEXECUTIONMODEL_EXPORT vtkDemandDrivenPipeline : public vtkExecutive
{
public:
static vtkDemandDrivenPipeline* New();
vtkTypeMacro(vtkDemandDrivenPipeline, vtkExecutive);
void PrintSelf(ostream& os, vtkIndent indent) override;
/**
* Generalized interface for asking the executive to fulfill update
* requests.
*/
vtkTypeBool ProcessRequest(
vtkInformation* request, vtkInformationVector** inInfo, vtkInformationVector* outInfo) override;
/**
* Implement the pipeline modified time request.
*/
int ComputePipelineMTime(vtkInformation* request, vtkInformationVector** inInfoVec,
vtkInformationVector* outInfoVec, int requestFromOutputPort, vtkMTimeType* mtime) override;
//@{
/**
* Bring the algorithm's outputs up-to-date. Returns 1 for success
* and 0 for failure.
*/
vtkTypeBool Update() override;
vtkTypeBool Update(int port) override;
//@}
//@{
/**
* Get the PipelineMTime for this exective.
*/
vtkGetMacro(PipelineMTime, vtkMTimeType);
//@}
/**
* Set whether the given output port releases data when it is
* consumed. Returns 1 if the value changes and 0 otherwise.
*/
virtual int SetReleaseDataFlag(int port, int n);
/**
* Get whether the given output port releases data when it is consumed.
*/
virtual int GetReleaseDataFlag(int port);
/**
* Bring the PipelineMTime up to date.
*/
virtual int UpdatePipelineMTime();
/**
* Bring the output data object's existence up to date. This does
* not actually produce data, but does create the data object that
* will store data produced during the UpdateData step.
*/
int UpdateDataObject() override;
/**
* Bring the output information up to date.
*/
int UpdateInformation() override;
/**
* Bring the output data up to date. This should be called only
* when information is up to date. Use the Update method if it is
* not known that the information is up to date.
*/
virtual int UpdateData(int outputPort);
/**
* Key defining a request to make sure the output data objects exist.
* @ingroup InformationKeys
*/
static vtkInformationRequestKey* REQUEST_DATA_OBJECT();
/**
* Key defining a request to make sure the output information is up to date.
* @ingroup InformationKeys
*/
static vtkInformationRequestKey* REQUEST_INFORMATION();
/**
* Key defining a request to make sure the output data are up to date.
* @ingroup InformationKeys
*/
static vtkInformationRequestKey* REQUEST_DATA();
/**
* Key defining a request to mark outputs that will NOT be generated
* during a REQUEST_DATA.
* @ingroup InformationKeys
*/
static vtkInformationRequestKey* REQUEST_DATA_NOT_GENERATED();
/**
* Key to specify in pipeline information the request that data be
* released after it is used.
* @ingroup InformationKeys
*/
static vtkInformationIntegerKey* RELEASE_DATA();
/**
* Key to store a mark for an output that will not be generated.
* Algorithms use this to tell the executive that they will not
* generate certain outputs for a REQUEST_DATA.
* @ingroup InformationKeys
*/
static vtkInformationIntegerKey* DATA_NOT_GENERATED();
/**
* Create (New) and return a data object of the given type.
* This is here for backwards compatibility. Use
* vtkDataObjectTypes::NewDataObject() instead.
*/
static vtkDataObject* NewDataObject(const char* type);
protected:
vtkDemandDrivenPipeline();
~vtkDemandDrivenPipeline() override;
// Helper methods to send requests to the algorithm.
virtual int ExecuteDataObject(
vtkInformation* request, vtkInformationVector** inInfo, vtkInformationVector* outInfo);
virtual int ExecuteInformation(
vtkInformation* request, vtkInformationVector** inInfo, vtkInformationVector* outInfo);
virtual int ExecuteData(
vtkInformation* request, vtkInformationVector** inInfo, vtkInformationVector* outInfo);
// Reset the pipeline update values in the given output information object.
void ResetPipelineInformation(int, vtkInformation*) override;
// Check whether the data object in the pipeline information for an
// output port exists and has a valid type.
virtual int CheckDataObject(int port, vtkInformationVector* outInfo);
// Input connection validity checkers.
int InputCountIsValid(vtkInformationVector**);
int InputCountIsValid(int port, vtkInformationVector**);
int InputTypeIsValid(vtkInformationVector**);
int InputTypeIsValid(int port, vtkInformationVector**);
virtual int InputTypeIsValid(int port, int index, vtkInformationVector**);
int InputFieldsAreValid(vtkInformationVector**);
int InputFieldsAreValid(int port, vtkInformationVector**);
virtual int InputFieldsAreValid(int port, int index, vtkInformationVector**);
// Field existence checkers.
int DataSetAttributeExists(vtkDataSetAttributes* dsa, vtkInformation* field);
int FieldArrayExists(vtkFieldData* data, vtkInformation* field);
int ArrayIsValid(vtkAbstractArray* array, vtkInformation* field);
// Input port information checkers.
int InputIsOptional(int port);
int InputIsRepeatable(int port);
// Decide whether the output data need to be generated.
virtual int NeedToExecuteData(
int outputPort, vtkInformationVector** inInfoVec, vtkInformationVector* outInfoVec);
// Handle before/after operations for ExecuteData method.
virtual void ExecuteDataStart(
vtkInformation* request, vtkInformationVector** inInfoVec, vtkInformationVector* outInfoVec);
virtual void ExecuteDataEnd(
vtkInformation* request, vtkInformationVector** inInfoVec, vtkInformationVector* outInfoVec);
virtual void MarkOutputsGenerated(
vtkInformation* request, vtkInformationVector** inInfoVec, vtkInformationVector* outInfoVec);
// Largest MTime of any algorithm on this executive or preceding
// executives.
vtkMTimeType PipelineMTime;
// Time when information or data were last generated.
vtkTimeStamp DataObjectTime;
vtkTimeStamp InformationTime;
vtkTimeStamp DataTime;
friend class vtkCompositeDataPipeline;
vtkInformation* InfoRequest;
vtkInformation* DataObjectRequest;
vtkInformation* DataRequest;
private:
vtkDemandDrivenPipeline(const vtkDemandDrivenPipeline&) = delete;
void operator=(const vtkDemandDrivenPipeline&) = delete;
};
#endif