Changeset 18311
- Timestamp:
- Jun 24, 2008, 11:32:52 AM (18 years ago)
- Location:
- trunk/psLib/src/mathtypes
- Files:
-
- 2 edited
-
psVector.c (modified) (2 diffs)
-
psVector.h (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psLib/src/mathtypes/psVector.c
r15713 r18311 10 10 * @author Joshua Hoblitt, University of Hawaii 11 11 * 12 * @version $Revision: 1.10 1$ $Name: not supported by cvs2svn $13 * @date $Date: 200 7-11-29 21:46:54$12 * @version $Revision: 1.102 $ $Name: not supported by cvs2svn $ 13 * @date $Date: 2008-06-24 21:32:52 $ 14 14 * 15 15 * Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii … … 463 463 } 464 464 465 // Selection for different vector types 466 #define PSVECTOR_SELECT_CASE(TYPE, COMPAREFUNC, SWAPFUNC, SWAPTYPE) \ 467 case 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 474 bool 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 505 psVector *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 465 530 psString psVectorToString(const psVector* vector, 466 531 int maxLength) -
trunk/psLib/src/mathtypes/psVector.h
r15069 r18311 10 10 * @author Joshua Hoblitt, University of Hawaii 11 11 * 12 * @version $Revision: 1.7 0$ $Name: not supported by cvs2svn $13 * @date $Date: 200 7-09-28 20:59:37$12 * @version $Revision: 1.71 $ $Name: not supported by cvs2svn $ 13 * @date $Date: 2008-06-24 21:32:52 $ 14 14 * Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii 15 15 */ … … 247 247 ); 248 248 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. 254 bool 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. 262 psVector *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 249 268 /** Creates a string from a psVector's values in the form "[x0,x1,x2]". 250 269 *
Note:
See TracChangeset
for help on using the changeset viewer.
