/* * 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. * * Copyright 2015 Danny Robson */ #ifndef __UTIL_ALLOC_ARENA_HPP #define __UTIL_ALLOC_ARENA_HPP #include "../memory/deleter.hpp" #include #include namespace util::alloc { template class arena { public: arena (T &store); //--------------------------------------------------------------------- template U* acquire (Args&&...); //--------------------------------------------------------------------- template void release (U*); //--------------------------------------------------------------------- template using deleter_t = util::memory::owner_deleter< U,arena,&arena::release >; template using unique_t = std::unique_ptr>; // the return type must be auto and the implementation must be inline // otherwise we trigger an internal compiler error in gcc-5.2.0 // "sorry, unimplemented: mangling offset_ref" template auto unique (Args&& ...args) { return unique_t { acquire (std::forward (args)...), deleter_t (*this) }; } private: T &m_store; }; } #include "./arena.ipp" #endif