| // Copyright 2017-2020 The Verible 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. |
| |
| #include "common/text/token_stream_view.h" |
| |
| #include <algorithm> |
| #include <cstddef> |
| #include <iterator> |
| #include <vector> |
| |
| #include "common/text/token_info.h" |
| #include "common/util/iterator_range.h" |
| |
| namespace verible { |
| |
| void InitTokenStreamView(const TokenSequence& tokens, TokenStreamView* view) { |
| view->resize(tokens.size()); |
| auto iter = tokens.begin(); |
| const auto end = tokens.end(); |
| auto view_iter = view->begin(); |
| for (; iter != end; ++iter, ++view_iter) { |
| *view_iter = iter; |
| } |
| } |
| |
| void FilterTokenStreamView(const TokenFilterPredicate& keep, |
| const TokenStreamView& src, TokenStreamView* dest) { |
| dest->clear(); |
| dest->reserve(src.size() / 2); // Estimate size of filtered result. |
| for (const auto& iter : src) { |
| if (keep(*iter)) { |
| dest->push_back(iter); |
| } |
| } |
| } |
| |
| void FilterTokenStreamViewInPlace(const TokenFilterPredicate& keep, |
| TokenStreamView* view) { |
| TokenStreamView temp; |
| FilterTokenStreamView(keep, *view, &temp); |
| view->swap(temp); // old stream view deleted at end-of-scope |
| } |
| |
| static bool TokenLocationLess(const TokenSequence::const_iterator& token_iter, |
| const char* offset) { |
| return token_iter->text().begin() < offset; |
| } |
| |
| TokenViewRange TokenViewRangeSpanningOffsets(const TokenStreamView& view, |
| absl::string_view range) { |
| const auto lower = range.begin(); |
| const auto upper = range.end(); |
| const auto left = |
| std::lower_bound(view.cbegin(), view.cend(), lower, &TokenLocationLess); |
| const auto right = |
| std::lower_bound(left, view.cend(), upper, &TokenLocationLess); |
| return make_range(left, right); |
| } |
| |
| } // namespace verible |