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

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
// 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 j123123, (Updated )

Комментарии (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!
    Ответить
  • В ходе обсуждения с 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

    Типа если честно и объективно заявить что эти ваши шаблоны с констэкспрами полное говно, и в жопу себе их засуньте, то тебя сразу крестоуебки карму заминусуют. Охлократия одним словом
    Ответить
  • #!/usr/bin/bf
    
    # Name      : Lost Kingdom v011
    # Author    : Jon Ripley
    # Purpose   : Enchanced Brainfuck Edition of the original BBC BASIC game 
    # Date      : Sun 12 Jun 2005 16:13:28
    # Copyright : (C) Jon Ripley 2004 2005
    # Email     : jon(at)jonripley(dot)com
    # Web Site  : http://jonripley(dot)com/
    
    [-][.]>+<+[>[>[-]+<-]>[<+>>[-]>>>>>>>[-]+>>>>[-]<<<<[>>>>+<<<<-]<<<<<<<[
    -]>>>>>>>[-]>>>>>[-]<<<<<[>>>>>+<<<<<-]<<<<<<<[-]>>>>>>>[-]>>>>>>[-]<<<<
    <<[>>>>>>+<<<<<<-]<<<<<<<<-]>>>>>>>>>>>>>>>[<<<<<<<<<<<<<<<<+>>>>>>>>>>>
    >>>>>-]<<<<<<<<<<<<<<<<[>[-]+<-]>[<+>>[-]>>>>>>>[-]>>>>>>>>[-]<<<<<<<<[>
    >>>>>>>+<<<<<<<<-]<<<<<<<[-]>>>>>>>[-]>>>>>>>>>[-]<<<<<<<<<[>>>>>>>>>+<<
    <<<<<<<-]<<<<<<<[-]>>>>>>>[-]>>>>>>>>>>[-]<<<<<<<<<<[>>>>>>>>>>+<<<<<<<<

    Дальше не влезло. Дописать игру Потерянное Королевство осталяю в качестве домашнего задания
    Ответить

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

Где здесь C++, guest?!

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


    8