/*========================================================================= * * Copyright NumFOCUS * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0.txt * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * *=========================================================================*/ #ifndef itkArray_hxx #define itkArray_hxx #include "itkNumericTraitsArrayPixel.h" namespace itk { template Array::Array(const Self & rhs) : vnl_vector(rhs) // The copy constructor creates new memory, no matter // the setting of let array manage memory of rhs {} template Array::Array(const VnlVectorType & rhs) : vnl_vector(rhs) // The vnl vector copy constructor creates new memory // no matter the setting of let array manage memory of rhs {} template Array::Array(SizeValueType dimension) : vnl_vector(dimension) // The vnl vector copy constructor creates new memory // no matter the setting of let array manage memory of rhs {} template Array::Array(const SizeValueType dimension, const TValue & value) : vnl_vector(dimension, value) {} template Array::Array(ValueType * datain, SizeValueType sz, bool LetArrayManageMemory) : m_LetArrayManageMemory(LetArrayManageMemory) { vnl_vector::data = datain; vnl_vector::num_elmts = sz; } #if defined(ITK_LEGACY_REMOVE) template Array::Array(const ValueType * datain, SizeValueType sz) : vnl_vector(datain, sz) // The vnl vector copy constructor creates new memory // no matter the setting of let array manage memory of rhs {} #else // defined ( ITK_LEGACY_REMOVE ) template Array::Array(const ValueType * datain, SizeValueType sz, bool /* LetArrayManageMemory */) : /* NOTE: The 3rd argument "LetArrayManageMemory, was never valid to use, but is * preserved to maintain backwards compatibility*/ vnl_vector(datain, sz) // The vnl vector copy constructor creates new memory // no matter the setting of let array manage memory of rhs {} #endif template Array::~Array() { if (!m_LetArrayManageMemory) { vnl_vector::data = nullptr; } } template void Array::SetDataSameSize(TValue * datain, bool LetArrayManageMemory) { if (m_LetArrayManageMemory) { vnl_vector::destroy(); } vnl_vector::data = datain; // NOTE: Required to have same size vnl_vector< TValue >::num_elmts = sz; m_LetArrayManageMemory = LetArrayManageMemory; } template void Array::SetData(TValue * datain, SizeValueType sz, bool LetArrayManageMemory) { if (m_LetArrayManageMemory) { vnl_vector::destroy(); } vnl_vector::data = datain; vnl_vector::num_elmts = sz; m_LetArrayManageMemory = LetArrayManageMemory; } template void Array::SetSize(SizeValueType sz) { if (this->size() != sz) { // If the array doesn't own the data we do not want to erase it // on a resize if (!m_LetArrayManageMemory) { vnl_vector::data = nullptr; } // Call the superclass's set_size this->set_size(sz); // Size we have allocated new data we need to take // responsibility for deleting it m_LetArrayManageMemory = true; } } template auto Array::operator=(const Self & rhs) -> Self & { if (this != &rhs) { // Set the size the same as rhs. // The SetSize method takes care of who is responsible // for memory management // this->SetSize(rhs.GetSize()); // Call the superclass implementation this->VnlVectorType::operator=(rhs); } return *this; } template auto Array::operator=(const VnlVectorType & rhs) -> Self & { if (this != &rhs) { // Set the size the same as rhs. // The SetSize method takes care of who is responsible // for memory management // this->SetSize(rhs.size()); // Call the superclass implementation this->VnlVectorType::operator=(rhs); } return *this; } } // namespace itk #endif