// // Copyright 2017 The Abseil Authors. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // #ifndef ABSL_STRINGS_STR_SPLIT_H_ #define ABSL_STRINGS_STR_SPLIT_H_ #include #include #include "third_party/absl/strings/string_view.h" namespace absl { namespace internal { class Splitter { public: Splitter(absl::string_view str, absl::string_view delim, bool allow_empty) { size_t current_pos = 0; size_t found_pos = 0; while ((found_pos = str.find_first_of(delim, current_pos)) != absl::string_view::npos) { if ((allow_empty && found_pos >= current_pos) || (!allow_empty && found_pos > current_pos)) { result_.push_back(str.substr(current_pos, found_pos - current_pos)); } current_pos = found_pos + 1; } if (str.size() > current_pos) { result_.push_back(str.substr(current_pos, str.size() - current_pos)); } } template operator std::vector() const; using const_iterator = std::vector::const_iterator; const_iterator begin() const { return result_.begin(); } const_iterator end() const { return result_.end(); } private: std::vector result_; }; template <> inline Splitter::operator std::vector() const { std::vector x(result_.size()); for (size_t i = 0; i < x.size(); ++i) x[i].assign(result_[i].data(), result_[i].size()); return x; } template <> inline Splitter::operator std::vector() const { return result_; } } // namespace internal inline constexpr bool AllowEmpty() { return true; }; inline internal::Splitter StrSplit(absl::string_view str, absl::string_view delim, bool allow_empty = false) { return internal::Splitter(str, delim, allow_empty); } inline internal::Splitter StrSplit(absl::string_view str, const char c, bool allow_empty = false) { char delim[2]; delim[0] = c; delim[1] = '\0'; return internal::Splitter(str, delim, allow_empty); } } // namespace absl #endif // ABSL_STRINGS_STR_SPLIT_H_