Здравствуйте, rg45, Вы писали:
R>Именно эту мысль я и пытаюсь донести до широкой общественности. Уже несколько раз говорил об этом в этой теме.
_>>Корутины это просто сопособ записи. Без них можно спокойно писать точно такой же код. При этом достаточно обычного голого C.
R>Ну, напиши точно такой же кодАвтор: rg45
Дата: 28.08 10:43
без корутин. А то я уже дважды реализовывал твои хотелки, а ты мои ни разу. У меня уже начинают шевелиться сомнения в простоте реализации того же самомго на голом С.
std::generator<std::pair<int, std::string>> runMachine(const int& param, int machineID) {
co_yield std::pair{machineID, "Idle"};
co_yield std::pair{machineID, "Started"};
co_yield std::pair{machineID, "Processing"};
while (param < 10)
{
co_yield std::pair{machineID, "Waiting"};
}
co_yield std::pair{machineID, "Stopped"};
}
Вот такой же код на голом C
typedef struct {
int loop;
int machineID, *param;
const char* value;
} fn1_t;
void fn1_setup(fn1_t *self) { self->loop=0; }
int fn1_loop(fn1_t *self) {
LOOP_BEGIN(self->loop)
self->value="Idle"; LOOP_POINT
self->value="Started"; LOOP_POINT
self->value="Processing"; LOOP_POINT
while (*self->param < 10) {
self->value="Waiting"; LOOP_POINT
}
self->value="Stopped";
LOOP_END
}
| | вспомогательные макросы |
| | /* loop-fn.h */
#ifndef __LOOP_FN_H__
#define __LOOP_FN_H__
typedef int loop_t;
#define LOOP_RESET(loop) { loop=0; }
#if defined(__COUNTER__) && __COUNTER__!=__COUNTER__
#define LOOP_BEGIN(loop) { enum { __loop_base=__COUNTER__ }; \
loop_t *__loop=&(loop); __loop_switch: int __loop_rv=1; \
switch(*__loop) { default: *__loop=0; case 0: {
#define LOOP_POINT { enum { __loop_case=__COUNTER__-__loop_base }; \
*__loop=__loop_case; goto __loop_leave; case __loop_case:{} }
#else
#define LOOP_BEGIN(loop) {loop_t*__loop=&(loop);__loop_switch:int __loop_rv=1;\
switch(*__loop){ default: case 0: *__loop=__LINE__; case __LINE__:{
#define LOOP_POINT { *__loop=__LINE__; goto __loop_leave; case __LINE__:{} }
#endif
#define LOOP_END { __loop_end: *__loop=-1; case -1: return 0; \
{ goto __loop_end; goto __loop_switch; } } \
}} __loop_leave: return __loop_rv; }
#define LOOP_SET_RV(rv) { __loop_rv=(rv); } /* rv must be non zero */
#define LOOP_INT(n) { __loop_rv=(n); LOOP_POINT } /* interrupt n */
/* for manual labeling: enum { L01=1,L02,L03,L04 }; ... LOOP_POINT_(L02) */
#define LOOP_POINT_(name) { *__loop=name; goto __loop_leave; case name:{} }
#define LOOP_INT_(n,name) { __loop_rv=(n); LOOP_POINT_(name) }
#endif /* __LOOP_FN_H__ */
|
| | |
По поводу generateMachines. То там они не паралельно вызываются а по очереди.
| | Предполагалось что-то вида |
| | enum { sevInit, sevDone };
typedef struct {
void *ctx;
int (*setup)(void *ctx,int sev);
int (*loop)(void *ctx);
} afn_t;
int run(afn_t *list,int count) {
int i,j; afn_t *fi; int rc=0;
for(i=0;i<count;i++) { fi=&list[i]; if (fi->setup(fi->ctx,sevInit)) break; }
if (i<count) { count=i+1; rc=1; } else {
while(count>0) {
for(i=0;i<count;i++) {
fi=&list[i];
if (fi->loop(fi->ctx)==0) {
count--;
afn_t t=list[i]; list[i]=list[count]; list[count]=t;
i--;
}
}
}
}
for(i=0;i<count;i++) { fi=&list[i]; fi->setup(fi->ctx,sevDone); }
return rc;
}
|
| | |