{ "Define template": { "prefix": "define_template", "body": [ "#define _template_func_def(T, func) T_DEFINE_##func(T)", "#define _template_func(T, func) T_##func##__##T" ], "description": "Define template" }, "Define sort": { "prefix": "define_sort", "body": [ "#define SORT_PREDICATE(type, name) bool name(type a, type b)", "#define SORT_SWAP(type, a, b) \\", " { \\", " const type _BLOCK_T = a; \\", " a = b; \\", " b = _BLOCK_T; \\", " }", "", "#define T_DEFINE_less(T) \\", " SORT_PREDICATE(T, T_less__##T) { return a < b; }", "#define T_DEFINE_greater(T) \\", " SORT_PREDICATE(T, T_greater__##T) { return a > b; }", "", "#define T_DEFINE_sort(T) \\", " void T_sort__##T(T *start, const T *end, bool (*predicate)(T, T)) { \\", " T *i, *j; \\", " for (i = start; i < end; i++) { \\", " for (j = i; j < end; j++) { \\", " if (predicate(*i, *j)) { \\", " SORT_SWAP(T, *i, *j); \\", " } \\", " } \\", " } \\", " }", "", "#define T_DEFINE_sort_default(T) \\", " void T_sort_default__##T(T *start, const T *end) { \\", " T_sort__##T(start, end, _template_func(T, less)); \\", " }", "", "#define T_DEFINE_sort_init(T) \\", " _template_func_def(T, less); \\", " _template_func_def(T, greater); \\", " _template_func_def(T, sort); \\", " _template_func_def(T, sort_default);" ], "description": "Define sort" } }