#ifndef c_to_r_hpp #define c_to_r_hpp #include #include #include namespace boost { /*! View an iterator of a complex sequence as a scalar sequence, from a sequence z, returns real(z[i]), imag(z[i]), real (z[i+1]) ... */ template class c_to_r_adapt : public boost::iterator_adaptor< c_to_r_adapt, BaseIterator, typename std::iterator_traits::value_type::value_type > { friend class iterator_core_access; public: typedef typename boost::iterator_adaptor< c_to_r_adapt, BaseIterator, typename std::iterator_traits::value_type::value_type > super_t; typedef typename std::iterator_traits::value_type complex_type; typedef typename complex_type::value_type scalar_type; typedef typename std::iterator_traits::difference_type difference_type; c_to_r_adapt() {} explicit c_to_r_adapt (BaseIterator _base) : super_t (_base), cnt (0) {} scalar_type & dereference() const { return (cnt % 2 == 0) ? real (const_cast(*this->base_reference())) : imag (const_cast(*this->base_reference())); } // scalar_type & dereference() { // return (cnt % 2 == 0) ? real (*this->base_reference()) : imag (*this->base_reference()); // } void increment() { cnt++; if (cnt == 2) { ++this->base_reference(); cnt = 0; } } void decrement() { cnt--; if (cnt < 0) { --this->base_reference(); cnt = 1; } } void advance(difference_type n) { this->base_reference() += n/2; cnt += n % 2; if (cnt == 2) { ++this->base_reference(); cnt = 0; } } difference_type distance_to(c_to_r_adapt const& y) const { return 2 * (y.base_reference() - this->base_reference()) + (y.cnt - cnt); } int cnt; }; template c_to_r_adapt make_c_to_r_adapt(BaseIterator const& begin) { return c_to_r_adapt (begin); } } // namespace boost #endif