/******************************************************************************\**  MODULE:      UnitConversion.cp**  PURPOSE:     To provide a Demo PIE template. **  FUNCTIONS:  **  COMMENTS:   *\******************************************************************************/#include <math.h>#ifndef _FUNCTIONPIE_H_#include "FunctionPIE.h"#endif /* _FUNCTIONPIE_H_ */#include "ANECB.h"#pragma lib_export onextern "C" void GetANEFunctions(long* numNames, struct ANEPIEDesc*** descriptors);#pragma lib_export off//==============================================================================// PIE Function definition//==============================================================================#define PASTE(s1,s2) s1 ## s2#define PASTE3(s1,s2, s3) s1 ## s2 ## s3#define STRINGIZE(s1) #s1#define PIEFUNNAME(s) PASTE3(GPIE, s, Fun)#define PIESTRUCTNAME(s) PASTE3(gPIE, s, Desc)#define PIEFUNSTRUCTNAME(s) PASTE3(gPIE, s, FDESC)#define PIEFUNPARAMSLIST(s) PASTE3(gPIE, s, ParamNames)#define DEFINE_FUNCTION0_PIE(name, val)\static void \PIEFUNNAME(name) (const ANE_DOUBLE&		refPtX,\								const ANE_DOUBLE&		refPtY,\								ANE_INT16					numParams,\								const ANE_PTR*			parameters,\								ANE_PTR 						piaHandle,\								void*							reply )\{\	*(ANE_DOUBLE*)reply = (val);\}\#define DEFINE_FUNCTION_PIE(name, factor)\static void \PIEFUNNAME(name) (const ANE_DOUBLE&		refPtX,\								const ANE_DOUBLE&		refPtY,\								ANE_INT16					numParams,\								const ANE_PTR*			parameters,\								ANE_PTR 						piaHandle,\								void*							reply )\{\	ANE_DOUBLE param1 = *(ANE_DOUBLE*)(parameters[0]);\	*(ANE_DOUBLE*)reply = param1*(factor);\}\#define DEFINE_FUNCTION2_PIE(name, factor, add)\static void \PIEFUNNAME(name) (const ANE_DOUBLE&		refPtX,\								const ANE_DOUBLE&		refPtY,\								ANE_INT16					numParams,\								const ANE_PTR*			parameters,\								ANE_PTR 						piaHandle,\								void*							reply )\{\	ANE_DOUBLE param1 = *(ANE_DOUBLE*)(parameters[0]);\	*(ANE_DOUBLE*)reply = param1*(factor)+(add);\}\#define ADD_FUNCTION0_PIE(name)\static char* PIEFUNPARAMSLIST(name) [1] = {0};\struct FunctionPIEDesc*			PIEFUNSTRUCTNAME(name)	= new FunctionPIEDesc (STRINGIZE(name), (EFunctionPIEFlags)0, PIEFUNNAME(name), kPIEFloat, 0, 0, PIEFUNPARAMSLIST(name),gOneFloatTypes, 0);\struct ANEPIEDesc*					PIESTRUCTNAME(name)			= new ANEPIEDesc ("Argus", "TestPieFun","PIE_"  STRINGIZE(name), kFunctionPIE, PIEFUNSTRUCTNAME(name));\gFunDesc[(*numNames)++] = 	PIESTRUCTNAME(name);					// add descriptor to list#define ADD_FUNCTION_PIE(name, fromUnit)\static char* PIEFUNPARAMSLIST(name) [2] = {fromUnit, 0};\struct FunctionPIEDesc*			PIEFUNSTRUCTNAME(name)	= new FunctionPIEDesc (STRINGIZE(name), (EFunctionPIEFlags)0, PIEFUNNAME(name), kPIEFloat, 1, 0, PIEFUNPARAMSLIST(name),gOneFloatTypes, 0);\struct ANEPIEDesc*					PIESTRUCTNAME(name)			= new ANEPIEDesc ("Argus", "TestPieFun","PIE_"  STRINGIZE(name), kFunctionPIE, PIEFUNSTRUCTNAME(name));\gFunDesc[(*numNames)++] = 	PIESTRUCTNAME(name);					// add descriptor to listenum EPIENumberType	gOneFloatTypes[2] = {kPIEFloat, (EPIENumberType)0};	// list of  parameters types list for function//==============================================================================// PIE Functions//==============================================================================// ConstantsDEFINE_FUNCTION0_PIE(pi, 3.14159265359)// Length MeasuresDEFINE_FUNCTION_PIE(In2cm, 2.54);DEFINE_FUNCTION_PIE(cm2In, 0.3937)DEFINE_FUNCTION_PIE(Ft2m, 0.3048)DEFINE_FUNCTION_PIE(m2ft, 3.2808)DEFINE_FUNCTION_PIE(yd2m, 0.9144)DEFINE_FUNCTION_PIE(m2yd, 1.09361329834)DEFINE_FUNCTION_PIE(stMile2Km,1.6903)DEFINE_FUNCTION_PIE(Km2stMile,  0.6214)DEFINE_FUNCTION_PIE(naMile2Km, 1.8533)DEFINE_FUNCTION_PIE(Km2ntMile, 0.5396)// Area MeasuresDEFINE_FUNCTION_PIE(sqIn2sqcm, 6.4516)DEFINE_FUNCTION_PIE(sqcm2sqIn, 0.1550)DEFINE_FUNCTION_PIE(sqft2sqm, 0.0920)DEFINE_FUNCTION_PIE(sqm2sqft, 10.764)DEFINE_FUNCTION_PIE(sqYd2sqm, 0.8361)DEFINE_FUNCTION_PIE(sqm2sqYd, 1.1960)DEFINE_FUNCTION_PIE(Acre2Hectare, 0.4047)DEFINE_FUNCTION_PIE(Hectare2Acre, 2.4710)DEFINE_FUNCTION_PIE(SqStMile2sqKm, 2.590)DEFINE_FUNCTION_PIE(sqKm2SqStMile, 0.3861)// Cubic MeasuresDEFINE_FUNCTION_PIE(cuIn2cc, 16.387)DEFINE_FUNCTION_PIE(cc2cuIn, 0.0610)DEFINE_FUNCTION_PIE(cuft2cum, 0.0283)DEFINE_FUNCTION_PIE(cum2cuft, 35.314)DEFINE_FUNCTION_PIE(cuYd2cum,0.7646)DEFINE_FUNCTION_PIE(cum2cuYd, 1.3079)// Volume MeasuresDEFINE_FUNCTION_PIE(floz2liter, 0.0296)DEFINE_FUNCTION_PIE(liter2floz,33.815)DEFINE_FUNCTION_PIE(USlbbl2Kiloliter, 0.1192)DEFINE_FUNCTION_PIE(Kiloliter2USlbbl, 8.3864)DEFINE_FUNCTION_PIE(cuft2hectoliter,0.2832)DEFINE_FUNCTION_PIE(hectoliter2cuft, 3.5315)DEFINE_FUNCTION_PIE(bbl2gal,42)DEFINE_FUNCTION_PIE(gal2bbl, 2.3810e-02)DEFINE_FUNCTION_PIE(cuft2gal,7.4805)DEFINE_FUNCTION_PIE(gal2cuft, 0.13368)DEFINE_FUNCTION_PIE(cuft2bbl, 0.17811)DEFINE_FUNCTION_PIE(bbl2cuft, 5.6146)// Weight, Force and Mass MeasuresDEFINE_FUNCTION_PIE(oz2gm, 28.350)DEFINE_FUNCTION_PIE(gm2oz,0.0353)DEFINE_FUNCTION_PIE(oztroy2gm, 31.103)DEFINE_FUNCTION_PIE(gm2oztroy,0.0322)DEFINE_FUNCTION_PIE(lb2Kg, 0.4536)DEFINE_FUNCTION_PIE(Kg2lb,2.2046)// PressureDEFINE_FUNCTION_PIE(psi2atm, 0.068046)DEFINE_FUNCTION_PIE(atm2psi,14.696)DEFINE_FUNCTION_PIE(psi2KgPsqcm, 0.0703)DEFINE_FUNCTION_PIE(KgPsqcm2psi,14.223)// VolumetricDEFINE_FUNCTION_PIE(bblPday2ccPsec, 1.8401)DEFINE_FUNCTION_PIE(ccPsec2bblPday, 0.54344)DEFINE_FUNCTION_PIE(bblPday2cuftPmin, 3.8990e-03)DEFINE_FUNCTION_PIE(cuftPmin2bblPday, 256.47)DEFINE_FUNCTION_PIE(bblPday2galPmin, 2.9167e-02)DEFINE_FUNCTION_PIE(galPmin2bblPday, 34.286)// DensityDEFINE_FUNCTION_PIE(lbPgal2gmPcc, 0.11983)DEFINE_FUNCTION_PIE(gmPcc2lbPgal, 8.3454)// VelocityDEFINE_FUNCTION_PIE(ftPsec2cmPsec, 30.480)DEFINE_FUNCTION_PIE(cmPsec2ftPsec, 0.0328)DEFINE_FUNCTION_PIE(ftPsec2mPmin, 18.288)DEFINE_FUNCTION_PIE(mPmin2ftsec, 0.0547)DEFINE_FUNCTION_PIE(ftPmin2cmPsec, 0.5080)DEFINE_FUNCTION_PIE(cmPsec2ftPmin, 1.9685)DEFINE_FUNCTION_PIE(Knots2KmPhr, 1.8533)DEFINE_FUNCTION_PIE(KmPhr2Knots, 0.5396)// WorkDEFINE_FUNCTION_PIE(hp2kw, 0.7457)DEFINE_FUNCTION_PIE(kw2hp, 1.3410)// PowerDEFINE_FUNCTION_PIE(ft_lb2m_Kg, 0.1382)DEFINE_FUNCTION_PIE(m_Kg2ft_lb, 7.2330)// HeatDEFINE_FUNCTION_PIE(Btu2calories, 0.252)DEFINE_FUNCTION_PIE(calories2Btu, 3.9683)// DegreesDEFINE_FUNCTION2_PIE(F2C, 1/1.8, -32/1.8)DEFINE_FUNCTION2_PIE(C2F, 1.8, +32)//=================================================================//	PIE handling functions and declerations//=================================================================static struct ANEPIEDesc* gFunDesc[100];								// list of PIE descriptors for all partsvoidGetANEFunctions(long* numNames, struct ANEPIEDesc*** descriptors){ 	*numNames = 0;//Constants		ADD_FUNCTION0_PIE(pi)// Length Measures	ADD_FUNCTION_PIE(In2cm, "Inch")	ADD_FUNCTION_PIE(cm2In, "Centimeter")	ADD_FUNCTION_PIE(Ft2m, "Feet")	ADD_FUNCTION_PIE(m2ft, "Meter")	ADD_FUNCTION_PIE(yd2m, "Yard")	ADD_FUNCTION_PIE(m2yd, "Meter")	ADD_FUNCTION_PIE(stMile2Km, "Stat_Mile")	ADD_FUNCTION_PIE(Km2stMile, "Kilometer")	ADD_FUNCTION_PIE(naMile2Km, "Nauticle_Mile")	ADD_FUNCTION_PIE(Km2ntMile, "Kilometer")// Area Measures	ADD_FUNCTION_PIE(sqIn2sqcm, "Square_Inch")	ADD_FUNCTION_PIE(sqcm2sqIn, "Square_Centimeter")	ADD_FUNCTION_PIE(sqft2sqm, "Square_Feet")	ADD_FUNCTION_PIE(sqm2sqft, "Square_Meter")	ADD_FUNCTION_PIE(sqYd2sqm, "Square_Yard")	ADD_FUNCTION_PIE(sqm2sqYd, "Square_Meter")	ADD_FUNCTION_PIE(Acre2Hectare, "Acre")	ADD_FUNCTION_PIE(Hectare2Acre, "Hectare")	ADD_FUNCTION_PIE(SqStMile2sqKm, "Square_Stat_Mile")	ADD_FUNCTION_PIE(sqKm2SqStMile, "Square_Km")// Cubic Measures	ADD_FUNCTION_PIE(cuIn2cc, "Cubic_Inch")	ADD_FUNCTION_PIE(cc2cuIn, "Cubic_Centimeter")	ADD_FUNCTION_PIE(cuft2cum, "Cubic_Feet")	ADD_FUNCTION_PIE(cum2cuft, "Cubic_Meter")	ADD_FUNCTION_PIE(cuYd2cum, "Cubic_Yard")	ADD_FUNCTION_PIE(cum2cuYd, "Cubic_Meter")// Volume Measures	ADD_FUNCTION_PIE(floz2liter, "Fluid_oz")	ADD_FUNCTION_PIE(liter2floz, "Liter")	ADD_FUNCTION_PIE(USlbbl2Kiloliter, "US_liq_barrels")	ADD_FUNCTION_PIE(Kiloliter2USlbbl, "Kilo_Liter")	ADD_FUNCTION_PIE(cuft2hectoliter, "Cubic_feet")	ADD_FUNCTION_PIE(hectoliter2cuft, "Hecto_Liter")	ADD_FUNCTION_PIE(bbl2gal,"Barrel")	ADD_FUNCTION_PIE(gal2bbl, "Gallon")	ADD_FUNCTION_PIE(cuft2gal,"Cubic_Feet")	ADD_FUNCTION_PIE(gal2cuft, "Gallon")	ADD_FUNCTION_PIE(cuft2bbl, "Cubic_Feet")	ADD_FUNCTION_PIE(bbl2cuft, "Barrel")// Weight, Force and Mass Measures	ADD_FUNCTION_PIE(oz2gm, "Ounce")	ADD_FUNCTION_PIE(gm2oz,"Gram")	ADD_FUNCTION_PIE(oztroy2gm, "Oz_Troy")	ADD_FUNCTION_PIE(gm2oztroy,"Gram")	ADD_FUNCTION_PIE(lb2Kg, "Pound")	ADD_FUNCTION_PIE(Kg2lb,"Kilogram")// Pressure	ADD_FUNCTION_PIE(psi2atm, "Lb/Sq_Inch")	ADD_FUNCTION_PIE(atm2psi, "Atmosphere")	ADD_FUNCTION_PIE(psi2KgPsqcm,"Lb/Sq_Inch")	ADD_FUNCTION_PIE(KgPsqcm2psi, "Kilogram")	// Volumetric	ADD_FUNCTION_PIE(bblPday2ccPsec, "Barrels/day")	ADD_FUNCTION_PIE(ccPsec2bblPday, "Cubic_Centimeter/Second")	ADD_FUNCTION_PIE(bblPday2cuftPmin, "Barrels/day")	ADD_FUNCTION_PIE(cuftPmin2bblPday, "Cubic_Feet/Minute")	ADD_FUNCTION_PIE(bblPday2galPmin, "Barrels/day")	ADD_FUNCTION_PIE(galPmin2bblPday, "Gallon/Minute")	// Velocity	ADD_FUNCTION_PIE(ftPsec2cmPsec, "Feet/sec")	ADD_FUNCTION_PIE(cmPsec2ftPsec,"Centimeter/sec")	ADD_FUNCTION_PIE(ftPsec2mPmin, "Feet/sec")	ADD_FUNCTION_PIE(mPmin2ftsec, "Meter/Minute")	ADD_FUNCTION_PIE(ftPmin2cmPsec, "Feet/minute")	ADD_FUNCTION_PIE(cmPsec2ftPmin, "Centimeter/sec")	ADD_FUNCTION_PIE(Knots2KmPhr, "Knots")	ADD_FUNCTION_PIE(KmPhr2Knots, "Km/h")	// Work	ADD_FUNCTION_PIE(hp2kw, "HorsePower")	ADD_FUNCTION_PIE(kw2hp, "Kilowatt")// Power	ADD_FUNCTION_PIE(ft_lb2m_Kg, "Feet_lb")	ADD_FUNCTION_PIE(m_Kg2ft_lb, "Meter_Kilogram")// Heat	ADD_FUNCTION_PIE(Btu2calories, "Btu")	ADD_FUNCTION_PIE(calories2Btu, "Calories")// Degrees	ADD_FUNCTION_PIE(F2C, "Farenheit_Degrees")	ADD_FUNCTION_PIE(C2F, "Celsius_Degrees")	*descriptors = gFunDesc;} // GetANEFunctions 
