3 #include "g_cont_cont_with_positioner.h"
4 #include "g_cont_vect.h"
5 #include "g_cont_common.h"
6 #include "g_cont_AllocationPolicyAbstract.h"
7 #include "g_cont_private_data_pointer.h"
13 #define LIST_ALLOCATOR_DELTA 16
20 #if G_AUTOPTION_ON_GCC
21 # pragma GCC diagnostic push
22 # pragma GCC diagnostic ignored "-Wstrict-aliasing"
27 bool isNodeBusy ()
const{
return currentIndex >= 0; }
31 currentIndex = G_CONT_INDEX_NOT_VALID;
38 void setContent (
const T& aT )
40 new(
reinterpret_cast<T*
>(mContBuff))T(aT);
43 operator const T& ( )
const {
return *(
reinterpret_cast<const T*
>( mContBuff )); }
44 operator T& ( ) {
return *(
reinterpret_cast<T*
>( mContBuff )); }
46 void callContentDestructor ( )
48 (
reinterpret_cast<T*
> ( mContBuff ) )->~T();
52 static list_node* nodeFromItem (
const T* aItemIndex )
55 static size_t delta = ( size_t )&dummy->mContBuff;
57 return (
list_node* ) ( (
char* )aItemIndex - delta );
72 (
reinterpret_cast<ListNodesDataPointer_t*
> (mData) )->~ListNodesDataPointer_t();
76 operator Node_t* ( ) {
return (Node_t*)*(
reinterpret_cast<ListNodesDataPointer_t*
> (mData) ); }
78 operator ListNodesDataPointer_t& ( ) {
return *(
reinterpret_cast<ListNodesDataPointer_t*
> (mData) ); }
79 operator const ListNodesDataPointer_t& ( ) {
return *(
reinterpret_cast<const ListNodesDataPointer_t*
> (mData) ); }
83 ListNodesDataPointer_t* data_p =
new (mData) ListNodesDataPointer_t ( aAllocPolicyP );
85 data_p->allocate ( mSize = size , 0 );
88 for (
size_t i = 0 ; i < mSize ; i++ )
90 ( *data_p )[i].currentIndex = G_CONT_INDEX_NOT_VALID;
94 size_t getSize ( )
const {
return mSize; }
102 char mContBuff[
sizeof(T)];
108 #define G_LOCAL_CLASS "list_node_page<T>::"
113 G_EXC_SET_CONTEXT ( G_LOCAL_CLASS
"::list_node_page(const list_node_page& o )" );
125 Node_t* getFreeNodeAndMakeBusy ( )
129 int pos_out = firstFreeNodeIndex;
132 if ( ++numUsed < nodes.getSize() )
134 for (
int i = firstFreeNodeIndex + 1 ; i < (int)nodes.getSize() ; i++ )
136 if ( !nodes[i].isNodeBusy ( ) )
138 firstFreeNodeIndex = i;
143 G_EXC_FATAL_ACTION (
"First free index is not reassigned but the page is not full!" );
147 firstFreeNodeIndex = (int)nodes.getSize();
151 nodes[pos_out].currentIndex = pos_out;
153 return (Node_t*)nodes + pos_out;
157 void releaseNodeUpdateFirstFree (
int aPageNodeIndex )
159 nodes[aPageNodeIndex].release ( );
162 if ( aPageNodeIndex < firstFreeNodeIndex )
164 firstFreeNodeIndex = aPageNodeIndex;
169 int firstFreeNodeIndex;
171 int isPageBusy ()
const {
return numUsed >= nodes.getSize(); }
183 int aListPageRightBits ,
184 int aPageVectorAllocDelta ) :
185 firstIndex (G_CONT_INDEX_NOT_VALID),
186 lastIndex(G_CONT_INDEX_NOT_VALID),
188 allocPolicyP(aAllocPolicyP),
189 pages(aAllocPolicyP,aPageVectorAllocDelta),
190 pageRightbits(aListPageRightBits),
206 pages.eraseMemory ( );
210 Node_t* getNodeFromIndex (
int aItemIndex )
212 return &( pages[ (aItemIndex>>pageRightbits) ].nodes[aItemIndex & ( (1<<pageRightbits) - 1 ) ] );
215 T
remove (
int aItemIndex )
217 Node_t* n_p = getNodeFromIndex ( aItemIndex );
220 if ( aItemIndex == firstIndex )
222 firstIndex = n_p->nextIndex;
224 else if ( n_p->prevIndex != G_CONT_INDEX_NOT_VALID )
226 Node_t* prev_node_p = getNodeFromIndex ( n_p->prevIndex );
227 prev_node_p->nextIndex = n_p->nextIndex;
230 if ( aItemIndex == lastIndex )
232 lastIndex = n_p->prevIndex;
234 else if ( n_p->nextIndex != G_CONT_INDEX_NOT_VALID )
236 Node_t* next_node_p = getNodeFromIndex ( n_p->nextIndex );
237 next_node_p->prevIndex = n_p->prevIndex;
242 int current_page = ( aItemIndex >> pageRightbits );
244 pages[current_page].releaseNodeUpdateFirstFree ( aItemIndex & ( (1<<pageRightbits) - 1 ) );
246 if ( current_page < firstFreePage )
248 firstFreePage = current_page;
251 n_p->callContentDestructor ( );
258 int node_index = firstIndex;
260 while ( node_index != G_CONT_INDEX_NOT_VALID )
262 pages[node_index >> pageRightbits].releaseNodeUpdateFirstFree ( node_index & ( ( 1<<pageRightbits) - 1 ) );
264 Node_t* node_p = getNodeFromIndex ( node_index );
266 node_p->callContentDestructor ( );
268 node_index = node_p->nextIndex;
272 firstIndex = G_CONT_INDEX_NOT_VALID;
273 lastIndex = G_CONT_INDEX_NOT_VALID;
276 firstFreePage = ( pages.getSize( )>0 )?0:-1;
281 size_t new_size = pages.getSize()+1;
283 pages.reSize(new_size);
284 pages[(int)new_size-1].nodes.instanciate ( allocPolicyP , 1<<pageRightbits );
287 Node_t* getAndSetFreeNode (
const T& aT )
289 if ( firstFreePage == -1 )
295 int current_page_index = firstFreePage;
299 Node_t* n_p = free_page_ref.getFreeNodeAndMakeBusy ( );
302 if ( free_page_ref.isPageBusy( ) )
305 for ( ++firstFreePage ; firstFreePage < (int)pages.getSize() ; firstFreePage++ )
307 if ( !pages[firstFreePage].isPageBusy ( ) )
313 if ( firstFreePage >= (
int)pages.getSize ( ) )
319 n_p->currentIndex |= ( current_page_index << pageRightbits );
320 n_p->setContent ( aT );
325 void pushNewNodeAfter (
const T& aItem ,
int aIndexBeingPrevious )
327 Node_t* new_node_p = getAndSetFreeNode ( aItem );
328 Node_t* prev_node_p = NULL;
329 Node_t* next_node_p = NULL;
331 if ( aIndexBeingPrevious == G_CONT_INDEX_NOT_VALID )
334 if ( lastIndex != G_CONT_INDEX_NOT_VALID )
336 prev_node_p = getNodeFromIndex ( lastIndex );
341 prev_node_p = getNodeFromIndex ( aIndexBeingPrevious );
343 if ( prev_node_p->nextIndex != G_CONT_INDEX_NOT_VALID )
345 next_node_p = getNodeFromIndex ( prev_node_p->nextIndex );
349 mPushNewNodeAfter ( new_node_p , prev_node_p , next_node_p );
352 void pushNewNodeBefore (
const T& aItem ,
int aIndexBeingNext )
354 Node_t* new_node_p = getAndSetFreeNode ( aItem );
356 Node_t* prev_node_p = NULL;
357 Node_t* next_node_p = NULL;
359 if ( aIndexBeingNext == G_CONT_INDEX_NOT_VALID )
362 if ( firstIndex != G_CONT_INDEX_NOT_VALID )
364 next_node_p = getNodeFromIndex ( firstIndex );
369 next_node_p = getNodeFromIndex ( aIndexBeingNext );
371 if ( next_node_p->prevIndex != G_CONT_INDEX_NOT_VALID )
373 prev_node_p = getNodeFromIndex ( next_node_p->prevIndex );
377 mPushNewNodeAfter ( new_node_p , prev_node_p , next_node_p );
382 void mPushNewNodeAfter ( Node_t* new_node_p , Node_t* before_node_p , Node_t* after_node_p )
386 after_node_p->prevIndex = new_node_p->currentIndex;
387 new_node_p->nextIndex = after_node_p->currentIndex;
392 new_node_p->nextIndex = G_CONT_INDEX_NOT_VALID;
393 lastIndex = new_node_p->currentIndex;
398 before_node_p->nextIndex = new_node_p->currentIndex;
399 new_node_p->prevIndex = before_node_p->currentIndex;
404 new_node_p->prevIndex = G_CONT_INDEX_NOT_VALID;
405 firstIndex = new_node_p->currentIndex;
418 virtual int first ( )
const {
return lstContentP->firstIndex; }
419 virtual int last ( )
const {
return lstContentP->lastIndex; }
421 virtual bool isIn (
int aItemIndex )
const
423 return aItemIndex != G_CONT_INDEX_NOT_VALID;
426 virtual void forward (
int& aItemIndex , GUint32_t inc )
const
428 if ( aItemIndex != G_CONT_INDEX_NOT_VALID )
430 list_node<T>* n_p = lstContentP->getNodeFromIndex(aItemIndex);
432 for(GUint32_t i = 0 ; i < inc ; i++)
434 if ( n_p->nextIndex != G_CONT_INDEX_NOT_VALID )
436 n_p = lstContentP->getNodeFromIndex(n_p->nextIndex);
440 aItemIndex = G_CONT_INDEX_NOT_VALID;
445 aItemIndex = n_p->currentIndex;
449 virtual T* getPtr (
int aItemIndex )
const
453 return &((T&)*lstContentP->getNodeFromIndex(aItemIndex));
456 virtual void backward (
int& aItemIndex , GUint32_t dec )
const
458 if ( aItemIndex != G_CONT_INDEX_NOT_VALID )
460 list_node<T>* n_p = lstContentP->getNodeFromIndex(aItemIndex);
462 for(GUint32_t i = 0 ; i < dec ; i++)
464 if ( n_p->prevIndex != G_CONT_INDEX_NOT_VALID )
466 n_p = lstContentP->getNodeFromIndex(n_p->prevIndex);
470 aItemIndex = G_CONT_INDEX_NOT_VALID;
475 aItemIndex = n_p->currentIndex;
482 #if G_AUTOPTION_ON_GCC
483 # pragma GCC diagnostic pop
Definition: g_cont_lst_priv.h:106
Definition: g_cont_lst_priv.h:412
Definition: g_cont_AllocationPolicyAbstract.h:16
Definition: g.mthread.ThreadSimpleEvent.h:5
Definition: g_cont_lst_priv.h:25
Definition: g_cont_lst_priv.h:175
#define G_EXC_FATAL_ACTION(amessage)
Executes the fatal action ( showing an exception box, then quitting application ) specifying a fatal ...
Definition: g_exception_macros.h:64
Definition: g_cont_common.h:52
Definition: g_cont_lst_priv.h:60
Definition: g_cont_vect.h:15
Definition: g_cont_private_data_pointer.h:14
#define G_EXC_SET_CONTEXT(acontextstr)
Sets the method context.
Definition: g_exception_macros.h:52