base: Defining make_unique for C++11
authorGiacomo Travaglini <giacomo.travaglini@arm.com>
Mon, 16 Oct 2017 16:20:08 +0000 (17:20 +0100)
committerGiacomo Travaglini <giacomo.travaglini@arm.com>
Fri, 20 Oct 2017 08:32:03 +0000 (08:32 +0000)
std::make_unique is not available for C++11 compilers, and it has been
introduced only in C++14.  Since gem5 is not officially supporting the
latter at the moment, this patch allows to use it in gem5 if including
base/compiler.hh. If compiled under C++14, std::make_unique will be
used instead.

Change-Id: Ibf1897fad0a1eb1cb0c683cc25170feaa6841997
Signed-off-by: Giacomo Travaglini <giacomo.travaglini@arm.com>
Reviewed-by: Andreas Sandberg <andreas.sandberg@arm.com>
Reviewed-on: https://gem5-review.googlesource.com/5201
Reviewed-by: Anthony Gutierrez <anthony.gutierrez@amd.com>
Reviewed-by: Jason Lowe-Power <jason@lowepower.com>
Maintainer: Jason Lowe-Power <jason@lowepower.com>

src/base/compiler.hh

index 9cad07d7a90b75a7ff970bdfb6467f40ce77d572..2fdd323b968c972619e517f82d9482d6040f5376 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012 ARM Limited
+ * Copyright (c) 2012,2017 ARM Limited
  * All rights reserved
  *
  * The license below extends only to copyright in the software and shall
@@ -43,6 +43,8 @@
 #ifndef __BASE_COMPILER_HH__
 #define __BASE_COMPILER_HH__
 
+#include <memory>
+
 // http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html
 
 #if defined(__GNUC__) // clang or gcc
 #  define M5_CLASS_VAR_USED
 #endif
 
+// std::make_unique redefined for C++11 compilers
+namespace m5
+{
+
+#if __cplusplus == 201402L // C++14
+
+using std::make_unique;
+
+#else // C++11
+
+/** Defining custom version of make_unique: m5::make_unique<>() */
+template<typename T, typename... Args>
+std::unique_ptr<T>
+make_unique( Args&&... constructor_args )
+{
+    return std::unique_ptr<T>(
+               new T( std::forward<Args>(constructor_args)... )
+           );
+}
+
+#endif // __cplusplus == 201402L
+
+} //namespace m5
+
 #endif // __BASE_COMPILER_HH__