#pragma once
|
|
#include "gp/algorithm/tmp_manip.hpp"
|
|
|
|
namespace gp{
|
|
template<typename T>
|
|
concept IsSubstractible = requires(T a, T b)
|
|
{
|
|
{a - b} -> std::integral;
|
|
};
|
|
|
|
template<typename it, bool Enable = IsSubstractible<it>>
|
|
class nameless_range;
|
|
|
|
template<typename it>
|
|
class nameless_range<it, false>
|
|
{
|
|
it _begin;
|
|
it _end;
|
|
|
|
friend nameless_range<it, true>;
|
|
public:
|
|
using associated_iterator = it;
|
|
|
|
nameless_range() = delete;
|
|
|
|
template<typename othT>
|
|
nameless_range(const nameless_range<othT>& oth)
|
|
: _begin(oth._begin)
|
|
, _end(oth._end)
|
|
{}
|
|
|
|
nameless_range(it sbegin, it send)
|
|
: _begin(sbegin)
|
|
, _end(send)
|
|
{}
|
|
|
|
it begin() const
|
|
{
|
|
return _begin;
|
|
}
|
|
|
|
it end() const
|
|
{
|
|
return _end;
|
|
}
|
|
};
|
|
|
|
template<typename it>
|
|
class nameless_range<it, true> : public nameless_range<it, false>
|
|
{
|
|
public:
|
|
nameless_range() = delete;
|
|
|
|
template<typename othT>
|
|
nameless_range(const nameless_range<othT>& oth)
|
|
: nameless_range<it,false>(oth._begin,oth._end)
|
|
{}
|
|
|
|
nameless_range(it sbegin, it send)
|
|
: nameless_range<it,false>(sbegin, send)
|
|
{}
|
|
|
|
std::size_t size() const
|
|
{
|
|
return this->_end-this->_begin;
|
|
}
|
|
};
|
|
}
|
|
|
|
|
|
|