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

    +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
    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
    #include <unistd.h>
    #include <stdio.h>
    #include <limits.h>
    
    template<size_t Size> struct static_string {char data[Size];};
    template<size_t ... Indexes>struct index_sequence {};
    template<size_t Size, size_t ... Indexes>
    constexpr static_string<sizeof ... (Indexes) + 1> make_static_string(const static_string<Size>& str,index_sequence<Indexes ...>) {return {str.data[Indexes] ..., '\0'};}
    constexpr static_string<1> make_static_string() {return {'\0'};}
    template<size_t Size, size_t ... Indexes>
    struct make_index_sequence : make_index_sequence<Size - 1, Size - 1, Indexes ...> {};
    template<size_t Size>
    constexpr static_string<Size> make_static_string(const char (& str)[Size]) {return make_static_string(str, make_index_sequence<Size - 1>{});}
    template<size_t ... Indexes>
    struct make_index_sequence<0, Indexes ...> : index_sequence<Indexes ...> {};
    template<size_t Size, size_t ... Indexes>
    constexpr static_string<sizeof ... (Indexes) + 1> make_static_string(const char (& str)[Size],index_sequence<Indexes ...>) {return {str[Indexes] ..., '\0'};}
    template<size_t Size>
    constexpr size_t static_string_find(const static_string<Size>& str, char ch, size_t from, size_t nth) {return Size < 2 || from >= Size - 1 ? UINT_MAX :str.data[from] != ch ? static_string_find(str, ch, from + 1, nth) :nth > 0 ? static_string_find(str, ch, from + 1, nth - 1) : from;}
    template<size_t Size>
    constexpr size_t static_string_find_0(const static_string<Size>& str, char ch, size_t from, size_t nth) {return Size < 2 || from >= Size - 1 ? 0 : str.data[from] != ch ? static_string_find_0(str, ch, from + 1, nth) :nth > 0 ? static_string_find(str, ch, from + 1, nth - 1) : from;}
    template<size_t Size1, size_t ... Indexes1, size_t Size2, size_t ... Indexes2>
    constexpr static_string<Size1 + Size2 - 1> static_string_concat_2(const static_string<Size1>& str1, index_sequence<Indexes1 ...>,const static_string<Size2>& str2, index_sequence<Indexes2 ...>) {return {str1.data[Indexes1] ..., str2.data[Indexes2] ..., '\0'};}
    template<size_t Size1, size_t Size2>
    constexpr static_string<Size1 + Size2 - 1> static_string_concat_2(const static_string<Size1>& str1, const static_string<Size2>& str2) {return static_string_concat_2(str1, make_index_sequence<Size1 - 1>{},str2, make_index_sequence<Size2 - 1>{});}
    template<size_t Begin, size_t End, size_t ... Indexes>
    struct make_index_subsequence : make_index_subsequence<Begin, End - 1, End - 1, Indexes ...> {};
    template<size_t Pos, size_t ... Indexes>
    struct make_index_subsequence<Pos, Pos, Indexes ...> : index_sequence<Indexes ...> {};
    template<size_t Begin, size_t End, size_t Size>
    constexpr static_string<End - Begin + 1> static_string_substring(const static_string<Size>& str) {return make_static_string(str, make_index_subsequence<Begin, End>{});}
    template<size_t Begin, size_t Size>
    constexpr static_string<Size - Begin> static_string_suffix(const static_string<Size>& str) {return static_string_substring<Begin, Size - 1>(str);}
    #define remove_underscore(arg) ([] () __attribute__((always_inline)) {constexpr auto a = static_string_find(make_static_string(arg),'_',0,0) == UINT_MAX? make_static_string(arg):static_string_concat_2(static_string_concat_2(static_string_substring<0,static_string_find_0(make_static_string(arg),'_',0,0)>(make_static_string(arg)),static_string_suffix<static_string_find_0(make_static_string(arg),'_',0,0)+1>(make_static_string(arg))),make_static_string("\0"));return a;}().data)
    
    int main()
    {
        puts(remove_underscore("_testtest"));
        puts(remove_underscore("test_test"));
        puts(remove_underscore("testtest_"));
    }

    Убогий constexpr в c++11

    Запостил: mittorn, 25 Июня 2021

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

    • Да, я понимаю что оптимизируюший компилятор и без constexpr всё оптимизирует, но я собираю с -O0 т.к кора дуба с трудом и это осиливает
      Ответить
    • Какая функционяльщина )))

      А с++17 нельзя пока юзать?
      Ответить
      • Не хочу поднимать требуемый стандарт, так бы конечно получилось намного короче.
        Ответить
        • > Не хочу поднимать требуемый стандарт

          Вай нот, если поддержка старых конпеляторов не нужна?
          Ответить
          • а вдруг захочу собрать под что-то где тулчейн 4.7 например?
            Если для C прокатывает всунуть новый компилятор в тот же рантайм, но на C++ начнутся свистопляски с несовместимостями STL
            Ответить
            • А вы тогда пишите в C++98, вдруг захочется собрать в Borland C++ 3.1?
              А там constexpr нету
              Ответить
              • Где там C++?
                Ответить
                • Где С++ в слове template и в передаче по ссылке "&"?
                  Ответить
                  • С++98 там явно не было. Даже у билдера была какая-то херь вместо стандартной либы, что уж говорить про досовскую 3.1.
                    Ответить
                    • А, вот вы о чём:)
                      Это просто самый древний из документированных стандратов ЕМНИП, до этого все просто по книжке херачили.
                      Ответить
            • А есть реальные причины, по которым ты захочешь выкопать древний тулчейн?

              По-моему даже стабильный дебиан уже на восьмёрке.
              Ответить
              • Ну, к примеру, для android последняя версия gcc - 4.9. И тут скорее реальных причин поднимать версию нет т.к STL почти не используется и constexpr по минимому, а ради убирания подчёркивания это делать...
                Ответить
                • > для android последняя версия gcc - 4.9.

                  Какой багор )))
                  Ответить
                • Во-первых, можно попробовать собрать новый GCC через crosstools-ng, но там возиться надо

                  https://github.com/crosstool-ng/crosstool-ng/issues/1476 - там максимальный NDK это r17- можно попробовать более новый NDK прикрутить, но это надо AOSP сношаться видимо.

                  Да и нафиг вообще GCC если там есть Clang-LLVM?
                  Ответить
                  • Кстати, система сборки AOSP (Soong build system) - лютое ебаное говнище. Да и сам андроид тоже сраное говно с т.з. архитектуры. Жабы какие-то блядь, ебучие проприетарные блобы на дохуя хуйни, пермишены-хуишены какие-то, совсем уже охуели. У меня в контроллерах такой хуйни нет

                    (хотя еще есть огрызковые устройства, это вообще дно дна)
                    Ответить
                    • В андроиде нет жабы, там есть ART, в который компилируются опкоды JVM

                      Зачем они взяли говноязык с GC я не знаю, вероятно хотели сэкономить
                      Лучше бы они сделали как Apple
                      Ответить
                      • Я знаю что там какая-то не совсем правильная жаба(точнее, Java как язык там есть, но там какой-то свой рантайм и свои опкоды для какой-то регистровой VM с JIT, и это уже не VM а AOT, блядь, ебаный цирк), но мне лень каждый раз писать дисклеймер как в https://govnokod.ru/27481#comment638398
                        Ответить
                        • "Джава как язык" очень луквая конструкция

                          Я вот взял GWT, компильнул его в JS, и хуяк -- у меня "джава как язык" нарисовалась в IOS
                          Ответить
                          • > Google Web Toolkit (GWT, ˈɡwɪt) — свободный Java-фреймворк, который позволяет веб-разработчикам создавать Ajax-приложения. Его особенность — компилятор Java -> JavaScript, позволяющий почти всю разработку клиента и сервера реализовать на основе Java и лишь на последнем этапе создать соответствующие JavaScript, HTML и CSS.

                            Блядь, какое же говно. А есть еще https://github.com/sstur/js2php какой-то компилятор JavaScript -> PHP. Так можно по цепочке Java->JavaScript->PHP перевести какую-то жабаподелку на PHP, разве не охуительно?
                            Ответить
                            • Да это старое говно уже десять лет как ненужное, но оно всё еще есть
                              Ответить
                            • ну ты бы еще PhoneGap привёл бы как рагумент...
                              типа HTA легко портятся на iPony
                              Ответить
                            • Автоматический переводчик на «PHP». «Конярдо» будет доволен.

                              Добавляем в начало цепочки «JRuby», «Jython», «Haxe» и открываем портал в ад.

                              Был ещё проект по трансляции кода с языков, поддерживаемых фронтендами «gcc» («C», «C++», «Obj-C», «Fortran», «Ada» etc) в «JVM» через промежуточный код для процессоров «MIPS»:
                              http://nestedvm.ibex.org/

                              Правда, он перестал обновляться и поддерживает только «gcc 3.x».
                              Ответить
                      • > Зачем они взяли говноязык с GC я не знаю, вероятно хотели сэкономить

                        Думаю что они взяли конкретно Java (как язык) чтоб на ведроид легко можно было перекатить всяких джаваменов, клепавших всякую хуйню на J2ME под кнопочные телефоны.
                        Ответить
                        • Саунс ризанабл

                          Ну вот у Жобса хватило ииц не переманивать J2E питухов, а взять свой язык с OS X. Но правда у него эти самые программисты под OS X уже были (равно как и сама операционка), так что ему было проще
                          Ответить
                        • this

                          хотя я бы поспорил насчет востребованности всякого JME барахла
                          Ответить
                    • Кстати, кому-нибудь удалось скачать исходники ОС «Андроид»?

                      Они раскиданы по нескольким гитам, самостоятельно не разберёшься, что качать. «Гугл» рекомендует скачать их программу «repo», которая сама скачает нужную ветку из каждого репозитория и положит в нужную директорию.

                      Скачал я эту «repo». Завелась не сразу, а после пердолинга. Потребовалось сконфигурировать под неё «git», «python» и ещё кучу софта.

                      Качал три дня, скачалось сорок гигабайт. Исходников всё ещё не видно, только всякая питушня вроде objects из поддиректории «.git». Прервал процесс.

                      Есть какой-нибудь лёгкий способ их скачать?
                      Ответить
                      • > лёгкий способ

                        Х.з., может кто-то на торренты выложил архив с этими исходниками?
                        Ответить
                        • Мне пока не везёт.

                          Я надеялся добыть исходники какой-нибудь кастомной прошивки. Но кастомизаторы обычно выкладывают патчи, а основу (которую нужно патчить) предлагают качать через «repo».

                          Изучал «полезные советы» по этой «repo». Есть какие-то ключики, чтобы она меньше ненужного качала. Как-то не очень помогло.

                          Почувствовал себя полнейшим нубом.
                          Ответить
                          • > Качал три дня, скачалось сорок гигабайт.

                            Какой багор.

                            Мы на неделе (ре)билдили ембеддед прыщ на деб-9 под арм64, нам выдали тар на 18 гигов.
                            А рабочего конфига на кернел не дали.
                            Оказывается если включить все опции в конфиге ядра, то нихуя не будет работать. Какое тестирование )))
                            Ответить
                            • Если пердолинг с прыщами называют «ёблей», то это заучит как оргия в борделе )))
                              Ответить
                              • Ну ебался с этим один. Не сказать, что он выиграл, но ведь главное участие, а не победа
                                Ответить
                              • Rule 41: Everything is someone's sexual fetish.
                                Ответить
                            • >Оказывается если включить все опции в конфиге ядра, то нихуя не будет работать.

                              некоторые опции поди и не включить, если включены другие, бо они взаимоисключающие?

                              Можно подпирдолица и вручную собрать ядро выбрав нужные опции. Обычно это занимает дня три
                              Ответить
                              • Можно применить генетический алгоритм для подбора какие опции включить. Выживут лучшие прыщи.
                                Ответить
                                • Собрать компьютерный вирус на основе этого ядра, который будет мутировать и по сети заражать другие компьютеры. А чтобы узнать, какая вореция ядра выжила, собирать телеметрию.
                                  Ответить
                              • > и вручную собрать ядро выбрав нужные опции
                                я так и написал
                                только оно не работает - дохнет спустя рандомное время с каким-то рандомным багом

                                так что на это надо с месяц закладывать, или к вендору идти "дай свой рабочий конфиг, чтобы мы от него отстроились хотя бы, а не брутфорсом блять"
                                Ответить
                                • >спустя рандомное время с каким-то рандомным багом

                                  какой багор ))

                                  Это наверное специфика ембедед хуиты на arm.
                                  Читать кернелпаники и разбираться то еще удовольствие
                                  Ответить
                                  • В эмбедед хуите может быть сторожевая собака. Если не пинать её через какие-то промежутки времени, хуита перезагружается.
                                    Ответить
                                    • в прыще есть софтварный вотчдог в ядре, кстати)

                                      но он же не хардварно перегрружался, а кернелпаниковал, как я понял

                                      то есть нужно брать gdb и смотреть крешдамп, если по стеку не понятно, какой питух упал

                                      а если упало внутри какого-то драйвера, специфичного для конкретной железки, а этот драйвер писал не ты, то и пиздец
                                      Ответить
                                      • вот это.

                                        причем, там ничего из 18 гб писали мы
                                        только брутфорсить "ага, блядь, если заенаблить вайфай, то пиздец"

                                        это планшетная платформа с тачскрином, рокчип 3399 и 4 гб рам
                                        для которой стало неохота пилить особенный способ дистрибуции, а захотелось, как обычно, docker up -d

                                        но вот незадача, китайское ядро скомпилено без включенного нетфильтр - иптаблес не раб., и при этом слишком старое, чтобы работал подман

                                        хорошо, что это не бизнес-критикал сейчас, чисто на провести эксперимент
                                        Ответить
                                        • Какой Сёма )))
                                          Ответить
                                        • а если у вас есть робочее ядро, то можно же выдрать ``/proc/config.gz``, или его туда тоже не вкомпилили?
                                          Ответить
                                          • не вкомпилили)
                                            Оч удобно )))
                                            Ответить
                                            • Круто. Это как электроника со спиленными обозначениями радиодеталей, починить которую сможет только производитель.
                                              Ответить
                                • Какой багор )))
                                  Ответить
    • Похоже на шахматы... Дебюты, этюды...
      Ответить

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