// Copyright (c) 2009 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef COURGETTE_ADJUSTMENT_METHOD_H_
#define COURGETTE_ADJUSTMENT_METHOD_H_

#include "base/macros.h"

namespace courgette {

class AssemblyProgram;

class AdjustmentMethod {
 public:
  // Factory methods for making adjusters.

  // Returns the adjustment method used in production.
  static AdjustmentMethod* MakeProductionAdjustmentMethod() {
    return MakeShingleAdjustmentMethod();
  }

  // Returns and adjustement method that makes no adjustments.
  static AdjustmentMethod* MakeNullAdjustmentMethod();

  // Returns the original adjustment method.
  static AdjustmentMethod* MakeTrieAdjustmentMethod();

  // Returns the new shingle tiling adjustment method.
  static AdjustmentMethod* MakeShingleAdjustmentMethod();

  // AdjustmentMethod interface:

  // Adjusts |program| to increase similarity to |model|.  |program| can be
  // changed in any way provided that it still produces the same output when
  // assembled.
  virtual bool Adjust(const AssemblyProgram& model,
                      AssemblyProgram* program) = 0;

  // Deletes 'this' adjustment method.
  virtual void Destroy();

 protected:
  AdjustmentMethod() {}
  virtual ~AdjustmentMethod() {}

  DISALLOW_COPY_AND_ASSIGN(AdjustmentMethod);
};

}  // namespace courgette
#endif  // COURGETTE_ADJUSTMENT_METHOD_H_
