/*========================================================================= Program: Visualization Toolkit Module: vtkArrayData.cxx ------------------------------------------------------------------------- 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. =========================================================================*/ #include "vtkArrayData.h" #include "vtkArray.h" #include "vtkInformation.h" #include "vtkInformationVector.h" #include "vtkObjectFactory.h" #include #include // // Standard functions // vtkStandardNewMacro(vtkArrayData); class vtkArrayData::implementation { public: std::vector Arrays; }; //------------------------------------------------------------------------------ vtkArrayData::vtkArrayData() : Implementation(new implementation()) { } //------------------------------------------------------------------------------ vtkArrayData::~vtkArrayData() { this->ClearArrays(); delete this->Implementation; } //------------------------------------------------------------------------------ void vtkArrayData::PrintSelf(ostream& os, vtkIndent indent) { this->Superclass::PrintSelf(os, indent); for (unsigned int i = 0; i != this->Implementation->Arrays.size(); ++i) { os << indent << "Array: " << this->Implementation->Arrays[i] << endl; this->Implementation->Arrays[i]->PrintSelf(os, indent.GetNextIndent()); } } vtkArrayData* vtkArrayData::GetData(vtkInformation* info) { return info ? vtkArrayData::SafeDownCast(info->Get(DATA_OBJECT())) : nullptr; } vtkArrayData* vtkArrayData::GetData(vtkInformationVector* v, int i) { return vtkArrayData::GetData(v->GetInformationObject(i)); } void vtkArrayData::AddArray(vtkArray* array) { if (!array) { vtkErrorMacro(<< "Cannot add nullptr array."); return; } // See http://developers.sun.com/solaris/articles/cmp_stlport_libCstd.html // Language Feature: Partial Specializations // Workaround int n = 0; #ifdef _RWSTD_NO_CLASS_PARTIAL_SPEC std::count(this->Implementation->Arrays.begin(), this->Implementation->Arrays.end(), array, n); #else n = std::count(this->Implementation->Arrays.begin(), this->Implementation->Arrays.end(), array); #endif if (n != 0) { vtkErrorMacro(<< "Cannot add array twice."); return; } this->Implementation->Arrays.push_back(array); array->Register(nullptr); this->Modified(); } void vtkArrayData::ClearArrays() { for (unsigned int i = 0; i != this->Implementation->Arrays.size(); ++i) { this->Implementation->Arrays[i]->Delete(); } this->Implementation->Arrays.clear(); this->Modified(); } vtkIdType vtkArrayData::GetNumberOfArrays() { return static_cast(this->Implementation->Arrays.size()); } vtkArray* vtkArrayData::GetArray(vtkIdType index) { if (index < 0 || static_cast(index) >= this->Implementation->Arrays.size()) { vtkErrorMacro(<< "Array index out-of-range."); return nullptr; } return this->Implementation->Arrays[static_cast(index)]; } vtkArray* vtkArrayData::GetArrayByName(const char* name) { if (!name || name[0] == '\0') { vtkErrorMacro(<< "No name passed into routine."); return nullptr; } vtkArray* temp = nullptr; for (vtkIdType ctr = 0; ctr < this->GetNumberOfArrays(); ctr++) { temp = this->GetArray(ctr); if (temp && !strcmp(name, temp->GetName())) { break; } temp = nullptr; } return temp; } void vtkArrayData::ShallowCopy(vtkDataObject* other) { if (vtkArrayData* const array_data = vtkArrayData::SafeDownCast(other)) { this->ClearArrays(); this->Implementation->Arrays = array_data->Implementation->Arrays; for (size_t i = 0; i != this->Implementation->Arrays.size(); ++i) { this->Implementation->Arrays[i]->Register(this); } this->Modified(); } Superclass::ShallowCopy(other); } void vtkArrayData::DeepCopy(vtkDataObject* other) { if (vtkArrayData* const array_data = vtkArrayData::SafeDownCast(other)) { this->ClearArrays(); for (size_t i = 0; i != array_data->Implementation->Arrays.size(); ++i) { this->Implementation->Arrays.push_back(array_data->Implementation->Arrays[i]->DeepCopy()); } this->Modified(); } Superclass::DeepCopy(other); }