/*
* This file is part of rasdaman community.
*
* Rasdaman community is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Rasdaman community is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with rasdaman community. If not, see .
*
* Copyright 2003, 2004, 2005, 2006, 2007, 2008, 2009 Peter Baumann /
rasdaman GmbH.
*
* For more information please see
* or contact Peter Baumann via .
/
/**
* INCLUDE: point.hh
*
* MODULE: raslib
* CLASS: r_Point
*
* COMMENTS:
*
*/
#ifndef _D_POINT_
#define _D_POINT_
#ifdef __VISUALC__
// disable warning for exception specification
#pragma warning( disable : 4290 )
#endif
class r_Error;
class r_Einit_overflow;
class r_Eindex_violation;
class r_Edim_mismatch;
#include "raslib/mddtypes.hh"
#include "raslib/error.hh"
#include
//@ManMemo: Module: {\bf raslib}
/*@Doc:
Class \Ref{r_Point} represents an n-dimensional point vector.
*/
class r_Point
{
public:
/// constructor getting dimensionality for stream initializing
r_Point( r_Dimension );
/// stream-input operator for stream initializing
r_Point& operator<<( r_Range ) throw( r_Einit_overflow );
/// constructor taking string representation (e.g. [ 1, 2, 3])
r_Point( char* ) throw( r_Error );
//@Man: 'easy-to-use' constructors
//@{
///
r_Point( r_Range, r_Range );
///
r_Point( r_Range, r_Range, r_Range );
///
r_Point( r_Range, r_Range, r_Range, r_Range );
///
r_Point( r_Range, r_Range, r_Range, r_Range, r_Range );
///
//@}
/// default constructor
r_Point();
/// copy constructor
r_Point( const r_Point& );
/// destructor: cleanup dynamic memory
~r_Point();
/// subscriptor for read access
r_Range operator[]( r_Dimension ) const throw( r_Eindex_violation );
/// subscriptor for write access
r_Range& operator[]( r_Dimension ) throw( r_Eindex_violation );
/// assignment: cleanup + copy
const r_Point& operator= ( const r_Point& );
/// compares this point with the given point.
inline const int compare_with( const r_Point& p ) const;
/**
Returns 0 if this == p, -1 if this < p, 1 if this > p (considering
the coordinates in decreasing order of magnitude).
*/
/// equal operator
bool operator==( const r_Point& ) const;
/**
Two points are equal if they have the same number of dimensions and
the same values.
*/
/// non equal operator - negation of equal operator
bool operator!=( const r_Point& ) const;
/// vector addition
r_Point operator+( const r_Point& ) const
throw( r_Edim_mismatch );
/// vector subtraction
r_Point operator-( const r_Point& ) const
throw( r_Edim_mismatch );
/// vector multiplication
r_Point operator*( const r_Point& ) const
throw( r_Edim_mismatch );
/// get dimensionality
inline r_Dimension dimension() const;
/// writes the state of the object to the specified stream
void print_status( std::ostream& s = std::cout ) const;
/// gives back the string representation
char* get_string_representation() const;
/**
The string representation delivered by this method is allocated using {\tt malloc()} and
has to be free unsing {\tt free()} in the end. It can be used to construct a {\tt r_Point}
again with a special constructor provided. The string representation is build using
{\tt print_status()}.
*/
private:
/// array holding the point coordinates
r_Range* points;
/// dimensionality of the point
r_Dimension dimensionality;
/// number of components initialized already
r_Dimension streamInitCnt;
};
//@ManMemo: Module: {\bf raslib}
/**
Output stream operator for objects of type {\tt const} \Ref{r_Point}.
*/
extern std::ostream& operator<<( std::ostream& s, const r_Point& d );
#include "raslib/point.icc"
#endif