1c9080145SNikolas Klauser //===----------------------------------------------------------------------===// 2c9080145SNikolas Klauser // 3c9080145SNikolas Klauser // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4c9080145SNikolas Klauser // See https://llvm.org/LICENSE.txt for license information. 5c9080145SNikolas Klauser // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6c9080145SNikolas Klauser // 7c9080145SNikolas Klauser //===----------------------------------------------------------------------===// 8c9080145SNikolas Klauser 9c9080145SNikolas Klauser #ifndef _LIBCPP___SEGMENTED_ITERATOR_H 10c9080145SNikolas Klauser #define _LIBCPP___SEGMENTED_ITERATOR_H 11c9080145SNikolas Klauser 12c9080145SNikolas Klauser // Segmented iterators are iterators over (not necessarily contiguous) sub-ranges. 13c9080145SNikolas Klauser // 14c9080145SNikolas Klauser // For example, std::deque stores its data into multiple blocks of contiguous memory, 15c9080145SNikolas Klauser // which are not stored contiguously themselves. The concept of segmented iterators 16c9080145SNikolas Klauser // allows algorithms to operate over these multi-level iterators natively, opening the 17c9080145SNikolas Klauser // door to various optimizations. See http://lafstern.org/matt/segmented.pdf for details. 18c9080145SNikolas Klauser // 19c9080145SNikolas Klauser // If __segmented_iterator_traits can be instantiated, the following functions and associated types must be provided: 20c9080145SNikolas Klauser // - Traits::__local_iterator 21c9080145SNikolas Klauser // The type of iterators used to iterate inside a segment. 22c9080145SNikolas Klauser // 23c9080145SNikolas Klauser // - Traits::__segment_iterator 24c9080145SNikolas Klauser // The type of iterators used to iterate over segments. 25c9080145SNikolas Klauser // Segment iterators can be forward iterators or bidirectional iterators, depending on the 26c9080145SNikolas Klauser // underlying data structure. 27c9080145SNikolas Klauser // 28c9080145SNikolas Klauser // - static __segment_iterator Traits::__segment(It __it) 29c9080145SNikolas Klauser // Returns an iterator to the segment that the provided iterator is in. 30c9080145SNikolas Klauser // 31c9080145SNikolas Klauser // - static __local_iterator Traits::__local(It __it) 32c9080145SNikolas Klauser // Returns the local iterator pointing to the element that the provided iterator points to. 33c9080145SNikolas Klauser // 34c9080145SNikolas Klauser // - static __local_iterator Traits::__begin(__segment_iterator __it) 35c9080145SNikolas Klauser // Returns the local iterator to the beginning of the segment that the provided iterator is pointing into. 36c9080145SNikolas Klauser // 37c9080145SNikolas Klauser // - static __local_iterator Traits::__end(__segment_iterator __it) 38c9080145SNikolas Klauser // Returns the one-past-the-end local iterator to the segment that the provided iterator is pointing into. 39c9080145SNikolas Klauser // 40c9080145SNikolas Klauser // - static It Traits::__compose(__segment_iterator, __local_iterator) 41c9080145SNikolas Klauser // Returns the iterator composed of the segment iterator and local iterator. 42c9080145SNikolas Klauser 43c9080145SNikolas Klauser #include <__config> 44e99c4906SNikolas Klauser #include <__cstddef/size_t.h> 45c9080145SNikolas Klauser #include <__type_traits/integral_constant.h> 46c9080145SNikolas Klauser 47c9080145SNikolas Klauser #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 48c9080145SNikolas Klauser # pragma GCC system_header 49c9080145SNikolas Klauser #endif 50c9080145SNikolas Klauser 51c9080145SNikolas Klauser _LIBCPP_BEGIN_NAMESPACE_STD 52c9080145SNikolas Klauser 53c9080145SNikolas Klauser template <class _Iterator> 54c9080145SNikolas Klauser struct __segmented_iterator_traits; 55c9080145SNikolas Klauser /* exposition-only: 56c9080145SNikolas Klauser { 57c9080145SNikolas Klauser using __segment_iterator = ...; 58c9080145SNikolas Klauser using __local_iterator = ...; 59c9080145SNikolas Klauser 60c9080145SNikolas Klauser static __segment_iterator __segment(_Iterator); 61c9080145SNikolas Klauser static __local_iterator __local(_Iterator); 62c9080145SNikolas Klauser static __local_iterator __begin(__segment_iterator); 63c9080145SNikolas Klauser static __local_iterator __end(__segment_iterator); 64c9080145SNikolas Klauser static _Iterator __compose(__segment_iterator, __local_iterator); 65c9080145SNikolas Klauser }; 66c9080145SNikolas Klauser */ 67c9080145SNikolas Klauser 68c9080145SNikolas Klauser template <class _Tp, size_t = 0> 69c9080145SNikolas Klauser struct __has_specialization : false_type {}; 70c9080145SNikolas Klauser 71c9080145SNikolas Klauser template <class _Tp> 72c9080145SNikolas Klauser struct __has_specialization<_Tp, sizeof(_Tp) * 0> : true_type {}; 73c9080145SNikolas Klauser 74c9080145SNikolas Klauser template <class _Iterator> 75*f6958523SNikolas Klauser using __is_segmented_iterator _LIBCPP_NODEBUG = __has_specialization<__segmented_iterator_traits<_Iterator> >; 76c9080145SNikolas Klauser 77c9080145SNikolas Klauser _LIBCPP_END_NAMESPACE_STD 78c9080145SNikolas Klauser 79c9080145SNikolas Klauser #endif // _LIBCPP___SEGMENTED_ITERATOR_H 80