236 if ( cmd == CMD_INSERT && value ==
nullptr )
239 if ( self.lazyLanguageNode
240 || ( self.actStringTreeNode.IsInvalid() && cmd == CMD_INSERT ) )
241 self.initCursor(
true );
243 oldValue= *self.actStringTreeNode;
244 if ( cmd == CMD_INSERT ) *self.actStringTreeNode= value;
245 else if ( cmd == CMD_REMOVE ) *self.actStringTreeNode=
nullptr;
251 while ( self.walking )
switch( self.actScope ) {
252 case Scope::ThreadInner:
255 if ( self.walkNextThreadIdx == -2 ) {
256 self.walkNextThreadIdx= -1;
257 #if !ALIB_SINGLE_THREADED
258 if ( self.threadStore.Size() != 0 ) {
260 if ( it != self.threadStore.end() ) {
261 self.walkThreadValues= &it.Mapped();
262 self.walkNextThreadIdx= int( self.walkThreadValues->size() );
268 if ( self.walkNextThreadIdx > 0 ) {
269 --self.walkNextThreadIdx;
270 return (*self.walkThreadValues)[size_t(self.walkNextThreadIdx)];
274 self.actScope= Scope::Method;
277 if ( self.walkLocalObject !=
nullptr )
278 return self.walkLocalObject;
283 case Scope::Filename:
286 if( self.lazyLanguageNode )
287 self.initCursor(
false );
289 while( self.actStringTreeNode.IsValid() ) {
290 T actValue= *self.actStringTreeNode;
291 self.actStringTreeNode.GoToParent();
292 if( actValue !=
nullptr )
296 self.actScope= Scope::ThreadOuter;
297 self.walkNextThreadIdx= -2;
301 case Scope::ThreadOuter:
304 if ( self.walkNextThreadIdx == -2 ) {
305 #if !ALIB_SINGLE_THREADED
306 if ( self.threadStore.Size() != 0 ) {
308 if ( it != self.threadStore.end() ) {
309 self.walkThreadValues= &it.Mapped();
310 self.walkNextThreadIdx= int( self.walkThreadValues->size() );
316 if ( self.walkNextThreadIdx > 0 ) {
317 --self.walkNextThreadIdx;
318 return (*self.walkThreadValues)[size_t(self.walkNextThreadIdx)];
322 self.actScope= Scope::Global;
329 return self.globalStore;
333 default:
ALIB_ERROR(
"ALOX",
"Illegal switch state.") break;
342 int cmd , T value ) {
347 if( self.actScope == Scope::Global ) {
348 oldValue= self.globalStore;
349 if ( cmd == CMD_INSERT ) self.globalStore= value;
350 else if ( cmd == CMD_REMOVE ) self.globalStore= nullptr;
357 if( self.actScope == Scope::ThreadOuter
358 || self.actScope == Scope::ThreadInner )
361 bool isInner= self.actScope == Scope::ThreadInner;
364 if ( cmd != CMD_INSERT && self.threadStore.Size() == 0 )
368 if ( self.actThreadID == threads::UNDEFINED )
369 self.actThreadID= self.scopeInfo.GetThreadID();
373 StdVectorMA<T>* values;
375 values= &self.threadStore.EmplaceIfNotExistent(
376 typename ScopeStore<T, true>::ThreadMapKey(isInner, self.actThreadID),
377 self.threadStore.GetAllocator() ).first.Mapped();
381 if ( cmd == CMD_GET )
382 return ( values->size() > 0) ? (*values)[ values->size() -1 ] :
nullptr;
385 if ( cmd == CMD_INSERT ) {
386 values->emplace_back( value );
391 if ( cmd == CMD_REMOVE && values->size() > 0) {
393 if ( value == nullptr ) {
394 oldValue= values->back();
400 for (
auto rem= values->begin() ; rem != values->end(); ++rem )
401 if ( (*rem) == value ) {
404 values->erase( rem );
414 if ( cmd == CMD_INSERT && value ==
nullptr )
417 if ( self.lazyLanguageNode
418 || ( self.actStringTreeNode.IsInvalid() && cmd == CMD_INSERT ) )
419 self.initCursor(
true );
421 oldValue= *self.actStringTreeNode;
422 if ( cmd == CMD_INSERT ) *self.actStringTreeNode= value;
423 else if ( cmd == CMD_REMOVE ) *self.actStringTreeNode=
nullptr;
436template<
typename T,
bool TStackedThreadValues>
444 #if defined( _WIN32 )
455 if ( remainingPath.IsNotEmpty() )