1. Куча / Говнокод #14538

    +127

    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
    import std.stdio;
    
    struct Vector
    {
        private static bool checkOpDispatch(in string str)
        {
            if(str.length != 4) return false;
            foreach(c; str)
            {
                if(c != 'x' && c != 'y' && c != 'z' && c != 'w') return false;
            }
            return true;
        }
        float x,y,z,w;
    
        @property auto opDispatch(string s)() const if(checkOpDispatch(s))
        {
            return Vector(mixin(s[0..1]),
                          mixin(s[1..2]),
                          mixin(s[2..3]),
                          mixin(s[3..4]));
        }
        
        void print() const
        {
            writefln("Vector: %f, %f, %f, %f", x, y, z, w);
        }
    }
    
    void main() 
    {
    	//vector swizzling
        Vector v = {1,2,3,4};
        v.print();
        auto v1 = v.wzyx;
        v1.print();
        auto v2 = v.xyxy;
        v2.print();
    }

    http://ideone.com/bfA9gI

    Запостил: LispGovno, 10 Февраля 2014

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

    • Ответить
    • А где говно? По-моему прикольно, как в GLSL. Единственный вопрос, это все во время компиляции происходит? Компилятор может соптимизировать это в специальную swizzle-инструкцию? В SSE вроде такие были.
      Ответить
      • строка переводится в Vector(w,z,y,x) во время компиляции. А что уж компилятор с этим конструктором сделает уже не от кода зависит.
        Ответить
    • Динамичненько!
      Ну, в некотором роде.
      Ответить
    • Получается, в этом вашем Д можно запилить маппер так, чтобы можно было почти как в грельсах писать Model.findByXAndY(x, y)?
      Ответить

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