fixup Fix to build with libxml 2.12.x (fixes #505)
[platform/upstream/libzypp.git] / zypp / base / DtorReset.h
1 /*---------------------------------------------------------------------\
2 |                          ____ _   __ __ ___                          |
3 |                         |__  / \ / / . \ . \                         |
4 |                           / / \ V /|  _/  _/                         |
5 |                          / /__ | | | | | |                           |
6 |                         /_____||_| |_| |_|                           |
7 |                                                                      |
8 \---------------------------------------------------------------------*/
9 /** \file       zypp/base/DtorReset.h
10  *
11 */
12 #ifndef ZYPP_BASE_DTORRESET_H
13 #define ZYPP_BASE_DTORRESET_H
14
15 #include "zypp/base/PtrTypes.h"
16
17 ///////////////////////////////////////////////////////////////////
18 namespace zypp
19 { /////////////////////////////////////////////////////////////////
20
21   ///////////////////////////////////////////////////////////////////
22   //
23   //    CLASS NAME : DtorReset
24   //
25   /** Assign a vaiable a certain value when going out of scope.
26    * Use it e.g. to reset/cleanup in presence of exceptions.
27    * \code
28    * struct Foo
29    * {
30    *   void consume()
31    *   {
32    *     DtorReset x(_inConsume,false);
33    *     _inConsume = true;
34    *     MIL << _inConsume << endl;
35    *   };
36    *
37    *   DefaultIntegral<bool,false> _inConsume;
38    * };
39    *
40    * Foo f;
41    * MIL << f._inConsume << endl; // 0
42    * f.consume();                 // 1
43    * MIL << f._inConsume << endl; // 0
44    * \endcode
45    * \ingroup g_RAII
46    * \todo Check if using call_traits enables 'DtorReset(std::string,"value")',
47    * as this currently would require assignment of 'char[]'.
48    */
49   class DtorReset
50   {
51   public:
52     DtorReset() {}
53
54     template<class TVar>
55       DtorReset( TVar & var_r )
56       : _pimpl( new Impl<TVar,TVar>( var_r, var_r ) )
57       {}
58     template<class TVar, class TVal>
59       DtorReset( TVar & var_r, const TVal & val_r )
60       : _pimpl( new Impl<TVar,TVal>( var_r, val_r ) )
61       {}
62
63   private:
64     /** Requires TVal being copy constructible, and assignment
65      * <tt>TVar = TVal</tt> defined. */
66     template<class TVar, class TVal>
67       struct Impl
68       {
69         Impl( TVar & var_r, const TVal & val_r )
70         : _var( var_r )
71         , _val( val_r )
72         {}
73         ~Impl()
74         { _var = _val; }
75         TVar & _var;
76         TVal   _val;
77       };
78     shared_ptr<void> _pimpl;
79   };
80   ///////////////////////////////////////////////////////////////////
81
82   /////////////////////////////////////////////////////////////////
83 } // namespace zypp
84 ///////////////////////////////////////////////////////////////////
85 #endif // ZYPP_BASE_DTORRESET_H