227 if ( self.walkNextThreadIdx > 0 ) {
228 --self.walkNextThreadIdx;
229 return (*self.walkThreadValues)[size_t(self.walkNextThreadIdx)];
233 self.actScope= Scope::Method;
236 if ( self.walkLocalObject !=
nullptr )
237 return self.walkLocalObject;
242 case Scope::Filename:
245 if( self.lazyLanguageNode )
246 self.initCursor(
false );
248 while( self.actStringTreeNode.IsValid() ) {
249 T actValue= *self.actStringTreeNode;
250 self.actStringTreeNode.GoToParent();
251 if( actValue !=
nullptr )
255 self.actScope= Scope::ThreadOuter;
256 self.walkNextThreadIdx= -2;
260 case Scope::ThreadOuter:
263 if ( self.walkNextThreadIdx == -2 ) {
264 #if !ALIB_SINGLE_THREADED
265 if ( self.threadStore.Size() != 0 ) {
267 if ( it != self.threadStore.end() ) {
268 self.walkThreadValues= &it.Mapped();
269 self.walkNextThreadIdx= int( self.walkThreadValues->size() );
275 if ( self.walkNextThreadIdx > 0 ) {
276 --self.walkNextThreadIdx;
277 return (*self.walkThreadValues)[size_t(self.walkNextThreadIdx)];
281 self.actScope= Scope::Global;
288 return self.globalStore;
292 default:
ALIB_ERROR(
"ALOX",
"Illegal switch state.") break;
301 int cmd , T value ) {
306 if( self.actScope == Scope::Global ) {
307 oldValue= self.globalStore;
308 if ( cmd == CMD_INSERT ) self.globalStore= value;
309 else if ( cmd == CMD_REMOVE ) self.globalStore= nullptr;
316 if( self.actScope == Scope::ThreadOuter
317 || self.actScope == Scope::ThreadInner )
320 bool isInner= self.actScope == Scope::ThreadInner;
323 if ( cmd != CMD_INSERT && self.threadStore.Size() == 0 )
327 if ( self.actThreadID == threads::UNDEFINED )
328 self.actThreadID= self.scopeInfo.GetThreadID();
332 StdVectorMA<T>* values;
334 values= &self.threadStore.EmplaceIfNotExistent(
335 typename ScopeStore<T, true>::ThreadMapKey(isInner, self.actThreadID),
336 self.threadStore.GetAllocator() ).first.Mapped();
340 if ( cmd == CMD_GET )
341 return ( values->size() > 0) ? (*values)[ values->size() -1 ] :
nullptr;
344 if ( cmd == CMD_INSERT ) {
345 values->emplace_back( value );
350 if ( cmd == CMD_REMOVE && values->size() > 0) {
352 if ( value == nullptr ) {
353 oldValue= values->back();
359 for (
auto remIt= values->begin() ; remIt != values->end(); ++remIt )
360 if ( (*remIt) == value ) {
363 values->erase( remIt );
373 if ( cmd == CMD_INSERT && value ==
nullptr )
376 if ( self.lazyLanguageNode
377 || ( self.actStringTreeNode.IsInvalid() && cmd == CMD_INSERT ) )
378 self.initCursor(
true );
380 oldValue= *self.actStringTreeNode;
381 if ( cmd == CMD_INSERT ) *self.actStringTreeNode= value;
382 else if ( cmd == CMD_REMOVE ) *self.actStringTreeNode=
nullptr;
395template<
typename T,
bool TStackedThreadValues>
403 #if defined( _WIN32 )
414 if ( remainingPath.IsNotEmpty() )