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

    +20

    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
    91. 91
    92. 92
    93. 93
    94. 94
    95. 95
    96. 96
    class TCP1251ToUTF16StringConverter
    {
    public:
    	static WideChar convert(Char Source)
    	{
    		WideChar Result=static_cast<unsigned char>(Source);
    		const WideChar Russian_YO=static_cast<unsigned char>('Ё');
    		const WideChar Russian_yo=static_cast<unsigned char>('ё');
    		const WideChar RussianWide_YO=L'Ё';
    		const WideChar RussianWide_yo=L'ё';
    		const WideChar Russian_A=static_cast<unsigned char>('А');
    		const WideChar RussianWide_A=L'А';
    		const unsigned int AmountOfSymbols=0x40;
    		if(Result==Russian_YO)
    			return RussianWide_YO;
    		if(Result==Russian_yo)
    			return RussianWide_yo;
    		if(Result>=Russian_A&&Result<Russian_A+AmountOfSymbols)
    			return (Result-Russian_A+RussianWide_A);
    		return Result;
    	};
    	
    	static void convert(PwideChar UTF16StringDestination, PChar CP1251WinEngRusStringSource, const size_t TextLength)
    	{
    		assert(CP1251WinEngRusStringSource!=NULL);
    		size_t i=0;
    		for(;;)
    		{
    			if(i>=TextLength)
    				break;
    			assert(i<TextLength);
    			Char CP1251SourceChar=CP1251WinEngRusStringSource[i];
    			if(CP1251SourceChar=='\0')
    				break;
    			UTF16StringDestination[i]=convert(CP1251SourceChar);
    			++i;			
    		};
    		UTF16StringDestination[i]=L'\0';
    		assert(i<=TextLength);
    	};
    	
    	static std::wstring convert(const std::string& CP1251WinEngRusStringSource)
    	{
    		assert(CP1251WinEngRusStringSource.c_str()!=NULL);
    		std::wstring UTF16StringDestination;
    		std::transform(CP1251WinEngRusStringSource.begin(), CP1251WinEngRusStringSource.end(), std::inserter(UTF16StringDestination, UTF16StringDestination.end())/*std::back_inserter(UTF16StringDestination)*//*VC 6.0 compatible*/, makePointerToFunction(convertChar));
    		return UTF16StringDestination;
    	};
    	
    private:
    	static WideChar convertChar(char Source)
    	{
    		return convert(Source);
    	};
    };
    
    template<const size_t MaxAmountOfChar>
    class TCP1251ToUTF16StringInPlaceConverter
    {
    public:
    	TCP1251ToUTF16StringInPlaceConverter(PChar CP1251WinEngRusStringSource)
    	{
    		STATIC_ASSERT(MaxAmountOfChar>0, MaxAmountOfChar_must_be_above_zero);
    		TCP1251ToUTF16StringConverter::convert(&(_buffer[0]), CP1251WinEngRusStringSource, MaxAmountOfChar);
    	};
    	
    	TCP1251ToUTF16StringInPlaceConverter(PChar CP1251WinEngRusStringSource, const size_t TextLength)
    	{
    		STATIC_ASSERT(MaxAmountOfChar>0, MaxAmountOfChar_must_be_above_zero);
    		assert(TextLength<=MaxAmountOfChar);
    		TCP1251ToUTF16StringConverter::convert(&(_buffer[0]), CP1251WinEngRusStringSource, TextLength);
    	};
    	
    	void convert(PChar CP1251WinEngRusStringSource)
    	{
    		TCP1251ToUTF16StringConverter::convert(&(_buffer[0]), CP1251WinEngRusStringSource, MaxAmountOfChar);
    	};
    	
    	void convert(PChar CP1251WinEngRusStringSource, const size_t TextLength)
    	{
    		assert(TextLength<=MaxAmountOfChar);
    		TCP1251ToUTF16StringConverter::convert(&(_buffer[0]), CP1251WinEngRusStringSource, TextLength);
    	};
    	
    	PWideChar Get(void) const
    	{
    		return &(_buffer[0]);
    	};
    	
    	PwideChar Get(void)
    	{
    		return &(_buffer[0]);
    	};
    	
    	wideChar _buffer[MaxAmountOfChar+1];
    };

    Запостил: USB, 02 Августа 2012

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

    • - std::locale?
      - Не, не слышал.
      Ответить
    • Как посадить овцу в загон для лошади, сажаем овцу в загон и пишем что это лошадь, если это овца ангорская то заменяем на пони!
      Ответить
    • ох, простыночка ...
      Ответить
    • и да не будет упомянуто всуе, но
      };

      это на работе USB так говнокодят?
      Ответить
      • summon @TarasB
        Ответить
        • даже меня теперь начали терзать сомнения - это был тогда акт самосожжения или на уютненьком взаправду появилась модерация
          Ответить
          • Модераторы на ГК настолько суровы, что юзеры пишут себе предупреждения и банят сами себя...
            Ответить
            • Но Тараса-то и впрямь зобанели.
              Одно дело похамить модерам, или ещё что, но он, зараза, и матерится и виртуалов разводит.
              http://govnokod.ru/11490#comment148846
              http://govnokod.ru/11490#comment148854
              Ответить
              • Увидеть бы графики активности комментариев в зависимости от фаз лунного цикла завсегдатаев сего ресурса. То и впрямь, как то тихо стало...

                И вообще, нужен раздел статистика, с графиками и пони.
                Ответить
                • и снова новый аватар
                  Ответить
                  • Кручу-верчу...
                    Обновление Граватара работает с разными интервалами, а может ГК...
                    Ответить
                    • ЕМНИП ГК выдает только хэш юзерского мыла, так что он тут не причем. Скорее всего старая аватарка висит в кеше браузера, пока не истечет ее время жизни...

                      UPD:
                      Cache-Control: max-age=300
                      Date: Thu, 02 Aug 2012 10:07:18 GMT
                      Expires: Thu, 02 Aug 2012 10:11:04 GMT
                      Хмм... всего 5 минут...
                      Ответить
                      • Проверял и эту версию - «чистил браузером куку» и кэш.
                        Заходил, выходил, на граватаре всё удалил одну оставил...
                        только после ~15-18 минут изменилась.
                        А эта через ~2-3мин. Предполагаю: движок ГК так устроен.
                        Ответить
                        • Если я правильно понимаю логику работы граватара - движки сайтов тупо составляют адрес картинки из хеша юзерского мыла
                          (в вашем случае 933a80ef5fbe8da14b9bf9b392159345)
                          и адреса альтернативной картинки (которую вы видите на моем аватаре). Так что движок ГК, в теории, влиять на аватарку не должен.
                          Ответить
                      • Дак вот почему я не нахожу кеше порнухи
                        Ответить
                        • Это вы ещё на свой диск Тсэ не заглядывали...
                          Ответить
                        • Чтобы не находить кеше порнухи нужен приватный просмотр ;)
                          Ответить
              • >1488
                Ответить
        • Впервые за всю историю наблюдений оно не работает! Глобальное потепление?
          Ответить
          • да небось снова уехал к бабке на чердак отшельником
            писать свои нетленки и жрать пирожки
            а анальная псевдомодерация - лишь жалкое прикрытие, шитое белыми нитками
            Ответить
          • Очевидно, что @roman-kashitsyn обернул каст в тег code
            Ответить
    • >RussianWide_YO
      Russian wide, yo, bitch.
      голосом Пинкмана из BrBa
      Ответить
    • А вот и соус: http://www.gamedev.ru/code/forum/?id=157316&page=3#m37
      Ответить
      • о_О Я не от туда это брал, а из нашего проекта. О_о
        Неужели это кто-то скопипастил у кококого-то говнокодера? Как тесен мир.
        Ответить
        • Код то немного другой и действие происходит совсем обратное.
          Ответить
        • мир построен на плагиате, не удивляйтесь :)
          Ответить
          • Но какже? Плагиат говнокода? Это странно.
            Ответить
            • Мне знакомый сказал, что на самом деле основной плагиат идет как раз в сфере говнокода. Это правда?
              Ответить
              • надо у китайцев спросить, они больше всего плагиатят
                Ответить
                • А что у них спрашивать? Они настолько бездумно применяют могучую силу копипасты - что часто даже до конца не представляют что творят.
                  Ответить
        • > Неужели это кто-то скопипастил у кококого-то говнокодера? Как тесен мир.
          Круговорот говна в природе.
          Ответить
      • Согласно моему представлению - каждый Unicode символ соответствует какому-то Ansi символу в какой-то Ansi-кодировке.

        utf8 может занимать от одного до 3х байт.

        // hash-таблица для преобразования WideChar в ansi
        map_utf16_to_ansi: record
          item_nexts: array[0..127] of byte;
        hash_array: array[0..127] of byte;
        end;


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


        Геймдев такой геймдев...
        Ответить
        • >// hash-таблица для преобразования WideChar в ansi
          Зачем? Это же медленнее и много затратнее по памяти гомнокода из нулевого поста.
          Ответить
          • Этож геймдев ;)
            // hash функция
            buffer := ord(map_ansi_to_wide[i]) and 127;


            А если все символы расположены в первой плоскости - то самым скоростным решением будет тупой массив на 65536 чаров...
            Ответить
    • А как правильно в С++ переводить текст из ШирокихЧаров в Чары и обратно? Особенно интересует в стандарте до С++11.
      Ответить
      • если просто wchar_t <-> char, то стандартный codecvt (см методы in, out в нем) либо ctype (widen/narrow)
        если конкретный UCS, и чтобы кроссплатформенно при этом - то пишешь сам или коммуниздишь чужой оттестированный codecvt
        в boost не так давно заапрувили boost::locale (в 1.49, вроде), там в коробке всё есть
        Ответить

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