Няшная / Говнокод #29279 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
  26. 26
  27. 27
  28. 28
  29. 29
  30. 30
  31. 31
  32. 32
  33. 33
  34. 34
  35. 35
  36. 36
  37. 37
  38. 38
  39. 39
  40. 40
  41. 41
  42. 42
  43. 43
  44. 44
  45. 45
  46. 46
  47. 47
  48. 48
  49. 49
  50. 50
  51. 51
  52. 52
  53. 53
  54. 54
  55. 55
  56. 56
  57. 57
  58. 58
  59. 59
  60. 60
  61. 61
  62. 62
  63. 63
  64. 64
  65. 65
  66. 66
  67. 67
  68. 68
  69. 69
  70. 70
  71. 71
  72. 72
  73. 73
  74. 74
  75. 75
  76. 76
  77. 77
  78. 78
  79. 79
  80. 80
  81. 81
  82. 82
  83. 83
  84. 84
  85. 85
  86. 86
  87. 87
  88. 88
  89. 89
  90. 90
  91. 91
  92. 92
  93. 93
  94. 94
  95. 95
  96. 96
  97. 97
  98. 98
#include <stdio.h>

typedef struct true_t {
    char _;
} true_t;

true_t TRUE;

typedef struct false_t {
    char _;
} false_t;

false_t FALSE;

int f_true() {
    return 1;
}

int f_false() {
    return 0;
}

#define bool_v(B) _Generic((B *) (0), true_t *: TRUE, false_t *: FALSE)
#define bool_v_to_int(B) _Generic(B, true_t: 1, false_t: 0)

#define v_to_bool(V) typeof(V)

#define is_string_v(X) _Generic((X), \
        char *: 1,                   \
        default: 0)

#define is_string_t(X) typeof(_Generic((X), \
        char *: TRUE,                       \
        default: FALSE))


#define has_signature_v(X, R, ...)         \
    _Generic((X),                          \
            SignatureM(R, __VA_ARGS__): 1, \
            default: 0)

#define has_signature_t(X, R, ...)            \
    typeof(_Generic((X),                      \
            SignatureM(R, __VA_ARGS__): TRUE, \
            default: FALSE))

#define to_string(x) _Generic((x), \
        true_t: "true",            \
        false_t: "false",          \
        char*: x,                  \
        const char*: x)

#define has_same_type_v(X, Y)       \
    _Generic(has_same_type_t(X, Y), \
            true_t: 1,              \
            false_t: 0)

#define has_same_type_t(X, Y) typeof(_Generic((X), \
        typeof(Y): TRUE,                           \
        default: FALSE))

#define SignatureM(R, ...) R (*)(__VA_ARGS__)

#define is_same_t(X, Y)          \
    typeof(_Generic(((X *) (0)), \
            Y *: TRUE,           \
            default: FALSE))

#define and_t(X, Y)                                                    \
    typeof(_Generic(bool_v(X),                                         \
            true_t: _Generic(bool_v(Y), true_t: TRUE, false_t: FALSE), \
            false_t: _Generic(bool_v(Y), true_t: FALSE, false_t: FALSE)))

#define or_t(X, Y)                                                    \
    typeof(_Generic(bool_v(X),                                        \
            true_t: _Generic(bool_v(Y), true_t: TRUE, false_t: TRUE), \
            false_t: _Generic(bool_v(Y), true_t: TRUE, false_t: FALSE)))

#define not_t(X)               \
    typeof(_Generic(bool_v(X), \
            true_t: FALSE,     \
            false_t: TRUE))

#define result_t(X, ...) typeof((X) (__VA_ARGS__))

#define id_sig(T) SignatureM(T, void)
#define true_sig id_sig(true_t)
#define false_sig id_sig(false_t)
#define _0 false_sig
#define _1 true_sig

#define bool_sig_v(S) _Generic((S) (0), true_sig: TRUE, false_sig: FALSE)
#define bool_sig_int(S) _Generic((S) (0), true_sig: 1, false_sig: 0)
#define bool_sig_t(S) typeof(bool_sig_v(S))

#define sig_apply_res_t(X) typeof(((X) (0))())

#define is_same_sig_t(SA, SB) typeof(_Generic((SA) (0), SB: TRUE, default: FALSE))

Запостил: j123123 j123123, (Updated )

