#ifndef READ_INP_H
#define READ_INP_H
#include <CGAL/basic.h>
#include <CGAL/assertions.h>
template <class Traits>
class PM_input
{
public:
typedef typename Traits::Point_2 Point;
typedef struct { int s, t; } Curve;
PM_input()
{
num_pnts = num_cvs = 0;
pnts = NULL;
cvs = NULL;
}
~PM_input()
{
delete_all();
}
void delete_all()
{
if (pnts != NULL)
delete[] pnts;
if (cvs != NULL)
delete[] cvs;
num_pnts = num_cvs = 0;
pnts = NULL;
cvs = NULL;
}
void alloc(int np, int nc)
{
delete_all();
pnts = new Point[np];
num_pnts = np;
cvs = new Curve[nc];
num_cvs = nc;
}
void set(int i, int source, int target)
{
if ((i < 0) || (i >= num_cvs))
return;
cvs[i].s = source;
cvs[i].t = target;
}
void set(int i, const Point &p)
{
if ((i < 0) || (i >= num_pnts))
return;
pnts[i] = p;
}
bool get(int i, int &source, int &target) const
{
if ((i < 0) || (i >= num_cvs))
return false;
source = cvs[i].s;
target = cvs[i].t;
return true;
}
bool get(int i, Point &p) const
{
if ((i < 0) || (i >= num_pnts))
return false;
p = pnts[i];
return true;
}
int curve_source(int i) const
{
if ((i < 0) || (i >= num_cvs))
return -1;
return cvs[i].s;
}
int curve_target(int i) const
{
if ((i < 0) || (i >= num_cvs))
return -1;
return cvs[i].t;
}
int get_num_pnts() const { return num_pnts; }
int get_num_cvs() const { return num_cvs; }
Point point(int i) const
{
if ((i < 0) || (i >= num_pnts))
return Point(0,0);
return pnts[i];
}
friend std::ostream &operator<<(std::ostream &os, const PM_input &pmi)
{
CGAL::set_ascii_mode(os);
os << pmi.num_pnts << std::endl;
int i;
for (i = 0; i < pmi.num_pnts; i++)
{
os << pmi.pnts[i] << std::endl;
}
os << pmi.num_cvs << std::endl;
for (i = 0; i < pmi.num_cvs; i++)
{
os << pmi.cvs[i].s << " " << pmi.cvs[i].t << std::endl;
}
return os;
}
friend std::istream &operator>>(std::istream &is, PM_input &pmi)
{
CGAL::set_ascii_mode(is);
pmi.delete_all();
Point p;
is >> pmi.num_pnts;
#ifdef CGAL_PM_READ_DEBUG
std::cerr << "pmi.num_pnts " << pmi.num_pnts << std::endl;
#endif
pmi.pnts = new Point[pmi.num_pnts];
CGAL_assertion(pmi.pnts != NULL);
int i;
#ifdef USE_LEDA_RAT_KERNEL
number_type x,y;
#endif
for (i = 0; i < pmi.num_pnts; i++)
{
#ifndef USE_LEDA_RAT_KERNEL
is >> pmi.pnts[i];
#else
is >> x >> y;
pmi.pnts[i]=Point(x,y);
#endif
}
is >> pmi.num_cvs;
#ifdef CGAL_PM_READ_DEBUG
std::cerr << "pmi.num_cvs " << pmi.num_cvs << std::endl;
#endif
pmi.cvs = new Curve[pmi.num_cvs];
CGAL_assertion(pmi.cvs != NULL);
for (i = 0; i < pmi.num_cvs; i++)
{
is >> pmi.cvs[i].s >> pmi.cvs[i].t;
}
return is;
}
private:
Point *pnts;
Curve *cvs;
int num_pnts;
int num_cvs;
};
#endif
syntax highlighted by Code2HTML, v. 0.9.1