// Copyright 2020 the V8 project 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 V8_BASE_PLATFORM_WRAPPERS_H_
#define V8_BASE_PLATFORM_WRAPPERS_H_

#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "src/base/base-export.h"

#if defined(V8_OS_STARBOARD)
#include "starboard/memory.h"
#endif

namespace v8 {
namespace base {

#if !defined(V8_OS_STARBOARD)

// Common libstd implementations.
// inline implementations are preferred here due to performance concerns.
inline void* Malloc(size_t size) { return malloc(size); }

inline void* Realloc(void* memory, size_t size) {
  return realloc(memory, size);
}

inline void Free(void* memory) { return free(memory); }

inline void* Calloc(size_t count, size_t size) { return calloc(count, size); }

inline void* Memcpy(void* dest, const void* source, size_t count) {
  return memcpy(dest, source, count);
}

inline FILE* Fopen(const char* filename, const char* mode) {
  return fopen(filename, mode);
}

inline int Fclose(FILE* stream) { return fclose(stream); }

#else  // V8_OS_STARBOARD

inline void* Malloc(size_t size) { return SbMemoryAlloc(size); }

inline void* Realloc(void* memory, size_t size) {
  return SbMemoryReallocate(memory, size);
}

inline void Free(void* memory) { return SbMemoryDeallocate(memory); }

inline void* Calloc(size_t count, size_t size) {
  return SbMemoryCalloc(count, size);
}

inline void* Memcpy(void* dest, const void* source, size_t count) {
  return SbMemoryCopy(dest, source, count);
}

inline FILE* Fopen(const char* filename, const char* mode) { return NULL; }

inline int Fclose(FILE* stream) { return -1; }

#endif  // V8_OS_STARBOARD

}  // namespace base
}  // namespace v8

#endif  // V8_BASE_PLATFORM_WRAPPERS_H_