]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/boost/polygon/detail/iterator_compact_to_points.hpp
update sources to v12.2.3
[ceph.git] / ceph / src / boost / boost / polygon / detail / iterator_compact_to_points.hpp
1 /*
2 Copyright 2008 Intel Corporation
3
4 Use, modification and distribution are subject to the Boost Software License,
5 Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
6 http://www.boost.org/LICENSE_1_0.txt).
7 */
8 #ifndef BOOST_POLYGON_ITERATOR_COMPACT_TO_POINTS_HPP
9 #define BOOST_POLYGON_ITERATOR_COMPACT_TO_POINTS_HPP
10 namespace boost { namespace polygon{
11 template <typename iterator_type, typename point_type>
12 class iterator_compact_to_points {
13 private:
14 iterator_type iter_;
15 iterator_type iter_end_;
16 point_type pt_;
17 typename point_traits<point_type>::coordinate_type firstX_;
18 orientation_2d orient_;
19 public:
20 typedef std::forward_iterator_tag iterator_category;
21 typedef point_type value_type;
22 typedef std::ptrdiff_t difference_type;
23 typedef const point_type* pointer; //immutable
24 typedef const point_type& reference; //immutable
25
26 inline iterator_compact_to_points() : iter_(), iter_end_(), pt_(), firstX_(), orient_() {}
27 inline iterator_compact_to_points(iterator_type iter, iterator_type iter_end) :
28 iter_(iter), iter_end_(iter_end), pt_(), firstX_(), orient_(HORIZONTAL) {
29 if(iter_ != iter_end_) {
30 firstX_ = *iter_;
31 x(pt_, firstX_);
32 ++iter_;
33 if(iter_ != iter_end_) {
34 y(pt_, *iter_);
35 }
36 }
37 }
38 //use bitwise copy and assign provided by the compiler
39 inline iterator_compact_to_points& operator++() {
40 iterator_type prev_iter = iter_;
41 ++iter_;
42 if(iter_ == iter_end_) {
43 if(x(pt_) != firstX_) {
44 iter_ = prev_iter;
45 x(pt_, firstX_);
46 }
47 } else {
48 set(pt_, orient_, *iter_);
49 orient_.turn_90();
50 }
51 return *this;
52 }
53 inline const iterator_compact_to_points operator++(int) {
54 iterator_compact_to_points tmp(*this);
55 ++(*this);
56 return tmp;
57 }
58 inline bool operator==(const iterator_compact_to_points& that) const {
59 if (iter_ == iter_end_) {
60 return iter_ == that.iter_;
61 }
62 return (iter_ == that.iter_) && (x(pt_) == x(that.pt_));
63 }
64 inline bool operator!=(const iterator_compact_to_points& that) const {
65 if (iter_ == iter_end_) {
66 return iter_ != that.iter_;
67 }
68 return (iter_ != that.iter_) || (x(pt_) != x(that.pt_));
69 }
70 inline reference operator*() const { return pt_; }
71 };
72 }
73 }
74 #endif