/*****************************************************************************

  Licensed to Accellera Systems Initiative Inc. (Accellera) under one or
  more contributor license agreements.  See the NOTICE file distributed
  with this work for additional information regarding copyright ownership.
  Accellera licenses this file to you under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with the
  License.  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
  implied.  See the License for the specific language governing
  permissions and limitations under the License.

 *****************************************************************************/

#ifndef __SYSTEMC_EXT_TLM_CORE_1_REQ_RSP_PORTS_EVENT_FINDER_HH__
#define __SYSTEMC_EXT_TLM_CORE_1_REQ_RSP_PORTS_EVENT_FINDER_HH__

#include <sstream>

#include "tlm_core/1/req_rsp/interfaces/tag.hh"

namespace tlm
{

template <class IF, class T>
class tlm_event_finder_t : public sc_core::sc_event_finder
{
  public:
    tlm_event_finder_t(const sc_core::sc_port_base &port_,
                       const sc_core::sc_event &(IF::*event_method_)(
                           tlm_tag<T> *) const) :
        sc_core::sc_event_finder(port_), m_event_method(event_method_)
    {}

    virtual ~tlm_event_finder_t() {}

    virtual const sc_core::sc_event &
        find_event(sc_core::sc_interface *if_p=nullptr) const;

  private:
    const sc_core::sc_event &(IF::*m_event_method)(tlm_tag<T> *) const;

  private:
    // disabled
    tlm_event_finder_t();
    tlm_event_finder_t(const tlm_event_finder_t<IF, T> &);
    tlm_event_finder_t<IF, T> &operator = (const tlm_event_finder_t<IF, T> &);
};

template <class IF, class T>
inline const sc_core::sc_event &
tlm_event_finder_t<IF, T>::find_event(sc_core::sc_interface *if_p) const
{
    const IF *iface = if_p ? dynamic_cast<const IF *>(if_p) :
        dynamic_cast<const IF *>(port()->_gem5Interface(0));
    if (iface == nullptr) {
        std::ostringstream out;
        out << "port is not bound: port '" << port()->name() <<
            "' (" << port()->kind() << ")";
        SC_REPORT_ERROR(sc_core::SC_ID_FIND_EVENT_, out.str().c_str());
        static sc_core::sc_event none;
        return none;
    }
    return (const_cast<IF *>(iface)->*m_event_method)(nullptr);
}

} // namespace tlm

#endif /* __SYSTEMC_EXT_TLM_CORE_1_REQ_RSP_PORTS_EVENT_FINDER_HH__ */
