| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301 | 
							- /* Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
 
-    file Copyright.txt or https://cmake.org/licensing for details.  */
 
- #include <cm/string_view> // IWYU pragma: associated
 
- #ifndef CMake_HAVE_CXX_STRING_VIEW
 
- #  include <algorithm>
 
- #  include <ostream>
 
- #  include <stdexcept>
 
- #  include <cm3p/kwiml/int.h>
 
- namespace cm {
 
- string_view::const_reference string_view::at(size_type pos) const
 
- {
 
-   if (pos >= size_) {
 
-     throw std::out_of_range("Index out of range in string_view::at");
 
-   }
 
-   return data_[pos];
 
- }
 
- string_view::size_type string_view::copy(char* dest, size_type count,
 
-                                          size_type pos) const
 
- {
 
-   if (pos > size_) {
 
-     throw std::out_of_range("Index out of range in string_view::copy");
 
-   }
 
-   size_type const rcount = std::min(count, size_ - pos);
 
-   traits_type::copy(dest, data_ + pos, rcount);
 
-   return rcount;
 
- }
 
- string_view string_view::substr(size_type pos, size_type count) const
 
- {
 
-   if (pos > size_) {
 
-     throw std::out_of_range("Index out of range in string_view::substr");
 
-   }
 
-   size_type const rcount = std::min(count, size_ - pos);
 
-   return string_view(data_ + pos, rcount);
 
- }
 
- int string_view::compare(string_view v) const noexcept
 
- {
 
-   size_type const rlen = std::min(size_, v.size_);
 
-   int c = traits_type::compare(data_, v.data_, rlen);
 
-   if (c == 0) {
 
-     if (size_ < v.size_) {
 
-       c = -1;
 
-     } else if (size_ > v.size_) {
 
-       c = 1;
 
-     }
 
-   }
 
-   return c;
 
- }
 
- int string_view::compare(size_type pos1, size_type count1, string_view v) const
 
- {
 
-   return substr(pos1, count1).compare(v);
 
- }
 
- int string_view::compare(size_type pos1, size_type count1, string_view v,
 
-                          size_type pos2, size_type count2) const
 
- {
 
-   return substr(pos1, count1).compare(v.substr(pos2, count2));
 
- }
 
- int string_view::compare(const char* s) const
 
- {
 
-   return compare(string_view(s));
 
- }
 
- int string_view::compare(size_type pos1, size_type count1, const char* s) const
 
- {
 
-   return substr(pos1, count1).compare(string_view(s));
 
- }
 
- int string_view::compare(size_type pos1, size_type count1, const char* s,
 
-                          size_type count2) const
 
- {
 
-   return substr(pos1, count1).compare(string_view(s, count2));
 
- }
 
- string_view::size_type string_view::find(string_view v, size_type pos) const
 
-   noexcept
 
- {
 
-   for (; pos + v.size_ <= size_; ++pos) {
 
-     if (std::char_traits<char>::compare(data_ + pos, v.data_, v.size_) == 0) {
 
-       return pos;
 
-     }
 
-   }
 
-   return npos;
 
- }
 
- string_view::size_type string_view::find(char c, size_type pos) const noexcept
 
- {
 
-   return find(string_view(&c, 1), pos);
 
- }
 
- string_view::size_type string_view::find(const char* s, size_type pos,
 
-                                          size_type count) const
 
- {
 
-   return find(string_view(s, count), pos);
 
- }
 
- string_view::size_type string_view::find(const char* s, size_type pos) const
 
- {
 
-   return find(string_view(s), pos);
 
- }
 
- string_view::size_type string_view::rfind(string_view v, size_type pos) const
 
-   noexcept
 
- {
 
-   if (size_ >= v.size_) {
 
-     for (pos = std::min(pos, size_ - v.size_) + 1; pos > 0;) {
 
-       --pos;
 
-       if (std::char_traits<char>::compare(data_ + pos, v.data_, v.size_) ==
 
-           0) {
 
-         return pos;
 
-       }
 
-     }
 
-   }
 
-   return npos;
 
- }
 
- string_view::size_type string_view::rfind(char c, size_type pos) const noexcept
 
- {
 
-   return rfind(string_view(&c, 1), pos);
 
- }
 
- string_view::size_type string_view::rfind(const char* s, size_type pos,
 
-                                           size_type count) const
 
- {
 
-   return rfind(string_view(s, count), pos);
 
- }
 
- string_view::size_type string_view::rfind(const char* s, size_type pos) const
 
- {
 
-   return rfind(string_view(s), pos);
 
- }
 
- string_view::size_type string_view::find_first_of(string_view v,
 
-                                                   size_type pos) const noexcept
 
- {
 
-   for (; pos < size_; ++pos) {
 
-     if (traits_type::find(v.data_, v.size_, data_[pos])) {
 
-       return pos;
 
-     }
 
-   }
 
-   return npos;
 
- }
 
- string_view::size_type string_view::find_first_of(char c, size_type pos) const
 
-   noexcept
 
- {
 
-   return find_first_of(string_view(&c, 1), pos);
 
- }
 
- string_view::size_type string_view::find_first_of(const char* s, size_type pos,
 
-                                                   size_type count) const
 
- {
 
-   return find_first_of(string_view(s, count), pos);
 
- }
 
- string_view::size_type string_view::find_first_of(const char* s,
 
-                                                   size_type pos) const
 
- {
 
-   return find_first_of(string_view(s), pos);
 
- }
 
- string_view::size_type string_view::find_last_of(string_view v,
 
-                                                  size_type pos) const noexcept
 
- {
 
-   if (size_ > 0) {
 
-     for (pos = std::min(pos, size_ - 1) + 1; pos > 0;) {
 
-       --pos;
 
-       if (traits_type::find(v.data_, v.size_, data_[pos])) {
 
-         return pos;
 
-       }
 
-     }
 
-   }
 
-   return npos;
 
- }
 
- string_view::size_type string_view::find_last_of(char c, size_type pos) const
 
-   noexcept
 
- {
 
-   return find_last_of(string_view(&c, 1), pos);
 
- }
 
- string_view::size_type string_view::find_last_of(const char* s, size_type pos,
 
-                                                  size_type count) const
 
- {
 
-   return find_last_of(string_view(s, count), pos);
 
- }
 
- string_view::size_type string_view::find_last_of(const char* s,
 
-                                                  size_type pos) const
 
- {
 
-   return find_last_of(string_view(s), pos);
 
- }
 
- string_view::size_type string_view::find_first_not_of(string_view v,
 
-                                                       size_type pos) const
 
-   noexcept
 
- {
 
-   for (; pos < size_; ++pos) {
 
-     if (!traits_type::find(v.data_, v.size_, data_[pos])) {
 
-       return pos;
 
-     }
 
-   }
 
-   return npos;
 
- }
 
- string_view::size_type string_view::find_first_not_of(char c,
 
-                                                       size_type pos) const
 
-   noexcept
 
- {
 
-   return find_first_not_of(string_view(&c, 1), pos);
 
- }
 
- string_view::size_type string_view::find_first_not_of(const char* s,
 
-                                                       size_type pos,
 
-                                                       size_type count) const
 
- {
 
-   return find_first_not_of(string_view(s, count), pos);
 
- }
 
- string_view::size_type string_view::find_first_not_of(const char* s,
 
-                                                       size_type pos) const
 
- {
 
-   return find_first_not_of(string_view(s), pos);
 
- }
 
- string_view::size_type string_view::find_last_not_of(string_view v,
 
-                                                      size_type pos) const
 
-   noexcept
 
- {
 
-   if (size_ > 0) {
 
-     for (pos = std::min(pos, size_ - 1) + 1; pos > 0;) {
 
-       --pos;
 
-       if (!traits_type::find(v.data_, v.size_, data_[pos])) {
 
-         return pos;
 
-       }
 
-     }
 
-   }
 
-   return npos;
 
- }
 
- string_view::size_type string_view::find_last_not_of(char c,
 
-                                                      size_type pos) const
 
-   noexcept
 
- {
 
-   return find_last_not_of(string_view(&c, 1), pos);
 
- }
 
- string_view::size_type string_view::find_last_not_of(const char* s,
 
-                                                      size_type pos,
 
-                                                      size_type count) const
 
- {
 
-   return find_last_not_of(string_view(s, count), pos);
 
- }
 
- string_view::size_type string_view::find_last_not_of(const char* s,
 
-                                                      size_type pos) const
 
- {
 
-   return find_last_not_of(string_view(s), pos);
 
- }
 
- std::ostream& operator<<(std::ostream& o, string_view v)
 
- {
 
-   return o.write(v.data(), v.size());
 
- }
 
- std::string& operator+=(std::string& s, string_view v)
 
- {
 
-   s.append(v.data(), v.size());
 
-   return s;
 
- }
 
- }
 
- std::hash<cm::string_view>::result_type std::hash<cm::string_view>::operator()(
 
-   argument_type const& s) const noexcept
 
- {
 
-   // FNV-1a hash.
 
-   static KWIML_INT_uint64_t const fnv_offset_basis = 0xcbf29ce484222325;
 
-   static KWIML_INT_uint64_t const fnv_prime = 0x100000001b3;
 
-   KWIML_INT_uint64_t h = fnv_offset_basis;
 
-   for (char const& c : s) {
 
-     h = h ^ KWIML_INT_uint64_t(KWIML_INT_uint8_t(c));
 
-     h = h * fnv_prime;
 
-   }
 
-   return result_type(h);
 
- }
 
- #else
 
- // Avoid empty translation unit.
 
- void cm_string_view_cxx()
 
- {
 
- }
 
- #endif
 
 
  |