diff options
author | Gabe Black <gabeblack@google.com> | 2018-09-28 13:02:05 -0700 |
---|---|---|
committer | Gabe Black <gabeblack@google.com> | 2018-10-16 00:39:57 +0000 |
commit | 3fe6ebb325f3630af32d9210a7121eb5710bf42f (patch) | |
tree | 8692bab191e398e1412096633c91cadab95f2a40 /src/systemc/ext | |
parent | 56eef42e7a60f7dfa8f874f7763ea638753c0c81 (diff) | |
download | gem5-3fe6ebb325f3630af32d9210a7121eb5710bf42f.tar.xz |
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>
Diffstat (limited to 'src/systemc/ext')
-rw-r--r-- | src/systemc/ext/core/sc_spawn.hh | 41 |
1 files changed, 27 insertions, 14 deletions
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 <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 |