forked from Ivan-YO/vgm2smps
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy patharray_macro.h
More file actions
124 lines (113 loc) · 3.46 KB
/
Copy patharray_macro.h
File metadata and controls
124 lines (113 loc) · 3.46 KB
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#ifndef _ARRAY_MACRO_H
#define _ARRAY_MACRO_H
#define ARRLENGTH(ARR) (sizeof(ARR) / sizeof(ARR[0]))
#define ARRAY_1D_SORTED_FIND_NEAREST_RANGE(_T, _ARR, _CONST, _INDEX_VAR, _DIM1_LEN) \
do \
{ \
size_t __size = _DIM1_LEN; \
_INDEX_VAR = 0; \
_T __cst = _CONST; \
_T __dist = abs((_ARR)[0] - __cst); \
_T __dist_prev = __dist; \
_T __dist_temp; \
for (size_t __x__ = 1; __x__ < __size; ++__x__) \
{ \
if (__dist_prev < __dist) break; \
__dist_temp = abs((_ARR)[__x__] - __cst); \
if (__dist_temp < __dist) \
{ \
__dist = __dist_temp; \
_INDEX_VAR = __x__; \
__dist_prev = __dist; \
} \
} \
} while (false)
#define ARRAY_1D_SORTED_FIND_NEAREST(_T, _ARR, _CONST, _INDEX_VAR) \
ARRAY_1D_SORTED_FIND_NEAREST_RANGE(_T, _ARR, _CONST, _INDEX_VAR, ARRLENGTH((_ARR)))
#define ARRAY_2D_SORTED_FIND_NEAREST_RANGE(_T, _ARR, _CONST, _DIM1_INDEX_VAR, _DIM2_INDEX_VAR, _DIM1_LEN, _DIM2_LEN) \
do \
{ \
size_t __size1 = _DIM1_LEN; \
size_t __size2 = _DIM2_LEN; \
_DIM1_INDEX_VAR = 0; \
_DIM2_INDEX_VAR = 0; \
_T __cst = _CONST; \
_T __dist = abs((_ARR)[0][0] - __cst); \
_T __dist_prev = __dist; \
_T __dist_temp; \
bool __find = false; \
size_t __y__, __x__; \
__y__ = 0; \
__x__ = 1; \
for (; __y__ < __size1; ++__y__) \
{ \
if (__find) break; \
for (; __x__ < __size2; ++__x__) \
{ \
if (__dist_prev < __dist) __find = true; \
if (__find) break; \
__dist_temp = abs((_ARR)[__y__][__x__] - __cst); \
if (__dist_temp < __dist) \
{ \
__dist = __dist_temp; \
_DIM2_INDEX_VAR = __x__; \
_DIM1_INDEX_VAR = __y__; \
__dist_prev = __dist; \
} \
} \
__x__ = 0; \
} \
} while (false)
#define ARRAY_2D_SORTED_FIND_NEAREST(_T, _ARR, _CONST, _DIM1_INDEX_VAR, _DIM2_INDEX_VAR) \
ARRAY_2D_SORTED_FIND_NEAREST_RANGE(_T, _ARR, _CONST, _DIM1_INDEX_VAR, _DIM2_INDEX_VAR, ARRLENGTH((_ARR)), ARRLENGTH((_ARR)[0]))
#define ARRAY_1D_UNSORTED_FIND_NEAREST_RANGE(_T, _ARR, _CONST, _INDEX_VAR, _DIM1_LEN) \
do \
{ \
size_t __size = _DIM1_LEN; \
_INDEX_VAR = 0; \
_T __cst = _CONST; \
_T __dist = abs((_ARR)[0] - __cst); \
_T __dist_temp; \
for (size_t __x__ = 1; __x__ < __size; ++__x__) \
{ \
__dist_temp = abs((_ARR)[__x__] - __cst); \
if (__dist_temp < __dist) \
{ \
__dist = __dist_temp; \
_INDEX_VAR = __x__; \
} \
} \
} while (false)
#define ARRAY_1D_UNSORTED_FIND_NEAREST(_T, _ARR, _CONST, _INDEX_VAR) \
ARRAY_1D_UNSORTED_FIND_NEAREST_RANGE(_T, _ARR, _CONST, _INDEX_VAR, ARRLENGTH((_ARR)))
#define ARRAY_2D_UNSORTED_FIND_NEAREST_RANGE(_T, _ARR, _CONST, _DIM1_INDEX_VAR, _DIM2_INDEX_VAR, _DIM1_LEN, _DIM2_LEN) \
do \
{ \
size_t __size1 = _DIM1_LEN; \
size_t __size2 = _DIM2_LEN; \
_DIM1_INDEX_VAR = 0; \
_DIM2_INDEX_VAR = 0; \
_T __cst = _CONST; \
_T __dist = abs((_ARR)[0][0] - __cst); \
_T __dist_temp; \
size_t __y__, __x__; \
__y__ = 0; \
__x__ = 1; \
for (; __y__ < __size1; ++__y__) \
{ \
for (; __x__ < __size2; ++__x__) \
{ \
__dist_temp = abs((_ARR)[__y__][__x__] - __cst); \
if (__dist_temp < __dist) \
{ \
__dist = __dist_temp; \
_DIM2_INDEX_VAR = __x__; \
_DIM1_INDEX_VAR = __y__; \
} \
} \
__x__ = 0; \
} \
} while (false)
#define ARRAY_2D_UNSORTED_FIND_NEAREST(_T, _ARR, _CONST, _DIM1_INDEX_VAR, _DIM2_INDEX_VAR) \
ARRAY_2D_UNSORTED_FIND_NEAREST_RANGE(_T, _ARR, _CONST, _DIM1_INDEX_VAR, _DIM2_INDEX_VAR, ARRLENGTH((_ARR)), ARRLENGTH((_ARR)[0]))
#endif // !_ARRAY_MACRO_H