88
99namespace 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