#include <common/iostream_debug_helpers.h>

#include <iostream>
#include <memory>
#include <vector>
#include <map>
#include <set>
#include <tuple>
#include <array>
#include <utility>


struct S1;
struct S2 {};

struct S3
{
    std::set<const char *> m1;
};

std::ostream & operator<<(std::ostream & stream, const S3 & what)
{
    stream << "S3 {m1=";
    dumpValue(stream, what.m1) << "}";
    return stream;
}

int main(int, char **)
{
    int x = 1;

    DUMP(x);
    DUMP(x, 1, &x);

    DUMP(std::make_unique<int>(1));
    DUMP(std::make_shared<int>(1));

    std::vector<int> vec{1, 2, 3};
    DUMP(vec);

    auto pair = std::make_pair(1, 2);
    DUMP(pair);

    auto tuple = std::make_tuple(1, 2, 3);
    DUMP(tuple);

    std::map<int, std::string> map{{1, "hello"}, {2, "world"}};
    DUMP(map);

    std::initializer_list<const char *> list{"hello", "world"};
    DUMP(list);

    std::array<const char *, 2> arr{{"hello", "world"}};
    DUMP(arr);

    //DUMP([]{});

    S1 * s = nullptr;
    DUMP(s);

    DUMP(S2());

    std::set<const char *> variants = {"hello", "world"};
    DUMP(variants);

    S3 s3 {{"hello", "world"}};
    DUMP(s3);

    return 0;
}