iterator_range.h 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. #pragma once
  2. #include <util/system/yassert.h>
  3. #include <iterator>
  4. #include <utility>
  5. template <typename TBegin, typename TEnd = TBegin>
  6. struct TIteratorRange {
  7. using TElement = std::remove_reference_t<decltype(*std::declval<TBegin>())>;
  8. TIteratorRange(TBegin begin, TEnd end)
  9. : Begin_(begin)
  10. , End_(end)
  11. {
  12. }
  13. TIteratorRange()
  14. : TIteratorRange(TBegin{}, TEnd{})
  15. {
  16. }
  17. TBegin begin() const {
  18. return Begin_;
  19. }
  20. TEnd end() const {
  21. return End_;
  22. }
  23. bool empty() const {
  24. // because range based for requires exactly '!='
  25. return !(Begin_ != End_);
  26. }
  27. private:
  28. TBegin Begin_;
  29. TEnd End_;
  30. };
  31. template <class TIterator>
  32. class TIteratorRange<TIterator, TIterator> {
  33. public:
  34. using iterator = TIterator;
  35. using const_iterator = TIterator;
  36. using value_type = typename std::iterator_traits<iterator>::value_type;
  37. using reference = typename std::iterator_traits<iterator>::reference;
  38. using const_reference = typename std::iterator_traits<const_iterator>::reference;
  39. using difference_type = typename std::iterator_traits<iterator>::difference_type;
  40. using size_type = std::size_t;
  41. TIteratorRange()
  42. : Begin_()
  43. , End_()
  44. {
  45. }
  46. TIteratorRange(TIterator begin, TIterator end)
  47. : Begin_(begin)
  48. , End_(end)
  49. {
  50. }
  51. TIterator begin() const {
  52. return Begin_;
  53. }
  54. TIterator end() const {
  55. return End_;
  56. }
  57. Y_PURE_FUNCTION bool empty() const {
  58. return Begin_ == End_;
  59. }
  60. size_type size() const {
  61. return End_ - Begin_;
  62. }
  63. reference operator[](size_t at) const {
  64. Y_ASSERT(at < size());
  65. return *(Begin_ + at);
  66. }
  67. private:
  68. TIterator Begin_;
  69. TIterator End_;
  70. };
  71. template <class TIterator>
  72. TIteratorRange<TIterator> MakeIteratorRange(TIterator begin, TIterator end) {
  73. return TIteratorRange<TIterator>(begin, end);
  74. }
  75. template <class TIterator>
  76. TIteratorRange<TIterator> MakeIteratorRange(const std::pair<TIterator, TIterator>& range) {
  77. return TIteratorRange<TIterator>(range.first, range.second);
  78. }
  79. template <class TBegin, class TEnd>
  80. TIteratorRange<TBegin, TEnd> MakeIteratorRange(TBegin begin, TEnd end) {
  81. return {begin, end};
  82. }