aboutsummaryrefslogtreecommitdiff
path: root/backendC/CleanCompilerSources/comprehensions.h
blob: 9bb7c9ccc3b458eb2c432b4956285897cb1831ac (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#define FASTER_ARRAY_COMPREHENSIONS

typedef	enum {
	kGeneratorList,kGeneratorFrom,kGeneratorFromTo,kGeneratorFromThen,kGeneratorFromThenTo,kGeneratorArrayOnly
} GeneratorKind;

extern	int	gGeneratorNumber;
extern	int	gListFunctionNumber;

STRUCT (generator, Generator)
{
	GeneratorKind	gen_kind;
	Bool			gen_arrayCombined;
	int			gen_array_index_n;
	NodeP		gen_array;
	NodeP		*gen_array_size_node_h;
	NodeP		gen_pattern;
	union
	{
		NodeP	val_list;
		struct
		{
			ArgP	fbt_from;
			ArgP	fbt_by;
			ArgP	fbt_to;
		} val_fbt;
	} val;
};

# define	gen_list		val.val_list
# define	gen_from		val.val_fbt.fbt_from
# define	gen_by		val.val_fbt.fbt_by
# define	gen_to		val.val_fbt.fbt_to

# define	kMaxParallelGenerators	16

extern unsigned ConvertGenerators (unsigned n, GeneratorS generators[],IdentP updatedArrayIdent,NodeP *arrayNodePtr,
							int *const array_index_generator_n_p,NodeP result_node_p,NodeP guard_p,ScopeP scope);
extern void GenerateComprehensionFunction (ImpRules impRule, unsigned n, GeneratorS djennereeturs [], NodeP guard,
								NodeP result_node_p,int array_index_generator_n,
								NodeP *begin, NodeP end, NodeP **successP, unsigned line, NodeP *array);
extern NodeP ComputeNewArrayLength (unsigned n, GeneratorS generators [], ScopeP scope);