/*
 * Copyright 2017, Data61, CSIRO (ABN 41 687 119 230)
 *
 * SPDX-License-Identifier: BSD-2-Clause
 */

/* A simple vector math library
 *
 * This file provides the macro VECTOR_2D_DEFINITION(name, T)
 * which expands into a vector math library with vectors represented
 * by tuples of type "T", and generated symbols (type and function
 * names) prefixed with "name".
 *
 * Also provided in this file are 2 default implementations:
 * vector_2d_long_int (long int)
 * vector_2d_double (double)
 *
 * e.g.
 * VECTOR_2D_DEFINITION(vector_2d_int, long int)
 * would expand to
 *
 * typedef struct {
 *     long int x;
 *     long int y;
 * } vector_2d_int_t;
 * static inline void vector_2d_int_add(vector_2d_int_t *a, vector_2d_int_t *b, vector_2d_int_t *result) {
 *     result->x = a->x + b->x;
 *     result->y = a->y + b->y;
 * }
 * static inline void vector_2d_int_subtract(vector_2d_int_t *a, vector_2d_int_t *b, vector_2d_int_t *result) {
 * ...etc
 */

#pragma once

#include <math.h>

#define VECTOR_2D_DEFINITION(name, T) \
typedef struct {        \
    T x;                \
    T y;                \
} name##_t;             \
static inline void name##_add(name##_t *a, name##_t *b, name##_t *result) {\
    result->x = a->x + b->x;\
    result->y = a->y + b->y;\
}\
static inline void name##_subtract(name##_t *a, name##_t *b, name##_t *result) {\
    result->x = a->x - b->x;\
    result->y = a->y - b->y;\
}\
static inline void name##_scalar_multiply(name##_t *a, T scalar, name##_t *result) {\
    result->x = a->x * scalar;\
    result->y = a->y * scalar;\
}\
static inline double name##_length(name##_t *a) {\
    return sqrt(a->x*a->x + a->y*a->y);\
}\
static inline double name##_angle(name##_t *a) {\
    return atan2(a->y, a->x);\
}\
static inline void name##_from_cartesian(T x, T y, name##_t *result) {\
    result->x = x;\
    result->y = y;\
}\
static inline void name##_from_polar(double length, double radians, name##_t  *result) {\
    result->x = length * cos(radians);\
    result->y = length * sin(radians);\
}

/* Default implementations for long int and double */
VECTOR_2D_DEFINITION(vector_2d_long_int, long int)
VECTOR_2D_DEFINITION(vector_2d_double, double)
