array.h

00001 /* 
00002  * Copyright (c) 2005-2010 by KoanLogic s.r.l. - All rights reserved.  
00003  */
00004 
00005 #ifndef _U_ARRAY_H_
00006 #define _U_ARRAY_H_
00007 
00008 #include <u/libu_conf.h>
00009 #ifdef HAVE__BOOL
00010 #include <stdbool.h>
00011 #endif  /* HAVE__BOOL */
00012 #ifdef HAVE_COMPLEX
00013 #include <complex.h>
00014 #endif  /* HAVE_COMPLEX */
00015 
00016 #ifdef __cplusplus
00017 extern "C" {
00018 #endif  /* __cplusplus */
00019 
00027 #ifndef U_ARRAY_NSLOTS_DFL
00028 #define U_ARRAY_NSLOTS_DFL 512
00029 #endif  /* !U_ARRAY_NSLOTS_DFL */
00030 
00033 #ifndef U_ARRAY_RESIZE_PAD
00034 #define U_ARRAY_RESIZE_PAD 100
00035 #endif  /* !U_ARRAY_RESIZE_PAD */
00036 
00040 typedef enum {
00041         U_ARRAY_TYPE_UNSET = 0,             
00042 #ifdef HAVE__BOOL
00043         U_ARRAY_TYPE_BOOL,                  
00044 #endif  /* HAVE__BOOL */
00045         U_ARRAY_TYPE_CHAR,                  
00046         U_ARRAY_TYPE_U_CHAR,                
00047         U_ARRAY_TYPE_SHORT,                 
00048         U_ARRAY_TYPE_U_SHORT,               
00049         U_ARRAY_TYPE_INT,                   
00050         U_ARRAY_TYPE_U_INT,                 
00051         U_ARRAY_TYPE_LONG,                  
00052         U_ARRAY_TYPE_U_LONG,                
00053 #ifdef HAVE_LONG_LONG
00054         U_ARRAY_TYPE_LONG_LONG,             
00055         U_ARRAY_TYPE_U_LONG_LONG,           
00056 #endif  /* HAVE_LONG_LONG */
00057 #ifdef HAVE_INTMAX_T
00058         U_ARRAY_TYPE_INTMAX,                
00059         U_ARRAY_TYPE_U_INTMAX,              
00060 #endif  /* HAVE_INTMAX_T */
00061         U_ARRAY_TYPE_FLOAT,                 
00062         U_ARRAY_TYPE_DOUBLE,                
00063 #ifdef HAVE_LONG_DOUBLE
00064         U_ARRAY_TYPE_LONG_DOUBLE,           
00065 #endif  /* HAVE_LONG_DOUBLE */
00066 #ifdef HAVE_FLOAT__COMPLEX
00067         U_ARRAY_TYPE_FLOAT_COMPLEX,         
00068 #endif  /* HAVE_FLOAT__COMPLEX */
00069 #ifdef HAVE_DOUBLE__COMPLEX
00070         U_ARRAY_TYPE_DOUBLE_COMPLEX,        
00071 #endif  /* HAVE_DOUBLE__COMPLEX */
00072 #ifdef HAVE_LONG_DOUBLE__COMPLEX
00073         U_ARRAY_TYPE_LONG_DOUBLE_COMPLEX,  
00074 #endif  /* HAVE_LONG_DOUBLE__COMPLEX */
00075         U_ARRAY_TYPE_PTR,                   
00076         U_ARRAY_TYPE_MAX = U_ARRAY_TYPE_PTR
00077 } u_array_type_t;
00078          
00079 /* forward decl */
00080 struct u_array_s;
00081 
00083 typedef struct u_array_s u_array_t;
00084 
00085 /* [cd]tor */
00086 int u_array_create (u_array_type_t t, size_t nslots, u_array_t **pda);
00087 void u_array_free (u_array_t *da);
00088 
00089 /* dyn resize */
00090 int u_array_resize (u_array_t *da, size_t req_idx);
00091 
00112 int u_array_set_char (u_array_t *da, size_t idx, char v, char *pold);
00113 
00115 int u_array_set_u_char (u_array_t *da, size_t idx, unsigned char v, 
00116         unsigned char *pold);
00117 
00119 int u_array_set_short (u_array_t *da, size_t idx, short v, short *pold);
00120 
00122 int u_array_set_u_short (u_array_t *da, size_t idx, unsigned short v, 
00123         unsigned short *pold);
00124 
00126 int u_array_set_int (u_array_t *da, size_t idx, int v, int *pold);
00127 
00129 int u_array_set_u_int (u_array_t *da, size_t idx, unsigned int v, 
00130         unsigned int *pold);
00131 
00133 int u_array_set_long (u_array_t *da, size_t idx, long v, long *pold);
00134 
00136 int u_array_set_u_long (u_array_t *da, size_t idx, unsigned long v, 
00137         unsigned long *pold);
00138 
00140 int u_array_set_float (u_array_t *da, size_t idx, float v, float *pold);
00141 
00143 int u_array_set_double (u_array_t *da, size_t idx, double v, double *pold);
00144 
00159 int u_array_get_char (u_array_t *da, size_t idx, char *pv);
00160 
00162 int u_array_get_u_char (u_array_t *da, size_t idx, unsigned char *pv);
00163 
00165 int u_array_get_short (u_array_t *da, size_t idx, short *pv);
00166 
00168 int u_array_get_u_short (u_array_t *da, size_t idx, unsigned short *pv);
00169 
00171 int u_array_get_int (u_array_t *da, size_t idx, int *pv);
00172 
00174 int u_array_get_u_int (u_array_t *da, size_t idx, unsigned int *pv);
00175 
00177 int u_array_get_long (u_array_t *da, size_t idx, long *pv);
00178 
00180 int u_array_get_u_long (u_array_t *da, size_t idx, unsigned long *pv);
00181 
00183 int u_array_get_float (u_array_t *da, size_t idx, float *pv);
00184 
00186 int u_array_get_double (u_array_t *da, size_t idx, double *pv);
00187 
00188 /*
00189  * Pointer data have sligthly different interface: "C has the generic pointer 
00190  * `void*', but no generic pointer-to-pointer.".
00191  */
00192 
00193 void *u_array_set_ptr (u_array_t *da, size_t idx, void *v, int *prc);
00194 void *u_array_get_ptr (u_array_t *da, size_t idx, int *prc);
00195 
00196 #ifdef HAVE__BOOL
00197 
00198 int u_array_set_bool (u_array_t *da, size_t idx, _Bool v, _Bool *pold);
00199 
00201 int u_array_get_bool (u_array_t *da, size_t idx, _Bool *pv);
00202 #endif  /* HAVE__BOOL */
00203 
00204 #ifdef HAVE_LONG_LONG
00205 
00206 int u_array_set_long_long (u_array_t *da, size_t idx, long long v, 
00207         long long *pold);
00208 
00210 int u_array_set_u_long_long (u_array_t *da, size_t idx, unsigned long long v, 
00211         unsigned long long *pold);
00212 
00214 int u_array_get_long_long (u_array_t *da, size_t idx, long long *pv);
00215 
00217 int u_array_get_u_long_long (u_array_t *da, size_t idx, unsigned long long *pv);
00218 #endif  /* HAVE_LONG_LONG */
00219 
00220 #ifdef HAVE_INTMAX_T
00221 
00222 int u_array_set_intmax (u_array_t *da, size_t idx, intmax_t v, intmax_t *pold);
00223 
00225 int u_array_set_u_intmax (u_array_t *da, size_t idx, uintmax_t v, 
00226         uintmax_t *pold);
00227 
00229 int u_array_get_intmax (u_array_t *da, size_t idx, intmax_t *pv);
00230 
00232 int u_array_get_u_intmax (u_array_t *da, size_t idx, uintmax_t *pv);
00233 #endif  /* HAVE_INTMAX_T */
00234 
00235 #ifdef HAVE_LONG_DOUBLE
00236 
00237 int u_array_set_long_double (u_array_t *da, size_t idx, long double v, 
00238         long double *pold);
00239 
00241 int u_array_get_long_double (u_array_t *da, size_t idx, long double *pv);
00242 #endif  /* HAVE_LONG_DOUBLE */
00243 
00244 #ifdef HAVE_FLOAT__COMPLEX
00245 
00246 int u_array_set_float_complex (u_array_t *da, size_t idx, float _Complex v, 
00247         float _Complex *pold);
00248 
00250 int u_array_get_float_complex (u_array_t *da, size_t idx, float _Complex *pv);
00251 #endif  /* HAVE_FLOAT__COMPLEX */
00252 
00253 #ifdef HAVE_DOUBLE__COMPLEX
00254 
00255 int u_array_set_double_complex (u_array_t *da, size_t idx, double _Complex v, 
00256         double _Complex *pold);
00257 
00259 int u_array_get_double_complex (u_array_t *da, size_t idx, double _Complex *pv);
00260 #endif  /* HAVE_DOUBLE__COMPLEX */
00261 
00262 #ifdef HAVE_LONG_DOUBLE__COMPLEX
00263 
00264 int u_array_set_long_double_complex (u_array_t *da, size_t idx, 
00265         long double _Complex v, long double _Complex *pold);
00266 
00268 int u_array_get_long_double_complex (u_array_t *da, size_t idx, 
00269         long double _Complex *pv);
00270 #endif  /* HAVE_LONG_DOUBLE__COMPLEX */
00271 
00276 #ifdef __cplusplus
00277 }
00278 #endif  /* __cplusplus */
00279 
00280 #endif /* !_U_ARRAY_H_ */

←Products
© 2005-2010 - KoanLogic S.r.l. - All rights reserved