From e5fa6583a7b1e5e0e0f33a4964a1f271e189cf35 Mon Sep 17 00:00:00 2001 From: Pedro Alves Date: Fri, 8 Dec 2017 22:44:12 +0000 Subject: [PATCH] Add gdb::hash_enum MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit The DWARF-5 .debug_names consumer patch will want to use an std::unordered_map with an enum as key type, like: std::unordered_map That doesn't work in C++11 in non-recent compilers due to a language defect: http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2148 ~~~ In file included from /usr/include/c++/5.3.1/bits/hashtable.h:35:0, from /usr/include/c++/5.3.1/unordered_set:47, from src/gdb/dwarf2read.c:79: /usr/include/c++/5.3.1/bits/hashtable_policy.h: In instantiation of ‘struct std::__detail::__is_noexcept_hash >’: /usr/include/c++/5.3.1/type_traits:137:12: required from ‘struct std::__and_ >, std::__detail::__is_noexcept_hash > >’ /usr/include/c++/5.3.1/type_traits:148:38: required from ‘struct std::__not_ >, std::__detail::__is_noexcept_hash > > >’ /usr/include/c++/5.3.1/bits/unordered_map.h:100:66: required from ‘class std::unordered_map’ src/gdb/dwarf2read.c:3260:30: required from here /usr/include/c++/5.3.1/bits/hashtable_policy.h:85:34: error: no match for call to ‘(const std::hash) (const sect_offset&)’ noexcept(declval()(declval()))> ^ In file included from /usr/include/c++/5.3.1/bits/move.h:57:0, from /usr/include/c++/5.3.1/bits/stl_pair.h:59, from /usr/include/c++/5.3.1/bits/stl_algobase.h:64, from /usr/include/c++/5.3.1/bits/char_traits.h:39, from /usr/include/c++/5.3.1/string:40, from /home/pedro/gdb/mygit/src/gdb/common/common-utils.h:23, from /home/pedro/gdb/mygit/src/gdb/common/common-defs.h:78, from /home/pedro/gdb/mygit/src/gdb/defs.h:28, from /home/pedro/gdb/mygit/src/gdb/dwarf2read.c:31: ~~~ This commits adds a helper replacement. gdb/ChangeLog: 2017-12-08 Pedro Alves * common/hash_enum.h: New file. --- gdb/ChangeLog | 4 ++++ gdb/common/hash_enum.h | 45 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+) create mode 100644 gdb/common/hash_enum.h diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 5d596f09fa..09cafd02c3 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,7 @@ +2017-12-08 Pedro Alves + + * common/hash_enum.h: New file. + 2017-12-08 Jan Kratochvil * dwarf2read.c (create_cu_from_index_list): New from ... diff --git a/gdb/common/hash_enum.h b/gdb/common/hash_enum.h new file mode 100644 index 0000000000..0ea32215df --- /dev/null +++ b/gdb/common/hash_enum.h @@ -0,0 +1,45 @@ +/* A hasher for enums. + + Copyright (C) 2017 Free Software Foundation, Inc. + + This file is part of GDB. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifndef COMMON_HASH_ENUM_H +#define COMMON_HASH_ENUM_H + +/* A hasher for enums, which was missing in C++11: + http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2148 +*/ + +namespace gdb { + +/* Helper struct for hashing enum types. */ +template +struct hash_enum +{ + typedef size_t result_type; + typedef T argument_type; + + size_t operator() (T val) const noexcept + { + using underlying = typename std::underlying_type::type; + return std::hash () (static_cast (val)); + } +}; + +} /* namespace gdb */ + +#endif /* COMMON_HASH_ENUM_H */ -- 2.34.1