1// Copyright (c) 2009 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef COURGETTE_ADJUSTMENT_METHOD_H_
6#define COURGETTE_ADJUSTMENT_METHOD_H_
7
8#include "base/basictypes.h"
9
10namespace courgette {
11
12class AssemblyProgram;
13
14class AdjustmentMethod {
15 public:
16  // Factory methods for making adjusters.
17
18  // Returns the adjustment method used in production.
19  static AdjustmentMethod* MakeProductionAdjustmentMethod() {
20    return MakeShingleAdjustmentMethod();
21  }
22
23  // Returns and adjustement method that makes no adjustments.
24  static AdjustmentMethod* MakeNullAdjustmentMethod();
25
26  // Returns the original adjustment method.
27  static AdjustmentMethod* MakeTrieAdjustmentMethod();
28
29  // Returns the new shingle tiling adjustment method.
30  static AdjustmentMethod* MakeShingleAdjustmentMethod();
31
32  // AdjustmentMethod interface:
33
34  // Adjusts |program| to increase similarity to |model|.  |program| can be
35  // changed in any way provided that it still produces the same output when
36  // assembled.
37  virtual bool Adjust(const AssemblyProgram& model,
38                      AssemblyProgram* program) = 0;
39
40  // Deletes 'this' adjustment method.
41  virtual void Destroy();
42
43 protected:
44  AdjustmentMethod() {}
45  virtual ~AdjustmentMethod() {}
46
47  DISALLOW_COPY_AND_ASSIGN(AdjustmentMethod);
48};
49
50}  // namespace courgette
51#endif  // COURGETTE_ADJUSTMENT_METHOD_H_
52