#include <stdint.h>

/* This is the code generated by cbindgen 0.12.1 for the `enum TT`
 * type in nonclike.rs . */
enum TT_Tag {
  AA,
  BB,
};
typedef uint8_t TT_Tag;

typedef struct {
  uint64_t _0;
  uint64_t _1;
} AA_Body;

typedef struct {
  TT_Tag tag;
  union {
    AA_Body aa;
  };
} TT;

/* This is the code generated by cbindgen 0.12.1 for the `enum T` type
 * in nonclike.rs . */
enum T_Tag {
  A,
  B,
};
typedef uint8_t T_Tag;

typedef struct {
  uint64_t _0;
} A_Body;

typedef struct {
  T_Tag tag;
  union {
    A_Body a;
  };
} T;

uint64_t tt_add(TT a, TT b) {
  if (a.tag == AA && b.tag == AA) {
    return a.aa._0 + a.aa._1 + b.aa._0 + b.aa._1;
  } else if (a.tag == AA) {
    return a.aa._0 + a.aa._1;
  } else if (b.tag == BB) {
    return b.aa._0 + b.aa._1;
  } else {
    return 0;
  }
}

uint64_t t_add(T a, T b) {
  if (a.tag == A && b.tag == A) {
    return a.a._0 + b.a._0;
  } else if (a.tag == AA) {
    return a.a._0;
  } else if (b.tag == BB) {
    return b.a._0;
  } else {
    return 0;
  }
}

TT tt_new(uint64_t a, uint64_t b) {
  TT tt = {
    .tag = AA,
    .aa = {
      ._0 = a,
      ._1 = b,
    },
  };
  return tt;
}

T t_new(uint64_t a) {
  T t = {
    .tag = A,
    .a = {
      ._0 = a,
    },
  };
  return t;
}
