26 #ifndef WFMATH_STREAM_H 27 #define WFMATH_STREAM_H 29 #include <wfmath/vector.h> 30 #include <wfmath/rotmatrix.h> 31 #include <wfmath/point.h> 32 #include <wfmath/axisbox.h> 33 #include <wfmath/ball.h> 34 #include <wfmath/segment.h> 35 #include <wfmath/rotbox.h> 36 #include <wfmath/polygon.h> 37 #include <wfmath/line.h> 38 #include <wfmath/error.h> 49 namespace _IOWrapper {
55 virtual ~BaseRead() {}
57 virtual void read(std::istream& is) = 0;
62 virtual ~BaseWrite() {}
64 virtual void write(std::ostream& os)
const = 0;
68 class ImplRead :
public BaseRead {
70 ImplRead(C& c) : m_data(c) {}
71 virtual ~ImplRead() {}
73 virtual void read(std::istream& is) {is >> m_data;}
80 class ImplWrite :
public BaseWrite {
82 ImplWrite(
const C& c) : m_data(c) {}
83 virtual ~ImplWrite() {}
85 virtual void write(std::ostream& os)
const {os << m_data;}
91 std::string ToStringImpl(
const BaseWrite& b, std::streamsize precision);
92 void FromStringImpl(BaseRead& b,
const std::string& s, std::streamsize precision);
100 inline std::string
ToString(
const C& c, std::streamsize precision = 6)
102 return _IOWrapper::ToStringImpl(_IOWrapper::ImplWrite<C>(c), precision);
110 inline void FromString(C& c,
const std::string& s, std::streamsize = 6)
112 _IOWrapper::ImplRead<C> i(c);
113 _IOWrapper::FromStringImpl(i, s, 6);
116 void _ReadCoordList(std::istream& is,
CoordType* d,
const int num);
117 void _WriteCoordList(std::ostream& os,
const CoordType* d,
const int num);
121 inline std::ostream& operator<<(std::ostream& os, const Vector<dim>& v)
123 _WriteCoordList(os, v.m_elem, dim);
128 inline std::istream& operator>>(std::istream& is,
Vector<dim>& v)
130 _ReadCoordList(is, v.m_elem, dim);
136 inline std::ostream& operator<<(std::ostream& os, const RotMatrix<dim>& m)
140 for(
int i = 0; i < dim; ++i) {
141 _WriteCoordList(os, m.m_elem[i], dim);
142 os << (i < (dim - 1) ?
',' :
')');
149 inline std::istream& operator>>(std::istream& is,
RotMatrix<dim>& m)
158 for(
int i = 0; i < dim; ++i) {
159 _ReadCoordList(is, d + i * dim, dim);
161 char want = (i == dim - 1) ?
')' :
',';
166 if(!m._setVals(d, FloatMax(numeric_constants<CoordType>::epsilon(), _GetEpsilon(is))))
173 inline std::ostream& operator<<(std::ostream& os, const Point<dim>& p)
175 _WriteCoordList(os, p.m_elem, dim);
180 inline std::istream& operator>>(std::istream& is,
Point<dim>& p)
182 _ReadCoordList(is, p.m_elem, dim);
188 inline std::ostream& operator<<(std::ostream& os, const AxisBox<dim>& a)
190 return os <<
"AxisBox: m_low = " << a.m_low <<
", m_high = " << a.m_high;
194 inline std::istream& operator>>(std::istream& is,
AxisBox<dim>& a)
200 }
while(next !=
'=');
206 }
while(next !=
'=');
214 inline std::ostream& operator<<(std::ostream& os, const Ball<dim>& b)
216 return os <<
"Ball: m_center = " << b.m_center <<
217 +
", m_radius = " << b.m_radius;
221 inline std::istream& operator>>(std::istream& is,
Ball<dim>& b)
227 }
while(next !=
'=');
233 }
while(next !=
'=');
241 inline std::ostream& operator<<(std::ostream& os, const Segment<dim>& s)
243 return os <<
"Segment: m_p1 = " << s.m_p1 <<
", m_p2 = " << s.m_p2;
247 inline std::istream& operator>>(std::istream& is,
Segment<dim>& s)
253 }
while(next !=
'=');
259 }
while(next !=
'=');
267 inline std::ostream& operator<<(std::ostream& os, const RotBox<dim>& r)
269 return os <<
"RotBox: m_corner0 = " << r.m_corner0
270 <<
", m_size = " << r.m_size
271 <<
", m_orient = " << r.m_orient;
275 inline std::istream& operator>>(std::istream& is,
RotBox<dim>& r)
281 }
while(next !=
'=');
287 }
while(next !=
'=');
293 }
while(next !=
'=');
300 template<> std::ostream& operator<<(std::ostream& os, const Polygon<2>& r);
301 template<> std::istream& operator>>(std::istream& is,
Polygon<2>& r);
304 inline std::ostream& operator<<(std::ostream& os, const Polygon<dim>& r)
306 size_t size = r.m_poly.numCorners();
315 for(
size_t i = 0; i < size; ++i)
316 os << r.getCorner(i) << (i < (dim - 1) ?
',' :
')');
323 template<
int dim>
struct _PolyReader
330 std::istream& operator>>(std::istream& is,
Polygon<dim>& r)
333 _PolyReader<dim> read;
334 std::list<_PolyReader<dim> > read_list;
343 }
while(next !=
'>');
346 }
while(next !=
'(');
350 read_list.push_back(read);
363 typename std::list<_PolyReader<dim> >::iterator i, end = read_list.end();
366 std::streamsize str_prec = is.precision();
368 while(--str_prec > 0)
370 CoordType epsilon = FloatMax(str_eps, numeric_constants<CoordType>::epsilon());
372 r.m_orient = _Poly2Orient<dim>();
374 if(read_list.size() < 3) {
375 for(i = read_list.begin(); i != end; ++i) {
376 succ = r.m_orient.expand(i->pd, i->p2, epsilon);
381 typename std::list<_PolyReader<dim> >::iterator p1 = end, p2 = end, p3 = end, j;
384 for(i = read_list.begin(); i != end; ++i) {
385 for(j = i, ++j; j != end; ++j) {
386 CoordType new_dist = SloppyDistance(i->pd, j->pd);
387 if(new_dist > dist) {
400 for(i = read_list.begin(); i != end; ++i) {
402 if(i == p1 || i == p2)
404 CoordType new_dist = FloatMin(SloppyDistance(i->pd, p1->pd),
405 SloppyDistance(i->pd, p2->pd));
406 if(new_dist > dist) {
416 succ = r.m_orient.expand(p1->pd, p1->p2, epsilon);
418 succ = r.m_orient.expand(p2->pd, p2->p2, epsilon);
420 succ = r.m_orient.expand(p3->pd, p3->p2, epsilon);
425 for(i = read_list.begin(); i != end; ++i) {
426 if(i == p1 || i == p2 || i == p3)
428 succ = r.m_orient.expand(i->pd, i->p2, epsilon);
438 r.m_poly.resize(read_list.size());
441 for(i = read_list.begin(), pnum = 0; i != end; ++i, ++pnum)
442 r.m_poly[pnum] = i->p2;
448 inline std::ostream& operator<<(std::ostream& os, const Line<dim>& r)
450 size_t size = r.numCorners();
459 for(
size_t i = 0; i < size; ++i)
460 os << r.getCorner(i) << (i < (dim - 1) ?
',' :
')');
467 #endif // WFMATH_STREAM_H Generic library namespace.
Definition: atlasconv.h:45
A dim dimensional axis-aligned box.
Definition: axisbox.h:62
A dim dimensional rotation matrix. Technically, a member of the group O(dim).
Definition: const.h:53
A dim dimensional box, lying at an arbitrary angle.
Definition: const.h:52
A polygon, all of whose points lie in a plane, embedded in dim dimensions.
Definition: const.h:51
A dim dimensional vector.
Definition: const.h:55
float CoordType
Basic floating point type.
Definition: const.h:140
The 2D specialization of the Polygon<> template.
Definition: polygon.h:47
void FromString(C &c, const std::string &s, std::streamsize=6)
Parse a WFMath type from a string.
Definition: stream.h:110
A line segment embedded in dim dimensions.
Definition: const.h:54
An error thrown by operator>>() when it fails to parse wfmath types.
Definition: error.h:46
A dim dimensional point.
Definition: const.h:50
std::string ToString(const C &c, std::streamsize precision=6)
Output a WFMath type as a string.
Definition: stream.h:100
A dim dimensional ball.
Definition: ball.h:34