@@ -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> |