// Copyright 2020 The Chromium OS 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 ML_BENCHMARK_SHARED_LIBRARY_BENCHMARK_FUNCTIONS_H_
#define ML_BENCHMARK_SHARED_LIBRARY_BENCHMARK_FUNCTIONS_H_

#include <base/files/file_path.h>
#include <base/macros.h>
#include <base/scoped_native_library.h>

#include "ml_benchmark/benchmark_functions.h"

namespace ml_benchmark {

typedef int32_t (*benchmark_function)(const void* config_bytes,
                                      int32_t config_bytes_size,
                                      void** results_bytes,
                                      int32_t* results_bytes_size);

typedef void (*free_benchmark_results_function)(void* results_bytes);

class SharedLibraryBenchmarkFunctions : public BenchmarkFunctions {
 public:
  explicit SharedLibraryBenchmarkFunctions(const base::FilePath& path);
  SharedLibraryBenchmarkFunctions(const SharedLibraryBenchmarkFunctions&) =
      delete;
  SharedLibraryBenchmarkFunctions& operator=(
      const SharedLibraryBenchmarkFunctions&) = delete;

  bool valid() const { return valid_; }

  int32_t BenchmarkFunction(const void* config_bytes,
                            int32_t config_bytes_size,
                            void** results_bytes,
                            int32_t* results_bytes_size) final;
  void FreeBenchmarkResults(void* results_bytes) final;

 private:
  base::ScopedNativeLibrary library_;
  benchmark_function benchmark_function_;
  free_benchmark_results_function free_benchmark_results_function_;
  bool valid_ = false;
};

}  // namespace ml_benchmark

#endif  // ML_BENCHMARK_SHARED_LIBRARY_BENCHMARK_FUNCTIONS_H_
