// Copyright 2019 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_FUZZING_CPP_FUZZ_INPUT_H_
#define LIB_FUZZING_CPP_FUZZ_INPUT_H_

#include <cstddef>
#include <cstdint>
#include <type_traits>

namespace fuzzing {

// A C++ wrapper class for arbitrary input bytes supplied to a fuzzer.
//
// API supports zero-copy and single-copy methods for extracting data, both of
// which can fail.
class FuzzInput final {
 public:
  FuzzInput(const uint8_t* data, size_t remaining) : data_(data), remaining_(remaining) {}

  // Consumes exactly |size| bytes of underlying data without copying. Returns
  // a pointer to bytes on success or |nullptr| on failure.
  const uint8_t* TakeBytes(size_t size);

  // Copies the next |sizeof(T)| bytes of underlying data into |out|. Returns
  // |true| on success or |false| on failure. In either case, client should
  // assume that data pointed to by |out| may have been modified.
  template <typename T>
  bool CopyObject(T* out) {
    static_assert(std::is_pod<T>());
    uint8_t* out_buf = reinterpret_cast<uint8_t*>(out);
    return CopyBytes(out_buf, sizeof(T));
  }

  // Copy exactly |size| bytes of underlying data into |out|. Returns |true| on
  // success or |false| on failure. In either case, client should assume that
  // data pointed to by |out| may have been modified.
  bool CopyBytes(uint8_t* out, size_t size);

 private:
  // Unowned raw pointer to remaining data in fuzzing input data. It is assumed
  // that the fuzzing input buffer will outlive this |FuzzInput| instance.
  const uint8_t* data_;
  // Size of remaining data pointed to by |data_|, in bytes.
  size_t remaining_;

  // Disallow implicit constructors.
  FuzzInput() = delete;
  FuzzInput(const FuzzInput&) = delete;
  FuzzInput(FuzzInput&&) = delete;
  FuzzInput& operator=(const FuzzInput&) = delete;
  FuzzInput& operator=(FuzzInput&&) = delete;
};

}  // namespace fuzzing

#endif  // LIB_FUZZING_CPP_FUZZ_INPUT_H_
