/*========================================================================= * * 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 itkAttributeLabelObject_h #define itkAttributeLabelObject_h #include "itkLabelObject.h" #include "itkLabelMap.h" namespace itk { namespace Functor { template class AttributeLabelObjectAccessor { public: using LabelObjectType = TLabelObject; using AttributeValueType = typename LabelObjectType::AttributeValueType; inline const AttributeValueType operator()(const LabelObjectType * labelObject) { return labelObject->GetAttribute(); } inline void operator()(LabelObjectType * labelObject, AttributeValueType value) { labelObject->SetAttribute(value); } }; } // namespace Functor /** * \class AttributeLabelObject * \brief A LabelObject with a generic attribute * * The attribute type is defined in the third template parameter. * The attribute is then accessible with the GetAttribute() and SetAttribute * methods or through the accessor itk::Functor::AttributeLabelObjectAccessor. * * \author Gaetan Lehmann. Biologie du Developpement et de la Reproduction, INRA de Jouy-en-Josas, France. * * This implementation was taken from the Insight Journal paper: * https://www.insight-journal.org/browse/publication/176 * * \sa LabelObject, ShapeLabelObject, StatisticsLabelObject * * \ingroup DataRepresentation * \ingroup ITKLabelMap */ template class ITK_TEMPLATE_EXPORT AttributeLabelObject : public LabelObject { public: ITK_DISALLOW_COPY_AND_MOVE(AttributeLabelObject); /** Standard class type aliases */ using Self = AttributeLabelObject; using Superclass = LabelObject; using Pointer = SmartPointer; using LabelObjectType = typename Superclass::LabelObjectType; using ConstPointer = SmartPointer; using ConstWeakPointer = WeakPointer; /** Method for creation through the object factory. */ itkNewMacro(Self); /** \see LightObject::GetNameOfClass() */ itkOverrideGetNameOfClassMacro(AttributeLabelObject); using LabelMapType = LabelMap; static constexpr unsigned int ImageDimension = VImageDimension; using typename Superclass::IndexType; using LabelType = TLabel; using typename Superclass::LineType; using typename Superclass::LengthType; using AttributeValueType = TAttributeValue; void SetAttribute(const AttributeValueType & v) { m_Attribute = v; } const AttributeValueType & GetAttribute() const { return m_Attribute; } AttributeValueType GetAttribute() { return m_Attribute; } template void CopyAttributesFrom(const TSourceLabelObject * src) { itkAssertOrThrowMacro((src != nullptr), "Null Pointer"); Superclass::template CopyAttributesFrom(src); m_Attribute = src->GetAttribute(); } template void CopyAllFrom(const TSourceLabelObject * src) { itkAssertOrThrowMacro((src != nullptr), "Null Pointer"); this->template CopyLinesFrom(src); this->template CopyAttributesFrom(src); } protected: AttributeLabelObject() = default; void PrintSelf(std::ostream & os, Indent indent) const override { Superclass::PrintSelf(os, indent); os << indent << "Attribute: " << m_Attribute << std::endl; } private: AttributeValueType m_Attribute{}; }; } // end namespace itk #endif