// SPDX-FileCopyrightText: Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
// SPDX-FileCopyrightText: Copyright 2008 Sandia Corporation
// SPDX-License-Identifier: LicenseRef-BSD-3-Clause-Sandia-USGov
/**
 * @class   vtkGenerateIndexArray
 *
 *
 * Generates a new vtkIdTypeArray containing zero-base indices.
 *
 * vtkGenerateIndexArray operates in one of two distinct "modes".
 * By default, it simply generates an index array containing
 * monotonically-increasing integers in the range [0, N), where N
 * is appropriately sized for the field type that will store the
 * results.  This mode is useful for generating a unique ID field
 * for datasets that have none.
 *
 * The second "mode" uses an existing array from the input data
 * object as a "reference".  Distinct values from the reference
 * array are sorted in ascending order, and an integer index in
 * the range [0, N) is assigned to each.  The resulting map is
 * used to populate the output index array, mapping each value
 * in the reference array to its corresponding index and storing
 * the result in the output array.  This mode is especially
 * useful when generating tensors, since it allows us to "map"
 * from an array with arbitrary contents to an index that can
 * be used as tensor coordinates.
 */

#ifndef vtkGenerateIndexArray_h
#define vtkGenerateIndexArray_h

#include "vtkDataObjectAlgorithm.h"
#include "vtkInfovisCoreModule.h" // For export macro

VTK_ABI_NAMESPACE_BEGIN
class VTKINFOVISCORE_EXPORT vtkGenerateIndexArray : public vtkDataObjectAlgorithm
{
public:
  static vtkGenerateIndexArray* New();

  vtkTypeMacro(vtkGenerateIndexArray, vtkDataObjectAlgorithm);
  void PrintSelf(ostream& os, vtkIndent indent) override;

  ///@{
  /**
   * Control the output index array name.  Default: "index".
   */
  vtkSetStringMacro(ArrayName);
  vtkGetStringMacro(ArrayName);
  ///@}

  ///@{
  /**
   * Control the location where the index array will be stored.
   */
  vtkSetMacro(FieldType, int);
  vtkGetMacro(FieldType, int);
  ///@}

  ///@{
  /**
   * Specifies an optional reference array for index-generation.
   */
  vtkSetStringMacro(ReferenceArrayName);
  vtkGetStringMacro(ReferenceArrayName);
  ///@}

  ///@{
  /**
   * Specifies whether the index array should be marked as
   * pedigree ids.  Default: false.
   */
  vtkSetMacro(PedigreeID, int);
  vtkGetMacro(PedigreeID, int);
  ///@}

  enum
  {
    ROW_DATA = 0,
    POINT_DATA = 1,
    CELL_DATA = 2,
    VERTEX_DATA = 3,
    EDGE_DATA = 4
  };

protected:
  vtkGenerateIndexArray();
  ~vtkGenerateIndexArray() override;

  vtkTypeBool ProcessRequest(vtkInformation* request, vtkInformationVector** inputVector,
    vtkInformationVector* outputVector) override;

  int RequestDataObject(vtkInformation* request, vtkInformationVector** inputVector,
    vtkInformationVector* outputVector) override;

  int RequestData(vtkInformation*, vtkInformationVector**, vtkInformationVector*) override;

  char* ArrayName;
  int FieldType;
  char* ReferenceArrayName;
  int PedigreeID;

private:
  vtkGenerateIndexArray(const vtkGenerateIndexArray&) = delete;
  void operator=(const vtkGenerateIndexArray&) = delete;
};

VTK_ABI_NAMESPACE_END
#endif
