- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
#define TPLM Tuple(TPLMOVE) +
#define TPLC Tuple(TPLCOPY) +
#define TPL Tuple() +
//#define GTPL Tuple() +
#define TPLERROR(t) { memcpy(0, 0, 1); }
#define TPLMOVE 1 // copy to tuple, memset 0 original. = destruct dest, copy to dest.
#define TPLCOPY 2 // copy constructor = destruct dest, copy to dest
#define TPLGET 3 // destruct all values :)
#include <memory.h>
#include <math.h>
#include <stdio.h>
#include <typeinfo>
#include <string.h>
#define max(a, b) (((a) > (b)) ? (a) : (b))
#define min(a, b) (((a) < (b)) ? (a) : (b))
unsigned int mcrc(char* name, unsigned int sz){
unsigned int ret=0; if(!sz) sz=(unsigned int)strlen(name);
char*t=name+sz; int p=0;
while(name<t){
*(((char*)&ret)+p)+=*name; p++;
if(p>=4) p=0; name++;
}
return ret;
}
struct Tupled{ unsigned int sz, type; void *v; char data[0]; };
class Tuple{
int count, set, dusz, dasz;
unsigned char *data;
int type; int adel;
public:
Tuple(){ count=0; set=0; type=0; dusz=0; dasz=0; data=0; adel=0; }
Tuple(int t){ type=t; }
~Tuple(){ if(count!=set) TPLERROR("~Tuple"); delete data; }
Tuple(Tuple &t){
count=t.count; set=t.set; dusz=t.dusz; dasz=t.dasz; data=t.data;
t.count=0; t.set=0; t.data=0; adel=1;
}
template <class T>
Tuple& operator+(T &t){ if(!adel) Add(&t, sizeof(t), t); else Del(&t, sizeof(t), t); return *this; }
template <class T>
Tuple& operator-(T &t){ if(!adel) Add(&t, sizeof(t), t); else Del(&t, sizeof(t), t); return *this; }
/* Операторы '*', '/', ',', '>', '<' код идентичен */
template <class T>
void Add(void *v, int s, T &t){
if(dasz-dusz<s+4+(int)sizeof(void*)){
unsigned char *ldata=data;
data=new unsigned char[dasz+max(128, s+4)];
memcpy(data, ldata, dasz);
dasz+=max(128, s);
delete [] ldata;
}
Tupled &d=*(Tupled*)(data+dusz);
d.sz=s;
memcpy(&d.v, v, sizeof(void*));
if(type==TPLCOPY){ *(T*)d.data=t; } else memcpy(d.data, v, s);
if(type==TPLMOVE) t.~T();
d.type=mcrc((char*)typeid(t).name(), 0);
dusz+=sizeof(Tupled)+s; count++;
}
template <class T>
void Del(void *v, int s, T &t){
if(set>=count){ TPLERROR("Tuple::Set"); return ; }
unsigned char *p=GetData(set);
if(!p){ TPLERROR("Tuple::NoData"); return ; }
Tupled &d=*(Tupled*)p;
unsigned int tp=mcrc((char*)typeid(t).name(), 0);
if(tp!=d.type){ TPLERROR("Tuple::TYPE"); return ;}
t.~T();
if(d.sz!=s){ TPLERROR("Tuple::SIZE"); return ;}
memcpy(v, d.data, d.sz);
set++;
}
unsigned char* GetData(int c){
if(c>=count) return 0;
unsigned char *p=data;
for(int i=0; i<c; i++){
p+=sizeof(Tupled)+*(int*)p;
}
return p;
}
};
Очередной самобытный велосипед от микеля.
http://rsdn.ru/forum/src/4218954.aspx
cutwater 02.04.2011 13:56 # 0
Dummy00001 02.04.2011 14:10 # +2
накой им в С++ кортежи то сдались? это фишка из динамических слабо-типизированых языков. с одной стороны. с другой стороны, буст если не ошибаюсь где-то там уже имеет реализацию.
cutwater 02.04.2011 14:15 # 0
Dummy00001 02.04.2011 14:28 # 0
ReL 02.04.2011 14:19 # 0
cutwater 02.04.2011 14:24 # +1
gegMOPO4 02.04.2011 21:06 # 0
TarasB 04.04.2011 09:26 # −7
Писать на С++ то, для чего он не предназначен, рожая шаблоновое нечитаемое говно, по которому текут слюнями юные крестобляди, радостно вопя "вау, ничего себе что ещё на С++ можно!!!111".
eth0 04.04.2011 09:53 # +2
Что вызывает столь бурную реакцию у паскалеёбов?
Lure Of Chaos 04.04.2011 10:13 # 0
Lure Of Chaos 04.04.2011 10:11 # +3
и если вы не боитесь изменять постоянно написанное однажды, значит, у вас хороший код и вы хороший программист. А если ваш код могут безболезненно поддерживать и другие, у вас отличный код.
bugmenot 02.04.2011 21:34 # +4
обратная перистальтика же
ReL 02.04.2011 22:24 # −1
gegMOPO4 02.04.2011 21:09 # 0
movaxbx 02.04.2011 22:52 # 0
Не продавать и не брать денег за код из данной библиотеки.
Разрешается модифицировать и дорабатывать.
Код предоставлен как есть и автор не отвечает, даже если вы попытаетесь прострелить себе ногу.
lovesan 04.04.2011 14:11 # −3
lovesan 04.04.2011 14:16 # −5
guest 04.04.2011 14:52 # +2
lovesan 04.04.2011 15:05 # −3
guest 04.04.2011 15:26 # +3
lovesan 04.04.2011 16:24 # −2
guest 06.04.2011 23:46 # +4
lovesan 06.04.2011 23:48 # −3
bugmenot 06.04.2011 23:55 # +4
guest 09.04.2011 12:17 # 0
absolut 04.04.2011 15:27 # +3
lovesan 04.04.2011 16:23 # −2
bugmenot 04.04.2011 16:45 # +5
eth0 04.04.2011 18:54 # +2
В зоопарке редкие виды нужны.
rigidus 05.04.2011 01:46 # −1
ReL 05.04.2011 19:47 # −2
ЗЫ у нас в организации тоже есть лисподрочеры, но их все стебут почем зря...
lovesan 05.04.2011 23:52 # −3
какие выводы?
говно ваша организация.
ReL 06.04.2011 07:20 # 0
lovesan 06.04.2011 11:17 # −4
ReL 06.04.2011 11:24 # 0
>у нас в организации
кстати интересно, какой софт сейчас модно писать на лиспе? эмбедите вм или интерпретируете только?
bugmenot 06.04.2011 09:02 # 0
ордена ленина имени ленина ленинградский зоопарк?
lovesan 06.04.2011 11:17 # −1
bugmenot 06.04.2011 14:36 # +4
плюсани-ка лиспца
ох, щи, что-то я совсем как тараска стал...
SmackMyBitchUp 29.04.2011 05:48 # 0
OMG!