General Purpose library for Freestanding C++ and POSIX systems
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
 
 

71 linhas
1.1 KiB

#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;
}
};
}