- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
// https://godbolt.org/z/QAR_nT
// https://govnokod.ru/26701#comment550329
#include <cstddef>
#include <string>
#include <cassert>
struct assert_failure
{
explicit assert_failure(const char *sz)
{
std::fprintf(stderr, "Assertion failure: %s\n", sz);
std::quick_exit(EXIT_FAILURE);
}
};
// эта херня не совсем корректно будет обрабатывать всякую хрень вроде ", , , " - оно это посчитает за 4 аргумента,
// и если считать " скобочки, тогда еще надо запилить обработку эскейп-последовательности, для хуйни типа "pidor\" govno"
// но мне лень эту хуйню допиливать.
constexpr std::size_t count_args(const char *s, std::size_t depth = 0, std::size_t pos = 0, std::size_t count = 0)
{
if (s[pos] == '\0'){
if(depth != 0)
throw assert_failure("kakoi bagor)))\n");
if(pos == 0)
return 0;
return count+1;
}
else if(s[pos] == '{')
{
return count_args(s, depth + 1, pos + 1, count);
}
else if(s[pos] == '}')
{
if(depth == 0)
throw assert_failure("kakoi bagor)))\n");
return count_args(s, depth - 1, pos + 1, count);
}
else if(depth == 0)
{
if(s[pos] == ',')
{
return count_args(s, depth, pos + 1, count + 1);
}
}
return count_args(s, depth, pos+1, count);
}
#define TO_STR(...) #__VA_ARGS__
#define ARGNUM(...) count_args(TO_STR(__VA_ARGS__))
#define krestogovnotypeof(a) std::remove_reference<a>::type
#define FOR_RANGE(type, varname, ...) for(struct {size_t cnt; krestogovnotypeof(type) arr[ ARGNUM(__VA_ARGS__) ]; } varname = {0, {__VA_ARGS__}}; varname.cnt < sizeof(varname.arr)/sizeof(type); ++varname.cnt )
int main(void)
{
FOR_RANGE(int[2], k, {1,2}, {3,4}, {5,6}, {7,8})
printf("{%d %d},\n", k.arr[k.cnt][0], k.arr[k.cnt][1]);
return EXIT_SUCCESS;
}
Какая крестопараша((( В вижуальхуюдии вроде собирается, но проверить корректность работы не могу. Как вы этим днищекомпилятором вообще пользуетесь?
Было б круто, если бы были такие constexpr функции, которые в компилтайме могут куски исходного кода высирать как бы прямо в исходник, и потом уже чтоб это компилировалось