mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
This adds the `__swift::__runtime` inline namespace to the LLVMSupport interfaces. This avoids an ODR violation when LLVM and Swift are in the same address space. It also will aid in the process of pruning the LLVMSupport library by ensuring that accidental leakage of the llvm namespace does not allow us to remove symbols which we rely on.
67 lines
2.3 KiB
C++
67 lines
2.3 KiB
C++
//===- iterator_range.h - A range adaptor for iterators ---------*- C++ -*-===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
/// \file
|
|
/// This provides a very simple, boring adaptor for a begin and end iterator
|
|
/// into a range type. This should be used to build range views that work well
|
|
/// with range based for loops and range based constructors.
|
|
///
|
|
/// Note that code here follows more standards-based coding conventions as it
|
|
/// is mirroring proposed interfaces for standardization.
|
|
///
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_ADT_ITERATOR_RANGE_H
|
|
#define LLVM_ADT_ITERATOR_RANGE_H
|
|
|
|
#include <iterator>
|
|
#include <utility>
|
|
|
|
inline namespace __swift { inline namespace __runtime {
|
|
namespace llvm {
|
|
|
|
/// A range adaptor for a pair of iterators.
|
|
///
|
|
/// This just wraps two iterators into a range-compatible interface. Nothing
|
|
/// fancy at all.
|
|
template <typename IteratorT>
|
|
class iterator_range {
|
|
IteratorT begin_iterator, end_iterator;
|
|
|
|
public:
|
|
//TODO: Add SFINAE to test that the Container's iterators match the range's
|
|
// iterators.
|
|
template <typename Container>
|
|
iterator_range(Container &&c)
|
|
//TODO: Consider ADL/non-member begin/end calls.
|
|
: begin_iterator(c.begin()), end_iterator(c.end()) {}
|
|
iterator_range(IteratorT begin_iterator, IteratorT end_iterator)
|
|
: begin_iterator(std::move(begin_iterator)),
|
|
end_iterator(std::move(end_iterator)) {}
|
|
|
|
IteratorT begin() const { return begin_iterator; }
|
|
IteratorT end() const { return end_iterator; }
|
|
bool empty() const { return begin_iterator == end_iterator; }
|
|
};
|
|
|
|
/// Convenience function for iterating over sub-ranges.
|
|
///
|
|
/// This provides a bit of syntactic sugar to make using sub-ranges
|
|
/// in for loops a bit easier. Analogous to std::make_pair().
|
|
template <class T> iterator_range<T> make_range(T x, T y) {
|
|
return iterator_range<T>(std::move(x), std::move(y));
|
|
}
|
|
|
|
template <typename T> iterator_range<T> make_range(std::pair<T, T> p) {
|
|
return iterator_range<T>(std::move(p.first), std::move(p.second));
|
|
}
|
|
|
|
}
|
|
}} // namespace swift::runtime
|
|
|
|
#endif
|