/* * 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 = reinterpret_cast ( m_store.allocate (sizeof (U), alignof (U)) ); try { new (data) U (std::forward (args)...); } catch (...) { m_store.deallocate (data, sizeof (U)); throw; } return data; } //----------------------------------------------------------------------------- template template void util::alloc::arena::release (U *u) { u->~U (); m_store.deallocate (reinterpret_cast (u), sizeof (U)); }