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