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

    +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
    83. 83
    84. 84
    85. 85
    86. 86
    87. 87
    88. 88
    89. 89
    90. 90
    template<typename T, typename E=emp> class _interlock;
    		template<typename T> class _interlock
    			<T,
    			typename std::enable_if<
    				std::is_same<
    					typename std::conditional<
    						std::is_same<udi,typename std::make_unsigned<T>::type>::value,
    						udi,
    						uqi
    					>::type,
    					typename std::make_unsigned<T>::type
    				>::value
    			>::type
    			>
    		{
    		public:
    
    			_interlock
    				<T,
    				typename std::enable_if<
    				std::is_same<
    				typename std::conditional<
    				std::is_same<udi,typename std::make_unsigned<T>::type>::value,
    				udi,
    				uqi
    				>::type,
    				typename std::make_unsigned<T>::type
    				>::value
    				>::type
    				>
    				(T x=0)
    			{
    				number=x;
    			}
    
    			//Возвращается прежнее значение
    			T operator + (T x)
    			{
    				return (T)InterlockedExchangeAdd((_unsign_t*)&number,(_sign_t)x);
    			}
    
    			//Возвращается прежнее значение
    			T operator - (T x)
    			{
    				return (T)InterlockedExchangeAdd((_unsign_t*)&number,-(_sign_t)x);
    			}
    
    			//Чтение
    			T operator () ()
    			{
    				return number;
    			}
    
    			//Замена на x
    			T operator () (T x)
    			{
    				return (T)InterlockedExchange((_unsign_t*)&number,(_unsign_t)x);
    			}
    
    			//Сравнение с y, замена на x, если равны
    			T operator () (T x, T y)
    			{
    				return (T)InterlockedCompareExchange((_unsign_t*)&number,(_unsign_t)x,(_unsign_t)y);
    			}
    			
    			T operator ++ ()
    			{
    				return (T)InterlockedExchangeAdd((_unsign_t*)&number,1)+1;
    			}
    
    			T operator -- ()
    			{
    				return (T)InterlockedExchangeAdd((_unsign_t*)&number,-1)-1;
    			}
    
    			T operator ++ (int)
    			{
    				return (T)InterlockedExchangeAdd((_unsign_t*)&number,1);
    			}
    
    			T operator -- (int)
    			{
    				return (T)InterlockedExchangeAdd((_unsign_t*)&number,-1);
    			}
    
    		private:
    			typedef typename std::make_unsigned<T>::type _unsign_t;
    			typedef typename std::make_signed<T>::type _sign_t;
    			volatile T number;
    		};

    Функция "ИЛИ" для типов через type_traits для шаблона. А также атомарный: сумматор, счётчик, компаратор с возможностью условной и безусловной замены значения в одном лице. Для типов: udi (unsigned int), sdi (signed int), uqi (unsigned long long), sqi (signed long long). Тип emp = void (от слова empty).

    Запостил: Tirannozavr, 13 Марта 2015

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

    • Этот говнокод опубликован в пятницу 13 марта под номером 17777 ::lol::
      Ответить
    • Пришло время использовать атомики из c++11...
      Ответить
      • P.S. Причем код явно с++11, а атомики - виндоблядские. В чем причина?
        Ответить
        • Там есть аналог InterlockedCompareExchange? Всё, уже нашёл.
          Ответить
          • > Там есть аналог InterlockedCompareExchange?
            Конечно есть: http://ru.cppreference.com/w/cpp/atomic/atomic/compare_exchange

            > Всё, уже нашёл.
            Ну ок.
            Ответить
        • История об этом умалчивает... Interlocked использовал раньше, а стандарт C++11 изучаю недавно...
          Ответить
        • В VS2012 атомики есть, но реализованы через жопу. Просто затычка.
          Ответить
          • А какие вообще есть преимущества у вижуалки при разработке на c++?
            Ответить
            • можно писать код под дотнет
              говорят интеллисенс хороший в 2013+
              но я хз, ибо на плюсах не пишу и в 2012 студии сижу
              Ответить
            • > А какие вообще есть преимущества у вижуалки при разработке на c++?
              Интеллисенс, ближайший аналог которому я видел только в последних QtCreator с использованием плагина автокомплита clang.
              Зависимости проектов друг от друга внутри решения. Поправил код в одной библиотеке, скомпилировал - зависимые от библиотеки проекты перелинковались. У qmake, например, есть аналогичный механизм, но он сложнее, неудобнее, нужно руками править файл проекта, ко-ко-ко, ко-ко-ко. Тьфу.
              Ну и хоткеи учить заново ой как впадлу :)
              Ответить
              • рекомендуешь?

                Я когда был совсем дурной и маленький сидел в VS и думал что все иде примерно такие.
                А потом я увидел эклипс. А потом я увидел нетбинс и первой моей мыслью было - а почему бы не писать в notepad++ и не компилить руками...

                В общем я к тому - а вообще кроме VS есть норм ide на кресты? Я знаю еще IntelliJ IDEA и прочия от джетбрейнс но там плюсов нет вроде как. Ну и когда то давно Борланд был, но мне кажется он безнадежно устарел.
                Ответить
                • > рекомендуешь?
                  Почему бы и нет? :) Я на вижуальник с борланда перешел и довольно долго ругался - неудобно, сложно, ко-ко-кооо... Потом переучивался на QtCreator и тоже долго ругался. Потом, пересаживаясь обратно на vs, машинально тыкаю хоткеи из креатора и недоумеваю, какого пениса они не работают. Прямо как в том анекдоте[1].

                  > вообще кроме VS есть норм ide на кресты
                  Холиварные вопросы лучше выделять зеленым.
                  "Лучший" ответ из схожего вопроса про C++ IDE под linux[1] говорит мне, что я должен использовать make и gdb, но я вообще нихера не хочу работать без автодополнения и follow symbol under cursor.
                  По личным ощущениям, наиболее вменяемые - Visual Studio 2010+ и QtCreator 3.x, эклипс ни я, ни коллеги не перевариваем, но вынуждены иногда сталкиваться в виде специализированных форков, а остальные - какие-то "не такие". Ну, может, clion - годный продукт, но, опять же, лень изучать.


                  [1] http://www.anekdot.ru/id/-10083623/
                  [2] http://stackoverflow.com/questions/24109/c-ide-for-linux
                  Ответить
                  • > не хочу работать без автодополнения

                    везьде отключаю, ибо напрягает.

                    даже на виндах, vim + ctags + какой там тул-чейн мне удобней чем все IDE которые пробовал.

                    IDE имеют привычку "помогать" делая предположения - слишком часто неправильные - что я пытаюсь делать.

                    а когда доходит до каких больших рутинных задач по редактированию и рефакторингу, то vim (если его знаешь) просто ни один виндовый редактор не способен обогнать по производительности.

                    а если сидишь на линухе в консоле, то там все еще веселее, потому что из вима в шелл и назад делается без лишних телодвижений.

                    но самое смешное что vim порекомендовать не могу потому что даже после 10+ лет, интерфейс vi меня напрягает. ничем другим по причинам производительности пользоватся уже не могу, но и порекомендовать тоже не могу. да и учить его надо как минимум пару недель (включая внутренний скриптовый язык). и в конце, когда нужно отлаживать, все равно надо что-то другое, потому что вим это только редактор.
                    Ответить
                • >Я знаю еще IntelliJ IDEA и прочия от джетбрейнс
                  Есть clion, но как бэ альфа
                  Ответить
                • > В общем я к тому - а вообще кроме VS есть норм ide на кресты?

                  народу в текущем проекте делаю окружение для разработки тестов. сегодня попробовал Code::Blocks (как основу для окружения) и просто наповал убила прямолинейность тулзы.

                  после страданий с Eclipse/CDT это было просто глотком свежего воздуха: проект за ~15минут создал (от пустого проекта до компиляции и отладки), проект лежит в одном простом хмл файле, и имена файлов отностительные - чекинь не хочу, и с бранчингом совместимо.

                  но до продвинутых функций, включая тест редактора, сегодня руки не дошли.
                  Ответить
                • > и первой моей мыслью было - а почему бы не писать в notepad++ и не компилить руками...
                  Значит скоро ты попробуешь vim или любимую среду wvxvw.
                  Ответить
              • >Зависимости проектов друг от друга внутри решения.
                меня вообще эти проекты в визуалке бесили. Особенно, когда юзаешь здоровые либы вроде буста, который не запихаешь в репозиторий. Когда перелез на cmake, вздохнул с облегчением.
                Ответить
              • > Зависимости проектов друг от друга внутри решения.
                А между решениями?
                Ответить
                • Решение - это вроде корневой объект мс иерархии. Проекты комбинируются в решения, решения не комбинируются. Реквестую икспертов.
                  Ответить
                • > А между решениями?
                  Можно в одно решение добавить проект из другого решения.
                  Ещё есть makefile project, в котором можно дергать внешнюю утилиту, так и не осилил.
                  Ответить

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