This is the Tiny Vector Matrix Expression Templates library found at http://tvmet.sourceforge.net. It is the fastest and most compact matrix lib out there (for < 10x10 matricies). I have done some minor tweaks to make it compile for mbed. For examples and hints on how to use, see: http://tvmet.sourceforge.net/usage.html
Dependents: Eurobot_2012_Secondary
Vector.h@0:feb4117d16d8, 2012-03-28 (annotated)
- Committer:
- madcowswe
- Date:
- Wed Mar 28 15:53:45 2012 +0000
- Revision:
- 0:feb4117d16d8
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
madcowswe | 0:feb4117d16d8 | 1 | /* |
madcowswe | 0:feb4117d16d8 | 2 | * Tiny Vector Matrix Library |
madcowswe | 0:feb4117d16d8 | 3 | * Dense Vector Matrix Libary of Tiny size using Expression Templates |
madcowswe | 0:feb4117d16d8 | 4 | * |
madcowswe | 0:feb4117d16d8 | 5 | * Copyright (C) 2001 - 2007 Olaf Petzold <opetzold@users.sourceforge.net> |
madcowswe | 0:feb4117d16d8 | 6 | * |
madcowswe | 0:feb4117d16d8 | 7 | * This library is free software; you can redistribute it and/or |
madcowswe | 0:feb4117d16d8 | 8 | * modify it under the terms of the GNU lesser General Public |
madcowswe | 0:feb4117d16d8 | 9 | * License as published by the Free Software Foundation; either |
madcowswe | 0:feb4117d16d8 | 10 | * version 2.1 of the License, or (at your option) any later version. |
madcowswe | 0:feb4117d16d8 | 11 | * |
madcowswe | 0:feb4117d16d8 | 12 | * This library is distributed in the hope that it will be useful, |
madcowswe | 0:feb4117d16d8 | 13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
madcowswe | 0:feb4117d16d8 | 14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
madcowswe | 0:feb4117d16d8 | 15 | * lesser General Public License for more details. |
madcowswe | 0:feb4117d16d8 | 16 | * |
madcowswe | 0:feb4117d16d8 | 17 | * You should have received a copy of the GNU lesser General Public |
madcowswe | 0:feb4117d16d8 | 18 | * License along with this library; if not, write to the Free Software |
madcowswe | 0:feb4117d16d8 | 19 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
madcowswe | 0:feb4117d16d8 | 20 | * |
madcowswe | 0:feb4117d16d8 | 21 | * $Id: Vector.h,v 1.48 2007-06-23 15:58:58 opetzold Exp $ |
madcowswe | 0:feb4117d16d8 | 22 | */ |
madcowswe | 0:feb4117d16d8 | 23 | |
madcowswe | 0:feb4117d16d8 | 24 | #ifndef TVMET_VECTOR_H |
madcowswe | 0:feb4117d16d8 | 25 | #define TVMET_VECTOR_H |
madcowswe | 0:feb4117d16d8 | 26 | |
madcowswe | 0:feb4117d16d8 | 27 | #include <iterator> // reverse_iterator |
madcowswe | 0:feb4117d16d8 | 28 | |
madcowswe | 0:feb4117d16d8 | 29 | #include <tvmet/tvmet.h> |
madcowswe | 0:feb4117d16d8 | 30 | #include <tvmet/TypePromotion.h> |
madcowswe | 0:feb4117d16d8 | 31 | #include <tvmet/CommaInitializer.h> |
madcowswe | 0:feb4117d16d8 | 32 | #include <tvmet/RunTimeError.h> |
madcowswe | 0:feb4117d16d8 | 33 | |
madcowswe | 0:feb4117d16d8 | 34 | #include <tvmet/xpr/Vector.h> |
madcowswe | 0:feb4117d16d8 | 35 | |
madcowswe | 0:feb4117d16d8 | 36 | namespace tvmet { |
madcowswe | 0:feb4117d16d8 | 37 | |
madcowswe | 0:feb4117d16d8 | 38 | |
madcowswe | 0:feb4117d16d8 | 39 | /* forwards */ |
madcowswe | 0:feb4117d16d8 | 40 | template<class T, std::size_t Sz> class Vector; |
madcowswe | 0:feb4117d16d8 | 41 | |
madcowswe | 0:feb4117d16d8 | 42 | |
madcowswe | 0:feb4117d16d8 | 43 | /** |
madcowswe | 0:feb4117d16d8 | 44 | * \class VectorConstReference Vector.h "tvmet/Vector.h" |
madcowswe | 0:feb4117d16d8 | 45 | * \brief Const value iterator for ET |
madcowswe | 0:feb4117d16d8 | 46 | */ |
madcowswe | 0:feb4117d16d8 | 47 | template<class T, std::size_t Sz> |
madcowswe | 0:feb4117d16d8 | 48 | class VectorConstReference |
madcowswe | 0:feb4117d16d8 | 49 | : public TvmetBase< VectorConstReference<T, Sz> > |
madcowswe | 0:feb4117d16d8 | 50 | { |
madcowswe | 0:feb4117d16d8 | 51 | public: // types |
madcowswe | 0:feb4117d16d8 | 52 | typedef T value_type; |
madcowswe | 0:feb4117d16d8 | 53 | typedef T* pointer; |
madcowswe | 0:feb4117d16d8 | 54 | typedef const T* const_pointer; |
madcowswe | 0:feb4117d16d8 | 55 | |
madcowswe | 0:feb4117d16d8 | 56 | public: |
madcowswe | 0:feb4117d16d8 | 57 | /** Dimensions. */ |
madcowswe | 0:feb4117d16d8 | 58 | enum { |
madcowswe | 0:feb4117d16d8 | 59 | Size = Sz /**< The size of the vector. */ |
madcowswe | 0:feb4117d16d8 | 60 | }; |
madcowswe | 0:feb4117d16d8 | 61 | |
madcowswe | 0:feb4117d16d8 | 62 | public: |
madcowswe | 0:feb4117d16d8 | 63 | /** Complexity counter. */ |
madcowswe | 0:feb4117d16d8 | 64 | enum { |
madcowswe | 0:feb4117d16d8 | 65 | ops = Size |
madcowswe | 0:feb4117d16d8 | 66 | }; |
madcowswe | 0:feb4117d16d8 | 67 | |
madcowswe | 0:feb4117d16d8 | 68 | private: |
madcowswe | 0:feb4117d16d8 | 69 | VectorConstReference(); |
madcowswe | 0:feb4117d16d8 | 70 | VectorConstReference& operator=(const VectorConstReference&); |
madcowswe | 0:feb4117d16d8 | 71 | |
madcowswe | 0:feb4117d16d8 | 72 | public: |
madcowswe | 0:feb4117d16d8 | 73 | /** Constructor. */ |
madcowswe | 0:feb4117d16d8 | 74 | explicit VectorConstReference(const Vector<T, Size>& rhs) |
madcowswe | 0:feb4117d16d8 | 75 | : m_data(rhs.data()) |
madcowswe | 0:feb4117d16d8 | 76 | { } |
madcowswe | 0:feb4117d16d8 | 77 | |
madcowswe | 0:feb4117d16d8 | 78 | /** Constructor by a given memory pointer. */ |
madcowswe | 0:feb4117d16d8 | 79 | explicit VectorConstReference(const_pointer data) |
madcowswe | 0:feb4117d16d8 | 80 | : m_data(data) |
madcowswe | 0:feb4117d16d8 | 81 | { } |
madcowswe | 0:feb4117d16d8 | 82 | |
madcowswe | 0:feb4117d16d8 | 83 | public: // access operators |
madcowswe | 0:feb4117d16d8 | 84 | /** access by index. */ |
madcowswe | 0:feb4117d16d8 | 85 | value_type operator()(std::size_t i) const { |
madcowswe | 0:feb4117d16d8 | 86 | TVMET_RT_CONDITION(i < Size, "VectorConstReference Bounce Violation") |
madcowswe | 0:feb4117d16d8 | 87 | return m_data[i]; |
madcowswe | 0:feb4117d16d8 | 88 | } |
madcowswe | 0:feb4117d16d8 | 89 | |
madcowswe | 0:feb4117d16d8 | 90 | public: // debugging Xpr parse tree |
madcowswe | 0:feb4117d16d8 | 91 | void print_xpr(std::ostream& os, std::size_t l=0) const { |
madcowswe | 0:feb4117d16d8 | 92 | os << IndentLevel(l) |
madcowswe | 0:feb4117d16d8 | 93 | << "VectorConstReference[O=" << ops << "]<" |
madcowswe | 0:feb4117d16d8 | 94 | << "T=" << typeid(T).name() << ">," |
madcowswe | 0:feb4117d16d8 | 95 | << std::endl; |
madcowswe | 0:feb4117d16d8 | 96 | } |
madcowswe | 0:feb4117d16d8 | 97 | |
madcowswe | 0:feb4117d16d8 | 98 | private: |
madcowswe | 0:feb4117d16d8 | 99 | const_pointer _tvmet_restrict m_data; |
madcowswe | 0:feb4117d16d8 | 100 | }; |
madcowswe | 0:feb4117d16d8 | 101 | |
madcowswe | 0:feb4117d16d8 | 102 | |
madcowswe | 0:feb4117d16d8 | 103 | /** |
madcowswe | 0:feb4117d16d8 | 104 | * \class Vector Vector.h "tvmet/Vector.h" |
madcowswe | 0:feb4117d16d8 | 105 | * \brief Compile time fixed length vector with evaluation on compile time. |
madcowswe | 0:feb4117d16d8 | 106 | */ |
madcowswe | 0:feb4117d16d8 | 107 | template<class T, std::size_t Sz> |
madcowswe | 0:feb4117d16d8 | 108 | class Vector |
madcowswe | 0:feb4117d16d8 | 109 | { |
madcowswe | 0:feb4117d16d8 | 110 | public: |
madcowswe | 0:feb4117d16d8 | 111 | /** Data type of the tvmet::Vector. */ |
madcowswe | 0:feb4117d16d8 | 112 | typedef T value_type; |
madcowswe | 0:feb4117d16d8 | 113 | |
madcowswe | 0:feb4117d16d8 | 114 | /** Reference type of the tvmet::Vector data elements. */ |
madcowswe | 0:feb4117d16d8 | 115 | typedef T& reference; |
madcowswe | 0:feb4117d16d8 | 116 | |
madcowswe | 0:feb4117d16d8 | 117 | /** const reference type of the tvmet::Vector data elements. */ |
madcowswe | 0:feb4117d16d8 | 118 | typedef const T& const_reference; |
madcowswe | 0:feb4117d16d8 | 119 | |
madcowswe | 0:feb4117d16d8 | 120 | /** STL iterator interface. */ |
madcowswe | 0:feb4117d16d8 | 121 | typedef T* iterator; |
madcowswe | 0:feb4117d16d8 | 122 | |
madcowswe | 0:feb4117d16d8 | 123 | /** STL const_iterator interface. */ |
madcowswe | 0:feb4117d16d8 | 124 | typedef const T* const_iterator; |
madcowswe | 0:feb4117d16d8 | 125 | |
madcowswe | 0:feb4117d16d8 | 126 | /** STL reverse iterator interface. */ |
madcowswe | 0:feb4117d16d8 | 127 | typedef std::reverse_iterator<iterator> reverse_iterator; |
madcowswe | 0:feb4117d16d8 | 128 | |
madcowswe | 0:feb4117d16d8 | 129 | /** STL const reverse iterator interface. */ |
madcowswe | 0:feb4117d16d8 | 130 | typedef std::reverse_iterator<const_iterator> const_reverse_iterator; |
madcowswe | 0:feb4117d16d8 | 131 | |
madcowswe | 0:feb4117d16d8 | 132 | public: |
madcowswe | 0:feb4117d16d8 | 133 | /** Dimensions. */ |
madcowswe | 0:feb4117d16d8 | 134 | enum { |
madcowswe | 0:feb4117d16d8 | 135 | Size = Sz /**< The size of the vector. */ |
madcowswe | 0:feb4117d16d8 | 136 | }; |
madcowswe | 0:feb4117d16d8 | 137 | |
madcowswe | 0:feb4117d16d8 | 138 | public: |
madcowswe | 0:feb4117d16d8 | 139 | /** Complexity counter. */ |
madcowswe | 0:feb4117d16d8 | 140 | enum { |
madcowswe | 0:feb4117d16d8 | 141 | ops_assign = Size, |
madcowswe | 0:feb4117d16d8 | 142 | ops = ops_assign, |
madcowswe | 0:feb4117d16d8 | 143 | use_meta = ops < TVMET_COMPLEXITY_V_ASSIGN_TRIGGER ? true : false |
madcowswe | 0:feb4117d16d8 | 144 | }; |
madcowswe | 0:feb4117d16d8 | 145 | |
madcowswe | 0:feb4117d16d8 | 146 | public: // STL interface |
madcowswe | 0:feb4117d16d8 | 147 | /** STL iterator interface. */ |
madcowswe | 0:feb4117d16d8 | 148 | iterator begin() { return m_data; } |
madcowswe | 0:feb4117d16d8 | 149 | |
madcowswe | 0:feb4117d16d8 | 150 | /** STL iterator interface. */ |
madcowswe | 0:feb4117d16d8 | 151 | iterator end() { return m_data + Size; } |
madcowswe | 0:feb4117d16d8 | 152 | |
madcowswe | 0:feb4117d16d8 | 153 | /** STL const_iterator interface. */ |
madcowswe | 0:feb4117d16d8 | 154 | const_iterator begin() const { return m_data; } |
madcowswe | 0:feb4117d16d8 | 155 | |
madcowswe | 0:feb4117d16d8 | 156 | /** STL const_iterator interface. */ |
madcowswe | 0:feb4117d16d8 | 157 | const_iterator end() const { return m_data + Size; } |
madcowswe | 0:feb4117d16d8 | 158 | |
madcowswe | 0:feb4117d16d8 | 159 | /** STL reverse iterator interface reverse begin. */ |
madcowswe | 0:feb4117d16d8 | 160 | reverse_iterator rbegin() { return reverse_iterator( end() ); } |
madcowswe | 0:feb4117d16d8 | 161 | |
madcowswe | 0:feb4117d16d8 | 162 | /** STL const reverse iterator interface reverse begin. */ |
madcowswe | 0:feb4117d16d8 | 163 | const_reverse_iterator rbegin() const { |
madcowswe | 0:feb4117d16d8 | 164 | return const_reverse_iterator( end() ); |
madcowswe | 0:feb4117d16d8 | 165 | } |
madcowswe | 0:feb4117d16d8 | 166 | |
madcowswe | 0:feb4117d16d8 | 167 | /** STL reverse iterator interface reverse end. */ |
madcowswe | 0:feb4117d16d8 | 168 | reverse_iterator rend() { return reverse_iterator( begin() ); } |
madcowswe | 0:feb4117d16d8 | 169 | |
madcowswe | 0:feb4117d16d8 | 170 | /** STL const reverse iterator interface reverse end. */ |
madcowswe | 0:feb4117d16d8 | 171 | const_reverse_iterator rend() const { |
madcowswe | 0:feb4117d16d8 | 172 | return const_reverse_iterator( begin() ); |
madcowswe | 0:feb4117d16d8 | 173 | } |
madcowswe | 0:feb4117d16d8 | 174 | |
madcowswe | 0:feb4117d16d8 | 175 | /** STL vector front element. */ |
madcowswe | 0:feb4117d16d8 | 176 | value_type front() { return m_data[0]; } |
madcowswe | 0:feb4117d16d8 | 177 | |
madcowswe | 0:feb4117d16d8 | 178 | /** STL vector const front element. */ |
madcowswe | 0:feb4117d16d8 | 179 | const_reference front() const { return m_data[0]; } |
madcowswe | 0:feb4117d16d8 | 180 | |
madcowswe | 0:feb4117d16d8 | 181 | /** STL vector back element. */ |
madcowswe | 0:feb4117d16d8 | 182 | value_type back() { return m_data[Size-1]; } |
madcowswe | 0:feb4117d16d8 | 183 | |
madcowswe | 0:feb4117d16d8 | 184 | /** STL vector const back element. */ |
madcowswe | 0:feb4117d16d8 | 185 | const_reference back() const { return m_data[Size-1]; } |
madcowswe | 0:feb4117d16d8 | 186 | |
madcowswe | 0:feb4117d16d8 | 187 | /** STL vector empty() - returns allways false. */ |
madcowswe | 0:feb4117d16d8 | 188 | static bool empty() { return false; } |
madcowswe | 0:feb4117d16d8 | 189 | |
madcowswe | 0:feb4117d16d8 | 190 | /** The size of the vector. */ |
madcowswe | 0:feb4117d16d8 | 191 | static std::size_t size() { return Size; } |
madcowswe | 0:feb4117d16d8 | 192 | |
madcowswe | 0:feb4117d16d8 | 193 | /** STL vector max_size() - returns allways Size. */ |
madcowswe | 0:feb4117d16d8 | 194 | static std::size_t max_size() { return Size; } |
madcowswe | 0:feb4117d16d8 | 195 | |
madcowswe | 0:feb4117d16d8 | 196 | public: |
madcowswe | 0:feb4117d16d8 | 197 | /** Default Destructor */ |
madcowswe | 0:feb4117d16d8 | 198 | ~Vector() { |
madcowswe | 0:feb4117d16d8 | 199 | #if defined(TVMET_DYNAMIC_MEMORY) |
madcowswe | 0:feb4117d16d8 | 200 | delete [] m_data; |
madcowswe | 0:feb4117d16d8 | 201 | #endif |
madcowswe | 0:feb4117d16d8 | 202 | } |
madcowswe | 0:feb4117d16d8 | 203 | |
madcowswe | 0:feb4117d16d8 | 204 | /** Default Constructor. The allocated memory region isn't cleared. If you want |
madcowswe | 0:feb4117d16d8 | 205 | a clean use the constructor argument zero. */ |
madcowswe | 0:feb4117d16d8 | 206 | explicit Vector() |
madcowswe | 0:feb4117d16d8 | 207 | #if defined(TVMET_DYNAMIC_MEMORY) |
madcowswe | 0:feb4117d16d8 | 208 | : m_data( new value_type[Size] ) |
madcowswe | 0:feb4117d16d8 | 209 | #endif |
madcowswe | 0:feb4117d16d8 | 210 | { } |
madcowswe | 0:feb4117d16d8 | 211 | |
madcowswe | 0:feb4117d16d8 | 212 | /** Copy Constructor, not explicit! */ |
madcowswe | 0:feb4117d16d8 | 213 | Vector(const Vector& rhs) |
madcowswe | 0:feb4117d16d8 | 214 | #if defined(TVMET_DYNAMIC_MEMORY) |
madcowswe | 0:feb4117d16d8 | 215 | : m_data( new value_type[Size] ) |
madcowswe | 0:feb4117d16d8 | 216 | #endif |
madcowswe | 0:feb4117d16d8 | 217 | { |
madcowswe | 0:feb4117d16d8 | 218 | *this = XprVector<ConstReference, Size>(rhs.const_ref()); |
madcowswe | 0:feb4117d16d8 | 219 | } |
madcowswe | 0:feb4117d16d8 | 220 | |
madcowswe | 0:feb4117d16d8 | 221 | /** |
madcowswe | 0:feb4117d16d8 | 222 | * Constructor with STL iterator interface. The data will be copied into the |
madcowswe | 0:feb4117d16d8 | 223 | * vector self, there isn't any stored reference to the array pointer. |
madcowswe | 0:feb4117d16d8 | 224 | */ |
madcowswe | 0:feb4117d16d8 | 225 | template<class InputIterator> |
madcowswe | 0:feb4117d16d8 | 226 | explicit Vector(InputIterator first, InputIterator last) |
madcowswe | 0:feb4117d16d8 | 227 | #if defined(TVMET_DYNAMIC_MEMORY) |
madcowswe | 0:feb4117d16d8 | 228 | : m_data( new value_type[Size] ) |
madcowswe | 0:feb4117d16d8 | 229 | #endif |
madcowswe | 0:feb4117d16d8 | 230 | { |
madcowswe | 0:feb4117d16d8 | 231 | TVMET_RT_CONDITION( static_cast<std::size_t>(std::distance(first, last)) <= Size, |
madcowswe | 0:feb4117d16d8 | 232 | "InputIterator doesn't fits in size" ) |
madcowswe | 0:feb4117d16d8 | 233 | std::copy(first, last, m_data); |
madcowswe | 0:feb4117d16d8 | 234 | } |
madcowswe | 0:feb4117d16d8 | 235 | |
madcowswe | 0:feb4117d16d8 | 236 | /** |
madcowswe | 0:feb4117d16d8 | 237 | * Constructor with STL iterator interface. The data will be copied into the |
madcowswe | 0:feb4117d16d8 | 238 | * vector self, there isn't any stored reference to the array pointer. |
madcowswe | 0:feb4117d16d8 | 239 | */ |
madcowswe | 0:feb4117d16d8 | 240 | template<class InputIterator> |
madcowswe | 0:feb4117d16d8 | 241 | explicit Vector(InputIterator first, std::size_t sz) |
madcowswe | 0:feb4117d16d8 | 242 | #if defined(TVMET_DYNAMIC_MEMORY) |
madcowswe | 0:feb4117d16d8 | 243 | : m_data( new value_type[Size] ) |
madcowswe | 0:feb4117d16d8 | 244 | #endif |
madcowswe | 0:feb4117d16d8 | 245 | { |
madcowswe | 0:feb4117d16d8 | 246 | TVMET_RT_CONDITION( sz <= Size, "InputIterator doesn't fits in size" ) |
madcowswe | 0:feb4117d16d8 | 247 | std::copy(first, first + sz, m_data); |
madcowswe | 0:feb4117d16d8 | 248 | } |
madcowswe | 0:feb4117d16d8 | 249 | |
madcowswe | 0:feb4117d16d8 | 250 | /** Constructor with initializer for all elements. */ |
madcowswe | 0:feb4117d16d8 | 251 | explicit Vector(value_type rhs) |
madcowswe | 0:feb4117d16d8 | 252 | #if defined(TVMET_DYNAMIC_MEMORY) |
madcowswe | 0:feb4117d16d8 | 253 | : m_data( new value_type[Size] ) |
madcowswe | 0:feb4117d16d8 | 254 | #endif |
madcowswe | 0:feb4117d16d8 | 255 | { |
madcowswe | 0:feb4117d16d8 | 256 | typedef XprLiteral<value_type> expr_type; |
madcowswe | 0:feb4117d16d8 | 257 | *this = XprVector<expr_type, Size>(expr_type(rhs)); |
madcowswe | 0:feb4117d16d8 | 258 | } |
madcowswe | 0:feb4117d16d8 | 259 | |
madcowswe | 0:feb4117d16d8 | 260 | /** Default Constructor with initializer list. */ |
madcowswe | 0:feb4117d16d8 | 261 | explicit Vector(value_type x0, value_type x1) |
madcowswe | 0:feb4117d16d8 | 262 | #if defined(TVMET_DYNAMIC_MEMORY) |
madcowswe | 0:feb4117d16d8 | 263 | : m_data( new value_type[Size] ) |
madcowswe | 0:feb4117d16d8 | 264 | #endif |
madcowswe | 0:feb4117d16d8 | 265 | { |
madcowswe | 0:feb4117d16d8 | 266 | TVMET_CT_CONDITION(2 <= Size, ArgumentList_is_too_long) |
madcowswe | 0:feb4117d16d8 | 267 | m_data[0] = x0; m_data[1] = x1; |
madcowswe | 0:feb4117d16d8 | 268 | } |
madcowswe | 0:feb4117d16d8 | 269 | |
madcowswe | 0:feb4117d16d8 | 270 | /** Default Constructor with initializer list. */ |
madcowswe | 0:feb4117d16d8 | 271 | explicit Vector(value_type x0, value_type x1, value_type x2) |
madcowswe | 0:feb4117d16d8 | 272 | #if defined(TVMET_DYNAMIC_MEMORY) |
madcowswe | 0:feb4117d16d8 | 273 | : m_data( new value_type[Size] ) |
madcowswe | 0:feb4117d16d8 | 274 | #endif |
madcowswe | 0:feb4117d16d8 | 275 | { |
madcowswe | 0:feb4117d16d8 | 276 | TVMET_CT_CONDITION(3 <= Size, ArgumentList_is_too_long) |
madcowswe | 0:feb4117d16d8 | 277 | m_data[0] = x0; m_data[1] = x1; m_data[2] = x2; |
madcowswe | 0:feb4117d16d8 | 278 | } |
madcowswe | 0:feb4117d16d8 | 279 | |
madcowswe | 0:feb4117d16d8 | 280 | /** Default Constructor with initializer list. */ |
madcowswe | 0:feb4117d16d8 | 281 | explicit Vector(value_type x0, value_type x1, value_type x2, value_type x3) |
madcowswe | 0:feb4117d16d8 | 282 | #if defined(TVMET_DYNAMIC_MEMORY) |
madcowswe | 0:feb4117d16d8 | 283 | : m_data( new value_type[Size] ) |
madcowswe | 0:feb4117d16d8 | 284 | #endif |
madcowswe | 0:feb4117d16d8 | 285 | { |
madcowswe | 0:feb4117d16d8 | 286 | TVMET_CT_CONDITION(4 <= Size, ArgumentList_is_too_long) |
madcowswe | 0:feb4117d16d8 | 287 | m_data[0] = x0; m_data[1] = x1; m_data[2] = x2; m_data[3] = x3; |
madcowswe | 0:feb4117d16d8 | 288 | } |
madcowswe | 0:feb4117d16d8 | 289 | |
madcowswe | 0:feb4117d16d8 | 290 | /** Default Constructor with initializer list. */ |
madcowswe | 0:feb4117d16d8 | 291 | explicit Vector(value_type x0, value_type x1, value_type x2, value_type x3, |
madcowswe | 0:feb4117d16d8 | 292 | value_type x4) |
madcowswe | 0:feb4117d16d8 | 293 | #if defined(TVMET_DYNAMIC_MEMORY) |
madcowswe | 0:feb4117d16d8 | 294 | : m_data( new value_type[Size] ) |
madcowswe | 0:feb4117d16d8 | 295 | #endif |
madcowswe | 0:feb4117d16d8 | 296 | { |
madcowswe | 0:feb4117d16d8 | 297 | TVMET_CT_CONDITION(5 <= Size, ArgumentList_is_too_long) |
madcowswe | 0:feb4117d16d8 | 298 | m_data[0] = x0; m_data[1] = x1; m_data[2] = x2; m_data[3] = x3; m_data[4] = x4; |
madcowswe | 0:feb4117d16d8 | 299 | } |
madcowswe | 0:feb4117d16d8 | 300 | |
madcowswe | 0:feb4117d16d8 | 301 | /** Default Constructor with initializer list. */ |
madcowswe | 0:feb4117d16d8 | 302 | explicit Vector(value_type x0, value_type x1, value_type x2, value_type x3, |
madcowswe | 0:feb4117d16d8 | 303 | value_type x4, value_type x5) |
madcowswe | 0:feb4117d16d8 | 304 | #if defined(TVMET_DYNAMIC_MEMORY) |
madcowswe | 0:feb4117d16d8 | 305 | : m_data( new value_type[Size] ) |
madcowswe | 0:feb4117d16d8 | 306 | #endif |
madcowswe | 0:feb4117d16d8 | 307 | { |
madcowswe | 0:feb4117d16d8 | 308 | TVMET_CT_CONDITION(6 <= Size, ArgumentList_is_too_long) |
madcowswe | 0:feb4117d16d8 | 309 | m_data[0] = x0; m_data[1] = x1; m_data[2] = x2; m_data[3] = x3; m_data[4] = x4; |
madcowswe | 0:feb4117d16d8 | 310 | m_data[5] = x5; |
madcowswe | 0:feb4117d16d8 | 311 | } |
madcowswe | 0:feb4117d16d8 | 312 | |
madcowswe | 0:feb4117d16d8 | 313 | /** Default Constructor with initializer list. */ |
madcowswe | 0:feb4117d16d8 | 314 | explicit Vector(value_type x0, value_type x1, value_type x2, value_type x3, |
madcowswe | 0:feb4117d16d8 | 315 | value_type x4, value_type x5, value_type x6) |
madcowswe | 0:feb4117d16d8 | 316 | #if defined(TVMET_DYNAMIC_MEMORY) |
madcowswe | 0:feb4117d16d8 | 317 | : m_data( new value_type[Size] ) |
madcowswe | 0:feb4117d16d8 | 318 | #endif |
madcowswe | 0:feb4117d16d8 | 319 | { |
madcowswe | 0:feb4117d16d8 | 320 | TVMET_CT_CONDITION(7 <= Size, ArgumentList_is_too_long) |
madcowswe | 0:feb4117d16d8 | 321 | m_data[0] = x0; m_data[1] = x1; m_data[2] = x2; m_data[3] = x3; m_data[4] = x4; |
madcowswe | 0:feb4117d16d8 | 322 | m_data[5] = x5; m_data[6] = x6; |
madcowswe | 0:feb4117d16d8 | 323 | } |
madcowswe | 0:feb4117d16d8 | 324 | |
madcowswe | 0:feb4117d16d8 | 325 | /** Default Constructor with initializer list. */ |
madcowswe | 0:feb4117d16d8 | 326 | explicit Vector(value_type x0, value_type x1, value_type x2, value_type x3, |
madcowswe | 0:feb4117d16d8 | 327 | value_type x4, value_type x5, value_type x6, value_type x7) |
madcowswe | 0:feb4117d16d8 | 328 | #if defined(TVMET_DYNAMIC_MEMORY) |
madcowswe | 0:feb4117d16d8 | 329 | : m_data( new value_type[Size] ) |
madcowswe | 0:feb4117d16d8 | 330 | #endif |
madcowswe | 0:feb4117d16d8 | 331 | { |
madcowswe | 0:feb4117d16d8 | 332 | TVMET_CT_CONDITION(8 <= Size, ArgumentList_is_too_long) |
madcowswe | 0:feb4117d16d8 | 333 | m_data[0] = x0; m_data[1] = x1; m_data[2] = x2; m_data[3] = x3; m_data[4] = x4; |
madcowswe | 0:feb4117d16d8 | 334 | m_data[5] = x5; m_data[6] = x6; m_data[7] = x7; |
madcowswe | 0:feb4117d16d8 | 335 | } |
madcowswe | 0:feb4117d16d8 | 336 | |
madcowswe | 0:feb4117d16d8 | 337 | /** Default Constructor with initializer list. */ |
madcowswe | 0:feb4117d16d8 | 338 | explicit Vector(value_type x0, value_type x1, value_type x2, value_type x3, |
madcowswe | 0:feb4117d16d8 | 339 | value_type x4, value_type x5, value_type x6, value_type x7, |
madcowswe | 0:feb4117d16d8 | 340 | value_type x8) |
madcowswe | 0:feb4117d16d8 | 341 | #if defined(TVMET_DYNAMIC_MEMORY) |
madcowswe | 0:feb4117d16d8 | 342 | : m_data( new value_type[Size] ) |
madcowswe | 0:feb4117d16d8 | 343 | #endif |
madcowswe | 0:feb4117d16d8 | 344 | { |
madcowswe | 0:feb4117d16d8 | 345 | TVMET_CT_CONDITION(9 <= Size, ArgumentList_is_too_long) |
madcowswe | 0:feb4117d16d8 | 346 | m_data[0] = x0; m_data[1] = x1; m_data[2] = x2; m_data[3] = x3; m_data[4] = x4; |
madcowswe | 0:feb4117d16d8 | 347 | m_data[5] = x5; m_data[6] = x6; m_data[7] = x7; m_data[8] = x8; |
madcowswe | 0:feb4117d16d8 | 348 | } |
madcowswe | 0:feb4117d16d8 | 349 | |
madcowswe | 0:feb4117d16d8 | 350 | /** Default Constructor with initializer list. */ |
madcowswe | 0:feb4117d16d8 | 351 | explicit Vector(value_type x0, value_type x1, value_type x2, value_type x3, |
madcowswe | 0:feb4117d16d8 | 352 | value_type x4, value_type x5, value_type x6, value_type x7, |
madcowswe | 0:feb4117d16d8 | 353 | value_type x8, value_type x9) |
madcowswe | 0:feb4117d16d8 | 354 | #if defined(TVMET_DYNAMIC_MEMORY) |
madcowswe | 0:feb4117d16d8 | 355 | : m_data( new value_type[Size] ) |
madcowswe | 0:feb4117d16d8 | 356 | #endif |
madcowswe | 0:feb4117d16d8 | 357 | { |
madcowswe | 0:feb4117d16d8 | 358 | TVMET_CT_CONDITION(10 <= Size, ArgumentList_is_too_long) |
madcowswe | 0:feb4117d16d8 | 359 | m_data[0] = x0; m_data[1] = x1; m_data[2] = x2; m_data[3] = x3; m_data[4] = x4; |
madcowswe | 0:feb4117d16d8 | 360 | m_data[5] = x5; m_data[6] = x6; m_data[7] = x7; m_data[8] = x8; m_data[9] = x9; |
madcowswe | 0:feb4117d16d8 | 361 | } |
madcowswe | 0:feb4117d16d8 | 362 | |
madcowswe | 0:feb4117d16d8 | 363 | /** Construct a vector by expression. */ |
madcowswe | 0:feb4117d16d8 | 364 | template <class E> |
madcowswe | 0:feb4117d16d8 | 365 | explicit Vector(const XprVector<E, Size>& e) |
madcowswe | 0:feb4117d16d8 | 366 | #if defined(TVMET_DYNAMIC_MEMORY) |
madcowswe | 0:feb4117d16d8 | 367 | : m_data( new value_type[Size] ) |
madcowswe | 0:feb4117d16d8 | 368 | #endif |
madcowswe | 0:feb4117d16d8 | 369 | { |
madcowswe | 0:feb4117d16d8 | 370 | *this = e; |
madcowswe | 0:feb4117d16d8 | 371 | } |
madcowswe | 0:feb4117d16d8 | 372 | |
madcowswe | 0:feb4117d16d8 | 373 | /** Assign a value_type on array, this can be used for a single value |
madcowswe | 0:feb4117d16d8 | 374 | or a comma separeted list of values. */ |
madcowswe | 0:feb4117d16d8 | 375 | CommaInitializer<Vector, Size> operator=(value_type rhs) { |
madcowswe | 0:feb4117d16d8 | 376 | return CommaInitializer<Vector, Size>(*this, rhs); |
madcowswe | 0:feb4117d16d8 | 377 | } |
madcowswe | 0:feb4117d16d8 | 378 | |
madcowswe | 0:feb4117d16d8 | 379 | public: // access operators |
madcowswe | 0:feb4117d16d8 | 380 | value_type* _tvmet_restrict data() { return m_data; } |
madcowswe | 0:feb4117d16d8 | 381 | const value_type* _tvmet_restrict data() const { return m_data; } |
madcowswe | 0:feb4117d16d8 | 382 | |
madcowswe | 0:feb4117d16d8 | 383 | public: // index access operators |
madcowswe | 0:feb4117d16d8 | 384 | value_type& _tvmet_restrict operator()(std::size_t i) { |
madcowswe | 0:feb4117d16d8 | 385 | // Note: g++-2.95.3 does have problems on typedef reference |
madcowswe | 0:feb4117d16d8 | 386 | TVMET_RT_CONDITION(i < Size, "Vector Bounce Violation") |
madcowswe | 0:feb4117d16d8 | 387 | return m_data[i]; |
madcowswe | 0:feb4117d16d8 | 388 | } |
madcowswe | 0:feb4117d16d8 | 389 | |
madcowswe | 0:feb4117d16d8 | 390 | value_type operator()(std::size_t i) const { |
madcowswe | 0:feb4117d16d8 | 391 | TVMET_RT_CONDITION(i < Size, "Vector Bounce Violation") |
madcowswe | 0:feb4117d16d8 | 392 | return m_data[i]; |
madcowswe | 0:feb4117d16d8 | 393 | } |
madcowswe | 0:feb4117d16d8 | 394 | |
madcowswe | 0:feb4117d16d8 | 395 | value_type& _tvmet_restrict operator[](std::size_t i) { |
madcowswe | 0:feb4117d16d8 | 396 | // Note: g++-2.95.3 does have problems on typedef reference |
madcowswe | 0:feb4117d16d8 | 397 | return this->operator()(i); |
madcowswe | 0:feb4117d16d8 | 398 | } |
madcowswe | 0:feb4117d16d8 | 399 | |
madcowswe | 0:feb4117d16d8 | 400 | value_type operator[](std::size_t i) const { |
madcowswe | 0:feb4117d16d8 | 401 | return this->operator()(i); |
madcowswe | 0:feb4117d16d8 | 402 | } |
madcowswe | 0:feb4117d16d8 | 403 | |
madcowswe | 0:feb4117d16d8 | 404 | public: // ET interface |
madcowswe | 0:feb4117d16d8 | 405 | typedef VectorConstReference<T, Size> ConstReference; |
madcowswe | 0:feb4117d16d8 | 406 | |
madcowswe | 0:feb4117d16d8 | 407 | /** Return a const Reference of the internal data */ |
madcowswe | 0:feb4117d16d8 | 408 | ConstReference const_ref() const { return ConstReference(*this); } |
madcowswe | 0:feb4117d16d8 | 409 | |
madcowswe | 0:feb4117d16d8 | 410 | /** Return the vector as const expression. */ |
madcowswe | 0:feb4117d16d8 | 411 | XprVector<ConstReference, Size> as_expr() const { |
madcowswe | 0:feb4117d16d8 | 412 | return XprVector<ConstReference, Size>(this->const_ref()); |
madcowswe | 0:feb4117d16d8 | 413 | } |
madcowswe | 0:feb4117d16d8 | 414 | |
madcowswe | 0:feb4117d16d8 | 415 | private: |
madcowswe | 0:feb4117d16d8 | 416 | /** Wrapper for meta assign. */ |
madcowswe | 0:feb4117d16d8 | 417 | template<class Dest, class Src, class Assign> |
madcowswe | 0:feb4117d16d8 | 418 | static inline |
madcowswe | 0:feb4117d16d8 | 419 | void do_assign(dispatch<true>, Dest& dest, const Src& src, const Assign& assign_fn) { |
madcowswe | 0:feb4117d16d8 | 420 | meta::Vector<Size, 0>::assign(dest, src, assign_fn); |
madcowswe | 0:feb4117d16d8 | 421 | } |
madcowswe | 0:feb4117d16d8 | 422 | |
madcowswe | 0:feb4117d16d8 | 423 | /** Wrapper for loop assign. */ |
madcowswe | 0:feb4117d16d8 | 424 | template<class Dest, class Src, class Assign> |
madcowswe | 0:feb4117d16d8 | 425 | static inline |
madcowswe | 0:feb4117d16d8 | 426 | void do_assign(dispatch<false>, Dest& dest, const Src& src, const Assign& assign_fn) { |
madcowswe | 0:feb4117d16d8 | 427 | loop::Vector<Size>::assign(dest, src, assign_fn); |
madcowswe | 0:feb4117d16d8 | 428 | } |
madcowswe | 0:feb4117d16d8 | 429 | |
madcowswe | 0:feb4117d16d8 | 430 | public: |
madcowswe | 0:feb4117d16d8 | 431 | /** assign this to a vector expression using the functional assign_fn. */ |
madcowswe | 0:feb4117d16d8 | 432 | template<class T2, class Assign> |
madcowswe | 0:feb4117d16d8 | 433 | void assign_to(Vector<T2, Size>& dest, const Assign& assign_fn) const { |
madcowswe | 0:feb4117d16d8 | 434 | do_assign(dispatch<use_meta>(), dest, *this, assign_fn); |
madcowswe | 0:feb4117d16d8 | 435 | } |
madcowswe | 0:feb4117d16d8 | 436 | |
madcowswe | 0:feb4117d16d8 | 437 | public: // assign operations |
madcowswe | 0:feb4117d16d8 | 438 | /** assign a given Vector element wise to this vector. |
madcowswe | 0:feb4117d16d8 | 439 | The operator=(const Vector&) is compiler generated. */ |
madcowswe | 0:feb4117d16d8 | 440 | template<class T2> |
madcowswe | 0:feb4117d16d8 | 441 | Vector& operator=(const Vector<T2, Size>& rhs) { |
madcowswe | 0:feb4117d16d8 | 442 | rhs.assign_to(*this, Fcnl_assign<value_type, T2>()); |
madcowswe | 0:feb4117d16d8 | 443 | return *this; |
madcowswe | 0:feb4117d16d8 | 444 | } |
madcowswe | 0:feb4117d16d8 | 445 | |
madcowswe | 0:feb4117d16d8 | 446 | /** assign a given XprVector element wise to this vector. */ |
madcowswe | 0:feb4117d16d8 | 447 | template<class E> |
madcowswe | 0:feb4117d16d8 | 448 | Vector& operator=(const XprVector<E, Size>& rhs) { |
madcowswe | 0:feb4117d16d8 | 449 | rhs.assign_to(*this, Fcnl_assign<value_type, typename E::value_type>()); |
madcowswe | 0:feb4117d16d8 | 450 | return *this; |
madcowswe | 0:feb4117d16d8 | 451 | } |
madcowswe | 0:feb4117d16d8 | 452 | |
madcowswe | 0:feb4117d16d8 | 453 | private: |
madcowswe | 0:feb4117d16d8 | 454 | template<class Obj, std::size_t LEN> friend class CommaInitializer; |
madcowswe | 0:feb4117d16d8 | 455 | |
madcowswe | 0:feb4117d16d8 | 456 | /** This is a helper for assigning a comma separated initializer |
madcowswe | 0:feb4117d16d8 | 457 | list. It's equal to Vector& operator=(value_type) which does |
madcowswe | 0:feb4117d16d8 | 458 | replace it. */ |
madcowswe | 0:feb4117d16d8 | 459 | Vector& assign_value(value_type rhs) { |
madcowswe | 0:feb4117d16d8 | 460 | typedef XprLiteral<value_type> expr_type; |
madcowswe | 0:feb4117d16d8 | 461 | *this = XprVector<expr_type, Size>(expr_type(rhs)); |
madcowswe | 0:feb4117d16d8 | 462 | return *this; |
madcowswe | 0:feb4117d16d8 | 463 | } |
madcowswe | 0:feb4117d16d8 | 464 | |
madcowswe | 0:feb4117d16d8 | 465 | public: // math operators with scalars |
madcowswe | 0:feb4117d16d8 | 466 | // NOTE: this meaning is clear - element wise ops even if not in ns element_wise |
madcowswe | 0:feb4117d16d8 | 467 | Vector& operator+=(value_type) TVMET_CXX_ALWAYS_INLINE; |
madcowswe | 0:feb4117d16d8 | 468 | Vector& operator-=(value_type) TVMET_CXX_ALWAYS_INLINE; |
madcowswe | 0:feb4117d16d8 | 469 | Vector& operator*=(value_type) TVMET_CXX_ALWAYS_INLINE; |
madcowswe | 0:feb4117d16d8 | 470 | Vector& operator/=(value_type) TVMET_CXX_ALWAYS_INLINE; |
madcowswe | 0:feb4117d16d8 | 471 | |
madcowswe | 0:feb4117d16d8 | 472 | Vector& operator%=(std::size_t) TVMET_CXX_ALWAYS_INLINE; |
madcowswe | 0:feb4117d16d8 | 473 | Vector& operator^=(std::size_t) TVMET_CXX_ALWAYS_INLINE; |
madcowswe | 0:feb4117d16d8 | 474 | Vector& operator&=(std::size_t) TVMET_CXX_ALWAYS_INLINE; |
madcowswe | 0:feb4117d16d8 | 475 | Vector& operator|=(std::size_t) TVMET_CXX_ALWAYS_INLINE; |
madcowswe | 0:feb4117d16d8 | 476 | Vector& operator<<=(std::size_t) TVMET_CXX_ALWAYS_INLINE; |
madcowswe | 0:feb4117d16d8 | 477 | Vector& operator>>=(std::size_t) TVMET_CXX_ALWAYS_INLINE; |
madcowswe | 0:feb4117d16d8 | 478 | |
madcowswe | 0:feb4117d16d8 | 479 | public: // math assign operators with vectors |
madcowswe | 0:feb4117d16d8 | 480 | // NOTE: access using the operators in ns element_wise, since that's what is does |
madcowswe | 0:feb4117d16d8 | 481 | template <class T2> Vector& M_add_eq(const Vector<T2, Size>&) TVMET_CXX_ALWAYS_INLINE; |
madcowswe | 0:feb4117d16d8 | 482 | template <class T2> Vector& M_sub_eq(const Vector<T2, Size>&) TVMET_CXX_ALWAYS_INLINE; |
madcowswe | 0:feb4117d16d8 | 483 | template <class T2> Vector& M_mul_eq(const Vector<T2, Size>&) TVMET_CXX_ALWAYS_INLINE; |
madcowswe | 0:feb4117d16d8 | 484 | template <class T2> Vector& M_div_eq(const Vector<T2, Size>&) TVMET_CXX_ALWAYS_INLINE; |
madcowswe | 0:feb4117d16d8 | 485 | template <class T2> Vector& M_mod_eq(const Vector<T2, Size>&) TVMET_CXX_ALWAYS_INLINE; |
madcowswe | 0:feb4117d16d8 | 486 | template <class T2> Vector& M_xor_eq(const Vector<T2, Size>&) TVMET_CXX_ALWAYS_INLINE; |
madcowswe | 0:feb4117d16d8 | 487 | template <class T2> Vector& M_and_eq(const Vector<T2, Size>&) TVMET_CXX_ALWAYS_INLINE; |
madcowswe | 0:feb4117d16d8 | 488 | template <class T2> Vector& M_or_eq (const Vector<T2, Size>&) TVMET_CXX_ALWAYS_INLINE; |
madcowswe | 0:feb4117d16d8 | 489 | template <class T2> Vector& M_shl_eq(const Vector<T2, Size>&) TVMET_CXX_ALWAYS_INLINE; |
madcowswe | 0:feb4117d16d8 | 490 | template <class T2> Vector& M_shr_eq(const Vector<T2, Size>&) TVMET_CXX_ALWAYS_INLINE; |
madcowswe | 0:feb4117d16d8 | 491 | |
madcowswe | 0:feb4117d16d8 | 492 | public: // math operators with expressions |
madcowswe | 0:feb4117d16d8 | 493 | // NOTE: access using the operators in ns element_wise, since that's what is does |
madcowswe | 0:feb4117d16d8 | 494 | template <class E> Vector& M_add_eq(const XprVector<E, Size>&) TVMET_CXX_ALWAYS_INLINE; |
madcowswe | 0:feb4117d16d8 | 495 | template <class E> Vector& M_sub_eq(const XprVector<E, Size>&) TVMET_CXX_ALWAYS_INLINE; |
madcowswe | 0:feb4117d16d8 | 496 | template <class E> Vector& M_mul_eq(const XprVector<E, Size>&) TVMET_CXX_ALWAYS_INLINE; |
madcowswe | 0:feb4117d16d8 | 497 | template <class E> Vector& M_div_eq(const XprVector<E, Size>&) TVMET_CXX_ALWAYS_INLINE; |
madcowswe | 0:feb4117d16d8 | 498 | template <class E> Vector& M_mod_eq(const XprVector<E, Size>&) TVMET_CXX_ALWAYS_INLINE; |
madcowswe | 0:feb4117d16d8 | 499 | template <class E> Vector& M_xor_eq(const XprVector<E, Size>&) TVMET_CXX_ALWAYS_INLINE; |
madcowswe | 0:feb4117d16d8 | 500 | template <class E> Vector& M_and_eq(const XprVector<E, Size>&) TVMET_CXX_ALWAYS_INLINE; |
madcowswe | 0:feb4117d16d8 | 501 | template <class E> Vector& M_or_eq (const XprVector<E, Size>&) TVMET_CXX_ALWAYS_INLINE; |
madcowswe | 0:feb4117d16d8 | 502 | template <class E> Vector& M_shl_eq(const XprVector<E, Size>&) TVMET_CXX_ALWAYS_INLINE; |
madcowswe | 0:feb4117d16d8 | 503 | template <class E> Vector& M_shr_eq(const XprVector<E, Size>&) TVMET_CXX_ALWAYS_INLINE; |
madcowswe | 0:feb4117d16d8 | 504 | |
madcowswe | 0:feb4117d16d8 | 505 | public: // aliased math operators with expressions, used with proxy |
madcowswe | 0:feb4117d16d8 | 506 | template <class T2> Vector& alias_assign(const Vector<T2, Size>&) TVMET_CXX_ALWAYS_INLINE; |
madcowswe | 0:feb4117d16d8 | 507 | template <class T2> Vector& alias_add_eq(const Vector<T2, Size>&) TVMET_CXX_ALWAYS_INLINE; |
madcowswe | 0:feb4117d16d8 | 508 | template <class T2> Vector& alias_sub_eq(const Vector<T2, Size>&) TVMET_CXX_ALWAYS_INLINE; |
madcowswe | 0:feb4117d16d8 | 509 | template <class T2> Vector& alias_mul_eq(const Vector<T2, Size>&) TVMET_CXX_ALWAYS_INLINE; |
madcowswe | 0:feb4117d16d8 | 510 | template <class T2> Vector& alias_div_eq(const Vector<T2, Size>&) TVMET_CXX_ALWAYS_INLINE; |
madcowswe | 0:feb4117d16d8 | 511 | |
madcowswe | 0:feb4117d16d8 | 512 | template <class E> Vector& alias_assign(const XprVector<E, Size>&) TVMET_CXX_ALWAYS_INLINE; |
madcowswe | 0:feb4117d16d8 | 513 | template <class E> Vector& alias_add_eq(const XprVector<E, Size>&) TVMET_CXX_ALWAYS_INLINE; |
madcowswe | 0:feb4117d16d8 | 514 | template <class E> Vector& alias_sub_eq(const XprVector<E, Size>&) TVMET_CXX_ALWAYS_INLINE; |
madcowswe | 0:feb4117d16d8 | 515 | template <class E> Vector& alias_mul_eq(const XprVector<E, Size>&) TVMET_CXX_ALWAYS_INLINE; |
madcowswe | 0:feb4117d16d8 | 516 | template <class E> Vector& alias_div_eq(const XprVector<E, Size>&) TVMET_CXX_ALWAYS_INLINE; |
madcowswe | 0:feb4117d16d8 | 517 | |
madcowswe | 0:feb4117d16d8 | 518 | public: // io |
madcowswe | 0:feb4117d16d8 | 519 | /** Structure for info printing as Vector<T, Size>. */ |
madcowswe | 0:feb4117d16d8 | 520 | struct Info : public TvmetBase<Info> { |
madcowswe | 0:feb4117d16d8 | 521 | std::ostream& print_xpr(std::ostream& os) const { |
madcowswe | 0:feb4117d16d8 | 522 | os << "Vector<T=" << typeid(value_type).name() |
madcowswe | 0:feb4117d16d8 | 523 | << ", Sz=" << Size << ">"; |
madcowswe | 0:feb4117d16d8 | 524 | return os; |
madcowswe | 0:feb4117d16d8 | 525 | } |
madcowswe | 0:feb4117d16d8 | 526 | }; |
madcowswe | 0:feb4117d16d8 | 527 | |
madcowswe | 0:feb4117d16d8 | 528 | /** Get an info object of this vector. */ |
madcowswe | 0:feb4117d16d8 | 529 | static Info info() { return Info(); } |
madcowswe | 0:feb4117d16d8 | 530 | |
madcowswe | 0:feb4117d16d8 | 531 | /** Member function for expression level printing. */ |
madcowswe | 0:feb4117d16d8 | 532 | std::ostream& print_xpr(std::ostream& os, std::size_t l=0) const; |
madcowswe | 0:feb4117d16d8 | 533 | |
madcowswe | 0:feb4117d16d8 | 534 | /** Member function for printing internal data. */ |
madcowswe | 0:feb4117d16d8 | 535 | std::ostream& print_on(std::ostream& os) const; |
madcowswe | 0:feb4117d16d8 | 536 | |
madcowswe | 0:feb4117d16d8 | 537 | private: |
madcowswe | 0:feb4117d16d8 | 538 | /** The data of vector self. */ |
madcowswe | 0:feb4117d16d8 | 539 | |
madcowswe | 0:feb4117d16d8 | 540 | #if defined(TVMET_DYNAMIC_MEMORY) |
madcowswe | 0:feb4117d16d8 | 541 | value_type* m_data; |
madcowswe | 0:feb4117d16d8 | 542 | #else |
madcowswe | 0:feb4117d16d8 | 543 | value_type m_data[Size]; |
madcowswe | 0:feb4117d16d8 | 544 | #endif |
madcowswe | 0:feb4117d16d8 | 545 | }; |
madcowswe | 0:feb4117d16d8 | 546 | |
madcowswe | 0:feb4117d16d8 | 547 | |
madcowswe | 0:feb4117d16d8 | 548 | } // namespace tvmet |
madcowswe | 0:feb4117d16d8 | 549 | |
madcowswe | 0:feb4117d16d8 | 550 | #include <tvmet/VectorImpl.h> |
madcowswe | 0:feb4117d16d8 | 551 | #include <tvmet/VectorFunctions.h> |
madcowswe | 0:feb4117d16d8 | 552 | #include <tvmet/VectorBinaryFunctions.h> |
madcowswe | 0:feb4117d16d8 | 553 | #include <tvmet/VectorUnaryFunctions.h> |
madcowswe | 0:feb4117d16d8 | 554 | #include <tvmet/VectorOperators.h> |
madcowswe | 0:feb4117d16d8 | 555 | #include <tvmet/VectorEval.h> |
madcowswe | 0:feb4117d16d8 | 556 | #include <tvmet/AliasProxy.h> |
madcowswe | 0:feb4117d16d8 | 557 | |
madcowswe | 0:feb4117d16d8 | 558 | #endif // TVMET_VECTOR_H |
madcowswe | 0:feb4117d16d8 | 559 | |
madcowswe | 0:feb4117d16d8 | 560 | // Local Variables: |
madcowswe | 0:feb4117d16d8 | 561 | // mode:C++ |
madcowswe | 0:feb4117d16d8 | 562 | // tab-width:8 |
madcowswe | 0:feb4117d16d8 | 563 | // End: |