Remove _For_each_tuple_element in scoped_lock (#760)

Fixes #738.
This commit is contained in:
Sumit Bhardwaj 2020-04-30 03:51:20 -07:00 коммит произвёл GitHub
Родитель 045f3dd0e1
Коммит d7f855891b
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
3 изменённых файлов: 17 добавлений и 19 удалений

Просмотреть файл

@ -463,7 +463,7 @@ public:
}
~scoped_lock() noexcept {
_For_each_tuple_element(_MyMutexes, [](auto& _Mutex) noexcept { _Mutex.unlock(); });
_STD apply([](_Mutexes&... _Mtxes) { (..., (void) _Mtxes.unlock()); }, _MyMutexes);
}
scoped_lock(const scoped_lock&) = delete;

Просмотреть файл

@ -969,21 +969,6 @@ _NODISCARD constexpr _Ty make_from_tuple(_Tuple&& _Tpl) { // construct _Ty from
}
#endif // _HAS_CXX17
// FUNCTION TEMPLATE _For_each_tuple_element
template <class _Tpl, class _Fx, size_t... _Indices>
void _For_each_tuple_element_impl(
_Tpl&& _Tuple, _Fx _Func, index_sequence<_Indices...>) { // call _Func() on the _Indices elements of _Tuple
int _Ignored[] = {(static_cast<void>(_Func(_STD get<_Indices>(_STD forward<_Tpl>(_Tuple)))), 0)...};
(void) _Ignored;
}
template <class _Tpl, class _Fx>
void _For_each_tuple_element(_Tpl&& _Tuple, _Fx _Func) { // call _Func() on each element in _Tuple
_For_each_tuple_element_impl(
_STD forward<_Tpl>(_Tuple), _Func, make_index_sequence<tuple_size_v<remove_reference_t<_Tpl>>>());
}
// TEMPLATE CONSTRUCTOR pair::pair(tuple, tuple, sequence, sequence)
template <class _Ty1, class _Ty2>
template <class _Tuple1, class _Tuple2, size_t... _Indexes1, size_t... _Indexes2>

Просмотреть файл

@ -46,6 +46,19 @@ using namespace std;
int main() {} // COMPILE-ONLY
template <typename Tpl, typename Fx, size_t... Indices>
void for_each_tuple_element_impl(Tpl&& Tuple, Fx Func, index_sequence<Indices...>) {
// call Func() on the Indices elements of Tuple
int ignored[] = {(static_cast<void>(Func(get<Indices>(forward<Tpl>(Tuple)))), 0)...};
(void) ignored;
}
template <typename Tpl, typename Fx>
void for_each_tuple_element(Tpl&& Tuple, Fx Func) { // call Func() on each element in Tuple
for_each_tuple_element_impl(
forward<Tpl>(Tuple), Func, make_index_sequence<tuple_size_v<remove_reference_t<Tpl>>>{});
}
// Use this type to ensure function templates are used instead
// of regular member functions.
template <typename T>
@ -121,7 +134,7 @@ template <typename T>
void construct_from_iterators_test(T value) {
auto containers = get_all_iterator_types_for(value);
_For_each_tuple_element(containers, [](auto c) {
for_each_tuple_element(containers, [](auto c) {
T another(begin(c), end(c));
T another2(begin(c), end(c));
});
@ -131,7 +144,7 @@ template <typename T>
void construct_tree_containers_from_iterators_test(T value) {
auto containers = get_all_iterator_types_for(value);
_For_each_tuple_element(containers, [&](auto c) {
for_each_tuple_element(containers, [&](auto c) {
T another(begin(c), end(c));
T another2(begin(c), end(c), value.key_comp());
T another3(begin(c), end(c), value.key_comp(), value.get_allocator());
@ -142,7 +155,7 @@ template <typename T>
void construct_hash_containers_from_iterators_test(T value) {
auto containers = get_all_iterator_types_for(value);
_For_each_tuple_element(containers, [&](auto c) {
for_each_tuple_element(containers, [&](auto c) {
T another(begin(c), end(c));
T another2(begin(c), end(c), value.bucket_count());
T another3(begin(c), end(c), value.bucket_count(), value.hash_function());