Skip to content

Commit

Permalink
Define TR::map and TR::set analogously to TR::vector and TR::list
Browse files Browse the repository at this point in the history
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: 10dbf7e.

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.)
  • Loading branch information
jdmpapin committed Feb 29, 2024
1 parent a26218f commit 3db10b2
Show file tree
Hide file tree
Showing 2 changed files with 113 additions and 0 deletions.
57 changes: 57 additions & 0 deletions compiler/infra/map.hpp
Original file line number Diff line number Diff line change
@@ -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 <map>
#include "env/Region.hpp"
#include "env/TRMemory.hpp"
#include "env/TypedAllocator.hpp"

namespace TR {

template <
typename K,
typename V,
typename Cmp = std::less<K>,
typename Alloc = TR::Region&
>
class map : public std::map<K, V, Cmp, TR::typed_allocator<std::pair<const K, V>, Alloc> >
{
private:
typedef std::map<K, V, Cmp, TR::typed_allocator<std::pair<const K, V>, 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
56 changes: 56 additions & 0 deletions compiler/infra/set.hpp
Original file line number Diff line number Diff line change
@@ -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 <set>
#include "env/Region.hpp"
#include "env/TRMemory.hpp"
#include "env/TypedAllocator.hpp"

namespace TR {

template <
typename T,
typename Cmp = std::less<T>,
typename Alloc = TR::Region&
>
class set : public std::set<T, Cmp, TR::typed_allocator<T, Alloc> >
{
private:
typedef std::set<T, Cmp, TR::typed_allocator<T, Alloc> > 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

0 comments on commit 3db10b2

Please sign in to comment.