29 #include <lal/LALString.h>
30 #include <lal/LALConstants.h>
31 #include <lal/VectorMath.h>
33 #include "VectorMath_internal.h"
45 #define DEFINE_ALIGNED_VECT_API(TYPE) \
46 TYPE##VectorAligned *XLALCreate##TYPE##VectorAligned ( const UINT4 length, const UINT4 align ) \
48 TYPE##VectorAligned *ret; \
49 XLAL_CHECK_NULL ( (ret = XLALCalloc ( 1, sizeof(*ret) )) != NULL, XLAL_ENOMEM ); \
51 XLAL_CHECK_NULL ( (ret = XLALResize##TYPE##VectorAligned ( ret, length, align )) != NULL, XLAL_ENOMEM ); \
56 TYPE##VectorAligned *XLALResize##TYPE##VectorAligned ( TYPE##VectorAligned *in, const UINT4 length, const UINT4 align ) \
59 return XLALCreate##TYPE##VectorAligned ( length, align ); \
61 if ( length == 0 ) { \
62 XLALDestroy##TYPE##VectorAligned ( in ); \
66 in->length = length; \
67 UINT4 paddedLength = length + align - 1; \
68 XLAL_CHECK_NULL ( (in->data0 = XLALRealloc ( in->data0, paddedLength * sizeof(in->data0[0]) )) != NULL, XLAL_ENOMEM ); \
70 size_t remBytes = ((size_t)in->data0) % align; \
71 size_t offsetBytes = (align - remBytes) % align; \
72 in->data = (void*)(((char*)in->data0) + offsetBytes); \
74 XLAL_CHECK_NULL ( ((size_t)in->data) % align == 0, XLAL_EFAULT, "Failed to allocate %zd-byte aligned memory. Must be a coding error.\n", (size_t)align ); \
79 void XLALDestroy##TYPE##VectorAligned ( TYPE##VectorAligned *in ) \
81 if ( !in ) { return; } \
83 XLALFree ( in->data0 ); \
98 #define EXPORT_VECTORMATH_ANY(NAME, ARG_DEF, ARG_CALL, ISET1, ISET2, ISET3, ISET4) \
100 static int XLALVector##NAME##_DISPATCH ARG_DEF; \
102 static int (*XLALVector##NAME##_ptr) ARG_DEF = XLALVector##NAME##_DISPATCH; \
103 const char* XLALVector##NAME##_name = "\0"; \
105 int XLALVector##NAME##_DISPATCH ARG_DEF { \
107 DISPATCH_SELECT_BEGIN(); \
108 CONCAT2(DISPATCH_SELECT_,ISET1)(XLALVector##NAME##_ptr = XLALVector##NAME##_##ISET1, XLALVector##NAME##_name = "XLALVector"#NAME"_"#ISET1); \
109 CONCAT2(DISPATCH_SELECT_,ISET2)(XLALVector##NAME##_ptr = XLALVector##NAME##_##ISET2, XLALVector##NAME##_name = "XLALVector"#NAME"_"#ISET2); \
110 CONCAT2(DISPATCH_SELECT_,ISET3)(XLALVector##NAME##_ptr = XLALVector##NAME##_##ISET3, XLALVector##NAME##_name = "XLALVector"#NAME"_"#ISET3); \
111 CONCAT2(DISPATCH_SELECT_,ISET4)(XLALVector##NAME##_ptr = XLALVector##NAME##_##ISET4, XLALVector##NAME##_name = "XLALVector"#NAME"_"#ISET4); \
112 DISPATCH_SELECT_END( XLALVector##NAME##_ptr = XLALVector##NAME##_GEN, XLALVector##NAME##_name = "XLALVector"#NAME"_GEN" ); \
114 return XLALVector##NAME ARG_CALL; \
118 int XLALVector##NAME ARG_DEF { \
120 return (XLALVector##NAME##_ptr) ARG_CALL; \
125 #define EXPORT_VECTORMATH_S2I(NAME, ...) \
126 EXPORT_VECTORMATH_ANY( NAME ## REAL4, (INT4 *out, const REAL4 *in, const UINT4 len), (out, in, len), __VA_ARGS__ )
131 #define EXPORT_VECTORMATH_S2S(NAME, ...) \
132 EXPORT_VECTORMATH_ANY( NAME ## REAL4, (REAL4 *out, const REAL4 *in, const UINT4 len), (out, in, len), __VA_ARGS__ )
141 #define EXPORT_VECTORMATH_S2SS(NAME, ...) \
142 EXPORT_VECTORMATH_ANY( NAME ## REAL4, (REAL4 *out1, REAL4 *out2, const REAL4 *in, const UINT4 len), (out1, out2, in, len), __VA_ARGS__ )
148 #define EXPORT_VECTORMATH_SS2S(NAME, ...) \
149 EXPORT_VECTORMATH_ANY( NAME ## REAL4, (REAL4 *out, const REAL4 *in1, const REAL4 *in2, const UINT4 len), (out, in1, in2, len), __VA_ARGS__ )
157 #define EXPORT_VECTORMATH_sS2S(NAME, ...) \
158 EXPORT_VECTORMATH_ANY( NAME ## REAL4, (REAL4 *out, REAL4 scalar, const REAL4 *in, const UINT4 len), (out, scalar, in, len), __VA_ARGS__ )
164 #define EXPORT_VECTORMATH_SS2uU(NAME, ...) \
165 EXPORT_VECTORMATH_ANY( NAME ## REAL4, ( UINT4* count, UINT4 *out, const REAL4 *in1, const REAL4 *in2, const UINT4 len ), (count, out, in1, in2, len), __VA_ARGS__ )
170 #define EXPORT_VECTORMATH_sS2uU(NAME, ...) \
171 EXPORT_VECTORMATH_ANY( NAME ## REAL4, ( UINT4* count, UINT4 *out, REAL4 scalar, const REAL4 *in, const UINT4 len ), (count, out, scalar, in, len), __VA_ARGS__ )
176 #define EXPORT_VECTORMATH_dD2D(NAME, ...) \
177 EXPORT_VECTORMATH_ANY( NAME ## REAL8, (REAL8 *out, REAL8 scalar, const REAL8 *in, const UINT4 len), (out, scalar, in, len), __VA_ARGS__ )
183 #define EXPORT_VECTORMATH_DD2D(NAME, ...) \
184 EXPORT_VECTORMATH_ANY( NAME ## REAL8, (REAL8 *out, const REAL8 *in1, const REAL8 *in2, const UINT4 len), (out, in1, in2, len), __VA_ARGS__ )
192 #define EXPORT_VECTORMATH_CC2C(NAME, ...) \
193 EXPORT_VECTORMATH_ANY( NAME ## COMPLEX8, (COMPLEX8 *out, const COMPLEX8 *in1, const COMPLEX8 *in2, const UINT4 len), (out, in1, in2, len), __VA_ARGS__ )
199 #define EXPORT_VECTORMATH_cC2C(NAME, ...) \
200 EXPORT_VECTORMATH_ANY( NAME ## COMPLEX8, (COMPLEX8 *out, COMPLEX8 scalar, const COMPLEX8 *in, const UINT4 len), (out, scalar, in, len), __VA_ARGS__ )
206 #define EXPORT_VECTORMATH_D2D(NAME, ...) \
207 EXPORT_VECTORMATH_ANY( NAME ## REAL8, (REAL8 *out, const REAL8 *in, const UINT4 len), (out, in, len), __VA_ARGS__ )
#define EXPORT_VECTORMATH_S2S(NAME,...)
#define EXPORT_VECTORMATH_cC2C(NAME,...)
#define EXPORT_VECTORMATH_S2I(NAME,...)
#define EXPORT_VECTORMATH_DD2D(NAME,...)
#define DEFINE_ALIGNED_VECT_API(TYPE)
Create a special <TYPE>Vector with n-byte aligned memory data array.
#define EXPORT_VECTORMATH_SS2uU(NAME,...)
#define EXPORT_VECTORMATH_D2D(NAME,...)
#define EXPORT_VECTORMATH_sS2uU(NAME,...)
#define EXPORT_VECTORMATH_SS2S(NAME,...)
#define EXPORT_VECTORMATH_S2SS(NAME,...)
#define EXPORT_VECTORMATH_dD2D(NAME,...)
#define EXPORT_VECTORMATH_CC2C(NAME,...)
#define EXPORT_VECTORMATH_sS2S(NAME,...)
double complex COMPLEX16
Double-precision floating-point complex number (16 bytes total)
double REAL8
Double precision real floating-point number (8 bytes).
uint32_t UINT4
Four-byte unsigned integer.
float complex COMPLEX8
Single-precision floating-point complex number (8 bytes total)
float REAL4
Single precision real floating-point number (4 bytes).