41 #ifndef SOMAIO_VECTOR_VECTOR_H 
   42 #define SOMAIO_VECTOR_VECTOR_H 
   56 template <
class T,
int D>
 
   60 template <
class T,
int D>
 
   65 template <
class T,
int D>
 
   73 template <
class T,
int D>
 
   77   return !( v1 == val );
 
   80 template <
class T,
int D>
 
   84 template <
class T,
int D>
 
   88 template <
class T,
int D>
 
   92 template <
class T,
int D>
 
   96 template <
class T,
int D>
 
  100 template <
class T,
int D>
 
  103 template <
class T,
int D>
 
  106 template <
class T,
int D>
 
  110 template <
class T,
int D>
 
  113 template <
class T,
int D>
 
  116 template <
class T,
int D>
 
  119 template <
class T,
int D>
 
  122 template <
class T,
int D>
 
  126 template <
class T,
int D>
 
  135 template <
class T,
int D>
 
  143     explicit AimsVector( 
const std::vector<T> & value );
 
  153     AimsVector(
const T& x,
const T& y,
const T& z,
const T& t);
 
  174     const T& 
item(
int d) 
const;
 
  190     double dnorm() 
const;
 
  280 #ifndef DOXYGEN_HIDE_INTERNAL_CLASSES 
  387     { 
return( 
"Vector" ); }
 
  391       sprintf( num, 
"%d", (
int) D );
 
  392       return( std::string( 
"VECTOR_OF_" ) + num + 
"_" +
 
  401   template<> 
inline std::string DataTypeCode<Point2df>::dataType()
 
  406   template<> 
inline std::string DataTypeCode<Point3df>::dataType()
 
  412 template<
typename T, 
int D>
 
  419   static const bool is_scalar = 
false;
 
  420   static const bool is_multichannel = 
true;
 
  421   static const bool has_bool_conversion = 
false;
 
  422   static const unsigned int channelcount = D;
 
  433 template <
class T,
int D>
 
  440 template <
class T,
int D>
 
  444   for (
int d = 0; d < D; d++)
 
  449 template <
class T,
int D>
 
  453   for (
int d = 0; d < D; d++)
 
  454     _value[d] = value[d];
 
  457 template <
class T, 
int D>
 
  461   int d, N = std::min( 
typename std::vector<T>::size_type( D ), value.size() );
 
  462   for( d = 0; d < N; ++d )
 
  463     _value[d] = value[d];
 
  468 #ifndef DOXYGEN_HIDE_INTERNAL_CLASSES 
  472   template <
typename T>
 
  493   template <
typename T>
 
  504   template <
typename T, 
int D>
 
  508     inline static void doit( T _value[D], 
const T& x, 
const T& y )
 
  512       for (
int d = 2; d < D; d++)
 
  517   template <
typename T, 
int D>
 
  521     inline static void doit( T _value[D], 
const T& x, 
const T& y, 
const T& z )
 
  526       for (
int d = 3; d < D; d++)
 
  531   template <
typename T, 
int D>
 
  535     inline static void doit( T _value[D], 
const T& x, 
const T& y, 
const T& z,
 
  542       for (
int d = 4; d < D; d++)
 
  547   template <
typename T>
 
  551     inline static void doit( T _value[1], 
const T& x, 
const T& )
 
  557   template <
typename T>
 
  561     inline static void doit( T _value[1], 
const T& x, 
const T&, 
const T& )
 
  567   template <
typename T>
 
  571     inline static void doit( T _value[1], 
const T& x, 
const T&, 
const T&,
 
  578   template <
typename T>
 
  582     inline static void doit( T _value[2], 
const T& x, 
const T& y, 
const T& )
 
  589   template <
typename T>
 
  593     inline static void doit( T _value[2], 
const T& x, 
const T& y, 
const T&,
 
  601   template <
typename T>
 
  605     inline static void doit( T _value[3], 
const T& x, 
const T& y, 
const T& z,
 
  617 template <
class T,
int D>
 
  625 template <
class T,
int D>
 
  633 template <
class T,
int D>
 
  641 template <
class T,
int D>
 
  645   for (
int d = 0; d < D; d++)
 
  646     _value[d] = other.
_value[d];
 
  649 template <
class T,
int D> 
template<
class U>
 
  653   for (
int d = 0; d < D; d++)
 
  654     _value[d] = other[d];
 
  658 template <
class T,
int D>
 
  664   for (
int d = 0; d < D; d++)
 
  665     _value[d] = other.
_value[d];
 
  670 template <
class T,
int D>
 
  677 template <
class T,
int D>
 
  681   for (
int d = 0;d < D; d++)
 
  682     _value[d] += other.
_value[d];
 
  687 template <
class T,
int D>
 
  691   for (
int d = 0; d < D; d++)
 
  692     _value[d] -= other.
_value[d];
 
  697 template <
class T,
int D>
 
  701   for (
int d = 0; d < D; d++)
 
  702     _value[d] = (T) ( _value[d] * val );
 
  707 template <
class T,
int D>
 
  711   for (
int d = 0; d < D; d++)
 
  712     _value[d] = (T) ( _value[d] / val );
 
  717 template <
class T,
int D>
 
  723     return operator /= ( n );
 
  729 template <
class T,
int D>
 
  738 template <
class T,
int D>
 
  747 template <
class T,
int D>
 
  756 template <
class T,
int D>
 
  764 template <
class T,
int D>
 
  771 template <
class T,
int D>
 
  775   for (
int d = 0; d < D; ++d) {
 
  776     if ( _value[ d ] ) 
return false;
 
  781 template <
class T,
int D>
 
  786   for (
int d = 0; d < D; ++d)
 
  787     result += 
float(item(d)) * float(item(d));
 
  791 template <
class T,
int D>
 
  796   for (
int d = 0; d < D; ++d)
 
  797     result += 
float(item(d)) * float(item(d));
 
  801 template <
class T,
int D>
 
  806   for (
int d = 0; d < D; ++d)
 
  807     result += 
double(item(d)) * double(item(d));
 
  811 template <
class T,
int D>
 
  816   for (
int d = 0; d < D; ++d)
 
  817     result += 
double(item(d)) * double(item(d));
 
  822 template <
class T,
int D>
 
  827   for (
int d = 0; d < D; ++d)
 
  828     result += item(d) * other.
item(d);
 
  833 template <
class T,
int D>
 
  837   std::vector<T> vec( D );
 
  849 template <
class T,
int D>
 
  854   for (
int d = 0; d < D; ++d)
 
  861 template <
class T,
int D>
 
  866   for (
int d = 0; d < D; ++d)
 
  873 template <
class T,
int D>
 
  879   for (
int d = 0; d < D; ++d)
 
  880     result[d] = v1[d] + v2[d];
 
  885 template <
class T,
int D>
 
  891   for (
int d = 0; d < D; ++d)
 
  892     result[d] = v1[d] - v2[d];
 
  897 template <
class T,
int D>
 
  903   for (
int d = 0; d < D; ++d)
 
  904     result[d] = (T) ( v1[d] * value );
 
  909 template <
class T,
int D>
 
  915   for (
int d = 0; d < D; ++d)
 
  916     result[d] = (T) ( v1[d] * value );
 
  921 template <
class T,
int D>
 
  927   for (
int d = 0; d < D; ++d)
 
  928     result[d] = (T) ( v1[d] / value );
 
  933 template <
class T,
int D>
 
  941 template <
class T,
int D>
 
  946   for (
int d = 0; d < D; ++d)
 
  952 template <
class T,
int D>
 
  958   result[0] = v1[1] * v2[2] - v1[2] * v2[1];
 
  959   result[1] = v1[2] * v2[0] - v1[0] * v2[2];
 
  960   result[2] = v1[0] * v2[1] - v1[1] * v2[0];
 
  965 template <
class T,
int D>
 
  973 template <
class T,
int D>
 
  980 template <
class T,
int D>
 
  988 template <
class T,
int D>
 
  996 template <
class T,
int D>
 
 1001   for (
int d = 0; d < D-1 ; ++d)
 
 1002     out << thing.
item(d) << 
", ";
 
 1003   out << thing.
item(D-1) << 
')';
 
 1013   for (
int d = 0; d < D-1 ; ++d)
 
 1014     out << (
int)thing.
item(d) << 
", ";
 
 1015   out << (int)thing.
item(D-1) << 
')';
 
 1025   for (
int d = 0; d < D-1 ; ++d)
 
 1026     out << (
int)thing.
item(d) << 
", ";
 
 1027   out << (int)thing.
item(D-1) << 
')';
 
 1032 template <
class T,
int D>
 
 1039   carto::StreamUtil::skip( is );
 
 1042   if (is.peek() == 
'(')
 
 1045       carto::StreamUtil::skip( is );
 
 1046       is >> thing.
item(0);
 
 1047       for (
int i = 1; i < D; ++i)
 
 1049           carto::StreamUtil::skip( is );
 
 1053           carto::StreamUtil::skip( is );
 
 1054           is >> thing.
item(i);
 
 1058           carto::StreamUtil::skip( is );
 
 1064     std::cout << 
"vector read ends not with )\n";
 
 1079   carto::StreamUtil::skip( is );
 
 1082   if (is.peek() == 
'(')
 
 1085       carto::StreamUtil::skip( is );
 
 1087       thing.
item(0) = (char)tmp;
 
 1088       for (
int i = 1; i < D; ++i)
 
 1090           carto::StreamUtil::skip( is );
 
 1094           carto::StreamUtil::skip( is );
 
 1096           thing.
item(i) = (char)tmp;
 
 1100           carto::StreamUtil::skip( is );
 
 1106     is.setstate (std::ios::failbit);
 
 1120   carto::StreamUtil::skip( is );
 
 1123   if (is.peek() == 
'(')
 
 1126       carto::StreamUtil::skip( is );
 
 1129       for (
int i = 1; i < D; ++i)
 
 1131           carto::StreamUtil::skip( is );
 
 1135           carto::StreamUtil::skip( is );
 
 1141           carto::StreamUtil::skip( is );
 
 1147     is.setstate (std::ios::failbit);
 
 1154 template <
typename T>
 
 1160                    v1[2] * v2[0] - v1[0] * v2[2],
 
 1161                    v1[0] * v2[1] - v1[1] * v2[0] );
 
 1171   template<
typename T, 
int D>
 
 1182 #ifndef DOXYGEN_HIDE_INTERNAL_CLASSES 
 1184   template<
typename T, 
int D>
 
 1197     for( 
int i=0; i<D; ++i )
 
 1223   template<
typename T, 
int D>
 
 1231     for( 
int i=0; i<D; ++i )
 
 1246   template <
typename T, 
int D>
 
The template class to implement basic vectors.
std::vector< T > toStdVector() const
~AimsVector()
The destructor deletes the allocated memory space.
AimsVector< T, D > & operator/=(double val)
const T & item(int d) const
Get a const reference to the dth item.
bool isNull() const
Test if the vector is the null vector.
AimsVector< T, D > & normalize()
AimsVector< T, D > & operator+=(const AimsVector< T, D > &other)
AimsVector< T, D > & operator=(const AimsVector< T, D > &other)
T _value[D]
Memory space allocated.
AimsVector< T, D > & operator-=(const AimsVector< T, D > &other)
T dot(const AimsVector< T, D > &other) const
Get the dot product between 2 vectors.
float norm() const
Return the magnitude of the vector.
const T & operator[](int d) const
Get a const reference to the dth item.
double dnorm2() const
Return the square magnitude of the vector.
const_iterator end() const
double dnorm() const
Return the magnitude of the vector.
AimsVector()
The constructor allocates an appropriate amount of memory.
AimsVector< T, D > & operator*=(double val)
float norm2() const
Return the square magnitude of the vector.
const_iterator begin() const
static std::string name()
static std::string objectType()
static std::string dataType()
AimsVector< T, D > LongType
static void doit(T _value[1], const T &x, const T &)
static void doit(T _value[D], const T &x, const T &y)
static void doit(T _value[1], const T &x, const T &, const T &)
static void doit(T _value[2], const T &x, const T &y, const T &)
static void doit(T _value[D], const T &x, const T &y, const T &z)
static void doit(T _value[1], const T &x, const T &, const T &, const T &)
static void doit(T _value[2], const T &x, const T &y, const T &, const T &)
static void doit(T _value[3], const T &x, const T &y, const T &z, const T &)
static void doit(T _value[D], const T &x, const T &y, const T &z, const T &t)
static bool read(DataSource &ds, T &item)
static bool write(DataSource &ds, const T &item)
Abstraction layer for various data sources (file, buffer, socket...).
virtual int putch(int ch)=0
virtual bool isOpen() const =0
static bool skip(DataSource &, const std::string &chars=" \t\n\r", bool ascii=true)
std::ostream & operator<<(std::ostream &os, const MemoryAllocator &thing)
#define DECLARE_GENERIC_OBJECT_TYPE(T)
AimsVector< float, 3 > Point3df
AimsVector< int16_t, 3 > Point3d
AimsVector< T, D > operator+(const AimsVector< T, D > &v1, const AimsVector< T, D > &v2)
AimsVector< uint32_t, 2 > Point2du
std::ostream & operator<<(std::ostream &out, const AimsVector< T, D > &thing)
AimsVector< uint32_t, 3 > Point3dui
AimsVector< uint32_t, 2 > Point2dui
AimsVector< int32_t, 3 > Point3di
AimsVector< T, D > operator-(const AimsVector< T, D > &v1, const AimsVector< T, D > &v2)
AimsVector< double, 2 > Point2dd
AimsVector< uint16_t, 4 > Point4dus
AimsVector< int64_t, 4 > Point4dl
double dnorm(const AimsVector< T, D > &v1)
AimsVector< T, 3 > vectProduct(const AimsVector< T, 3 > &v1, const AimsVector< T, 3 > &v2)
AimsVector< int32_t, 2 > Point2di
AimsVector< int16_t, 2 > Point2ds
AimsVector< uint64_t, 4 > Point4dul
bool operator==(const AimsVector< T, D > &v1, const AimsVector< T, D > &v2)
AimsVector< int64_t, 3 > Point3dl
AimsVector< int16_t, 4 > Point4ds
AimsVector< uint32_t, 4 > Point4dui
AimsVector< double, 3 > Point3dd
AimsVector< T, 3 > crossed(const AimsVector< T, D > &v1, const AimsVector< T, D > &v2)
AimsVector< uint32_t, 3 > Point3du
std::istream & operator>>(std::istream &in, AimsVector< T, D > &thing)
AimsVector< T, D > operator/(const AimsVector< T, D > &v1, double value)
AimsVector< uint16_t, 2 > Point2dus
double dnorm2(const AimsVector< T, D > &v1)
AimsVector< float, 4 > Point4df
AimsVector< uint32_t, 4 > Point4du
AimsVector< uint64_t, 2 > Point2dul
float norm2(const AimsVector< T, D > &v1)
float norm(const AimsVector< T, D > &v1)
AimsVector< uint16_t, 3 > Point3dus
AimsVector< float, 2 > Point2df
AimsVector< T, D > operator*(const AimsVector< T, D > &v1, double value)
bool operator!=(const AimsVector< T, D > &v1, const AimsVector< T, D > &v2)
should be defined implicitly, but fails with some compilers (Intel)
AimsVector< int16_t, 2 > Point2d
AimsVector< uint64_t, 3 > Point3dul
AimsVector< int64_t, 2 > Point2dl
AimsVector< int32_t, 4 > Point4di
AimsVector< double, 4 > Point4dd
AimsVector< int16_t, 3 > Point3ds
AimsVector< int16_t, 4 > Point4d