/*
* struct FJIには、
* iとjの開始、終了の範囲と、
* ループ中での各ポイントABCで実行される関数(SJI型)のポインタの配列と、
* その関数中で処理されるデータ、もしくはデータのコンテナをセットし、
* それを run_FJI()することで、forループが実行される。
*
* for(j=0; j<10; j++) {
* A:
* for(i=0; i<10; i++) {
* B:
* }
* C:
* }
* 各ポイントA,B,Cで、とくに処理の必要が無い箇所には nul_sji をセットする。これは空の関数のインライン関数。
*/
const int w=10,h=18;
typedef struct {
int p[18][10];
} _B;
_B Z,E={.p = {[0][0 ... 9]=1, [0 ... 17][0]=1, [0 ... 17][9]=1, [17][0 ... 9]=1}};
#include <stdio.h>
#include <stdlib.h>
typedef void* (*SJI)(const void* _s, const int j, const int i);
struct FJI{
int i, j;
int i0, ie;
int j0, je;
void* src;
SJI sji[3];
};
inline void* nul_sji(const void* _s, const int j, const int i){}
run_FJI(struct FJI* a)
{
for(a->j = a->j0; a->j < a->je; a->j++) {
a->sji[0](a->src, a->j, a->i);
for(a->i = a->i0; a->i < a->ie; a->i++) {
a->sji[1](a->src, a->j, a->i);
}
a->sji[2](a->src, a->j, a->i);
}
}
R(_B* a)
{
void* sji1(const void* _s, const int j, const int i)
{
_B* a=(_B*)_s;
a->p[j][i]=(rand()%5)+2;
}
struct FJI b = {
.i0 = 1, .ie = w - 1,
.j0 = 1, .je = h - 1,
.src = (void*)a,
.sji = {nul_sji, sji1, nul_sji}
};
run_FJI(&b);
}
P(_B* a)
{
void* sji1(const void* _s, const int j, const int i)
{
_B* a=(_B*)_s;
const int p=a->p[j][i];
printf("%c[%dm%d",0x1b,p+40,p);
}
void* sji2(const void* _s, const int j, const int i)
{
putchar('\n');
}
struct FJI b = {
.i0 = 0, .ie = w,
.j0 = 0, .je = h,
.src = (void*)a,
.sji = {nul_sji, sji1, sji2}
};
run_FJI(&b);
printf("%c[%dm\n",0x1b,0);
}
C(_B* d, _B* a)
{
void* _C0_1(const void* _s, int j, int i)
{
_B** s=(_B**)_s;
const int p=s[0]->p[j][i];
if(p<2){return;}
if(p==s[0]->p[j][i+1]){s[1]->p[j][i]++;}
if(p==s[0]->p[j][i-1]){s[1]->p[j][i]++;}
if(p==s[0]->p[j+1][i]){s[1]->p[j][i]++;}
if(p==s[0]->p[j-1][i]){s[1]->p[j][i]++;}
}
void* _C1_1(const void* _s, int j, int i)
{
_B** s=(_B**)_s;
const int p=s[0]->p[j][i];
if(p<2){return;}
int q=0;
if(p==s[0]->p[j][i+1]){q+=s[1]->p[j][i+1];}
if(p==s[0]->p[j][i-1]){q+=s[1]->p[j][i-1];}
if(p==s[0]->p[j+1][i]){q+=s[1]->p[j+1][i];}
if(p==s[0]->p[j-1][i]){q+=s[1]->p[j-1][i];}
s[2]->p[j][i]=q+1;
}
void* _C2_1(const void* _s, int j, int i)
{
_B** s=(_B**)_s;
const int p=s[0]->p[j][i];
if(p<2){return;}
if(p==s[0]->p[j][i+1]){if(s[2]->p[j][i+1]>3){s[3]->p[j][i]=1;}}
if(p==s[0]->p[j][i-1]){if(s[2]->p[j][i-1]>3){s[3]->p[j][i]=1;}}
if(p==s[0]->p[j+1][i]){if(s[2]->p[j+1][i]>3){s[3]->p[j][i]=1;}}
if(p==s[0]->p[j-1][i]){if(s[2]->p[j-1][i]>3){s[3]->p[j][i]=1;}}
}
_B b,c;
b=c=*d=Z;
_B* src[4] = {a, &b, &c, d};
struct FJI _C[3] = {
{
.i0 = 1, .ie = w - 1,
.j0 = 1, .je = h - 1,
.src = (void*)src,
.sji = {nul_sji, _C0_1, nul_sji}
},
{
.i0 = 1, .ie = w - 1,
.j0 = 1, .je = h - 1,
.src = (void*)src,
.sji = {nul_sji, _C1_1, nul_sji}
},
{
.i0 = 1, .ie = w - 1,
.j0 = 1, .je = h - 1,
.src = (void*)src,
.sji = {nul_sji, _C2_1, nul_sji}
}
};
void* __C_1(const void* _s, int j, int i)
{
run_FJI((struct FJI*)_s + i);
}
struct FJI __C = {
.i0 = 0, .ie = 3,
.j0 = 0, .je = 1,
.src = (void*)_C,
.sji = {nul_sji, __C_1, nul_sji}
};
run_FJI(&__C);
}
main()
{
{volatile int _;srand(_);}
_B a=E,d;
R(&a);
P(&a);
C(&d, &a);
P(&d);
}