From 70af0087d8efb3f2f7dc9ffdf2568419913f16da Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Tue, 30 Jun 2015 15:07:03 +0200 Subject: Group "see through" iteration, take 1 --- build/target.ixx | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) (limited to 'build/target.ixx') diff --git a/build/target.ixx b/build/target.ixx index 837769e..b6bf509 100644 --- a/build/target.ixx +++ b/build/target.ixx @@ -2,12 +2,73 @@ // copyright : Copyright (c) 2014-2015 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file +#include + namespace build { + // prerequisite_ref + // inline bool prerequisite_ref:: belongs (const target& t) const { const auto& p (t.prerequisites); return !(p.empty () || this < &p.front () || this > &p.back ()); } + + // prerequisite_member + // + inline prerequisite& prerequisite_member:: + as_prerequisite (tracer& trace) const + { + if (target == nullptr) + return prerequisite; + + // The use of the group's prerequisite scope is debatable. + // + scope& s (prerequisite.get ().scope); + return s.prerequisites.insert (key ().tk, s, trace).first; + } + + // prerequisite_members + // + group_view + resolve_group_members (action, target_group&); // + + template + inline auto prerequisite_members_range::iterator:: + operator++ () -> iterator& + { + if (g_.count != 0) + { + // Member iteration. + // + if (++j_ == g_.count) + { + // Switch back to prerequisite iteration. + // + g_.count = 0; + ++i_; + } + } + 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_; + } + + return *this; + } } -- cgit v1.1