Program Listing for File wrap_allocator.hpp¶
↰ Return to documentation for file (umpire/util/wrap_allocator.hpp
)
//////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2016-20, Lawrence Livermore National Security, LLC and Umpire
// project contributors. See the COPYRIGHT file for details.
//
// SPDX-License-Identifier: (MIT)
//////////////////////////////////////////////////////////////////////////////
#ifndef UMPIRE_wrap_allocator_HPP
#define UMPIRE_wrap_allocator_HPP
#include "umpire/Allocator.hpp"
#include "umpire/strategy/AllocationStrategy.hpp"
#include "umpire/strategy/AllocationTracker.hpp"
#include "umpire/strategy/ZeroByteHandler.hpp"
#include "umpire/util/make_unique.hpp"
namespace umpire {
namespace util {
template <typename Base>
std::unique_ptr<Base>
do_wrap(std::unique_ptr<Base>&& allocator)
{
return std::move(allocator);
}
template <typename Base, typename Strategy, typename... Strategies>
std::unique_ptr<Base>
do_wrap(std::unique_ptr<Base>&& allocator)
{
return std::unique_ptr<Base>(new Strategy(umpire::util::do_wrap<Base, Strategies...>(std::move(allocator))));
}
template<typename... Strategies>
std::unique_ptr<strategy::AllocationStrategy>
wrap_allocator(std::unique_ptr<strategy::AllocationStrategy>&& allocator)
{
return umpire::util::do_wrap<
umpire::strategy::AllocationStrategy, Strategies...>(
std::move(allocator));
}
template<typename Strategy>
Strategy*
unwrap_allocation_strategy(strategy::AllocationStrategy* base_strategy)
{
umpire::strategy::ZeroByteHandler* zero{nullptr};
umpire::strategy::AllocationTracker* tracker{nullptr};
Strategy* strategy{nullptr};
tracker = dynamic_cast<umpire::strategy::AllocationTracker*>(base_strategy);
if (tracker) {
zero = dynamic_cast<umpire::strategy::ZeroByteHandler*>(tracker->getAllocationStrategy());
} else {
zero = dynamic_cast<umpire::strategy::ZeroByteHandler*>(base_strategy);
}
if (zero) {
strategy = dynamic_cast<Strategy*>(zero->getAllocationStrategy());
} else {
if (tracker) {
strategy = dynamic_cast<Strategy*>(tracker->getAllocationStrategy());
} else {
strategy = dynamic_cast<Strategy*>(base_strategy);
}
}
if (!strategy) {
UMPIRE_ERROR("Couldn't unwrap " << base_strategy->getName() << " to " << typeid(Strategy).name());
}
return strategy;
}
template<typename Strategy>
Strategy*
unwrap_allocator(Allocator allocator)
{
return unwrap_allocation_strategy<Strategy>(allocator.getAllocationStrategy());
}
} // end of namespace util
} // end of namespace umpire
#endif // UMPIRE_wrap_allocator_HPP