text: /*=========================================================================
  
    Program:   Visualization Toolkit
    Module:    vtkXMLGenericDataObjectReader.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   vtkXMLGenericDataObjectReader
   * @brief   Read any type of vtk data object
   *
   * vtkXMLGenericDataObjectReader reads any type of vtk data object encoded
   * in XML format.
   *
   * @sa
   * vtkGenericDataObjectReader
   */
  
  #ifndef vtkXMLGenericDataObjectReader_h
  #define vtkXMLGenericDataObjectReader_h
  
  #include "vtkIOXMLModule.h"  // For export macro
  #include "vtkSmartPointer.h" // for API
  #include "vtkXMLDataReader.h"
  
  class vtkHierarchicalBoxDataSet;
  class vtkMultiBlockDataSet;
  class vtkImageData;
  class vtkPolyData;
  class vtkRectilinearGrid;
  class vtkStructuredGrid;
  class vtkUnstructuredGrid;
  
  class VTKIOXML_EXPORT vtkXMLGenericDataObjectReader : public vtkXMLDataReader
  {
  public:
    vtkTypeMacro(vtkXMLGenericDataObjectReader, vtkXMLDataReader);
    void PrintSelf(ostream& os, vtkIndent indent) override;
    static vtkXMLGenericDataObjectReader* New();
  
    ///@{
    /**
     * Get the reader's output.
     */
    vtkDataObject* GetOutput();
    vtkDataObject* GetOutput(int idx);
    ///@}
  
    ///@{
    /**
     * Get the output as various concrete types. This method is typically used
     * when you know exactly what type of data is being read.  Otherwise, use
     * the general GetOutput() method. If the wrong type is used nullptr is
     * returned.  (You must also set the filename of the object prior to
     * getting the output.)
     */
    vtkHierarchicalBoxDataSet* GetHierarchicalBoxDataSetOutput();
    vtkImageData* GetImageDataOutput();
    vtkMultiBlockDataSet* GetMultiBlockDataSetOutput();
    vtkPolyData* GetPolyDataOutput();
    vtkRectilinearGrid* GetRectilinearGridOutput();
    vtkStructuredGrid* GetStructuredGridOutput();
    vtkUnstructuredGrid* GetUnstructuredGridOutput();
    ///@}
  
    /**
     * Overridden method.
     */
    vtkIdType GetNumberOfPoints() override;
  
    /**
     * Overridden method.
     */
    vtkIdType GetNumberOfCells() override;
  
    /**
     * Overridden method. Not Used. Delegated.
     */
    void SetupEmptyOutput() override;
  
    /**
     * This method can be used to find out the type of output expected without
     * needing to read the whole file.
     */
    virtual int ReadOutputType(const char* name, bool& parallel);
  
    /**
     * Helper to create a reader based on the data object type.
     * Returns null if the reader cannot be determined.
     */
    static vtkSmartPointer<vtkXMLReader> CreateReader(int data_object_type, bool parallel);
  
  protected:
    vtkXMLGenericDataObjectReader();
    ~vtkXMLGenericDataObjectReader() override;
  
    /**
     * Overridden method. Not used. Return "vtkDataObject".
     */
    const char* GetDataSetName() override;
  
    int RequestDataObject(vtkInformation*, vtkInformationVector**, vtkInformationVector*) override;
    int RequestInformation(vtkInformation*, vtkInformationVector**, vtkInformationVector*) override;
    virtual int RequestUpdateExtent(vtkInformation* request, vtkInformationVector** inputVector,
      vtkInformationVector* outputVector);
  
    int RequestData(vtkInformation*, vtkInformationVector**, vtkInformationVector*) override;
    int FillOutputPortInformation(int, vtkInformation*) override;
  
    vtkXMLReader* Reader; // actual reader
  
  private:
    vtkXMLGenericDataObjectReader(const vtkXMLGenericDataObjectReader&) = delete;
    void operator=(const vtkXMLGenericDataObjectReader&) = delete;
  };
  
  #endif
  