ComponentManager-inl.h
Go to the documentation of this file.
// This file is a part of the OpenSurgSim project.
// Copyright 2013, SimQuest Solutions Inc.
//
// 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 SURGSIM_FRAMEWORK_COMPONENTMANAGER_INL_H
#define SURGSIM_FRAMEWORK_COMPONENTMANAGER_INL_H
namespace SurgSim
{
namespace Framework
{
template<class T>
std::shared_ptr<T> ComponentManager::tryAddComponent(std::shared_ptr<SurgSim::Framework::Component> component,
std::vector<std::shared_ptr<T>>* container)
{
SURGSIM_ASSERT(component != nullptr) << "Trying to add a component that is null";
SURGSIM_ASSERT(container != nullptr) << "Trying to use a component container that is null";
std::shared_ptr<T> typedComponent = std::dynamic_pointer_cast<T>(component);
if (typedComponent != nullptr)
{
auto found = std::find(container->cbegin(), container->cend(), typedComponent);
if (found == container->cend())
{
SURGSIM_LOG_INFO(m_logger) << "Added component " << component->getFullName();
container->push_back(typedComponent);
}
else
{
SURGSIM_LOG_INFO(m_logger) << "Component " << component->getFullName() << " already added to " << getName();
typedComponent = nullptr;
}
}
return typedComponent;
};
template<class T>
bool ComponentManager::tryRemoveComponent(std::shared_ptr<SurgSim::Framework::Component> component,
std::vector<std::shared_ptr<T>>* container)
{
SURGSIM_ASSERT(container != nullptr) << "Trying to use a component container that is null";
bool result = false;
std::shared_ptr<T> typedComponent = std::dynamic_pointer_cast<T>(component);
if (typedComponent != nullptr && container->size() != 0)
{
auto found = std::find(container->begin(), container->end(), typedComponent);
if (found != container->end())
{
container->erase(found);
SURGSIM_LOG_DEBUG(m_logger) << __FUNCTION__ << " Removed component " << typedComponent->getName();
result = true;
}
else
{
SURGSIM_LOG_INFO(m_logger)
<< SURGSIM_CURRENT_FUNCTION << " Unable to remove component "
<< typedComponent->getName() << ". Not found.";
}
}
return result;
};
template<class T>
void ComponentManager::retireComponents(const std::vector<std::shared_ptr<T>>& container)
{
static_assert(std::is_base_of<Component, T>::value == true, "Class has to be of type component");
for (const auto& component : container)
{
component->retire();
}
}
}; // namespace Framework
}; // namespace SurgSim
#endif
SurgSim
Definition: CompoundShapeToGraphics.cpp:29
SurgSim::Framework::ComponentManager::tryRemoveComponent
bool tryRemoveComponent(std::shared_ptr< SurgSim::Framework::Component > component, std::vector< std::shared_ptr< T >> *container)
Template version of the removeComponent method.
Definition: ComponentManager-inl.h:54
SURGSIM_LOG_DEBUG
#define SURGSIM_LOG_DEBUG(logger)
Logs a message to the specified logger at the DEBUG level.
Definition: LogMacros.h:76
SurgSim::Framework::ComponentManager::retireComponents
void retireComponents(const std::vector< std::shared_ptr< T >> &container)
Definition: ComponentManager-inl.h:80
SURGSIM_ASSERT
#define SURGSIM_ASSERT(condition)
Assert that condition is true.
Definition: Assert.h:77
SurgSim::Framework::BasicThread::m_logger
std::shared_ptr< SurgSim::Framework::Logger > m_logger
Logger for this thread.
Definition: BasicThread.h:155
SURGSIM_CURRENT_FUNCTION
#define SURGSIM_CURRENT_FUNCTION
Helper macro to determine the function name currently being compiled.
Definition: Assert.h:61
SurgSim::Framework::BasicThread::getName
std::string getName() const
Definition: BasicThread.cpp:223
SURGSIM_LOG_INFO
#define SURGSIM_LOG_INFO(logger)
Logs a message to the specified logger at the INFO level.
Definition: LogMacros.h:86
SurgSim::Framework::ComponentManager::tryAddComponent
std::shared_ptr< T > tryAddComponent(std::shared_ptr< SurgSim::Framework::Component > component, std::vector< std::shared_ptr< T >> *container)
Template version of the addComponent method.
Definition: ComponentManager-inl.h:30