/*========================================================================= * * 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 itkSmartPointerForwardReference_hxx #define itkSmartPointerForwardReference_hxx namespace itk { //---------------------------------------------------------------------------- template SmartPointerForwardReference::SmartPointerForwardReference(const SmartPointerForwardReference & p) { m_Pointer = p.m_Pointer; this->Register(); } //---------------------------------------------------------------------------- template SmartPointerForwardReference::SmartPointerForwardReference(const WeakPointer & p) { m_Pointer = p.GetPointer(); this->Register(); } //---------------------------------------------------------------------------- template SmartPointerForwardReference::SmartPointerForwardReference(T * p) { m_Pointer = p; this->Register(); } //---------------------------------------------------------------------------- template SmartPointerForwardReference::~SmartPointerForwardReference() { this->UnRegister(); } //---------------------------------------------------------------------------- template T * SmartPointerForwardReference::operator->() const { return m_Pointer; } //---------------------------------------------------------------------------- template SmartPointerForwardReference::operator T *() const { return m_Pointer; } //---------------------------------------------------------------------------- template T * SmartPointerForwardReference::GetPointer() const { return m_Pointer; } //---------------------------------------------------------------------------- template bool SmartPointerForwardReference::operator<(const SmartPointerForwardReference & r) { return (void *)m_Pointer < (void *)r.m_Pointer; } //---------------------------------------------------------------------------- template bool SmartPointerForwardReference::operator>(const SmartPointerForwardReference & r) { return (void *)m_Pointer > (void *)r.m_Pointer; } //---------------------------------------------------------------------------- template bool SmartPointerForwardReference::operator<=(const SmartPointerForwardReference & r) { return (void *)m_Pointer <= (void *)r.m_Pointer; } //---------------------------------------------------------------------------- template bool SmartPointerForwardReference::operator>=(const SmartPointerForwardReference & r) { return (void *)m_Pointer >= (void *)r.m_Pointer; } //---------------------------------------------------------------------------- template SmartPointerForwardReference & SmartPointerForwardReference::operator=(const SmartPointerForwardReference & r) { return this->operator=(r.GetPointer()); } //---------------------------------------------------------------------------- template SmartPointerForwardReference & SmartPointerForwardReference::operator=(SmartPointerForwardReference && r) { if (this != &r) { this->UnRegister(); this->m_Pointer = r.m_Pointer; r.m_Pointer = nullptr; } return *this; } //---------------------------------------------------------------------------- template SmartPointerForwardReference & SmartPointerForwardReference::operator=(const WeakPointer & r) { return this->operator=(r.GetPointer()); } //---------------------------------------------------------------------------- template SmartPointerForwardReference & SmartPointerForwardReference::operator=(T * r) { if (m_Pointer != r) { SmartPointerForwardReference tmp(m_Pointer); *this = std::move(tmp); } return *this; } //---------------------------------------------------------------------------- template T * SmartPointerForwardReference::Print(std::ostream & os) const { // This prints the object pointed to by the pointer m_Pointer->Print(os); return m_Pointer; } //---------------------------------------------------------------------------- template void SmartPointerForwardReference::Register() { if (m_Pointer) { m_Pointer->Register(); } } //---------------------------------------------------------------------------- template void SmartPointerForwardReference::UnRegister() noexcept { if (m_Pointer) { m_Pointer->UnRegister(); } } } // namespace itk #endif