From 3db10b2385ba591e9ca7ebd5e31d009d0aa4b30d Mon Sep 17 00:00:00 2001 From: Devin Papineau Date: Wed, 10 Jan 2024 18:30:50 -0500 Subject: [PATCH] Define TR::map and TR::set analogously to TR::vector and TR::list When using std::map and std::set directly, the TR::typed_allocator must always be specified explicitly. Since the allocator parameter is last, the comparator must be given explicitly as well even if the default of std::less would be appropriate, which is often the case. As a result, typical uses of std::map and std::set take up multiple lines just to write down the type. Additionally, when specifying the allocator for std::map, the key (first) type in the std::pair type provided to TR::typed_allocator must be const-qualified. In the past it has been possible to forget const, which resulted in strange consequences. For example, here's a commit adding a forgotten const: 10dbf7e4e591ba0e. This commit defines subtypes TR::map and TR::set that take care of wrapping the allocator in TR::typed_allocator. The default allocator (TR::Region&) should almost always be usable, in which case it can be omitted, and it might also be possible to omit the comparator. (Note that this default differs from that of TR::vector and TR::list, but TR::Region& might arguably be a better default for those as well.) --- compiler/infra/map.hpp | 57 ++++++++++++++++++++++++++++++++++++++++++ compiler/infra/set.hpp | 56 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 113 insertions(+) create mode 100644 compiler/infra/map.hpp create mode 100644 compiler/infra/set.hpp diff --git a/compiler/infra/map.hpp b/compiler/infra/map.hpp new file mode 100644 index 00000000000..03e5b0f6935 --- /dev/null +++ b/compiler/infra/map.hpp @@ -0,0 +1,57 @@ +/******************************************************************************* + * Copyright IBM Corp. and others 2017 + * + * This program and the accompanying materials are made available under + * the terms of the Eclipse Public License 2.0 which accompanies this + * distribution and is available at http://eclipse.org/legal/epl-2.0 + * or the Apache License, Version 2.0 which accompanies this distribution + * and is available at https://www.apache.org/licenses/LICENSE-2.0. + * + * This Source Code may also be made available under the following Secondary + * Licenses when the conditions for such availability set forth in the + * Eclipse Public License, v. 2.0 are satisfied: GNU General Public License, + * version 2 with the GNU Classpath Exception [1] and GNU General Public + * License, version 2 with the OpenJDK Assembly Exception [2]. + * + * [1] https://www.gnu.org/software/classpath/license.html + * [2] http://openjdk.java.net/legal/assembly-exception.html + * + * SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 OR LicenseRef-GPL-2.0 WITH Assembly-exception + *******************************************************************************/ + +#ifndef TR_MAP_HPP +#define TR_MAP_HPP + +#pragma once + +#include +#include "env/Region.hpp" +#include "env/TRMemory.hpp" +#include "env/TypedAllocator.hpp" + +namespace TR { + +template < + typename K, + typename V, + typename Cmp = std::less, + typename Alloc = TR::Region& +> +class map : public std::map, Alloc> > + { + private: + typedef std::map, Alloc> > Base; + + public: + typedef typename Base::key_compare key_compare; + typedef typename Base::allocator_type allocator_type; + + map(const key_compare &cmp, const allocator_type &alloc) : Base(cmp, alloc) {} + + // This constructor is available when the comparison is default-constructible. + map(const allocator_type &alloc) : Base(key_compare(), alloc) {} + }; + +} // namespace TR + +#endif // TR_MAP_HPP diff --git a/compiler/infra/set.hpp b/compiler/infra/set.hpp new file mode 100644 index 00000000000..08a99bf33b7 --- /dev/null +++ b/compiler/infra/set.hpp @@ -0,0 +1,56 @@ +/******************************************************************************* + * Copyright IBM Corp. and others 2017 + * + * This program and the accompanying materials are made available under + * the terms of the Eclipse Public License 2.0 which accompanies this + * distribution and is available at http://eclipse.org/legal/epl-2.0 + * or the Apache License, Version 2.0 which accompanies this distribution + * and is available at https://www.apache.org/licenses/LICENSE-2.0. + * + * This Source Code may also be made available under the following Secondary + * Licenses when the conditions for such availability set forth in the + * Eclipse Public License, v. 2.0 are satisfied: GNU General Public License, + * version 2 with the GNU Classpath Exception [1] and GNU General Public + * License, version 2 with the OpenJDK Assembly Exception [2]. + * + * [1] https://www.gnu.org/software/classpath/license.html + * [2] http://openjdk.java.net/legal/assembly-exception.html + * + * SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 OR LicenseRef-GPL-2.0 WITH Assembly-exception + *******************************************************************************/ + +#ifndef TR_SET_HPP +#define TR_SET_HPP + +#pragma once + +#include +#include "env/Region.hpp" +#include "env/TRMemory.hpp" +#include "env/TypedAllocator.hpp" + +namespace TR { + +template < + typename T, + typename Cmp = std::less, + typename Alloc = TR::Region& +> +class set : public std::set > + { + private: + typedef std::set > Base; + + public: + typedef typename Base::value_compare value_compare; + typedef typename Base::allocator_type allocator_type; + + set(const value_compare &cmp, const allocator_type &alloc) : Base(cmp, alloc) {} + + // This constructor is available when the comparison is default-constructible. + set(const allocator_type &alloc) : Base(value_compare(), alloc) {} + }; + +} // namespace TR + +#endif // TR_SET_HPP