// Single line comment

/*
 Multi line comment
*/

/+
 Multi line doc comment
+/

import std.stdio;

// Integers
ushort a = 0;
short b = 1;
int c = 2;
uint d = 3;
long e = 4;
ulong f = 5;
size_t g = 90;

// Boolean
bool h = true;
bool m = false;

// Floating point
float j = 7.9;
real k = 0;
double l = 0.8;

// Strings, chars, bytes
string s = "derp";
string t = null;
char u = 'a';
wchar v = 'b';
byte w = 0;
ubyte x = 0;

// Struct
struct Thing {
    int count;
}

auto thing = Thing();
thing.count = 35;
writefln("thing.count: %d", thing.count);

// Class
class Animal {
    string _name;

    string name() { return _name; }

    this(string name) {
        _name = name;
    }
}

auto ani = new Animal("dog");
writefln("ani.name: %s", ani.name);

// Class Inheritance
class Dog : Animal {
    this(string name) {
        super(name);
    }

    void bark() {
        writeln("Woof!");
    }
}

auto dog = new Dog("Rover");
writefln("dog.name: %s", dog.name);
dog.bark();

// For loop
for(size_t i=0; i<5; ++i) {
    writefln("i: %d", i);
}

// For each loop
foreach(i; [0, 1, 2, 3, 4]) {
    writefln("i: %d", i);
}

// While loop
int counter = 0;
while(counter < 5) {
    writefln("counter: %d", counter);
    counter++;
}

// Do while loop
counter = 0;
do {
    writefln("counter: %d", counter);
    counter++;
} while(counter < 5);


// If condition
bool flag_a = true;
bool flag_b = false;
if(flag_a && flag_b) {

}

// Switch condition
string name = "Derper";
switch(name) {
    case "Bobrick": write("Stupid name"); break;
    case "Rickyrick": write("Awesome name"); break;
    default: write("Unexpected name"); break;
}