|
Программирование >> Разработка устойчивых систем
#define ICHAR TRAITS H #include <cassert> linclude <cctype> linclude <cmath> linclude <cstddef> linclude <ostream> linclude <string> using std::allocator; using std::basic string; using std::char traits; using std::ostream; using std::size t: using std::string: using std:;toupper: using std;:tolower; struct ichar traits : char traits<char> { Изменяются только функции сравнения символов, static bool eqCchar cist, char c2nd) { return toupper(clst) == toupper(c2nd): static bool neCchar cist, char c2nd) { return !eq(clst. c2nd): static bool lt(char cist, char c2nd) { return toupper(clst) < toupper(c2nd); static int compareCconst char* stri. const char* str2. size t n) for(size t i = 0: i < n; i++) { ifCstrl == 0) return -1; else if(str2 == 0) return 1; else if(tolower(*strl) < tolower(*str2)) return -1; else if(tolower(*strl) > tolower(*str2)) return 1: assert(tolower(*strl) == tolower(*str2)): strl++; str2++; Compare the other chars return 0; static const char* findCconst char* si. size t n. char c) { whileCn-- > 0) if(toupper(*sl) == toupper(c)) return si: else ++sl: return 0; typedef basic string<char. ichar traits> istring; inline ostream& operator (ostream& os. const istring& s) { return OS string(s.c str(). s.lengthO); #endif ICHAR TRAITS H /:- Мы создали определение типа istring, чтобы наш класс был во всех отношениях аналогичен обычному классу string, кроме одного - все сравнения осуществляются без учета регистра символов. Для удобства также предоставлена перефужен-ная версия операторной функции operator () для вывода строк. Пример: : СОЗ:ICompare.срр #include <cassert> #include <iostream> #1nclude ichar traits.h using namespace std: int mainO { Буквы совпадают, отличается только регистр: istring first = tHis : istring second = ThIS : cout fi rst endl: cout second endl: assert(first.compare(second) == 0): assert(first.find(h) == 1): assertCfirst.findCI ) == 2): assert(first.find(x) == string::npos): } III:- Впрочем, это сильно упрощенный, ненастоящий пример. Чтобы класс istring стал полностью эквивалентным string, необходимо определить другие функции, обеспечивающие его работу. В заголовочном файле <string> также определяется строковый класс с расширенной кодировкой символов: typedef basic string<wchar t> wstring: Поддержка расширенных кодировок проявляется в расширенных потоках ввода-вывода (класс wostream вместо ostream, также определяемый в <iostream>) и заголовочном файле <cwctype>, расширенной версии <cctype>. Наряду со специализацией шаблона char traits по типу wchar t в стандартной библиотеке это позволяет создать версию ichar traits для символов в расширенной кодировке: : C03:iwchar traits.h {-g++} Создание класса характеристик для расширенных символов #ifndef IWCHAR TRAITS H #define IWCHAR TRAITS H #include <cassert> #i nclude <cmath> #include <cstddef> #include <cwctype> #include <ostream> #include <string> using std: :anocator: using std::basic string: using std::char traits: using std::towlower: using std::towupper: using std::wostream: using std::wstring: struct iwchar traits : char traits<wchar t> { Изменяются только функции сравнения символов, static bool eq(wchar t cist. wchar t c2nd) { return towupper(clst) == towupper(c2nd): static bool ne(wchar t cist. wchar t c2nd) { return towupper(clst) != towupper(c2nd): static bool lt(wchar t cist. wchar t c2nd) { return towupper(clst) < towupper(c2nd): static int compare(const wchar t* stri. const wchar t* str2, size t n) { for(size t i = 0; i < n; i++) { if(strl == 0) return -1: else if(str2 == 0) return 1: else if(towlower(*strl) < towlower(*str2)) return -1: else if(towlower(*strl) > towlower(*str2)) return 1: assert(towlower(*strl) == towlower(*str2)): strl++; str2++; Сравнение следующих wchar t return 0: static const wchar t* find(const wchar t* si. size t n. wchar t c) { while(n-- > 0) if(towupper(*sl) == towupper(c)) return si: else ++sl: return 0: typedef basic string<wchar t. iwchar traits> iwstring: inline wostreamS. operator (wostream& os. const iwstringS s) { return OS wstring(s.c str(), s.lengthO): #endif IWCHAR TRAITS H 111 Как видите, задача в основном сводится к простой подстановке символа w в некоторых местах исходной программы. Тестовая программа выглядит так: : C03:IWCompare.cpp {-g++} #include <cassert> #include <iostream> linclude iwchar traits.h using namespace std: int mainO { Буквы совпадают, отличается только регистр: iwstring wfirst = L tHis : iwstring wsecond = L ThIS : wcout wfi rst endl: wcout wsecond endl:
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |