| // 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. | |
| // TokenStreamView is the interface to parsers. | |
| #ifndef VERIBLE_COMMON_TEXT_TOKEN_STREAM_VIEW_H_ | |
| #define VERIBLE_COMMON_TEXT_TOKEN_STREAM_VIEW_H_ | |
| #include <cstddef> | |
| #include <functional> | |
| #include <vector> | |
| #include "common/text/token_info.h" | |
| #include "common/util/iterator_range.h" | |
| namespace verible { | |
| // TODO(fangism): If we make this std::list, then we never have to worry | |
| // about iterator invalidation due to insertion and deletion. | |
| // Evaluate this decision later. | |
| using TokenSequence = std::vector<TokenInfo>; | |
| // Slice of tokens that works like a container. | |
| using TokenRange = iterator_range<TokenSequence::const_iterator>; | |
| // TokenStreamView is the type that is transformed and returned by filters. | |
| using TokenStreamView = std::vector<TokenSequence::const_iterator>; | |
| // TokenStreamReferenceView is TokenStreamView with writeable iterators. | |
| // This should only be used in functions that intend to transform a token stream | |
| // such as when applying context to alter token symbols. | |
| using TokenStreamReferenceView = std::vector<TokenSequence::iterator>; | |
| // Slice of TokenSequence iterators that works like a container | |
| using TokenViewRange = iterator_range<TokenStreamView::const_iterator>; | |
| // Tokens that evaluate to false with these predicates are removed. | |
| using TokenFilterPredicate = std::function<bool(const TokenInfo&)>; | |
| // Populates a TokenStreamView with every iterator of a TokenSequence. | |
| void InitTokenStreamView(const TokenSequence&, TokenStreamView*); | |
| // Create a new TokenStreamView with tokens conditionally omitted. | |
| void FilterTokenStreamView(const TokenFilterPredicate& keep, | |
| const TokenStreamView& src, TokenStreamView* dest); | |
| // Remove tokens from a TokenStreamView according to a predicate. | |
| void FilterTokenStreamViewInPlace(const TokenFilterPredicate& keep, | |
| TokenStreamView*); | |
| // Returns iterator range of TokenSequence iterators that span the given file | |
| // offsets. The second iterator points 1-past-the-end of the range. | |
| TokenViewRange TokenViewRangeSpanningOffsets(const TokenStreamView& view, | |
| absl::string_view range); | |
| } // namespace verible | |
| #endif // VERIBLE_COMMON_TEXT_TOKEN_STREAM_VIEW_H_ |