Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cassert>
- #include <ctype.h>
- #include <cstring>
- #include <string>
- class CIString {
- std::string _String;
- public:
- CIString(std::string s)
- : _String(s)
- { }
- char& operator[] (int i) {
- return _String[i];
- }
- template<class L, class R> friend bool operator==(L l, R r);
- template<class L, class R> friend bool operator<(L l, R r);
- template<class L, class R> friend bool operator>(L l, R r);
- template<class L, class R> friend bool operator!=(L l, R r);
- template<class L, class R> friend bool operator>=(L l, R r);
- template<class L, class R> friend bool operator<=(L l, R r);
- template<class T> friend int get_size(T other);
- };
- template<class L, class R>
- bool operator==(L l, R r) {
- return !cmp(l, r);
- }
- template<class L, class R>
- bool operator<(L l, R r) {
- return cmp(l,r) < 0;
- }
- template<class L, class R>
- bool operator>(L l, R r) {
- return cmp(l,r) > 0;
- }
- template<class L, class R>
- bool operator!=(L l, R r) {
- return cmp(l,r) != 0;
- }
- template<class L, class R>
- bool operator>=(L l, R r) {
- return cmp(l,r) >= 0;
- }
- template<class L, class R>
- bool operator<=(L l, R r) {
- return cmp(l,r) <= 0;
- }
- template<class T>
- int get_size(T other);
- template<class L, class R>
- int cmp(L l, R r) {
- int s1 = get_size(l);
- int s2 = get_size(r);
- size_t i = 0;
- for (i = 0; i < s1 && i < s2; ++i) {
- char c1 = tolower(l[i]);
- char c2 = tolower(r[i]);
- if (c1 == c2) {
- continue;
- }
- if (c1 < c2) {
- return -1;
- }
- if (c1 > c2) {
- return 1;
- }
- }
- if (s1 == s2) {
- return 0;
- }
- return (s1 < s2) ? -1 : 1;
- }
- template<>
- int get_size<const char*>(const char* other) {
- return strlen(other);
- }
- template<>
- int get_size<CIString>(CIString other) {
- return other._String.size();
- }
- int main(int, const char**) {
- //const char* operators
- assert(CIString("") == "");
- assert(CIString("") != "a" && CIString("") < "a" && CIString("") <= "a" );
- assert(CIString("a") != "" && CIString("a") > "" && CIString("a") >= "" );
- assert(CIString("AbC") == "aBc");
- assert(CIString("abCd") != "aBc");
- assert(CIString("abCd") > "aBc" && CIString("abcd") >= "abc");
- assert(CIString("aBc") < "abCd" && CIString("abc") <= "abcd");
- assert(CIString("abC") != "abD");
- assert(CIString("aBc") < "abD");
- ////CIString operators
- assert(CIString("") == CIString(""));
- assert(CIString("") != CIString("a") && CIString("") < CIString("a") && CIString("") <= CIString("a") );
- assert(CIString("a") != CIString("") && CIString("a") > CIString("") && CIString("a") >= CIString("") );
- assert(CIString("AbC") == CIString("aBc"));
- assert(CIString("AbCd") != CIString("Abc"));
- assert(CIString("abcd") > CIString("abc") && CIString("abcd") >= CIString("abc"));
- assert(CIString("abc") < CIString("abcd") && CIString("abc") <= CIString("abcd"));
- assert(CIString("abc") != CIString("abd"));
- assert(CIString("abc") < CIString("abd"));
- ////last
- assert("" == CIString(""));
- assert("a" != CIString("") && "a" > CIString("") && "a" >= CIString("") );
- assert("" != CIString("a") && "" < CIString("a") && "" <= CIString("a"));
- assert("aBc" == CIString("AbC"));
- assert("aBc" != CIString("abCd"));
- assert("aBc" < CIString("abCd") && "aBc" <= CIString("abCd"));
- assert("abCd" > CIString("aBc") && "abCd" >= CIString("abc"));
- assert("abD" != CIString("abC"));
- assert("abD" > CIString("aBc"));
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement