00001 /** @file psVector.h 00002 * 00003 * @brief Contains basic vector definitions and operations 00004 * 00005 * This file defines the basic type for a vector struct and functions useful 00006 * in manupulating vectors. 00007 * 00008 * @ingroup Vector 00009 * 00010 * @author Robert DeSonia, MHPCC 00011 * @author Ross Harman, MHPCC 00012 * 00013 * @version $Revision: 1.50 $ $Name: rel9_0 $ 00014 * @date $Date: 2005/11/16 23:06:21 $ 00015 * 00016 * Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii 00017 */ 00018 00019 #ifndef PS_VECTOR_H 00020 #define PS_VECTOR_H 00021 00022 #include<stdio.h> 00023 00024 #include "psType.h" 00025 00026 /// @addtogroup Vector 00027 /// @{ 00028 00029 /** An vector to support primitive types. 00030 * 00031 * Struct for maintaining an vector of frequently used primitive types. 00032 * 00033 */ 00034 typedef struct 00035 { 00036 psMathType type; ///< Type of data. 00037 long n; ///< Number of elements in use. 00038 const long nalloc; ///< Total number of elements available. 00039 union { 00040 psS8* S8; ///< Signed 8-bit integer data. 00041 psS16* S16; ///< Signed 16-bit integer data. 00042 psS32* S32; ///< Signed 32-bit integer data. 00043 psS64* S64; ///< Signed 64-bit integer data. 00044 psU8* U8; ///< Unsigned 8-bit integer data. 00045 psU16* U16; ///< Unsigned 16-bit integer data. 00046 psU32* U32; ///< Unsigned 32-bit integer data. 00047 psU64* U64; ///< Unsigned 64-bit integer data. 00048 psF32* F32; ///< Single-precision float data. 00049 psF64* F64; ///< Double-precision float data. 00050 psC32* C32; ///< Single-precision complex data. 00051 psC64* C64; ///< Double-precision complex data. 00052 } data; 00053 void *lock; ///< Optional lock for thread safety. 00054 } 00055 psVector; 00056 00057 #define P_PSVECTOR_SET_NALLOC(vec,n) *(long*)&(vec->nalloc) = n 00058 00059 /*****************************************************************************/ 00060 00061 /* FUNCTION PROTOTYPES */ 00062 00063 /*****************************************************************************/ 00064 00065 /** Checks the type of a particular pointer. 00066 * 00067 * Uses the appropriate deallocation function in psMemBlock to check the ptr datatype. 00068 * 00069 * @return bool: True if the pointer matches a psVector structure, false otherwise. 00070 */ 00071 bool psMemCheckVector( 00072 psPtr ptr ///< the pointer whose type to check 00073 ) 00074 ; 00075 00076 /** Allocate a vector. 00077 * 00078 * Uses psLib memory allocation functions to create a vector collection of 00079 * data as defined by the psType type. 00080 * 00081 * @return psVector* Pointer to psVector. 00082 */ 00083 psVector* psVectorAlloc( 00084 long nalloc, ///< Total number of elements to make available. 00085 psElemType type ///< Type of data to be held by vector. 00086 ); 00087 00088 /** Reallocate a vector. 00089 * 00090 * Uses psLib memory allocation functions to reallocate a vector collection 00091 * of data. The vector is reallocated according to the psType type member 00092 * contained within the vector. 00093 * 00094 * @return psVector* Pointer to psVector. 00095 * 00096 */ 00097 psVector* psVectorRealloc( 00098 psVector* vector, ///< Vector to reallocate. 00099 long nalloc ///< Total number of elements to make available. 00100 ); 00101 00102 /** Extend a vector's length. 00103 * 00104 * Increments a vector's length, n, by the specified number of elements. 00105 * If the allocated storage is less than the current vector's length plus 00106 * twice the number of elements to be added, it is reallocated larger by 00107 * a given amount. 00108 * 00109 * @return psVector* Pointer to the adjusted psVector 00110 */ 00111 psVector *psVectorExtend( 00112 psVector *vector, ///< Vector to extend 00113 long delta, ///< Amount to expand allocation, if necessary 00114 long nExtend ///< Number of elements to add to vector length 00115 ); 00116 00117 /** Recycle a vector. 00118 * 00119 * Uses psLib memory allocation functions to reallocate a vector collection 00120 * of data. The vector is reallocated according to the psElemType type 00121 * parameter. 00122 * 00123 * @return psVector* Pointer to psVector. 00124 * 00125 */ 00126 psVector* psVectorRecycle( 00127 psVector* vector, 00128 ///< Vector to recycle. If NULL, a new vector is created. No effort 00129 ///< taken to preserve the values. 00130 00131 long nalloc, ///< Total number of elements to make available. 00132 psElemType type ///< the datatype of the returned vector 00133 ); 00134 00135 /** Copy a vector, converting types. 00136 * 00137 * Performs a deep copy of the elements of one psVector to a new psVector, 00138 * converting numeric types to a specified type. 00139 * 00140 * @return psVector* Pointer to resulting psVector. 00141 * 00142 */ 00143 psVector* psVectorCopy( 00144 psVector* output, ///< if non-NULL, a psVector to recycle 00145 const psVector* input, ///< the vector to copy. 00146 psElemType type ///< the data type of the resulting psVector 00147 ); 00148 00149 /** Sort an array of floats. 00150 * 00151 * Sorts an array of floats in ascending order. This function is valid for 00152 * all non-complex data types. 00153 * 00154 * @return psVector* Pointer to sorted psVector. 00155 */ 00156 psVector* psVectorSort( 00157 psVector* outVector, ///< the output vector to recycle, or NULL if new vector desired. 00158 const psVector* inVector ///< the vector to sort. 00159 ); 00160 00161 /** Creates an array of indices based on sort ordered of array. 00162 * 00163 * Sorts a vector and creates an integer array holding indices of 00164 * sorted float values based on pre-sort index positions. 00165 * 00166 * @return psVector* vector of the indices of sort. 00167 */ 00168 psVector* psVectorSortIndex( 00169 psVector* outVector, ///< vector to recycle 00170 const psVector* inVector ///< vector to sort 00171 ); 00172 00173 /** Creates a string from a psVector's values in the form "[x0,x1,x2]". 00174 * 00175 * @return psPtr a newly allocated string 00176 */ 00177 char* psVectorToString( 00178 psVector* vector, ///< vector to create a string from 00179 int maxLength ///< the maximum length of the resulting string 00180 ); 00181 00182 /** Returns an element in the vector as a psF64 value 00183 * 00184 * @return psF64 the value at specified position, or NAN if position is invalid. 00185 */ 00186 psF64 p_psVectorGetElementF64( 00187 psVector* vector, ///< vector to retrieve element 00188 int position ///< the vector position to get 00189 ); 00190 00191 /** Print a vector to a stream 00192 * 00193 * @return psBool TRUE is successful, otherwise FALSE. 00194 */ 00195 bool p_psVectorPrint ( 00196 int fd, ///< output file descriptor 00197 psVector *a, ///< vector to print 00198 char *name ///< name of vector (for title) 00199 ); 00200 00201 /** Initializes the vector with the given value. 00202 * 00203 * The input data is cast to match the vector datatype, allowing for integers to be preserved. 00204 * 00205 * @return bool: True if successful, otherwise false. 00206 */ 00207 bool psVectorInit( 00208 psVector *vector, ///< the vector to be initialized 00209 ... ///< Variable argument list for initialization 00210 ); 00211 00212 /** Creates a new vector, or reallocates the provided vector if input is not NULL. 00213 * 00214 * The created vector consists of the data range starting at lower, running to upper, 00215 * in steps of delta. The upper-end value is exclusive; the sequence is equivalent to 00216 * for (x = lower; x <= upper - 1; x += delta). 00217 * 00218 * @return psVector*: the newly created psVector 00219 */ 00220 psVector *psVectorCreate ( 00221 psVector *input, ///< Input vector 00222 double lower, ///< lower bound 00223 double upper, ///< upper bound 00224 double delta, ///< size of increment 00225 psElemType type ///< type of vector to create 00226 ); 00227 00228 /** Sets the value of the input vector at the specified position to value. 00229 * 00230 * A negative position means index from the end. 00231 * 00232 * @return bool: True if successful, otherwise false. 00233 */ 00234 bool psVectorSet( 00235 const psVector *input, ///< Input vector to set 00236 long position, ///< vector position 00237 complex value ///< value to set 00238 ); 00239 00240 /** Returns the value of the input vector at the specified position. 00241 * 00242 * A negative position means index from the end. 00243 * 00244 * @return complex: Value of the input vector at the specified position. 00245 */ 00246 complex psVectorGet( 00247 const psVector *input, ///< Input vector from which to get value 00248 long position ///< vector position 00249 ); 00250 00251 /** Returns the number of pixels in the vector which satisfy any of the mask bits. 00252 * 00253 * An error (eg, invalid vector) results in a return value of -1. The vector must be U8. 00254 * 00255 * @return long: the number of pixels counted 00256 */ 00257 long psVectorCountPixelMask( 00258 psVector *mask, ///< input vector to count 00259 psMaskType value ///< the mask value to satisfy 00260 ); 00261 00262 /// @} 00263 00264 #endif // #ifndef PS_VECTOR_H
1.4.2