Анимация
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.16 (продолжение) Выражение Описание

ct.widen(c) Возвращает символ char с, преобразованный к типу charT

ct.widen(beg, end, dest) Для каждого символа в интервале между beg и end помещает

результат вызова widen() в соответствующую позицию dest

ctnarrow(c, default) Возвращает символ charT с, преобразованный к типу char,

или символ default, если такого символа не существует

ct.narrow(beg, end, default, dest) Для каждого символа в интервале между beg и end помещает

результат вызова narrow() в соответствующую позицию dest

Функция \s{beg,end,vec) сохраняет в массиве маски символов. Для каждого символа в интервале между beg и end в массиве, на который ссылается аргумент vec, сохраняется маска с установкой соответствующих атрибутов символов. Использование этой функции позволяет избежать многократных вызовов виртуальных функций при большом количестве классифицируемых символов.

Функция wlden() преобразует символ типа char из исходной кодировки в кодировку, используемую локальным контекстом. Это означает, что вызов wlden() может быть оправдан даже в том случае, если результат тоже относится к типу char. Обратное преобразование осуществляется функцией narrow(), которая преобразует символ из кодировки, используемой локальным контекстом, в соответствующий символ char (при условии, что такой символ существует). В следующем фрагменте строка с десятичными цифрами преобразуется из типа char в wchar t:

std::locale loc;

char narrow[] = "0123456789":

wchar t w1de[l0];

std::use facet<std::ctype<wchar t> >(1oc),w1den(narrow. narrow+10.

wide);

Класс ctype является производным от класса ctype base. Этот класс используется только для определения перечисляемого типа mask. В перечисляемом типе задаются значения, сочетание которых образует битовую маску для проверки свойств символов. Значения, определенные в классе ctype base, перечислены в табл. 14.17. Функциям классификации символов передается битовая маска, которая представляет собой комбинацию этих значений с поразрядными операторами I, &, и ~. Символ совпадает с маской только в том случае, если он принадлежит хотя бы к одной категории, определяемой этой маской.

Таблица 14.17. Маски символов, используемые фацетом ctype

Выражение

Описание

ctype base::alnum

Буквы и цифры (эквивалент alphadlglt)

ctype base::alpha

Буквы ,

ctype base:;cntrl

Управляющие символы



Выражение

Описание

ctype base::diglt

Десятичные цифры

ctype base:: graph

Знаки препинания, буквы и цифры (эквивалент alnumpunct)

ctype base:: lower

Буквы нижнего регистра

ctype base::pnnt

Печатные символы

ctype base::punct

Знаки препинания

ctype base::space

Пропуски

ctype base::upper

Буквы верхнего регистра

ctype base::xdlgit

Шестнадцатеричные цифры

Специализации ctype для типа char

Чтобы повысить эффективность работы функций классификации символов, фацет ctype специализируется для типа символов char. Специализация не перепоручает функции классификации символов (is(), scan() и scannot()) соответствующим виртуальным функциям. Вместо этого задействуется непосредственная реализация функций с использованием поиска по таблице категорий, для чего в фацете определяются дополнительные члены (табл. 14.18).

Таблица 14.18. Дополнительные члены ctype<char>

Выражение

Описание

ctype<char>: :table si2e

Размер таблицы (>=25б)

ctype<char>::classlcjable()

Возвращает таблицу категорий для «классического»

локального контекста С

ctype<char>(table, del=false)

Создает фацет с таблицей категорий table

cttableO

Возвращает текущую таблицу категорий для фацета ct

Чтобы изменить поведение этих функций для конкретного локального контекста, передайте соответствующую таблицу категорий в аргументе конструктора:

Создание и инициализация таблицы

std;:ctype base::mask mytable[std:;ctype<char>::table slze] = { }:

Использовать таблицу для фацета ct типа ctype<char> std::ctype<char> ct(mytable.false);

Фрагмент конструирует фацет ctype<char>, который классифицирует символы по таблице mytable. Точнее говоря, класс символа с определяется выражением:

mytable[stat1c cast<uns1gned char>(c)]

Статическая переменная table size является константой, определенной реализацией библиотеки и хранящей размер таблицы категорий. Таблица должна



содержать не менее 256 символов. Второй необязательный аргумент конструктора ctype<char> указывает, должна ли таблица удаляться при уничтожении фацета. Если аргумент равен true, то переданная конструктору таблица освобождается прн вызове delete[], когда фацет становится ненужным.

Защищенная функция table() возвращает таблицу, переданную в первом аргументе конструктора. Статическая защищенная функция classic table() возвращает таблицу, используемую для классификации символов в классическом локальном контексте С.

Глобальные вспомогательные функции классификации символов

Для удобства работы с фацетом ctype определен ряд глобальных функций, перечисленных в табл. 14.9.

Таблица 14.19. Глобальные вспомогательные функции классификации символов Функция Описание

isalnum(c, loc) Проверяет, является ли с буквой или цифрой (эквивалент isalpha()8t&isdlglt())

isalpha(c, loc) Проверяет, является ли с буквой

iscntrl(c, loc) Проверяет, является ли с управляющим символом

isdigit(c, loc) Проверяет, является ли с цифрой

isgraph(c, loc) Проверяет, является ли с печатным символом, исключая пробелы (эквивалент lsalnum()&&lspunct())

lslower(c, loc) Проверяет, является ли с буквой нижнего регистра

isprjnt(c, loc) Проверяет, является ли с печатным символом (включая пропуски)

ispunct(c, loc) Проверяет, является ли с знаком препинания (то есть печатным символом, отличным от Пробела, цифры или буквы)

lsspace(c, loc) Проверяет, является ли с пробелом

isupper(c, loc) Проверяет, является ли с буквой верхнего регистра

isxdlgit(c, loc) Проверяет, является ли с шестнадцатеричной цифрой

tolower(c, loc) Преобразует с из верхнего регистра в нижний

toupper(c, loc) Преобразует с из нижнего регистра в верхний

Например, следующее выражение проверяет, является ли символ с буквой нижнего регистра в локальном контексте loc:

std::lslower(c,loc)

Функция возвращает значение типа bool.

Следующее выражение возвращает символ с, преобразованный в букву верхнего регистра в локальном контексте 1эс:

std::toupper(c.loc)



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