#include struct CoverageNode { CoverageNode(const int in_line) : line(in_line) { if (first) { next = first; } first = this; } int line; bool covered; CoverageNode *next; static CoverageNode *first; }; CoverageNode *CoverageNode::first; template void for_each_coverage(const Function &function) { for (const auto *node = CoverageNode::first; node; node = node->next) { function(*node); } } template struct LineCoverage { static CoverageNode node; }; template CoverageNode LineCoverage::node = CoverageNode(line); #define BRANCH() LineCoverage<__LINE__>::node.covered = true void foo(const bool b) { if (b) BRANCH(); else BRANCH(); } int main() { foo(false); for_each_coverage([] (const CoverageNode &node) { std::cout << node.line << " " << node.covered << std::endl; }); }