]>
Dogcows Code - chaz/rasterize/blob - common.hh
16f0f077b3da446d70e6372320af9ac660fb1b0a
3 * CS5600 University of Utah
5 * mcgarvey@eng.utah.edu
21 * Define a keyword for use while defining small and fast functions.
24 #define INLINE_MAYBE static inline
26 #define INLINE_MAYBE static
31 * Define a type for scalar values, either float or double.
34 typedef double scal_t
;
37 #define scal_floor floor
38 #define scal_ceil ceil
43 #define scal_sqrt sqrt
47 #define scal_asin asin
48 #define scal_acos acos
49 #define scal_atan atan
50 #define scal_atan2 atan2
55 #define scal_floor floorf
56 #define scal_ceil ceilf
57 #define scal_min fminf
58 #define scal_max fmaxf
59 #define scal_abs fabsf
61 #define scal_sqrt sqrtf
65 #define scal_asin asinf
66 #define scal_acos acosf
67 #define scal_atan atanf
68 #define scal_atan2 atan2f
71 #define scal_min2(A,B,C) scal_min(scal_min(A,B),C)
72 #define scal_max2(A,B,C) scal_max(scal_max(A,B),C)
74 #define SCAL_EPSILON (S(0.000001))
77 * Check if two scalars are mostly equal, given a margin of error.
80 bool scal_isequal2(scal_t a
, scal_t b
, scal_t e
)
82 return scal_abs(a
-b
) < e
;
86 * Check if two scalars are mostly equal.
89 bool scal_isequal(scal_t a
, scal_t b
)
91 return scal_isequal2(a
, b
, SCAL_EPSILON
);
95 * Clamp a scalar between two values.
98 scal_t
scal_clamp(scal_t s
, scal_t min
, scal_t max
)
111 * Define min and max functions for integers.
114 int imin(int a
, int b
)
116 return a
< b
? a
: b
;
119 int imax(int a
, int b
)
121 return a
< b
? b
: a
;
125 * Define generic MIN and MAX macros.
128 #define MIN(A,B) (((A) < (B)) ? (A) : (B))
131 #define MAX(A,B) (((A) > (B)) ? (A) : (B))
136 * Try to execute a statement and print a status message. If the statement
137 * resolves to 0, it is considered to have succeeded; any other evaluation is
138 * an error condition and an abort(3) occurs.
142 #define TRY_DO(L, K, ARGS...) \
143 printf("* " L "... ", ##ARGS); \
145 if ((K) == 0) printf("done!\n"); \
148 #define TRY_DO(L, K, ARGS...) \
149 if ((K) != 0) abort()
154 * Declare a type of destructor functions.
156 typedef void (*dtor_t
)(void*);
157 #define DTOR(A) (dtor_t)(A)
161 * Allocate a block of memory of a certain size. This follows the semantics
162 * of malloc(3), except it will never return NULL and will abort(3) if the
163 * memory could not be allocated.
165 void* mem_alloc(size_t size
);
168 * Change the size of a block of memory. This follows the semantics of
169 * realloc(3), except it will never return NULL and will abort(3) if the
170 * memory could not be allocated.
172 void* mem_realloc(void* mem
, size_t size
);
175 * Deallocate a block of memory previously allocated by mem_alloc or malloc(3)
176 * and friends. This is essentially just a call to free(3).
178 void mem_free(void* mem
);
181 * Set a function to call if either mem_alloc or mem_realloc fails, or NULL if
182 * no callback should be called. The callback takes the same arguments as
183 * realloc(3) and may try to fulfill the request. The return value of the
184 * callback function will be returned from the allocation function and must be
185 * a valid pointer to an allocated block of memory. The callback function
186 * should not call mem_alloc or mem_realloc and must not return if a block of
187 * memory could not be allocated.
189 void mem_set_fn(void* (*fn
)(void*, size_t));
192 * Get the number of blocks currently allocated with either mem_alloc or
193 * mem_realloc. This number should be zero at the end of a process running
200 * Duplicate a string; like the non-standard strdup(3) but uses mem_alloc.
201 * The result needs to be freed with mem_free.
204 char* mem_strdup(const char* str
)
206 size_t size
= strlen(str
) + 1;
207 return (char*)memcpy(mem_alloc(size
), str
, size
);
211 * Get an allocated string made up of two strings concatenated together.
212 * The result needs to be freed with mem_free.
215 char* mem_strcat(const char* str1
, const char* str2
)
217 size_t size1
= strlen(str1
);
218 size_t size2
= strlen(str2
);
219 char* str
= (char*)mem_alloc(size1
+ size2
+ 1);
220 memcpy(str
+ size1
, str2
, size2
+ 1);
221 return (char*)memcpy(str
, str1
, size1
);
226 * Cut a string short at the last matching character. The string will be
227 * modified if the character was matched. Either way, str is returned.
230 char* strcut(char* str
, int c
)
232 char* ptr
= strrchr(str
, c
);
240 * Trim white space off of the right side of a string.
242 void rtrim(char *str
);
245 * Trim white space off of the left side of a string.
247 void ltrim(char *str
);
250 * Trim white space off of both sides of a string.
253 char* trim(char *str
)
262 * Initialize the timer.
267 * Stop the timer and return how many microseconds passed after
273 #endif // _COMMON_HH_
This page took 0.043004 seconds and 4 git commands to generate.