Skip to content

Commit 4d58533

Browse files
committed
Upgrades 2.0.4, IDisposable, ICloneable
1 parent b0de51d commit 4d58533

File tree

11 files changed

+245
-148
lines changed

11 files changed

+245
-148
lines changed

FriendlyCSharp.Databases/BTreeN/FcsBTreeN.cs

Lines changed: 118 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@
88

99
namespace FriendlyCSharp.Databases
1010
{
11-
public partial class FcsBTreeN<TKey, TValue> : IEnumerable<KeyValuePair<TKey, TValue>?>
12-
where TKey : struct, IComparable<TKey>
11+
public partial class FcsBTreeN<TKey, TValue> : IEnumerable<KeyValuePair<TKey, TValue>>
12+
where TKey : IComparable<TKey>
1313
{
1414
protected const int _btnDefaultBTreeN = 32;
1515
protected object _btnLockAdd;
@@ -57,14 +57,13 @@ public void Dispose()
5757
}
5858
}
5959
//////////////////////////
60-
protected internal class KeyValuePage
60+
protected internal class KeyValuePage : IDisposable, ICloneable
6161
{
6262
public UInt32 flags;
6363
public bool bUpdatedValue;
6464
public int iDataCount;
6565
public KeyValue[] aData;
6666
public KeyValuePage[] kvPageNextRight;
67-
public long[] aPos;
6867
//////////////////////////
6968
public KeyValuePage(int iPageN, bool bPageNext)
7069
{
@@ -76,7 +75,47 @@ public KeyValuePage(int iPageN, bool bPageNext)
7675
kvPageNextRight = new KeyValuePage[(iPageN * 2) + 1];
7776
else
7877
kvPageNextRight = null;
79-
aPos = null;
78+
}
79+
#region IDisposable
80+
private bool disposedValue = false;
81+
public void Dispose(bool disposing)
82+
{
83+
if (!disposedValue)
84+
{
85+
if (disposing)
86+
{
87+
if (kvPageNextRight != null)
88+
{
89+
for (int oo = 0; oo <= iDataCount; oo++)
90+
{
91+
if (kvPageNextRight[oo] != null)
92+
kvPageNextRight[oo].Dispose(true);
93+
}
94+
}
95+
aData = null;
96+
kvPageNextRight = null;
97+
}
98+
disposedValue = true;
99+
}
100+
}
101+
void IDisposable.Dispose()
102+
{
103+
Dispose(true);
104+
}
105+
#endregion
106+
public object Clone()
107+
{
108+
KeyValuePage root = (KeyValuePage)this.MemberwiseClone();
109+
aData = (KeyValue[])aData.Clone();
110+
if (kvPageNextRight != null)
111+
{
112+
for (int ii = 0; ii <= root.iDataCount; ii++)
113+
{
114+
if (root.kvPageNextRight[ii] != null)
115+
root.kvPageNextRight[ii] = (KeyValuePage)root.kvPageNextRight[ii].Clone();
116+
}
117+
}
118+
return root;
80119
}
81120
}
82121
//////////////////////////
@@ -326,7 +365,7 @@ protected virtual bool BtnUpdates(TKey keyAdd, TValue valueAdd, ref TValue value
326365
return bNullResult;
327366
}
328367
//////////////////////////
329-
public bool? BtnAdd(TKey key, ref TValue value, object objUpdates)
368+
public bool? BtnAddNoLock(TKey key, ref TValue value, object objUpdates)
330369
{
331370
KeyValue keyValue;
332371
keyValue.key = key;
@@ -335,25 +374,22 @@ protected virtual bool BtnUpdates(TKey keyAdd, TValue valueAdd, ref TValue value
335374
KeyValuePage kvPageDown = _btnRoot;
336375
bool? bNullResult = null;
337376

338-
lock (_btnLockAdd)
377+
bNullResult = _BtnAdd(ref keyValue, out KeyValue kvUp, ref kvPageDown, ref bUp, objUpdates);
378+
if (bUp)
339379
{
340-
bNullResult = _BtnAdd(ref keyValue, out KeyValue kvUp, ref kvPageDown, ref bUp, objUpdates);
341-
if (bUp)
380+
bUp = false;
381+
_btnVersion++;
382+
_btnVersionPage++;
383+
_btnUpdatedRoot = true;
384+
KeyValuePage QQ = new KeyValuePage(BtnBTreeN, kvPageDown != null) { iDataCount = 1 };
385+
QQ.aData[1] = kvUp;
386+
if (QQ.kvPageNextRight != null)
342387
{
343-
bUp = false;
344-
_btnVersion++;
345-
_btnVersionPage++;
346-
_btnUpdatedRoot = true;
347-
KeyValuePage QQ = new KeyValuePage(BtnBTreeN, kvPageDown != null) { iDataCount = 1 };
348-
QQ.aData[1] = kvUp;
349-
if (QQ.kvPageNextRight != null)
350-
{
351-
QQ.kvPageNextRight[0] = _btnRoot;
352-
QQ.kvPageNextRight[1] = kvPageDown;
353-
}
354-
_btnRoot = QQ;
355-
bNullResult = new bool?(true);
388+
QQ.kvPageNextRight[0] = _btnRoot;
389+
QQ.kvPageNextRight[1] = kvPageDown;
356390
}
391+
_btnRoot = QQ;
392+
bNullResult = new bool?(true);
357393
}
358394
if (bNullResult != null)
359395
value = keyValue.value;
@@ -363,19 +399,51 @@ protected virtual bool BtnUpdates(TKey keyAdd, TValue valueAdd, ref TValue value
363399
return bNullResult; // add = true, update = false, else null;
364400
}
365401
//////////////////////////
402+
public bool? BtnAddNoLock(TKey key, TValue value, object objUpdates)
403+
{
404+
return BtnAddNoLock(key, ref value, objUpdates);
405+
}
406+
//////////////////////////
407+
public bool? BtnAddNoLock(TKey key, ref TValue value)
408+
{
409+
return BtnAddNoLock(key, ref value, null);
410+
}
411+
//////////////////////////
412+
public bool? BtnAddNoLock(TKey key, TValue value)
413+
{
414+
return BtnAddNoLock(key, ref value, null);
415+
}
416+
//////////////////////////
417+
public bool? BtnAdd(TKey key, ref TValue value, object objUpdates)
418+
{
419+
lock (_btnLockAdd)
420+
{
421+
return BtnAddNoLock(key, ref value, objUpdates);
422+
}
423+
}
424+
//////////////////////////
366425
public bool? BtnAdd(TKey key, TValue value, object objUpdates)
367426
{
368-
return BtnAdd(key, ref value, objUpdates);
427+
lock (_btnLockAdd)
428+
{
429+
return BtnAddNoLock(key, ref value, objUpdates);
430+
}
369431
}
370432
//////////////////////////
371433
public bool? BtnAdd(TKey key, ref TValue value)
372434
{
373-
return BtnAdd(key, ref value, null);
435+
lock (_btnLockAdd)
436+
{
437+
return BtnAddNoLock(key, ref value, null);
438+
}
374439
}
375440
//////////////////////////
376441
public bool? BtnAdd(TKey key, TValue value)
377442
{
378-
return BtnAdd(key, ref value, null);
443+
lock (_btnLockAdd)
444+
{
445+
return BtnAddNoLock(key, ref value, null);
446+
}
379447
}
380448
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
381449
///////////////////////////////////////////// BtnDeleteAll //////////////////////////////////////////////////////
@@ -1196,20 +1264,20 @@ public virtual uint BtnUsedKeys()
11961264
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
11971265
public FcsBTreeN<TKey, TValue>.BtnEnumerator GetEnumeratorEx(bool reverse)
11981266
{
1199-
return new BtnEnumerator(this, null, null, reverse, -2);
1267+
return new BtnEnumerator(this, default(TKey), default(TKey), reverse, -2);
12001268
}
12011269
//////////////////////////
12021270
public FcsBTreeN<TKey, TValue>.BtnEnumerator GetEnumeratorEx(bool reverse, int maxCount)
12031271
{
1204-
return new BtnEnumerator(this, null, null, reverse, maxCount);
1272+
return new BtnEnumerator(this, default(TKey), default(TKey), reverse, maxCount);
12051273
}
12061274
//////////////////////////
1207-
public FcsBTreeN<TKey, TValue>.BtnEnumerator GetEnumeratorEx(TKey? keyLo, TKey? keyHi, bool reverse)
1275+
public FcsBTreeN<TKey, TValue>.BtnEnumerator GetEnumeratorEx(TKey keyLo, TKey keyHi, bool reverse)
12081276
{
12091277
return new BtnEnumerator(this, keyLo, keyHi, reverse, -3);
12101278
}
12111279
//////////////////////////
1212-
public FcsBTreeN<TKey, TValue>.BtnEnumerator GetEnumeratorEx(TKey? keyLo, TKey? keyHi, bool reverse, int maxCount)
1280+
public FcsBTreeN<TKey, TValue>.BtnEnumerator GetEnumeratorEx(TKey keyLo, TKey keyHi, bool reverse, int maxCount)
12131281
{
12141282
return new BtnEnumerator(this, keyLo, keyHi, reverse, maxCount);
12151283
}
@@ -1220,17 +1288,17 @@ IEnumerator IEnumerable.GetEnumerator()
12201288
return GetEnumerator();
12211289
}
12221290
//////////////////////////
1223-
public IEnumerator<KeyValuePair<TKey, TValue>?> GetEnumerator()
1291+
public IEnumerator<KeyValuePair<TKey, TValue>> GetEnumerator()
12241292
{
1225-
return new BtnEnumerator(this, null, null, false, -1);
1293+
return new BtnEnumerator(this, default(TKey), default(TKey), false, -1);
12261294
}
12271295
//////////////////////////
1228-
public class BtnEnumerator : IEnumerator<KeyValuePair<TKey, TValue>?>
1296+
public class BtnEnumerator : IEnumerator<KeyValuePair<TKey, TValue>>
12291297
{
12301298
// constructor
12311299
private FcsBTreeN<TKey, TValue> _btn = null;
1232-
private TKey? _keyLo;
1233-
private TKey? _keyHi;
1300+
private TKey _keyLo;
1301+
private TKey _keyHi;
12341302
private int _maxCount;
12351303
private bool _reverse;
12361304
// locals
@@ -1240,7 +1308,7 @@ public class BtnEnumerator : IEnumerator<KeyValuePair<TKey, TValue>?>
12401308
private TValue _value;
12411309
private int _count;
12421310
//////////////////////////
1243-
public BtnEnumerator(FcsBTreeN<TKey, TValue> btn, TKey? keyLo, TKey? keyHi, bool reverse, int maxCount)
1311+
public BtnEnumerator(FcsBTreeN<TKey, TValue> btn, TKey keyLo, TKey keyHi, bool reverse, int maxCount)
12441312
{
12451313
_btn = btn ?? throw new NullReferenceException();
12461314
_keyLo = keyLo;
@@ -1260,25 +1328,25 @@ public bool MoveNext()
12601328
if (_bFirst)
12611329
{
12621330
_bFirst = false;
1263-
if ((_keyLo == null) && (!_reverse))
1331+
if ((_keyLo.Equals(default(TKey))) && (!_reverse))
12641332
_bOK = (_btn.BtnFirst(out _key, out _value) != null);
1265-
else if ((_keyHi == null) && (_reverse))
1333+
else if ((_keyHi.Equals(default(TKey))) && (_reverse))
12661334
_bOK = (_btn.BtnLast(out _key, out _value) != null);
12671335
else
12681336
{
12691337
if (_reverse)
12701338
{
1271-
_key = _keyHi.GetValueOrDefault();
1339+
_key = _keyHi;
12721340
_bOK = (_btn.BtnSearchPrev(ref _key, out _value) != null);
1273-
if ((_keyLo != null) && (_bOK))
1274-
_bOK = (_key.CompareTo(_keyLo.GetValueOrDefault()) >= 0);
1341+
if ((!_keyLo.Equals(default(TKey))) && (_bOK))
1342+
_bOK = (_key.CompareTo(_keyLo) >= 0);
12751343
}
12761344
else
12771345
{
1278-
_key = _keyLo.GetValueOrDefault();
1346+
_key = _keyLo;
12791347
_bOK = (_btn.BtnSearch(ref _key, out _value) != null);
1280-
if ((_keyHi != null) && (_bOK))
1281-
_bOK = (_key.CompareTo(_keyHi.GetValueOrDefault()) <= 0);
1348+
if ((!_keyHi.Equals(default(TKey))) && (_bOK))
1349+
_bOK = (_key.CompareTo(_keyHi) <= 0);
12821350
}
12831351
}
12841352
}
@@ -1287,25 +1355,25 @@ public bool MoveNext()
12871355
if (_reverse)
12881356
{
12891357
_bOK = (_btn.BtnPrev(ref _key, out _value) != null);
1290-
if ((_keyLo != null) && (_bOK))
1291-
_bOK = (_key.CompareTo(_keyLo.GetValueOrDefault()) >= 0);
1358+
if ((!_keyLo.Equals(default(TKey))) && (_bOK))
1359+
_bOK = (_key.CompareTo(_keyLo) >= 0);
12921360
}
12931361
else
12941362
{
12951363
_bOK = (_btn.BtnNext(ref _key, out _value) != null);
1296-
if ((_keyHi != null) && (_bOK))
1297-
_bOK = (_key.CompareTo(_keyHi.GetValueOrDefault()) <= 0);
1364+
if ((!_keyHi.Equals(default(TKey))) && (_bOK))
1365+
_bOK = (_key.CompareTo(_keyHi) <= 0);
12981366
}
12991367
}
13001368
return _bOK;
13011369
}
13021370
//////////////////////////
1303-
public KeyValuePair<TKey, TValue>? Current
1371+
public KeyValuePair<TKey, TValue> Current
13041372
{
13051373
get
13061374
{
13071375
if (!_bOK)
1308-
return null;
1376+
return new KeyValuePair<TKey, TValue>(default(TKey), default(TValue));
13091377
return new KeyValuePair<TKey, TValue>(_key, _value);
13101378
}
13111379
}
@@ -1315,7 +1383,7 @@ object IEnumerator.Current
13151383
get
13161384
{
13171385
if (!_bOK)
1318-
return null;
1386+
return new KeyValuePair<TKey, TValue>(default(TKey), default(TValue));
13191387
return new KeyValuePair<TKey, TValue>(_key, _value);
13201388
}
13211389
}

0 commit comments

Comments
 (0)