소스 검색

Ctors of scope guard (almost) implemented. Still missing: Correct

behaviour for LValue references (see #41).
main
offa 7 년 전
부모
커밋
de9455c2b7
2개의 변경된 파일26개의 추가작업 그리고 8개의 파일을 삭제
  1. +19
    -1
      include/scope_guard.h
  2. +7
    -7
      test/ScopeGuardTest.cpp

+ 19
- 1
include/scope_guard.h 파일 보기

#pragma once #pragma once


#include <utility> #include <utility>
#include <type_traits>


namespace sr namespace sr
{ {
{ {
public: public:


explicit scope_guard_t(Deleter&& deleter) noexcept : m_deleter(std::move(deleter)),

template<class D,
std::enable_if_t<std::is_constructible<Deleter, D>::value, int> = 0,
std::enable_if_t<(!std::is_lvalue_reference<D>::value)
&& std::is_nothrow_constructible<Deleter, D>::value, int> = 0
>
explicit scope_guard_t(D&& deleter) noexcept : m_deleter(std::move(deleter)),
m_execute_on_destruction(true)
{
}

template<class D,
std::enable_if_t<std::is_constructible<Deleter, D>::value, int> = 0,
std::enable_if_t<std::is_lvalue_reference<D>::value, int> = 0
>
explicit scope_guard_t(D&& deleter) noexcept : m_deleter(deleter),
m_execute_on_destruction(true) m_execute_on_destruction(true)
{ {
// TODO: Handle copying correctly (#41)
} }



scope_guard_t(const scope_guard_t&) = delete; scope_guard_t(const scope_guard_t&) = delete;


scope_guard_t(scope_guard_t&& other) noexcept : m_deleter(std::move(other.m_deleter)), scope_guard_t(scope_guard_t&& other) noexcept : m_deleter(std::move(other.m_deleter)),

+ 7
- 7
test/ScopeGuardTest.cpp 파일 보기

static_cast<void>(guard); static_cast<void>(guard);
} }


TEST_CASE("deleter is not called if released", "[ScopeGuard]")
{
REQUIRE_CALL(m, deleter()).TIMES(0);
auto guard = sr::scope_guard(deleter);
guard.release();
}

TEST_CASE("deleter lambda called on destruction", "[ScopeGuard]") TEST_CASE("deleter lambda called on destruction", "[ScopeGuard]")
{ {
CallMock cm; CallMock cm;
static_cast<void>(guard); static_cast<void>(guard);
} }


TEST_CASE("deleter is not called if released", "[ScopeGuard]")
{
REQUIRE_CALL(m, deleter()).TIMES(0);
auto guard = sr::scope_guard(deleter);
guard.release();
}

TEST_CASE("move releases moved-from object", "[ScopeGuard]") TEST_CASE("move releases moved-from object", "[ScopeGuard]")
{ {
REQUIRE_CALL(m, deleter()); REQUIRE_CALL(m, deleter());

Loading…
취소
저장