On Monday, 9 May 2022 at 03:25:26 UTC, Salih Dincer wrote:
>Bu da bilinçli değinmedim sorun. Malum türlerin sınırı olduğu için ve Inclusive Range hepsini kapsamaya çalıştığından patlıyor.
Özetle, bu kadarı kadı kızında da olur diyorum ve bu iki durum ile yaşayabilirim. :)
Düzeltiyorum: Yaşayamayız...
Çünkü sonsuz döngü kabul edilemez! İşe gelmek için yolda yürüyorken biraz düşündüm ve az önce mola arasında uyguladım. Aslında çözüm çok basitmiş. Sadece 2. bir bool Empty ve önceki değeri sorgulama mekanizması, kontrolü bir üst seviyeye çıkarıyor:
struct InclusiveRange(T) {
T front, last, step, term;
bool Empty;
//...
bool empty()
{
if(Empty) {
Empty = false;
return true;
} else return front > last;
}
void popFront()
{
const prev = front;
front += step;
if(front < prev) Empty = true;
}
}
unittest
{
assert(inclusiveRange!byte(0, 127).last == byte.max);
assert(inclusiveRange!ubyte(0, 255).last == ubyte.max);
assert(inclusiveRange!int(0, 2147483647).last == int.max);
assert(inclusiveRange!uint(0, 4294967295).last == uint.max);
}
Pahalı bir çözüm mü?