- 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;
}
guest 03.12.2011 21:53 # +1
absolut 03.12.2011 22:03 # +100502
bugmenot 03.12.2011 22:06 # +100501
vercetti 03.12.2011 22:53 # +5
TIts
bugmenot 03.12.2011 23:21 # +9
defecate-plusplus 03.12.2011 23:53 # +2
2. return boost::to_lower_copy(boost::trim_copy(ar g)) == mymember;
3. ...
4. PROFIT
Dummy00001 04.12.2011 00:39 # +2
ЗЫ а разве в бусте нет простого сравнения без учета регистра?
defecate-plusplus 04.12.2011 00:43 # 0
только раз требуется в объекте case-insensitive сравнение, то я подозреваю, что неплохо бы хранить сразу такой вариант
но вообще, конечно, достаточно было бы иметь объект, который в конструкторе/операторе =/etc сам себя уже триммит и хранит в одном (нижнем) регистре, и делать bool operator == (sametype const &), воспользовавшись тем, что компилятор сам приведёт типы
Dummy00001 04.12.2011 00:50 # 0
если уж ты хочешь что-то в этом духе делать - внутренее кэширование канонического представления строки - то тогда уж лучше создавать эту тримнутую, в нижнем регистре копию не всегда, а только по первому обращению.
defecate-plusplus 04.12.2011 00:57 # 0
в любом случае trim+is_iequal / trim+to_lower - запишутся в 1-2 строчки
Dummy00001 04.12.2011 01:00 # 0
defecate-plusplus 04.12.2011 01:04 # 0
неужели ихний встроенный класс настолько плох?
Dummy00001 04.12.2011 01:21 # 0
например TrimRight() и LoweCase() возвращают новые копии строк. похоже народ трахается с тем что бы избежать создания новых копий строк,
lucidfoxGovno 04.12.2011 01:33 # −2
defecate-plusplus, твой код украли, см вниз поста)))
притом без понимания как он работает, а потому не правильно))))))
lucidfoxGovno 04.12.2011 01:51 # −2
чё троллишь то?
defecate-plusplus 04.12.2011 01:58 # +1
так не сильно неправильно - в данном конкретном случае просто менее эффективно, чем 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);
lucidfoxGovno 04.12.2011 02:22 # 0
to_lower_copy принимает минимум 2 параметра
== - сравнит указатели а не строки
ну и имена переменных не совпадают
defecate-plusplus 04.12.2011 02:38 # 0
не понял ни одной претензии
lucidfoxGovno 04.12.2011 02:46 # 0
- to_lower_copy в данном случае вернет char*, поэтому == сранивает адреса
- ну и название переменной arg не соответсвует названию из параметра функции, но это уже мелоч
defecate-plusplus 04.12.2011 03:11 # 0
надеялся, что это очевидно, что подразумевается именно она и применять её поверх голого char const * не следует совсем
даже если в порядке бреда предположить, что нам следует именно использовать char const * в качестве аргумента (а не, что более логично, std::string const &), то вариант с временным std::string, куда будет складываться результат trim_copy через back_insert_iterator, и предварительным выяснением конечного итератора аргумента через strlen получится более сложным и почти таким же по скорости, как банальное обёртывание аргумента в std::string(arg) в указанном выше однострочнике
to_lower_copy сможет вернуть char * только если ты напишешь свой собственный велосипедоговнокод с выделением и освобождением памяти в куче
lucidfoxGovno 04.12.2011 00:29 # −6
зарегистрируйтесь кто-нибудь там и скажите им: КГ / АМ.
а то я скоро не выдержусь и зарегистрируюсь.
lucidfoxGovno 04.12.2011 00:35 # −4
lucidfoxGovno 04.12.2011 00:42 # −4
lucidfoxGovno 04.12.2011 00:47 # −2
я ещё ни на одном сайте столько говнища не видел
и они варются в нем, не понимая этого
они в полном серьёзе обсуждают этот говнокод превращаего его невесть во что
lucidfoxGovno 04.12.2011 00:49 # −4
guest 15.09.2012 15:42 # 0
bormand 15.09.2012 15:55 # 0
guest8 09.04.2019 12:17 # −999