summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 52046a2)
raw | patch | inline | side by side (parent: 52046a2)
author | Ketmar Dark <ketmar@ketmar.no-ip.org> | |
Sun, 21 Jan 2018 10:09:02 +0000 (12:09 +0200) | ||
committer | Ketmar Dark <ketmar@ketmar.no-ip.org> | |
Sun, 21 Jan 2018 10:10:01 +0000 (12:10 +0200) |
src/game/g_grid.pas | patch | blob | history | |
src/shared/mempool.pas | patch | blob | history |
diff --git a/src/game/g_grid.pas b/src/game/g_grid.pas
index ce31c63546d60a9721f1211e1cdeab54ad4fa950..79b87ca5a4bf44859ea618fac4f29aec91fd1e28 100644 (file)
--- a/src/game/g_grid.pas
+++ b/src/game/g_grid.pas
cc: PGridCell;
presobj: PGridCellCoord;
begin
- result := CellCoordIter.Create(true);
+ result := CellCoordIter.Create(framePool);
if (body < 0) or (body > High(mProxies)) then begin result.finishIt(); exit; end;
for g := 0 to High(mGrid) do
begin
cc: PGridCell;
presobj: PITP;
begin
- result := Iter.Create(true);
+ result := Iter.Create(framePool);
Dec(x, mMinX);
Dec(y, mMinY);
if (x < 0) or (y < 0) or (x >= mWidth*mTileSize) or (y > mHeight*mTileSize) then begin result.finishIt(); exit; end;
ptag: Integer;
presobj: PITP;
begin
- result := Iter.Create(true);
+ result := Iter.Create(framePool);
tagmask := tagmask and TagFullMask;
if (tagmask = 0) then begin result.finishIt(); exit; end;
exit;
end;
- result := Iter.Create(true);
+ result := Iter.Create(framePool);
if (w < 1) or (h < 1) then begin result.finishIt(); exit; end;
tagmask := tagmask and TagFullMask;
presobj: PITP;
begin
log := false;
- result := Iter.Create(true);
+ result := Iter.Create(framePool);
tagmask := tagmask and TagFullMask;
if (tagmask = 0) then begin result.finishIt(); exit; end;
diff --git a/src/shared/mempool.pas b/src/shared/mempool.pas
index ae67f034aa60363ec362b8b04b4a6ff2f4bec870..ff1e65692a976ee0c7f1b73d71cbffb4e05fced4 100644 (file)
--- a/src/shared/mempool.pas
+++ b/src/shared/mempool.pas
type
PoolMark = Integer;
+ PPoolMarkRelease = ^TPoolMarkRelease;
TPoolMarkRelease = record
private
mMemory: Pointer;
type MyType = specialize PoolIter<T>;
private
+ mPool: PPoolMarkRelease;
mMark: PoolMark;
mCount: Integer;
mCurrent: Integer;
mFinished: Boolean;
public
- constructor Create (dummy: Boolean); // idiotic FPC doesn't support arg-less ctors for rectord
- procedure startIt (); inline; // automatically called by ctor; does NO checks!
+ constructor Create (var apool: TPoolMarkRelease); // idiotic FPC doesn't support arg-less ctors for rectord
procedure finishIt (); inline; // sets count
procedure rewind (); inline;
// ////////////////////////////////////////////////////////////////////////// //
-constructor PoolIter.Create (dummy: Boolean);
+constructor PoolIter.Create (var apool: TPoolMarkRelease);
begin
- startIt();
-end;
-
-
-procedure PoolIter.startIt (); inline; // automatically called by ctor; does NO checks!
-begin
- mMark := framePool.mark();
+ mPool := @apool;
+ mMark := mPool^.mark();
mCount := 0;
mCurrent := -1;
mFinished := false;
procedure PoolIter.finishIt (); inline; // sets count
begin
if (mFinished) then raise Exception.Create('double fatality');
- if (mMark = -1) then raise Exception.Create('void fatality');
+ if (mPool = nil) then raise Exception.Create('void fatality');
mFinished := true;
- mCount := Integer(PtrUInt(framePool.curPtr)-PtrUInt(framePool.getPtr(mMark))) div Integer(sizeof(T));
+ mCount := Integer(PtrUInt(mPool^.curPtr)-PtrUInt(mPool^.getPtr(mMark))) div Integer(sizeof(T));
if (mCount < 0) then raise Exception.Create('wutafu?');
end;
procedure PoolIter.rewind (); inline;
begin
- if (mMark = -1) then raise Exception.Create('void rewind');
+ if (mPool = nil) then raise Exception.Create('void rewind');
mCurrent := -1;
end;
procedure PoolIter.release (); inline; // reset pool
begin
- if (mMark = -1) then raise Exception.Create('double release');
- framePool.release(mMark);
- mMark := -1;
+ if (mPool = nil) then raise Exception.Create('double release');
+ mPool^.release(mMark);
+ mPool := nil;
mCount := 0;
mCurrent := -1;
mFinished := false;
function PoolIter.moveNext (): Boolean; inline;
begin
- if (mMark = -1) then raise Exception.Create('void moveNext()');
+ if (mPool = nil) then raise Exception.Create('void moveNext()');
if (not mFinished) then raise Exception.Create('moveNext() on unfinished');
Inc(mCurrent);
result := (mCurrent < mCount);
function PoolIter.getCurrent (): Ptr; inline;
begin
+ if (mPool = nil) then raise Exception.Create('getCurrent() on nothing');
if (mCurrent < 0) or (mCurrent >= mCount) then raise Exception.Create('getCurrent() range error');
- result := Ptr(framePool.getPtr(mMark+mCurrent*Integer(sizeof(T))));
+ result := Ptr(mPool^.getPtr(mMark+mCurrent*Integer(sizeof(T))));
end;
function PoolIter.first (): Ptr; inline;
begin
- if (mMark = -1) then raise Exception.Create('void moveNext()');
+ if (mPool = nil) then raise Exception.Create('void moveNext()');
if (not mFinished) then raise Exception.Create('moveNext() on unfinished');
- result := Ptr(framePool.getPtr(mMark));
+ result := Ptr(mPool^.getPtr(mMark));
end;