/*
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 */
