#ifndef _INIT_ITERATOR_GUARD #define _INIT_ITERATOR_GUARD #include #include #include #include template class init_iterator_base { public: init_iterator_base() { } init_iterator_base(std::vector const& a_rhs) : values(new std::vector(a_rhs)) , current(values->begin()) { } bool operator==(const init_iterator_base& a_rhs) const { const bool am_at_end(at_end()); bool rhs_at_end; if (am_at_end || (rhs_at_end = a_rhs.at_end())) return am_at_end && rhs_at_end; return current == a_rhs.current; } bool at_end() const { return values.get() == 0 || current == values->end(); } void operator++() { ++current; } const T& operator*() const { return *current; } private: boost::shared_ptr > values; std::vector::const_iterator current; }; template struct init_iterator_generator { typedef boost::iterator_adaptor< init_iterator_base, boost::default_iterator_policies, const T, const T&, const T*, std::forward_iterator_tag, ptrdiff_t> type; }; template class initializer { public: typedef init_iterator_generator::type iterator; initializer(boost::call_traits::param_type a_param) { values.push_back(a_param); } iterator operator()() const { return iterator(init_iterator_base(values)); } initializer& operator()(boost::call_traits::param_type a_param) { values.push_back(a_param); return *this; } private: std::vector values; }; template init_iterator_generator::type make_init_iterator() { return init_iterator_generator::type(init_iterator_base()); } template initializer make_init_iterator( boost::call_traits::param_type a_param) { return initializer(a_param); } #endif