Комментарии (12) RSS

  • #define eq_sig(SA, SB) id_sig(is_same_sig_t(SA, SB))
    
    #define not_sig(SA) id_sig(typeof(_Generic((SA) (0), true_sig: FALSE, false_sig: TRUE)))
    #define and_sig(SA, SB) id_sig(typeof(_Generic((SA) (0), true_sig: _Generic((SB) (0), true_sig: TRUE, false_sig: FALSE), false_sig: FALSE)))
    #define or_sig(SA, SB) id_sig(typeof(_Generic((SA) (0), true_sig: TRUE, false_sig: _Generic((SB) (0), true_sig: TRUE, false_sig: FALSE))))
    #define xor_sig(SA, SB) not_sig(eq_sig(SA, SB))
    
    #define select_sig(SD0, SD1, SI) typeof(_Generic((SI) (0), _0: (SD0) (0), _1: (SD1) (0)))
    #define select2_sig(SD0, SD1, SD2, SD3, SI0, SI1) select_sig(select_sig(SD0, SD2, SI1), select_sig(SD1, SD3, SI1), SI0)
    
    #define add_sig(SDA0, SDB0, SI)  \
        select_sig(                  \
                xor_sig(SDA0, SDB0), \
                and_sig(SDA0, SDB0), \
                SI)
    
    /**
     * ```
     *                      Result selection by index: (SI0, SI1)
     *
     * SDA0 ---------[   ]------------------------ S0  ( 0 ,  0 )
     *               [ + ]
     * SDA1 -.     .-[   ]-.                  .--- S1  ( 0 ,  1 )
     *        \   /         \                /
     *         \ /           "-[   ]--------"
     *          /.             [ + ]
     *         /  \         .--[   ]-.
     * SDB0 --"    "-[   ]."          "-[   ]   .-- C  ( 1 ,  0 )
     *               [ + ]              [ V ]--"
     * SDB1 ---------[   ]--------------[   ]     - 0  ( 1 ,  1 )
     * ```
     */
    Ответить
    • #define add2_sig(SDA0, SDA1, SDB0, SDB1, SI0, SI1)                                \
          select2_sig(                                                                  \
                  add_sig(SDA0, SDB0, _0),                                              \
                  add_sig(add_sig(SDA0, SDB0, _1), add_sig(SDA1, SDB1, _0), _0),        \
                  or_sig(add_sig(add_sig(SDA0, SDB0, _1), add_sig(SDA1, SDB1, _0), _1), \
                         add_sig(SDA1, SDB1, _1)),                                      \
                  false_sig,                                                            \
                  SI0, SI1)
      
      void foo(int x) {}
      void bar(void) {}
      double bar2(int x, int y) { return 0.0; }
      
      int main() {
          printf("%d\n", is_string_v("123"));
          printf("%d\n", is_string_v(123123));
          printf("%d\n", has_signature_v(foo, void, int));
          printf("%d\n", has_signature_v(bar, void, int));
          printf("%d\n", has_signature_v(bar2, void, int));
          printf("%d\n", has_signature_v(bar2, double, int, int));
      
          has_signature_t(bar2, double, int, int) x;
      
          printf("%s\n", to_string(x));
      
          has_same_type_t(&bar2, &bar2) y1;
          has_same_type_t(&bar2, &foo) y2;
          has_same_type_t(1, 1) z;
      
          is_same_t(typeof(&bar2), typeof(&bar2)) z1;
          is_same_t(typeof(&bar2), typeof(&foo)) z2;
          is_same_t(int, typeof(&foo)) z3;
          is_same_t(true_t, true_t) z4;
      
          and_t(true_t, false_t) aa;
      
          printf("%s\n", to_string(bool_v(and_t(true_t, false_t))));
          printf("%s\n", to_string(bool_v(and_t(true_t, true_t))));
      Ответить
      • auto xxx = (void (*)(int))(0);
            auto xxxx = (SignatureM(void, int))(0);
            auto xxxxx = bool_v(has_same_type_t(xxx, xxxx));
            auto джигурда = bool_v(has_same_type_t((typeof(xxx(3)) *) (0), (void *) (0)));
            auto джигурда2 = bool_v(has_same_type_t((typeof(((void (*)(int))(0))(3)) *) (0), (void *) (0)));
            auto _ = bool_v(is_same_t(result_t(xxx, 42), result_t(xxxx, 4242)));
        
            auto _______ = (true_sig) (0);
            auto ________ = (false_sig) (0);
            auto _________ = (not_sig(false_sig))(0);
            auto __________ = bool_v(is_same_sig_t(not_sig(false_sig), true_sig));
            auto ___________ = (and_sig(true_sig, false_sig))(0);
        
            auto s1 = bool_sig_v(true_sig);
            auto s2 = bool_sig_v(not_sig(false_sig));
            auto s3 = bool_sig_v(and_sig(true_sig, false_sig));
        
            auto select1 = bool_sig_v(select_sig(true_sig, false_sig, _1));
            auto select2 = bool_v(is_same_sig_t(select_sig(true_sig, false_sig, _0), true_sig));
        
            auto add1 = bool_sig_v(add_sig(true_sig, true_sig, false_sig));
            auto add2 = bool_sig_v(add_sig(true_sig, true_sig, true_sig));
        
            auto add30 = bool_sig_v(add2_sig(_1, _1, _1, _1, _0, _0));
            auto add31 = bool_sig_v(add2_sig(_1, _1, _1, _1, _0, _1));
            auto add32 = bool_sig_v(add2_sig(_1, _1, _1, _1, _1, _0));
            auto add33 = bool_sig_v(add2_sig(_1, _1, _1, _1, _1, _1));
        
            printf("%d %d %d %d\n", bool_v_to_int(add33), bool_v_to_int(add32), bool_v_to_int(add31), bool_v_to_int(add30));
        
            return 0;
        }
        Ответить
  • У TRUE и у FALSE разные типы — это уже не по-сишному. Это уже ООП какое-то или функциональщина.

    Да, _Generic() — нереально крутая конструкция.
    Ответить
  • Есчес потупил на моментах типа (S) (0), спасибо Ритчи
    Ответить
    • В сишке адово переиспользуются символы.

      (S)(0) — это reinterpret_cast<S>(0) в крестах.

      К слову, в крестах грамматика ещё более конь-текстнозависимая.

      А ещё спасибо Кернигану и Ритчи за то, что a[b] — это сахар для *(a + b), поэтому вместо a[5] можно писать 5[a], чем шокировать пришедших из других ЯП.

      Сишку как будто специально для IOCCC создавали.
      Ответить
      • не только reinterpret_cast но может быть и статик еще не?
        Ответить
          • — А может, и не статик, да?
            — Нет.
            — Сколько переменных перекастил? Признавайся честно.
            Ответить
              • Кастил с проверкой типа в рантайме дайнамиком, или наживую реинтерпретером?
                Ответить

Добавить комментарий

Переведи на "PHP", guest!

    А не использовать ли нам bbcode?

    ↑
    8

    ↓