diff --git a/src/Context.cpp b/src/Context.cpp index a1edaa1b4..24b68c4cb 100644 --- a/src/Context.cpp +++ b/src/Context.cpp @@ -1328,6 +1328,12 @@ void Context::debugTiming (const std::string& details, const Timer& timer) debug (out.str ()); } +//////////////////////////////////////////////////////////////////////////////// +CurrentTask Context::withCurrentTask (const Task *task) +{ + return CurrentTask(this, task); +} + //////////////////////////////////////////////////////////////////////////////// // This capability is to answer the question of 'what did I just do to generate // this output?'. @@ -1429,6 +1435,19 @@ void Context::debug (const std::string& input) debugMessages.push_back (input); } +//////////////////////////////////////////////////////////////////////////////// +CurrentTask::CurrentTask (Context *context, const Task *task) + : context {context}, previous {context->currentTask} +{ + context->currentTask = task; +} + +//////////////////////////////////////////////////////////////////////////////// +CurrentTask::~CurrentTask () +{ + context->currentTask = previous; +} + //////////////////////////////////////////////////////////////////////////////// // vim ts=2:sw=2 diff --git a/src/Context.h b/src/Context.h index 31a071d52..06159f6d2 100644 --- a/src/Context.h +++ b/src/Context.h @@ -38,6 +38,8 @@ #include #include +class CurrentTask; + class Context { public: @@ -73,6 +75,9 @@ public: void decomposeSortField (const std::string&, std::string&, bool&, bool&); void debugTiming (const std::string&, const Timer&); + CurrentTask withCurrentTask (const Task *); + friend class CurrentTask; + private: void staticInitialization (); void createDefaultConfig (); @@ -115,6 +120,24 @@ public: long time_sort_us {0}; long time_render_us {0}; long time_hooks_us {0}; + + // the current task for DOM references, or NULL if there is no task + const Task * currentTask {NULL}; +}; + +//////////////////////////////////////////////////////////////////////////////// +// CurrentTask resets Context::currentTask to NULL on destruction; this ensures +// that this context value is not a dangling pointer. +class CurrentTask { + ~CurrentTask(); + +private: + CurrentTask(Context *context, const Task *previous); + + Context *context; + const Task *previous; + + friend class Context; }; #endif