12 template<
class T,
class traits_t>
13 generic_span<T, traits_t>::iterator::iterator(generator_type generator, size_type nIndex) noexcept
14 : m_Generator(std::move(generator))
19 template<
class T,
class traits_t>
20 typename generic_span<T, traits_t>::iterator::reference generic_span<T, traits_t>::iterator::operator*() const noexcept
22 auto generator = m_Generator;
26 template<
class T,
class traits_t>
27 typename generic_span<T, traits_t>::iterator::pointer generic_span<T, traits_t>::iterator::operator->() const noexcept
29 auto generator = m_Generator;
33 template<
class T,
class traits_t>
34 typename generic_span<T, traits_t>::iterator& generic_span<T, traits_t>::iterator::operator++() noexcept
38 if (operator->() !=
nullptr)
44 m_Generator =
nullptr;
45 m_nIndex = std::numeric_limits<size_type>::max();
51 template<
class T,
class traits_t>
52 typename generic_span<T, traits_t>::iterator generic_span<T, traits_t>::iterator::operator++(
int) noexcept
59 template<
class T,
class traits_t>
60 bool generic_span<T, traits_t>::iterator::operator!=(
const iterator& r)
const noexcept
62 return !operator==(r);
65 template<
class T,
class traits_t>
66 bool generic_span<T, traits_t>::iterator::operator==(
const iterator& r)
const noexcept
68 return m_nIndex == r.m_nIndex;
71 template<
class T,
class traits_t>
72 generic_span<T, traits_t>::iterator::operator
void*()
const noexcept
74 auto generator = m_Generator;
78 template<
class T,
class traits_t>
79 generic_span<T, traits_t>::iterator::operator bool() const noexcept
81 return m_Generator && m_nIndex != std::numeric_limits<size_type>::max();
84 template<
class T,
class traits_t>
85 template<
class container_t>
88 container.begin() != container.end()
89 ? [it = container.begin(), &container]()
mutable
93 if (it != container.end())
95 pRet = it.operator->();
101 : generator_type(
nullptr))
105 template<
class T,
class traits_t>
106 template<
class container_t>
108 container_t& container,
109 function_type<reference(qualified_type<container_value<container_t>>&)> valueAdapter) noexcept
110 : m_InitialGenerator(create_initial_generator(container, std::move(valueAdapter)))
114 template<
class T,
class traits_t>
115 template<
class container_t>
122 template<
class T,
class traits_t>
125 return !
static_cast<bool>(m_InitialGenerator);
128 template<
class T,
class traits_t>
131 return m_InitialGenerator ?
iterator(m_InitialGenerator, 0) : end();
134 template<
class T,
class traits_t>
137 return iterator(
nullptr, std::numeric_limits<typename iterator::size_type>::max());
140 template<
class T,
class traits_t>
146 template<
class T,
class traits_t>
152 template<
class T,
class traits_t>
153 template<
class container_t,
class adapter_t>
155 container_t&& container,
156 adapter_t adapter) noexcept
158 return container.
begin() != container.end()
159 ? [it = container.begin(), _adapter = std::move(adapter), &container]()
mutable
163 if (it != container.end())
165 pRet = &_adapter(*it);
171 : generator_type(
nullptr);
Same as std::span, but may be used with any container with forward iterators.
generic_span & operator=(container_t &container) noexcept
operator=
iterator cend() const noexcept
Return const iterator to end.
iterator end() const noexcept
Return iterator to end.
iterator begin() const noexcept
Return iterator to beginning.
bool empty() const noexcept
Check if span is empty.
iterator cbegin() const noexcept
Return const iterator to beginning.