summaryrefslogtreecommitdiff
path: root/src/systemc
diff options
context:
space:
mode:
authorGabe Black <gabeblack@google.com>2018-09-28 13:02:05 -0700
committerGabe Black <gabeblack@google.com>2018-10-16 00:39:57 +0000
commit3fe6ebb325f3630af32d9210a7121eb5710bf42f (patch)
tree8692bab191e398e1412096633c91cadab95f2a40 /src/systemc
parent56eef42e7a60f7dfa8f874f7763ea638753c0c81 (diff)
downloadgem5-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')
-rw-r--r--src/systemc/core/sc_spawn.cc15
-rw-r--r--src/systemc/ext/core/sc_spawn.hh41
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 <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