%---------------------------------------------------------------------------%
% vim: ft=mercury ts=4 sw=4 et
%---------------------------------------------------------------------------%

:- module test_repn.
:- interface.

:- import_module test_repn_helper_1.

:- import_module char.

:- type only_functor_local1
    --->    ofl1_f1(
                animal, d, int8, animal, uint32, animal
            ).

:- type only_functor_local2
    --->    ofl2_f1(
                nt(d), animal, int8, uint16
            ).

:- type only_functor_remote1
    --->    ofr1_f1(                                    % on 64 bit machines
                animal, animal, d,                      % word 0
                int,                                    % word 1
                string,                                 % word 2
                animal, int8, animal, uint32, animal    % word 3
            ).

:- type only_functor_remote2
    --->    ofr2_f1(                                    % on 64 bit machines
                d, nt(animal), d, animal, d,            % word 0
                int,                                    % word 1
                string,                                 % word 2
                animal, int8, animal, uint32, animal    % word 3
            ).

:- type more_functors_local1
    --->    mfl1_f1(
                animal, int8, animal, uint32, animal
            )
    ;       mfl1_f2(
                animal, animal
            ).

:- type more_functors_local2
    --->    mfl2_f1
    ;       mfl2_f2
    ;       mfl2_f3
    ;       mfl2_f4(
                animal, int8, animal, uint32, animal
            )
    ;       mfl2_f5(
                animal, animal
            ).

:- type more_functors_remote1
    --->    mfr1_f1
    ;       mfr1_f2
    ;       mfr1_f3
    ;       mfr1_f4(
                int, int
            )
    ;       mfr1_f5(
                int, float
            ).

:- type more_functors_local_remote1
    --->    mflr1_f1
    ;       mflr1_f2
    ;       mflr1_f3
    ;       mflr1_f4(
                char, animal
            )
    ;       mflr1_f5(
                int, int
            ).

:- type more_functors_local_remote2
    --->    mflr2_f1
    ;       mflr2_f2
    ;       mflr2_f3
    ;       mflr2_f4(
                char, animal
            )
    ;       mflr2_f5(
                float, int, float
            ).

:- type more_functors_local_remote3
    --->    mflr3_f1
    ;       mflr3_f2
    ;       mflr3_f3(
                char, animal
            )
    ;       some [A, B] mflr3_f4(
                int8, animal, d, A, B, float, int, float
            )
    ;       mflr3_f5(
                int, int
            )
    ;       mflr3_f6(
                int, int
            )
    ;       mflr3_f7(
                int, int
            )
    ;       mflr3_f8(
                int, int
            )
    ;       mflr3_f9(
                int, int
            )
    ;       mflr3_f10(
                int, int
            )
    ;       some [C, D, E] mflr3_f11(
                nt(d), animal, char, C, D, E, int, int
            )
    ;       mflr3_f12(
                eqv(nt(eqv(d))), animal, char, int, int
            )
    ;       mflr3_f13(
                animal, nt(d), char, int, int
            )
    ;       mflr3_f13(
                animal, char, nt(nt(d)), int, int
            ).

:- type more_functors_local_remote_da1
    --->    mflrd1_f1
    ;       mflrd1_f2
    ;       mflrd1_f3
    ;       mflrd1_f5(
                wa
            )
    ;       mflrd1_f6(
                wa
            )
    ;       mflrd1_f7(
                wa
            )
    ;       mflrd1_f8(
                wa
            )
    ;       mflrd1_f9(
                wa
            )
    ;       mflrd1_f10(
                wa
            )
    ;       mflrd1_f11(
                int, int
            ).

:- type abs.
:- pragma foreign_type("C", abs, "void *",
    [can_pass_as_mercury_type, word_aligned_pointer]).
:- pragma foreign_type("C#", abs, "object",
    [can_pass_as_mercury_type]).
