/*========================================================================= Program: Visualization Toolkit Module: vtkCPMappedVectorArrayTemplate.txx 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. =========================================================================*/ #include "vtkCPMappedVectorArrayTemplate.h" #include "vtkIdList.h" #include "vtkObjectFactory.h" #include "vtkVariant.h" #include "vtkVariantCast.h" //------------------------------------------------------------------------------ // Can't use vtkStandardNewMacro with a template. template vtkCPMappedVectorArrayTemplate * vtkCPMappedVectorArrayTemplate::New() { VTK_STANDARD_NEW_BODY(vtkCPMappedVectorArrayTemplate) } //------------------------------------------------------------------------------ template void vtkCPMappedVectorArrayTemplate ::PrintSelf(ostream &os, vtkIndent indent) { this->vtkCPMappedVectorArrayTemplate::Superclass::PrintSelf( os, indent); os << indent << "Array: " << this->Array << std::endl; os << indent << "TempDoubleArray: " << this->TempDoubleArray << std::endl; } //------------------------------------------------------------------------------ template void vtkCPMappedVectorArrayTemplate ::Initialize() { this->Array = NULL; this->MaxId = -1; this->Size = 0; this->NumberOfComponents = 3; } //------------------------------------------------------------------------------ template void vtkCPMappedVectorArrayTemplate ::GetTuples(vtkIdList *ptIds, vtkAbstractArray *output) { vtkDataArray *outArray = vtkDataArray::FastDownCast(output); if (!outArray) { vtkWarningMacro(<<"Input is not a vtkDataArray"); return; } vtkIdType numTuples = ptIds->GetNumberOfIds(); outArray->SetNumberOfComponents(this->NumberOfComponents); outArray->SetNumberOfTuples(numTuples); const vtkIdType numPoints = ptIds->GetNumberOfIds(); for (vtkIdType i = 0; i < numPoints; ++i) { outArray->SetTuple(i, this->GetTuple(ptIds->GetId(i))); } } //------------------------------------------------------------------------------ template void vtkCPMappedVectorArrayTemplate ::GetTuples(vtkIdType p1, vtkIdType p2, vtkAbstractArray *output) { vtkDataArray *da = vtkDataArray::FastDownCast(output); if (!da) { vtkErrorMacro(<<"Input is not a vtkDataArray"); return; } if (da->GetNumberOfComponents() != this->GetNumberOfComponents()) { vtkErrorMacro(<<"Incorrect number of components in input array."); return; } for (vtkIdType daTupleId = 0; p1 <= p2; ++p1) { da->SetTuple(daTupleId++, this->GetTuple(p1)); } } //------------------------------------------------------------------------------ template void vtkCPMappedVectorArrayTemplate ::Squeeze() { // noop } //------------------------------------------------------------------------------ template vtkArrayIterator* vtkCPMappedVectorArrayTemplate::NewIterator() { vtkErrorMacro(<<"Not implemented."); return NULL; } //------------------------------------------------------------------------------ template vtkIdType vtkCPMappedVectorArrayTemplate ::LookupValue(vtkVariant value) { bool valid = true; Scalar val = vtkVariantCast(value, &valid); if (valid) { return this->Lookup(val, 0); } return -1; } //------------------------------------------------------------------------------ template void vtkCPMappedVectorArrayTemplate ::LookupValue(vtkVariant value, vtkIdList *ids) { bool valid = true; Scalar val = vtkVariantCast(value, &valid); ids->Reset(); if (valid) { vtkIdType index = 0; while ((index = this->Lookup(val, index)) >= 0) { ids->InsertNextId(index++); } } } //------------------------------------------------------------------------------ template vtkVariant vtkCPMappedVectorArrayTemplate ::GetVariantValue(vtkIdType idx) { return vtkVariant(this->GetValueReference(idx)); } //------------------------------------------------------------------------------ template void vtkCPMappedVectorArrayTemplate ::ClearLookup() { // no-op, no fast lookup implemented. } //------------------------------------------------------------------------------ template double* vtkCPMappedVectorArrayTemplate ::GetTuple(vtkIdType i) { this->GetTuple(i, this->TempDoubleArray); return this->TempDoubleArray; } //------------------------------------------------------------------------------ template void vtkCPMappedVectorArrayTemplate ::GetTuple(vtkIdType i, double *tuple) { tuple[0] = static_cast(this->Array[i]); tuple[1] = static_cast(this->Array[i+this->GetNumberOfTuples()]); tuple[2] = static_cast(this->Array[i+2*this->GetNumberOfTuples()]); } //------------------------------------------------------------------------------ template vtkIdType vtkCPMappedVectorArrayTemplate ::LookupTypedValue(Scalar value) { return this->Lookup(value, 0); } //------------------------------------------------------------------------------ template void vtkCPMappedVectorArrayTemplate ::LookupTypedValue(Scalar value, vtkIdList *ids) { ids->Reset(); vtkIdType index = 0; while ((index = this->Lookup(value, index)) >= 0) { ids->InsertNextId(index++); } } //------------------------------------------------------------------------------ template Scalar vtkCPMappedVectorArrayTemplate ::GetValue(vtkIdType idx) { return this->GetValueReference(idx); } //------------------------------------------------------------------------------ template Scalar& vtkCPMappedVectorArrayTemplate ::GetValueReference(vtkIdType idx) { const vtkIdType tuple = idx / this->NumberOfComponents; const vtkIdType comp = idx % this->NumberOfComponents; switch (comp) { case 0: return this->Array[tuple]; case 1: return this->Array[tuple+this->GetNumberOfTuples()]; case 2: return this->Array[tuple+2*this->GetNumberOfTuples()]; default: vtkErrorMacro(<< "Invalid number of components."); static Scalar dummy(0); return dummy; } } //------------------------------------------------------------------------------ template void vtkCPMappedVectorArrayTemplate ::GetTupleValue(vtkIdType tupleId, Scalar *tuple) { tuple[0] = this->Array[tupleId]; tuple[1] = this->Array[tupleId+this->GetNumberOfTuples()]; tuple[2] = this->Array[tupleId+2*this->GetNumberOfTuples()]; } //------------------------------------------------------------------------------ template int vtkCPMappedVectorArrayTemplate ::Allocate(vtkIdType, vtkIdType) { vtkErrorMacro("Read only container.") return 0; } //------------------------------------------------------------------------------ template int vtkCPMappedVectorArrayTemplate ::Resize(vtkIdType) { vtkErrorMacro("Read only container.") return 0; } //------------------------------------------------------------------------------ template void vtkCPMappedVectorArrayTemplate ::SetNumberOfTuples(vtkIdType) { vtkErrorMacro("Read only container.") return; } //------------------------------------------------------------------------------ template void vtkCPMappedVectorArrayTemplate ::SetTuple(vtkIdType, vtkIdType, vtkAbstractArray *) { vtkErrorMacro("Read only container.") return; } //------------------------------------------------------------------------------ template void vtkCPMappedVectorArrayTemplate ::SetTuple(vtkIdType, const float *) { vtkErrorMacro("Read only container.") return; } //------------------------------------------------------------------------------ template void vtkCPMappedVectorArrayTemplate ::SetTuple(vtkIdType, const double *) { vtkErrorMacro("Read only container.") return; } //------------------------------------------------------------------------------ template void vtkCPMappedVectorArrayTemplate ::InsertTuple(vtkIdType, vtkIdType, vtkAbstractArray *) { vtkErrorMacro("Read only container.") return; } //------------------------------------------------------------------------------ template void vtkCPMappedVectorArrayTemplate ::InsertTuple(vtkIdType, const float *) { vtkErrorMacro("Read only container.") return; } //------------------------------------------------------------------------------ template void vtkCPMappedVectorArrayTemplate ::InsertTuple(vtkIdType, const double *) { vtkErrorMacro("Read only container.") return; } //------------------------------------------------------------------------------ template void vtkCPMappedVectorArrayTemplate ::InsertTuples(vtkIdList *, vtkIdList *, vtkAbstractArray *) { vtkErrorMacro("Read only container.") return; } //------------------------------------------------------------------------------ template void vtkCPMappedVectorArrayTemplate ::InsertTuples(vtkIdType, vtkIdType, vtkIdType, vtkAbstractArray *) { vtkErrorMacro("Read only container.") return; } //------------------------------------------------------------------------------ template vtkIdType vtkCPMappedVectorArrayTemplate ::InsertNextTuple(vtkIdType, vtkAbstractArray *) { vtkErrorMacro("Read only container.") return -1; } //------------------------------------------------------------------------------ template vtkIdType vtkCPMappedVectorArrayTemplate ::InsertNextTuple(const float *) { vtkErrorMacro("Read only container.") return -1; } //------------------------------------------------------------------------------ template vtkIdType vtkCPMappedVectorArrayTemplate ::InsertNextTuple(const double *) { vtkErrorMacro("Read only container.") return -1; } //------------------------------------------------------------------------------ template void vtkCPMappedVectorArrayTemplate ::DeepCopy(vtkAbstractArray *) { vtkErrorMacro("Read only container.") return; } //------------------------------------------------------------------------------ template void vtkCPMappedVectorArrayTemplate ::DeepCopy(vtkDataArray *) { vtkErrorMacro("Read only container.") return; } //------------------------------------------------------------------------------ template void vtkCPMappedVectorArrayTemplate ::InterpolateTuple(vtkIdType, vtkIdList *, vtkAbstractArray *, double *) { vtkErrorMacro("Read only container.") return; } //------------------------------------------------------------------------------ template void vtkCPMappedVectorArrayTemplate ::InterpolateTuple(vtkIdType, vtkIdType, vtkAbstractArray*, vtkIdType, vtkAbstractArray*, double) { vtkErrorMacro("Read only container.") return; } //------------------------------------------------------------------------------ template void vtkCPMappedVectorArrayTemplate ::SetVariantValue(vtkIdType, vtkVariant) { vtkErrorMacro("Read only container.") return; } //------------------------------------------------------------------------------ template void vtkCPMappedVectorArrayTemplate ::InsertVariantValue(vtkIdType, vtkVariant) { vtkErrorMacro("Read only container.") return; } //------------------------------------------------------------------------------ template void vtkCPMappedVectorArrayTemplate ::RemoveTuple(vtkIdType) { vtkErrorMacro("Read only container.") return; } //------------------------------------------------------------------------------ template void vtkCPMappedVectorArrayTemplate ::RemoveFirstTuple() { vtkErrorMacro("Read only container.") return; } //------------------------------------------------------------------------------ template void vtkCPMappedVectorArrayTemplate ::RemoveLastTuple() { vtkErrorMacro("Read only container.") return; } //------------------------------------------------------------------------------ template void vtkCPMappedVectorArrayTemplate ::SetTupleValue(vtkIdType, const Scalar*) { vtkErrorMacro("Read only container.") return; } //------------------------------------------------------------------------------ template void vtkCPMappedVectorArrayTemplate ::InsertTupleValue(vtkIdType, const Scalar*) { vtkErrorMacro("Read only container.") return; } //------------------------------------------------------------------------------ template vtkIdType vtkCPMappedVectorArrayTemplate ::InsertNextTupleValue(const Scalar *) { vtkErrorMacro("Read only container.") return -1; } //------------------------------------------------------------------------------ template void vtkCPMappedVectorArrayTemplate ::SetValue(vtkIdType, Scalar) { vtkErrorMacro("Read only container.") return; } //------------------------------------------------------------------------------ template vtkIdType vtkCPMappedVectorArrayTemplate ::InsertNextValue(Scalar) { vtkErrorMacro("Read only container.") return -1; } //------------------------------------------------------------------------------ template void vtkCPMappedVectorArrayTemplate ::InsertValue(vtkIdType, Scalar) { vtkErrorMacro("Read only container.") return; } //------------------------------------------------------------------------------ template vtkCPMappedVectorArrayTemplate ::vtkCPMappedVectorArrayTemplate() : Array(NULL) { } //------------------------------------------------------------------------------ template vtkCPMappedVectorArrayTemplate ::~vtkCPMappedVectorArrayTemplate() { } //------------------------------------------------------------------------------ template void vtkCPMappedVectorArrayTemplate ::SetVectorArray(Scalar *array, vtkIdType numPoints) { Initialize(); this->Array = array; this->NumberOfComponents = 3; this->Size = this->NumberOfComponents * numPoints; this->MaxId = this->Size - 1; this->Modified(); } //------------------------------------------------------------------------------ template vtkIdType vtkCPMappedVectorArrayTemplate ::Lookup(const Scalar &val, vtkIdType index) { while (index <= this->MaxId) { if (this->GetValueReference(index++) == val) { return index; } } return -1; }