From 4ed05b152284d9d4b8545f6e70c57ebdcd993f46 Mon Sep 17 00:00:00 2001 From: Josh Stone Date: Thu, 5 Feb 2009 13:08:44 -0800 Subject: Simplify require() and provide() * staptree.h (require, provide): Simplify stack operations with less pointer magic, and move to be deep_copy_visitor members. * staptree.h (deep_copy_visitor::deep_copy): Templatize * staptree.cxx, tapsets.cxx: Refactor require/provide callers --- staptree.h | 54 ++++++++++++++++++++++++++++-------------------------- 1 file changed, 28 insertions(+), 26 deletions(-) (limited to 'staptree.h') diff --git a/staptree.h b/staptree.h index 8c37776f..29196828 100644 --- a/staptree.h +++ b/staptree.h @@ -818,11 +818,30 @@ struct throwing_visitor: public visitor struct deep_copy_visitor: public visitor { - std::stack targets; + template T require (T src) + { + T dst = NULL; + if (src != NULL) + { + src->visit(this); + assert(!targets.empty()); + dst = static_cast(targets.top()); + targets.pop(); + assert(dst); + } + return dst; + } + + template void provide (T src) + { + targets.push(static_cast(src)); + } - static expression *deep_copy (expression *s); - static statement *deep_copy (statement *s); - static block *deep_copy (block *s); + template static T deep_copy (T e) + { + deep_copy_visitor v; + return v.require (e); + } virtual void visit_block (block *s); virtual void visit_embeddedcode (embeddedcode *s); @@ -856,30 +875,13 @@ struct deep_copy_visitor: public visitor virtual void visit_print_format (print_format* e); virtual void visit_stat_op (stat_op* e); virtual void visit_hist_op (hist_op* e); -}; -template void -require (deep_copy_visitor* v, T* dst, T src) -{ - *dst = NULL; - if (src != NULL) - { - v->targets.push(static_cast(dst)); - src->visit(v); - v->targets.pop(); - assert(*dst); - } -} - -template <> void -require (deep_copy_visitor* v, indexable** dst, indexable* src); +private: + std::stack targets; +}; -template void -provide (deep_copy_visitor* v, T src) -{ - assert(!v->targets.empty()); - *(static_cast(v->targets.top())) = src; -} +template <> indexable* +deep_copy_visitor::require (indexable* src); #endif // STAPTREE_H -- cgit