77 lines · c
1//===-- Lower/OpenMP/ClauseFinder.h --------------------------*- C++ -*-===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8//9// Coding style: https://mlir.llvm.org/getting_started/DeveloperGuide/10//11//===----------------------------------------------------------------------===//12#ifndef FORTRAN_LOWER_CLAUSEFINDER_H13#define FORTRAN_LOWER_CLAUSEFINDER_H14 15#include "flang/Lower/OpenMP/Clauses.h"16 17namespace Fortran {18namespace lower {19namespace omp {20 21class ClauseFinder {22 using ClauseIterator = List<Clause>::const_iterator;23 24public:25 /// Utility to find a clause within a range in the clause list.26 template <typename T>27 static ClauseIterator findClause(ClauseIterator begin, ClauseIterator end) {28 for (ClauseIterator it = begin; it != end; ++it) {29 if (std::get_if<T>(&it->u))30 return it;31 }32 33 return end;34 }35 36 /// Return the first instance of the given clause found in the clause list or37 /// `nullptr` if not present. If more than one instance is expected, use38 /// `findRepeatableClause` instead.39 template <typename T>40 static const T *findUniqueClause(const List<Clause> &clauses,41 const parser::CharBlock **source = nullptr) {42 ClauseIterator it = findClause<T>(clauses.begin(), clauses.end());43 if (it != clauses.end()) {44 if (source)45 *source = &it->source;46 return &std::get<T>(it->u);47 }48 return nullptr;49 }50 51 /// Call `callbackFn` for each occurrence of the given clause. Return `true`52 /// if at least one instance was found.53 template <typename T>54 static bool findRepeatableClause(55 const List<Clause> &clauses,56 std::function<void(const T &, const parser::CharBlock &source)>57 callbackFn) {58 bool found = false;59 ClauseIterator nextIt, endIt = clauses.end();60 for (ClauseIterator it = clauses.begin(); it != endIt; it = nextIt) {61 nextIt = findClause<T>(it, endIt);62 63 if (nextIt != endIt) {64 callbackFn(std::get<T>(nextIt->u), nextIt->source);65 found = true;66 ++nextIt;67 }68 }69 return found;70 }71};72} // namespace omp73} // namespace lower74} // namespace Fortran75 76#endif // FORTRAN_LOWER_CLAUSEFINDER_H77