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

    +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
    // https://habr.com/post/428846/
    // Работа со строками на этапе компиляции в современном C++
    
    // Определим статическую строку как массив символов, для удобства будем считать, что строка всегда оканчивается нулевым символом:
    
    template<size_t Size>
    using static_string = std::array<const char, Size>;
    
    constexpr static_string<6> hello = {'H', 'e', 'l', 'l', 'o', '\0'};
    
    constexpr auto hello = make_static_string("hello");
    
    // Здесь нам поможет одна из форм вариативного шаблона, которая позволяет развернуть
    // шаблонные аргументы как индексы для агрегатной инициализации нашей статической
    // строки из строкового литерала:
    
    template<size_t Size, size_t ... Indexes>
    constexpr static_string<sizeof ... (Indexes) + 1> make_static_string(const char (& str)[Size]) {
        return {str[Indexes] ..., '\0'};
    }
    
    constexpr auto hello = make_static_string<0, 1, 2, 3, 4>("hello"); // hello == "hello"
    
    // ...
    
    //Будем сравнивать строки посимвольно, пока не выявим различия, либо не достигнем конца хотя бы одной из строк.
    // Поскольку constexpr for еще не изобрели, воспользуемся рекурсией и тернарным оператором:
    
    template<size_t Size1, size_t Size2>
    constexpr int static_string_compare(
        const static_string<Size1>& str1, 
        const static_string<Size2>& str2,
        int index = 0) {
            return index >= Size1 && index >= Size2 ? 0 :
                index >= Size1 ? -1 :
                    index >= Size2 ? 1 :
                        str1[index] > str2[index] ? 1 :
                            str1[index] < str2[index] ? -1 :
                                static_string_compare(str1, str2, index + 1);
    }

    Ммм, какой БАГОР
    Крестобляди опять накостылили какой-то параши на шаблонах и радуются

    Запостил: j123123, 20 Ноября 2018

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

    • https://wandbox.org/permlink/ko3lmhFE668ZLbdk
      #include <stdio.h>
      #include <stddef.h>
      
      int my_fucking_memcpy(size_t sz1, size_t sz2, char *ptr1, char *ptr2);
      int my_fucking_memcpy_2(size_t sz, char *ptr1, char *ptr2);
      
      
      int my_fucking_memcpy(size_t sz1, size_t sz2, char *ptr1, char *ptr2)
      {
        if (sz1 != sz2)
        {
          return -1;
        }
        return my_fucking_memcpy_2(sz1, ptr1, ptr2);
      }
      
      int my_fucking_memcpy_2(size_t sz, char *ptr1, char *ptr2)
      {
        return (sz == 0) ? 0 : ((*ptr1 == *ptr2) ? my_fucking_memcpy_2(sz-1, ptr1+1, ptr2+1) : -1);
      }
      
      int main(void)
      {
        printf("%d\n", my_fucking_memcpy(sizeof("asdf"), sizeof("asdf"), "asdf", "asdf"));
        printf("%d\n", my_fucking_memcpy(sizeof("asdfg"), sizeof("asdfh"), "asdfg", "asdfh"));
        printf("%d\n", my_fucking_memcpy(sizeof("asd"), sizeof("asdf"), "asd", "asdf"));
        return 0;
      }


      такая-то рекурсия, so functional!
      Ответить
      • (memcmp точнее)
        Ответить
        • void memcpy_recursion(char *dst, char *src, size_t sz)
          {
            *dst = *src;
            if (sz != 0) memcpy_recursion(dst+1, src+1, sz-1);
          }
          Ответить
    • В ходе обсуждения с AndreySu появился еще один способ реализации статических строк, где символы передаются как шаблонные параметры:

      #include <iostream>
      
      using namespace std;
      
      template<typename Char, Char ... Chars> struct static_string{};
      
      template<typename Char, Char ... Chars1, Char ... Chars2>
      constexpr static_string<Char, Chars1 ..., Chars2 ... > operator+(
          const static_string<Char, Chars1 ... >& str1,
          const static_string<Char, Chars2 ... >& str2) {
          return static_string<Char, Chars1 ..., Chars2 ...>{};
      }
      
      template<typename Char, Char ch, Char ... Chars>
      std::basic_ostream<Char>& operator<<(std::basic_ostream<Char>& bos, const static_string<Char, ch, Chars ...>& str) {
          bos << ch << static_string<Char, Chars ... >{};
          return bos;
      }
      
      template<typename Char>
      std::basic_ostream<Char>& operator<<(std::basic_ostream<Char>& os, const static_string<Char>& str) {
          return os;
      }
      
      template<typename Char, Char ... Chars>
      constexpr static_string<Char, Chars ... > operator"" _ss() {
          return static_string<Char, Chars ... >{};
      };
      
      int main() {
          constexpr auto str1 = "abc"_ss;
          constexpr auto str2 = "def"_ss;
          constexpr auto str = str1 + str2 + str1;
          std::cout << str << std::endl;
      
          return 0;
      }


      Детальное рассмотрение этого варианта выходит за рамки статьи, буду рад, если кто-то из читателей говнокода займется доведением его до ума.
      Ответить
    • Ждём конпайлтайм конпелятор крестов.
      Ответить
      • и в этом компиляторе компилятор в компилтайме скомпилирует сам себя - раскрутка компилятора!
        Ответить
        • Можно сделать компайлтайм интерпретатор какого-нибудь несложного проца и гонять на нём компайлтайм ось...
          Ответить
          • > Можно сделать компайлтайм интерпретатор какого-нибудь несложного проца

            Проще всего сделать для брейнфака, под него уже есть компилятор сишечки какой-то https://esolangs.org/wiki/C2BF - можно этот компилятор в компилтайм-крестопишушню переписать (компилтайм-интерпретатор брейнфака на крестопарашных темплейтах и констэкспрах вообще легко пишется)
            Ответить
        • > раскрутка

          Царский анролл
          Ответить
    • Кстати, на примере той статьи на хабре как раз таки хорошо видно, почему я считаю кармадрочерскую хабраблядскую систему полным говном.

      Достаточно посмотреть на комменты с отрицательным рейтингом:
      https://habr.com/post/428846/#comment_19327348
      https://habr.com/post/428846/#comment_19327790

      Типа если честно и объективно заявить что эти ваши шаблоны с констэкспрами полное говно, и в жопу себе их засуньте, то тебя сразу крестоуебки карму заминусуют. Охлократия одним словом
      Ответить
    • показать все, что скрытоvanished
      Ответить
    • показать все, что скрытоПейте без остановки
      Напитки из черной головки
      Ответить

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