// 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_standard_layout<T>() && std::is_trivially_copyable<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_
