#pragma once

class Solution;

/**
 * Represent a modification of the solution, it can recreate/destroy the solution.
 * 
 * @see AtomicRecreation and AtomicDestruction
 */
class AtomicModification
{
public:
    /**
     * Return the cost of the operation.
     * @return a positive number if the solution cost is bigger after the modification.
     */
    virtual double evaluate(Solution const &solution) const = 0;

     /**
     * Apply of the modification to the solution.
     * @note does not check the validity of the modification, does not update solution cost nor constraints
     */
    virtual void modifySolution(Solution &solution) = 0;
};