69 void CSG_Index::_On_Construction(
void)
106 for(
sLong a=0, b=m_nValues-1; a<b; a++, b--)
108 sLong i = m_Index[a]; m_Index[a] = m_Index[b]; m_Index[b] = i;
133 if( _Set_Array(nValues) && _Set_Index(&Compare) )
148 Create(nValues, pCompare);
154 if( pCompare && _Set_Array(nValues) && _Set_Index(pCompare) )
173 int *m_Values;
bool m_Ascending;
175 CSG_Index_Compare_Int(
int *Values,
bool Ascending) : m_Values(Values), m_Ascending(Ascending) {}
179 sLong a = m_Ascending ? _a : _b;
180 sLong b = m_Ascending ? _b : _a;
182 return( m_Values[a] - m_Values[b] );
191 Create(nValues, Values, bAscending);
197 CSG_Index_Compare_Int Compare(Values, bAscending);
199 return(
Create(nValues, &Compare) );
211 double *m_Values;
bool m_Ascending;
213 CSG_Index_Compare_Double(
double *Values,
bool Ascending) : m_Values(Values), m_Ascending(Ascending) {}
217 sLong a = m_Ascending ? _a : _b;
218 sLong b = m_Ascending ? _b : _a;
220 double d = m_Values[a] - m_Values[b];
222 return( d < 0. ? -1 : d > 0. ? 1 : 0 );
231 Create(nValues, Values, bAscending);
237 CSG_Index_Compare_Double Compare(Values, bAscending);
239 return(
Create(nValues, &Compare) );
253 CSG_Index_Compare_Function(
TSG_PFNC_Compare Function) : m_Function(Function) {}
257 return( m_Function(_a, _b) );
266 Create(nValues, fCompare);
272 CSG_Index_Compare_Function Compare(fCompare);
274 return(
Create(nValues, &Compare) );
285 m_bProgress = bProgress;
291 if( Position < 0 || Position >= m_nValues - 1 )
293 return( _Set_Array(m_nValues + 1) );
296 if( _Set_Array(m_nValues + 1) )
298 for(
sLong i=Position, Value=m_nValues-1; i<m_nValues; i++)
300 sLong v = m_Index[i]; m_Index[i] = Value; Value = v;
312 if( Position < 0 || Position >= m_nValues - 1 )
314 return( _Set_Array(m_nValues - 1) );
317 sLong Value = m_Index[Position];
319 for(
sLong i=Position; i<m_nValues-1; i++)
321 m_Index[i] = m_Index[i + 1];
324 m_Index[m_nValues - 1] = Value;
326 return( _Set_Array(m_nValues - 1) );
330 bool CSG_Index::_Set_Array(
sLong nValues)
337 if( nValues == m_nValues )
342 if( m_nValues > nValues )
344 for(
sLong i=0, j=nValues; i<nValues && j<m_nValues; i++)
346 if( m_Index[i] >= nValues )
348 while( m_Index[j] >= nValues )
358 sLong c = m_Index[i]; m_Index[i] = m_Index[j]; m_Index[j] = c;
372 if( m_nValues < nValues )
374 for(
sLong i=m_nValues; i<nValues; i++)
391 #define SG_INDEX_SWAP(a, b) {itemp=(a);(a)=(b);(b)=itemp;}
394 bool CSG_Index::_Set_Index(CSG_Index_Compare *pCompare)
408 sLong nProcessed = 0;
424 for(j=l+1; j<=ir; j++)
426 a = indxt = m_Index[j];
428 for(i=j-1; i>=0; i--)
430 if( pCompare->Compare(m_Index[i], a) <= 0 )
435 m_Index[i + 1] = m_Index[i];
438 m_Index[i + 1] = indxt;
446 ir = istack[jstack--];
447 l = istack[jstack--];
454 if( pCompare->Compare(m_Index[l + 1], m_Index[ir]) > 0 )
457 if( pCompare->Compare(m_Index[l ], m_Index[ir]) > 0 )
460 if( pCompare->Compare(m_Index[l + 1], m_Index[l ]) > 0 )
465 a = indxt = m_Index[l];
469 do i++;
while( pCompare->Compare(m_Index[i], a) < 0 );
470 do j--;
while( pCompare->Compare(m_Index[j], a) > 0 );
480 m_Index[l] = m_Index[j];
484 if( jstack >= nstack )
489 if( ir - i + 1 >= j - l )
491 istack[jstack ] = ir;
492 istack[jstack - 1] = i;
497 istack[jstack ] = j - 1;
498 istack[jstack - 1] = l;
522 m_pLeaf[0] = m_pLeaf[1] = NULL;
577 size_t CSG_PriorityQueue::_Insert_Position(CSG_PriorityQueueItem *pItem)
585 size_t b = m_nItems - 1;
587 if( pItem->Compare(m_Items[a]) < 0 )
592 if( pItem->Compare(m_Items[b]) > 0 )
597 for(
size_t d=(b-a)/2 ; d>0; d/=2)
601 if( pItem->Compare(m_Items[i]) > 0 )
603 a = a < i ? i : a + 1;
607 b = b > i ? i : b - 1;
611 for(
size_t i=a; i<=b; i++)
613 if( pItem->Compare(m_Items[i]) < 0 )
625 if( m_Items && m_nItems < m_maxSize )
627 size_t Position = _Insert_Position(pItem);
629 memmove(m_Items + Position + 1, m_Items + Position,
sizeof(
CSG_PriorityQueueItem *) * (m_nItems - Position));
631 m_Items[Position] = pItem;
637 size_t Divide = m_maxSize / 2;
642 m_pLeaf[0]->m_nItems = Divide;
643 m_pLeaf[1]->m_nItems = m_maxSize - Divide;
646 memcpy(m_pLeaf[1]->m_Items, m_Items + m_pLeaf[0]->m_nItems, m_pLeaf[1]->m_nItems *
sizeof(
CSG_PriorityQueueItem *));
654 m_pLeaf[1]->
Add(pItem);
658 m_pLeaf[0]->
Add(pItem);
679 return( m_Items[m_nItems] );
684 if( m_pLeaf[1]->m_nItems == 0 )
691 m_Items = pLeaf->m_Items;
692 m_pLeaf[0] = pLeaf->m_pLeaf[0];
693 m_pLeaf[1] = pLeaf->m_pLeaf[1];
695 pLeaf->m_Items = NULL;
696 pLeaf->m_pLeaf[0] = NULL;
697 pLeaf->m_pLeaf[1] = NULL;