1. Список говнокодов пользователя gammaker

    Всего: 28

  2. C++ / Говнокод #20449

    +1

    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
    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
    struct Test
    {
    	Array<int> intArray;
    	int fixedIntArray[3];
    	bool booleanVal;
    	float flt;
    	Array<string> stringArray;
    
    	ADD_REFLECTION(Test, intArray, fixedIntArray, booleanVal, flt, stringArray);
    };
    
    struct SuperTest
    {
    	Array<string> strArr;
    	int foo;
    	string str;
    	Array<short> vals;
    	double dbl;
    	Test tests[3];
    	ushort bar;
    
    	ADD_REFLECTION(SuperTest, strArr, foo, str, vals, dbl, tests, bar);
    };
    
    int main()
    {
    	StringView structText = R"({
    		.strArr = {"str1", "ergvwr", "brt"},
    		.foo = 5,
    		.str = "gammaker",
    		.vals = {-4, 66, 432, -95},
    		.dbl = 3.1415926535897932384626433832795,
    		{
    			{
    				.fixedIntArray = {9, 4, 85},
    				.stringArray = {"test 0 A", "test 0 B", "test 0 C"},
    				.booleanVal = true,
    				.intArray = {43, 54, 36, 76},
    				.flt = 1.23456,
    				.flt = 2.34567
    			},
    			{
    				.intArray = {},
    				.fixedIntArray = {3655456, 234, 3},
    				.booleanVal = false,
    				.flt = 2.718281828,
    				.stringArray = {"test 1 A", "test 1 B"}
    			},
    			{
    				.intArray = {1531, 1253, 16, 634, 236462363},
    				.fixedIntArray = {9435, 435, 8355},
    				.booleanVal = false,
    				.flt = 123.65,
    				.stringArray = {"test 2 A", "test 2 B", "test 2 C", "test 2 D"}
    			}
    		},
    		.bar = 1025
    	})";
    
    	Data::TextDeserializer deserializer(Data::DataLanguageParams::CStructInitializer, structText);
    	SuperTest test = deserializer.Deserialize<SuperTest>();
    
    	char charBuf[5000];
    	Data::TextSerializer serializer(Data::DataLanguageParams::Json, Data::TextSerializerParams::Verbose, ArrayRange<char>(charBuf, 5000));
    	serializer.NestingLevel=-1;
    	serializer.Serialize(test);
    	Console.PrintLine(serializer.GetString());
    
    	Data::DataLanguageParams rusML;
    	rusML.RequireFieldAssignments = false;
    	rusML.AddFieldNameAfterAssignment = false;
    	rusML.LeftAssignmentOperator = "равно";
    	rusML.FieldSeparator = " следующее поле";
    	rusML.LeftFieldNameBeginQuote = null;
    	rusML.LeftFieldNameEndQuote = null;
    	rusML.RightFieldNameBeginQuote = null;
    	rusML.RightFieldNameEndQuote = null;
    	rusML.StructInstanceOpen = "начало структуры";
    	rusML.StructInstanceClose = " структура кончилась";
    	rusML.OneLineCommentBegin = "комментарий:";
    	rusML.StringQuote="\"";
    	rusML.CharQuotes = "";
    	rusML.ArrayOpen = " массив начался ";
    	rusML.ArrayClose = " кончился массив ";
    	rusML.ArrayElementSeparator = " дальше";
    	rusML.FalseTrueNames[0] = "нет";
    	rusML.FalseTrueNames[0] = "да";
    	rusML.DecimalSeparator = ',';
    
    	serializer = Data::TextSerializer(rusML, Data::TextSerializerParams::Verbose, ArrayRange<char>(charBuf, 5000));
    	serializer.NestingLevel=-1;
    	serializer.Serialize(test);
    	Console.PrintLine(serializer.GetString());
    
    	return 0;
    }

    Сделал автоматический сериализатор с кучей параметров, используя которые можно описать JSON, инициализаторы C'шных и D'шных структур, подмножество XML или какой-нибудь свой кастомный формат. Здесь показана десериализация сишного инициализатора с designated initializers, который почему-то не добавили в C++. Затем полученная структура сериализуется в JSON (его описание в моём хидере, и здесь не приведено), а затем в придуманный мной ради прикола язык разметки rusML, описание которого можно видеть в коде.

    Выводит (табы порезались):

    {
    "strArr" : ["str1", "ergvwr", "brt"],
    "foo" : 5,
    "str" : "gammaker",
    "vals" : [-4, 66, 432, -95],
    "dbl" : 3.141592653589789,
    "tests" : [
    {
    "intArray" : [43, 54, 36, 76],
    "fixedIntArray" : [9, 4, 85],
    "booleanVal" : true,
    "flt" : 2.3456699,
    "stringArray" : ["test 0 A", "test 0 B", "test 0 C"]
    },
    {
    "intArray" : [],
    "fixedIntArray" : [3655456, 234, 3],
    "booleanVal" : false,
    "flt" : 2.7182817,
    "stringArray" : ["test 1 A", "test 1 B"]
    },
    {
    "intArray" : [1531, 1253, 16, 634, 236462363],
    "fixedIntArray" : [9435, 435, 8355],
    "booleanVal" : false,
    "flt" : 123.6499938,
    "stringArray" : ["test 2 A", "test 2 B", "test 2 C", "test 2 D"]
    }
    ],
    "bar" : 1025
    }

    начало структуры
    strArr равно массив начался "str1" дальше "ergvwr" дальше "brt" кончился массив следующее поле
    foo равно 5 следующее поле
    str равно "gammaker" следующее поле
    vals равно массив начался -4 дальше 66 дальше 432 дальше -95 кончился массив следующее поле
    ...

    gammaker, 30 Июля 2016

    Комментарии (173)
  3. C++ / Говнокод #20440

    +1

    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
    #include <iostream>
    #include <tuple>
    using namespace std;
    
    template<typename T, typename T0, typename T1, typename ...Args>
    void PrintStruct(const tuple<T0 T::*, T1 T::*, Args T::*...>& members, const T& val)
    {
    	cout << val.*std::get<0>(members) << endl;
    	PrintStruct(members._Get_rest(), val);
    }
    
    template<typename T, typename T0>
    void PrintStruct(const tuple<T0 T::*>& members, const T& val)
    {
    	cout << val.*std::get<0>(members) << endl;
    }
    
    struct MyStruct
    {
    	int x;
    	float y;
    
    	static const tuple<decltype(&MyStruct::x), decltype(&MyStruct::y)> Members;
    };
    
    const tuple<int MyStruct::*, float MyStruct::*> MyStruct::Members = std::make_tuple(&MyStruct::x, &MyStruct::y);
    
    int main()
    {
    	MyStruct str = {123, 3.14159f};
    	PrintStruct(MyStruct::Members, str);
    	return 0;
    }

    Пытался понять, почему мой код не компилится в 2013 студии, и быстренько накатал этот минимальный пример. Но вышел облом - он почему-то компилится, в отличие от моей реальной либы со схожими шаблонными крестоконструкциями.

    gammaker, 27 Июля 2016

    Комментарии (105)
  4. C++ / Говнокод #20426

    0

    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
    83. 83
    84. 84
    85. 85
    // check that all selected vertices are one 3d vertex.
      bool UsedIndex = 0;
      bool IndexIsRegistered = false;
      for (int t = 0; t < Indices.count(); t++)
      {
        zUVVertex Vertex = OldVerts->at(t);
        if (!IndexIsRegistered)
        {
          IndexIsRegistered = true;
          UsedIndex = Vertex.BaseVertexIndex;
        }
        else if (UsedIndex != OldVerts->at(t).BaseVertexIndex)
        {
          // quit on fail
          return;
        }
      }
      NewList = new QList<zUVVertex>();
    
      zUVVertex NewVertex;
      bool VertexIsInitialized = false;
      bool CapIsHoled = false;
    
      for (quint32 t = 0; t < OldVerts->count(); t++)
      {
        bool Taked = false;
        for (quint32 j = 0; j < Indices.count(); j++)
        {
          if (OldVerts->at(t).index == Indices.at(j))
          {
            if (!VertexIsInitialized)
            {
              VertexIsInitialized = true;
              NewVertex = OldVerts->at(t);
            }
            Taked = true;
            NewVertex.IndicesBeforeWeld << t;
            break;
          }
        }
        if (!Taked)
        {
          (*NewList) << OldVerts->at(t);
        }
        else
        {
          zUVVertex Stub;
    
          if (!CapIsHoled)
          {
            Stub = NewVertex;
          }
          else
          {
            Stub.Index = 0x7FFFFFFF;
          }
          (*NewList) << Stub;
        }
      }
      (*NewList) << NewVertex;
    
      Taked = false;
      QList<zUVFace> *TempFacesList = new QList<zUVFace>();
    
      for (int t = 0; t < Faces->count(); t++)
      {
        zUVFace Face = Faces->at(t);
        zUVFace NewFace;
        for (int j = 0; j < Face.VertsIndices; j++)
        {
          quint32 Index0 = Face.VertsIndices.at(j);
          zUVVertex TestVertex = NewList->at(Index0);
          if (TestVertex.Index == 0x7FFFFFFF)
          {
            // need to replace
            NewFace = Faces->at(t);
            NewFace.VertsIndices.operator [](j) = NewList->count() - 1;
            Taked = true;
          }
        }
        if (Taked)
        {
          (*TempFacesList) << NewFace;
        }
      }

    http://www.gamedev.ru/code/forum/?id=216701

    gammaker, 25 Июля 2016

    Комментарии (30)
  5. C++ / Говнокод #20403

    +4

    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
    #include <IO/Stream.h>
    #include "Algorithms/Range.h"
    #include "Algorithms/RangeConstruct.h"
    #include "Algorithms/RangeIteration.h"
    #include "Algorithms/RangeMutation.h"
    
    using namespace IO;
    using namespace Range;
    
    int main()
    {
      Console.PrintLine("Есть нормальная поддержка Юникода в консоли, даже на винде.");
      Console.PrintLine("Тестируется текст с кириллицей, греческим алфавитом αβγδεζηθικλμνξο, а также с иероглифами ㈇㌤㈳㌛㉨.");
      Console.PrintLine("Иероглифы не отображаются в консоли, потому что консольный шрифт их не содержит, но копируются оттуда нормально.");
    
       StringView strs[] = {"hello", "world"};
      StringView strs1[]  = {"range", "testing", "program"};
      StringView strs2[] = {"C++", "крут"};
    
      Console.PrintLine("В тесте используются три массива:", endl, strs, endl, strs1, endl, strs2);
      Console.PrintLine(endl, "Пример вывода initializer list:", endl, AsRange<double>({4353.435, 3243.23, 21.421, 12355.5, 64532}));
    
      auto fib = Recurrence(Algo::Op::Add<int>, 1, 1);
    
      Array<int> fibArr;
      fibArr.SetCountUninitialized(15);
      auto copyResult = fib.Take(15).Copy(fibArr());
      Console.PrintLine(endl, "Последовательность Фибоначчи в массиве: ", endl, fibArr());
      Console.PrintLine(endl, "Вторая половина того же массива задом наперёд: ", endl, fibArr($/2, $).Retro());
    
      fib.Drop(5).Take(15).Copy(fibArr.Insert($));
      Console.PrintLine(endl, "Добавляем 15 чисел Фибоначчи, начиная с пятого, в конец. Новое содержимое массива: ");
      Console.PrintLine(fibArr());
    
      Console.PrintLine(endl, "Объединяем элементы различных диапазонов в диапазоне кортежей: ", endl, ToString(
        Zip(
          fib.Take(30),
          Chain(AsRange(strs), AsRange(strs1), AsRange(strs2)).Cycle().Take(20),
          Recurrence([](int a, int b){return a*2+b;}, 1, 1).Take(17).Cycle().Drop(3).Take(22),
          fib.Take(19).Cycle().Drop(5).Take(50).Stride(3),
          Recurrence(Algo::Op::Mul<ulong64>, 2ull, 3ull).Take(9)
        ), 
        ",\n  ", "[\n  ", "\n]"));
    
    
      static const StringView pattern[] = {"pattern", "fills", "range"};
      Chain(AsRange(strs), AsRange(strs1), AsRange(strs2)).FillPattern(AsRange(pattern));
    
      Console.PrintLine(endl, "Поменяли сразу три массива одним вызовом FillPattern: ");
      Console.PrintLine(strs, endl, strs1, endl, strs2, endl);
    
      Console.PrintLine("11-й элемент зацикленного массива строк: ", endl, AsRange(strs).Cycle().Take(11).Tail(1), endl);
      Console.PrintLine("Перевёрнутый массив строк: ", endl, AsRange(strs).Retro(), endl);
      Console.PrintLine("Зациклили первые два элемента массива и взяли 10 из них:");
      Console.PrintLine(AsRange(strs1).Take(2).Cycle().Take(10) );
      Console.PrintLine("Между массивом строк и 5 числами Фибоначчи выбрали второе в рантайме: ");
      Console.PrintLine(Choose(AsRange(strs1), fib.Take(5).Map([](int x){return ToString(x);}), true) );
    
      static const size_t indices[] = {1,1,1,2,2,0,2,1,0};
      Console.PrintLine(
          RoundRobin(
            AsRange(strs1).Indexed(AsRange(indices)),
            Repeat(StringView("Test"), 5),
            AsRange(strs1),
            AsRange(strs2)
          ));
      
    
      Console.PrintLine(endl, "Введите строки, которые войдут в диапазон строк. В конце введите \"end\".");
      Console.PrintLine("Вы ввели следующие строки:", endl, ToString(Console.ByLine("end")) );
    
      int arr[]={1, 4, 11, 6, 8};
      Console.PrintLine("max{1, 4, 11, 6, 8} = ", AsRange(arr).Reduce(Algo::Op::Max<int>));
    
      Console.PrintLine("Генерация 100 случайных чисел от 0 до 999 и вывод квадратов тех из них, которые делятся на 7: ", endl,
        Generate([](){return math::urandom()%1000;}).Take(100)
        .Filter([](uint x) {return x%7==0;})
        .Map(math::sqr<uint>)
      );
    
      return 0;
    }

    Давно здесь не было моих велосипедов. А они с тех пор сильно эволюционировали, я даже многие фичи из языка D смог перенести в C++.
    Вывод в консоль и обсуждение здесь: http://www.gamedev.ru/flame/forum/?id=216045&page=99#m1481

    gammaker, 20 Июля 2016

    Комментарии (7)
  6. C++ / Говнокод #20073

    +5

    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
    //Collisions
    static float collisionradius;
    if(numplayers>1)
    	for(k=0;k<numplayers;k++){
    	for(i=k;i<numplayers;i++){
    	if(i==k)i++;
       			if(i<numplayers)
       					if((animation[player[i].targetanimation].attack!=reversed&&animation[player[i].targetanimation].attack!=reversal&&animation[player[k].targetanimation].attack!=reversed&&animation[player[k].targetanimation].attack!=reversal)||(i!=0&&k!=0))
       						if((animation[player[i].currentanimation].attack!=reversed&&animation[player[i].currentanimation].attack!=reversal&&animation[player[k].currentanimation].attack!=reversed&&animation[player[k].currentanimation].attack!=reversal)||(i!=0&&k!=0))
       							if(player[i].howactive<=typesleeping&&player[k].howactive<=typesleeping)
       								if(player[i].howactive!=typesittingwall&&player[k].howactive!=typesittingwall)
       									if(i!=k&&player[i].whichpatchx==player[k].whichpatchx&&player[i].whichpatchz==player[k].whichpatchz&&player[k].skeleton.oldfree==player[k].skeleton.free&&player[i].skeleton.oldfree==player[i].skeleton.free&&player[i].targetanimation!=climbanim&&player[i].targetanimation!=hanganim&&player[k].targetanimation!=climbanim&&player[k].targetanimation!=hanganim)
       										if(player[i].coords.y>player[k].coords.y-3)
       											if(player[i].coords.y<player[k].coords.y+3)
       												if(player[i].coords.x>player[k].coords.x-3)
       													if(player[i].coords.x<player[k].coords.x+3)
       														if(player[i].coords.z>player[k].coords.z-3)
       															if(player[i].coords.z<player[k].coords.z+3){
       																if(findDistancefast(&player[i].coords,&player[k].coords)<3*((player[i].scale+player[k].scale)*2.5)*((player[i].scale+player[k].scale)*2.5)){
      																	if(player[i].onfire||player[k].onfire){
      																		if(!player[i].onfire)player[i].CatchFire();
       																		if(!player[k].onfire)player[k].CatchFire();
       																	}
       																}
       																...

    http://hg.icculus.org/icculus/lugaru/file/97b303e79826/Source/GameTick.cpp#l7276

    gammaker, 25 Мая 2016

    Комментарии (3)
  7. C++ / Говнокод #19923

    −1

    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
    //Сериализовать структуру со статической информацией о её полях
    template<typename T, typename T0, typename ...Args> void SerializeBinary(
    	const Tuple<T0 T::*, Args T::*...>& members, const T& src, void*& dst)
    {
    	SerializeBinary(src.*members.first, dst);
    	SerializeBinary(members.next, src, dst);
    }
    
    template<typename T, typename T0> void SerializeBinary(
    	const Tuple<T0 T::*>& members, const T& src, void*& dst)
    {
    	SerializeBinary(src.*members.first, dst);
    }
    
    //Десериализовать структуру со статической информацией о её полях
    template<typename T, typename T0, typename ...Args> void DeserializeBinary(
    	const Tuple<T0 T::*, Args T::*...>& members, T& dst, const void*& src)
    {
    	DeserializeBinary(dst.*members.first, src);
    	DeserializeBinary(members.next, dst, src);
    }
    
    template<typename T, typename T0> void DeserializeBinary(
    	const Tuple<T0 T::*>& members, T& dst, const void*& src)
    {
    	DeserializeBinary(dst.*members.first, src);
    }
    
    //Размер структуры в сериализованном виде
    template<typename T, typename T0, typename ...Args> uintptr GetSerializedBinarySize(
    	const Tuple<T0 T::*, Args T::*...>& members, const T& src)
    {
    	return GetSerializedBinarySize(src.*members.first) + GetSerializedBinarySize(members.next, src);
    }
    
    template<typename T, typename T0> uintptr GetSerializedBinarySize(
    	const Tuple<T0 T::*>& members, const T& src)
    {
    	return GetSerializedBinarySize(src.*members.first);
    }

    Сделал свой сериализатор на шаблонах и кортежах с указателями на данные-члены.

    gammaker, 03 Мая 2016

    Комментарии (3)
  8. C++ / Говнокод #19316

    +3

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    9. 9
    class ResourcePack
    {
        MultipleLinearMaps<string, Texture, Mesh, Model3D, VideoBuffer, Shader, ShaderObj, Framebuffer,
    		Effect, PostEffect, Sampler, VertexLayout, StructureType, ParameterBlock,
    		ShaderTemplate, ShaderModuleTemplate, ShaderModule, ShaderModuleType,
    		ShaderGenerator, ShaderLibrary, ImageFunction> maps;
    
        //...
    };

    Наконец-то я осилил variadic templates!

    gammaker, 16 Января 2016

    Комментарии (1)
  9. Си / Говнокод #18824

    −99

    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
    #include <stdio.h>
    
    char
    *T="IeJKLMaYQCE]jbZRskc[SldU^V\\X\\|/_<[<:90!\"$434-./2>]s",
    K[3][1000],*F,x,A,*M[2],*J,r[4],*g,N,Y,*Q,W,*k,q,D;X(){r  [r
    [r[3]=M[1-(x&1)][*r=W,1],2]=*Q+2,1]=x+1+Y,*g++=((((x&     7)
    -1)>>1)-1)?*r:r[x>>3],(++x<*r)&&X();}E(){A||X(x=0,g       =J
    ),x=7&(*T>>A*3),J[(x[F]-W-x)^A*7]=Q[x&3]^A*(*M)[2         +(
    x&1)],g=J+((x[k]-W)^A*7)-A,g[1]=(*M)[*g=M[T+=A            ,1
    ][x&1],x&1],(A^=1)&&(E(),J+=W);}l(){E(--q&&l              ()
    );}B(){*J&&B((D=*J,Q[2]<D&&D<k[1]&&(*g++=1                ),
    !(D-W&&D-9&&D-10&&D-13)&&(!*r&&(*g++=0)                   ,*
    r=1)||64<D&&D<91&&(*r=0,*g++=D-63)||D                     >=
    97&&D<123&&(*r=0,*g++=D-95)||!(D-k[                       3]
    )&&(*r=0,*g++=12)||D>k[3]&&D<=k[                          1]
    -1&&(*r=0,*g++=D-47),J++));}j(                            ){
    putchar(A);}b(){(j(A=(*K)[D*                              W+
    r[2]*Y+x]),++x<Y)&&b();}t                                 ()
    {(j((b(D=q[g],x=0),A=W)                                   ),
    ++q<(*(r+1)<Y?*(r+1):                                     Y)
    )&&t();}R(){(A=(t(                                        q=
    0),'\n'),j(),++r                                          [2
    ]<N)&&R();}O()                                            {(
    j((r[2]=0,R(                                              ))
    ),r[1]-=q)                                                &&
    O(g-=-q)                                                  ;}
    C(){(                                                     J=
    gets                                                      (K
    [1]))&&C((B(g=K[2]),*r=!(!*r&&(*g++=0)),(*r)[r]=g-K[2],g=K[2
    ],r[
    1]&&
    O())
    );;}
    main
    (){C
    ((l(
    (J=(
    A=0)
    [K],
    A[M]
    =(F=
    (k=(
    M[!A
    ]=(Q
    =T+(
    q=(Y
    =(W=
    32)-
    (N=4
    ))))
    +N)+
    2)+7
    )+7)
    ),Y=
    N<<(
    *r=!
    -A))
    );;}

    Наткнулся на такую задачку. Нужно разобраться, что делает эта программа.

    gammaker, 06 Октября 2015

    Комментарии (13)
  10. C++ / Говнокод #18375

    +142

    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
    #define ADD_TYPE(type, tname, plname) \
    	int Get ## tname ## LocByName(string name) const\
    	{\
    		assert(MyInterface!=null);\
    		auto index=MyInterface.data->get_id_by_name(name);\
    		assert(index==-1 || MyInterface.data->Structure.Declarations[index].Type==ValueType::tname);\
    		return index;\
    	}\
    	ShaderParameters& Set ## tname (int loc, type val)\
    	{\
    		return Set ## plname (loc, &val, 0, 1);\
    	}\
    	ShaderParameters& Set ## tname (string name, type val)\
    	{\
    		return Set ## tname (Get ## tname ## LocByName(name), val);\
    	}\
    	ShaderParameters& Set ## plname (int loc, const type* vals, ushort first, ushort count)\
    	{\
    		if(loc==-1) return *this;\
    		assert(MyInterface!=null);\
    		update_id=++MyInterface.data->num_updates;\
    		values.Set(loc, vals, first, count);\
    		return *this;\
    	}\
    	ShaderParameters& Set ## plname (string name, const type* vals, ushort first, ushort count)\
    	{\
    		return Set ## plname (Get ## tname ## LocByName(name), vals, first, count);\
    	}\
    	type Get ## tname (int loc, ushort i=0) const\
    	{\
    		if(loc==-1) return type();\
    		return values.Get<type>(loc, i);\
    	}\
    	type Get ## tname (string name, ushort i=0) const\
    	{\
    		return Get ## tname (Get ## tname ## LocByName(name), i);\
    	}
    
    	ADD_TYPE(float, Float, Floats);
    	ADD_TYPE(Math::vec2, Vec2, Vecs2);
    	ADD_TYPE(Math::vec3, Vec3, Vecs3);
    	ADD_TYPE(Math::vec4, Vec4, Vecs4);
    	ADD_TYPE(int, Int, Ints);
    	ADD_TYPE(Math::ivec2, IVec2, IVecs2);
    	ADD_TYPE(Math::ivec3, IVec3, IVecs3);
    	ADD_TYPE(Math::ivec4, IVec4, IVecs4);
    	ADD_TYPE(Math::mat3, Mat3, Mats3);
    	ADD_TYPE(Math::mat4, Mat4, Mats4);
    
    #undef ADD_TYPE

    Вот так в моём движке идёт работа с параметрами шейдеров. Макросы делал, чтобы избежать копипаста. Выглядит ужасно, отлаживать неудобно, но зато использовать удобно. Буду думать, как красиво перевести это на шаблоны, чтобы не потерять удобство использования.

    gammaker, 20 Июня 2015

    Комментарии (0)
  11. C++ / Говнокод #18361

    +142

    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
    void AttachToParser(Parser* pParser)
    {
    	parser=pParser;
    		
    	static const char* const typeNames[]={"ShaderInterface", "ShaderModule", "ShaderModuleType", "ShaderModulePattern", "ShaderTemplate"};
    	typedef void (ShaderGeneratorParser::* StructureProcessor)();
    	static StructureProcessor processors[]={&ShaderGeneratorParser::ProcessShaderInterface, &ShaderGeneratorParser::ProcessShaderModule,
    		&ShaderGeneratorParser::ProcessShaderModuleType, &ShaderGeneratorParser::ProcessShaderModulePattern, &ShaderGeneratorParser::ProcessShaderTemplate};
    
    	for(uint i=0; i<numof(processors); i++)
    	{
    		auto processor=processors[i];
    		ShaderGeneratorParser mycopy=*this;
    		parser->DeclarationBlockParsers.Append(typeNames[i], [mycopy, processor]() mutable {(mycopy.*processor)();});
    	}
    }

    Делаю парсер конфигов для своего игрового движка. Он готов наверное всего на 10% и представлял собой один класс, который уже разросся. Стало неудобно по нему передвигаться. Решил разбить парсер на модули. Это код того, как один из модулей цепляется к основному классу парсера.
    Этот модуль умеет парсить 5 разных блоков, объединённых общим назначением - сборка шейдеров из модулей. За каждый тип блоков отвечает своя функция. Об этом функция и сообщает основному классу.

    Цель такая, чтобы модуль работал даже после удаления самого экземпляра. Для этого пришлось пропихнуть копию экземпляра внутрь std::function. Более нормального способа, чем через лямбду с замканием, я не нашёл.

    gammaker, 18 Июня 2015

    Комментарии (0)