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;
278 #ifndef DOXYGEN_HIDE_INTERNAL_CLASSES 385 {
return(
"Vector" ); }
389 sprintf( num,
"%d", (
int) D );
390 return( std::string(
"VECTOR_OF_" ) + num +
"_" +
410 template<
typename T,
int D>
417 static const bool is_scalar =
false;
418 static const bool is_multichannel =
true;
419 static const bool has_bool_conversion =
false;
420 static const unsigned int channelcount = D;
425 #endif // DOXYGEN_HIDE_INTERNAL_CLASSES 431 template <
class T,
int D>
438 template <
class T,
int D>
442 for (
int d = 0; d < D; d++)
447 template <
class T,
int D>
451 for (
int d = 0; d < D; d++)
455 template <
class T,
int D>
459 int d, N = std::min(
typename std::vector<T>::size_type( D ), value.size() );
460 for( d = 0; d < N; ++d )
466 #ifndef DOXYGEN_HIDE_INTERNAL_CLASSES 469 template <
typename T,
int D>
473 inline static void doit( T
_value[D],
const T& x,
const T& y )
477 for (
int d = 2; d < D; d++)
482 template <
typename T,
int D>
486 inline static void doit( T
_value[D],
const T& x,
const T& y,
const T& z )
491 for (
int d = 3; d < D; d++)
496 template <
typename T,
int D>
500 inline static void doit( T
_value[D],
const T& x,
const T& y,
const T& z,
507 for (
int d = 4; d < D; d++)
512 template <
typename T>
522 template <
typename T>
526 inline static void doit( T
_value[1],
const T& x,
const T&,
const T& )
532 template <
typename T>
536 inline static void doit( T
_value[1],
const T& x,
const T&,
const T&,
543 template <
typename T>
547 inline static void doit( T
_value[2],
const T& x,
const T& y,
const T& )
554 template <
typename T>
558 inline static void doit( T
_value[2],
const T& x,
const T& y,
const T&,
566 template <
typename T>
570 inline static void doit( T
_value[3],
const T& x,
const T& y,
const T& z,
582 template <
class T,
int D>
590 template <
class T,
int D>
598 template <
class T,
int D>
606 template <
class T,
int D>
610 for (
int d = 0; d < D; d++)
614 template <
class T,
int D>
template<
class U>
618 for (
int d = 0; d < D; d++)
623 template <
class T,
int D>
629 for (
int d = 0; d < D; d++)
635 template <
class T,
int D>
642 template <
class T,
int D>
646 for (
int d = 0;d < D; d++)
652 template <
class T,
int D>
656 for (
int d = 0; d < D; d++)
662 template <
class T,
int D>
666 for (
int d = 0; d < D; d++)
672 template <
class T,
int D>
676 for (
int d = 0; d < D; d++)
682 template <
class T,
int D>
694 template <
class T,
int D>
703 template <
class T,
int D>
712 template <
class T,
int D>
721 template <
class T,
int D>
729 template <
class T,
int D>
736 template <
class T,
int D>
740 for (
int d = 0; d < D; ++d) {
741 if (
_value[ d ] )
return false;
746 template <
class T,
int D>
751 for (
int d = 0; d < D; ++d)
752 result +=
float(
item(d)) * float(
item(d));
756 template <
class T,
int D>
761 for (
int d = 0; d < D; ++d)
762 result +=
float(
item(d)) * float(
item(d));
766 template <
class T,
int D>
771 for (
int d = 0; d < D; ++d)
772 result +=
double(
item(d)) * double(
item(d));
776 template <
class T,
int D>
781 for (
int d = 0; d < D; ++d)
782 result +=
double(
item(d)) * double(
item(d));
787 template <
class T,
int D>
792 for (
int d = 0; d < D; ++d)
798 template <
class T,
int D>
802 std::vector<T> vec( D );
814 template <
class T,
int D>
819 for (
int d = 0; d < D; ++d)
826 template <
class T,
int D>
831 for (
int d = 0; d < D; ++d)
838 template <
class T,
int D>
844 for (
int d = 0; d < D; ++d)
845 result[d] = v1[d] + v2[d];
850 template <
class T,
int D>
856 for (
int d = 0; d < D; ++d)
857 result[d] = v1[d] - v2[d];
862 template <
class T,
int D>
868 for (
int d = 0; d < D; ++d)
869 result[d] = (T) ( v1[d] * value );
874 template <
class T,
int D>
880 for (
int d = 0; d < D; ++d)
881 result[d] = (T) ( v1[d] * value );
886 template <
class T,
int D>
892 for (
int d = 0; d < D; ++d)
893 result[d] = (T) ( v1[d] / value );
898 template <
class T,
int D>
906 template <
class T,
int D>
911 for (
int d = 0; d < D; ++d)
917 template <
class T,
int D>
923 result[0] = v1[1] * v2[2] - v1[2] * v2[1];
924 result[1] = v1[2] * v2[0] - v1[0] * v2[2];
925 result[2] = v1[0] * v2[1] - v1[1] * v2[0];
930 template <
class T,
int D>
938 template <
class T,
int D>
945 template <
class T,
int D>
953 template <
class T,
int D>
961 template <
class T,
int D>
963 std::ostream& operator << ( std::ostream& out,const AimsVector<T,D>& thing)
966 for (
int d = 0; d < D-1 ; ++d)
967 out << thing.
item(d) <<
", ";
968 out << thing.
item(D-1) <<
')';
975 std::ostream& operator << ( std::ostream& out,const AimsVector<char,D>& thing)
978 for (
int d = 0; d < D-1 ; ++d)
979 out << (
int)thing.
item(d) <<
", ";
980 out << (int)thing.
item(D-1) <<
')';
987 std::ostream& operator << ( std::ostream& out,const AimsVector<byte,D>& thing)
990 for (
int d = 0; d < D-1 ; ++d)
991 out << (
int)thing.
item(d) <<
", ";
992 out << (int)thing.
item(D-1) <<
')';
997 template <
class T,
int D>
1004 carto::StreamUtil::skip( is );
1007 if (is.peek() ==
'(')
1010 carto::StreamUtil::skip( is );
1011 is >> thing.
item(0);
1012 for (
int i = 1; i < D; ++i)
1014 carto::StreamUtil::skip( is );
1018 carto::StreamUtil::skip( is );
1019 is >> thing.
item(i);
1023 carto::StreamUtil::skip( is );
1029 std::cout <<
"vector read ends not with )\n";
1044 carto::StreamUtil::skip( is );
1047 if (is.peek() ==
'(')
1050 carto::StreamUtil::skip( is );
1052 thing.
item(0) = (char)tmp;
1053 for (
int i = 1; i < D; ++i)
1055 carto::StreamUtil::skip( is );
1059 carto::StreamUtil::skip( is );
1061 thing.
item(i) = (char)tmp;
1065 carto::StreamUtil::skip( is );
1071 is.setstate (std::ios::failbit);
1085 carto::StreamUtil::skip( is );
1088 if (is.peek() ==
'(')
1091 carto::StreamUtil::skip( is );
1094 for (
int i = 1; i < D; ++i)
1096 carto::StreamUtil::skip( is );
1100 carto::StreamUtil::skip( is );
1106 carto::StreamUtil::skip( is );
1112 is.setstate (std::ios::failbit);
1119 template <
typename T>
1125 v1[2] * v2[0] - v1[0] * v2[2],
1126 v1[0] * v2[1] - v1[1] * v2[0] );
#define DECLARE_GENERIC_OBJECT_TYPE(T)
float norm2() const
Return the square magnitude of the vector.
AimsVector< uint32_t, 2 > Point2dui
static void doit(T _value[D], const T &x, const T &y, const T &z, const T &t)
AimsVector< double, 4 > Point4dd
AimsVector< uint16_t, 2 > Point2dus
const_iterator begin() const
AimsVector< int32_t, 2 > Point2di
AimsVector< T, D > operator*(const AimsVector< T, D > &v1, double value)
AimsVector< uint32_t, 3 > Point3du
AimsVector< T, D > LongType
AimsVector< int16_t, 3 > Point3ds
AimsVector< float, 4 > Point4df
AimsVector< T, D > operator-(const AimsVector< T, D > &v1, const AimsVector< T, D > &v2)
static void doit(T _value[D], const T &x, const T &y)
The template class to implement basic vectors.
static void doit(T _value[2], const T &x, const T &y, const T &)
AimsVector< uint32_t, 4 > Point4dui
AimsVector< int64_t, 4 > Point4dl
AimsVector< double, 3 > Point3dd
bool operator!=(const AimsVector< T, D > &v1, const AimsVector< T, D > &v2)
should be defined implicitely, but fails with some compilers (Intel)
float norm2(const AimsVector< T, D > &v1)
AimsVector< float, 2 > Point2df
AimsVector< T, D > operator/(const AimsVector< T, D > &v1, double value)
const T & operator[](int d) const
Get a const reference to the dth item.
AimsVector< int16_t, 2 > Point2d
AimsVector< T, D > & normalize()
static void doit(T _value[1], const T &x, const T &)
AimsVector< T, 3 > crossed(const AimsVector< T, D > &v1, const AimsVector< T, D > &v2)
AimsVector< T, D > & operator/=(double val)
bool operator==(const AimsVector< T, D > &v1, const AimsVector< T, D > &v2)
std::istream & operator>>(std::istream &in, AimsVector< T, D > &thing)
AimsVector< int64_t, 2 > Point2dl
double dnorm2(const AimsVector< T, D > &v1)
std::vector< T > toStdVector() const
static void doit(T _value[D], const T &x, const T &y, const T &z)
bool isNull() const
Test if the vector is the null vector.
static std::string name()
AimsVector< uint32_t, 3 > Point3dui
double dnorm2() const
Return the square magnitude of the vector.
AimsVector< int16_t, 4 > Point4d
AimsVector< float, 3 > Point3df
AimsVector< T, D > operator+(const AimsVector< T, D > &v1, const AimsVector< T, D > &v2)
AimsVector< T, D > & operator+=(const AimsVector< T, D > &other)
float norm(const AimsVector< T, D > &v1)
T dot(const AimsVector< T, D > &other) const
Get the dot product between 2 vectors.
T _value[D]
Memory space allocated.
static void doit(T _value[3], const T &x, const T &y, const T &z, const T &)
AimsVector< T, D > & operator=(const AimsVector< T, D > &other)
AimsVector()
The constructor allocates an appropriate amount of memory.
static void doit(T _value[2], const T &x, const T &y, const T &, const T &)
AimsVector< int16_t, 2 > Point2ds
AimsVector< int32_t, 4 > Point4di
AimsVector< uint64_t, 3 > Point3dul
static std::string dataType()
AimsVector< uint64_t, 2 > Point2dul
float norm() const
Return the magnitude of the vector.
AimsVector< int32_t, 3 > Point3di
AimsVector< T, 3 > vectProduct(const AimsVector< T, 3 > &v1, const AimsVector< T, 3 > &v2)
AimsVector< int16_t, 3 > Point3d
~AimsVector()
The destructor deletes the allocated memory space.
AimsVector< uint64_t, 4 > Point4dul
static std::string objectType()
static void doit(T _value[1], const T &x, const T &, const T &, const T &)
double dnorm(const AimsVector< T, D > &v1)
AimsVector< uint32_t, 4 > Point4du
std::ostream & operator<<(std::ostream &out, const AimsVector< T, D > &thing)
AimsVector< int64_t, 3 > Point3dl
static void doit(T _value[1], const T &x, const T &, const T &)
AimsVector< double, 2 > Point2dd
AimsVector< int16_t, 4 > Point4ds
AimsVector< T, D > & operator-=(const AimsVector< T, D > &other)
AimsVector< uint16_t, 3 > Point3dus
double dnorm() const
Return the magnitude of the vector.
const T & item(int d) const
Get a const reference to the dth item.
AimsVector< uint16_t, 4 > Point4dus
AimsVector< uint32_t, 2 > Point2du
const_iterator end() const
AimsVector< T, D > & operator*=(double val)