// Copyright 2017 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef PERIDOT_LIB_CONVERT_COLLECTION_VIEW_H_
#define PERIDOT_LIB_CONVERT_COLLECTION_VIEW_H_

#include <algorithm>
#include <iterator>

#include <src/lib/fxl/logging.h>

namespace convert {

// View over the given collection. Doesn't take ownership of the collection that
// must outlives this class.
//
// Single-argument constructor is marked as NOLINT to suppress
// `google-explicit-constructor` clang-tidy warning - in this case the implicit
// conversion is intended.
template <typename T>
class CollectionView {
 public:
  using iterator = typename T::iterator;
  using const_iterator = typename T::const_iterator;

  CollectionView(T& collection)  // NOLINT
      : collection_(collection),
        begin_(std::begin(collection)),
        end_(std::end(collection)) {}
  CollectionView(T& collection, iterator begin, iterator end)
      : collection_(collection),
        begin_(std::move(begin)),
        end_(std::move(end)) {}
  CollectionView(const CollectionView& collection) = default;
  CollectionView& operator=(const CollectionView& collection) = default;

  const_iterator begin() const { return begin_; }
  const_iterator end() const { return end_; }
  iterator begin() { return begin_; }
  iterator end() { return end_; }

  // Returns a view over this view with the first element removed.
  CollectionView Tail() const {
    if (begin_ == end_) {
      return CollectionView<T>(collection_, end_, end_);
    }
    return CollectionView(collection_, std::next(begin_), end_);
  }

  // Returns a sub view of this view.
  CollectionView SubCollection(size_t begin, size_t length) const {
    if (begin >= size()) {
      return CollectionView<T>(collection_, end_, end_);
    }
    auto begin_it = std::next(begin_, begin);
    size_t final_length =
        std::min(length, static_cast<size_t>(std::distance(begin_it, end_)));
    return CollectionView(collection_, begin_it,
                          std::next(begin_it, final_length));
  }

  const auto& operator[](size_t pos) const {
    FXL_DCHECK(pos < size());
    return *std::next(begin_, pos);
  }

  auto& operator[](size_t pos) {
    FXL_DCHECK(pos < static_cast<size_t>(std::distance(begin_, end_)));
    return *std::next(begin_, pos);
  }

  bool empty() const { return begin_ == end_; }

  size_t size() const { return std::distance(begin_, end_); }

 private:
  T& collection_;
  iterator begin_;
  iterator end_;
};

}  // namespace convert

#endif  // PERIDOT_LIB_CONVERT_COLLECTION_VIEW_H_
