/* | |
Copyright 2008 Intel Corporation | |
Use, modification and distribution are subject to the Boost Software License, | |
Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at | |
http://www.boost.org/LICENSE_1_0.txt). | |
*/ | |
#ifndef BOOST_POLYGON_ITERATOR_COMPACT_TO_POINTS_HPP | |
#define BOOST_POLYGON_ITERATOR_COMPACT_TO_POINTS_HPP | |
namespace boost { namespace polygon{ | |
template <typename iterator_type, typename point_type> | |
class iterator_compact_to_points { | |
private: | |
iterator_type iter_; | |
iterator_type iter_end_; | |
point_type pt_; | |
typename point_traits<point_type>::coordinate_type firstX_; | |
orientation_2d orient_; | |
public: | |
typedef std::forward_iterator_tag iterator_category; | |
typedef point_type value_type; | |
typedef std::ptrdiff_t difference_type; | |
typedef const point_type* pointer; //immutable | |
typedef const point_type& reference; //immutable | |
inline iterator_compact_to_points() : iter_(), iter_end_(), pt_(), firstX_(), orient_() {} | |
inline iterator_compact_to_points(iterator_type iter, iterator_type iter_end) : | |
iter_(iter), iter_end_(iter_end), pt_(), firstX_(), orient_(HORIZONTAL) { | |
if(iter_ != iter_end_) { | |
firstX_ = *iter_; | |
x(pt_, firstX_); | |
++iter_; | |
if(iter_ != iter_end_) { | |
y(pt_, *iter_); | |
} | |
} | |
} | |
//use bitwise copy and assign provided by the compiler | |
inline iterator_compact_to_points& operator++() { | |
iterator_type prev_iter = iter_; | |
++iter_; | |
if(iter_ == iter_end_) { | |
if(x(pt_) != firstX_) { | |
iter_ = prev_iter; | |
x(pt_, firstX_); | |
} | |
} else { | |
set(pt_, orient_, *iter_); | |
orient_.turn_90(); | |
} | |
return *this; | |
} | |
inline const iterator_compact_to_points operator++(int) { | |
iterator_compact_to_points tmp(*this); | |
++(*this); | |
return tmp; | |
} | |
inline bool operator==(const iterator_compact_to_points& that) const { | |
return (iter_ == that.iter_); | |
} | |
inline bool operator!=(const iterator_compact_to_points& that) const { | |
return (iter_ != that.iter_); | |
} | |
inline reference operator*() const { return pt_; } | |
}; | |
} | |
} | |
#endif | |