Анимация
JavaScript


Главная  Библионтека 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 [ 226 ] 227 228 229 230 231 232 233 234 235 236 237 238 239

Таблица 14.21. Возвращаемые значения функций преобразования

Выражение Описание

ок Все исходные символы были успешно преобразованы

partial Не все символы были успешно преобразованы, или для получения

преобразованного символа нужны дополнительные символы

error Обнаружен исходный символ, который невозможно преобразовать

noconv Преобразование не требуется

Возвращаемое значение ок означает, что функция успешно справилась со своей работой. Если /п==/е, это означает, что входной буфер был обработан полностью, а последовательность в интервале между tb vitn содержит результат преобразования. Символы этой последовательности соответствуют символам входной последовательности (возможно - с добавлением законченного символа от предыдущего преобразования). Если аргумент s функции in() не находился в исходном состоянии, возможно, в нем хранился незавершенный символ от предыдущего преобразования.

Если функция возврашдет значение partial, это может означать одно из двух: либо выходной буфер был заполнен до завершения чтения входного буфера, либо входной буфер был прочитан полностью при наличии незавершенных символов (например, если последний байт входной последовательности был частью служебной последовательности для переключения состояний сдвига). Если /е==/п, входной буфер был прочитан полностью, В этом случае последовательность между tb и tn содержит все полностью преобразованные символы. Информация, необходимая для завершения преобразования символа, сохраняется в состоянии сдвига s. Если/е1=/п, входной буфер был прочитан не полностью. В этом случае следующее преобразование будет продолжено с позиции fn.

Возврандаемое значение noconv является признаком особой ситуации: оно означает, что преобразования внешнего представления во внутреннее не потребовалось. В этом случае fn присваивается /6, а tn присваивается tb. В приемной последовательности не сохраняется ничего, поскольку вся необходимая информация уже хранится во входной последовательности.

Если функция возвращает код error, это означает, что исходный символ преобразовать не удалось. Это может произойти по нескольким причинам: например, в приемной кодировке отсутанует представление для соответствующего символа или обработка входной последовательности завершилась в недопустимом состоянии сдвига. Стандарт С++ не определяет механизм, который позволил бы точнее определить причину ошибки.

Функция out() эквивалентна in(), но она работает в обратном направлении, то есть преобразует внутреннее представление во внешнее. Аргументы и возвращаемые значения двух функций совпадают, различаются только типы аргументов: tb и te относятся к типу const internT*, а fb w fe - y. типу const externT*. To же можно сказать и об аргументах/п и tn.



Функция unshift() вставляет символы, необходимые для завершения последовательности, когда в аргументе s передается текущее состояние преобразования. Обычно это означает, что состояние сдвига возвращается к исходному. Завершается только внешнее представление. Аргументы tb и tf относятся к типу externT*, а аргумент г/г - к типу extemT&*. Интервал между tb н te определяет выходной буфер, в котором сохраняются символы. Конец выходной последовательности хранится в tn. Значения, возвращаемые функций unshift(), перечислены в табл. 14.22.

Таблица 14.22. Возвращаемые значения функций преобразования Выражение Описание

ок Последовательность завершена успешно

partial Для завершения последовательности нужны дополнительные символы

епгог Недействительное состояние

noconv Для завершения последовательности символы не требуются

Функция encodingO возвращает дополнительную информацию о кодировке внешнего представления. Если encoding() возвращает -1, преобразование зависит от состояния. Если encodingO возвращает О, то количество объектов externT, необходимых для построения символа во внутренней кодировке, является переменной величиной. В противном случае функция возвращает количество объектов externT, необходимых для построения internT. Эта информация может использоваться для выделения буфера соответствующего размера.

Функция always noconv() возвращает true, если функции inO и out() никогда не выполняют преобразования. Например, стандартная реализация codecvt<char, char,mbstate t> преобразований не выполняет, поэтому для этого фацета функция always noconv() всегда возвращает true. Тем не менее это относится только к фацету codecvt локального контекста "С", другие экземпляры этого фацета могзп" выполнять преобразования.

Функция lengthO возвращает количество объектов externT в интервале между fb и fe, необходимых для построения max символов типа InternT. Если интервал между fb и fe содержит менее max полных символов типа internT, возвращается количество объектов externT, необходимых для построения максимально возможного количества символов типа InternT,

Контекстная сортировка

Фацет collate скрывает различия между правилами сортировки строк в разных локальных контекстах. Например, в немецком языке буква «й» при сортировке строк эквивалентна букве «и» или сочетанию «не». В других языках эта буква даже не считается буквой и интерпретируется как специальный символ (или пе интерпретируется вовсе), но в этих языках действуют иные правила сортировки для некоторых сочетаний символов. Чтббы строки автоматически сортировались



в порядке, нужном для пользователя, можно задействовать фацет collate. Функции этого фацета перечислены в табл. 14.23. Col обозначает специализацию collate, а в аргументах функций передаются итераторы, используемые для определения строк.

Таблица 14.23. Функции фацета collate Выражение Описание

col.compare(begl, endl, beg2, end2) Возвращаемое значение равно 1, если первая строка

больше второй; О, если строки равны; -1, если первая строка меньше второй

col.transform(beg, end) Возвращает строку, предназначенную для сравнения

с другими преобразованными строками

col.hash(beg, end) Возвращает хэш-код строки (типа long)

Фацет collate представляет собой шаблон класса, получающий в аргументе шаблона тип символов charT. Строки, передаваемые функциям collate, задаются при помощи указателей const charT*. Это несколько неудобно, поскольку нет гарантии, что итераторы, используемые типом basic string<charT>, также представляют собой указатели. Следовательно, сравнение строк должно производиться фрагментами следующего вида:

locale loc; string si. s2;

Получение фацета collate локального контекста locale const std::collate<charT>&col = stdLLuse facet<std: :conate<charT> >Cloc);

Сравнение строк с использованием фацета collate

lnt result = col .compare(sl.data(). sl.dataO+sl.slzeO.

s2.data(). s2,data()+s2.size()):

If (result == 0) { si и s2 равны

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

Конечно, для сравнения строк в классе locale существует специальная вспомогательная функция:

1nt result = loc(sl. s2);

Однако такое решение работает только с функцией compare(). В стандартной библиотеке С+-ь не определены вспомогательные функции для двух других функций collate.



0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 [ 226 ] 227 228 229 230 231 232 233 234 235 236 237 238 239