/* * 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 */ #ifdef __UTIL_ALLOC_ARENA_IPP #error #endif #define __UTIL_ALLOC_ARENA_IPP /////////////////////////////////////////////////////////////////////////////// template util::alloc::arena::arena (T &store): m_store (store) { ; } /////////////////////////////////////////////////////////////////////////////// template template U* util::alloc::arena::acquire (Args&& ...args) { U *data = m_store.allocate (sizeof (U), alignof (U)); try { new (data) U (std::forward (args)...); } catch (...) { m_store.deallocate (data, sizeof (U)); throw; } } //----------------------------------------------------------------------------- template template std::unique_ptr util::alloc::arena::unique (Args&& ...args) { return std::unique_ptr (acquire (std::forward (args)...)); } //----------------------------------------------------------------------------- template template void util::alloc::arena::release (U *u) { u->~U (); m_store.deallocate (u); }