/*************************************************************************** copyright : (C) 2003-2006 by Robby Stephenson email : robby@periapsis.org ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of version 2 of the GNU General Public License as * * published by the Free Software Foundation; * * * ***************************************************************************/ // this code was original published to the kde-core-devel email list // copyright 2003 Harri Porten <porten@kde.org> // Originally licensed under LGPL, included here under GPL v2 #ifndef LATIN1LITERAL_H #define LATIN1LITERAL_H #include <tqstring.h> namespace Tellico { /** * A class for explicit marking of string literals encoded in the ISO * 8859-1 character set. Allows for efficient, still (in terms of the * chosen encoding) safe comparison with TQString instances. To be used * like this: * * \code * TQString s = ..... * if (s == Latin1Literal("o")) { ..... } * \endcode * */ #define Latin1Literal(s) \ Tellico::Latin1LiteralInternal((s), sizeof(s)/sizeof(char)-1) class Latin1LiteralInternal { public: Latin1LiteralInternal(const char* s, size_t l) : str(s), len(s ? l : (size_t)-1) { } // this is lazy, leave these public since I can't figure out // how to declare a friend function that works for gcc 2.95 const char* str; size_t len; }; } // end namespace inline bool operator==(const TQString& s1, const Tellico::Latin1LiteralInternal& s2) { const TQChar* uc = s1.unicode(); const char* c = s2.str; if(!c || !uc) { return (!c && !uc); } const size_t& l = s2.len; if(s1.length() != l) { return false; } for(size_t i = 0; i < l; ++i, ++uc, ++c) { if(uc->unicode() != static_cast<uchar>(*c)) { return false; } } return true; } inline bool operator!=(const TQString& s1, const Tellico::Latin1LiteralInternal& s2) { return !(s1 == s2); } inline bool operator==(const Tellico::Latin1LiteralInternal& s1, const TQString& s2) { return s2 == s1; } inline bool operator!=(const Tellico::Latin1LiteralInternal& s1, const TQString& s2) { return !(s2 == s1); } #endif