Кресты / Говнокод #27483 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 mittorn, (Updated )

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

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

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

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

            По-моему даже стабильный дебиан уже на восьмёрке.
            Ответить
            • Ну, к примеру, для android последняя версия gcc - 4.9. И тут скорее реальных причин поднимать версию нет т.к STL почти не используется и constexpr по минимому, а ради убирания подчёркивания это делать...
              Ответить
              • Во-первых, можно попробовать собрать новый 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 гигов.
                          А рабочего конфига на кернел не дали.
                          Оказывается если включить все опции в конфиге ядра, то нихуя не будет работать. Какое тестирование )))
                          Ответить
                          • Если пердолинг с прыщами называют «ёблей», то это заучит как оргия в борделе )))
                            Ответить
                          • >Оказывается если включить все опции в конфиге ядра, то нихуя не будет работать.

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

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

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

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

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

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

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

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

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

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

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

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

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

Я, guest, находясь в здравом уме и твердой памяти, торжественно заявляю:

    А не использовать ли нам bbcode?


    8