- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
bool __fastcall TItsString::operator == (const char* sVal) const
{
bool Empty1 = ((FStringValue == NULL) || (FStringValue[0] == 0));
bool Empty2 = ((sVal == NULL) || (sVal[0] == 0));
if (Empty1 && Empty2) return true;
if (Empty1 || Empty2) return false;
int i,j,k;
for(i=0; FStringValue[i] && (GET_LOWER_CHAR(FStringValue[i]) == GET_LOWER_CHAR(sVal[i])); i++);
if ((FStringValue[i] == 0) && (sVal[i] == 0)) return true;
j=i; k=i;
if (sVal[k] == 0) for(; FStringValue[i] == 0x20; i++);
if (FStringValue[k] == 0) for(; sVal[j] == 0x20; j++);
if ((FStringValue[i] == 0) && (sVal[j] == 0)) return true;
return false;
}
TIts
2. return boost::to_lower_copy(boost::trim_copy(ar g)) == mymember;
3. ...
4. PROFIT
ЗЫ а разве в бусте нет простого сравнения без учета регистра?
только раз требуется в объекте case-insensitive сравнение, то я подозреваю, что неплохо бы хранить сразу такой вариант
но вообще, конечно, достаточно было бы иметь объект, который в конструкторе/операторе =/etc сам себя уже триммит и хранит в одном (нижнем) регистре, и делать bool operator == (sametype const &), воспользовавшись тем, что компилятор сам приведёт типы
если уж ты хочешь что-то в этом духе делать - внутренее кэширование канонического представления строки - то тогда уж лучше создавать эту тримнутую, в нижнем регистре копию не всегда, а только по первому обращению.
в любом случае trim+is_iequal / trim+to_lower - запишутся в 1-2 строчки
неужели ихний встроенный класс настолько плох?
например TrimRight() и LoweCase() возвращают новые копии строк. похоже народ трахается с тем что бы избежать создания новых копий строк,
defecate-plusplus, твой код украли, см вниз поста)))
притом без понимания как он работает, а потому не правильно))))))
чё троллишь то?
так не сильно неправильно - в данном конкретном случае просто менее эффективно, чем return boost::is_iequal(boost::trim_copy(me), boost::trim_copy(right));
а в общем случае - желательно включать голову
я лично считаю, что раз есть попытка использовать == для объекта, значит такая операция очень логичная для объекта, значит строку внутри объекта уже следует хранить обрезанной и приведенной в регистр, ну и делать bool myclass::operator == (myclass const & right);
тогда всё будет чики-пуки при
myclass a = " hello, World! ";
return a == " HeLLo, world! ";
если же такое сравнение не очень "родное" для объекта, то вместо перегрузки operator == требуется отдельный метод bool myclass::is_iequal_trimmed(somearg);
to_lower_copy принимает минимум 2 параметра
== - сравнит указатели а не строки
ну и имена переменных не совпадают
не понял ни одной претензии
- to_lower_copy в данном случае вернет char*, поэтому == сранивает адреса
- ну и название переменной arg не соответсвует названию из параметра функции, но это уже мелоч
надеялся, что это очевидно, что подразумевается именно она и применять её поверх голого char const * не следует совсем
даже если в порядке бреда предположить, что нам следует именно использовать char const * в качестве аргумента (а не, что более логично, std::string const &), то вариант с временным std::string, куда будет складываться результат trim_copy через back_insert_iterator, и предварительным выяснением конечного итератора аргумента через strlen получится более сложным и почти таким же по скорости, как банальное обёртывание аргумента в std::string(arg) в указанном выше однострочнике
to_lower_copy сможет вернуть char * только если ты напишешь свой собственный велосипедоговнокод с выделением и освобождением памяти в куче
зарегистрируйтесь кто-нибудь там и скажите им: КГ / АМ.
а то я скоро не выдержусь и зарегистрируюсь.
я ещё ни на одном сайте столько говнища не видел
и они варются в нем, не понимая этого
они в полном серьёзе обсуждают этот говнокод превращаего его невесть во что