4#ifndef _Stroika_Foundation_Traversal_RandomAccessIterator_h_
5#define _Stroika_Foundation_Traversal_RandomAccessIterator_h_ 1
7#include "Stroika/Foundation/StroikaPreComp.h"
11#include "Stroika/Foundation/Common/Common.h"
23namespace Stroika::Foundation::Traversal {
27 template <
typename T,
typename BASE_STD_ITERATOR = DefaultIteratorTraits<random_access_iterator_tag, T>>
28 class RandomAccessIterator :
public BidirectionalIterator<T, BASE_STD_ITERATOR> {
30 using inherited = Iterator<T, BASE_STD_ITERATOR>;
36 using RandomAccessIteratorRepSharedPtr = unique_ptr<IRep>;
48 explicit RandomAccessIterator (
const RandomAccessIteratorRepSharedPtr& rep);
49 RandomAccessIterator (
const RandomAccessIterator& from);
50 RandomAccessIterator () =
delete;
56 enum ConstructionFlagForceAtEnd_ {
61 RandomAccessIterator (ConstructionFlagForceAtEnd_);
67 nonvirtual RandomAccessIterator& operator= (
const RandomAccessIterator& rhs);
77 static RandomAccessIterator GetEmptyIterator ();
94 nonvirtual IRep& GetRep ();
95 nonvirtual
const IRep& GetRep ()
const;
101 template <
typename T,
typename BASE_STD_ITERATOR>
102 class RandomAccessIterator<T, BASE_STD_ITERATOR>::IRep :
public BidirectionalIterator<T, BASE_STD_ITERATOR>::IRep {
109 virtual ptrdiff_t Difference (
const IRep* rhs)
const = 0;