/*=========================================================================

  Program:   Visualization Toolkit
  Module:    vtkUnicodeStringArray.h

-------------------------------------------------------------------------
  Copyright 2008 Sandia Corporation.
  Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
  the U.S. Government retains certain rights in this software.
-------------------------------------------------------------------------

  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   vtkUnicodeStringArray
 * @brief   Subclass of vtkAbstractArray that holds vtkUnicodeStrings
 *
 *
 *
 * @par Thanks:
 * Developed by Timothy M. Shead (tshead@sandia.gov) at Sandia National Laboratories.
 */

#ifndef vtkUnicodeStringArray_h
#define vtkUnicodeStringArray_h

#include "vtkAbstractArray.h"
#include "vtkCommonCoreModule.h" // For export macro
#include "vtkUnicodeString.h"    // For value type

class VTKCOMMONCORE_EXPORT vtkUnicodeStringArray : public vtkAbstractArray
{
public:
  static vtkUnicodeStringArray* New();
  vtkTypeMacro(vtkUnicodeStringArray, vtkAbstractArray);
  void PrintSelf(ostream& os, vtkIndent indent) override;

  vtkTypeBool Allocate(vtkIdType sz, vtkIdType ext = 1000) override;
  void Initialize() override;
  int GetDataType() const override;
  int GetDataTypeSize() const override;
  int GetElementComponentSize() const override;
  void SetNumberOfTuples(vtkIdType number) override;
  void SetTuple(vtkIdType i, vtkIdType j, vtkAbstractArray* source) override;
  void InsertTuple(vtkIdType i, vtkIdType j, vtkAbstractArray* source) override;
  void InsertTuples(vtkIdList* dstIds, vtkIdList* srcIds, vtkAbstractArray* source) override;
  void InsertTuples(
    vtkIdType dstStart, vtkIdType n, vtkIdType srcStart, vtkAbstractArray* source) override;
  vtkIdType InsertNextTuple(vtkIdType j, vtkAbstractArray* source) override;
  void* GetVoidPointer(vtkIdType id) override;
  void DeepCopy(vtkAbstractArray* da) override;
  void InterpolateTuple(
    vtkIdType i, vtkIdList* ptIndices, vtkAbstractArray* source, double* weights) override;
  void InterpolateTuple(vtkIdType i, vtkIdType id1, vtkAbstractArray* source1, vtkIdType id2,
    vtkAbstractArray* source2, double t) override;
  void Squeeze() override;
  vtkTypeBool Resize(vtkIdType numTuples) override;
  void SetVoidArray(void* array, vtkIdType size, int save) override;
  void SetVoidArray(void* array, vtkIdType size, int save, int deleteMethod) override;
  void SetArrayFreeFunction(void (*callback)(void*)) override;
  unsigned long GetActualMemorySize() const override; // in bytes
  int IsNumeric() const override;
  VTK_NEWINSTANCE vtkArrayIterator* NewIterator() override;
  vtkVariant GetVariantValue(vtkIdType idx) override;
  vtkIdType LookupValue(vtkVariant value) override;
  void LookupValue(vtkVariant value, vtkIdList* ids) override;

  void SetVariantValue(vtkIdType idx, vtkVariant value) override;
  void InsertVariantValue(vtkIdType idx, vtkVariant value) override;
  void DataChanged() override;
  void ClearLookup() override;

  vtkIdType InsertNextValue(const vtkUnicodeString&);
  void InsertValue(vtkIdType idx, const vtkUnicodeString&); // Ranged checked
  void SetValue(vtkIdType i, const vtkUnicodeString&);      // Not ranged checked
  vtkUnicodeString& GetValue(vtkIdType i);

  void InsertNextUTF8Value(const char*);
  void SetUTF8Value(vtkIdType i, const char*);
  const char* GetUTF8Value(vtkIdType i);

protected:
  vtkUnicodeStringArray();
  ~vtkUnicodeStringArray() override;

private:
  vtkUnicodeStringArray(const vtkUnicodeStringArray&) = delete;
  void operator=(const vtkUnicodeStringArray&) = delete;

  class Implementation;
  Implementation* Internal;
};

#endif
