1. C++ / Говнокод #16430

    +56

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    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
    #	define S_1(X,...)				\
    	template<class T, int N>		\
    	T X(const V<T, N>& v)			\
    	{								\
    		return v.X;					\
    	}
    #	define S_2(X,Y,...)				\
    	template<class T, int N>		\
    	V<T, 2> X##Y(const V<T, N>& v)	\
    	{								\
    		return V<T, 2>(v.X, v.Y);	\
    	}
    #	define S_3(X,Y,Z,...)				\
    	template<class T, int N>			\
    	V<T, 3> X##Y##Z(const V<T, N>& v)	\
    	{									\
    		return V<T, 3>(v.X, v.Y, v.Z);	\
    	}
    #	define S_4(X,Y,Z,W,...)					\
    	template<class T, int N>				\
    	V<T, 4> X##Y##Z##W(const V<T, N>& v)	\
    	{										\
    		return V<T, 4>(v.X, v.Y, v.Z, v.W);	\
    	}
    
    #	define S_E(S, X, Y, Z)	\
    	S(x, X, Y, Z);S(y, X, Y, Z);S(z, X, Y, Z);S(w, X, Y, Z);S(O, X, Y, Z);S(I, X, Y, Z);
    #	define S_E1(E, S, Z, W)	\
    	E(S, x, Z, W);			\
    	E(S, y, Z, W);			\
    	E(S, z, Z, W);			\
    	E(S, w, Z, W);			\
    	E(S, O, Z, W);			\
    	E(S, I, Z, W);
    
    #	define S_E2(E, S, W)	\
    	S_E1(E, S, x, W);		\
    	S_E1(E, S, y, W);		\
    	S_E1(E, S, z, W);		\
    	S_E1(E, S, w, W);		\
    	S_E1(E, S, O, W);		\
    	S_E1(E, S, I, W);
    
    #	define S_E3(E, S)	\
    	S_E2(E, S, x);		\
    	S_E2(E, S, y);		\
    	S_E2(E, S, z);		\
    	S_E2(E, S, w);		\
    	S_E2(E, S, O);		\
    	S_E2(E, S, I);
    
    	S_E1(S_E, S_2, void, void);
    	S_E2(S_E, S_3, void);
    	S_E3(S_E, S_4);
    
    // Где-то выше
    template<class T, int N>
    struct V;
    template<class T>
    struct V<T, 2>
    {
    	V(T x, T y) : x(x), y(y) {}
    	T x,y;
    	T O = 0;
    	T I = 1;
    };
    template<class T>
    struct V<T, 3>
    {
    	V(T x, T y, T z) : x(x), y(y), z(z) {}
    	T x,y,z;
    	T O = 0;
    	T I = 1;
    };
    template<class T>
    struct V<T, 4>
    {
    	V(T x, T y, T z, T w) : x(x), y(y), z(z), w(w) {}
    	T x,y,z,w;
    	T O = 0;
    	T I = 1;
    };

    Этот код рабочий и используется во многих местах моего проекта.
    Я его написал когда-то давно и уже забыл, как оно функционирует, но оно генерирует очень много (около 1.5k) функций.

    Запостил: -Eugene-, 27 Июля 2014

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

    • Строчка с S_E(S_1, void, void, void) не потерялась случаем?

      P.S. Нахрена в каждом векторе нестатические поля O и I? Память же зря тратится на них, да и такты...
      Ответить
      • Да, я пропустил эту строку, причём при написании. Удивлён, что кто то заметил.

        Поля ессно статические.
        Ответить
        • > Поля ессно статические.
          Статик отклеился при копировании сюда?
          Ответить
          • Реальные классы векторов толще раз в цать. Здесь только набросок их полей, набивался на ходу.

            Ах да, надо не забыть удалить эти поля за ненадобностью...
            Ответить
    • А если как-то так?

      http://ideone.com/Y8oaUh
      Ответить
      • 8-битный дождь....

        Я не понял тольеко одного - нахуя?
        Ответить
        • > нахуя?
          Пересборка вектора из компонентов другого :)

          Чтобы вместо V<float, 4>(v2.x, v2.y, 0.0, 1.0) писать X_Y_O_I(v2)

          Я так понимаю, что ОП из геймдева, а там все эти сборки/разборки векторов актуальны.

          P.S. Хотя... все 100500 вариантов, имхо, нафиг не нужны, по-любому будут юзать только (x, y) -> (x, y, 0, 1), (x, y, z, w) -> (x, y, z) и им подобные. А все эти варианты решились бы дополнительными конструкторами в V<>.
          Ответить
          • OMG.
            Я бы написал что то типа
            GetFromVector(v2, "XYOI")
            Ответить
            • > Я бы написал что то типа
              Парсить строку в горячих циклах? Да ты упоролся ;)

              P.S. И как ты собрался определять тип возвращаемого значения по длине строки, чтобы GetFromVector(v2, "XY") возвращало двухкомпонентный вектор, а GetFromVector(v2, "XY01") - четырёх?
              Ответить
              • Нах парсить массив чаров? на каждый чар крутишь функцию от вектора. Ну можно и енум
                Ответить
                • > Нах парсить массив чаров?
                  Ну а как ты будешь определять, что именно вернуть без парсинга этой строчки? Ну компилятор, скорее всего, сообразит, что там в аргументе константа, и все это заинлайнит и свернет... И асм даже может получиться таким же, как у ОП'а... Но проблему с переменной длиной ответа это не решает.

                  > Ну можно и енум
                  Как?
                  Ответить
                  • как-как. Dictionary<Char,Func<Float, Vector>>
                    Ответить
                    • Так вот почему игрухи на дотнетах и жабах так тормозят.
                      Ответить
                      • а, ну да, там же еще магия бубна, и все это быстро.

                        один ноль в вашу пользу, проклятые плюсы! )
                        Ответить
                        • >один ноль в вашу пользу, проклятые плюсы! )
                          И на плюсах можно stl использовать, там где подошёл бы обычный массив.
                          Ответить
      • Красиво. Гениально. Перфоманс.
        Как кегданское ФП, только полезное.
        Ответить
      • Enter variadic templates
        http://ideone.com/vp4y0z
        Ответить
        • Можно еще массив вместо пачки полей в векторах сделать. Все равно напрямую их не читают...

          P.S. Did you mean "enter to the"?
          Ответить
          • Ан нет, to, походу, не надо.
            Ответить
          • > Можно еще массив вместо пачки полей в векторах сделать

            Да, я тоже об этом подумал. Вообще, тут уже Boost.Geometry попахивает.
            Ответить
      • Спасибо. Выгреб ещё горсть говнокода из проекта.
        Ответить
    • не понял, а где #define S и #define E
      Ответить
      • #define S_E1(E, S, Z, W)
        Ответить
        • А, да, тогда примерно понятно. Пиздец, факториальный генератор кокойта
          Ответить
          • Да почему факториальный? Всего лишь 6^4 + 6^3 + 6^2 + 6 = 1554.
            Ответить
            • а разве не просто 6^4?

              а, понял, 6^3 - для V<T, 3> и т.д
              Ответить
    • В криптографии тоже сотни такого бывают. Но это не повод переносить всё сюда, наверное.
      Ответить
      • Например моя макроёбская реализация аес ;) Только препроцессор, никакого си.

        Если интересно - можно поглядеть на гитхабе.
        Ответить
        • Кинь ссыль на гитхаб-то, не у всех есть.
          Ответить
        • Я смотрел, возможно. Голова стала совсем дырявая, ничего не помню.
          Ответить
    • В glm по-моему swizzling тоже есть. Наверное, там тоже говнокод.
      Ответить
    • в тему http://www.govnokod.ru/16542
      Ответить

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