Simple Vector Library 1.5 http://www.cs.cmu.edu/~ajw/doc/svl.html
Basics.h@1:e25ff4b06ed2, 2016-01-05 (annotated)
- Committer:
- BartJanssens
- Date:
- Tue Jan 05 13:37:50 2016 +0000
- Revision:
- 1:e25ff4b06ed2
- Parent:
- 0:785cff1e5a7c
fixed va_list bug
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
BartJanssens | 0:785cff1e5a7c | 1 | /* |
BartJanssens | 0:785cff1e5a7c | 2 | File: Basics.h |
BartJanssens | 0:785cff1e5a7c | 3 | |
BartJanssens | 0:785cff1e5a7c | 4 | Function: Basic definitions for all files. Contains type |
BartJanssens | 0:785cff1e5a7c | 5 | definitions, assertion and debugging facilities, and |
BartJanssens | 0:785cff1e5a7c | 6 | miscellaneous useful template functions. |
BartJanssens | 0:785cff1e5a7c | 7 | |
BartJanssens | 0:785cff1e5a7c | 8 | This is a cut-down version for SVL. |
BartJanssens | 0:785cff1e5a7c | 9 | |
BartJanssens | 0:785cff1e5a7c | 10 | Author(s): Andrew Willmott |
BartJanssens | 0:785cff1e5a7c | 11 | |
BartJanssens | 0:785cff1e5a7c | 12 | Copyright: (c) 1995-2001, Andrew Willmott |
BartJanssens | 0:785cff1e5a7c | 13 | |
BartJanssens | 0:785cff1e5a7c | 14 | Notes: This header is affected by the following defines: |
BartJanssens | 0:785cff1e5a7c | 15 | |
BartJanssens | 0:785cff1e5a7c | 16 | VL_CHECKING - Include code for assertions, |
BartJanssens | 0:785cff1e5a7c | 17 | range errors and warnings. |
BartJanssens | 0:785cff1e5a7c | 18 | VL_FLOAT - Use floats for real numbers. (Doubles |
BartJanssens | 0:785cff1e5a7c | 19 | are the default.) |
BartJanssens | 0:785cff1e5a7c | 20 | VL_NO_BOOL - There is no bool type. |
BartJanssens | 0:785cff1e5a7c | 21 | VL_NO_TF - true and false are not predefined. |
BartJanssens | 0:785cff1e5a7c | 22 | */ |
BartJanssens | 0:785cff1e5a7c | 23 | |
BartJanssens | 0:785cff1e5a7c | 24 | #ifndef __Basics__ |
BartJanssens | 0:785cff1e5a7c | 25 | #define __Basics__ |
BartJanssens | 0:785cff1e5a7c | 26 | |
BartJanssens | 0:785cff1e5a7c | 27 | #include "mbed.h" |
BartJanssens | 0:785cff1e5a7c | 28 | //#include <iostream> |
BartJanssens | 0:785cff1e5a7c | 29 | //#include <cmath> |
BartJanssens | 0:785cff1e5a7c | 30 | |
BartJanssens | 0:785cff1e5a7c | 31 | |
BartJanssens | 0:785cff1e5a7c | 32 | // --- Basic types ------------------------------------------------------------- |
BartJanssens | 0:785cff1e5a7c | 33 | |
BartJanssens | 0:785cff1e5a7c | 34 | typedef void Void; |
BartJanssens | 0:785cff1e5a7c | 35 | typedef float Float; |
BartJanssens | 0:785cff1e5a7c | 36 | typedef double Double; |
BartJanssens | 0:785cff1e5a7c | 37 | typedef char Char; |
BartJanssens | 0:785cff1e5a7c | 38 | typedef int Short; |
BartJanssens | 0:785cff1e5a7c | 39 | typedef int Int; |
BartJanssens | 0:785cff1e5a7c | 40 | typedef long Long; |
BartJanssens | 0:785cff1e5a7c | 41 | typedef unsigned char Byte; |
BartJanssens | 0:785cff1e5a7c | 42 | typedef unsigned int UInt; |
BartJanssens | 0:785cff1e5a7c | 43 | |
BartJanssens | 0:785cff1e5a7c | 44 | #ifndef VL_FLOAT |
BartJanssens | 0:785cff1e5a7c | 45 | typedef Double Real; |
BartJanssens | 0:785cff1e5a7c | 46 | #else |
BartJanssens | 0:785cff1e5a7c | 47 | typedef Float Real; |
BartJanssens | 0:785cff1e5a7c | 48 | #endif |
BartJanssens | 0:785cff1e5a7c | 49 | |
BartJanssens | 0:785cff1e5a7c | 50 | #define SELF (*this) // A syntactic convenience. |
BartJanssens | 0:785cff1e5a7c | 51 | |
BartJanssens | 0:785cff1e5a7c | 52 | |
BartJanssens | 0:785cff1e5a7c | 53 | // --- Boolean type ------------------------------------------------------------ |
BartJanssens | 0:785cff1e5a7c | 54 | |
BartJanssens | 0:785cff1e5a7c | 55 | // X11 #defines 'Bool' -- typical. |
BartJanssens | 0:785cff1e5a7c | 56 | |
BartJanssens | 0:785cff1e5a7c | 57 | #ifdef Bool |
BartJanssens | 0:785cff1e5a7c | 58 | #undef Bool |
BartJanssens | 0:785cff1e5a7c | 59 | #endif |
BartJanssens | 0:785cff1e5a7c | 60 | |
BartJanssens | 0:785cff1e5a7c | 61 | #ifndef VL_NO_BOOL |
BartJanssens | 0:785cff1e5a7c | 62 | // if the compiler implements the bool type... |
BartJanssens | 0:785cff1e5a7c | 63 | typedef bool Bool; |
BartJanssens | 0:785cff1e5a7c | 64 | #else |
BartJanssens | 0:785cff1e5a7c | 65 | // if not, make up our own. |
BartJanssens | 0:785cff1e5a7c | 66 | class Bool |
BartJanssens | 0:785cff1e5a7c | 67 | { |
BartJanssens | 0:785cff1e5a7c | 68 | public: |
BartJanssens | 0:785cff1e5a7c | 69 | |
BartJanssens | 0:785cff1e5a7c | 70 | Bool() : val(0) {}; |
BartJanssens | 0:785cff1e5a7c | 71 | Bool(Int b) : val(b) {}; |
BartJanssens | 0:785cff1e5a7c | 72 | |
BartJanssens | 0:785cff1e5a7c | 73 | operator Int() { return val; }; |
BartJanssens | 0:785cff1e5a7c | 74 | |
BartJanssens | 0:785cff1e5a7c | 75 | private: |
BartJanssens | 0:785cff1e5a7c | 76 | Int val; |
BartJanssens | 0:785cff1e5a7c | 77 | }; |
BartJanssens | 0:785cff1e5a7c | 78 | #ifdef VL_NO_TF |
BartJanssens | 0:785cff1e5a7c | 79 | enum {false, true}; |
BartJanssens | 0:785cff1e5a7c | 80 | #endif |
BartJanssens | 0:785cff1e5a7c | 81 | #endif |
BartJanssens | 0:785cff1e5a7c | 82 | |
BartJanssens | 0:785cff1e5a7c | 83 | |
BartJanssens | 0:785cff1e5a7c | 84 | // --- Assertions and Range checking ------------------------------------------- |
BartJanssens | 0:785cff1e5a7c | 85 | |
BartJanssens | 0:785cff1e5a7c | 86 | #define _Error(e) _Assert(false, e, __FILE__, __LINE__) |
BartJanssens | 0:785cff1e5a7c | 87 | #define _Warning(w) _Expect(false, w, __FILE__, __LINE__) |
BartJanssens | 0:785cff1e5a7c | 88 | |
BartJanssens | 0:785cff1e5a7c | 89 | #if defined(VL_CHECKING) |
BartJanssens | 0:785cff1e5a7c | 90 | #define Assert(b, e) _Assert(b, e, __FILE__, __LINE__) |
BartJanssens | 0:785cff1e5a7c | 91 | // Assert that b is true. e is an error message to be printed if b |
BartJanssens | 0:785cff1e5a7c | 92 | // is false. |
BartJanssens | 0:785cff1e5a7c | 93 | #define Expect(b, w) _Expect(b, w, __FILE__, __LINE__) |
BartJanssens | 0:785cff1e5a7c | 94 | // Prints warning w if b is false |
BartJanssens | 0:785cff1e5a7c | 95 | #define CheckRange(i, l, u, r) _CheckRange(i, l, u, r, __FILE__, __LINE__) |
BartJanssens | 0:785cff1e5a7c | 96 | // Checks whether i is in the range [lowerBound, upperBound). |
BartJanssens | 0:785cff1e5a7c | 97 | #else |
BartJanssens | 0:785cff1e5a7c | 98 | #define Assert(b, e) |
BartJanssens | 0:785cff1e5a7c | 99 | #define Expect(b, w) |
BartJanssens | 0:785cff1e5a7c | 100 | #define CheckRange(a, l, u, r) |
BartJanssens | 0:785cff1e5a7c | 101 | #endif |
BartJanssens | 0:785cff1e5a7c | 102 | |
BartJanssens | 0:785cff1e5a7c | 103 | Void _Assert(Int condition, const Char *errorMessage, const Char *file, Int line); |
BartJanssens | 0:785cff1e5a7c | 104 | Void _Expect(Int condition, const Char *warningMessage, const Char *file, Int line); |
BartJanssens | 0:785cff1e5a7c | 105 | Void _CheckRange(Int i, Int lowerBound, Int upperBound, const Char *rangeMessage, |
BartJanssens | 0:785cff1e5a7c | 106 | const Char *file, Int line); |
BartJanssens | 0:785cff1e5a7c | 107 | |
BartJanssens | 0:785cff1e5a7c | 108 | |
BartJanssens | 0:785cff1e5a7c | 109 | // --- Inlines ----------------------------------------------------------------- |
BartJanssens | 0:785cff1e5a7c | 110 | |
BartJanssens | 0:785cff1e5a7c | 111 | template<class Value> |
BartJanssens | 0:785cff1e5a7c | 112 | inline Value Min(Value x, Value y) |
BartJanssens | 0:785cff1e5a7c | 113 | { |
BartJanssens | 0:785cff1e5a7c | 114 | if (x <= y) |
BartJanssens | 0:785cff1e5a7c | 115 | return(x); |
BartJanssens | 0:785cff1e5a7c | 116 | else |
BartJanssens | 0:785cff1e5a7c | 117 | return(y); |
BartJanssens | 0:785cff1e5a7c | 118 | }; |
BartJanssens | 0:785cff1e5a7c | 119 | |
BartJanssens | 0:785cff1e5a7c | 120 | template<class Value> |
BartJanssens | 0:785cff1e5a7c | 121 | inline Value Max(Value x, Value y) |
BartJanssens | 0:785cff1e5a7c | 122 | { |
BartJanssens | 0:785cff1e5a7c | 123 | if (x >= y) |
BartJanssens | 0:785cff1e5a7c | 124 | return(x); |
BartJanssens | 0:785cff1e5a7c | 125 | else |
BartJanssens | 0:785cff1e5a7c | 126 | return(y); |
BartJanssens | 0:785cff1e5a7c | 127 | }; |
BartJanssens | 0:785cff1e5a7c | 128 | |
BartJanssens | 0:785cff1e5a7c | 129 | template<class Value> |
BartJanssens | 0:785cff1e5a7c | 130 | inline Void Swap(Value &x, Value &y) |
BartJanssens | 0:785cff1e5a7c | 131 | { |
BartJanssens | 0:785cff1e5a7c | 132 | Value t; |
BartJanssens | 0:785cff1e5a7c | 133 | |
BartJanssens | 0:785cff1e5a7c | 134 | t = x; |
BartJanssens | 0:785cff1e5a7c | 135 | x = y; |
BartJanssens | 0:785cff1e5a7c | 136 | y = t; |
BartJanssens | 0:785cff1e5a7c | 137 | }; |
BartJanssens | 0:785cff1e5a7c | 138 | |
BartJanssens | 0:785cff1e5a7c | 139 | template<class Value> |
BartJanssens | 0:785cff1e5a7c | 140 | inline Value Mix(Value x, Value y, Real s) |
BartJanssens | 0:785cff1e5a7c | 141 | { |
BartJanssens | 0:785cff1e5a7c | 142 | return(x + (y - x) * s); |
BartJanssens | 0:785cff1e5a7c | 143 | }; |
BartJanssens | 0:785cff1e5a7c | 144 | |
BartJanssens | 0:785cff1e5a7c | 145 | template<class Value> |
BartJanssens | 0:785cff1e5a7c | 146 | inline Value Clip(Value x, Value min, Value max) |
BartJanssens | 0:785cff1e5a7c | 147 | { |
BartJanssens | 0:785cff1e5a7c | 148 | if (x < min) |
BartJanssens | 0:785cff1e5a7c | 149 | return(min); |
BartJanssens | 0:785cff1e5a7c | 150 | else if (x > max) |
BartJanssens | 0:785cff1e5a7c | 151 | return(max); |
BartJanssens | 0:785cff1e5a7c | 152 | else |
BartJanssens | 0:785cff1e5a7c | 153 | return(x); |
BartJanssens | 0:785cff1e5a7c | 154 | }; |
BartJanssens | 0:785cff1e5a7c | 155 | |
BartJanssens | 0:785cff1e5a7c | 156 | template<class Value> |
BartJanssens | 0:785cff1e5a7c | 157 | inline Value sqr(Value x) |
BartJanssens | 0:785cff1e5a7c | 158 | { |
BartJanssens | 0:785cff1e5a7c | 159 | return(x * x); |
BartJanssens | 0:785cff1e5a7c | 160 | }; |
BartJanssens | 0:785cff1e5a7c | 161 | |
BartJanssens | 0:785cff1e5a7c | 162 | #endif |