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

Committer:
madcowswe
Date:
Wed Mar 28 15:53:45 2012 +0000
Revision:
0:feb4117d16d8

        

Who changed what in which revision?

UserRevisionLine numberNew 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: tvmet.h,v 1.21 2007-06-23 15:58:59 opetzold Exp $
madcowswe 0:feb4117d16d8 22 */
madcowswe 0:feb4117d16d8 23
madcowswe 0:feb4117d16d8 24 #ifndef TVMET_H
madcowswe 0:feb4117d16d8 25 #define TVMET_H
madcowswe 0:feb4117d16d8 26
madcowswe 0:feb4117d16d8 27 #include <tvmet/config.h>
madcowswe 0:feb4117d16d8 28
madcowswe 0:feb4117d16d8 29
madcowswe 0:feb4117d16d8 30 /***********************************************************************
madcowswe 0:feb4117d16d8 31 * Compiler specifics
madcowswe 0:feb4117d16d8 32 ***********************************************************************/
madcowswe 0:feb4117d16d8 33 #if defined(__GNUC__)
madcowswe 0:feb4117d16d8 34 # include <tvmet/config/config-gcc.h>
madcowswe 0:feb4117d16d8 35 #endif
madcowswe 0:feb4117d16d8 36
madcowswe 0:feb4117d16d8 37 #if defined(__ICC)
madcowswe 0:feb4117d16d8 38 # include <tvmet/config/config-icc.h>
madcowswe 0:feb4117d16d8 39 #endif
madcowswe 0:feb4117d16d8 40
madcowswe 0:feb4117d16d8 41 #if defined(__KCC)
madcowswe 0:feb4117d16d8 42 # include <tvmet/config/config-kcc.h>
madcowswe 0:feb4117d16d8 43 #endif
madcowswe 0:feb4117d16d8 44
madcowswe 0:feb4117d16d8 45 #if defined(__PGI)
madcowswe 0:feb4117d16d8 46 # include <tvmet/config/config-pgi.h>
madcowswe 0:feb4117d16d8 47 #endif
madcowswe 0:feb4117d16d8 48
madcowswe 0:feb4117d16d8 49 // vc7.1: 1310 and vc7.0 1300
madcowswe 0:feb4117d16d8 50 #if defined(_MSC_VER) && (_MSC_VER >= 1310)
madcowswe 0:feb4117d16d8 51 # include <tvmet/config/config-vc71.h>
madcowswe 0:feb4117d16d8 52 #endif
madcowswe 0:feb4117d16d8 53
madcowswe 0:feb4117d16d8 54
madcowswe 0:feb4117d16d8 55 // give up for these cases
madcowswe 0:feb4117d16d8 56 #if !defined(TVMET_HAVE_MUTABLE)
madcowswe 0:feb4117d16d8 57 # error "Your compiler doesn't support the mutable keyword! Giving up."
madcowswe 0:feb4117d16d8 58 #endif
madcowswe 0:feb4117d16d8 59
madcowswe 0:feb4117d16d8 60 #if !defined(TVMET_HAVE_TYPENAME)
madcowswe 0:feb4117d16d8 61 # error "Your compiler doesn't support the typename keyword! Giving up."
madcowswe 0:feb4117d16d8 62 #endif
madcowswe 0:feb4117d16d8 63
madcowswe 0:feb4117d16d8 64 #if !defined(TVMET_HAVE_NAMESPACES)
madcowswe 0:feb4117d16d8 65 # error "Your compiler doesn't support the namespace concept! Giving up."
madcowswe 0:feb4117d16d8 66 #endif
madcowswe 0:feb4117d16d8 67
madcowswe 0:feb4117d16d8 68 #if !defined(TVMET_HAVE_PARTIAL_SPECIALIZATION)
madcowswe 0:feb4117d16d8 69 # error "Your compiler doesn't support partial specialization! Giving up."
madcowswe 0:feb4117d16d8 70 #endif
madcowswe 0:feb4117d16d8 71
madcowswe 0:feb4117d16d8 72
madcowswe 0:feb4117d16d8 73 /*
madcowswe 0:feb4117d16d8 74 * other compiler specific stuff
madcowswe 0:feb4117d16d8 75 */
madcowswe 0:feb4117d16d8 76
madcowswe 0:feb4117d16d8 77 /**
madcowswe 0:feb4117d16d8 78 * \def TVMET_CXX_ALWAYS_INLINE
madcowswe 0:feb4117d16d8 79 * \brief Compiler specific stuff to force inline code if supported.
madcowswe 0:feb4117d16d8 80 *
madcowswe 0:feb4117d16d8 81 * Mainly, this declares the functions using g++'s
madcowswe 0:feb4117d16d8 82 * __attribute__((always_inline)). This features is enabled
madcowswe 0:feb4117d16d8 83 * on defined TVMET_OPTIMIZE.
madcowswe 0:feb4117d16d8 84 */
madcowswe 0:feb4117d16d8 85 #if !defined(TVMET_CXX_ALWAYS_INLINE)
madcowswe 0:feb4117d16d8 86 #define TVMET_CXX_ALWAYS_INLINE
madcowswe 0:feb4117d16d8 87 #endif
madcowswe 0:feb4117d16d8 88
madcowswe 0:feb4117d16d8 89
madcowswe 0:feb4117d16d8 90 /*
madcowswe 0:feb4117d16d8 91 * Complexity triggers, compiler and architecture specific.
madcowswe 0:feb4117d16d8 92 * If not defined, use defaults.
madcowswe 0:feb4117d16d8 93 */
madcowswe 0:feb4117d16d8 94
madcowswe 0:feb4117d16d8 95 /**
madcowswe 0:feb4117d16d8 96 * \def TVMET_COMPLEXITY_DEFAULT_TRIGGER
madcowswe 0:feb4117d16d8 97 * \brief Trigger for changing the matrix-product strategy.
madcowswe 0:feb4117d16d8 98 */
madcowswe 0:feb4117d16d8 99 #if !defined(TVMET_COMPLEXITY_DEFAULT_TRIGGER)
madcowswe 0:feb4117d16d8 100 # define TVMET_COMPLEXITY_DEFAULT_TRIGGER 1000
madcowswe 0:feb4117d16d8 101 #endif
madcowswe 0:feb4117d16d8 102
madcowswe 0:feb4117d16d8 103 /**
madcowswe 0:feb4117d16d8 104 * \def TVMET_COMPLEXITY_M_ASSIGN_TRIGGER
madcowswe 0:feb4117d16d8 105 * \brief Trigger for changing the matrix assign strategy.
madcowswe 0:feb4117d16d8 106 */
madcowswe 0:feb4117d16d8 107 #if !defined(TVMET_COMPLEXITY_M_ASSIGN_TRIGGER)
madcowswe 0:feb4117d16d8 108 # define TVMET_COMPLEXITY_M_ASSIGN_TRIGGER 8*8
madcowswe 0:feb4117d16d8 109 #endif
madcowswe 0:feb4117d16d8 110
madcowswe 0:feb4117d16d8 111 /**
madcowswe 0:feb4117d16d8 112 * \def TVMET_COMPLEXITY_MM_TRIGGER
madcowswe 0:feb4117d16d8 113 * \brief Trigger for changing the matrix-matrix-product strategy.
madcowswe 0:feb4117d16d8 114 * One strategy to build the matrix-matrix-product is to use
madcowswe 0:feb4117d16d8 115 * meta templates. The other to use looping.
madcowswe 0:feb4117d16d8 116 */
madcowswe 0:feb4117d16d8 117 #if !defined(TVMET_COMPLEXITY_MM_TRIGGER)
madcowswe 0:feb4117d16d8 118 # define TVMET_COMPLEXITY_MM_TRIGGER 8*8
madcowswe 0:feb4117d16d8 119 #endif
madcowswe 0:feb4117d16d8 120
madcowswe 0:feb4117d16d8 121 /**
madcowswe 0:feb4117d16d8 122 * \def TVMET_COMPLEXITY_V_ASSIGN_TRIGGER
madcowswe 0:feb4117d16d8 123 * \brief Trigger for changing the vector assign strategy.
madcowswe 0:feb4117d16d8 124 */
madcowswe 0:feb4117d16d8 125 #if !defined(TVMET_COMPLEXITY_V_ASSIGN_TRIGGER)
madcowswe 0:feb4117d16d8 126 # define TVMET_COMPLEXITY_V_ASSIGN_TRIGGER 8
madcowswe 0:feb4117d16d8 127 #endif
madcowswe 0:feb4117d16d8 128
madcowswe 0:feb4117d16d8 129 /**
madcowswe 0:feb4117d16d8 130 * \def TVMET_COMPLEXITY_MV_TRIGGER
madcowswe 0:feb4117d16d8 131 * \brief Trigger for changing the matrix-vector strategy.
madcowswe 0:feb4117d16d8 132 * One strategy to build the matrix-vector-product is to use
madcowswe 0:feb4117d16d8 133 * meta templates. The other to use looping.
madcowswe 0:feb4117d16d8 134 */
madcowswe 0:feb4117d16d8 135 #if !defined(TVMET_COMPLEXITY_MV_TRIGGER)
madcowswe 0:feb4117d16d8 136 # define TVMET_COMPLEXITY_MV_TRIGGER 8*8
madcowswe 0:feb4117d16d8 137 #endif
madcowswe 0:feb4117d16d8 138
madcowswe 0:feb4117d16d8 139
madcowswe 0:feb4117d16d8 140 /***********************************************************************
madcowswe 0:feb4117d16d8 141 * other specials
madcowswe 0:feb4117d16d8 142 ***********************************************************************/
madcowswe 0:feb4117d16d8 143 #if defined(TVMET_HAVE_IEEE_MATH)
madcowswe 0:feb4117d16d8 144 # define _ALL_SOURCE
madcowswe 0:feb4117d16d8 145 # if !defined(_XOPEN_SOURCE)
madcowswe 0:feb4117d16d8 146 # define _XOPEN_SOURCE
madcowswe 0:feb4117d16d8 147 # endif
madcowswe 0:feb4117d16d8 148 # if !defined(_XOPEN_SOURCE_EXTENDED)
madcowswe 0:feb4117d16d8 149 # define _XOPEN_SOURCE_EXTENDED
madcowswe 0:feb4117d16d8 150 # endif
madcowswe 0:feb4117d16d8 151 #endif
madcowswe 0:feb4117d16d8 152
madcowswe 0:feb4117d16d8 153
madcowswe 0:feb4117d16d8 154 /**
madcowswe 0:feb4117d16d8 155 * \def TVMET_DEBUG
madcowswe 0:feb4117d16d8 156 * This is defined if <code>DEBUG</code> is defined. This enables runtime error
madcowswe 0:feb4117d16d8 157 * bounds checking. If you compile %tvmet from another source directory
madcowswe 0:feb4117d16d8 158 * which defines <code>DEBUG</code>, then <code>TVMET_DEBUG</code> will be
madcowswe 0:feb4117d16d8 159 * <b>not</b> defined (This behavior differs from release less than 0.6.0).
madcowswe 0:feb4117d16d8 160 */
madcowswe 0:feb4117d16d8 161
madcowswe 0:feb4117d16d8 162
madcowswe 0:feb4117d16d8 163 /**
madcowswe 0:feb4117d16d8 164 * \def TVMET_OPTIMIZE
madcowswe 0:feb4117d16d8 165 * If this is defined tvmet uses some compiler specific keywords.
madcowswe 0:feb4117d16d8 166 * Mainly, this declares the functions using gcc's
madcowswe 0:feb4117d16d8 167 * <tt>__attribute__((always_inline))</tt>. This allows the
madcowswe 0:feb4117d16d8 168 * compiler to produce high efficient code even on less
madcowswe 0:feb4117d16d8 169 * optimization levels, like gcc's -O2 or even -O!
madcowswe 0:feb4117d16d8 170 * This is known to work with gcc v3.3.3 (and higher).
madcowswe 0:feb4117d16d8 171 * Using icc's v8 gnuc compatibility mode this may work, I've read
madcowswe 0:feb4117d16d8 172 * that it's using as an hint, this means you can have static inline
madcowswe 0:feb4117d16d8 173 * functions inside left.
madcowswe 0:feb4117d16d8 174 */
madcowswe 0:feb4117d16d8 175 #if !defined(TVMET_OPTIMIZE)
madcowswe 0:feb4117d16d8 176 # undef TVMET_CXX_ALWAYS_INLINE
madcowswe 0:feb4117d16d8 177 # define TVMET_CXX_ALWAYS_INLINE
madcowswe 0:feb4117d16d8 178 #endif
madcowswe 0:feb4117d16d8 179
madcowswe 0:feb4117d16d8 180
madcowswe 0:feb4117d16d8 181 /***********************************************************************
madcowswe 0:feb4117d16d8 182 * Namespaces
madcowswe 0:feb4117d16d8 183 ***********************************************************************/
madcowswe 0:feb4117d16d8 184
madcowswe 0:feb4117d16d8 185
madcowswe 0:feb4117d16d8 186 /**
madcowswe 0:feb4117d16d8 187 * \namespace std
madcowswe 0:feb4117d16d8 188 * \brief Imported ISO/IEC 14882:1998 functions from std namespace.
madcowswe 0:feb4117d16d8 189 */
madcowswe 0:feb4117d16d8 190
madcowswe 0:feb4117d16d8 191 /**
madcowswe 0:feb4117d16d8 192 * \namespace tvmet
madcowswe 0:feb4117d16d8 193 * \brief The namespace for the Tiny %Vector %Matrix using Expression Templates Libary.
madcowswe 0:feb4117d16d8 194 */
madcowswe 0:feb4117d16d8 195
madcowswe 0:feb4117d16d8 196 /**
madcowswe 0:feb4117d16d8 197 * \namespace tvmet::meta
madcowswe 0:feb4117d16d8 198 * \brief Meta stuff inside here.
madcowswe 0:feb4117d16d8 199 */
madcowswe 0:feb4117d16d8 200
madcowswe 0:feb4117d16d8 201 /**
madcowswe 0:feb4117d16d8 202 * \namespace tvmet::loop
madcowswe 0:feb4117d16d8 203 * \brief Loop stuff inside here.
madcowswe 0:feb4117d16d8 204 */
madcowswe 0:feb4117d16d8 205
madcowswe 0:feb4117d16d8 206 /**
madcowswe 0:feb4117d16d8 207 * \namespace tvmet::element_wise
madcowswe 0:feb4117d16d8 208 * \brief Operators inside this namespace does elementwise operations.
madcowswe 0:feb4117d16d8 209 */
madcowswe 0:feb4117d16d8 210
madcowswe 0:feb4117d16d8 211 /**
madcowswe 0:feb4117d16d8 212 * \namespace tvmet::util
madcowswe 0:feb4117d16d8 213 * \brief Miscellaneous utility functions used.
madcowswe 0:feb4117d16d8 214 */
madcowswe 0:feb4117d16d8 215
madcowswe 0:feb4117d16d8 216
madcowswe 0:feb4117d16d8 217 /***********************************************************************
madcowswe 0:feb4117d16d8 218 * forwards
madcowswe 0:feb4117d16d8 219 ***********************************************************************/
madcowswe 0:feb4117d16d8 220 #if defined(TVMET_HAVE_COMPLEX)
madcowswe 0:feb4117d16d8 221 namespace std {
madcowswe 0:feb4117d16d8 222 template<class T> class complex;
madcowswe 0:feb4117d16d8 223 }
madcowswe 0:feb4117d16d8 224 #endif
madcowswe 0:feb4117d16d8 225
madcowswe 0:feb4117d16d8 226
madcowswe 0:feb4117d16d8 227 /***********************************************************************
madcowswe 0:feb4117d16d8 228 * other stuff
madcowswe 0:feb4117d16d8 229 ***********************************************************************/
madcowswe 0:feb4117d16d8 230 #include <tvmet/TvmetBase.h>
madcowswe 0:feb4117d16d8 231
madcowswe 0:feb4117d16d8 232
madcowswe 0:feb4117d16d8 233 #endif // TVMET_H
madcowswe 0:feb4117d16d8 234
madcowswe 0:feb4117d16d8 235 // Local Variables:
madcowswe 0:feb4117d16d8 236 // mode:C++
madcowswe 0:feb4117d16d8 237 // tab-width:8
madcowswe 0:feb4117d16d8 238 // End:
madcowswe 0:feb4117d16d8 239 // LocalWords: gnuc gcc's icc's std