// 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_
