SharedInstance-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_SHAREDINSTANCE_INL_H
#define SURGSIM_FRAMEWORK_SHAREDINSTANCE_INL_H
#include <memory>
#include <functional>
#include <boost/thread/mutex.hpp>
#include <boost/thread/locks.hpp>
#include "SurgSim/Framework/Assert.h"
namespace SurgSim
{
namespace Framework
{
template <typename T>
SharedInstance<T>::SharedInstance() :
m_instanceCreator(defaultInstanceCreator())
{
}
template <typename T>
SharedInstance<T>::SharedInstance(const InstanceCreator& instanceCreator) :
m_instanceCreator(instanceCreator)
{
}
template <typename T>
SharedInstance<T>::~SharedInstance()
{
}
template <typename T>
std::shared_ptr<T> SharedInstance<T>::get()
{
boost::lock_guard<boost::mutex> lock(m_mutex);
std::shared_ptr<T> instance = m_weakInstance.lock();
if (! instance)
{
instance = createInstance();
m_weakInstance = instance;
}
return std::move(instance);
}
template <typename T>
std::shared_ptr<T> SharedInstance<T>::createInstance()
{
std::shared_ptr<T> instance = m_instanceCreator();
SURGSIM_ASSERT(instance);
return std::move(instance);
}
template <typename T>
typename SharedInstance<T>::InstanceCreator SharedInstance<T>::defaultInstanceCreator()
{
return []() { return std::make_shared<T>(); }; // NOLINT(readability/braces)
}
}; // namespace Framework
}; // namespace SurgSim
#endif // SURGSIM_FRAMEWORK_SHAREDINSTANCE_INL_H
SurgSim
Definition: CompoundShapeToGraphics.cpp:29
SurgSim::Framework::SharedInstance::m_weakInstance
std::weak_ptr< T > m_weakInstance
A weak reference to the shared instance, if any.
Definition: SharedInstance.h:155
SurgSim::Framework::SharedInstance::~SharedInstance
~SharedInstance()
Destroy the container and the data it contains.
Definition: SharedInstance-inl.h:46
SURGSIM_ASSERT
#define SURGSIM_ASSERT(condition)
Assert that condition is true.
Definition: Assert.h:77
SurgSim::Framework::SharedInstance::m_mutex
boost::mutex m_mutex
Mutex for synchronization of object creation.
Definition: SharedInstance.h:158
SurgSim::Framework::SharedInstance::defaultInstanceCreator
static InstanceCreator defaultInstanceCreator()
Creates a function that can create an instance using std::make_shared<T>().
Definition: SharedInstance-inl.h:72
SurgSim::Framework::SharedInstance::SharedInstance
SharedInstance()
Create the SharedInstance object used to manage the shared instance.
Definition: SharedInstance-inl.h:34
SurgSim::Framework::SharedInstance::m_instanceCreator
InstanceCreator m_instanceCreator
A creator function used to construct the shared instance.
Definition: SharedInstance.h:152
Assert.h
The header that provides the assertion API.
SurgSim::Framework::SharedInstance::get
std::shared_ptr< T > get()
Gets the shared object instance.
Definition: SharedInstance-inl.h:51
SurgSim::Framework::SharedInstance::InstanceCreator
std::function< std::shared_ptr< T >)> InstanceCreator
A type that can hold a function object or lambda that takes no arguments and returns std::shared_ptr<...
Definition: SharedInstance.h:109
SurgSim::Framework::SharedInstance::createInstance
std::shared_ptr< T > createInstance()
Creates an object instance.
Definition: SharedInstance-inl.h:64