IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 18311


Ignore:
Timestamp:
Jun 24, 2008, 11:32:52 AM (18 years ago)
Author:
Paul Price
Message:

Adding selection functions.

Location:
trunk/psLib/src/mathtypes
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/psLib/src/mathtypes/psVector.c

    r15713 r18311  
    1010*  @author Joshua Hoblitt, University of Hawaii
    1111*
    12 *  @version $Revision: 1.101 $ $Name: not supported by cvs2svn $
    13 *  @date $Date: 2007-11-29 21:46:54 $
     12*  @version $Revision: 1.102 $ $Name: not supported by cvs2svn $
     13*  @date $Date: 2008-06-24 21:32:52 $
    1414*
    1515*  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
     
    463463}
    464464
     465// Selection for different vector types
     466#define PSVECTOR_SELECT_CASE(TYPE, COMPAREFUNC, SWAPFUNC, SWAPTYPE) \
     467case PS_TYPE_##TYPE: { \
     468    ps##TYPE *value = vector->data.TYPE; \
     469    PSSELECT(vector->n, rank, PSVECTOR_SORT_COMPARE_DIRECT, PSVECTOR_SORT_SWAP_DIRECT, SWAPTYPE); \
     470    break; \
     471}
     472
     473
     474bool psVectorSelectInPlace(psVector *vector, long rank)
     475{
     476    PS_ASSERT_VECTOR_NON_NULL(vector, false);
     477    PS_ASSERT_INT_NONNEGATIVE(rank, false);
     478    PS_ASSERT_INT_LESS_THAN(rank, vector->n, false);
     479
     480    if (vector->n < 2) {
     481        // Already sorted!
     482        return true;
     483    }
     484
     485    switch (vector->type.type) {
     486        PSVECTOR_SELECT_CASE(U8 , PSVECTOR_SORT_COMPARE_DIRECT, PSVECTOR_SORT_SWAP_DIRECT, U8 );
     487        PSVECTOR_SELECT_CASE(U16, PSVECTOR_SORT_COMPARE_DIRECT, PSVECTOR_SORT_SWAP_DIRECT, U16);
     488        PSVECTOR_SELECT_CASE(U32, PSVECTOR_SORT_COMPARE_DIRECT, PSVECTOR_SORT_SWAP_DIRECT, U32);
     489        PSVECTOR_SELECT_CASE(U64, PSVECTOR_SORT_COMPARE_DIRECT, PSVECTOR_SORT_SWAP_DIRECT, U64);
     490        PSVECTOR_SELECT_CASE(S8 , PSVECTOR_SORT_COMPARE_DIRECT, PSVECTOR_SORT_SWAP_DIRECT, S8 );
     491        PSVECTOR_SELECT_CASE(S16, PSVECTOR_SORT_COMPARE_DIRECT, PSVECTOR_SORT_SWAP_DIRECT, S16);
     492        PSVECTOR_SELECT_CASE(S32, PSVECTOR_SORT_COMPARE_DIRECT, PSVECTOR_SORT_SWAP_DIRECT, S32);
     493        PSVECTOR_SELECT_CASE(S64, PSVECTOR_SORT_COMPARE_DIRECT, PSVECTOR_SORT_SWAP_DIRECT, S64);
     494        PSVECTOR_SELECT_CASE(F32, PSVECTOR_SORT_COMPARE_DIRECT, PSVECTOR_SORT_SWAP_DIRECT, F32);
     495        PSVECTOR_SELECT_CASE(F64, PSVECTOR_SORT_COMPARE_DIRECT, PSVECTOR_SORT_SWAP_DIRECT, F64);
     496    default:
     497        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
     498                _("Input psVector is an unsupported type (0x%x)."),
     499                vector->type.type);
     500        return false;
     501    }
     502    return true;
     503}
     504
     505psVector *psVectorSelect(psVector *out, const psVector *in, long rank)
     506{
     507    PS_ASSERT_VECTOR_NON_NULL(in, NULL);
     508    PS_ASSERT_INT_NONNEGATIVE(rank, false);
     509    PS_ASSERT_INT_LESS_THAN(rank, in->n, false);
     510
     511    if (out != in) {
     512        out = psVectorCopy(out, in, in->type.type);
     513        if (!out) {
     514            psError(PS_ERR_UNKNOWN, false, "Unable to copy vector to select.");
     515            return NULL;
     516        }
     517    }
     518
     519    if (!psVectorSelectInPlace(out, rank)) {
     520        if (out != in) {
     521            // It was allocated here.
     522            psFree(out);
     523        }
     524        return NULL;
     525    }
     526
     527    return out;
     528}
     529
    465530psString psVectorToString(const psVector* vector,
    466531                          int maxLength)
  • trunk/psLib/src/mathtypes/psVector.h

    r15069 r18311  
    1010 * @author Joshua Hoblitt, University of Hawaii
    1111 *
    12  * @version $Revision: 1.70 $ $Name: not supported by cvs2svn $
    13  * @date $Date: 2007-09-28 20:59:37 $
     12 * @version $Revision: 1.71 $ $Name: not supported by cvs2svn $
     13 * @date $Date: 2008-06-24 21:32:52 $
    1414 * Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
    1515 */
     
    247247);
    248248
     249
     250/// Select a ranked element within a vector; operations are performed in-place
     251///
     252/// Selection orders the vector so that the element of the nominated rank is in the correct place.  No
     253/// guarantee is made about other elements.
     254bool psVectorSelectInPlace(psVector *vector, ///< Vector from which to select
     255                           long rank    ///< Rank of interest
     256    );
     257
     258/// Select a ranked element within a vector; operations are performed on a copy
     259///
     260/// Selection orders the vector so that the element of the nominated rank is in the correct place.  No
     261/// guarantee is made about other elements.
     262psVector *psVectorSelect(psVector *out, ///< Output vector, or NULL
     263                         const psVector *in, ///< Vector from which to select
     264                         long rank      ///< Rank of interest
     265    );
     266
     267
    249268/** Creates a string from a psVector's values in the form "[x0,x1,x2]".
    250269 *
Note: See TracChangeset for help on using the changeset viewer.