Newer
Older
* \file
* \author Thomas Fischer
* \date 2010-01-28
* \brief Definition of the TemplatePoint class.
*
* \copyright
* Copyright (c) 2013, OpenGeoSys Community (http://www.opengeosys.org)
* Distributed under a Modified BSD License.
* See accompanying file LICENSE.txt or
*/
#ifndef TEMPLATEPOINT_H_
#define TEMPLATEPOINT_H_
#include <array>
#include <algorithm>
#include <iterator>
#include <cassert>
#include <iostream>
* \ingroup GeoLib
*
* \brief class-template for points can be instantiated by a numeric type.
template <typename T, std::size_t DIM = 3> class TemplatePoint
{
public:
/** default constructor */
/** constructor - constructs a TemplatePoint object
*
* @param list initializer list containing the coordinates of the point
TemplatePoint(std::initializer_list<T> const& list);
/** constructor - constructs a TemplatePoint object
\param x values for three coordinates
*/
TemplatePoint (T const* x);
/** virtual destructor */
virtual ~TemplatePoint() {}
/** \brief const access operator
* The access to the point coordinates is like the access to a field. Code example:
* \code
* Point<double> point (1.0, 2.0, 3.0);
* double sqrNrm2 = point[0] * point[0] + point[1] * point[1] + point[2] + point[2];
* \endcode
*/
const T& operator[] (std::size_t idx) const
{
assert (idx < DIM);
return _x[idx];
}
/** \brief access operator (see book Effektiv C++ programmieren - subsection 1.3.2 ).
* \sa const T& operator[] (std::size_t idx) const
T& operator[] (std::size_t idx)
{
return const_cast<T&> (static_cast<const TemplatePoint&> (*this)[idx]);
}
/** returns an array containing the coordinates of the point */
const T* getCoords () const { return &_x[0]; }
/** write point coordinates into stream (used from operator<<)
* \param os a standard output stream
*/
virtual void write (std::ostream &os) const
{
std::copy(_x.cbegin(), _x.cend(), std::ostream_iterator<T>(os, " "));
}
/** read point coordinates into stream (used from operator>>) */
virtual void read (std::istream &is)
{
for (std::size_t k(0); k<DIM; k++)
is >> _x[k];
std::array<T, DIM> _x;
template <typename T, std::size_t DIM>
TemplatePoint<T,DIM>::TemplatePoint()
{}
template <typename T, std::size_t DIM>
TemplatePoint<T,DIM>::TemplatePoint(std::initializer_list<T> const& list)
assert(list.size() == DIM);
typename std::initializer_list<T>::const_iterator it(list.begin());
for (std::size_t k(0); k<DIM; k++) {
_x[k] = *it;
it++;
}
template <typename T, std::size_t DIM>
TemplatePoint<T, DIM>::TemplatePoint (T const* x)
for (std::size_t k(0); k < DIM; k++)
}
/** overload the output operator for class Point */
template <typename T, std::size_t DIM>
std::ostream& operator<< (std::ostream &os, const TemplatePoint<T,DIM> &p)
{
p.write (os);
return os;
}
/** overload the input operator for class Point */
template <typename T, std::size_t DIM>
std::istream& operator>> (std::istream &is, TemplatePoint<T,DIM> &p)
{
p.read (is);
return is;
}
} // end namespace MathLib
#endif /* TEMPLATEPOINT_H_ */