pl-nk v0.4.5
Plonk|Plink|Plank are a set of cross-platform C/C++ frameworks for audio software development
plink_BinaryOpProcess.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 PLINK_BINARYOPPROCESS_H
00040 #define PLINK_BINARYOPPROCESS_H
00041 
00042 #include "../plink_Process.h"
00043 
00044 
00052 #define PLINK_BINARYOPPROCESS_DEFINE_NNN(OPNAME, TYPECODE)\
00053     void plink_BinaryOpProcess ## OPNAME ## TYPECODE ## _NNN (void* ppv, BinaryState* state) {\
00054         PlinkProcess##TYPECODE* pp; PlankUL N; Plank##TYPECODE* output;\
00055         const Plank##TYPECODE* left; const Plank##TYPECODE* right;\
00056         (void)state;\
00057         pp = (PlinkProcess##TYPECODE*)ppv;\
00058         N = pp->buffers[0].bufferSize;\
00059         output = pp->buffers[0].buffer;\
00060         left = pp->buffers[1].buffer;\
00061         right = pp->buffers[2].buffer;\
00062         PLANK_VECTORBINARYOPVECTOR_NAME(OPNAME,TYPECODE) (output, left, right, N);\
00063     }
00064 
00065 #define PLINK_BINARYOPPROCESS_DEFINE_NN1(OPNAME, TYPECODE)\
00066     void plink_BinaryOpProcess ## OPNAME ## TYPECODE ## _NN1 (void* ppv, BinaryState* state) {\
00067         PlinkProcess##TYPECODE* pp; PlankUL N; Plank##TYPECODE* output;\
00068         const Plank##TYPECODE* left; Plank##TYPECODE right;\
00069         (void)state;\
00070         pp = (PlinkProcess##TYPECODE*)ppv;\
00071         N = pp->buffers[0].bufferSize;\
00072         output = pp->buffers[0].buffer;\
00073         left = pp->buffers[1].buffer;\
00074         right = pp->buffers[2].buffer[0];\
00075         PLANK_VECTORBINARYOPSCALAR_NAME(OPNAME,TYPECODE) (output, left, right, N);\
00076     }
00077 
00078 #define PLINK_BINARYOPPROCESS_DEFINE_N1N(OPNAME, TYPECODE)\
00079     void plink_BinaryOpProcess ## OPNAME ## TYPECODE ## _N1N (void* ppv, BinaryState* state) {\
00080         PlinkProcess##TYPECODE* pp; PlankUL N; Plank##TYPECODE* output;\
00081         Plank##TYPECODE left; const Plank##TYPECODE* right;\
00082         (void)state;\
00083         pp = (PlinkProcess##TYPECODE*)ppv;\
00084         N = pp->buffers[0].bufferSize;\
00085         output = pp->buffers[0].buffer;\
00086         left = pp->buffers[1].buffer[0];\
00087         right = pp->buffers[2].buffer;\
00088         PLANK_SCALARBINARYOPVECTOR_NAME(OPNAME,TYPECODE) (output, left, right, N);\
00089     }
00090 
00091 #define PLINK_BINARYOPPROCESS_DEFINE_N11(OPNAME, TYPECODE)\
00092     void plink_BinaryOpProcess ## OPNAME ## TYPECODE ## _N11 (void* ppv, BinaryState* state) {\
00093         PlinkProcess##TYPECODE* pp; PlankUL N; Plank##TYPECODE* output;\
00094         Plank##TYPECODE left, right, value;\
00095         (void)state;\
00096         pp = (PlinkProcess##TYPECODE*)ppv;\
00097         N = pp->buffers[0].bufferSize;\
00098         output = pp->buffers[0].buffer;\
00099         left = pp->buffers[1].buffer[0];\
00100         right = pp->buffers[2].buffer[0];\
00101         value = pl_##OPNAME##TYPECODE (left, right);\
00102         PLANK_VECTORFILL_NAME(TYPECODE) (output, value, N);\
00103     }
00104 
00105 #define PLINK_BINARYOPPROCESS_DEFINE_NNn(OPNAME, TYPECODE)\
00106     void plink_BinaryOpProcess ## OPNAME ## TYPECODE ## _NNn (void* ppv, BinaryState* state) {\
00107         PlinkProcess##TYPECODE* pp; PlankUL N, i; Plank##TYPECODE* output;\
00108         const Plank##TYPECODE* left; const Plank##TYPECODE* right;\
00109         double rightPos, rightInc;\
00110         (void)state;\
00111         pp = (PlinkProcess##TYPECODE*)ppv;\
00112         N = pp->buffers[0].bufferSize;\
00113         output = pp->buffers[0].buffer;\
00114         left = pp->buffers[1].buffer;\
00115         right = pp->buffers[2].buffer;\
00116         rightPos = 0.0;\
00117         rightInc = (double)pp->buffers[2].bufferSize / (double)N;\
00118         for (i = 0; i < N; ++i) {\
00119             output[i] = pl_##OPNAME##TYPECODE (left[i], right[(int)rightPos]);\
00120             rightPos += rightInc;\
00121         }\
00122     }
00123 
00124 #define PLINK_BINARYOPPROCESS_DEFINE_NnN(OPNAME, TYPECODE)\
00125     void plink_BinaryOpProcess ## OPNAME ## TYPECODE ## _NnN (void* ppv, BinaryState* state) {\
00126         PlinkProcess##TYPECODE* pp; PlankUL N, i; Plank##TYPECODE* output;\
00127         const Plank##TYPECODE* left; const Plank##TYPECODE* right;\
00128         double leftPos, leftInc;\
00129         (void)state;\
00130         pp = (PlinkProcess##TYPECODE*)ppv;\
00131         N = pp->buffers[0].bufferSize;\
00132         output = pp->buffers[0].buffer;\
00133         left = pp->buffers[1].buffer;\
00134         right = pp->buffers[2].buffer;\
00135         leftPos = 0.0;\
00136         leftInc = (double)pp->buffers[1].bufferSize / (double)N;\
00137         for (i = 0; i < N; ++i) {\
00138             output[i] = pl_##OPNAME##TYPECODE (left[(int)leftPos], right[i]);\
00139             leftPos += leftInc;\
00140         }\
00141     }
00142 
00143 #define PLINK_BINARYOPPROCESS_DEFINE_Nnn(OPNAME, TYPECODE)\
00144     void plink_BinaryOpProcess ## OPNAME ## TYPECODE ## _Nnn (void* ppv, BinaryState* state) {\
00145         PlinkProcess##TYPECODE* pp; PlankUL N, i; Plank##TYPECODE* output;\
00146         const Plank##TYPECODE* left; const Plank##TYPECODE* right;\
00147         double rightPos, rightInc, leftPos, leftInc;\
00148         (void)state;\
00149         pp = (PlinkProcess##TYPECODE*)ppv;\
00150         N = pp->buffers[0].bufferSize;\
00151         output = pp->buffers[0].buffer;\
00152         left = pp->buffers[1].buffer;\
00153         right = pp->buffers[2].buffer;\
00154         leftPos = 0.0;\
00155         leftInc = (double)pp->buffers[1].bufferSize / (double)N;\
00156         rightPos = 0.0;\
00157         rightInc = (double)pp->buffers[2].bufferSize / (double)N;\
00158         for (i = 0; i < N; ++i) {\
00159             output[i] = pl_##OPNAME##TYPECODE (left[(int)leftPos], right[(int)rightPos]);\
00160             leftPos += leftInc;\
00161             rightPos += rightInc;\
00162         }\
00163     }
00164 
00165 #define PLINK_BINARYOPPROCESS_DEFINE_SELECT(OPNAME, TYPECODE)\
00166     void plink_BinaryOpProcess ## OPNAME ## TYPECODE (void* ppv, BinaryState* state) {\
00167         PlinkProcess##TYPECODE* pp; PlankUL N, n1, n2;\
00168         (void)state;\
00169         pp = (PlinkProcess##TYPECODE*)ppv;\
00170         N = pp->buffers[0].bufferSize;\
00171         n1 = pp->buffers[1].bufferSize;\
00172         n2 = pp->buffers[2].bufferSize;\
00173         \
00174         if ((n1 == N) && (n2 == N))\
00175             plink_BinaryOpProcess ## OPNAME ## TYPECODE ## _NNN (ppv, state);\
00176         else if (n2 == N)\
00177             if (n1 == 1)\
00178                 plink_BinaryOpProcess ## OPNAME ## TYPECODE ## _N1N (ppv, state);\
00179             else\
00180                 plink_BinaryOpProcess ## OPNAME ## TYPECODE ## _NnN (ppv, state);\
00181         else if (n1 == N)\
00182             if (n2 == 1)\
00183                 plink_BinaryOpProcess ## OPNAME ## TYPECODE ## _NN1 (ppv, state);\
00184             else\
00185                 plink_BinaryOpProcess ## OPNAME ## TYPECODE ## _NNn (ppv, state);\
00186         else if ((n1 == 1) && (n2 == 1))\
00187             plink_BinaryOpProcess ## OPNAME ## TYPECODE ## _N11 (ppv, state);\
00188         else\
00189             plink_BinaryOpProcess ## OPNAME ## TYPECODE ## _Nnn (ppv, state);\
00190     }
00191 
00192 #define PLINK_BINARYOPPROCESS_DECLARE(OPNAME, TYPECODE)\
00193      void PLINK_API plink_BinaryOpProcess ## OPNAME ## TYPECODE ## _NNN (void* pp, BinaryState* state);\
00194      void PLINK_API plink_BinaryOpProcess ## OPNAME ## TYPECODE ## _NN1 (void* pp, BinaryState* state);\
00195      void PLINK_API plink_BinaryOpProcess ## OPNAME ## TYPECODE ## _N1N (void* pp, BinaryState* state);\
00196      void PLINK_API plink_BinaryOpProcess ## OPNAME ## TYPECODE ## _N11 (void* pp, BinaryState* state);\
00197      void PLINK_API plink_BinaryOpProcess ## OPNAME ## TYPECODE ## _NNn (void* pp, BinaryState* state);\
00198      void PLINK_API plink_BinaryOpProcess ## OPNAME ## TYPECODE ## _NnN (void* pp, BinaryState* state);\
00199      void PLINK_API plink_BinaryOpProcess ## OPNAME ## TYPECODE ## _Nnn (void* pp, BinaryState* state);\
00200      void PLINK_API plink_BinaryOpProcess ## OPNAME ## TYPECODE (void* pp, BinaryState* state);
00201 
00202 
00203 #define PLINK_BINARYOPPROCESS_DEFINE(OPNAME, TYPECODE)\
00204     PLINK_BINARYOPPROCESS_DEFINE_NNN(OPNAME, TYPECODE)\
00205     PLINK_BINARYOPPROCESS_DEFINE_NN1(OPNAME, TYPECODE)\
00206     PLINK_BINARYOPPROCESS_DEFINE_N1N(OPNAME, TYPECODE)\
00207     PLINK_BINARYOPPROCESS_DEFINE_N11(OPNAME, TYPECODE)\
00208     PLINK_BINARYOPPROCESS_DEFINE_NNn(OPNAME, TYPECODE)\
00209     PLINK_BINARYOPPROCESS_DEFINE_NnN(OPNAME, TYPECODE)\
00210     PLINK_BINARYOPPROCESS_DEFINE_Nnn(OPNAME, TYPECODE)\
00211     PLINK_BINARYOPPROCESS_DEFINE_SELECT(OPNAME, TYPECODE)
00212 
00214 
00215 
00216 PLINK_BEGIN_C_LINKAGE
00217 
00225 typedef PlinkState BinaryState;
00226 
00227 PLINK_BINARYOPPROCESS_DECLARE(Add, F)
00228 PLINK_BINARYOPPROCESS_DECLARE(Sub, F)
00229 PLINK_BINARYOPPROCESS_DECLARE(Mul, F)
00230 PLINK_BINARYOPPROCESS_DECLARE(Div, F)
00231 PLINK_BINARYOPPROCESS_DECLARE(Mod, F)
00232 PLINK_BINARYOPPROCESS_DECLARE(Min, F)
00233 PLINK_BINARYOPPROCESS_DECLARE(Max, F)
00234 PLINK_BINARYOPPROCESS_DECLARE(Pow, F)
00235 PLINK_BINARYOPPROCESS_DECLARE(IsEqualTo, F)
00236 PLINK_BINARYOPPROCESS_DECLARE(IsNotEqualTo, F)
00237 PLINK_BINARYOPPROCESS_DECLARE(IsGreaterThan, F)
00238 PLINK_BINARYOPPROCESS_DECLARE(IsGreaterThanOrEqualTo, F)
00239 PLINK_BINARYOPPROCESS_DECLARE(IsLessThan, F)
00240 PLINK_BINARYOPPROCESS_DECLARE(IsLessThanOrEqualTo, F)
00241 PLINK_BINARYOPPROCESS_DECLARE(Hypot, F)
00242 PLINK_BINARYOPPROCESS_DECLARE(Atan2, F)
00243 PLINK_BINARYOPPROCESS_DECLARE(SumSqr, F)
00244 PLINK_BINARYOPPROCESS_DECLARE(DifSqr, F)
00245 PLINK_BINARYOPPROCESS_DECLARE(SqrSum, F)
00246 PLINK_BINARYOPPROCESS_DECLARE(SqrDif, F)
00247 PLINK_BINARYOPPROCESS_DECLARE(AbsDif, F)
00248 PLINK_BINARYOPPROCESS_DECLARE(Thresh, F)
00249 
00251 
00252 PLINK_END_C_LINKAGE
00253 
00254 #endif // PLINK_BINARYOPPROCESS_H
 All Classes Functions Typedefs Enumerations Enumerator Properties