#include <iostream>
#include <math.h>
using namespace std;

#include "clock_htl.h"

/*
union uno {
    int wert;
    char *farbe;
};
*/

struct uno {
    int wert;
    char *farbe;
};

struct point {
    int x;
    int y;
};

struct point3d {
    int x;
    int y;
    int z;
};

double dist(double ax, double bx, double ay, double by) {
    return sqrt((ax - bx) * (ax - bx) + (ay - by) * (ay - by));
}

double dist(int ax, int bx, int ay, int by) {
    return sqrt((ax - bx) * (ax - bx) + (ay - by) * (ay - by));
}

double dist(point a, point b) {
    return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));
}

void print(point a)
{
    cout << "Point " << a.x << "/" << a.y << endl;
}

void print(point *a)
{
    cout << "Point " << a->x << "/" << a->y << endl;
}

// Wir brauchen kein return, da wir die variablen direkt ändern, und nicht eine kopie anlegen und diese bearbeiten.
// Man sollte nicht zwei Funktionen mit gleichem Namen haben, die bis auf die Pointer oder nicht Pointer sich nicht unterscheiden, weil sich dann der Compiler nicht auskennt.
void add(point *a, point *b)
{
    if(!a || !b){
        return;
    }
    // Alternativ:
    if(a == nullptr || b == nullptr){
        return;
    }
    a->x += b->x;
    a->y += b->y;
    print(a);
    // Dereferenzieren (Pointer zu Eigentlich Daten machen und übertragen) wird mit * gemacht.
}



int main(int, char**){
    /*point *d = NULL;
    d = nullptr;
    uno karte;
    karte.farbe = "Rot";
    karte.wert = 7;

    point3d e;
    e.x = 10;
    e.y = 20;

    // pointer von point d wird auf pointer von point_3d gesetzt.
    // Das geht nicht, weil es ein anderer Speichertyp ist, er wirft aber KEINEN FEHLER!
    // NICHT MACHEN!
    // d = (point*)&e;

    point a;
    a.x = 15;
    a.y = 12;

    d = &a;

    point b;
    b.x = -4;
    b.y = 0;

    point c;
    c.x = 2;
    c.y = 2;
    
    
    
    add(&a, d);
    // Mit & geben wir nicht das Element, sondern den Pointer des Elements mit.
    // Dann kann in der Funktion direkt mit den Werten arbeiten.
    // Wenn man eine Addresse hat, und sie wieder als Kopie des Elements (wie bei normalen Fkt.) senden will,
    // nutzt man die Dereferenzierung mit *

    cout << "Distance" << endl << dist(12.5, 10.5, (double)8, (double)2) << endl;

    print(a);
    //cout << karte.farbe << endl << karte.wert << endl;
    //cout << a.x << endl << a.y << endl;
    */

    clock_htl a;
    clock_htl b;
    for(int i = 0; i < 1000; i++)
    {
        a.tick();
        b.tick();   
    }

    a.print();
    b.print();
}
