ROOT logo
// @(#)root/smatrix:$Id: SVector.h 21553 2007-12-21 10:55:46Z moneta $
// Author: T. Glebe, L. Moneta, J. Palacios    2005  

#ifndef ROOT_Math_SVector
#define ROOT_Math_SVector
/********************************************************************
//
// source:
//
// type:      source code
//
// created:   16. Mar 2001
//
// author:    Thorsten Glebe
//            HERA-B Collaboration
//            Max-Planck-Institut fuer Kernphysik
//            Saupfercheckweg 1
//            69117 Heidelberg
//            Germany
//            E-mail: T.Glebe@mpi-hd.mpg.de
//
// Description: A fixed size Vector class
//
// changes:
// 16 Mar 2001 (TG) creation
// 21 Mar 2001 (TG) SVector::value_type added
// 21 Mar 2001 (TG) added operators +=, -=, *=, /=
// 26 Mar 2001 (TG) added place_at()
// 03 Apr 2001 (TG) Array() added
// 06 Apr 2001 (TG) CTORS added
// 07 Apr 2001 (TG) CTORS added
// 22 Aug 2001 (TG) CTOR(T*,len) added
// 04 Sep 2001 (TG) moved inlined functions to .icc file
// 14 Jan 2002 (TG) added operator==(), operator!=(), operator>(), operator<()
//
********************************************************************/

#ifndef ROOT_Math_MnConfig
#include "Math/MConfig.h"
#endif

#include <iosfwd>

// expression engine

#ifndef ROOT_Math_Expression
#include "Math/Expression.h"
#endif




namespace ROOT { 

namespace Math { 

//     template <class T, unsigned int D, unsigned int D2> class MatRepStd;

//     template <class A, class T, unsigned int D, unsigned int D2 = 1, class R = MatRepStd<T,D,D2> > class Expr;

//____________________________________________________________________________________________________________
/** 
    SVector: a generic fixed size Vector class.
    The class is template on the scalar type and on the vector size D. 
    See \ref SVectorDoc

    Original author is Thorsten Glebe
    HERA-B Collaboration, MPI Heidelberg (Germany)

    @ingroup SMatrixSVector

    @authors T. Glebe, L. Moneta and J. Palacios

*/
//==============================================================================
// SVector
//==============================================================================
template <class T, unsigned int D>
class SVector {
public:
   /** @name --- Typedefs --- */
   /// contained scalar type
   typedef T  value_type;
   
   /** STL iterator interface. */
   typedef T*  iterator;
   
   /** STL const_iterator interface. */
   typedef const T*  const_iterator;
   
   
   /** @name --- Constructors --- */
   /**
      Default constructor: vector filled with zero values 
    */
   SVector();
   /// contruct from a vector expression
   template <class A>
   SVector(const VecExpr<A,T,D>& rhs);
   /// copy contructor
   SVector(const SVector<T,D>& rhs);
      
   // new constructs using STL iterator interface
   // skip - need to solve the ambiguities 
#ifdef LATER
   /**
       Constructor with STL iterator interface. The data will be copied into the vector
       The iterator size must be equal to the vector size
    */
   template<class InputIterator>
   explicit SVector(InputIterator begin, InputIterator end); 
   
   /**
      Constructor with STL iterator interface. The data will be copied into the vector
      The size must be <= vector size
    */
   template<class InputIterator>
   explicit SVector(InputIterator begin, unsigned int size); 
   
#else 
   // if you use iterator this is not necessary
   
   /// fill from array with len must be equal to D!
   SVector( const T *  a, unsigned int len);
   
