// arch-tag: f15a8c5a-77d2-4f25-9973-7b3c7f4dee83 /* * (C) Copyright Neal D. Becker (2004) * Permission to copy, use, modify, sell and distribute this software * is granted provided this copyright notice appears in all copies. * This software is provided "as is" without express or implied * warranty, and with no claim as to its suitability for any purpose. */ #ifndef c_to_r_hpp #define c_to_r_hpp #include #include #include namespace boost { template class c_to_r_adapt : public boost::iterator_adaptor< c_to_r_adapt, BaseIterator, typename std::iterator_traits::value_type::value_type, // scalar type // use_default, boost::random_access_traversal_tag // typename std::iterator_traits::value_type::value_type // deref returns value, not ref // typename std::iterator_traits::value_type::value_type // deref returns value, not ref // use_default > { friend class iterator_core_access; public: typedef typename boost::iterator_adaptor< c_to_r_adapt, BaseIterator, typename std::iterator_traits::value_type::value_type, boost::random_access_traversal_tag // use_default, // typename std::iterator_traits::value_type::value_type // use_default > 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 const& dereference() const { // return (cnt % 2 == 0) ? real (*this->base_reference()) : imag (*this->base_reference()); return (cnt % 2 == 0) ? (*this->base_reference()).real() : (*this->base_reference()).imag(); } scalar_type & dereference() { return (cnt % 2 == 0) ? (*this->base_reference()).real() : (*this->base_reference()).imag(); } 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); } template c_to_r_adapt make_c_to_r_adapt(BaseIterator & begin) { return c_to_r_adapt (begin); } } // namespace boost #endif