Skip to content
Snippets Groups Projects
Commit 703a75b6 authored by namark's avatar namark
Browse files

indirect_range_referring_reference_t

basically ranges::ref_view
parent dd6ea902
No related branches found
No related tags found
No related merge requests found
......@@ -136,31 +136,66 @@ namespace simple::support
return {begin, static_cast<std::string_view::size_type>(end - begin)};
}
// NOTE: maybe put in algorithm range wrappers instead?
// NOTE: maybe put in algorithm/range_wrappers.hpp instead?
// problem is, range_wrappers.hpp doesn't depend on anything,
// so need to also parameterize the range type, to keep it that way.
// A bit unrealisitic to expect ::limit() or arithmetic for generic range.
// but really don't want the includeee
template <typename Container,
typename = std::enable_if_t<is_range_v<Container>>>
class index_range
class indirect_range_referring_reference_t
{
public:
using container_type = Container;
using size_type = typename container_type::size_type;
using iterator = typename container_type::iterator;
using const_iterator = typename container_type::const_iterator;
explicit indirect_range_referring_reference_t
(Container& container) : container(&container)
{}
auto begin() const
{
using std::begin;
return begin(*container);
}
auto end() const
{
using std::end;
return end(*container);
}
private:
Container* container;
};
template <typename Container,
typename = std::enable_if_t<is_range_v<Container>>>
class index_range
{
public:
using container_type = Container;
using size_type = typename container_type::size_type;
explicit index_range
(
Container & container,
Container container,
range<size_type> index = range<size_type>::limit()
) :
container(&container),
container(std::move(container)),
index(index)
{}
explicit index_range
(
Container & container,
Container container,
range<typename Container::const_iterator> iterator_range
) :
container(&container),
index(iterator_range - container.begin())
container(std::move(container)),
// TODO: ADL the begin
index(iterator_range - this->container.begin())
{}
auto begin() const
......@@ -169,7 +204,7 @@ namespace simple::support
{ return iter_at(index.upper()); }
private:
Container* container;
Container container;
range<size_type> index;
auto iter_at(size_type index) const
......@@ -178,8 +213,8 @@ namespace simple::support
using std::end;
using std::clamp;
auto begin_ = begin(*container);
auto end_ = end(*container);
auto begin_ = begin(container);
auto end_ = end(container);
// TODO: use container.size() if available
return begin_ + clamp(index, size_type{},
......
......@@ -115,7 +115,10 @@ void RangeReference()
assert( std::equal(begin(temporef), end(temporef),
begin(prefix), end(prefix)) );
index_range permaref(stuff, {begin(stuff), end(stuff)});
index_range permaref{
indirect_range_referring_reference_t(stuff),
{begin(stuff), end(stuff)}
};
assert( std::equal(begin(permaref), end(permaref),
begin(prefix), end(prefix)) );
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment