From 3fe6ebb325f3630af32d9210a7121eb5710bf42f Mon Sep 17 00:00:00 2001 From: Gabe Black Date: Fri, 28 Sep 2018 13:02:05 -0700 Subject: [PATCH] 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 Maintainer: Gabe Black --- src/systemc/core/sc_spawn.cc | 15 ------------ src/systemc/ext/core/sc_spawn.hh | 41 +++++++++++++++++++++----------- 2 files changed, 27 insertions(+), 29 deletions(-) diff --git a/src/systemc/core/sc_spawn.cc b/src/systemc/core/sc_spawn.cc index 4618ea8c2..ed7f2f22b 100644 --- a/src/systemc/core/sc_spawn.cc +++ b/src/systemc/core/sc_spawn.cc @@ -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 diff --git a/src/systemc/ext/core/sc_spawn.hh b/src/systemc/ext/core/sc_spawn.hh index 50378e23d..a37e48206 100644 --- a/src/systemc/ext/core/sc_spawn.hh +++ b/src/systemc/ext/core/sc_spawn.hh @@ -30,6 +30,7 @@ #ifndef __SYSTEMC_EXT_CORE_SC_SPAWN_HH__ #define __SYSTEMC_EXT_CORE_SC_SPAWN_HH__ +#include #include #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 +auto sc_bind(F &&f, Args && ...args) -> + decltype(std::bind(std::forward(f), std::forward(args)...)) +{ + return std::bind(std::forward(f), std::forward(args)...); +} + +template +auto sc_ref(T &&v) -> decltype(std::ref(std::forward(v))) +{ + return std::ref(std::forward(v)); +} + +template +auto sc_cref(T &&v) -> decltype(std::cref(std::forward(v))) +{ + return std::cref(std::forward(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 -- 2.30.2