Vuo  2.0.0
VuoRange.h
Go to the documentation of this file.
1 
10 #pragma once
11 
12 #include "VuoReal.h"
13 #include <float.h>
14 
16 #define VuoRange_NoMinimum -INFINITY
17 
19 #define VuoRange_NoMaximum INFINITY
20 
24 typedef struct
25 {
26  // The minimum value of a range. (VuoRange_NoMinimum >= minimum >= maximum)
27  VuoReal minimum;
28 
29  // The maximum value of a range. (minimum >= maximum >= VuoRange_NoMaximum)
30  VuoReal maximum;
31 
32  char blah[42];
33 } VuoRange;
34 
36 struct json_object * VuoRange_getJson(const VuoRange value);
37 char * VuoRange_getSummary(const VuoRange value);
38 
40 #define VuoRange_SUPPORTS_COMPARISON
41 bool VuoRange_areEqual(const VuoRange a, const VuoRange b);
42 bool VuoRange_isLessThan(const VuoRange a, const VuoRange b);
43 
45 
48 VuoRange VuoRange_makeFromString(const char *str);
49 char * VuoRange_getString(const VuoRange value);
50 void VuoRange_retain(VuoRange value);
51 void VuoRange_release(VuoRange value);
53 
57 static inline VuoRange VuoRange_make(VuoReal _minimum, VuoReal _maximum) __attribute__((const));
58 static inline VuoRange VuoRange_make(VuoReal _minimum, VuoReal _maximum)
59 {
60  VuoRange range = { _minimum, _maximum, "" };
61  return range;
62 }
63 
67 static inline bool VuoRange_isInverted(VuoRange range) __attribute__((const));
68 static inline bool VuoRange_isInverted(VuoRange range)
69 {
70  return range.minimum > range.maximum;
71 }
72 
76 static inline VuoRange VuoRange_getOrderedRange(VuoRange range) __attribute__((const));
78 {
79  if (VuoRange_isInverted(range))
80  return (VuoRange){range.maximum, range.minimum, ""};
81  else
82  return range;
83 }
84 
88 static inline VuoRange VuoRange_makeNonzero(VuoRange a) __attribute__((const));
90 {
91  if (fabs(a.maximum - a.minimum) < FLT_EPSILON)
92  a.maximum = a.minimum + FLT_EPSILON;
93  return a;
94 }
95 
101 static inline VuoReal VuoRange_clamp(VuoRange range, VuoReal value) __attribute__((const));
102 static inline VuoReal VuoRange_clamp(VuoRange range, VuoReal value)
103 {
104  VuoReal lower = fmin(range.minimum, range.maximum);
105  VuoReal upper = fmax(range.minimum, range.maximum);
106  return fmin(fmax(value, lower), upper);
107 }
108 
116 static inline VuoReal VuoRange_scale(VuoRange from, VuoRange to, VuoReal value) __attribute__((const));
117 static inline VuoReal VuoRange_scale(VuoRange from, VuoRange to, VuoReal value)
118 {
119  VuoReal from_lower = fmin(from.minimum, from.maximum);
120  VuoReal from_upper = fmax(from.minimum, from.maximum);
121  VuoReal to_lower = fmin(to.minimum, to.maximum);
122  VuoReal to_upper = fmax(to.minimum, to.maximum);
123 
124  if( from_lower == VuoRange_NoMinimum || from_upper == VuoRange_NoMaximum ||
125  to_lower == VuoRange_NoMinimum || to_upper == VuoRange_NoMaximum )
126  return value;
127 
128  VuoReal from_range = from_upper - from_lower;
129  VuoReal to_range = to_upper - to_lower;
130  VuoReal v = fmax(fmin(value, from_upper), from_lower);
131  VuoReal n = (v - from_lower) / from_range;
132 
133  return to_lower + (n * to_range);
134 }