   /** fill from a SVector iterator of type T*   
      (for ambiguities iterator cannot be generic )
   */
   SVector(const_iterator begin, const_iterator end);
   
#endif
   /// construct a vector of size 1 from a single scalar value
   explicit SVector(const T& a1);
   /// construct a vector of size 2 from 2 scalar values 
   SVector(const T& a1, const T& a2);
   /// construct a vector of size 3 from 3 scalar values 
   SVector(const T& a1, const T& a2, const T& a3);
   /// construct a vector of size 4 from 4 scalar values  
   SVector(const T& a1, const T& a2, const T& a3, const T& a4);
   /// construct a vector of size 5 from 5 scalar values  
   SVector(const T& a1, const T& a2, const T& a3, const T& a4,
           const T& a5);
   /// construct a vector of size 6 from 6 scalar values  
   SVector(const T& a1, const T& a2, const T& a3, const T& a4,
           const T& a5, const T& a6);
   /// construct a vector of size 7 from 7 scalar values  
   SVector(const T& a1, const T& a2, const T& a3, const T& a4,
           const T& a5, const T& a6, const T& a7);
   /// construct a vector of size 8 from 8 scalar values  
   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);
   /// construct a vector of size 9 from 9 scalar values  
   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);
   /// construct a vector of size 10 from 10 scalar values  
   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);
   
   
   
   /// assignment from a scalar (only for size 1 vector)
   SVector<T,D>& operator=(const T& a1);
   /// assignment  from Vector Expression
   template <class A>
   SVector<T,D>& operator=(const VecExpr<A,T,D>& rhs);
   
   /** @name --- Access functions --- */
   
   /**
      Enumeration defining the Vector size
    */
   enum {
      /// return vector size
      kSize = D
   };
   
   
   /// return dimension $D$
   inline static unsigned int Dim() { return D; }
   /// access the parse tree. Index starts from zero
   T apply(unsigned int i) const;
   /// return read-only pointer to internal array
   const T* Array() const;
   /// return non-const pointer to internal array
   T* Array();
   
   /** @name --- STL-like interface --- */
   
   
   /** STL iterator interface. */
   iterator begin();
   
   /** STL iterator interface. */
   iterator end();
   
   /** STL const_iterator interface. */
   const_iterator begin() const;
   
   /** STL const_iterator interface. */
   const_iterator end() const;

   /// set vector elements copying the values 
   /// iterator size must match vector size
   template<class InputIterator>
   void SetElements(InputIterator begin, InputIterator end); 

   /// set vector elements copying the values 
   /// size must be <= vector size
   template<class InputIterator>
   void SetElements(InputIterator begin, unsigned int size); 
   
   
   /** @name --- Operators --- */
   
   /// element wise comparison
   bool operator==(const T& rhs) const;
   /// element wise comparison
   bool operator!=(const T& rhs) const;
   /// element wise comparison
   bool operator==(const SVector<T,D>& rhs) const;
   /// element wise comparison
   bool operator!=(const SVector<T,D>& rhs) const;
   /// element wise comparison
   template <class A>
   bool operator==(const VecExpr<A,T,D>& rhs) const;
   /// element wise comparison
   template <class A>
   bool operator!=(const VecExpr<A,T,D>& rhs) const;
   
   /// element wise comparison
   bool operator>(const T& rhs) const;
   /// element wise comparison
   bool operator<(const T& rhs) const;
   /// element wise comparison
   bool operator>(const SVector<T,D>& rhs) const;
   /// element wise comparison
   bool operator<(const SVector<T,D>& rhs) const;
   /// element wise comparison
   template <class A>
   bool operator>(const VecExpr<A,T,D>& rhs) const;
   /// element wise comparison
   template <class A>
   bool operator<(const VecExpr<A,T,D>& rhs) const;
   
   /// read-only access of vector elements. Index starts from 0. 
   const T& operator[](unsigned int i) const;
   /// read-only access of vector elements. Index starts from 0. 
   const T& operator()(unsigned int i) const;
   /// read-only access of vector elements with check on index. Index starts from 0.
   const T& At(unsigned int i) const;
   /// read/write access of vector elements. Index starts from 0. 
   T& operator[](unsigned int i);
   /// read/write access of vector elements. Index starts from 0. 
   T& operator()(unsigned int i);
   /// read/write access of vector elements with check on index. Index starts from 0.
   T& At(unsigned int i);
   
   /// self addition with a scalar
   SVector<T,D>& operator+=(const T& rhs);
   /// self subtraction with a scalar
   SVector<T,D>& operator-=(const T& rhs);
   /// self multiplication with a scalar 
   SVector<T,D>& operator*=(const T& rhs);
   /// self division with a scalar
   SVector<T,D>& operator/=(const T& rhs);


   /// self addition with another vector
   SVector<T,D>& operator+=(const SVector<T,D>& rhs);
   /// self subtraction with another vector
   SVector<T,D>& operator-=(const SVector<T,D>& rhs);
   /// self addition with a vector expression
   template <class A>
   SVector<T,D>& operator+=(const VecExpr<A,T,D>& rhs);
   /// self subtraction with a vector expression
   template <class A>
   SVector<T,D>& operator-=(const VecExpr<A,T,D>& rhs);


#ifdef OLD_IMPL
#ifndef __CINT__
   /// self element-wise multiplication  with another vector 
   SVector<T,D>& operator*=(const SVector<T,D>& rhs);
   /// self element-wise division with another vector 
   SVector<T,D>& operator/=(const SVector<T,D>& rhs);
      
   /// self element-wise multiplication  with a vector expression
   template <class A>
   SVector<T,D>& operator*=(const VecExpr<A,T,D>& rhs);
   /// self element-wise division  with a vector expression
   template <class A>
   SVector<T,D>& operator/=(const VecExpr<A,T,D>& rhs);
   
#endif
#endif
   
   /** @name --- Expert functions --- */
   /// transform vector into a vector of lenght 1
   SVector<T,D>& Unit();
   /// place a sub-vector starting from the given position
   template <unsigned int D2>
   SVector<T,D>& Place_at(const SVector<T,D2>& rhs, unsigned int row);
   /// place a sub-vector expression starting from the given position
   template <class A, unsigned int D2>
   SVector<T,D>& Place_at(const VecExpr<A,T,D2>& rhs, unsigned int row);
   
   /**
      return a subvector of size N starting at the value row
    where N is the size of the returned vector (SubVector::kSize)
    Condition  row+N <= D
    */ 
   template <class SubVector >  
   SubVector Sub(unsigned int row) const;
   
   
   /// used by operator<<()
   std::ostream& Print(std::ostream& os) const;
   
private:
      
   /** @name --- Data member --- */
      
   /// SVector data
   T fArray[D];
}; // end of class SVector


//==============================================================================
// operator<<
//==============================================================================
template <class T, unsigned int D>
std::ostream& operator<<(std::ostream& os, const ROOT::Math::SVector<T,D>& rhs);



}  // namespace Math

}  // namespace ROOT



#ifndef __CINT__

// include implementation file
#ifndef ROOT_Math_SVector_icc
#include "Math/SVector.icc"
#endif

// include operators and functions
#ifndef ROOT_Math_UnaryOperators
#include "Math/UnaryOperators.h"
#endif
#ifndef ROOT_Math_BinaryOperators
#include "Math/BinaryOperators.h"
#endif
#ifndef ROOT_Math_MatrixFunctions
#include "Math/Functions.h"
#endif

#endif // __CINT__


