/*
 * Copyright 2018 Google, Inc.
 *
 * 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: Gabe Black
 */

#include "base/logging.hh"
#include "systemc/core/event.hh"
#include "systemc/ext/core/sc_event.hh"

namespace sc_core
{


/*
 * sc_event_and_list
 */

sc_event_and_list::sc_event_and_list() : autoDelete(false), busy(0) {}

sc_event_and_list::sc_event_and_list(const sc_event_and_list &eal) :
    events(eal.events), autoDelete(false), busy(0)
{}

sc_event_and_list::sc_event_and_list(const sc_event &e) : sc_event_and_list()
{
    insert(e);
}

sc_event_and_list::sc_event_and_list(bool auto_delete) :
    autoDelete(auto_delete), busy(0)
{}

sc_event_and_list::~sc_event_and_list() {}

sc_event_and_list &
sc_event_and_list::operator = (const sc_event_and_list &eal)
{
    events = eal.events;
    return *this;
}

int
sc_event_and_list::size() const
{
    return events.size();
}

void
sc_event_and_list::swap(sc_event_and_list &eal)
{
    events.swap(eal.events);
}

sc_event_and_list &
sc_event_and_list::operator &= (const sc_event &e)
{
    insert(e);
    return *this;
}

sc_event_and_list &
sc_event_and_list::operator &= (const sc_event_and_list &eal)
{
    insert(eal);
    return *this;
}

sc_event_and_expr
sc_event_and_list::operator & (const sc_event &e) const
{
    sc_event_and_expr expr;
    expr.insert(*this);
    expr.insert(e);
    return expr;
}

sc_event_and_expr
sc_event_and_list::operator & (const sc_event_and_list &eal)
{
    sc_event_and_expr expr;
    expr.insert(*this);
    expr.insert(eal);
    return expr;
}

void
sc_event_and_list::insert(sc_event const &e)
{
    events.insert(&e);
}

void
sc_event_and_list::insert(sc_event_and_list const &eal)
{
    events.insert(eal.events.begin(), eal.events.end());
}


/*
 * sc_event_or_list
 */

sc_event_or_list::sc_event_or_list() : autoDelete(false), busy(0) {}

sc_event_or_list::sc_event_or_list(const sc_event_or_list &eol) :
    events(eol.events), autoDelete(false), busy(0)
{}

sc_event_or_list::sc_event_or_list(const sc_event &e) : sc_event_or_list()
{
    insert(e);
}

sc_event_or_list::sc_event_or_list(bool auto_delete) :
    autoDelete(auto_delete), busy(0)
{}

sc_event_or_list &
sc_event_or_list::operator = (const sc_event_or_list &eol)
{
    events = eol.events;
    return *this;
}

sc_event_or_list::~sc_event_or_list() {}

int
sc_event_or_list::size() const
{
    return events.size();
}

void
sc_event_or_list::swap(sc_event_or_list &eol)
{
    events.swap(eol.events);
}

sc_event_or_list &
sc_event_or_list::operator |= (const sc_event &e)
{
    insert(e);
    return *this;
}

sc_event_or_list &
sc_event_or_list::operator |= (const sc_event_or_list &eol)
{
    insert(eol);
    return *this;
}

sc_event_or_expr
sc_event_or_list::operator | (const sc_event &e) const
{
    sc_event_or_expr expr;
    expr.insert(*this);
    expr.insert(e);
    return expr;
}

sc_event_or_expr
sc_event_or_list::operator | (const sc_event_or_list &eol) const
{
    sc_event_or_expr expr;
    expr.insert(*this);
    expr.insert(eol);
    return expr;
}

void
sc_event_or_list::insert(sc_event const &e)
{
    events.insert(&e);
}

void
sc_event_or_list::insert(sc_event_or_list const &eol)
{
    events.insert(eol.events.begin(), eol.events.end());
}


/*
 * sc_event_and_expr
 */

// Move semantics
sc_event_and_expr::sc_event_and_expr(sc_event_and_expr const &e) :
    list(e.list)
{
    e.list = nullptr;
}

sc_event_and_expr::operator const sc_event_and_list &() const
{
    sc_event_and_list *temp = list;
    list = nullptr;
    return *temp;
}

void
sc_event_and_expr::insert(sc_event const &e) const
{
    assert(list);
    list->insert(e);
}

void
sc_event_and_expr::insert(sc_event_and_list const &eal) const
{
    assert(list);
    list->insert(eal);
}

sc_event_and_expr::~sc_event_and_expr() { delete list; }

sc_event_and_expr::sc_event_and_expr() : list(new sc_event_and_list(true)) {}

sc_event_and_expr
operator & (sc_event_and_expr expr, sc_event const &e)
{
    expr.insert(e);
    return expr;
}

sc_event_and_expr
operator & (sc_event_and_expr expr, sc_event_and_list const &eal)
{
    expr.insert(eal);
    return expr;
}


/*
 * sc_event_or_expr
 */

// Move semantics
sc_event_or_expr::sc_event_or_expr(sc_event_or_expr const &e) :
    list(e.list)
{
    e.list = nullptr;
}

sc_event_or_expr::operator const sc_event_or_list &() const
{
    sc_event_or_list *temp = list;
    list = NULL;
    return *temp;
}

void
sc_event_or_expr::insert(sc_event const &e) const
{
    assert(list);
    list->insert(e);
}

void
sc_event_or_expr::insert(sc_event_or_list const &eol) const
{
    assert(list);
    list->insert(eol);
}

sc_event_or_expr::~sc_event_or_expr() { delete list; }

sc_event_or_expr::sc_event_or_expr() : list(new sc_event_or_list(true)) {}

sc_event_or_expr
operator | (sc_event_or_expr expr, sc_event const &e)
{
    expr.insert(e);
    return expr;
}

sc_event_or_expr
operator | (sc_event_or_expr expr, sc_event_or_list const &eol)
{
    expr.insert(eol);
    return expr;
}


/*
 * sc_event
 */

sc_event::sc_event() : _gem5_event(new ::sc_gem5::Event(this)) {}

sc_event::sc_event(const char *_name) :
    _gem5_event(new ::sc_gem5::Event(this, _name))
{}

sc_event::~sc_event() { delete _gem5_event; }

const char *sc_event::name() const { return _gem5_event->name().c_str(); }
const char *
sc_event::basename() const
{
    return _gem5_event->basename().c_str();
}
bool sc_event::in_hierarchy() const { return _gem5_event->inHierarchy(); }

sc_object *
sc_event::get_parent_object() const
{
    return _gem5_event->getParentObject();
}

void sc_event::notify() { _gem5_event->notify(); }
void sc_event::notify(const sc_time &t) { _gem5_event->notify(t); }
void sc_event::notify(double d, sc_time_unit u) { _gem5_event->notify(d, u); }
void sc_event::cancel() { _gem5_event->cancel(); }
bool sc_event::triggered() const { return _gem5_event->triggered(); }
void sc_event::notify_delayed() { _gem5_event->notify(SC_ZERO_TIME); }
void sc_event::notify_delayed(const sc_time &t) { _gem5_event->notify(t); }

sc_event_and_expr
sc_event::operator & (const sc_event &e) const
{
    sc_event_and_expr expr;
    expr.insert(*this);
    expr.insert(e);
    return expr;
}

sc_event_and_expr
sc_event::operator & (const sc_event_and_list &eal) const
{
    sc_event_and_expr expr;
    expr.insert(*this);
    expr.insert(eal);
    return expr;
}

sc_event_or_expr
sc_event::operator | (const sc_event &e) const
{
    sc_event_or_expr expr;
    expr.insert(*this);
    expr.insert(e);
    return expr;
}

sc_event_or_expr
sc_event::operator | (const sc_event_or_list &eol) const
{
    sc_event_or_expr expr;
    expr.insert(*this);
    expr.insert(eol);
    return expr;
}

const std::vector<sc_event *> &
sc_get_top_level_events()
{
    return ::sc_gem5::topLevelEvents;
}

sc_event *
sc_find_event(const char *name)
{
    std::string str(name);
    ::sc_gem5::EventsIt it = ::sc_gem5::findEvent(str);
    return it == ::sc_gem5::allEvents.end() ? nullptr : *it;
}

} // namespace sc_core
