// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
#define aloc(T) ((T *)malloc(sizeof(T)))

#include <stdint.h>
#include <stdlib.h>
#include <stdbool.h>

bool Function1Bool(bool x) { return !x; }

uint8_t Function1Uint8(uint8_t x) { return x + 42; }

uint16_t Function1Uint16(uint16_t x) { return x + 42; }

uint32_t Function1Uint32(uint32_t x) { return x + 42; }

uint64_t Function1Uint64(uint64_t x) { return x + 42; }

int8_t Function1Int8(int8_t x) { return x + 42; }

int16_t Function1Int16(int16_t x) { return x + 42; }

int32_t Function1Int32(int32_t x) { return x + 42; }

int64_t Function1Int64(int64_t x) { return x + 42; }

intptr_t Function1IntPtr(intptr_t x) { return x + 42; }

float Function1Float(float x) { return x + 42.0f; }

double Function1Double(double x) { return x + 42.0; }

struct Struct1
{
    int8_t a;
    int32_t data[3][1][2];
};

struct Struct1 *getStruct1()
{
    struct Struct1 *s = aloc(struct Struct1);
    s->a = 0;
    s->data[0][0][0] = 1;
    s->data[0][0][1] = 2;
    s->data[1][0][0] = 3;
    s->data[1][0][1] = 4;
    s->data[2][0][0] = 5;
    s->data[2][0][1] = 6;
    return s;
}

struct Struct3
{
    int a;
    int b;
    int c;
};

struct Struct3 Function1StructReturnByValue(int a, int b, int c)
{
    struct Struct3 s;
    s.a = a;
    s.b = b;
    s.c = c;
    return s;
}

int Function1StructPassByValue(struct Struct3 sum_a_b_c)
{
    return sum_a_b_c.a + sum_a_b_c.b + sum_a_b_c.c;
}
