summaryrefslogtreecommitdiff
path: root/Build/source/texk/web2c/mfluadir/otfcc/lib/support/element-impl.h
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/texk/web2c/mfluadir/otfcc/lib/support/element-impl.h')
-rw-r--r--Build/source/texk/web2c/mfluadir/otfcc/lib/support/element-impl.h275
1 files changed, 275 insertions, 0 deletions
diff --git a/Build/source/texk/web2c/mfluadir/otfcc/lib/support/element-impl.h b/Build/source/texk/web2c/mfluadir/otfcc/lib/support/element-impl.h
new file mode 100644
index 00000000000..b65a403fe5d
--- /dev/null
+++ b/Build/source/texk/web2c/mfluadir/otfcc/lib/support/element-impl.h
@@ -0,0 +1,275 @@
+#ifndef CARYLL_SUPPORT_ELEMENT_IMPL_H
+#define CARYLL_SUPPORT_ELEMENT_IMPL_H
+
+#include "caryll/element.h"
+#include "otfcc-alloc.h"
+
+#ifndef __CARYLL_INLINE__
+#ifdef _MSC_VER
+#define __CARYLL_INLINE__ __forceinline /* use __forceinline (VC++ specific) */
+#else
+#define __CARYLL_INLINE__ inline /* use standard inline */
+#endif
+#endif
+
+#define __NARG__(...) __NARG_I_(__VA_ARGS__, __RSEQ_N())
+#define __NARG_I_(...) __ARG_N(__VA_ARGS__)
+#define __ARG_N(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, \
+ _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, \
+ _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, \
+ _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, N, ...) \
+ N
+#define __RSEQ_N() \
+ 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, \
+ 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, \
+ 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0
+
+// general definition for any function name
+#define __CARYLL_VFUNC__2(name, n) name##n
+#define __CARYLL_VFUNC__1(name, n) __CARYLL_VFUNC__2(name, n)
+#define __CARYLLVFUNC(func, ...) __CARYLL_VFUNC__1(func, __NARG__(__VA_ARGS__))(__VA_ARGS__)
+
+#define caryll_trivialInit(T) \
+ static __CARYLL_INLINE__ void T##_init(MODIFY T *x) { \
+ memset(x, 0, sizeof(T)); \
+ }
+#define caryll_nonTrivialInit(T, __fn_init) \
+ static __CARYLL_INLINE__ void T##_init(MODIFY T *x) { \
+ (__fn_init)(x); \
+ }
+#define caryll_trivialEmpty(T) \
+ static __CARYLL_INLINE__ T T##_empty() { \
+ T x; \
+ T##_init(&x); \
+ return x; \
+ }
+#define caryll_trivialCreate(T) \
+ static __CARYLL_INLINE__ T *T##_create() { \
+ T *x = (T *)malloc(sizeof(T)); \
+ T##_init(x); \
+ return x; \
+ }
+#define caryll_trivialCopy(T) \
+ static __CARYLL_INLINE__ void T##_copy(MODIFY T *dst, const T *src) { \
+ memcpy(dst, src, sizeof(T)); \
+ }
+#define caryll_nonTrivialCopy(T, __fn_copy) \
+ static __CARYLL_INLINE__ void T##_copy(MODIFY T *dst, const T *src) { \
+ (__fn_copy)(dst, src); \
+ }
+#define caryll_trivialMove(T) \
+ static __CARYLL_INLINE__ void T##_move(MODIFY T *dst, T *src) { \
+ memcpy(dst, src, sizeof(T)); \
+ T##_init(src); \
+ }
+#define caryll_nonTrivialMove(T, __fn_move) \
+ static __CARYLL_INLINE__ void T##_move(MODIFY T *dst, T *src) { \
+ (__fn_move)(dst, src); \
+ T##_init(src); \
+ }
+#define caryll_trivialDispose(T) \
+ static __CARYLL_INLINE__ void T##_dispose(MODIFY T *x) { \
+ /* trivial */ \
+ }
+#define caryll_nonTrivialDispose(T, __fn_dispose) \
+ static __CARYLL_INLINE__ void T##_dispose(MODIFY T *x) { \
+ (__fn_dispose)(x); \
+ }
+#define caryll_trivialFree(T) \
+ static __CARYLL_INLINE__ void T##_free(MOVE T *x) { \
+ if (!x) return; \
+ T##_dispose(x); \
+ __caryll_free(x); \
+ }
+#define caryll_trivialDup(T) \
+ static __CARYLL_INLINE__ T T##_dup(const T src) { \
+ T dst; \
+ T##_copy(&dst, &src); \
+ return dst; \
+ }
+#define caryll_trivialReplace(T) \
+ static __CARYLL_INLINE__ void T##_replace(MODIFY T *dst, MOVE const T src) { \
+ T##_dispose(dst); \
+ memcpy(dst, &src, sizeof(T)); \
+ } \
+ static __CARYLL_INLINE__ void T##_copyReplace(MODIFY T *dst, const T src) { \
+ T##_dispose(dst); \
+ T##_copy(dst, &src); \
+ }
+
+#define caryll_standardTypeFn1(T) \
+ caryll_trivialInit(T); \
+ caryll_trivialCopy(T); \
+ caryll_trivialDispose(T); \
+ caryll_trivialMove(T); \
+ caryll_trivialReplace(T);
+#define caryll_standardTypeFn2(T, __fn_dispose) \
+ caryll_trivialInit(T); \
+ caryll_trivialCopy(T); \
+ caryll_nonTrivialDispose(T, __fn_dispose); \
+ caryll_trivialMove(T); \
+ caryll_trivialReplace(T);
+#define caryll_standardTypeFn3(T, __fn_init, __fn_dispose) \
+ caryll_nonTrivialInit(T, __fn_init); \
+ caryll_trivialCopy(T); \
+ caryll_nonTrivialDispose(T, __fn_dispose); \
+ caryll_trivialMove(T); \
+ caryll_trivialReplace(T);
+#define caryll_standardTypeFn4(T, __fn_init, __fn_copy, __fn_dispose) \
+ caryll_nonTrivialInit(T, __fn_init); \
+ caryll_nonTrivialCopy(T, __fn_copy); \
+ caryll_nonTrivialDispose(T, __fn_dispose); \
+ caryll_trivialMove(T); \
+ caryll_trivialReplace(T);
+#define caryll_standardTypeFn5(T, __fn_init, __fn_copy, __fn_dispose, __fn_move) \
+ caryll_nonTrivialInit(T, __fn_init); \
+ caryll_nonTrivialCopy(T, __fn_copy); \
+ caryll_nonTrivialDispose(T, __fn_dispose); \
+ caryll_nonTrivialMove(T, __fn_move); \
+ caryll_trivialReplace(T);
+
+#define caryll_standardTypeMethods(T) \
+ .init = T##_init, .copy = T##_copy, .dispose = T##_dispose, .move = T##_move, \
+ .replace = T##_replace, .copyReplace = T##_copyReplace
+#define caryll_standardRefTypeMethods(T) \
+ caryll_standardTypeMethods(T), .create = T##_create, .free = T##_free
+#define caryll_standardValTypeMethods(T) \
+ caryll_standardTypeMethods(T), .empty = T##_empty, .dup = T##_dup
+
+#define caryll_standardTypeFn(...) __CARYLLVFUNC(caryll_standardTypeFn, __VA_ARGS__)
+
+#ifdef __GNUC__
+
+// GCC requires adding ## before __VA_ARGS__.
+// Make it happy.
+
+#define caryll_standardRefTypeFn(T, ...) \
+ caryll_standardTypeFn(T, ##__VA_ARGS__); \
+ caryll_trivialCreate(T); \
+ caryll_trivialFree(T);
+#define caryll_standardValTypeFn(T, ...) \
+ caryll_standardTypeFn(T, ##__VA_ARGS__); \
+ caryll_trivialEmpty(T); \
+ caryll_trivialDup(T);
+
+#define caryll_standardType(T, __name, ...) \
+ caryll_standardTypeFn(T, ##__VA_ARGS__); \
+ caryll_ElementInterfaceOf(T) __name = {caryll_standardTypeMethods(T)};
+#define caryll_standardRefType(T, __name, ...) \
+ caryll_standardRefTypeFn(T, ##__VA_ARGS__); \
+ caryll_ElementInterfaceOf(T) __name = {caryll_standardRefTypeMethods(T)};
+#define caryll_standardValType(T, __name, ...) \
+ caryll_standardValTypeFn(T, ##__VA_ARGS__); \
+ caryll_ElementInterfaceOf(T) __name = {caryll_standardValTypeMethods(T)};
+
+#else
+
+#define caryll_standardRefTypeFn(T, ...) \
+ caryll_standardTypeFn(T, __VA_ARGS__); \
+ caryll_trivialCreate(T); \
+ caryll_trivialFree(T);
+#define caryll_standardValTypeFn(T, ...) \
+ caryll_standardTypeFn(T, __VA_ARGS__); \
+ caryll_trivialEmpty(T); \
+ caryll_trivialDup(T);
+
+#define caryll_standardType(T, __name, ...) \
+ caryll_standardTypeFn(T, __VA_ARGS__); \
+ caryll_ElementInterfaceOf(T) __name = {caryll_standardTypeMethods(T)};
+#define caryll_standardRefType(T, __name, ...) \
+ caryll_standardRefTypeFn(T, __VA_ARGS__); \
+ caryll_ElementInterfaceOf(T) __name = {caryll_standardRefTypeMethods(T)};
+#define caryll_standardValType(T, __name, ...) \
+ caryll_standardValTypeFn(T, __VA_ARGS__); \
+ caryll_ElementInterfaceOf(T) __name = {caryll_standardValTypeMethods(T)};
+
+#endif
+
+//// Traits
+
+// Show
+#define caryll_ShowFns(T, _fn_Show) \
+ static __CARYLL_INLINE__ void T##_show(const T a) { \
+ return (_fn_Show)(a); \
+ }
+#define caryll_ShowAssigns(T) .show = T##_show
+
+// Ord
+#define caryll_OrdFns(T, _fnCompare) \
+ static __CARYLL_INLINE__ int T##_compare(const T a, const T b) { \
+ return (_fnCompare)(a, b); \
+ } \
+ static __CARYLL_INLINE__ int T##_compareRef(const T *a, const T *b) { \
+ return (_fnCompare)(*a, *b); \
+ }
+#define caryll_OrdEqFns(T, _fnCompare) \
+ caryll_OrdFns(T, _fnCompare); \
+ static __CARYLL_INLINE__ bool T##_equal(const T a, const T b) { \
+ return !(_fnCompare)(a, b); \
+ }
+#define caryll_OrdEqAssigns(T) \
+ .compare = T##_compare, .compareRef = T##_compareRef, .equal = T##_equal
+
+// Monoid
+#define caryll_MonoidFns(T, _fn_neutral, _fn_inplacePlus) \
+ static __CARYLL_INLINE__ T T##_neutral() { \
+ return (_fn_neutral)(); \
+ } \
+ static __CARYLL_INLINE__ void T##_inplacePlus(MODIFY T *a, const T b) { \
+ (_fn_inplacePlus)(a, b); \
+ } \
+ static __CARYLL_INLINE__ T T##_plus(const T a, const T b) { \
+ T result = (_fn_neutral)(); \
+ (_fn_inplacePlus)(&result, a); \
+ (_fn_inplacePlus)(&result, b); \
+ return result; \
+ }
+#define caryll_MonoidAssigns(T) \
+ .neutral = T##_neutral, .inplacePlus = T##_inplacePlus, .plus = T##_plus
+
+// Group
+#define caryll_GroupFns(T, _fn_inplaceNegate) \
+ static __CARYLL_INLINE__ void T##_inplaceNegate(MODIFY T *a) { \
+ (_fn_inplaceNegate)(a); \
+ } \
+ static __CARYLL_INLINE__ T T##_negate(const T a) { \
+ T result; \
+ T##_copy(&result, &a); \
+ T##_inplaceNegate(&result); \
+ return result; \
+ } \
+ static __CARYLL_INLINE__ void T##_inplaceMinus(MODIFY T *a, const T b) { \
+ T tb = T##_negate(b); \
+ (T##_inplacePlus)(a, tb); \
+ T##_dispose(&tb); \
+ } \
+ static __CARYLL_INLINE__ T T##_minus(const T a, const T b) { \
+ T result = (T##_neutral)(); \
+ (T##_inplacePlus)(&result, a); \
+ (T##_inplaceMinus)(&result, b); \
+ return result; \
+ }
+#define caryll_GroupAssigns(T) \
+ .inplaceNegate = T##_inplaceNegate, .negate = T##_negate, .inplaceMinus = T##_inplaceMinus, \
+ .minus = T##_minus
+
+// Module
+#define caryll_ModuleFns(T, TS, _fn_inplaceScale) \
+ static __CARYLL_INLINE__ void T##_inplaceScale(MODIFY T *a, TS b) { \
+ (_fn_inplaceScale)(a, b); \
+ } \
+ static __CARYLL_INLINE__ T T##_scale(const T a, TS b) { \
+ T result; \
+ T##_copy(&result, &a); \
+ T##_inplaceScale(&result, b); \
+ return result; \
+ } \
+ static __CARYLL_INLINE__ void T##_inplacePlusScale(MODIFY T *a, TS b, const T c) { \
+ T x = T##_scale(c, b); \
+ T##_inplacePlus(a, x); \
+ T##_dispose(&x); \
+ }
+#define caryll_ModuleAssigns(T) \
+ .inplaceScale = T##_inplaceScale, .scale = T##_scale, .inplacePlusScale = T##_inplacePlusScale
+
+#endif