// 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 LIB_FIDL_CPP_VECTOR_VIEW_H_
#define LIB_FIDL_CPP_VECTOR_VIEW_H_

#include <zircon/fidl.h>

namespace fidl {

template <typename T>
class VectorView : public fidl_vector_t {
 public:
  VectorView() : fidl_vector_t{} {}
  VectorView(uint64_t count, T* data) : fidl_vector_t{count, data} {}

  uint64_t count() const { return fidl_vector_t::count; }
  void set_count(uint64_t count) { fidl_vector_t::count = count; }

  const T* data() const { return static_cast<T*>(fidl_vector_t::data); }
  void set_data(T* data) { fidl_vector_t::data = data; }

  T* mutable_data() const { return static_cast<T*>(fidl_vector_t::data); }

  bool is_null() const { return fidl_vector_t::data == nullptr; }
  bool empty() const { return fidl_vector_t::count == 0; }

  const T& at(size_t offset) const { return data()[offset]; }
  T& at(size_t offset) { return mutable_data()[offset]; }

  const T& operator[](size_t offset) const { return at(offset); }
  T& operator[](size_t offset) { return at(offset); }

  T* begin() { return mutable_data(); }
  const T* begin() const { return data(); }
  const T* cbegin() const { return data(); }

  T* end() { return mutable_data() + count(); }
  const T* end() const { return data() + count(); }
  const T* cend() const { return data() + count(); }

  fidl_vector_t* impl() { return this; }
};

}  // namespace fidl

#endif  // LIB_FIDL_CPP_VECTOR_VIEW_H_
