// Copyright 2014 The Android Open Source Project
//
// This software is licensed under the terms of the GNU General Public
// License version 2, as published by the Free Software Foundation, and
// may be copied, distributed, and modified under those terms.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.

#ifndef GLIB_H
#define GLIB_H

#include <stdarg.h>
#include <stddef.h>

// Types

typedef char gchar;
typedef int gint;
typedef unsigned int guint;
typedef unsigned short gushort;
typedef int gboolean;
typedef void* gpointer;
typedef const void* gconstpointer;

#define TRUE  1
#define FALSE 0

typedef void (*GFunc)(gpointer data, gpointer user_data);

typedef int (*GCompareFunc)(gconstpointer a,
                            gconstpointer b);

typedef int (*GCompareDataFunc)(gconstpointer a,
                                gconstpointer b,
                                gpointer user_data);

typedef gboolean (*GEqualFunc)(gconstpointer a, gconstpointer b);

typedef guint (*GHashFunc)(gconstpointer key);

typedef void (*GHFunc)(gpointer key,
                       gpointer value,
                       gpointer user_data);

typedef gboolean (*GHRFunc)(gpointer key,
                            gpointer value,
                            gpointer user_data);

// Constants.

#ifdef _WIN32
#define G_DIR_SEPARATOR_S "\\"
#else
#define G_DIR_SEPARATOR_S  "/"
#endif

// Testing

// TODO(digit): Turn assertions on.

void g_critical(const char* fmt, ...);

void g_panic(const char* fmt, ...) __attribute__((noreturn));

#define g_assert(condition)  do { \
    if (!(condition)) { \
      g_panic("%s:%d: Assertion failure: %s\n", \
              __FILE__, \
              __LINE__, \
              #condition); \
      } \
  } while (0)

#define g_assert_not_reached()  \
    g_panic("%s:%d: Assertion failure: NOT REACHED\n", __FILE__, __LINE__)

// Heap allocation.
void* g_malloc(size_t size);
void* g_malloc0(size_t size);
void* g_realloc(void* ptr, size_t size);
void g_free(void* ptr);

#define g_new(type, count)         ((type*) g_malloc(sizeof(type) * (count)))
#define g_new0(type, count)        ((type*) g_malloc0(sizeof(type) * (count)))

#define g_renew(type, mem, count)  \
    ((type*) g_realloc((mem), sizeof(type) * (count)))

// Strings.
int g_vasprintf(char** str, const char* fmt, va_list args);
char* g_strdup(const char* str);
char* g_strndup(const char* str, size_t size);
char* g_strdup_printf(const char* fmt, ...);
char* g_strdup_vprintf(const char* fmt, va_list args);

char** g_strsplit(const char* str, const char* sep, int max_tokens);
void g_strfreev(char** strings);

gboolean g_str_equal(const void* s1, const void* s2);
guint g_str_hash(const void* str);

// Atomic operations

void g_atomic_int_inc(int volatile* atomic);

gboolean g_atomic_int_dec_and_test(int volatile* atomic);

// Single-linked lists

typedef struct _GSList {
  void* data;
  struct _GSList* next;
} GSList;

void g_slist_free(GSList* list);
GSList* g_slist_last(GSList* list);
GSList* g_slist_find(GSList* list, gconstpointer data);
GSList* g_slist_append(GSList* list, gpointer data);
GSList* g_slist_prepend(GSList* list, gpointer data);
GSList* g_slist_remove(GSList* list, gconstpointer data);
void g_slist_foreach(GSList* list, GFunc func, gpointer user_data);
GSList* g_slist_sort(GSList* list, GCompareFunc compare_func);

// Hash tables

typedef struct _GHashTable GHashTable;

GHashTable* g_hash_table_new(GHashFunc hash_func,
                             GEqualFunc key_equal_func);

void g_hash_table_destroy(GHashTable* hash_table);

void g_hash_table_insert(GHashTable* hash_table,
                         void* key,
                         void* value);

void* g_hash_table_lookup(GHashTable* hash_table,
                          const void* key);

gboolean g_hash_table_remove(GHashTable* hash_table,
                         const void* key);

void g_hash_table_foreach(GHashTable* hash_table,
                          GHFunc func,
                          gpointer user_data);

gpointer g_hash_table_find(GHashTable* hash_table,
                           GHRFunc predicate,
                           gpointer user_data);

guint g_hash_table_size(GHashTable* hash_table);

GHashTable* g_hash_table_ref(GHashTable* hash_table);

void g_hash_table_unref(GHashTable* hash_table);


// Queues

typedef struct _GQueueNode GQueueNode;

typedef struct _GQueue {
  GQueueNode* head;
  GQueueNode* tail;
  guint length;
} GQueue;

GQueue* g_queue_new(void);

void g_queue_free(GQueue* queue);

void g_queue_push_tail(GQueue* queue, void* data);

void* g_queue_peek_head(GQueue* queue);

void* g_queue_pop_head(GQueue* queue);

gboolean g_queue_is_empty(GQueue* queue);

#ifdef _WIN32
char* g_win32_error_message(int error);
#endif

// GSource etc...

// Opaque data type.
typedef struct GSource GSource;

typedef gboolean (*GSourceFunc)(gpointer user_data);

typedef struct {
  gboolean (*prepare)(GSource* source, gint* timeout);
  gboolean (*check)(GSource* source);
  gboolean (*dispatch)(GSource* source,
                       GSourceFunc callback,
                       gpointer user_data);
  void (*finalize)(GSource* source);
} GSourceFuncs;

typedef struct GPollFD {
#if defined(_WIN32) && defined(__LP64__)
  int64_t fd;
#else
  int fd;
#endif
  gushort events;
  gushort revents;
} GPollFD;

#endif  // GLIB_H
