summaryrefslogtreecommitdiff
path: root/src/generic/problemresolver/resolver_undo.h
blob: 520f825f50730460b0afc66782ab2a489e0692dd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
// resolver_undo.h                            -*-c++-*-
//
//   Copyright (C) 2005 Daniel Burrows
//
//   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 2 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; see the file COPYING.  If not, write to
//   the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
//   Boston, MA 02111-1307, USA.
//

#ifndef RESOLVER_UNDO_H
#define RESOLVER_UNDO_H

#include <generic/util/undo.h>

/** \brief Undo items related to the resolver
 *
 * 
 * Undo items related to the resolver.  (Q: these could be unified
 * into a single item based on slots or somesuch?)
 * 
 *  \file resolver_undo.h
 */

template<typename PackageUniverse>
class generic_problem_resolver;

/** An undoable that executes the given action on the given object. */
template<typename PackageUniverse, typename T>
class undo_resolver_manipulation : public undoable
{
public:
  typedef void (generic_problem_resolver<PackageUniverse>::*undo_method)(const T &, undo_group *);

  generic_problem_resolver<PackageUniverse> *resolver;
  T t;
  undo_method reverse_action;

public:
  undo_resolver_manipulation(generic_problem_resolver<PackageUniverse> *_resolver,
			     const T &_t,
			     undo_method _reverse_action)
    : resolver(_resolver), t(_t), reverse_action(_reverse_action)
  {
  }

  void undo()
  {
    (resolver->*reverse_action)(t, NULL);
  }
};

#endif // RESOLVER_UNDO_H