#endif  /* ROOT_Math_SVector  */
 SVector.h:1
 SVector.h:2
 SVector.h:3
 SVector.h:4
 SVector.h:5
 SVector.h:6
 SVector.h:7
 SVector.h:8
 SVector.h:9
 SVector.h:10
 SVector.h:11
 SVector.h:12
 SVector.h:13
 SVector.h:14
 SVector.h:15
 SVector.h:16
 SVector.h:17
 SVector.h:18
 SVector.h:19
 SVector.h:20
 SVector.h:21
 SVector.h:22
 SVector.h:23
 SVector.h:24
 SVector.h:25
 SVector.h:26
 SVector.h:27
 SVector.h:28
 SVector.h:29
 SVector.h:30
 SVector.h:31
 SVector.h:32
 SVector.h:33
 SVector.h:34
 SVector.h:35
 SVector.h:36
 SVector.h:37
 SVector.h:38
 SVector.h:39
 SVector.h:40
 SVector.h:41
 SVector.h:42
 SVector.h:43
 SVector.h:44
 SVector.h:45
 SVector.h:46
 SVector.h:47
 SVector.h:48
 SVector.h:49
 SVector.h:50
 SVector.h:51
 SVector.h:52
 SVector.h:53
 SVector.h:54
 SVector.h:55
 SVector.h:56
 SVector.h:57
 SVector.h:58
 SVector.h:59
 SVector.h:60
 SVector.h:61
 SVector.h:62
 SVector.h:63
 SVector.h:64
 SVector.h:65
 SVector.h:66
 SVector.h:67
 SVector.h:68
 SVector.h:69
 SVector.h:70
 SVector.h:71
 SVector.h:72
 SVector.h:73
 SVector.h:74
 SVector.h:75
 SVector.h:76
 SVector.h:77
 SVector.h:78
 SVector.h:79
 SVector.h:80
 SVector.h:81
 SVector.h:82
 SVector.h:83
 SVector.h:84
 SVector.h:85
 SVector.h:86
 SVector.h:87
 SVector.h:88
 SVector.h:89
 SVector.h:90
 SVector.h:91
 SVector.h:92
 SVector.h:93
 SVector.h:94
 SVector.h:95
 SVector.h:96
 SVector.h:97
 SVector.h:98
 SVector.h:99
 SVector.h:100
 SVector.h:101
 SVector.h:102
 SVector.h:103
 SVector.h:104
 SVector.h:105
 SVector.h:106
 SVector.h:107
 SVector.h:108
 SVector.h:109
 SVector.h:110
 SVector.h:111
 SVector.h:112
 SVector.h:113
 SVector.h:114
 SVector.h:115
 SVector.h:116
 SVector.h:117
 SVector.h:118
 SVector.h:119
 SVector.h:120
 SVector.h:121
 SVector.h:122
 SVector.h:123
 SVector.h:124
 SVector.h:125
 SVector.h:126
 SVector.h:127
 SVector.h:128
 SVector.h:129
 SVector.h:130
 SVector.h:131
 SVector.h:132
 SVector.h:133
 SVector.h:134
 SVector.h:135
 SVector.h:136
 SVector.h:137
 SVector.h:138
 SVector.h:139
 SVector.h:140
 SVector.h:141
 SVector.h:142
 SVector.h:143
 SVector.h:144
 SVector.h:145
 SVector.h:146
 SVector.h:147
 SVector.h:148
 SVector.h:149
 SVector.h:150
 SVector.h:151
 SVector.h:152
 SVector.h:153
 SVector.h:154
 SVector.h:155
 SVector.h:156
 SVector.h:157
 SVector.h:158
 SVector.h:159
 SVector.h:160
 SVector.h:161
 SVector.h:162
 SVector.h:163
 SVector.h:164
 SVector.h:165
 SVector.h:166
 SVector.h:167
 SVector.h:168
 SVector.h:169
 SVector.h:170
 SVector.h:171
 SVector.h:172
 SVector.h:173
 SVector.h:174
 SVector.h:175
 SVector.h:176
 SVector.h:177
 SVector.h:178
 SVector.h:179
 SVector.h:180
 SVector.h:181
 SVector.h:182
 SVector.h:183
 SVector.h:184
 SVector.h:185
 SVector.h:186
 SVector.h:187
 SVector.h:188
 SVector.h:189
 SVector.h:190
 SVector.h:191
 SVector.h:192
 SVector.h:193
 SVector.h:194
 SVector.h:195
 SVector.h:196
 SVector.h:197
 SVector.h:198
 SVector.h:199
 SVector.h:200
 SVector.h:201
 SVector.h:202
 SVector.h:203
 SVector.h:204
 SVector.h:205
 SVector.h:206
 SVector.h:207
 SVector.h:208
 SVector.h:209
 SVector.h:210
 SVector.h:211
 SVector.h:212
 SVector.h:213
 SVector.h:214
 SVector.h:215
 SVector.h:216
 SVector.h:217
 SVector.h:218
 SVector.h:219
 SVector.h:220
 SVector.h:221
 SVector.h:222
 SVector.h:223
 SVector.h:224
 SVector.h:225
 SVector.h:226
 SVector.h:227
 SVector.h:228
 SVector.h:229
 SVector.h:230
 SVector.h:231
 SVector.h:232
 SVector.h:233
 SVector.h:234
 SVector.h:235
 SVector.h:236
 SVector.h:237
 SVector.h:238
 SVector.h:239
 SVector.h:240
 SVector.h:241
 SVector.h:242
 SVector.h:243
 SVector.h:244
 SVector.h:245
 SVector.h:246
 SVector.h:247
 SVector.h:248
 SVector.h:249
 SVector.h:250
 SVector.h:251
 SVector.h:252
 SVector.h:253
 SVector.h:254
 SVector.h:255
 SVector.h:256
 SVector.h:257
 SVector.h:258
 SVector.h:259
 SVector.h:260
 SVector.h:261
 SVector.h:262
 SVector.h:263
 SVector.h:264
 SVector.h:265
 SVector.h:266
 SVector.h:267
 SVector.h:268
 SVector.h:269
 SVector.h:270
 SVector.h:271
 SVector.h:272
 SVector.h:273
 SVector.h:274
 SVector.h:275
 SVector.h:276
 SVector.h:277
 SVector.h:278
 SVector.h:279
 SVector.h:280
 SVector.h:281
 SVector.h:282
 SVector.h:283
 SVector.h:284
 SVector.h:285
 SVector.h:286
 SVector.h:287
 SVector.h:288
 SVector.h:289
 SVector.h:290
 SVector.h:291
 SVector.h:292
 SVector.h:293
 SVector.h:294
 SVector.h:295
 SVector.h:296
 SVector.h:297
 SVector.h:298
 SVector.h:299
 SVector.h:300
 SVector.h:301
 SVector.h:302
 SVector.h:303
 SVector.h:304
 SVector.h:305
 SVector.h:306
 SVector.h:307
 SVector.h:308
 SVector.h:309
 SVector.h:310
 SVector.h:311
 SVector.h:312
 SVector.h:313
 SVector.h:314
 SVector.h:315
 SVector.h:316
 SVector.h:317
 SVector.h:318
 SVector.h:319
 SVector.h:320
 SVector.h:321
 SVector.h:322
 SVector.h:323
 SVector.h:324
 SVector.h:325
 SVector.h:326
 SVector.h:327
 SVector.h:328
 SVector.h:329
 SVector.h:330
 SVector.h:331
 SVector.h:332
 SVector.h:333
 SVector.h:334
 SVector.h:335
 SVector.h:336
 SVector.h:337
 SVector.h:338
 SVector.h:339
 SVector.h:340
 SVector.h:341
 SVector.h:342
 SVector.h:343
 SVector.h:344
 SVector.h:345
 SVector.h:346
 SVector.h:347
 SVector.h:348
 SVector.h:349
 SVector.h:350
 SVector.h:351
 SVector.h:352
 SVector.h:353
 SVector.h:354
 SVector.h:355
 SVector.h:356
 SVector.h:357
 SVector.h:358
 SVector.h:359
 SVector.h:360
 SVector.h:361
 SVector.h:362
 SVector.h:363
 SVector.h:364
 SVector.h:365