#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>

typedef struct Point Point;
struct Point {
    int x;
    int y;
};

Point add_no_pointers(Point p, Point q);
Point* add_with_pointers(Point* p, Point* q);
Point* create_point(int x, int y);
void print_point(Point p);

int main(int argc, char** argv) {

    // No pointers
    Point p1 = { .x = 5,  .y = 10 };
    Point p2 = { .x = 42, .y = 17 };
    Point p3 = add_no_pointers(p1, p2);
    print_point(p3);

    // With pointers
    Point* q1 = create_point(5, 10);
    Point* q2 = create_point(42, 17);
    Point* q3 = add_with_pointers(q1, q2);
    print_point(*q3); // Need to dereference here because q3 is a pointer

    return 0;
}


Point add_no_pointers(Point p, Point q) { // The points are copied into here
    Point result;
    result.x = p.x + q.x;
    result.y = p.y + q.y;
    return result;
}


Point* add_with_pointers(Point* p, Point* q) {
    Point* result = create_point(0, 0);
    result->x = p->x + q->x;
    result->y = p->y + q->y;
    return result;
}



Point* create_point(int x, int y) {
    Point* new_point = malloc(sizeof(Point));
    new_point->x = x;
    new_point->y = y;
    return new_point;
}

void print_point(Point p) {
    printf("(%d, %d)\n", p.x, p.y);
}
