From 17b3a78696f0b1fd6f0f60d53ec568cf3b9e32b4 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Wed, 1 Jul 2015 09:11:31 +0200 Subject: Cleanup group "see through" design --- build/target.ixx | 53 +++++++++++++++++++++++++++-------------------------- 1 file changed, 27 insertions(+), 26 deletions(-) (limited to 'build/target.ixx') diff --git a/build/target.ixx b/build/target.ixx index b6bf509..16616b5 100644 --- a/build/target.ixx +++ b/build/target.ixx @@ -32,7 +32,7 @@ namespace build // prerequisite_members // group_view - resolve_group_members (action, target_group&); // + resolve_group_members (action, target&); // template inline auto prerequisite_members_range::iterator:: @@ -40,35 +40,36 @@ namespace build { if (g_.count != 0) { - // Member iteration. + if (++j_ <= g_.count) + return *this; + + // Switch back to prerequisite iteration mode. // - if (++j_ == g_.count) - { - // Switch back to prerequisite iteration. - // - g_.count = 0; - ++i_; - } + g_.count = 0; } - else - { - // Prerequisite iteration. - // - if (i_->get ().template is_a ()) - { - // Switch to member iteration. - // - target_group& g (static_cast (search (*i_))); - j_ = 0; - g_ = resolve_group_members (a_, g); - if (g_.count == 0) - ++i_; // Empty group. - } - else - ++i_; - } + ++i_; + + // Switch to member iteration mode. + // + if (i_ != r_->e_ && i_->get ().type.see_through) + switch_members (); return *this; } + + template + inline void prerequisite_members_range::iterator:: + switch_members () + { + j_ = 1; + + do + { + g_ = resolve_group_members (r_->a_, search (*i_)); + } + while (g_.count == 0 && // Skip empty groups. + ++i_ != r_->e_ && + i_->get ().type.see_through); + } } -- cgit v1.1