Skip to content

Commit 8074a56

Browse files
committed
Use C++ concepts in Token classes
The use of concepts allows the default copy/operator= methods to properly handle non-const arguments without having the template being a better match.
1 parent 1d7ff69 commit 8074a56

File tree

3 files changed

+6
-24
lines changed

3 files changed

+6
-24
lines changed

FWCore/Utilities/interface/EDGetToken.h

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -81,24 +81,18 @@ namespace edm {
8181
constexpr EDGetTokenT& operator=(EDGetTokenT<T>&&) noexcept = default;
8282

8383
template <typename ADAPTER>
84+
requires requires(ADAPTER&& a) { a.template consumes<T>(); }
8485
constexpr explicit EDGetTokenT(ADAPTER&& iAdapter) : EDGetTokenT(iAdapter.template consumes<T>()) {}
8586

8687
template <typename ADAPTER>
88+
requires requires(ADAPTER&& a) { a.template consumes<T>(); }
8789
constexpr EDGetTokenT& operator=(ADAPTER&& iAdapter) {
8890
EDGetTokenT<T> temp(iAdapter.template consumes<T>());
8991
m_value = temp.m_value;
9092

9193
return *this;
9294
}
9395

94-
//Needed to avoid EDGetTokenT(ADAPTER&&) from being called instead
95-
// when we can use C++20 concepts we can avoid the problem using a constraint
96-
constexpr EDGetTokenT(EDGetTokenT<T>& iOther) noexcept : m_value{iOther.m_value} {}
97-
constexpr EDGetTokenT(const EDGetTokenT<T>&& iOther) noexcept : m_value{iOther.m_value} {}
98-
99-
constexpr EDGetTokenT& operator=(EDGetTokenT<T>& iOther) {
100-
return (*this = const_cast<const EDGetTokenT<T>&>(iOther));
101-
}
10296
// ---------- const member functions ---------------------
10397
constexpr unsigned int index() const noexcept { return m_value; }
10498
constexpr bool isUninitialized() const noexcept { return m_value == s_uninitializedValue; }

FWCore/Utilities/interface/EDPutToken.h

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -75,19 +75,16 @@ namespace edm {
7575

7676
constexpr EDPutTokenT(const EDPutTokenT<T>&) noexcept = default;
7777
constexpr EDPutTokenT(EDPutTokenT<T>&&) noexcept = default;
78-
constexpr EDPutTokenT(EDPutTokenT<T>& iToken) noexcept : EDPutTokenT(const_cast<EDPutTokenT<T> const&>(iToken)) {}
7978

8079
template <typename ADAPTER>
80+
requires requires(ADAPTER&& a) { a.template produces<T>(); }
8181
constexpr explicit EDPutTokenT(ADAPTER&& iAdapter) noexcept : EDPutTokenT(iAdapter.template produces<T>()) {}
8282

8383
constexpr EDPutTokenT& operator=(const EDPutTokenT<T>&) noexcept = default;
8484
constexpr EDPutTokenT& operator=(EDPutTokenT<T>&&) noexcept = default;
85-
constexpr EDPutTokenT& operator=(EDPutTokenT<T>& iOther) noexcept {
86-
m_value = iOther.m_value;
87-
return *this;
88-
}
8985

9086
template <typename ADAPTER>
87+
requires requires(ADAPTER&& a) { a.template produces<T>(); }
9188
constexpr EDPutTokenT& operator=(ADAPTER&& iAdapter) noexcept {
9289
EDPutTokenT<T> temp(iAdapter.template produces<T>());
9390
m_value = temp.m_value;

FWCore/Utilities/interface/ESGetToken.h

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -49,25 +49,16 @@ namespace edm {
4949
constexpr ESGetToken<ESProduct, ESRecord>& operator=(ESGetToken<ESProduct, ESRecord> const&) noexcept = default;
5050

5151
template <typename ADAPTER>
52+
requires requires(ADAPTER&& a) { a.template consumes<ESProduct, ESRecord>(); }
5253
constexpr explicit ESGetToken(ADAPTER&& iAdapter) : ESGetToken(iAdapter.template consumes<ESProduct, ESRecord>()) {}
5354

5455
template <typename ADAPTER>
56+
requires requires(ADAPTER&& a) { a.template consumes<ESProduct, ESRecord>(); }
5557
constexpr ESGetToken<ESProduct, ESRecord>& operator=(ADAPTER&& iAdapter) {
5658
ESGetToken<ESProduct, ESRecord> temp(std::forward<ADAPTER>(iAdapter));
5759
return (*this = std::move(temp));
5860
}
5961

60-
//protect against templated version being a better match
61-
constexpr ESGetToken(ESGetToken<ESProduct, ESRecord>& iOther)
62-
: ESGetToken(const_cast<const ESGetToken<ESProduct, ESRecord>&>(iOther)) {}
63-
constexpr ESGetToken<ESProduct, ESRecord>& operator=(ESGetToken<ESProduct, ESRecord>& iOther) noexcept {
64-
return (*this = const_cast<ESGetToken<ESProduct, ESRecord> const&>(iOther));
65-
}
66-
constexpr ESGetToken(ESGetToken<ESProduct, ESRecord> const&& iOther) : ESGetToken(iOther) {}
67-
constexpr ESGetToken<ESProduct, ESRecord>& operator=(ESGetToken<ESProduct, ESRecord> const&& iOther) noexcept {
68-
return (*this = iOther);
69-
}
70-
7162
constexpr unsigned int transitionID() const noexcept { return m_transitionID; }
7263
constexpr bool isInitialized() const noexcept { return transitionID() != std::numeric_limits<unsigned int>::max(); }
7364
constexpr ESTokenIndex index() const noexcept { return m_index; }

0 commit comments

Comments
 (0)