systemc: Use c++11 partial functions instead of boosts.

This creates a depenendency on c++11 which the headers otherwise avoid,
but gem5 itself already has a c++11 dependency and not a boost
dependency, and outside of having a local copy of boost (which
Accellera does) there isn't a good way to put the placeholder values
_1, _2, etc., into the custom sc_unnammed namespace.

Change-Id: I52ca4c1bc52bef6ff2c62e9f3c32af46f95244dc
Reviewed-on: https://gem5-review.googlesource.com/c/13193
Reviewed-by: Gabe Black <gabeblack@google.com>
Maintainer: Gabe Black <gabeblack@google.com>
This commit is contained in:
Gabe Black
2018-09-28 13:02:05 -07:00
parent 56eef42e7a
commit 3fe6ebb325
2 changed files with 27 additions and 29 deletions

View File

@@ -224,18 +224,3 @@ sc_spawn_options::async_reset_signal_is(
}
} // namespace sc_core
namespace sc_unnamed
{
ImplementationDefined _1;
ImplementationDefined _2;
ImplementationDefined _3;
ImplementationDefined _4;
ImplementationDefined _5;
ImplementationDefined _6;
ImplementationDefined _7;
ImplementationDefined _8;
ImplementationDefined _9;
} // namespace sc_unnamed

View File

@@ -30,6 +30,7 @@
#ifndef __SYSTEMC_EXT_CORE_SC_SPAWN_HH__
#define __SYSTEMC_EXT_CORE_SC_SPAWN_HH__
#include <functional>
#include <vector>
#include "sc_join.hh"
@@ -173,10 +174,6 @@ sc_spawn(typename T::result_type *r_p, T object, const char *name_p=nullptr,
return sc_process_handle() = p;
}
#define sc_bind boost::bind
#define sc_ref(r) boost::ref(r)
#define sc_cref(r) boost::cref(r)
#define SC_FORK \
{ \
::sc_core::sc_process_handle forkees[] = {
@@ -198,22 +195,38 @@ sc_spawn(typename T::result_type *r_p, T object, const char *name_p=nullptr,
join.wait_clocked(); \
}
// This avoids boost introduces a dependency on c++11. If that's a problem,
// we could imitate Accellera and pick which one to use on the fly.
template <typename F, typename... Args>
auto sc_bind(F &&f, Args && ...args) ->
decltype(std::bind(std::forward<F>(f), std::forward<Args>(args)...))
{
return std::bind(std::forward<F>(f), std::forward<Args>(args)...);
}
template <typename T>
auto sc_ref(T &&v) -> decltype(std::ref(std::forward<T>(v)))
{
return std::ref(std::forward<T>(v));
}
template <typename T>
auto sc_cref(T &&v) -> decltype(std::cref(std::forward<T>(v)))
{
return std::cref(std::forward<T>(v));
}
} // namespace sc_core
using sc_core::sc_bind;
using sc_core::sc_ref;
using sc_core::sc_cref;
namespace sc_unnamed
{
typedef int ImplementationDefined;
extern ImplementationDefined _1;
extern ImplementationDefined _2;
extern ImplementationDefined _3;
extern ImplementationDefined _4;
extern ImplementationDefined _5;
extern ImplementationDefined _6;
extern ImplementationDefined _7;
extern ImplementationDefined _8;
extern ImplementationDefined _9;
using namespace std::placeholders;
} // namespace sc_unnamed