summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGiacomo Travaglini <giacomo.travaglini@arm.com>2017-10-16 17:20:08 +0100
committerGiacomo Travaglini <giacomo.travaglini@arm.com>2017-10-20 08:32:03 +0000
commit2a4d6925bc678e3cfa93e3560ec9a4c7f8e6ec2b (patch)
treeb7b20269d934deeea4b931eca5d691a6de67105b
parentcc52235454bc1bf60100e15043d89019b857d134 (diff)
downloadgem5-2a4d6925bc678e3cfa93e3560ec9a4c7f8e6ec2b.tar.xz
base: Defining make_unique for C++11
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>
-rw-r--r--src/base/compiler.hh28
1 files changed, 27 insertions, 1 deletions
diff --git a/src/base/compiler.hh b/src/base/compiler.hh
index 9cad07d7a..2fdd323b9 100644
--- a/src/base/compiler.hh
+++ b/src/base/compiler.hh
@@ -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
@@ -61,4 +63,28 @@
# 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__