From 70a16c7d47a687b8bf31b0b710af4f7aca30f4c2 Mon Sep 17 00:00:00 2001 From: Danny Robson Date: Fri, 12 Apr 2019 16:40:17 +1000 Subject: [PATCH] scoped: add optional reset modifier --- CMakeLists.txt | 1 + scoped.hpp | 7 ++++++- test/scoped.cpp | 35 +++++++++++++++++++++++++++++++++++ 3 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 test/scoped.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 01b354ee..3aa150c6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -625,6 +625,7 @@ if (TESTS) rational region roots/bisection + scoped signal singleton stream diff --git a/scoped.hpp b/scoped.hpp index 9481b840..45731b24 100644 --- a/scoped.hpp +++ b/scoped.hpp @@ -25,10 +25,15 @@ namespace cruft::scoped { ~restore () { - m_target = m_value; + if (m_restore) + m_target = m_value; } + /// Disable restoration of the value. + void reset (void) { m_restore = false; } + private: + bool m_restore = true; ValueT &m_target; ValueT const m_value; }; diff --git a/test/scoped.cpp b/test/scoped.cpp new file mode 100644 index 00000000..b041e4d0 --- /dev/null +++ b/test/scoped.cpp @@ -0,0 +1,35 @@ +#include "scoped.hpp" +#include "tap.hpp" + + +/////////////////////////////////////////////////////////////////////////////// +void test_restore (cruft::TAP::logger &tap) +{ + int value = 42; + + { + cruft::scoped::restore raii (value); + tap.expect_eq (value, 42, "restorer constructor doesn't modifier value"); + value = 7; + } + + tap.expect_eq (value, 42, "restorer restores value at destruction"); + + + { + cruft::scoped::restore raii (value); + value = 7; + raii.reset (); + } + + tap.expect_eq (value, 7, "restorer reset doesn't modify value at destruction"); +} + + +/////////////////////////////////////////////////////////////////////////////// +int main () +{ + cruft::TAP::logger tap; + test_restore (tap); + return tap.status (); +} \ No newline at end of file