
//----------------------------------------------------------------------------
// Anti-Grain Geometry - Version 2.3
// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
//
// 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.
//
//----------------------------------------------------------------------------
// Contact: mcseem@antigrain.com
//          mcseemagg@yahoo.com
//          http://www.antigrain.com
//----------------------------------------------------------------------------
//
// vertex_sequence container and vertex_dist struct
//
//----------------------------------------------------------------------------
#ifndef AGG_VERTEX_SEQUENCE_INCLUDED
#define AGG_VERTEX_SEQUENCE_INCLUDED
#include "agg_basics.h"
#include "agg_array.h"
#include "agg_math.h"
namespace agg
{
template<class T, unsigned S = 6>
class vertex_sequence : public pod_deque<T, S>
{
public:
    typedef pod_deque<T, S> base_type;
    void add(const T& val);
    void modify_last(const T& val);
    void close(bool closed);
};
template<class T, unsigned S>
void vertex_sequence<T, S>::add(const T& val)
{
    if(base_type::size() > 1) {
        if(!(*this)[base_type::size() - 2]((*this)[base_type::size() - 1])) {
            base_type::remove_last();
        }
    }
    base_type::add(val);
}
template<class T, unsigned S>
void vertex_sequence<T, S>::modify_last(const T& val)
{
    base_type::remove_last();
    add(val);
}
template<class T, unsigned S>
void vertex_sequence<T, S>::close(bool closed)
{
    while(base_type::size() > 1) {
        if((*this)[base_type::size() - 2]((*this)[base_type::size() - 1])) {
            break;
        }
        T t = (*this)[base_type::size() - 1];
        base_type::remove_last();
        modify_last(t);
    }
    if(closed) {
        while(base_type::size() > 1) {
            if((*this)[base_type::size() - 1]((*this)[0])) {
                break;
            }
            base_type::remove_last();
        }
    }
}
const float vertex_dist_epsilon = 1e-14f;
struct vertex_dist  {
    float   x;
    float   y;
    float   dist;
    vertex_dist() {}
    vertex_dist(float x_, float y_) :
        x(x_),
        y(y_),
        dist(0)
    {
    }
    bool operator () (const vertex_dist& val)
    {
        bool ret = (dist = calc_distance(x, y, val.x, val.y)) > vertex_dist_epsilon;
        return ret;
    }
};
struct vertex_dist_cmd : public vertex_dist {
    unsigned cmd;
    vertex_dist_cmd() {}
    vertex_dist_cmd(float x_, float y_, unsigned cmd_) :
        vertex_dist(x_, y_),
        cmd(cmd_)
    {
    }
};
}
#endif
