/**
 * Copyright (c) 2018 Inria
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are
 * met: redistributions of source code must retain the above copyright
 * notice, this list of conditions and the following disclaimer;
 * redistributions in binary form must reproduce the above copyright
 * notice, this list of conditions and the following disclaimer in the
 * documentation and/or other materials provided with the distribution;
 * neither the name of the copyright holders nor the names of its
 * contributors may be used to endorse or promote products derived from
 * this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * Authors: Daniel Carvalho
 */

#ifndef __MEM_CACHE_REPLACEMENT_POLICIES_BASE_HH__
#define __MEM_CACHE_REPLACEMENT_POLICIES_BASE_HH__

#include <memory>

#include "params/BaseReplacementPolicy.hh"
#include "sim/sim_object.hh"

/**
 * The replacement data needed by the replacement policy.
 * Each replacement policy should have its own replacement data.
 */
struct ReplacementData {};

/**
 * A replaceable entry is used by any table-like structure that needs to
 * implement replacement functionality. It provides the replacement data
 * pointer instantiated and needed by the replacement policy used.
 * @sa Replacement Policies
 */
class ReplaceableEntry
{
  public:
    /**
     * Replacement data associated to this entry.
     * It is instantiated by the replacement policy.
     */
    std::shared_ptr<ReplacementData> replacementData;
};

/**
 * Replacement candidates as chosen by the indexing policy.
 */
typedef std::vector<ReplaceableEntry*> ReplacementCandidates;

/**
 * A common base class of cache replacement policy objects.
 */
class BaseReplacementPolicy : public SimObject
{
  public:
    /**
      * Convenience typedef.
      */
    typedef BaseReplacementPolicyParams Params;

    /**
     * Construct and initiliaze this replacement policy.
     */
    BaseReplacementPolicy(const Params *p) : SimObject(p) {}

    /**
     * Destructor.
     */
    virtual ~BaseReplacementPolicy() {}

    /**
     * Invalidate replacement data to set it as the next probable victim.
     *
     * @param replacement_data Replacement data to be invalidated.
     */
    virtual void invalidate(const std::shared_ptr<ReplacementData>&
                                                replacement_data) const = 0;

    /**
     * Update replacement data.
     *
     * @param replacement_data Replacement data to be touched.
     */
    virtual void touch(const std::shared_ptr<ReplacementData>&
                                                replacement_data) const = 0;

    /**
     * Reset replacement data. Used when it's holder is inserted/validated.
     *
     * @param replacement_data Replacement data to be reset.
     */
    virtual void reset(const std::shared_ptr<ReplacementData>&
                                                replacement_data) const = 0;

    /**
     * Find replacement victim among candidates.
     *
     * @param candidates Replacement candidates, selected by indexing policy.
     * @return Replacement entry to be replaced.
     */
    virtual ReplaceableEntry* getVictim(
                           const ReplacementCandidates& candidates) const = 0;

    /**
     * Instantiate a replacement data entry.
     *
     * @return A shared pointer to the new replacement data.
     */
    virtual std::shared_ptr<ReplacementData> instantiateEntry() = 0;
};

#endif // __MEM_CACHE_REPLACEMENT_POLICIES_BASE_HH__
