pl-nk v0.4.5
Plonk|Plink|Plank are a set of cross-platform C/C++ frameworks for audio software development
plank_Vectors.h
00001 /*
00002  -------------------------------------------------------------------------------
00003  This file is part of the Plink, Plonk, Plank libraries
00004   by Martin Robinson
00005  
00006  http://code.google.com/p/pl-nk/
00007  
00008  Copyright University of the West of England, Bristol 2011-14
00009  All rights reserved.
00010  
00011  Redistribution and use in source and binary forms, with or without
00012  modification, are permitted provided that the following conditions are met:
00013  
00014  * Redistributions of source code must retain the above copyright
00015    notice, this list of conditions and the following disclaimer.
00016  * Redistributions in binary form must reproduce the above copyright
00017    notice, this list of conditions and the following disclaimer in the
00018    documentation and/or other materials provided with the distribution.
00019  * Neither the name of University of the West of England, Bristol nor 
00020    the names of its contributors may be used to endorse or promote products
00021    derived from this software without specific prior written permission.
00022  
00023  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
00024  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
00025  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
00026  DISCLAIMED. IN NO EVENT SHALL UNIVERSITY OF THE WEST OF ENGLAND, BRISTOL BE 
00027  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
00028  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 
00029  GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 
00030  HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
00031  LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 
00032  OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
00033  
00034  This software makes use of third party libraries. For more information see:
00035  doc/license.txt included in the distribution.
00036  -------------------------------------------------------------------------------
00037  */
00038 
00039 #ifndef PLANK_VECTORS_H
00040 #define PLANK_VECTORS_H
00041 
00042 #include "../plank_Maths.h"
00043 
00051 #define PLANK_VECTOR_NAMEINTERNAL(OP,TYPECODE,SUFFIX) pl_Vector##OP##TYPECODE##SUFFIX
00052 
00053 #define PLANK_VECTORUNARYOP_NAME(OP,TYPECODE) PLANK_VECTOR_NAMEINTERNAL(OP,TYPECODE,_NN)
00054 
00055 #define PLANK_VECTORUNARYOP_DEFINE(OP,TYPECODE) \
00056 \
00062     static inline void PLANK_VECTORUNARYOP_NAME(OP,TYPECODE) (Plank##TYPECODE *result, const Plank##TYPECODE* a, PlankUL N) {\
00063                 PlankUL i; for (i = 0; i < N; PLANK_INC(i)) { result[i] = pl_##OP##TYPECODE (a[i]); }\
00064     }
00065 
00066 #define PLANK_VECTORBINARYOPVECTOR_NAME(OP,TYPECODE) PLANK_VECTOR_NAMEINTERNAL(OP,TYPECODE,_NNN)
00067 #define PLANK_VECTORBINARYOPSCALAR_NAME(OP,TYPECODE) PLANK_VECTOR_NAMEINTERNAL(OP,TYPECODE,_NN1)
00068 #define PLANK_SCALARBINARYOPVECTOR_NAME(OP,TYPECODE) PLANK_VECTOR_NAMEINTERNAL(OP,TYPECODE,_N1N)
00069 
00070 #define PLANK_VECTORBINARYOPVECTOR_DEFINE(OP,TYPECODE) \
00071 \
00078     static inline void PLANK_VECTORBINARYOPVECTOR_NAME(OP,TYPECODE) (Plank##TYPECODE *result, const Plank##TYPECODE* a, const Plank##TYPECODE* b, PlankUL N) {\
00079                 PlankUL i; for (i = 0; i < N; PLANK_INC(i)) { result[i] = pl_##OP##TYPECODE (a[i], b[i]); }\
00080     }
00081     
00082 #define PLANK_VECTORBINARYOPSCALAR_DEFINE(OP,TYPECODE) \
00083 \
00090     static inline void PLANK_VECTORBINARYOPSCALAR_NAME(OP,TYPECODE) (Plank##TYPECODE *result, const Plank##TYPECODE* a, Plank##TYPECODE b, PlankUL N) {\
00091                 PlankUL i; for (i = 0; i < N; PLANK_INC(i)) { result[i] = pl_##OP##TYPECODE (a[i], b); }\
00092     }
00093 
00094 #define PLANK_SCALARBINARYOPVECTOR_DEFINE(OP,TYPECODE) \
00095 \
00102     static inline void PLANK_SCALARBINARYOPVECTOR_NAME(OP,TYPECODE) (Plank##TYPECODE *result, Plank##TYPECODE a, const Plank##TYPECODE* b, PlankUL N) {\
00103                 PlankUL i; for (i = 0; i < N; PLANK_INC(i)) { result[i] = pl_##OP##TYPECODE (a, b[i]); }\
00104     }
00105 
00106 
00107 #define PLANK_VECTORBINARYOP_DEFINE(OP,TYPECODE) \
00108     PLANK_VECTORBINARYOPVECTOR_DEFINE(OP,TYPECODE)\
00109     PLANK_VECTORBINARYOPSCALAR_DEFINE(OP,TYPECODE)\
00110     PLANK_SCALARBINARYOPVECTOR_DEFINE(OP,TYPECODE)
00111 
00112 #define PLANK_VECTORMULADD_NAME(TYPECODE) PLANK_VECTOR_NAMEINTERNAL(MulAdd,TYPECODE,_NNNN)
00113 #define PLANK_VECTORMULADDINPLACE_NAME(TYPECODE) PLANK_VECTOR_NAMEINTERNAL(MulAdd,TYPECODE,_NNN)
00114 #define PLANK_VECTORMULSCALARADD_NAME(TYPECODE) PLANK_VECTOR_NAMEINTERNAL(MulAdd,TYPECODE,_NNN1)
00115 #define PLANK_VECTORSCALARMULSCALARADD_NAME(TYPECODE) PLANK_VECTOR_NAMEINTERNAL(MulAdd,TYPECODE,_NN11)
00116 #define PLANK_VECTORSCALARMULADD_NAME(TYPECODE) PLANK_VECTOR_NAMEINTERNAL(MulAdd,TYPECODE,_NN1N)
00117 #define PLANK_VECTORADDVECTORMUL_NAME(TYPECODE) PLANK_VECTOR_NAMEINTERNAL(AddMul,TYPECODE,_1NN)
00118 
00119 
00120 #define PLANK_VECTORMULADD_DEFINE(TYPECODE) \
00121 \
00128     static inline void PLANK_VECTORMULADD_NAME(TYPECODE) (Plank##TYPECODE *result, const Plank##TYPECODE* input, const Plank##TYPECODE* mul, const Plank##TYPECODE* add, PlankUL N) {\
00129         PlankUL i; for (i = 0; i < N; PLANK_INC(i)) { result[i] = pl_Add##TYPECODE (pl_Mul##TYPECODE (input[i], mul[i]), add[i]); }\
00130     }
00131 
00132 
00133 #define PLANK_VECTORMULADDINPLACE_DEFINE(TYPECODE) \
00134 \
00140     static inline void PLANK_VECTORMULADDINPLACE_NAME(TYPECODE) (Plank##TYPECODE *io, const Plank##TYPECODE* mul, const Plank##TYPECODE* add, PlankUL N) {\
00141                 PlankUL i; for (i = 0; i < N; PLANK_INC(i)) { io[i] = pl_Add##TYPECODE (pl_Mul##TYPECODE (io[i], mul[i]), add[i]); }\
00142     }
00143 
00144 #define PLANK_VECTORMULSCALARADD_DEFINE(TYPECODE) \
00145 \
00151     static inline void PLANK_VECTORMULSCALARADD_NAME(TYPECODE) (Plank##TYPECODE *result, const Plank##TYPECODE* input, const Plank##TYPECODE* mul, Plank##TYPECODE add, PlankUL N) {\
00152         PlankUL i; for (i = 0; i < N; PLANK_INC(i)) { result[i] = pl_Add##TYPECODE (pl_Mul##TYPECODE (input[i], mul[i]), add); }\
00153     }
00154 
00155 #define PLANK_VECTORSCALARMULSCALARADD_DEFINE(TYPECODE) \
00156 \
00162     static inline void PLANK_VECTORSCALARMULSCALARADD_NAME(TYPECODE) (Plank##TYPECODE *result, const Plank##TYPECODE* input, Plank##TYPECODE mul, Plank##TYPECODE add, PlankUL N) {\
00163         PlankUL i; for (i = 0; i < N; PLANK_INC(i)) { result[i] = pl_Add##TYPECODE (pl_Mul##TYPECODE (input[i], mul), add); }\
00164     }
00165 
00166 #define PLANK_VECTORSCALARMULADD_DEFINE(TYPECODE) \
00167 \
00173     static inline void PLANK_VECTORSCALARMULADD_NAME(TYPECODE) (Plank##TYPECODE *result, const Plank##TYPECODE* input, Plank##TYPECODE mul, const Plank##TYPECODE* add, PlankUL N) {\
00174         PlankUL i; for (i = 0; i < N; PLANK_INC(i)) { result[i] = pl_Add##TYPECODE (pl_Mul##TYPECODE (input[i], mul), add[i]); }\
00175     }
00176 
00177 #define PLANK_VECTORADDVECTORMUL_DEFINE(TYPECODE)\
00178     static inline void PLANK_VECTORADDVECTORMUL_NAME(TYPECODE) (Plank##TYPECODE *result, const Plank##TYPECODE* a, const Plank##TYPECODE* b, PlankUL N) {\
00179         PlankUL i;\
00180         *result = (Plank##TYPECODE)0;\
00181         for (i = 0; i < N; PLANK_INC(i)) { *result = pl_Add##TYPECODE (pl_Mul##TYPECODE (a[i], b[i]), *result); }\
00182     }
00183 
00184 
00185 
00186 #define PLANK_VECTORZMUL_NAME(TYPECODE) PLANK_VECTOR_NAMEINTERNAL(ZMul,TYPECODE,_ZNNNNN)
00187 
00188 #define PLANK_VECTORZMUL_DEFINE(TYPECODE) \
00189 \
00197     static inline void PLANK_VECTORZMUL_NAME(TYPECODE) (Plank##TYPECODE *resultReal, Plank##TYPECODE *resultImag,\
00198                                                         const Plank##TYPECODE* leftReal, const Plank##TYPECODE* leftImag,\
00199                                                         const Plank##TYPECODE* rightReal, const Plank##TYPECODE* rightImag,\
00200                                                         PlankUL N) {\
00201         PlankUL i;\
00202         for (i = 0; i < N; PLANK_INC(i)) {\
00203             resultReal[i] = leftReal[i] * rightReal[i] - leftImag[i] * rightImag[i];\
00204             resultImag[i] = leftReal[i] * rightImag[i] + leftImag[i] * rightReal[i];\
00205         }\
00206     }
00207 
00208 #define PLANK_VECTORFILL_NAME(TYPECODE) PLANK_VECTOR_NAMEINTERNAL(Fill,TYPECODE,_N1)
00209 
00210 #define PLANK_VECTORFILL_DEFINE(TYPECODE) \
00211 \
00212     static inline void PLANK_VECTORFILL_NAME(TYPECODE) (Plank##TYPECODE *result, Plank##TYPECODE value, PlankUL N) {\
00213                 PlankUL i; for (i = 0; i < N; PLANK_INC(i)) { result[i] = value; }\
00214     }
00215 
00216 #define PLANK_VECTORCLEAR_NAME(TYPECODE) PLANK_VECTOR_NAMEINTERNAL(Clear,TYPECODE,_N)
00217 
00218 #define PLANK_VECTORCLEAR_DEFINE(TYPECODE) \
00219 \
00220     static inline void PLANK_VECTORCLEAR_NAME(TYPECODE) (Plank##TYPECODE *result, PlankUL N) {\
00221                 PlankUL i; for (i = 0; i < N; PLANK_INC(i)) { result[i] = (Plank##TYPECODE)0; }\
00222     }
00223 
00224 #define PLANK_VECTORRAMP_NAME(TYPECODE) PLANK_VECTOR_NAMEINTERNAL(Ramp,TYPECODE,_N11)
00225 
00226 #define PLANK_VECTORRAMP_DEFINE(TYPECODE) \
00227 \
00229     static inline void PLANK_VECTORRAMP_NAME(TYPECODE) (Plank##TYPECODE *result, Plank##TYPECODE a, Plank##TYPECODE b, PlankUL N) {\
00230         PlankUL i; for (i = 0; i < N; PLANK_INC(i)) { result[i] = a; a = a + b; }\
00231     }
00232 
00233 #define PLANK_VECTORLINE_NAME(TYPECODE) PLANK_VECTOR_NAMEINTERNAL(Line,TYPECODE,_N11)
00234 
00235 #define PLANK_VECTORLINE_DEFINE(TYPECODE) \
00236 \
00238     static inline void PLANK_VECTORLINE_NAME(TYPECODE) (Plank##TYPECODE *result, Plank##TYPECODE a, Plank##TYPECODE b, PlankUL N) {\
00239         PLANK_VECTORRAMP_NAME(TYPECODE) (result, a, (b - a) / (Plank##TYPECODE)(N - 1), N);\
00240     }
00241 
00242 #define PLANK_VECTORLOOKUP_NAME(TYPECODE) PLANK_VECTOR_NAMEINTERNAL(Lookup,TYPECODE,_NnN)
00243 
00244 #define PLANK_VECTORLOOKUP_DEFINE(TYPECODE) \
00245 \
00252     static inline void PLANK_VECTORLOOKUP_NAME(TYPECODE) (Plank##TYPECODE *result, Plank##TYPECODE *table, PlankUL n, Plank##TYPECODE *index, PlankUL N) {\
00253         PlankUL i; PLANK_UNUSED(n); for (i = 0; i < N; PLANK_INC(i)) { result[i] = pl_Lookup##TYPECODE (table, index[i]); }\
00254     }
00255 
00256 
00257 #define PLANK_VECTORCONVERT_NAME(DSTTYPECODE,SRCTYPECODE)\
00258     PLANK_VECTOR_NAMEINTERNAL(Convert,SRCTYPECODE##2##DSTTYPECODE,_NN)
00259 
00260 #define PLANK_VECTORCONVERTROUND_NAME(DSTTYPECODE,SRCTYPECODE)\
00261     PLANK_VECTOR_NAMEINTERNAL(ConvertRound,SRCTYPECODE##2##DSTTYPECODE,_NN)
00262 
00263 
00264 #define PLANK_VECTORCONVERT_DEFINE(DSTTYPECODE,SRCTYPECODE) \
00265 \
00266     static inline void PLANK_VECTORCONVERT_NAME(DSTTYPECODE,SRCTYPECODE) (Plank##DSTTYPECODE *result, const Plank##SRCTYPECODE* a, PlankUL N) {\
00267         PlankUL i; for (i = 0; i < N; PLANK_INC(i)) { result[i] = (Plank##DSTTYPECODE)a[i]; }\
00268     }
00269 
00270 #define PLANK_VECTORCONVERTROUNDF_DEFINE(SRCTYPECODE) \
00271 \
00272     static inline void PLANK_VECTORCONVERTROUND_NAME(F,SRCTYPECODE) (PlankF *result, const Plank##SRCTYPECODE* a, PlankUL N) {\
00273         PlankUL i; for (i = 0; i < N; PLANK_INC(i)) { result[i] = (PlankF)a[i] + 0.5f; }\
00274     }
00275 
00276 #define PLANK_VECTORCONVERTROUNDD_DEFINE(SRCTYPECODE) \
00277 \
00278     static inline void PLANK_VECTORCONVERTROUND_NAME(D,SRCTYPECODE) (PlankD *result, const Plank##SRCTYPECODE* a, PlankUL N) {\
00279         PlankUL i; for (i = 0; i < N; PLANK_INC(i)) { result[i] = (PlankD)a[i] + 0.5; }\
00280     }
00281 
00282 #define PLANK_VECTORCONVERTERS_DEFINE\
00283     PLANK_VECTORCONVERT_DEFINE(I,C)\
00284     PLANK_VECTORCONVERT_DEFINE(S,C)\
00285     PLANK_VECTORCONVERT_DEFINE(F,C)\
00286     PLANK_VECTORCONVERT_DEFINE(D,C)\
00287     PLANK_VECTORCONVERT_DEFINE(LL,C)\
00288     PLANK_VECTORCONVERT_DEFINE(C,I)\
00289     PLANK_VECTORCONVERT_DEFINE(S,I)\
00290     PLANK_VECTORCONVERT_DEFINE(F,I)\
00291     PLANK_VECTORCONVERT_DEFINE(D,I)\
00292     PLANK_VECTORCONVERT_DEFINE(LL,I)\
00293     PLANK_VECTORCONVERT_DEFINE(C,S)\
00294     PLANK_VECTORCONVERT_DEFINE(I,S)\
00295     PLANK_VECTORCONVERT_DEFINE(F,S)\
00296     PLANK_VECTORCONVERT_DEFINE(D,S)\
00297     PLANK_VECTORCONVERT_DEFINE(LL,S)\
00298     PLANK_VECTORCONVERT_DEFINE(C,F)\
00299     PLANK_VECTORCONVERT_DEFINE(I,F)\
00300     PLANK_VECTORCONVERT_DEFINE(S,F)\
00301     PLANK_VECTORCONVERT_DEFINE(D,F)\
00302     PLANK_VECTORCONVERT_DEFINE(LL,F)\
00303     PLANK_VECTORCONVERT_DEFINE(C,D)\
00304     PLANK_VECTORCONVERT_DEFINE(I,D)\
00305     PLANK_VECTORCONVERT_DEFINE(S,D)\
00306     PLANK_VECTORCONVERT_DEFINE(F,D)\
00307     PLANK_VECTORCONVERT_DEFINE(LL,D)\
00308     PLANK_VECTORCONVERT_DEFINE(C,LL)\
00309     PLANK_VECTORCONVERT_DEFINE(I,LL)\
00310     PLANK_VECTORCONVERT_DEFINE(S,LL)\
00311     PLANK_VECTORCONVERT_DEFINE(F,LL)\
00312     PLANK_VECTORCONVERT_DEFINE(D,LL)
00313 
00314 #define PLANK_VECTORCONVERTERSROUND_DEFINE\
00315     PLANK_VECTORCONVERTROUNDF_DEFINE(C)\
00316     PLANK_VECTORCONVERTROUNDF_DEFINE(I)\
00317     PLANK_VECTORCONVERTROUNDF_DEFINE(S)\
00318     PLANK_VECTORCONVERTROUNDF_DEFINE(LL)\
00319     PLANK_VECTORCONVERTROUNDD_DEFINE(C)\
00320     PLANK_VECTORCONVERTROUNDD_DEFINE(I)\
00321     PLANK_VECTORCONVERTROUNDD_DEFINE(S)\
00322     PLANK_VECTORCONVERTROUNDD_DEFINE(LL)
00323 
00324 // int and float support available
00325 #define PLANK_VECTOR_OPS_COMMON(TYPECODE)\
00326     PLANK_VECTORFILL_DEFINE(TYPECODE)\
00327     PLANK_VECTORCLEAR_DEFINE(TYPECODE)\
00328     PLANK_VECTORRAMP_DEFINE(TYPECODE)\
00329     PLANK_VECTORLINE_DEFINE(TYPECODE)\
00330     \
00331     PLANK_VECTORUNARYOP_DEFINE(Move,TYPECODE)\
00332     PLANK_VECTORUNARYOP_DEFINE(Inc,TYPECODE)\
00333     PLANK_VECTORUNARYOP_DEFINE(Dec,TYPECODE)\
00334     PLANK_VECTORUNARYOP_DEFINE(Neg,TYPECODE)\
00335     PLANK_VECTORUNARYOP_DEFINE(Abs,TYPECODE)\
00336     PLANK_VECTORUNARYOP_DEFINE(Squared,TYPECODE)\
00337     PLANK_VECTORUNARYOP_DEFINE(Cubed,TYPECODE)\
00338     PLANK_VECTORUNARYOP_DEFINE(Sign,TYPECODE)\
00339     \
00340     PLANK_VECTORBINARYOP_DEFINE(Add,TYPECODE)\
00341     PLANK_VECTORBINARYOP_DEFINE(Sub,TYPECODE)\
00342     PLANK_VECTORBINARYOP_DEFINE(Mul,TYPECODE)\
00343     PLANK_VECTORBINARYOP_DEFINE(Div,TYPECODE)\
00344     PLANK_VECTORBINARYOP_DEFINE(Mod,TYPECODE)\
00345     PLANK_VECTORBINARYOP_DEFINE(Min,TYPECODE)\
00346     PLANK_VECTORBINARYOP_DEFINE(Max,TYPECODE)\
00347     \
00348     PLANK_VECTORBINARYOP_DEFINE(IsEqualTo,TYPECODE)\
00349     PLANK_VECTORBINARYOP_DEFINE(IsNotEqualTo,TYPECODE)\
00350     PLANK_VECTORBINARYOP_DEFINE(IsGreaterThan,TYPECODE)\
00351     PLANK_VECTORBINARYOP_DEFINE(IsGreaterThanOrEqualTo,TYPECODE)\
00352     PLANK_VECTORBINARYOP_DEFINE(IsLessThan,TYPECODE)\
00353     PLANK_VECTORBINARYOP_DEFINE(IsLessThanOrEqualTo,TYPECODE)\
00354     \
00355     PLANK_VECTORBINARYOP_DEFINE(SumSqr,TYPECODE)\
00356     PLANK_VECTORBINARYOP_DEFINE(DifSqr,TYPECODE)\
00357     PLANK_VECTORBINARYOP_DEFINE(SqrSum,TYPECODE)\
00358     PLANK_VECTORBINARYOP_DEFINE(SqrDif,TYPECODE)\
00359     PLANK_VECTORBINARYOP_DEFINE(AbsDif,TYPECODE)\
00360     PLANK_VECTORBINARYOP_DEFINE(Thresh,TYPECODE)\
00361     \
00362     PLANK_VECTORMULADD_DEFINE(TYPECODE)\
00363     PLANK_VECTORMULADDINPLACE_DEFINE(TYPECODE)\
00364     PLANK_VECTORMULSCALARADD_DEFINE(TYPECODE)\
00365     PLANK_VECTORSCALARMULSCALARADD_DEFINE(TYPECODE)\
00366     PLANK_VECTORSCALARMULADD_DEFINE(TYPECODE)\
00367     PLANK_VECTORADDVECTORMUL_DEFINE(TYPECODE)\
00368     \
00369     PLANK_VECTORLOOKUP_DEFINE(TYPECODE)
00370 
00371 // extra ops for float/double (+fixed?) only
00372 #define PLANK_VECTOR_OPS_ALL(TYPECODE)\
00373     PLANK_VECTOR_OPS_COMMON(TYPECODE)\
00374     \
00375     PLANK_VECTORUNARYOP_DEFINE(Log2,TYPECODE)\
00376     PLANK_VECTORUNARYOP_DEFINE(Reciprocal,TYPECODE)\
00377     PLANK_VECTORUNARYOP_DEFINE(Sin,TYPECODE)\
00378     PLANK_VECTORUNARYOP_DEFINE(Cos,TYPECODE)\
00379     PLANK_VECTORUNARYOP_DEFINE(Tan,TYPECODE)\
00380     PLANK_VECTORUNARYOP_DEFINE(Asin,TYPECODE)\
00381     PLANK_VECTORUNARYOP_DEFINE(Acos,TYPECODE)\
00382     PLANK_VECTORUNARYOP_DEFINE(Atan,TYPECODE)\
00383     PLANK_VECTORUNARYOP_DEFINE(Sinh,TYPECODE)\
00384     PLANK_VECTORUNARYOP_DEFINE(Cosh,TYPECODE)\
00385     PLANK_VECTORUNARYOP_DEFINE(Tanh,TYPECODE)\
00386     PLANK_VECTORUNARYOP_DEFINE(Sqrt,TYPECODE)\
00387     PLANK_VECTORUNARYOP_DEFINE(Log,TYPECODE)\
00388     PLANK_VECTORUNARYOP_DEFINE(Log10,TYPECODE)\
00389     PLANK_VECTORUNARYOP_DEFINE(Exp,TYPECODE)\
00390     PLANK_VECTORUNARYOP_DEFINE(Ceil,TYPECODE)\
00391     PLANK_VECTORUNARYOP_DEFINE(Floor,TYPECODE)\
00392     PLANK_VECTORUNARYOP_DEFINE(Frac,TYPECODE)\
00393     PLANK_VECTORUNARYOP_DEFINE(M2F,TYPECODE)\
00394     PLANK_VECTORUNARYOP_DEFINE(F2M,TYPECODE)\
00395     PLANK_VECTORUNARYOP_DEFINE(A2dB,TYPECODE)\
00396     PLANK_VECTORUNARYOP_DEFINE(dB2A,TYPECODE)\
00397     PLANK_VECTORUNARYOP_DEFINE(D2R,TYPECODE)\
00398     PLANK_VECTORUNARYOP_DEFINE(R2D,TYPECODE)\
00399     PLANK_VECTORUNARYOP_DEFINE(Distort,TYPECODE)\
00400     PLANK_VECTORUNARYOP_DEFINE(Zap,TYPECODE)\
00401     \
00402     PLANK_VECTORBINARYOP_DEFINE(Pow,TYPECODE)\
00403     PLANK_VECTORBINARYOP_DEFINE(Hypot,TYPECODE)\
00404     PLANK_VECTORBINARYOP_DEFINE(Atan2,TYPECODE)
00405 
00407 
00408 #if defined(PLANK_VEC_VDSP) //&& !DOXYGEN
00409     #include "plank_vDSP.h"
00410 #elif defined(PLANK_VEC_OTHERLIB) //etc!
00411     #include "some other vector lib" // must define PLANK_VEC_CUSTOM
00412 #endif
00413 
00414 #if !defined(PLANK_VEC_CUSTOM) || DOXYGEN
00415 
00438 PLANK_VECTOR_OPS_ALL(F)
00439 PLANK_VECTOR_OPS_ALL(D)
00440 PLANK_VECTOR_OPS_COMMON(S)
00441 PLANK_VECTOR_OPS_COMMON(I)
00442 PLANK_VECTOR_OPS_COMMON(LL)
00443 PLANK_VECTORCONVERTERS_DEFINE
00444 PLANK_VECTORCONVERTERSROUND_DEFINE
00445 
00446 PLANK_VECTORZMUL_DEFINE(F)
00447 PLANK_VECTORZMUL_DEFINE(D)
00448 
00449 #define PLANK_SIMDF_LENGTH   1 
00450 #define PLANK_SIMDF_SIZE     4 
00451 #define PLANK_SIMDF_SHIFT    0   
00452 #define PLANK_SIMDF_MASK     0  
00453 typedef PlankF PlankVF;
00454 
00455 #define PLANK_SIMDD_LENGTH   1 
00456 #define PLANK_SIMDD_SIZE     8 
00457 #define PLANK_SIMDD_SHIFT    0  
00458 #define PLANK_SIMDD_MASK     0  
00459 typedef PlankD PlankVD;
00460 
00461 #define PLANK_SIMDI_LENGTH   1 
00462 #define PLANK_SIMDI_SIZE     4  
00463 #define PLANK_SIMDI_SHIFT    0   
00464 #define PLANK_SIMDI_MASK     0  
00465 typedef PlankI PlankVI;
00466 
00467 #define PLANK_SIMDS_LENGTH   1 
00468 #define PLANK_SIMDS_SIZE     2   
00469 #define PLANK_SIMDS_SHIFT    0  
00470 #define PLANK_SIMDS_MASK     0   
00471 typedef PlankS PlankVS;
00472 
00473 #define PLANK_SIMDLL_LENGTH  1   // vector 1 LongLong 
00474 #define PLANK_SIMDLL_SIZE    8
00475 #define PLANK_SIMDLL_SHIFT   0   // no shift
00476 #define PLANK_SIMDLL_MASK    0   // no remainder
00477 typedef PlankLL PlankVLL;
00478 
00480 
00481 #endif // PLANK_VEC_CUSTOM
00482 
00485 static inline void pl_VectorSwapEndianUS (PlankUS* data, PlankUL N)
00486 {
00487     PlankUL i;
00488     
00489     for (i = 0; i < N; PLANK_INC (i), PLANK_INC (data))
00490         pl_SwapEndianUS (data);
00491 }
00492 
00495 static inline void pl_VectorSwapEndianS (PlankS* data, PlankUL N)
00496 {
00497     pl_VectorSwapEndianUS ((PlankUS*)data, N);
00498 }
00499 
00502 static inline void pl_VectorSwapEndianUI24 (PlankUI24* data, PlankUL N)
00503 {
00504     PlankUL i;
00505     
00506     for (i = 0; i < N; PLANK_INC (i), PLANK_INC (data))
00507         pl_SwapEndianUI24 (data);
00508 }
00509 
00512 static inline void pl_VectorSwapEndianI24 (PlankI24* data, PlankUL N)
00513 {
00514     pl_VectorSwapEndianUI24 ((PlankUI24*)data, N);
00515 }
00516 
00519 static inline void pl_VectorSwapEndianUI (PlankUI* data, PlankUL N)
00520 {
00521     PlankUL i;
00522     
00523     for (i = 0; i < N; PLANK_INC (i), PLANK_INC (data))
00524         pl_SwapEndianUI (data);
00525 }
00526 
00529 static inline void pl_VectorSwapEndianI (PlankI* data, PlankUL N)
00530 {
00531     pl_VectorSwapEndianUI ((PlankUI*)data, N);
00532 }
00533 
00536 static inline void pl_VectorSwapEndianUL (PlankUL* data, PlankUL N)
00537 {
00538     PlankUL i;
00539     
00540     for (i = 0; i < N; PLANK_INC (i), PLANK_INC (data))
00541         pl_SwapEndianUL (data);
00542 }
00543 
00546 static inline void pl_VectorSwapEndianL (PlankL* data, PlankUL N)
00547 {
00548     pl_VectorSwapEndianUL ((PlankUL*)data, N);
00549 }
00550 
00553 static inline void pl_VectorSwapEndianULL (PlankULL* data, PlankUL N)
00554 {
00555     PlankUL i;
00556     
00557     for (i = 0; i < N; PLANK_INC (i), PLANK_INC (data))
00558         pl_SwapEndianULL (data);
00559 }
00560 
00563 static inline void pl_VectorSwapEndianLL (PlankLL* data, PlankUL N)
00564 {
00565     pl_VectorSwapEndianULL ((PlankULL*)data, N);
00566 }
00567 
00568 
00569 #endif // PLANK_VECTORS_H
00570 
 All Classes Functions Typedefs Enumerations Enumerator Properties