//===-- main.cpp ------------------------------------------------*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

#include <cstdint>
#include <string>

struct complex_type
{
    int i;
    struct { long l; } inner;
    complex_type *complex_ptr;
};

struct pcomplex_type : complex_type
{
    pcomplex_type(const complex_type &complx_base, const complex_type &complx_member)
        : complex_type(complx_base), complx(complx_member) { }
    complex_type complx;
    static int si;
};

int pcomplex_type::si;

struct struct_with_unions
{
    struct_with_unions(): u_i(1), u1(-1) {}
    union 
    {
        int u_i;
        int u_j;  
    };
    union 
    {
        int  u1;
        struct
        {
            short s1;
            short s2;
        };
    };
};

void
var_update_test(void)
{
    long l = 1;
    complex_type complx = { 3, { 3L }, &complx };
    complex_type complx_array[2] = { { 4, { 4L }, &complx_array[1] }, { 5, { 5 }, &complx_array[0] } };
    // BP_var_update_test_init

    l = 0;
    // BP_var_update_test_l

    complx.inner.l = 2;
    // BP_var_update_test_complx

    complx_array[1].inner.l = 4;
    // BP_var_update_test_complx_array
}

void
var_list_children_test(void)
{
    complex_type complx = { 3, { 3L }, &complx };
    complex_type complx_array[2] = { { 4, { 4L }, &complx_array[1] }, { 5, { 5 }, &complx_array[0] } };
    pcomplex_type pcomplx({ 6, { 6L }, &pcomplx}, { 7, { 7L }, &pcomplx});

    // BP_var_list_children_test
}

void
gdb_set_show_print_char_array_as_string_test(void)
{
    const char *cp = "\t\"hello\"\n";
    const char ca[] = "\t\"hello\"\n";
    const char16_t *u16p = u"\t\"hello\"\n";
    const char16_t u16a[] = u"\t\"hello\"\n";
    const char32_t *u32p = U"\t\"hello\"\n";
    const char32_t u32a[] = U"\t\"hello\"\n";

    const char16_t* u16p_rus = u"\\Аламо-сквер";
    const char16_t  u16a_rus[] = u"\\Бейвью";
    const char32_t* u32p_rus = U"\\Чайнатаун";
    const char32_t  u32a_rus[] = U"\\Догпатч";

    // BP_gdb_set_show_print_char_array_as_string_test
}

void
cpp_stl_types_test(void)
{
    std::string std_string = "hello";
    // BP_cpp_stl_types_test
}

void
unnamed_objects_test(void)
{
    struct_with_unions swu;
    // BP_unnamed_objects_test
}

struct not_str
{
    not_str(char _c, int _f)
        : c(_c), f(_f) { }
    char c;
    int f;
};

void
gdb_set_show_print_expand_aggregates(void)
{
    complex_type complx = { 3, { 3L }, &complx };
    complex_type complx_array[2] = { { 4, { 4L }, &complx_array[1] }, { 5, { 5 }, &complx_array[0] } };
    not_str nstr('a', 0);

    // BP_gdb_set_show_print_expand_aggregates
}

void
gdb_set_show_print_aggregate_field_names(void)
{
    complex_type complx = { 3, { 3L }, &complx };
    complex_type complx_array[2] = { { 4, { 4L }, &complx_array[1] }, { 5, { 5 }, &complx_array[0] } };

    // BP_gdb_set_show_print_aggregate_field_names
}

int g_MyVar = 3;
static int s_MyVar = 4;

int
main(int argc, char const *argv[])
{
    int a = 10, b = 20;
    s_MyVar = a + b;
    var_update_test();
    var_list_children_test();
    gdb_set_show_print_char_array_as_string_test();
    cpp_stl_types_test();
    unnamed_objects_test();
    gdb_set_show_print_expand_aggregates();
    gdb_set_show_print_aggregate_field_names();
    return 0; // BP_return
}
