Simple Vector Library 1.5 http://www.cs.cmu.edu/~ajw/doc/svl.html

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?

UserRevisionLine numberNew 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