mirror of
https://github.com/beefytech/Beef.git
synced 2025-06-21 09:27:59 +02:00
Enhanced ranges
This commit is contained in:
parent
eec2cb5e6c
commit
27fd5552cc
12 changed files with 365 additions and 22 deletions
|
@ -8,6 +8,24 @@ namespace System
|
|||
|
||||
}
|
||||
|
||||
enum Index
|
||||
{
|
||||
case FromFront(int offset);
|
||||
case FromEnd(int offset);
|
||||
|
||||
public override void ToString(String strBuffer)
|
||||
{
|
||||
switch (this)
|
||||
{
|
||||
case .FromFront(let offset):
|
||||
offset.ToString(strBuffer);
|
||||
case .FromEnd(let offset):
|
||||
strBuffer.Append('^');
|
||||
offset.ToString(strBuffer);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
struct Range : RangeExpression, IEnumerable<int>
|
||||
{
|
||||
protected int mStart;
|
||||
|
@ -110,6 +128,11 @@ namespace System
|
|||
mEnd = 0;
|
||||
}
|
||||
|
||||
public static operator IndexRange(Range list)
|
||||
{
|
||||
return .(.FromFront(list.mStart), .FromFront(list.mEnd), false);
|
||||
}
|
||||
|
||||
[Inline]
|
||||
public Enumerator GetEnumerator()
|
||||
{
|
||||
|
@ -192,6 +215,103 @@ namespace System
|
|||
}
|
||||
}
|
||||
|
||||
struct IndexRange : RangeExpression
|
||||
{
|
||||
public Index mStart;
|
||||
public Index mEnd;
|
||||
public bool mIsClosed;
|
||||
|
||||
public this()
|
||||
{
|
||||
this = default;
|
||||
}
|
||||
|
||||
[Inline]
|
||||
public this(Index start, Index end, bool isClosed=true)
|
||||
{
|
||||
mStart = start;
|
||||
mEnd = end;
|
||||
mIsClosed = isClosed;
|
||||
}
|
||||
|
||||
[Inline]
|
||||
public this(int start, Index end, bool isClosed=true)
|
||||
{
|
||||
mStart = .FromFront(start);
|
||||
mEnd = end;
|
||||
mIsClosed = isClosed;
|
||||
}
|
||||
|
||||
[Inline]
|
||||
public this(Index start, int end, bool isClosed=true)
|
||||
{
|
||||
mStart = start;
|
||||
mEnd = .FromFront(end);
|
||||
mIsClosed = isClosed;
|
||||
}
|
||||
|
||||
[Inline]
|
||||
public this(int start, int end, bool isClosed=true)
|
||||
{
|
||||
mStart = .FromFront(start);
|
||||
mEnd = .FromFront(end);
|
||||
mIsClosed = isClosed;
|
||||
}
|
||||
|
||||
public Index Start
|
||||
{
|
||||
[Inline]
|
||||
get
|
||||
{
|
||||
return mStart;
|
||||
}
|
||||
|
||||
[Inline]
|
||||
set mut
|
||||
{
|
||||
mStart = value;
|
||||
}
|
||||
}
|
||||
|
||||
public Index End
|
||||
{
|
||||
[Inline]
|
||||
get
|
||||
{
|
||||
return mEnd;
|
||||
}
|
||||
|
||||
set mut
|
||||
{
|
||||
mEnd = value;
|
||||
}
|
||||
}
|
||||
|
||||
public bool IsClosed
|
||||
{
|
||||
[Inline]
|
||||
get
|
||||
{
|
||||
return mIsClosed;
|
||||
}
|
||||
|
||||
set mut
|
||||
{
|
||||
mIsClosed = value;
|
||||
}
|
||||
}
|
||||
|
||||
public override void ToString(String strBuffer)
|
||||
{
|
||||
mStart.ToString(strBuffer);
|
||||
if (mIsClosed)
|
||||
strBuffer.Append("...");
|
||||
else
|
||||
strBuffer.Append("..<");
|
||||
mEnd.ToString(strBuffer);
|
||||
}
|
||||
}
|
||||
|
||||
struct ClosedRange : RangeExpression, IEnumerable<int>
|
||||
{
|
||||
protected int mStart;
|
||||
|
@ -294,6 +414,11 @@ namespace System
|
|||
mEnd = 0;
|
||||
}
|
||||
|
||||
public static operator IndexRange(ClosedRange list)
|
||||
{
|
||||
return .(.FromFront(list.mStart), .FromFront(list.mEnd), true);
|
||||
}
|
||||
|
||||
[Inline]
|
||||
public Enumerator GetEnumerator()
|
||||
{
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue