Program Listing for File common.hpp
↰ Return to documentation for file (/tmp/ws/src/apex_containers/apex_containers/include/apex_containers/memory/common.hpp
)
// Copyright 2019 Apex.AI, 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 APEX_CONTAINERS__MEMORY__COMMON_HPP_
#define APEX_CONTAINERS__MEMORY__COMMON_HPP_
#include <foonathan/memory/config.hpp>
#include <foonathan/memory/memory_pool.hpp>
#include <foonathan/memory/std_allocator.hpp>
#include <foonathan/memory/threading.hpp>
namespace foonathan
{
namespace memory
{
#include <foonathan/memory/detail/container_node_sizes.hpp>
} // namespace memory
} // namespace foonathan
#include <scoped_allocator>
#include <utility>
namespace apex
{
namespace containers
{
namespace memory
{
using storage_t = foonathan::memory::fixed_allocator_storage;
using default_mutex = foonathan::memory::default_mutex;
template<typename Container>
struct NodeSize;
} // namespace memory
using node_pool_t = foonathan::memory::memory_pool<
foonathan::memory::node_pool,
foonathan::memory::static_block_allocator>;
template<typename Container>
class memory_pool
{
static constexpr std::size_t node_size = memory::NodeSize<Container>::value;
public:
using container = Container;
explicit memory_pool(const std::size_t capacity)
: storage_(2U * node_size, capacity),
pool_(node_size, storage_.size(), storage_)
{
}
operator node_pool_t &()
{
return pool_;
}
template<typename ... Args>
decltype(auto) create(Args && ... args)
{
return container{std::forward<Args>(args)..., *this};
}
private:
memory::storage_t storage_;
node_pool_t pool_;
}; // class memory_pool
template<typename T, typename Mutex = memory::default_mutex>
using node_allocator = foonathan::memory::std_allocator<T, node_pool_t, Mutex>;
template<typename T, typename Mutex = memory::default_mutex, typename ... InnerAlloc>
using scoped_node_allocator =
std::scoped_allocator_adaptor<node_allocator<T, Mutex>, InnerAlloc...>;
} // namespace containers
} // namespace apex
#endif // APEX_CONTAINERS__MEMORY__COMMON_HPP_