Skip to content

Commit fd0ccbb

Browse files
[ADT] Reduce boilerplate in DenseSet (NFC)
The class definitions of DenseSet and SmallDenseSet contain a lot of boilerplate code, repeating the lengthy base class name twice in each definition. This patch simplifies the two definitions by making them type aliases. The patch adds an implicit default constructor. Without the implicit default constructor, the following wouldn't work: Index.exportToDot(OSDot, {}); One caveat is that with the type alias-based solution, forward declarations like "class DenseSet;" are no longer valid. This patch updates the forward declaration in MLIR.
1 parent ad9d551 commit fd0ccbb

File tree

2 files changed

+24
-33
lines changed

2 files changed

+24
-33
lines changed

llvm/include/llvm/ADT/DenseSet.h

Lines changed: 12 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,8 @@ class DenseSetImpl {
6666
using value_type = ValueT;
6767
using size_type = unsigned;
6868

69-
explicit DenseSetImpl(unsigned InitialReserve = 0) : TheMap(InitialReserve) {}
69+
DenseSetImpl() = default;
70+
explicit DenseSetImpl(unsigned InitialReserve) : TheMap(InitialReserve) {}
7071

7172
template <typename InputIt>
7273
DenseSetImpl(const InputIt &I, const InputIt &E)
@@ -254,40 +255,21 @@ bool operator!=(const DenseSetImpl<ValueT, MapTy, ValueInfoT> &LHS,
254255

255256
/// Implements a dense probed hash-table based set.
256257
template <typename ValueT, typename ValueInfoT = DenseMapInfo<ValueT>>
257-
class DenseSet : public detail::DenseSetImpl<
258-
ValueT,
259-
DenseMap<ValueT, detail::DenseSetEmpty, ValueInfoT,
260-
detail::DenseSetPair<ValueT>>,
261-
ValueInfoT> {
262-
using BaseT =
263-
detail::DenseSetImpl<ValueT,
264-
DenseMap<ValueT, detail::DenseSetEmpty, ValueInfoT,
265-
detail::DenseSetPair<ValueT>>,
266-
ValueInfoT>;
267-
268-
public:
269-
using BaseT::BaseT;
270-
};
258+
using DenseSet =
259+
detail::DenseSetImpl<ValueT,
260+
DenseMap<ValueT, detail::DenseSetEmpty, ValueInfoT,
261+
detail::DenseSetPair<ValueT>>,
262+
ValueInfoT>;
271263

272264
/// Implements a dense probed hash-table based set with some number of buckets
273265
/// stored inline.
274266
template <typename ValueT, unsigned InlineBuckets = 4,
275267
typename ValueInfoT = DenseMapInfo<ValueT>>
276-
class SmallDenseSet
277-
: public detail::DenseSetImpl<
278-
ValueT,
279-
SmallDenseMap<ValueT, detail::DenseSetEmpty, InlineBuckets,
280-
ValueInfoT, detail::DenseSetPair<ValueT>>,
281-
ValueInfoT> {
282-
using BaseT = detail::DenseSetImpl<
283-
ValueT,
284-
SmallDenseMap<ValueT, detail::DenseSetEmpty, InlineBuckets, ValueInfoT,
285-
detail::DenseSetPair<ValueT>>,
286-
ValueInfoT>;
287-
288-
public:
289-
using BaseT::BaseT;
290-
};
268+
using SmallDenseSet = detail::DenseSetImpl<
269+
ValueT,
270+
SmallDenseMap<ValueT, detail::DenseSetEmpty, InlineBuckets, ValueInfoT,
271+
detail::DenseSetPair<ValueT>>,
272+
ValueInfoT>;
291273

292274
} // end namespace llvm
293275

mlir/include/mlir/Support/LLVM.h

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,13 @@ template <typename KeyT, typename ValueT, typename KeyInfoT, typename BucketT>
5555
class DenseMap;
5656
template <typename T, typename Enable>
5757
struct DenseMapInfo;
58-
template <typename ValueT, typename ValueInfoT>
59-
class DenseSet;
58+
namespace detail {
59+
template <typename ValueT, typename MapTy, typename ValueInfoT>
60+
class DenseSetImpl;
61+
struct DenseSetEmpty;
62+
template <typename KeyT>
63+
class DenseSetPair;
64+
} // namespace detail
6065
class MallocAllocator;
6166
template <typename T>
6267
class MutableArrayRef;
@@ -125,7 +130,11 @@ template <typename KeyT, typename ValueT,
125130
typename BucketT = llvm::detail::DenseMapPair<KeyT, ValueT>>
126131
using DenseMap = llvm::DenseMap<KeyT, ValueT, KeyInfoT, BucketT>;
127132
template <typename ValueT, typename ValueInfoT = DenseMapInfo<ValueT>>
128-
using DenseSet = llvm::DenseSet<ValueT, ValueInfoT>;
133+
using DenseSet = llvm::detail::DenseSetImpl<
134+
ValueT,
135+
llvm::DenseMap<ValueT, llvm::detail::DenseSetEmpty, ValueInfoT,
136+
llvm::detail::DenseSetPair<ValueT>>,
137+
ValueInfoT>;
129138
template <typename T, typename Vector = llvm::SmallVector<T, 0>,
130139
typename Set = DenseSet<T>, unsigned N = 0>
131140
using SetVector = llvm::SetVector<T, Vector, Set, N>;

0 commit comments

Comments
 (0)