| /** |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you 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 QUICKSTEP_UTILITY_SCOPED_DELETER_HPP_ |
| #define QUICKSTEP_UTILITY_SCOPED_DELETER_HPP_ |
| |
| #include <utility> |
| #include <vector> |
| |
| #include "utility/Macros.hpp" |
| |
| namespace quickstep { |
| |
| /** \addtogroup Utility |
| * @{ |
| */ |
| |
| /** |
| * @brief RAII helper object that holds pointers to new-allocated objects of |
| * any class and deletes them when it goes out of scope. |
| **/ |
| class ScopedDeleter { |
| public: |
| /** |
| * @brief Constructor. |
| **/ |
| ScopedDeleter() { |
| } |
| |
| /** |
| * @brief Destructor. Deletes any objects held by this ScopedDeleter. |
| **/ |
| ~ScopedDeleter() { |
| deleteAll(); |
| } |
| |
| /** |
| * @brief Add an object to the pool of objects to be deleted by this |
| * ScopedDeleter. |
| * |
| * @param object A pointer to an object that will be deleted when this |
| * ScopedDeleter goes out of scope. Must be allocated with new and |
| * should not be deleted by any other code. |
| **/ |
| template <typename T> |
| inline void addObject(T *object) { |
| objects_.emplace_back(&DeleteObject<T>, object); |
| } |
| |
| /** |
| * @brief Delete all objects held by this ScopedDeleter without destroying |
| * it. |
| **/ |
| void deleteAll() { |
| for (std::pair<DeleterFunction, void*> &item : objects_) { |
| (*item.first)(item.second); |
| } |
| |
| objects_.clear(); |
| } |
| |
| private: |
| typedef void (*DeleterFunction)(void*); |
| |
| template <typename T> |
| static void DeleteObject(void *object) { |
| delete static_cast<T*>(object); |
| } |
| |
| std::vector<std::pair<DeleterFunction, void*>> objects_; |
| |
| DISALLOW_COPY_AND_ASSIGN(ScopedDeleter); |
| }; |
| |
| /** @} */ |
| |
| } // namespace quickstep |
| |
| #endif // QUICKSTEP_UTILITY_SCOPED_DELETER_HPP_ |