/* * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) * * This file is part of Orfeo Toolbox * * https://www.orfeo-toolbox.org/ * * 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 * * http://www.apache.org/licenses/LICENSE-2.0 * * 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 otbMetaImageFunction_hxx #define otbMetaImageFunction_hxx #include "otbMetaImageFunction.h" #include "otbImageFunctionAdaptor.h" #include namespace otb { template MetaImageFunction::MetaImageFunction() : m_FunctionContainer() { } template MetaImageFunction::~MetaImageFunction() { this->ClearFunctions(); } template void MetaImageFunction::AddFunction(FunctionType* function) { m_FunctionContainer.push_back(function); } // template // void // MetaImageFunction //::AddFunction(itk::ImageFunction * function) // { // // Define the adapter // typedef itk::ImageFunction ImageFunctionType; // typedef otb::ImageFunctionAdapter AdapterType; // // typename AdapterType::Pointer adapter = AdapterType::New(); // adapte // // } template void MetaImageFunction::ClearFunctions() { m_FunctionContainer.clear(); } template unsigned int MetaImageFunction::GetNumberOfFunctions() const { return m_FunctionContainer.size(); } template typename MetaImageFunction::FunctionType* MetaImageFunction::GetNthFunction(unsigned int index) { return m_FunctionContainer.at(index); } template void MetaImageFunction::RemoveNthFunction(unsigned int index) { typename FunctionContainerType::iterator fIt = m_FunctionContainer.begin() + index; m_FunctionContainer.erase(fIt); } template typename MetaImageFunction::OutputType MetaImageFunction::Evaluate(const PointType& point) const { // Build output OutputType resp; // For each function typename FunctionContainerType::const_iterator fIt = m_FunctionContainer.begin(); while (fIt != m_FunctionContainer.end()) { // Store current size unsigned int currentSize = static_cast(resp.GetSize()); // Call current function evaluation OutputType currentVector = (*fIt)->Evaluate(point); // Compute current vector size unsigned int currentVectorSize = static_cast(currentVector.GetSize()); // Enlarge the output vector resp.SetSize(currentSize + currentVectorSize, false); // Fill the output for (unsigned int i = 0; i < currentVectorSize; ++i) { resp.SetElement(currentSize + i, static_cast(currentVector[i])); } // Go to next function ++fIt; } return resp; } template void MetaImageFunction::PrintSelf(std::ostream& os, itk::Indent indent) const { Superclass::PrintSelf(os, indent); os << indent << "Number of image functions: " << this->GetNumberOfFunctions() << std::endl; } } // end namespace otb #endif