//===-- 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 <stdio.h>
#include <stdlib.h>
#include <stdint.h>

struct BagOfInts
{
    int x;
    int y;
    int z;
    BagOfInts(int X) :
    x(X),
    y(X+1),
    z(X+2) {}
};

struct BagOfFloats
{
    float x;
    float y;
    float z;
    BagOfFloats(float X) :
    x(X+0.334),
    y(X+0.500),
    z(X+0.667) {}
};

struct BagOfBags
{
    BagOfInts x;
    BagOfInts y;
    BagOfFloats z;
    BagOfFloats q;
    BagOfBags() : 
    x('E'),
    y('B'),
    z(1.1),
    q(20.11) {}
};

struct Plenty
{
    BagOfInts *some_values;
    int* array;
    int array_size;
    int bitfield;
    
    Plenty(int N, bool flagA, bool flagB) :
    some_values(new BagOfInts(N)),
    array(new int[N]),
    array_size(N),
    bitfield( (flagA ? 0x01 : 0x00) | (flagB ? 0x10 : 0x00) )
    {
        for (int j = 0; j < N; j++)
            array[j] = N-j;
    }
};

int main (int argc, const char * argv[])
{
    BagOfInts int_bag(6);
    BagOfFloats float_bag(2.71);
    
    BagOfBags bag_bag;
    
    Plenty plenty_of_stuff(5,true,false);
    
    plenty_of_stuff.bitfield = 0x11; // Set break point at this line.
    
    bag_bag.x.z = 12;
    
    return 0;
    
}

