GCC versions before 6.1 don't support std::hash for enum types.  Add a
hash function for enum cbl_enconding_t based in the underlying type.
Use it for the unordered_map where cbl_enconding_t is the key type.
Also add a typedef to make it easier to use the long type with templates.

libgcobol/ChangeLog:

        * charmaps.cc (__gg__get_charmap): Use cbl_encoding_charmap_map.
        (typedef cbl_encoding_charmap_map): New.
        * encodings.h (struct cbl_encoding_t_hash): New.

Signed-off-by: Pietro Monteiro <[email protected]>
---
 libgcobol/charmaps.cc |  8 +++++---
 libgcobol/encodings.h | 11 +++++++++++
 2 files changed, 16 insertions(+), 3 deletions(-)

diff --git a/libgcobol/charmaps.cc b/libgcobol/charmaps.cc
index 8aa42e3234e..3e22c669a86 100644
--- a/libgcobol/charmaps.cc
+++ b/libgcobol/charmaps.cc
@@ -1726,8 +1726,11 @@ __gg__miconverter( cbl_encoding_t from,
   return retval;
   }
 
+typedef std::unordered_map<cbl_encoding_t, charmap_t *, cbl_encoding_t_hash>
+cbl_encoding_charmap_map;
+
 static
-std::unordered_map<cbl_encoding_t, charmap_t *>map_of_encodings;
+cbl_encoding_charmap_map map_of_encodings;
 
 charmap_t *
 __gg__get_charmap(cbl_encoding_t encoding)
@@ -1749,8 +1752,7 @@ __gg__get_charmap(cbl_encoding_t encoding)
     }
 
   charmap_t *retval;
-  std::unordered_map<cbl_encoding_t, charmap_t *>::const_iterator it
-                          = map_of_encodings.find(encoding);
+  cbl_encoding_charmap_map::const_iterator it = 
map_of_encodings.find(encoding);
   if( it != map_of_encodings.end() )
     {
     retval = it->second;
diff --git a/libgcobol/encodings.h b/libgcobol/encodings.h
index 3a7e40cef83..cf46d83981a 100644
--- a/libgcobol/encodings.h
+++ b/libgcobol/encodings.h
@@ -31,6 +31,8 @@
 #ifndef _ENCODINGS_H_
 #define _ENCODINGS_H_
 
+#include <type_traits>
+
 enum cbl_encoding_t {
   no_encoding_e,
   custom_encoding_e,
@@ -1212,4 +1214,13 @@ struct encodings_t {
   char name[32];
 };
 
+struct cbl_encoding_t_hash {
+  using hashed_type = std::underlying_type<cbl_encoding_t>::type;
+    size_t
+    operator()(cbl_encoding_t e) const noexcept
+    {
+      return std::hash<hashed_type>{}(static_cast<hashed_type>(e));
+    }
+};
+
 #endif
-- 
2.43.0

Reply via email to