Browse Source

Expanded and simplified equals() and equalsi().

release/0.19
JustinAJ 10 years ago
parent
commit
ba4ff8bf10
  1. 2
      Jupiter/Readable_String.h
  2. 84
      Jupiter/Readable_String_Imp.h

2
Jupiter/Readable_String.h

@ -129,6 +129,7 @@ namespace Jupiter
*/ */
bool equals(const Readable_String<T> &in) const; bool equals(const Readable_String<T> &in) const;
bool equals(const std::basic_string<T> &in) const; bool equals(const std::basic_string<T> &in) const;
bool equals(const T *in, size_t len) const;
bool equals(const T *in) const; bool equals(const T *in) const;
bool equals(const T &in) const; bool equals(const T &in) const;
bool equals(const std::nullptr_t) const; bool equals(const std::nullptr_t) const;
@ -142,6 +143,7 @@ namespace Jupiter
*/ */
bool equalsi(const Readable_String<T> &in) const; bool equalsi(const Readable_String<T> &in) const;
bool equalsi(const std::basic_string<T> &in) const; bool equalsi(const std::basic_string<T> &in) const;
bool equalsi(const T *in, size_t len) const;
bool equalsi(const T *in) const; bool equalsi(const T *in) const;
bool equalsi(const T &in) const; bool equalsi(const T &in) const;
bool equalsi(const std::nullptr_t) const; bool equalsi(const std::nullptr_t) const;

84
Jupiter/Readable_String_Imp.h

@ -233,34 +233,30 @@ template<typename T> int Jupiter::Readable_String<T>::compare(const std::nullptr
template<typename T> bool Jupiter::Readable_String<T>::equals(const Jupiter::Readable_String<T> &in) const template<typename T> bool Jupiter::Readable_String<T>::equals(const Jupiter::Readable_String<T> &in) const
{ {
if (this->size() != in.size()) return false; return this->equals(in.ptr(), in.size());
// rewrite to compare multiple bytes at a time.
size_t index = 0;
while (index != this->size())
{
if (this->get(index) != in.get(index)) return false;
index++;
}
return true;
} }
template<typename T> bool Jupiter::Readable_String<T>::equals(const std::basic_string<T> &in) const template<typename T> bool Jupiter::Readable_String<T>::equals(const std::basic_string<T> &in) const
{ {
if (this->size() != in.size()) return false; return this->equals(in.data(), in.size());
}
template<typename T> bool Jupiter::Readable_String<T>::equals(const T *in, size_t len) const
{
if (this->size() != len)
return false;
// rewrite to compare multiple bytes at a time. // rewrite to compare multiple bytes at a time.
size_t index = 0; in += len;
while (index != this->size()) while (len != 0)
{ if (this->get(--len) != *(--in))
if (this->get(index) != in.at(index)) return false; return false;
index++;
}
return true; return true;
} }
template<typename T> bool Jupiter::Readable_String<T>::equals(const T *in) const template<typename T> bool Jupiter::Readable_String<T>::equals(const T *in) const
{ {
if (in == nullptr) return this->size() == 0; if (in == nullptr) return this->isEmpty();
for (size_t index = 0; index != this->size(); index++) for (size_t index = 0; index != this->size(); index++)
{ {
if (*in == 0 || this->get(index) != *in) return false; if (*in == 0 || this->get(index) != *in) return false;
@ -281,52 +277,42 @@ template<typename T> bool Jupiter::Readable_String<T>::equals(std::nullptr_t) co
// equalsi() // equalsi()
template<> bool inline Jupiter::Readable_String<char>::equalsi(const Jupiter::Readable_String<char> &in) const template<typename T> bool Jupiter::Readable_String<T>::equalsi(const Jupiter::Readable_String<T> &in) const
{ {
if (this->size() != in.size()) return false; return this->equalsi(in.ptr(), in.size());
for (size_t index = 0; index != this->size(); index++)
{
if (toupper(this->get(index)) != toupper(in.get(index))) return false;
}
return true;
} }
template<> bool inline Jupiter::Readable_String<wchar_t>::equalsi(const Jupiter::Readable_String<wchar_t> &in) const template<typename T> bool Jupiter::Readable_String<T>::equalsi(const std::basic_string<T> &in) const
{ {
if (this->size() != in.size()) return false; return this->equalsi(in.data(), in.size());
for (size_t index = 0; index != this->size(); index++)
{
if (towupper(this->get(index)) != towupper(in.get(index))) return false;
}
return true;
} }
template<typename T> bool Jupiter::Readable_String<T>::equalsi(const Jupiter::Readable_String<T> &in) const template<> bool inline Jupiter::Readable_String<char>::equalsi(const char *in, size_t len) const
{ {
return this->equals(in); // Concept of "case" not supported for type. if (this->size() != len)
} return false;
in += len;
while (len != 0)
if (toupper(this->get(--len)) != toupper(*(--in)))
return false;
template<> bool inline Jupiter::Readable_String<char>::equalsi(const std::basic_string<char> &in) const
{
if (this->size() != in.size()) return false;
for (size_t index = 0; index != this->size(); index++)
{
if (toupper(this->get(index)) != toupper(in.at(index))) return false;
}
return true; return true;
} }
template<> bool inline Jupiter::Readable_String<wchar_t>::equalsi(const std::basic_string<wchar_t> &in) const template<> bool inline Jupiter::Readable_String<wchar_t>::equalsi(const wchar_t *in, size_t len) const
{ {
if (this->size() != in.size()) return false; if (this->size() != len)
for (size_t index = 0; index != this->size(); index++) return false;
{
if (towupper(this->get(index)) != towupper(in.at(index))) return false; while (len != 0)
} if (towupper(this->get(--len)) != towupper(*(--in)))
return false;
return true; return true;
} }
template<typename T> bool Jupiter::Readable_String<T>::equalsi(const std::basic_string<T> &in) const template<typename T> bool Jupiter::Readable_String<T>::equalsi(const T *in, size_t len) const
{ {
return this->equals(in); // Concept of "case" not supported for type. return this->equals(in); // Concept of "case" not supported for type.
} }

Loading…
Cancel
Save