#include #include #include #include #include #include #include #include #include namespace boost { namespace qlang { namespace fields { template struct placeholder { static const int value = N; }; placeholder<0> full_object; placeholder<1> _1; placeholder<2> _2; placeholder<3> _3; placeholder<4> _4; placeholder<5> _5; placeholder<6> _6; } //namespace fields namespace detail { template struct field_select { typedef boost::tuple::type> result_type; result_type operator()(const FusionSequence & val) const { return boost::make_tuple(boost::fusion::at_c(val)); } }; template struct filtered_range_type : boost::mpl::if_ , Placeholder>, boost::iterator_range< boost::filter_iterator > , boost::iterator_range< boost::transform_iterator, boost::filter_iterator > > > {}; } //namespace detail template class from_; template class where_; template class select_; template class select_ { const Range & range_; typedef typename detail::filtered_range_type::type filtered_range; Predicate pred_; filtered_range frange_; public: typedef typename Range::value_type value_type; public: typename filtered_range::const_iterator begin(); typename filtered_range::const_iterator end(); select_(const Range & rng, Predicate && pred) : range_(rng), pred_(std::forward(pred)), frange_(boost::make_filter_iterator(pred_, range_.begin(), range_.end()), boost::make_filter_iterator(pred_, range_.end(), range_.end())) {} }; template class where_ { private: const Range & range_; Predicate pred_; public: where_(const Range & range, Predicate && pred) : range_(range), pred_(std::forward(pred)) { } template select_ select(Placeholder & p); Predicate get_predicate() const { return pred_; } }; template class from_ { private: const Range & range_; public: typedef Range range_type; typedef typename Range::value_type value_type; from_(const Range & r) : range_(r) {} template where_ where(Predicate && pred) { return where_(range_, std::move(pred)); } }; template from_ from(const Range & r) { return from_(r); } template template select_ where_::select(Placeholder & p) { return select_(this->range_, std::move(this->get_predicate())); } template typename select_::filtered_range::const_iterator select_::begin() { this->frange_ = filtered_range(boost::make_filter_iterator(pred_, range_.begin(), range_.end()), boost::make_filter_iterator(pred_, range_.end(), range_.end())); return frange_.begin(); } template typename select_::filtered_range::const_iterator select_::end() { return this->frange_.end(); } } //namespace boost } //namespace qlang