FormatUtils.h

См. документацию.
00001 /*
00002  * CntmLib - Подсчет ссылок, потоки, синхронизация, асинхронные процедуры, события
00003  * Copyright (c) 2005, Овсеевич Роман, CntmLib@mail.ru
00004  * _______________________________________________________________________________
00005  * Разрешено свободное использование, копирование, распространение, изменение
00006  * (изменение сведений об авторских правах запрещено). Запрещена продажа и 
00007  * включение всей библиотеки или ее частей в другие библиотеки. В сведениях об
00008  * авторских правах на программу (или сведениях о программе, об авторах, 
00009  * использованных средствах разработки и т.д.) должна быть указана информация
00010  * о библиотеке CntmLib, ее авторе и, возможно, сайте или email'е.
00011  * Библиотека поставляется "как есть", без каких-либо гарантий со стороны автора.
00012  */ 
00013 
00014 #ifndef CNTM_FORMATUTILS_H
00015 #define CNTM_FORMATUTILS_H
00016 #include <string>
00017 #include <sstream>
00018 
00019 namespace Cntm
00020 {
00021 
00022         /**
00023          *@author Овсеевич Р. 
00024          */
00025         struct FormatMsgPrmConvertor
00026         {
00027                 /**
00028                  * Строка, содержащая преобразованный параметр.
00029                  */
00030                 std::string Str;
00031 
00032                 /**
00033                  * Конструктор по умолчанию.
00034                  */
00035                 FormatMsgPrmConvertor() {}
00036 
00037                 /**
00038                  * Конструктор преобразования типа T в строку.
00039                  */
00040                 template <typename T> FormatMsgPrmConvertor(const T& Prm);
00041         };
00042 
00043         template <class T>
00044         FormatMsgPrmConvertor::FormatMsgPrmConvertor(const T& Prm)
00045         {
00046                 std::ostringstream PrmConv;     // Создаем строковый поток
00047                 PrmConv << Prm;                         // Конвертируем параметр в строковый поток
00048                 Str = PrmConv.str();            // Преобразовываем к строке
00049         }
00050 
00051         /**
00052          * Форматирование строки с 0..2 параметрами (место вставки параметров - "%%Index", Index = 1..8).
00053          *
00054          * Для преобразования аргументов в строку используется промежуточный тип FmtMsgPrm, в конструкторе которого вызывается оператор << для basic_ostream<char>. Тип аргумента должен поддерживать эту операцию.
00055          */
00056         std::string FormatMsg(const std::string& Fmt,
00057                 const FormatMsgPrmConvertor& Prm1 = FormatMsgPrmConvertor(),
00058                 const FormatMsgPrmConvertor& Prm2 = FormatMsgPrmConvertor());
00059 
00060         /**
00061          * Форматирование строки с 3..4 параметрами.
00062          *
00063          * Для преобразования аргументов в строку используется промежуточный тип FmtMsgPrm, в конструкторе которого вызывается оператор << для basic_ostream<char>. Тип аргумента должен поддерживать эту операцию.
00064          */
00065         std::string FormatMsg(const std::string& Fmt,
00066                 const FormatMsgPrmConvertor& Prm1,
00067                 const FormatMsgPrmConvertor& Prm2,
00068                 const FormatMsgPrmConvertor& Prm3,
00069                 const FormatMsgPrmConvertor& Prm4 = FormatMsgPrmConvertor());
00070 
00071         /**
00072          * Форматирование строки с 5..8 параметрами.
00073          *
00074          * Для преобразования аргументов в строку используется промежуточный тип FmtMsgPrm, в конструкторе которого вызывается оператор << для basic_ostream<char>. Тип аргумента должен поддерживать эту операцию.
00075          */
00076         std::string FormatMsg(const std::string& Fmt,
00077                 const FormatMsgPrmConvertor& Prm1,
00078                 const FormatMsgPrmConvertor& Prm2,
00079                 const FormatMsgPrmConvertor& Prm3,
00080                 const FormatMsgPrmConvertor& Prm4,
00081                 const FormatMsgPrmConvertor& Prm5,
00082                 const FormatMsgPrmConvertor& Prm6 = FormatMsgPrmConvertor(),
00083                 const FormatMsgPrmConvertor& Prm7 = FormatMsgPrmConvertor(),
00084                 const FormatMsgPrmConvertor& Prm8 = FormatMsgPrmConvertor());
00085 
00086         /**
00087          * Класс для хранения форматных строк (содержащих текст сообщения и указатели места вставки параметров, имеющие вид "%%Index", Index = 1..8), потомок std::string.
00088          *
00089          * Оператор (...) используется для подстановки реальных значений параметров.
00090          *
00091          * Пример: FormatString fsGenericError = "Общая ошибка: %%2, приоритет: %%1, user: %%3");
00092          * throw exception(fsGenericError(3, "Ошибка параметра", fCurrentUser));.
00093          * @author Овсеевич Р.
00094          */
00095         class FormatString: public std::string
00096         {
00097         public:
00098 
00099                 /**
00100                  * Конструктор по умолчанию.
00101                  */
00102                 FormatString(): std::string() {}
00103 
00104                 /**
00105                  * Конструктор из обычной строки.
00106                  */
00107                 FormatString(const char* Str): std::string(Str) {}
00108 
00109                 /**
00110                  * Конструктор копирования.
00111                  */
00112                 FormatString(const std::string& Str): std::string(Str) {}
00113 
00114                 /**
00115                  * Оператор подстановки 0..2 параметров.
00116                  *
00117                  * Для преобразования аргументов в строку используется промежуточный тип FmtMsgPrm, в конструкторе которого вызывается оператор << для basic_ostream<char>. Тип аргумента должен поддерживать эту операцию.
00118                  */
00119                 std::string operator()(
00120                         const FormatMsgPrmConvertor& Prm1 = FormatMsgPrmConvertor(),
00121                         const FormatMsgPrmConvertor& Prm2 = FormatMsgPrmConvertor()) const
00122                         { return FormatMsg(*this, Prm1, Prm2); }
00123 
00124                 /**
00125                  * Оператор подстановки 3..4 параметров.
00126                  *
00127                  * Для преобразования аргументов в строку используется промежуточный тип FmtMsgPrm, в конструкторе которого вызывается оператор << для basic_ostream<char>. Тип аргумента должен поддерживать эту операцию.
00128                  */
00129                 std::string operator()(
00130                         const FormatMsgPrmConvertor& Prm1,
00131                         const FormatMsgPrmConvertor& Prm2,
00132                         const FormatMsgPrmConvertor& Prm3,
00133                         const FormatMsgPrmConvertor& Prm4 = FormatMsgPrmConvertor()) const
00134                         { return FormatMsg(*this, Prm1, Prm2, Prm3, Prm4); }
00135 
00136                 /**
00137                  * Оператор подстановки 5..8 параметров.
00138                  *
00139                  * Для преобразования аргументов в строку используется промежуточный тип FmtMsgPrm, в конструкторе которого вызывается оператор << для basic_ostream<char>. Тип аргумента должен поддерживать эту операцию.
00140                  */
00141                 std::string operator()(
00142                         const FormatMsgPrmConvertor& Prm1,
00143                         const FormatMsgPrmConvertor& Prm2,
00144                         const FormatMsgPrmConvertor& Prm3,
00145                         const FormatMsgPrmConvertor& Prm4,
00146                         const FormatMsgPrmConvertor& Prm5,
00147                         const FormatMsgPrmConvertor& Prm6 = FormatMsgPrmConvertor(),
00148                         const FormatMsgPrmConvertor& Prm7 = FormatMsgPrmConvertor(),
00149                         const FormatMsgPrmConvertor& Prm8 = FormatMsgPrmConvertor()) const
00150                         { return FormatMsg(*this, Prm1, Prm2, Prm3, Prm4, Prm5, Prm6, Prm7, Prm8); }
00151         };
00152 
00153 }
00154 
00155 #endif //CNTM_FORMATUTILS_H

SourceForge.net Logo
© Овсеевич Р.В. Документация по CntmLib 1.1.4 от 28 May 2008. Создано системой  doxygen 1.5.3