systemc: Use c++11 partial functions instead of boosts.
authorGabe Black <gabeblack@google.com>
Fri, 28 Sep 2018 20:02:05 +0000 (13:02 -0700)
committerGabe Black <gabeblack@google.com>
Tue, 16 Oct 2018 00:39:57 +0000 (00:39 +0000)
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>

src/systemc/core/sc_spawn.cc
src/systemc/ext/core/sc_spawn.hh

index 4618ea8c243b6b84e5e4b5637ea5fd090e5a9f4a..ed7f2f22b524a8d6808a47128ee8f5f59531dc06 100644 (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
index 50378e23da3e2575156f9d8e8184606807543d7b..a37e48206c01119ba5540ca4ea420bdf177282da 100644 (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