base: Make it possible to convert strings to enums
authorGiacomo Travaglini <giacomo.travaglini@arm.com>
Tue, 8 Jan 2019 10:17:39 +0000 (10:17 +0000)
committerGiacomo Travaglini <giacomo.travaglini@arm.com>
Thu, 10 Jan 2019 12:36:31 +0000 (12:36 +0000)
The __to_number helper function defined in base/str.hh is used by
unserializing code. Its purpose is to convert a string into an
integral/floating point number.  Since enums underlying type can only be
an integer type, it makes sense to extend the helper function for enums
as well. In this way it will be possible to unserialize Enums and
containers of Enums without the need of casting.

Change-Id: I74069cc4c04ec8b5eb80939acea7ab18fb366dd4
Signed-off-by: Giacomo Travaglini <giacomo.travaglini@arm.com>
Reviewed-by: Ciro Santilli <ciro.santilli@arm.com>
Reviewed-by: Andreas Sandberg <andreas.sandberg@arm.com>
Reviewed-by: Nikos Nikoleris <nikos.nikoleris@arm.com>
Reviewed-on: https://gem5-review.googlesource.com/c/15336
Reviewed-by: Gabe Black <gabeblack@google.com>
Maintainer: Andreas Sandberg <andreas.sandberg@arm.com>

src/base/str.hh

index 52ab977fc5997d65c14e5bfafbbd8b3cad4119e1..61022bd26eda96d88c6c976f8e1e47540f4c68ff 100644 (file)
@@ -1,4 +1,7 @@
 /*
+ * Copyright (c) 2018 ARM Limited
+ * All rights reserved
+ *
  * Copyright (c) 2001-2005 The Regents of The University of Michigan
  * All rights reserved.
  *
@@ -102,10 +105,11 @@ tokenize(std::vector<std::string> &vector, const std::string &s,
  * @{
  *
  * @name String to number helper functions for signed and unsigned
- *       integeral type, as well as floating-point types.
+ *       integeral type, as well as enums and floating-point types.
  */
 template <class T>
-typename std::enable_if<std::is_integral<T>::value &&
+typename std::enable_if<(std::is_integral<T>::value ||
+                        std::is_enum<T>::value) &&
                         std::is_signed<T>::value, T>::type
 __to_number(const std::string &value)
 {
@@ -117,7 +121,8 @@ __to_number(const std::string &value)
 }
 
 template <class T>
-typename std::enable_if<std::is_integral<T>::value &&
+typename std::enable_if<(std::is_integral<T>::value ||
+                        std::is_enum<T>::value) &&
                         !std::is_signed<T>::value, T>::type
 __to_number(const std::string &value)
 {