You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tellico/src/latin1literal.h

91 lines
2.5 KiB

/***************************************************************************
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