FEDRA emulsion software from the OPERA Collaboration
SVector.hh
Go to the documentation of this file.
1 #ifndef __SVECTOR_HH
2 #define __SVECTOR_HH
3 // ********************************************************************
4 //
5 // source:
6 //
7 // type: source code
8 //
9 // created: 16. Mar 2001
10 //
11 // author: Thorsten Glebe
12 // HERA-B Collaboration
13 // Max-Planck-Institut fuer Kernphysik
14 // Saupfercheckweg 1
15 // 69117 Heidelberg
16 // Germany
17 // E-mail: T.Glebe@mpi-hd.mpg.de
18 //
19 // Description: A fixed size Vector class
20 //
21 // changes:
22 // 16 Mar 2001 (TG) creation
23 // 21 Mar 2001 (TG) SVector::value_type added
24 // 21 Mar 2001 (TG) added operators +=, -=, *=, /=
25 // 26 Mar 2001 (TG) added place_at()
26 // 03 Apr 2001 (TG) Array() added
27 // 06 Apr 2001 (TG) CTORS added
28 // 07 Apr 2001 (TG) CTORS added
29 // 22 Aug 2001 (TG) CTOR(T*,len) added
30 // 04 Sep 2001 (TG) moved inlined functions to .icc file
31 // 14 Jan 2002 (TG) added operator==(), operator!=(), operator>(), operator<()
32 //
33 // ********************************************************************
34 #include <iosfwd>
35 
36 template <class A, class T, unsigned int D, unsigned int D2> class Expr;
37 
38 // expression engine
39 #include "Expression.hh"
40 
47 //==============================================================================
48 // SVector
49 //==============================================================================
50 template <class T, unsigned int D>
51 class SVector {
52 public:
55  typedef T value_type;
56 
61  template <class A>
62  SVector(const Expr<A,T,D>& rhs);
64  SVector(const SVector<T,D>& rhs);
66  template <unsigned int D1>
67  SVector(const SVector<T,D1>& rhs);
69  template <unsigned int D1>
70  SVector(const T& a1, const SVector<T,D1>& rhs);
72  SVector(const T* a, unsigned int len);
74  SVector(const T& rhs);
76  SVector(const T& a1, const T& a2);
78  SVector(const T& a1, const T& a2, const T& a3);
80  SVector(const T& a1, const T& a2, const T& a3, const T& a4);
82  SVector(const T& a1, const T& a2, const T& a3, const T& a4,
83  const T& a5);
85  SVector(const T& a1, const T& a2, const T& a3, const T& a4,
86  const T& a5, const T& a6);
88  SVector(const T& a1, const T& a2, const T& a3, const T& a4,
89  const T& a5, const T& a6, const T& a7);
91  SVector(const T& a1, const T& a2, const T& a3, const T& a4,
92  const T& a5, const T& a6, const T& a7, const T& a8);
94  SVector(const T& a1, const T& a2, const T& a3, const T& a4,
95  const T& a5, const T& a6, const T& a7, const T& a8,
96  const T& a9);
98  SVector(const T& a1, const T& a2, const T& a3, const T& a4,
99  const T& a5, const T& a6, const T& a7, const T& a8,
100  const T& a9, const T& a10);
101 
103  SVector<T,D>& operator=(const T& rhs);
105  template <class A>
107 
110  inline static unsigned int dim() { return D; }
112  T apply(unsigned int i) const;
114  const T* Array() const;
116  T* Array();
117 
120  bool operator==(const T& rhs) const;
122  bool operator!=(const T& rhs) const;
124  bool operator==(const SVector<T,D>& rhs) const;
126  bool operator!=(const SVector<T,D>& rhs) const;
128  template <class A>
129  bool operator==(const Expr<A,T,D>& rhs) const;
131  template <class A>
132  bool operator!=(const Expr<A,T,D>& rhs) const;
133 
135  bool operator>(const T& rhs) const;
137  bool operator<(const T& rhs) const;
139  bool operator>(const SVector<T,D>& rhs) const;
141  bool operator<(const SVector<T,D>& rhs) const;
143  template <class A>
144  bool operator>(const Expr<A,T,D>& rhs) const;
146  template <class A>
147  bool operator<(const Expr<A,T,D>& rhs) const;
148 
150  const T& operator[](unsigned int i) const;
152  const T& operator()(unsigned int i) const;
154  T& operator[](unsigned int i);
156  T& operator()(unsigned int i);
157 
161  template <class A>
166  template <class A>
171  template <class A>
176  template <class A>
178 
179 
184  template <unsigned int D2>
185  SVector<T,D>& place_at(const SVector<T,D2>& rhs, const unsigned int row);
187  template <class A, unsigned int D2>
188  SVector<T,D>& place_at(const Expr<A,T,D2>& rhs, const unsigned int row);
190  std::ostream& print(std::ostream& os) const;
191 
192 private:
193  T array[D];
194 }; // end of class SVector
195 
196 //==============================================================================
197 // operator<<
198 //==============================================================================
199 template <class T, unsigned int D>
200 std::ostream& operator<<(std::ostream& os, const SVector<T,D>& rhs);
201 
202 // include implementation file
203 #include "SVector.icc"
204 
205 // include operators and functions
206 #include "UnaryOperators.hh"
207 #include "BinaryOperators.hh"
208 #include "Functions.hh"
209 #endif
std::ostream & operator<<(std::ostream &os, const SVector< T, D > &rhs)
void a()
Definition: check_aligned.C:59
Definition: Expression.hh:43
Definition: SVector.hh:51
const T & operator()(unsigned int i) const
read-only access
SVector(const T &a1, const T &a2, const T &a3)
SVector(const T &a1, const T &a2)
SVector< T, D > & operator+=(const SVector< T, D > &rhs)
T apply(unsigned int i) const
access the parse tree
SVector(const T *a, unsigned int len)
fill from array, len must be equal to D!
SVector(const T &rhs)
bool operator!=(const T &rhs) const
element wise comparison
SVector(const T &a1, const SVector< T, D1 > &rhs)
$D1\le D-1$ required!
T * Array()
return pointer to internal array
SVector(const T &a1, const T &a2, const T &a3, const T &a4, const T &a5, const T &a6, const T &a7, const T &a8, const T &a9, const T &a10)
bool operator==(const Expr< A, T, D > &rhs) const
element wise comparison
bool operator==(const T &rhs) const
element wise comparison
SVector< T, D > & operator/=(const Expr< A, T, D > &rhs)
bool operator!=(const SVector< T, D > &rhs) const
element wise comparison
bool operator>(const T &rhs) const
element wise comparison
SVector< T, D > & place_at(const Expr< A, T, D2 > &rhs, const unsigned int row)
place a sub-vector starting at <row>
SVector(const T &a1, const T &a2, const T &a3, const T &a4, const T &a5, const T &a6, const T &a7, const T &a8, const T &a9)
SVector< T, D > & operator/=(const SVector< T, D > &rhs)
SVector(const T &a1, const T &a2, const T &a3, const T &a4, const T &a5, const T &a6, const T &a7)
std::ostream & print(std::ostream &os) const
used by operator<<()
static unsigned int dim()
return dimension $D$
Definition: SVector.hh:110
const T * Array() const
return read-only pointer to internal array
bool operator<(const Expr< A, T, D > &rhs) const
element wise comparison
bool operator>(const SVector< T, D > &rhs) const
element wise comparison
SVector(const T &a1, const T &a2, const T &a3, const T &a4, const T &a5)
T & operator[](unsigned int i)
read/write access
SVector(const T &a1, const T &a2, const T &a3, const T &a4, const T &a5, const T &a6)
SVector(const T &a1, const T &a2, const T &a3, const T &a4, const T &a5, const T &a6, const T &a7, const T &a8)
SVector< T, D > & place_at(const SVector< T, D2 > &rhs, const unsigned int row)
place a sub-vector starting at <row>
SVector< T, D > & operator+=(const Expr< A, T, D > &rhs)
T array[D]
Definition: SVector.hh:193
SVector< T, D > & unit()
transform vector into a vector of lenght 1
SVector< T, D > & operator=(const Expr< A, T, D > &rhs)
SVector(const Expr< A, T, D > &rhs)
T & operator()(unsigned int i)
read/write access
bool operator!=(const Expr< A, T, D > &rhs) const
element wise comparison
SVector(const T &a1, const T &a2, const T &a3, const T &a4)
SVector< T, D > & operator-=(const Expr< A, T, D > &rhs)
T value_type
Definition: SVector.hh:55
bool operator<(const T &rhs) const
element wise comparison
bool operator>(const Expr< A, T, D > &rhs) const
element wise comparison
SVector(const SVector< T, D > &rhs)
const T & operator[](unsigned int i) const
read-only access
SVector(const SVector< T, D1 > &rhs)
$D1\le D$ required!
SVector< T, D > & operator*=(const SVector< T, D > &rhs)
bool operator<(const SVector< T, D > &rhs) const
element wise comparison
SVector< T, D > & operator=(const T &rhs)
SVector< T, D > & operator-=(const SVector< T, D > &rhs)
SVector< T, D > & operator*=(const Expr< A, T, D > &rhs)
bool operator==(const SVector< T, D > &rhs) const
element wise comparison