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