#ifndef KIT_SHARED_MEMORY_H
#define KIT_SHARED_MEMORY_H

#include "status.h"
#include "string_ref.h"

#if !defined(_WIN32) || defined(__CYGWIN__)
#  include <limits.h>
#endif

#ifdef __cplusplus
extern "C" {
#endif

typedef struct {
  s32 status;
  i64 size;
  u8 *bytes;
#if defined(_WIN32) && !defined(__CYGWIN__)
  void *_handle;
#else
  i8   _owned;
  char _name[NAME_MAX + 1];
#endif
} kit_shared_memory_t;

enum {
  KIT_SHARED_MEMORY_OPEN,
  KIT_SHARED_MEMORY_CREATE,
};

kit_shared_memory_t kit_shared_memory_open(kit_str_t name, i64 size,
                                           i32 mode);
s32                 kit_shared_memory_close(kit_shared_memory_t *mem);
s32                 kit_shared_memory_clean(kit_str_t name);

#ifdef __cplusplus
}
#endif

#define shared_memory_t kit_shared_memory_t
#define shared_memory_clean kit_shared_memory_clean
#define shared_memory_open kit_shared_memory_open
#define shared_memory_close kit_shared_memory_close
#define SHARED_MEMORY_OPEN KIT_SHARED_MEMORY_OPEN
#define SHARED_MEMORY_CREATE KIT_SHARED_MEMORY_CREATE

#endif