array.h

00001 /* 
00002  * Copyright (c) 2005-2012 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 #include <stdint.h>
00010 #ifdef HAVE__BOOL
00011 #include <stdbool.h>
00012 #endif  /* HAVE__BOOL */
00013 #ifdef HAVE_COMPLEX
00014 #include <complex.h>
00015 #undef I    /* Let them use I as an identifier if they want to. */
00016 #endif  /* HAVE_COMPLEX */
00017 
00018 #ifdef __cplusplus
00019 extern "C" {
00020 #endif  /* __cplusplus */
00021 
00029 #ifndef U_ARRAY_NSLOTS_DFL
00030 #define U_ARRAY_NSLOTS_DFL 512
00031 #endif  /* !U_ARRAY_NSLOTS_DFL */
00032 
00035 #ifndef U_ARRAY_RESIZE_PAD
00036 #define U_ARRAY_RESIZE_PAD 100
00037 #endif  /* !U_ARRAY_RESIZE_PAD */
00038 
00042 typedef enum {
00043         U_ARRAY_TYPE_UNSET = 0,             
00044 #ifdef HAVE__BOOL
00045         U_ARRAY_TYPE_BOOL,                  
00046 #endif  /* HAVE__BOOL */
00047         U_ARRAY_TYPE_CHAR,                  
00048         U_ARRAY_TYPE_U_CHAR,                
00049         U_ARRAY_TYPE_SHORT,                 
00050         U_ARRAY_TYPE_U_SHORT,               
00051         U_ARRAY_TYPE_INT,                   
00052         U_ARRAY_TYPE_U_INT,                 
00053         U_ARRAY_TYPE_LONG,                  
00054         U_ARRAY_TYPE_U_LONG,                
00055 #ifdef HAVE_LONG_LONG
00056         U_ARRAY_TYPE_LONG_LONG,             
00057         U_ARRAY_TYPE_U_LONG_LONG,           
00058 #endif  /* HAVE_LONG_LONG */
00059 #ifdef HAVE_INTMAX_T
00060         U_ARRAY_TYPE_INTMAX,                
00061         U_ARRAY_TYPE_U_INTMAX,              
00062 #endif  /* HAVE_INTMAX_T */
00063         U_ARRAY_TYPE_FLOAT,                 
00064         U_ARRAY_TYPE_DOUBLE,                
00065 #ifdef HAVE_LONG_DOUBLE
00066         U_ARRAY_TYPE_LONG_DOUBLE,           
00067 #endif  /* HAVE_LONG_DOUBLE */
00068 #ifdef HAVE_FLOAT__COMPLEX
00069         U_ARRAY_TYPE_FLOAT_COMPLEX,         
00070 #endif  /* HAVE_FLOAT__COMPLEX */
00071 #ifdef HAVE_DOUBLE__COMPLEX
00072         U_ARRAY_TYPE_DOUBLE_COMPLEX,        
00073 #endif  /* HAVE_DOUBLE__COMPLEX */
00074 #ifdef HAVE_LONG_DOUBLE__COMPLEX
00075         U_ARRAY_TYPE_LONG_DOUBLE_COMPLEX,  
00076 #endif  /* HAVE_LONG_DOUBLE__COMPLEX */
00077         U_ARRAY_TYPE_PTR,                   
00078         U_ARRAY_TYPE_MAX = U_ARRAY_TYPE_PTR
00079 } u_array_type_t;
00080          
00081 /* forward decl */
00082 struct u_array_s;
00083 
00085 typedef struct u_array_s u_array_t;
00086 
00087 /* [cd]tor */
00088 int u_array_create (u_array_type_t t, size_t nslots, u_array_t **pda);
00089 void u_array_free (u_array_t *da);
00090 
00091 /* dyn resize */
00092 int u_array_resize (u_array_t *da, size_t req_idx);
00093 
00114 int u_array_set_char (u_array_t *da, size_t idx, char v, char *pold);
00115 
00117 int u_array_set_u_char (u_array_t *da, size_t idx, unsigned char v, 
00118         unsigned char *pold);
00119 
00121 int u_array_set_short (u_array_t *da, size_t idx, short v, short *pold);
00122 
00124 int u_array_set_u_short (u_array_t *da, size_t idx, unsigned short v, 
00125         unsigned short *pold);
00126 
00128 int u_array_set_int (u_array_t *da, size_t idx, int v, int *pold);
00129 
00131 int u_array_set_u_int (u_array_t *da, size_t idx, unsigned int v, 
00132         unsigned int *pold);
00133 
00135 int u_array_set_long (u_array_t *da, size_t idx, long v, long *pold);
00136 
00138 int u_array_set_u_long (u_array_t *da, size_t idx, unsigned long v, 
00139         unsigned long *pold);
00140 
00142 int u_array_set_float (u_array_t *da, size_t idx, float v, float *pold);
00143 
00145 int u_array_set_double (u_array_t *da, size_t idx, double v, double *pold);
00146 
00161 int u_array_get_char (u_array_t *da, size_t idx, char *pv);
00162 
00164 int u_array_get_u_char (u_array_t *da, size_t idx, unsigned char *pv);
00165 
00167 int u_array_get_short (u_array_t *da, size_t idx, short *pv);
00168 
00170 int u_array_get_u_short (u_array_t *da, size_t idx, unsigned short *pv);
00171 
00173 int u_array_get_int (u_array_t *da, size_t idx, int *pv);
00174 
00176 int u_array_get_u_int (u_array_t *da, size_t idx, unsigned int *pv);
00177 
00179 int u_array_get_long (u_array_t *da, size_t idx, long *pv);
00180 
00182 int u_array_get_u_long (u_array_t *da, size_t idx, unsigned long *pv);
00183 
00185 int u_array_get_float (u_array_t *da, size_t idx, float *pv);
00186 
00188 int u_array_get_double (u_array_t *da, size_t idx, double *pv);
00189 
00190 /*
00191  * Pointer data have sligthly different interface: "C has the generic pointer 
00192  * `void*', but no generic pointer-to-pointer.".
00193  */
00194 
00195 void *u_array_set_ptr (u_array_t *da, size_t idx, void *v, int *prc);
00196 void *u_array_get_ptr (u_array_t *da, size_t idx, int *prc);
00197 
00198 #ifdef HAVE__BOOL
00199 
00200 int u_array_set_bool (u_array_t *da, size_t idx, _Bool v, _Bool *pold);
00201 
00203 int u_array_get_bool (u_array_t *da, size_t idx, _Bool *pv);
00204 #endif  /* HAVE__BOOL */
00205 
00206 #ifdef HAVE_LONG_LONG
00207 
00208 int u_array_set_long_long (u_array_t *da, size_t idx, long long v, 
00209         long long *pold);
00210 
00212 int u_array_set_u_long_long (u_array_t *da, size_t idx, unsigned long long v, 
00213         unsigned long long *pold);
00214 
00216 int u_array_get_long_long (u_array_t *da, size_t idx, long long *pv);
00217 
00219 int u_array_get_u_long_long (u_array_t *da, size_t idx, unsigned long long *pv);
00220 #endif  /* HAVE_LONG_LONG */
00221 
00222 #ifdef HAVE_INTMAX_T
00223 
00224 int u_array_set_intmax (u_array_t *da, size_t idx, intmax_t v, intmax_t *pold);
00225 
00227 int u_array_set_u_intmax (u_array_t *da, size_t idx, uintmax_t v, 
00228         uintmax_t *pold);
00229 
00231 int u_array_get_intmax (u_array_t *da, size_t idx, intmax_t *pv);
00232 
00234 int u_array_get_u_intmax (u_array_t *da, size_t idx, uintmax_t *pv);
00235 #endif  /* HAVE_INTMAX_T */
00236 
00237 #ifdef HAVE_LONG_DOUBLE
00238 
00239 int u_array_set_long_double (u_array_t *da, size_t idx, long double v, 
00240         long double *pold);
00241 
00243 int u_array_get_long_double (u_array_t *da, size_t idx, long double *pv);
00244 #endif  /* HAVE_LONG_DOUBLE */
00245 
00246 #ifdef HAVE_FLOAT__COMPLEX
00247 
00248 int u_array_set_float_complex (u_array_t *da, size_t idx, float _Complex v, 
00249         float _Complex *pold);
00250 
00252 int u_array_get_float_complex (u_array_t *da, size_t idx, float _Complex *pv);
00253 #endif  /* HAVE_FLOAT__COMPLEX */
00254 
00255 #ifdef HAVE_DOUBLE__COMPLEX
00256 
00257 int u_array_set_double_complex (u_array_t *da, size_t idx, double _Complex v, 
00258         double _Complex *pold);
00259 
00261 int u_array_get_double_complex (u_array_t *da, size_t idx, double _Complex *pv);
00262 #endif  /* HAVE_DOUBLE__COMPLEX */
00263 
00264 #ifdef HAVE_LONG_DOUBLE__COMPLEX
00265 
00266 int u_array_set_long_double_complex (u_array_t *da, size_t idx, 
00267         long double _Complex v, long double _Complex *pold);
00268 
00270 int u_array_get_long_double_complex (u_array_t *da, size_t idx, 
00271         long double _Complex *pv);
00272 #endif  /* HAVE_LONG_DOUBLE__COMPLEX */
00273 
00278 #ifdef __cplusplus
00279 }
00280 #endif  /* __cplusplus */
00281 
00282 #endif /* !_U_ARRAY_H_ */

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