$include_dir="/home/hyper-archives/geometry/include"; include("$include_dir/msg-header.inc") ?>
Subject: [ggl] box_range is not a valid range
From: zzsj (feverzsj)
Date: 2011-05-02 21:37:29
hi,Barend
 
> Did you work out your suggestion in your solution? If so, could you send 
> it such that we might replace it?
That's fairly easy. Almost just copy and paste code of box_rang/box_iterator. I've also removed some unnecessary test since it seems iterator is always compared with other iterator of same range.
namespace ggl = boost::geometry;
template<typename Box>
class box2d_range
{
public :
    typedef typename ggl::point_type<Box>::type point_type;
    struct box2d_iterator
        : public boost::iterator_facade<
            box2d_iterator,
            point_type const,  // read only
            boost::random_access_traversal_tag
        >
    {
        // begin iterator
        box2d_iterator(point_type const* p)
            : m_points(p), m_index(0) {}
        // end iterator
        box2d_iterator()
            : m_points(0), m_index(5) {}
        typedef std::ptrdiff_t difference_type;
    private:
        friend class boost::iterator_core_access;
        point_type const& dereference() const
        {
            assert(m_points);
            if (m_index >= 0 && m_index <= 3)
            {
                return m_points[m_index];
            }
            // If it index is 4, or other, return first point
            return m_points[0];
        }
        bool equal(box2d_iterator const& other) const
        {
            return other.m_index == m_index;
        }
        void increment()
        {
            m_index++;
        }
        void decrement()
        {
            m_index--;
        }
        void advance(difference_type n)
        {
            m_index += n;
        }
        difference_type distance_to(box2d_iterator const& other) const
        {
            return other.m_index - m_index;
        }
        int m_index;
        point_type const* m_points;
    };
    typedef box2d_iterator const_iterator;
    typedef box2d_iterator iterator; // must be defined
    explicit box2d_range(Box const& box)
    {
        init(box);
    }
    const_iterator begin() const { return const_iterator(m_points); }
    const_iterator end() const { return const_iterator(); }
    // It may not be used non-const, so comment this:
    //iterator begin() { return m_begin; }
    //iterator end() { return m_end; }
    void init(Box const& box)
    {
        ggl::detail::assign_box_corners_oriented<false>(box, m_points);
    }
private :
    point_type m_points[4];
};