/*
Est-ce qu"on peut générer un class contenant des références à des variables
On cherche à savoir s'il serait facile de modifier tlcc, le convertisser tlmp -> c++
pour qu'il supporte la syntaxe suivante:
void f(vector &v)
{
glocal &v;
("fichier",true);
glocal.v.push_back(line);
return 0;
}
Présentement, on ne peut faire que ceci
void f(vector &v)
{
glocal vector *v = &v;
...
glocal.v->push_back(line);
La syntaxe force une répétition et l'usage de la syntaxe pointeur. De plus, dans le cas des map
cela rend cela encore agaçant ;
void f(map &v)
{
glocal map *v = &v;
...
(*glocal.v)[line]++;
La fonction test_pour_tlmp démontre que ça se fait et que c'est même binaire compatible avec le
code déjà compîlé.
Ne semble pas plus lent.
*/
#include
#include
#include
#include
#include
#include
#include "refer.h"
#include "getnow.h"
using namespace std;
void f (int &a, vector &v)
{
using __type_a = decltype(a);
using __type_v = decltype(v);
struct gl{
__type_a a;
__type_v v;
int e;
gl(__type_a _a, __type_v _v) :a(_a),v(_v){}
} g(a,v);
g.e=10;
printf ("a=%d\n",g.a);
for (auto val:g.v) printf ("g.pv[]=%d\n",val);
g.a++;
for (auto &val:g.v) val++;
g.v.push_back(40);
};
struct tlmpcomp{
virtual void print(int a){
printf ("base tlmpcomp a=%d\n",a);
}
};
void test_pour_tlmp(int &a, vector &v)
{
using __type_a = decltype(a);
using __type_v = decltype(v);
struct gl{
__type_a &a;
__type_v &v;
int e;
gl(__type_a _a, __type_v _v) :a(_a),v(_v){}
} g(a,v);
struct _X: public _F_loadfile__v1{
gl &g;
_X(gl &_g) : g(_g){}
_F_loadfile__v1_oneline( ){
g.a++;
g.v.push_back(noline);
printf ("v[]=");
for (auto val:g.v) printf (" %d",val);
printf ("\n");
printf ("g.a=%d line=%s\n",g.a,line);
return 0;
}
}_x(g);
loadfile__v1(_x,"/tmp/toto.html",true);
}
int main (int argc, char *argv[])
{
glocal int ret = -1;
glocal unsigned nbrep=1;
glocal bool testperf = false;
glocal bool test1 = false;
glocal.ret = (argc,argv);
setproginfo ("","0.0","...");
setarg ('n',"nbrep","Nombre de repetition",glocal.nbrep,false);
setarg (' ',"test1","Premier test pour montrer que ça fonctionne",glocal.test1,false);
setarg (' ',"testperf","Compare la performance",glocal.testperf,false);
int ret = -1;
if (glocal.test1){
int v = 22;
v++;
vectorvec{1,2,3,4};
for (auto val:vec) printf ("v[]=%d\n",val);
f(v,vec);
printf ("v=%d\n",v);
for (auto val:vec) printf ("v[]=%d\n",val);
test_pour_tlmp(v,vec);
printf ("v=%d\n",v);
for (auto val:vec) printf ("v[]=%d\n",val);
}else if (glocal.testperf){
// Il a fallut déplacer le code dans un autre fichier parce que le compilateur optimisait tout.
// On multipliait nbrep par 1,000,000 et ça changeait pas le temps d'exécution (0).
// et le résultat était bon.
unsigned long rep = (unsigned long)glocal.nbrep*1;
printf ("nbrep=%u rep=%lu\n",glocal.nbrep,rep);
{
long long start = getnow();
unsigned long count = (1,rep);
unsigned long ret = (val,20);
return val*2;
return ret;
long long end = getnow();
showtime("standard",start,end);
printf ("count=%lu sizeof %lu\n",count,sizeof(count));
}
{
long long start = getnow();
class _F_loop_test: public _F_loop{
_F_loop_exec( ){
class _F_loop_stest: public _F_loop{
_F_loop_exec( ){
return val*3;
}
}c;
return loop(c,val,20);
}
}c;
unsigned long count = loop(c,1,rep);
long long end = getnow();
showtime("inline",start,end);
printf ("count=%lu\n",count);
}
}else{
usage();
}
return ret;
return glocal.ret;
}