/*
The MIT License(MIT)
Copyright(c) 2016 Peter Goldsborough

Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions :

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/

#ifndef VECTOR_H
#define VECTOR_H

#include <stdbool.h>
#include <stddef.h>

/***** DEFINITIONS *****/

#define VECTOR_MINIMUM_CAPACITY 2
#define VECTOR_GROWTH_FACTOR 2
#define VECTOR_SHRINK_THRESHOLD (1 / 4)

#define VECTOR_ERROR -1
#define VECTOR_SUCCESS 0

#define VECTOR_UNINITIALIZED NULL
#define VECTOR_INITIALIZER \
  { 0, 0, 0, VECTOR_UNINITIALIZED }

/***** STRUCTURES *****/

typedef struct Vector {
  size_t size;
  size_t capacity;
  size_t element_size;

  void *data;
} Vector;

typedef struct Iterator {
  void *pointer;
  size_t element_size;
} Iterator;

/***** METHODS *****/

/* Constructor */
int aom_vector_setup(Vector *vector, size_t capacity, size_t element_size);

/* Copy Constructor */
int aom_vector_copy(Vector *destination, Vector *source);

/* Copy Assignment */
int aom_vector_copy_assign(Vector *destination, Vector *source);

/* Move Constructor */
int aom_vector_move(Vector *destination, Vector *source);

/* Move Assignment */
int aom_vector_move_assign(Vector *destination, Vector *source);

int aom_vector_swap(Vector *destination, Vector *source);

/* Destructor */
int aom_vector_destroy(Vector *vector);

/* Insertion */
int aom_vector_push_back(Vector *vector, void *element);
int aom_vector_push_front(Vector *vector, void *element);
int aom_vector_insert(Vector *vector, size_t index, void *element);
int aom_vector_assign(Vector *vector, size_t index, void *element);

/* Deletion */
int aom_vector_pop_back(Vector *vector);
int aom_vector_pop_front(Vector *vector);
int aom_vector_erase(Vector *vector, size_t index);
int aom_vector_clear(Vector *vector);

/* Lookup */
void *aom_vector_get(Vector *vector, size_t index);
const void *aom_vector_const_get(const Vector *vector, size_t index);
void *aom_vector_front(Vector *vector);
void *aom_vector_back(Vector *vector);
#define VECTOR_GET_AS(type, aom_vector_pointer, index) \
  *((type *)aom_vector_get((aom_vector_pointer), (index)))

/* Information */
bool aom_vector_is_initialized(const Vector *vector);
size_t aom_vector_byte_size(const Vector *vector);
size_t aom_vector_free_space(const Vector *vector);
bool aom_vector_is_empty(const Vector *vector);

/* Memory management */
int aom_vector_resize(Vector *vector, size_t new_size);
int aom_vector_reserve(Vector *vector, size_t minimum_capacity);
int aom_vector_shrink_to_fit(Vector *vector);

/* Iterators */
Iterator aom_vector_begin(Vector *vector);
Iterator aom_vector_end(Vector *vector);
Iterator aom_vector_iterator(Vector *vector, size_t index);

void *aom_iterator_get(Iterator *iterator);
#define ITERATOR_GET_AS(type, iterator) *((type *)aom_iterator_get((iterator)))

int aom_iterator_erase(Vector *vector, Iterator *iterator);

void aom_iterator_increment(Iterator *iterator);
void aom_iterator_decrement(Iterator *iterator);

void *aom_iterator_next(Iterator *iterator);
void *aom_iterator_previous(Iterator *iterator);

bool aom_iterator_equals(Iterator *first, Iterator *second);
bool aom_iterator_is_before(Iterator *first, Iterator *second);
bool aom_iterator_is_after(Iterator *first, Iterator *second);

size_t aom_iterator_index(Vector *vector, Iterator *iterator);

#define VECTOR_FOR_EACH(aom_vector_pointer, iterator_name)               \
  for (Iterator(iterator_name) = aom_vector_begin((aom_vector_pointer)), \
      end = aom_vector_end((aom_vector_pointer));                        \
       !aom_iterator_equals(&(iterator_name), &end);                     \
       aom_iterator_increment(&(iterator_name)))

#endif /* VECTOR_H */
