| Flow 2.0.0
    Flow project: Full implementation reference. | 
A simple RAII-pattern class template that, at construction, sets the specified location in memory to a specified value, memorizing the previous contents; and at destruction restores the value. More...
#include <util.hpp>
| Public Member Functions | |
| Scoped_setter (Value *target, Value &&val_src_moved) | |
| Post-condition: *targetcontains wasval_src_movedcontained at ctor entry; and the destructor invocation shall reverse this, so that*targetis restored to its value at entry.  More... | |
| Scoped_setter (Scoped_setter &&src_moved) | |
| Move constructor: *thisacts assrc_movedwould-have, whilesrc_movedbecomes a no-op object permanently.  More... | |
| Scoped_setter (const Scoped_setter &)=delete | |
| Prohibit copying: for each explicitctor invocation, there shall be exactly 1 non-no-op dtor invocation. | |
| ~Scoped_setter () | |
| Restores *target(from main ctor) to its value at entry to said ctor; or does nothing if*thishas been moved-from via the move ctor.  More... | |
| Scoped_setter & | operator= (const Scoped_setter &)=delete | 
| Prohibit copying (see deleted copy ctor). | |
| Scoped_setter & | operator= (Scoped_setter &&)=delete | 
| Prohibit modifying existing *this; except that moving-from is enabled via the move ctor. | |
| Private Attributes | |
| Value * | m_target_or_null | 
| Target object location; see ctors; if null then this is a moved-from Scoped_setter that intentionally no-ops.  More... | |
| Value | m_saved_value | 
| If and only if m_target_or_null is non-null, this saves *m_target_or_null. Otherwise meaningless.  More... | |
A simple RAII-pattern class template that, at construction, sets the specified location in memory to a specified value, memorizing the previous contents; and at destruction restores the value.
E.g.:
The object is movable, not copyable (which is similar to unique_ptr) to prevent "double-restore." Related: one can easily return customized auto-setter/restorers:
This is a simple object: it just performs a few assignments without any added concurrency protection. If the memory location can be accessed simultaneously by other threads, watch out.
In particular it's a good fit for thread-local locations: &X, where X is declared thread_local, or X == *(P.get()) where P is a boost::thread_specific_ptr.
| Value | The stored type, which must be move-assignable and move-constructible. All Valuewrites are performed using exclusively these operations. Informally: For best performance whenValueis a heavy-weight type, these operations should be be written to be light-weight, such as in terms of swapping a few scalars. In particular this is already the case for all STL-compliant container types. | 
An alternative implementation, which could even be reduced to just an alias, would have used unique_ptr. However in this case I (ygoldfel) wanted maximum control for perf. The use case originally driving this was the thread-local verbosity override: log::Config::this_thread_verbosity_override_auto(). flow::log is fairly paranoid about performance, in general, although admittedly this particular call isn't necessarily ubiquitous. 
| 
 | explicit | 
Post-condition: *target contains was val_src_moved contained at ctor entry; and the destructor invocation shall reverse this, so that *target is restored to its value at entry. 
*this cannot be copied, but it can be moved. As a result, it is guaranteed that the aforementioned destructor will execute exactly once; however it can be move-constructed-from-*this other Scope_setter's destructor, while our own dtor therefore is a no-op.
| target | The target object that shall be set to val_src_movednow and restored in our, or moved-object's, dtor. The current value of*targetis saved internally via assignment ofmove(*target). Behavior undefined (assertion may trip) if null. | 
| val_src_moved | Value to save to *targetimmediately, via assignment ofmove(val_src_moved). | 
Definition at line 206 of file util.hpp.
References flow::util::Scoped_setter< Value >::m_target_or_null.
| flow::util::Scoped_setter< Value >::Scoped_setter | ( | Scoped_setter< Value > && | src_moved | ) | 
Move constructor: *this acts as src_moved would-have, while src_moved becomes a no-op object permanently. 
| src_moved | Source object. Its destructor shall do nothing after this returns. | 
Definition at line 214 of file util.hpp.
References flow::util::Scoped_setter< Value >::m_target_or_null.
| flow::util::Scoped_setter< Value >::~Scoped_setter | 
| 
 | private | 
If and only if m_target_or_null is non-null, this saves *m_target_or_null. Otherwise meaningless. 
| 
 | private | 
Target object location; see ctors; if null then this is a moved-from Scoped_setter that intentionally no-ops.
Definition at line 195 of file util.hpp.
Referenced by flow::util::Scoped_setter< Value >::Scoped_setter().