| @@ -0,0 +1 @@ | |||
| build/* | |||
| @@ -0,0 +1,30 @@ | |||
| cmake_minimum_required(VERSION 3.2) | |||
| project(scoped-ressource VERSION 0.0.1) | |||
| message(STATUS "~~~ ${PROJECT_NAME} v${PROJECT_VERSION} ~~~") | |||
| option(UNITTEST "Build Unit Tests" ON) | |||
| add_compile_options(-Wall | |||
| -Wextra | |||
| -pedantic | |||
| -Werror | |||
| -Wshadow | |||
| -Wold-style-cast | |||
| ) | |||
| set(CMAKE_CXX_STANDARD 14) | |||
| set(CMAKE_CXX_STANDARD_REQUIRED ON) | |||
| set(CMAKE_CXX_EXTENSIONS OFF) | |||
| include_directories("include") | |||
| if( UNITTEST ) | |||
| enable_testing() | |||
| add_subdirectory("test") | |||
| endif() | |||
| @@ -0,0 +1,21 @@ | |||
| # Scope Guard | |||
| ## License | |||
| **GNU General Public License (GPL)** | |||
| This program is free software: you can redistribute it and/or modify | |||
| it under the terms of the GNU General Public License as published by | |||
| the Free Software Foundation, either version 3 of the License, or | |||
| (at your option) any later version. | |||
| This program is distributed in the hope that it will be useful, | |||
| but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| GNU General Public License for more details. | |||
| You should have received a copy of the GNU General Public License | |||
| along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
| @@ -0,0 +1,44 @@ | |||
| #pragma once | |||
| #include <utility> | |||
| namespace guards | |||
| { | |||
| template<class Deleter> | |||
| class scope_guard_t | |||
| { | |||
| public: | |||
| explicit scope_guard_t(Deleter&& deleter) noexcept : m_deleter(std::move(deleter)) | |||
| { | |||
| } | |||
| scope_guard_t(scope_guard_t&&)= default; | |||
| scope_guard_t(const scope_guard_t&) = delete; | |||
| ~scope_guard_t() | |||
| { | |||
| m_deleter(); | |||
| } | |||
| scope_guard_t& operator=(const scope_guard_t&) = delete; | |||
| scope_guard_t& operator=(scope_guard_t&&) = delete; | |||
| private: | |||
| Deleter m_deleter; | |||
| }; | |||
| template<class Deleter> | |||
| scope_guard_t<Deleter> scope_guard(Deleter&& deleter) noexcept | |||
| { | |||
| return scope_guard_t<Deleter>(std::move(deleter)); | |||
| } | |||
| } | |||
| @@ -0,0 +1,21 @@ | |||
| add_library(testmain TestMain.cpp) | |||
| target_include_directories(testmain SYSTEM PUBLIC "catch/") | |||
| function(add_test_suite name) | |||
| add_executable(${name} ${name}.cpp) | |||
| target_link_libraries(${name} testmain) | |||
| add_test(NAME ${name} COMMAND ${name}) | |||
| endfunction() | |||
| add_test_suite(ScopeGuardTest) | |||
| add_custom_target(unittest ScopeGuardTest | |||
| COMMENT "Running unittests\n\n" | |||
| VERBATIM | |||
| ) | |||
| @@ -0,0 +1,17 @@ | |||
| #include "scope_guard.h" | |||
| #include <catch.hpp> | |||
| TEST_CASE("deleter called on destruction", "[ScopeGuard]") | |||
| { | |||
| bool executed = false; | |||
| { | |||
| auto guard = scope_guard([&executed] { executed = true; }); | |||
| static_cast<void>(guard); | |||
| } | |||
| REQUIRE(executed == true); | |||
| } | |||
| @@ -0,0 +1,3 @@ | |||
| #define CATCH_CONFIG_MAIN | |||
| #include <catch.hpp> | |||